Explorar o código

wip:活动提交

wkyuer hai 5 meses
pai
achega
e18eab8d21

+ 26 - 4
internal/controller/productHandler.go

@@ -13,16 +13,35 @@ import (
 // GetProductListHandler 获取商品列表
 func GetProductListHandler(r *ghttp.Request) {
 	rData, err := func() (interface{}, error) {
-		productList := service.Product().GetList()
-		var rDataJson []g.Map
+		rj, err := r.GetJson()
+		if err != nil {
+			return nil, errors.Wrap(err, "请求参数格式异常")
+		}
+		buySet := rj.Get("buyset").Int()
+		//常规商品
+		productList := service.Product().GetList(buySet)
+		var rProjectJson []g.Map
 		bytesArr, err := json.Marshal(productList)
 		if err != nil {
 			return nil, errors.Wrap(err, "获取数据异常")
 		}
-		if err := json.Unmarshal(bytesArr, &rDataJson); err != nil {
+		if err := json.Unmarshal(bytesArr, &rProjectJson); err != nil {
+			return nil, errors.Wrap(err, "数据结构异常")
+		}
+		//活动商品
+		var rActivityJson []g.Map
+		activityList := service.Product().GetActivityList(buySet)
+		actBytesArr, actErr := json.Marshal(activityList)
+		if actErr != nil {
+			return nil, errors.Wrap(actErr, "获取数据异常")
+		}
+		if err := json.Unmarshal(actBytesArr, &rActivityJson); err != nil {
 			return nil, errors.Wrap(err, "数据结构异常")
 		}
-		return rDataJson, nil
+		return g.Map{
+			"productList":  rProjectJson,
+			"activityList": rActivityJson,
+		}, nil
 	}()
 	if err != nil {
 		g.Log().Errorf(r.Context(), "获取商品列表出错 %v", err)
@@ -34,6 +53,9 @@ func GetProductListHandler(r *ghttp.Request) {
 func GetProductPriceHandler(r *ghttp.Request) {
 	rData, err := func() (interface{}, error) {
 		rj, err := r.GetJson()
+		if err != nil {
+			return nil, errors.Wrap(err, "请求参数格式异常")
+		}
 		pCode := rj.Get("product_code").String()
 		pFunc, err := product.JyProFunc.GetProductInitFuncByCode(pCode)
 		if err != nil {

+ 3 - 3
internal/logic/product/otherProduct/otherProduct.go

@@ -89,7 +89,7 @@ func NewDataPackProduct(reqParam map[string]interface{}, detailIdParam ...int64)
 			return nil, errors.Wrap(err, fmt.Sprintf("%s格式化异常", productName))
 		}
 		p.PackClassOrderDetail = tmp
-		p.BuySet = tmp.ReqBuySet
+		p.ReqBuySet = tmp.ReqBuySet
 		p.Tactics = tmp.Tactics
 	case "阳光采购", "医械通", "人脉管理", "物业数字化营销", "运营商专版", "企业商机管理":
 		var tmp model.JyOtherWidthCycleFilterProduct
@@ -97,7 +97,7 @@ func NewDataPackProduct(reqParam map[string]interface{}, detailIdParam ...int64)
 			return nil, errors.Wrap(err, fmt.Sprintf("%s格式化异常", productName))
 		}
 		p.CycleClassOrderDetail = tmp
-		p.BuySet = tmp.ReqBuySet
+		p.ReqBuySet = tmp.ReqBuySet
 		p.Tactics = tmp.Tactics
 	case "3A信用认证", "ISO体系认证", "广告", "打赏", "数据文件", "权益码", "标书制作", "线下课程培训", "课程分销", "实物礼品":
 		var tmp model.JyOtherSimpleProduct
@@ -105,7 +105,7 @@ func NewDataPackProduct(reqParam map[string]interface{}, detailIdParam ...int64)
 			return nil, errors.Wrap(err, fmt.Sprintf("%s格式化异常", productName))
 		}
 		p.SimpleProduct = tmp
-		p.BuySet = tmp.ReqBuySet
+		p.ReqBuySet = tmp.ReqBuySet
 		p.Tactics = tmp.Tactics
 	default:
 		return nil, errors.New("未知类型")

+ 94 - 0
internal/logic/productManager/activity.go

@@ -0,0 +1,94 @@
+package productManager
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/pkg/errors"
+	"jyOrderManager/internal/model"
+	"time"
+)
+
+func (p *sProductManager) loadActivity(ctx context.Context) error {
+	//加载活动
+	var (
+		activityList        []*model.ActivityClass
+		activityCodeMapping = map[string]*model.ActivityClass{}
+	)
+	actList, err := g.DB().Query(ctx, "SELECT * FROM jy_product_activity WHERE state =1 and activity_ed_time > ?", time.Now().Format(time.DateTime))
+	if err != nil {
+		return errors.Wrap(err, "加载活动异常")
+	}
+	if len(actList) > 0 {
+		//查询活动产品
+		var activityProductArray []*model.ActivityProductSetting
+		productList, err := g.DB().Query(ctx, "SELECT activity_code,product_code,service_type,tactics,filter FROM jy_product_activity_item WHERE state =1")
+		if err != nil {
+			return errors.Wrap(err, "获取活动中商品异常")
+		}
+		if err := productList.Structs(&activityProductArray); err != nil {
+			return err
+		}
+		for _, m := range actList.List() {
+			var (
+				name    = gconv.String(m["name"])
+				code    = gconv.String(m["code"])
+				subject = gconv.Int(m["subject"])
+				st      = gconv.String(m["activity_st_time"])
+				ed      = gconv.String(m["activity_ed_time"])
+			)
+			s, err := time.ParseInLocation(time.DateTime, st, time.Local)
+			if err != nil {
+				continue
+			}
+			e, err := time.ParseInLocation(time.DateTime, ed, time.Local)
+			if err != nil {
+				continue
+			}
+			act := model.ActivityClass{
+				Name:      name,
+				Code:      code,
+				Subject:   subject,
+				StartTime: s,
+				EndTime:   e,
+			}
+			for _, record := range activityProductArray {
+				if record.ActivityCode == code {
+					act.Products = append(act.Products, record)
+				}
+			}
+			if len(act.Products) > 0 {
+				activityList = append(activityList, &act)
+			}
+		}
+	}
+	p.ActivityList = activityList
+	p.ActivityCodeMapping = activityCodeMapping
+	return nil
+}
+
+func (p *sProductManager) GetActivityList(buySet ...int) []*model.ActivityClass {
+	var (
+		result []*model.ActivityClass
+		set    int = 3 //1个人 2企业 3个人和企业都支持
+	)
+
+	if len(buySet) > 0 {
+		set = common.If(buySet[0] > 0 && buySet[0] < 3, buySet[0], 3).(int)
+	}
+
+	if set == 3 {
+		return p.ActivityList
+	}
+
+	for _, top := range p.ActivityList {
+		if top.Subject == 1 && set != 2 {
+			result = append(result, top)
+		}
+		if top.Subject == 2 && set != 1 {
+			result = append(result, top)
+		}
+	}
+	return result
+}

+ 39 - 5
internal/logic/productManager/productManager.go

@@ -1,6 +1,7 @@
 package productManager
 
 import (
+	"app.yhyue.com/moapp/jybase/common"
 	"context"
 	"github.com/gogf/gf/v2/errors/gcode"
 	"github.com/gogf/gf/v2/errors/gerror"
@@ -16,15 +17,22 @@ type (
 		ProductRoot         []*model.ProductTop
 		ProductCodeMapping  map[string]*model.Product
 		ProductClassMapping map[int64]*model.ProductClass
+
+		ActivityList        []*model.ActivityClass //活动
+		ActivityCodeMapping map[string]*model.ActivityClass
 	}
 )
 
 func init() {
 	ctx := gctx.New()
-	productManager, err := getInitJyProduct(ctx)
+	productManager, err := getInitJyProduct(ctx) //加载商品
 	if err != nil {
 		g.Log().Panicf(ctx, "初始化剑鱼商品异常%s", err)
 	}
+
+	if err := productManager.loadActivity(ctx); err != nil { //加载活动
+		g.Log().Panicf(ctx, "初始化剑鱼活动异常%s", err)
+	}
 	service.RegisterProductManager(productManager)
 }
 
@@ -37,7 +45,6 @@ func getInitJyProduct(ctx context.Context) (*sProductManager, error) {
 		productCLass []*model.ProductClass
 		productArray []*model.Product
 	)
-	//查询产品类
 	classList, err := g.DB().Query(ctx, "SELECT * FROM jy_product_class WHERE state =1")
 	if err != nil {
 		return nil, err
@@ -54,7 +61,6 @@ func getInitJyProduct(ctx context.Context) (*sProductManager, error) {
 		return nil, err
 	}
 
-	//for index, class := range productCLass {
 	for _, class := range productCLass {
 		productClassMapping[class.ClassId] = class
 		var topRoot *model.ProductTop
@@ -89,8 +95,36 @@ func getInitJyProduct(ctx context.Context) (*sProductManager, error) {
 }
 
 // GetList 获取商品列表
-func (p *sProductManager) GetList() []*model.ProductTop {
-	return p.ProductRoot
+func (p *sProductManager) GetList(buySet ...int) []*model.ProductTop {
+	var (
+		result []*model.ProductTop
+		set    int = 3 //1个人 2企业 3个人和企业都支持
+	)
+
+	if len(buySet) > 0 {
+		set = common.If(buySet[0] > 0 && buySet[0] < 3, buySet[0], 3).(int)
+	}
+
+	if set == 3 {
+		return p.ProductRoot
+	}
+
+	for _, top := range p.ProductRoot {
+		var t []*model.ProductClass
+		for _, ps := range top.ProductClassList {
+			if ps.BuySet == 1 && set != 2 {
+				t = append(t, ps)
+			}
+			if ps.BuySet == 2 && set != 1 {
+				t = append(t, ps)
+			}
+		}
+		if len(t) > 0 {
+			top.ProductClassList = t
+			result = append(result, top)
+		}
+	}
+	return result
 }
 
 // GetPriceConfig 根据产品code及请求参数获取价格

+ 21 - 1
internal/model/product.go

@@ -1,5 +1,7 @@
 package model
 
+import "time"
+
 type (
 	ProductTop struct {
 		Name             string          `json:"name"`
@@ -26,10 +28,28 @@ type (
 		UnitNum        int                    `json:"unit_num"`        //数量
 		Cycle          string                 `json:"cycle"`           //有效周期
 		Price          map[string]interface{} `json:"price,omitempty"` //计价规则
-		//ProductClass   *ProductClass          `json:"product_class,omitempty"`
 	}
 	PriceConfig struct {
 		Mode int    `json:"mode"` //默认0:配置 1:手动输入
 		Rule string `json:"rule"`
 	}
 )
+
+type (
+	ActivityClass struct {
+		Name      string                    `json:"name" doc:"活动名称"`
+		Code      string                    `json:"code" doc:"活动code"`
+		Subject   int                       `json:"subject" doc:"购买主体"`
+		StartTime time.Time                 `json:"startTime,omitempty"` //活动开始时间
+		EndTime   time.Time                 `json:"endTime,omitempty"`   //活动结束时间
+		Rate      float64                   `json:"rate"`
+		Products  []*ActivityProductSetting `json:"products"`
+	}
+	ActivityProductSetting struct {
+		ActivityCode string      `json:"activity_code"`
+		ProductCode  string      `json:"product_code"`
+		ServiceType  int         `json:"service_type"` //1购买 2续费 3升级 4试用
+		Tactics      int         `json:"tactics"`      //策略 1仅购买 2仅赠送 3购买+赠送
+		Filter       interface{} `json:"filter"`       //预设参数
+	}
+)

+ 3 - 1
internal/service/producttManager.go

@@ -9,13 +9,15 @@ import "jyOrderManager/internal/model"
 type (
 	IProducttManager interface {
 		// CheckParam 校验参数
-		GetList() []*model.ProductTop
+		GetList(buySet ...int) []*model.ProductTop
 		// GetPriceConfig 获取价格计算
 		GetPriceConfig(productCode string) (*model.PriceConfig, error)
 		// GetProductTopClass 获取商品详情
 		GetProduct(productCode string) (*model.Product, error)
 		// 获取商品类
 		GetProductClass(classId int64) (*model.ProductClass, error)
+		//
+		GetActivityList(buySet ...int) []*model.ActivityClass //获取活动列表
 	}
 )