wkyuer hai 4 meses
pai
achega
f1894e2ac8

+ 9 - 1
go.mod

@@ -9,13 +9,13 @@ require (
 	github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.3
 	github.com/gogf/gf/v2 v2.8.3
 	github.com/pkg/errors v0.9.1
-	go.mongodb.org/mongo-driver v1.17.3
 )
 
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/jyPoints v1.1.2-0.20231020023521-1a4b1bbf9736 // indirect
+	app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20231226074509-942d80dc34eb // indirect
 	bp.jydev.jianyu360.cn/BaseService/jyMicroservices v0.0.2 // indirect
 	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec // indirect
@@ -35,6 +35,7 @@ require (
 	github.com/emirpasic/gods v1.18.1 // indirect
 	github.com/fatih/color v1.18.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
@@ -46,6 +47,7 @@ require (
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
+	github.com/gomodule/redigo v2.0.0+incompatible // indirect
 	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
@@ -68,6 +70,7 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.7.1 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/nsqio/go-nsq v1.1.0 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
@@ -80,14 +83,18 @@ require (
 	github.com/redis/go-redis/v9 v9.7.0 // indirect
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	github.com/tealeg/xlsx v1.0.5 // indirect
+	github.com/thinxer/go-word2vec v0.0.0-20150917053916-5c19ec7379ed // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
 	github.com/zeromicro/go-zero v1.6.4 // indirect
+	github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb // indirect
 	go.etcd.io/etcd/api/v3 v3.5.13 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.13 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.13 // indirect
+	go.mongodb.org/mongo-driver v1.17.3 // indirect
 	go.opentelemetry.io/otel v1.24.0 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
@@ -117,6 +124,7 @@ require (
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
 	google.golang.org/grpc v1.63.2 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
+	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 879 - 0
go.sum


+ 5 - 1
internal/controller/productHandler.go

@@ -39,7 +39,11 @@ func GetProductPriceHandler(r *ghttp.Request) {
 		if err != nil {
 			return "", err
 		}
-		price, err := pFunc(rj.Map()).GetPrice()
+		product, err := pFunc(rj.Map(), -1)
+		if err != nil {
+			return nil, errors.Wrap(err, "获取产品配置异常")
+		}
+		price, err := product.GetPrice()
 		if err != nil {
 			return nil, errors.Wrap(err, "获取价格异常")
 		}

+ 4 - 1
internal/logic/order/order.go

@@ -27,7 +27,10 @@ func SaveOrder(ctx context.Context, param model.OrderParams) (string, error) {
 		if err != nil {
 			return "", err
 		}
-		pObj := pFunc(tParam)
+		pObj, err := pFunc(tParam, 0)
+		if err != nil {
+			return "", fmt.Errorf("获取订单结构异常")
+		}
 		if err := pObj.Check(); err != nil {
 			return "", err
 		}

+ 7 - 4
internal/logic/product/jyProductInterface.go

@@ -10,6 +10,9 @@ import (
 var JyProFunc jyProductFuncMapping
 
 type (
+	//ProductInitFunc 前段请求或者根据订单详情id获取当前订单信息
+	ProductInitFunc func(reqMap map[string]interface{}, orderDetailId int64) (JyProduct, error)
+
 	JyProduct interface {
 		Check() error                          //参数校验
 		GetPrice() (int64, error)              //查询价格
@@ -17,7 +20,7 @@ type (
 		OpenService(ctx context.Context) error //开通服务
 	}
 	jyProductFuncMapping struct {
-		initFuncMapping map[string]func(map[string]interface{}) JyProduct
+		initFuncMapping map[string]ProductInitFunc
 	}
 )
 
@@ -39,11 +42,11 @@ func getOnlyProductClassCode(code string) string {
 	return code[:i]
 }
 
-func (t *jyProductFuncMapping) RegisterJyProductCreateFunc(code string, f func(map[string]interface{}) JyProduct) {
+func (t *jyProductFuncMapping) RegisterJyProductCreateFunc(code string, f ProductInitFunc) {
 	t.initFuncMapping[code] = f
 }
 
-func (t *jyProductFuncMapping) GetProductInitFuncByCode(code interface{}) (func(map[string]interface{}) JyProduct, error) {
+func (t *jyProductFuncMapping) GetProductInitFuncByCode(code interface{}) (ProductInitFunc, error) {
 	productObj, ok := t.initFuncMapping[getOnlyProductClassCode(gconv.String(code))]
 	if !ok {
 		return nil, fmt.Errorf("未知订单类型")
@@ -51,6 +54,6 @@ func (t *jyProductFuncMapping) GetProductInitFuncByCode(code interface{}) (func(
 	return productObj, nil
 }
 
-func (t *jyProductFuncMapping) MustGetProductInitFuncByCode(code interface{}) func(map[string]interface{}) JyProduct {
+func (t *jyProductFuncMapping) MustGetProductInitFuncByCode(code interface{}) ProductInitFunc {
 	return t.initFuncMapping[getOnlyProductClassCode(gconv.String(code))]
 }

+ 0 - 95
internal/logic/product/subvip/entPower.go

@@ -1,95 +0,0 @@
-package subvip
-
-//)
-//
-//// entPower 企业超级订阅
-//func vipEntPower(ctx context.Context, entId, entUserId int64, doType, empowerCount, provinceCount int, orderDetailId int64, st, et time.Time) (pid int64, err error) {
-//	if count, _ := g.DB().GetCount(ctx, "SELECT count(1) FROM entniche_order WHERE order_id = ?", orderDetailId); count > 0 {
-//		return 0, fmt.Errorf("此订单已开通服务")
-//	}
-//	t := date.NowFormat(date.Date_Full_Layout)
-//	switch doType {
-//	case 1, 4: //新购
-//		res, err := g.DB().Ctx(ctx).Insert(ctx, "entniche_wait_empower", g.Map{
-//			"ent_id":         entId,
-//			"product_type":   "VIP订阅",
-//			"empower_count":  empowerCount,
-//			"province_count": provinceCount,
-//			"start_time":     st,
-//			"end_time":       et,
-//			"update_time":    t,
-//			"create_time":    t,
-//		})
-//		if err != nil {
-//			return 0, errors.Wrap(err, "企业待授权表插入失败")
-//		}
-//		pid, err = res.LastInsertId()
-//		if err != nil || pid == 0 {
-//			return 0, errors.Wrap(err, "获取 entniche_wait_empower Id失败")
-//		}
-//		if _, err := g.DB().Ctx(ctx).Insert(ctx, "entniche_order", map[string]interface{}{
-//			"order_id":        orderDetailId,
-//			"wait_empower_id": pid,
-//			"create_time":     time.Now(),
-//		}); err != nil {
-//			return 0, errors.Wrap(err, "插待授权表更新失败入")
-//		}
-//		//判断当前用户是否有企业级超级订阅权益
-//		number, err := g.DB().Ctx(ctx).GetCount(ctx, "SELECT  COUNT(1)  FROM  entniche_power a  INNER JOIN entniche_wait_empower b ON a.wait_empower_id = b.id  and  b.end_time > now() where  a.`status`=1 and a.ent_id=? and a.ent_user_id=?", entId, entUserId)
-//		if err != nil {
-//			return 0, fmt.Errorf("查询用户权益异常")
-//		}
-//		if number == 0 { //没有新建
-//			if _, err := g.DB().Insert(ctx, "entniche_power", map[string]interface{}{"wait_empower_id": pid, "ent_id": entId, "ent_user_id": entUserId, "status": 1, "update_time": t, "create_time": t}); err != nil {
-//				return 0, errors.Wrap(err, "插entniche_power失败入")
-//			}
-//			if !jyutil.Compatible.UpdateByEntUserId(gconv.String(entUserId), g.Map{
-//				"o_vipjy.i_trial":      -1,                                               //已激活试用
-//				"l_vip_starttime":      st.Unix(),                                        //开始时间
-//				"l_vip_endtime":        et.Unix(),                                        //结束时间
-//				"i_vip_status":         common.If(st.Unix() <= time.Now().Unix(), 2, -2), //1试用 2正式 -2 试用到期
-//				"i_vip_expire_tip":     0,                                                //消息提示初始化
-//				"o_vipjy.a_buyerclass": []interface{}{},
-//			}) {
-//				g.Log().Errorf(ctx, "超级订阅续费 修改ent_user表 企业:%d 用户:%d 新购失败", entId, entUserId)
-//			}
-//		}
-//	case 2, 3: //2:续费 3:升级
-//		if orderDetailId == 0 {
-//			return 0, fmt.Errorf("缺少关联订单字段")
-//		}
-//		record, err := g.DB().GetOne(ctx, "SELECT wait_empower_id FROM entniche_order WHERE order_id = ? order by create_time desc", orderDetailId)
-//		if err != nil {
-//			return -1, errors.Wrap(err, "获取关联订单异常")
-//		}
-//		pid = gconv.Int64(record.Map()["wait_empower_id"])
-//		if pid <= 0 {
-//			return -1, errors.New("获取无效wait_empower_id")
-//		}
-//		var upMap map[string]interface{}
-//		if doType == 2 { //续费
-//			upMap = g.Map{"end_time": et}
-//			//续费需要更新ent_user表时间
-//			rec, err := g.DB().Query(ctx, "SELECT ent_user_id FROM entniche_power WHERE status=1 AND ent_id=? AND wait_empower_id=? ", entId, pid)
-//			if err != nil {
-//				return 0, errors.Wrap(err, "获取已开通服务用户异常")
-//			}
-//			for _, m := range rec.List() {
-//				if entUserId := gconv.Int64(m["ent_user_id"]); entUserId > 0 {
-//					if !jyutil.Compatible.UpdateByEntUserId(gconv.String(m["ent_user_id"]), g.Map{
-//						"l_vip_endtime": et.Unix(),
-//					}) {
-//						g.Log().Errorf(ctx, "超级订阅续费 修改ent_user表 企业:%d 用户:%d 延长时间失败", entId, entUserId)
-//					}
-//				}
-//			}
-//		} else { //升级
-//			upMap = g.Map{"empower_count": empowerCount, "province_count": provinceCount}
-//		}
-//		_, err = g.DB().Update(ctx, "entniche_wait_empower", upMap, "id =?", pid)
-//		if err != nil {
-//			return 0, errors.Wrap(err, "修改entniche_wait_empower异常")
-//		}
-//	}
-//	return pid, nil
-//}

+ 15 - 15
internal/logic/product/subvip/price.go

@@ -19,9 +19,9 @@ type priceSetting struct {
 }
 
 func (p jySubVipProduct) GetPrice() (price int64, err error) {
-	switch p.param.RecordPayType {
+	switch p.OrderDetail.RecordPayType {
 	case 1, 4: //购买、试用
-		sVal, err := service.Product().GetPriceConfig(p.param.ProductCode)
+		sVal, err := service.Product().GetPriceConfig(p.OrderDetail.ProductCode)
 		if err != nil {
 			return 0, err
 		}
@@ -32,10 +32,10 @@ func (p jySubVipProduct) GetPrice() (price int64, err error) {
 		var (
 			totalNum = 1
 		)
-		totalNum += p.param.SPayAccountNumber + p.param.SGiftAccountNumber
+		totalNum += p.OrderDetail.Filter.GiftAccountCount + p.OrderDetail.Filter.BuyAccountCount
 
-		if p.param.PayCycleType == p.param.GifCycleType { //购买周期和送的周期一样
-			p, err := thisPriceSetting.GetPrice(p.param.GifCycle+p.param.PayCycle, p.param.GifCycleType)
+		if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
+			p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
 			if err != nil {
 				return 0, err
 			}
@@ -45,18 +45,18 @@ func (p jySubVipProduct) GetPrice() (price int64, err error) {
 				p1, p2 int64
 				err    error
 			)
-			p1, err = thisPriceSetting.GetPrice(p.param.PayCycleType, p.param.PayCycleType)
+			p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
 			if err != nil {
 				return p1, err
 			}
-			p2, err = thisPriceSetting.GetPrice(p.param.GifCycle, p.param.GifCycleType)
+			p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
 			if err != nil {
 				return p2, err
 			}
 			price = (p1 + p2) * gconv.Int64(totalNum)
 		}
 	case 2: //续费
-		sVal, err := service.Product().GetProduct(p.param.ProductCode)
+		sVal, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
 		if err != nil {
 			return 0, err
 		}
@@ -64,15 +64,15 @@ func (p jySubVipProduct) GetPrice() (price int64, err error) {
 		if err := gconv.Struct(sVal.Price["rule"], &thisPriceSetting); err != nil {
 			return 0, gerror.NewCode(gcode.CodeValidationFailed, "价格格式配置异常")
 		}
-		filter, _, _, err := getLinkFilter(context.Background(), p.param.LinkedOrderId)
+		filter, _, _, err := getLinkFilter(context.Background(), p.OrderDetail.LinkedOrderId)
 		if err != nil {
 			return 0, fmt.Errorf("查询关联订单异常")
 		}
 		if filter.FinalAreaCount != sVal.UnitNum {
 			return 0, fmt.Errorf("续费产品code异常")
 		}
-		if p.param.PayCycleType == p.param.GifCycleType { //购买周期和送的周期一样
-			p, err := thisPriceSetting.GetPrice(p.param.GifCycle+p.param.PayCycle, p.param.GifCycleType)
+		if p.OrderDetail.Filter.BuyType == p.OrderDetail.Filter.GiftType { //购买周期和送的周期一样
+			p, err := thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle+p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.BuyType)
 			if err != nil {
 				return 0, err
 			}
@@ -82,18 +82,18 @@ func (p jySubVipProduct) GetPrice() (price int64, err error) {
 				p1, p2 int64
 				err    error
 			)
-			p1, err = thisPriceSetting.GetPrice(p.param.PayCycleType, p.param.PayCycleType)
+			p1, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.BuyCycle, p.OrderDetail.Filter.BuyType)
 			if err != nil {
 				return p1, err
 			}
-			p2, err = thisPriceSetting.GetPrice(p.param.GifCycle, p.param.GifCycleType)
+			p2, err = thisPriceSetting.GetPrice(p.OrderDetail.Filter.GiftCycle, p.OrderDetail.Filter.GiftType)
 			if err != nil {
 				return p2, err
 			}
 			price = (p1 + p2) * gconv.Int64(filter.FinalAccountCount)
 		}
 	case 3: //升级
-		filter, _, entTime, err := getLinkFilter(context.Background(), p.param.LinkedOrderId)
+		filter, _, entTime, err := getLinkFilter(context.Background(), p.OrderDetail.LinkedOrderId)
 		if err != nil {
 			return 0, fmt.Errorf("查询关联订单异常")
 		}
@@ -103,7 +103,7 @@ func (p jySubVipProduct) GetPrice() (price int64, err error) {
 			p1           int64 //现套餐价格
 			p2           int64 //原套餐价格
 		)
-		sVal1, err := service.Product().GetProduct(p.param.ProductCode)
+		sVal1, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
 		if err != nil {
 			return 0, err
 		}

+ 96 - 26
internal/logic/product/subvip/service.go

@@ -3,6 +3,7 @@ package subvip
 import (
 	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/mongodb"
 	"context"
 	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
@@ -15,47 +16,109 @@ import (
 )
 
 func (p jySubVipProduct) OpenService(ctx context.Context) error {
-	record, err := g.DB().GetOne(ctx, fmt.Sprintf("SELECT * FROM %s WHERE order_code =?", consts.OrderListTableName), p.param.OrderCode)
+	record, err := g.DB().GetOne(ctx, fmt.Sprintf("SELECT * FROM %s WHERE order_code =?", consts.OrderListTableName), p.OrderDetail.OrderCode)
 	if err != nil || record.IsEmpty() {
 		return errors.Wrap(err, "超级订阅开通服务异常:未知订单编号")
 	}
 	var (
 		buySubject = gconv.Int(record["buy_subject"])
-		doType     = p.param.RecordPayType
 
-		account   = p.param.SGiftAccountNumber + p.param.SPayAccountNumber
-		areaCount = -1
+		doType                   = p.OrderDetail.RecordPayType
+		filter                   = p.OrderDetail.Filter
+		vipStartTime, vipEndTime time.Time
 	)
 
 	switch buySubject {
 	case 1: //个人
-
+		uData, _, _, err := jyutil.GetCreateUserData(p.OrderDetail.Phone, "", false)
+		if err != nil {
+			return fmt.Errorf("个人超级订阅开通服务出错:entUserId参数异常")
+		}
+		var (
+			mgoUid  = mongodb.BsonIdToSId(uData["_id"])
+			setting = map[string]interface{}{}
+		)
+		switch doType {
+		case 1, 4: //购买,试用
+			vipStartTime, vipEndTime = utility.GetStartAndEndTime(time.Now(), utility.DateComp{
+				Num:  filter.BuyCycle,
+				Unit: filter.BuyType,
+			}, utility.DateComp{
+				Num:  filter.GiftCycle,
+				Unit: filter.GiftType,
+			})
+			setting = map[string]interface{}{
+				"o_vipjy.i_trial": -1, //已激活试用
+				"o_vipjy.o_area":  -1, //设置地区
+				"o_vipjy.o_buyset": g.Map{
+					"upgrade":         1,
+					"areacount":       -1,
+					"newcitys":        []int{},
+					"buyerclasscount": -1,
+				}, //购买内容 城市、省份、行业数量
+				"l_vip_starttime":      vipStartTime.Unix(),          //开始时间
+				"l_vip_endtime":        vipEndTime.Unix(),            //结束时间
+				"i_vip_status":         common.If(doType == 1, 2, 1), //1试用 2正式
+				"i_vip_expire_tip":     0,                            //消息提示初始化
+				"o_vipjy.a_buyerclass": []interface{}{},              //设置行业
+			}
+		case 2: //续费
+			entTimeUnix := gconv.Int64(uData["l_vip_endtime"])
+			var newStartTime time.Time
+			if entTimeUnix < time.Now().Unix() { //原服务已过期
+				setting["i_vip_status"] = 2
+				newStartTime = time.Now()
+			} else { //原服务未过期
+				//开始时间为:原服务结束日期+1天
+				newStartTime = time.Unix(entTimeUnix, 0).AddDate(0, 0, 1)
+			}
+			vipStartTime, vipEndTime = utility.GetStartAndEndTime(newStartTime, utility.DateComp{
+				Num:  filter.BuyCycle,
+				Unit: filter.BuyType,
+			}, utility.DateComp{
+				Num:  filter.GiftCycle,
+				Unit: filter.GiftType,
+			})
+			setting["l_vip_endtime"] = vipEndTime
+		case 3: //升级
+			//areaCount account 需要包含之前购买的数量
+			_, vipStartTime, vipEndTime, err = getLinkFilter(context.Background(), p.OrderDetail.LinkedOrderId)
+			if err != nil {
+				return err
+			}
+			setting["o_vipjy.o_buyset.areacount"] = filter.FinalAccountCount
+		default:
+			return fmt.Errorf("个人超级订阅开通服务出错:未知操作类型")
+		}
+		if !jyutil.Compatible.Update(mgoUid, g.Map{"$set": setting}) {
+			return fmt.Errorf("个人超级订阅开通服务出错:数据库更新出错")
+		}
 	case 2: //企业
 		var (
 			companyName = gconv.String(record["company_name"])
 		)
-		_, entId, userPositionId, err := jyutil.GetCreateUserData(p.param.Phone, companyName, true) //查询企业,不存在创建企业
+		_, entId, userPositionId, err := jyutil.GetCreateUserData(p.OrderDetail.Phone, companyName, true) //查询企业,不存在创建企业
 		if err != nil {
-			return errors.Wrap(err, "超级订阅开通服务出错:获取企业信息异常")
+			return errors.Wrap(err, "企业超级订阅开通服务出错:获取企业信息异常")
 		}
 		identity := jyutil.Middleground.UserCenter.IdentityByPositionId(userPositionId)
 		if identity.EntUserId <= 0 {
-			return fmt.Errorf("超级订阅开通服务出错:entUserId参数异常")
+			return fmt.Errorf("企业超级订阅开通服务出错:entUserId参数异常")
 		}
 		if doType == 1 || doType == 4 { //新购
 			vipStartTime, vipEndTime := utility.GetStartAndEndTime(time.Now(), utility.DateComp{
-				Num:  p.param.PayCycle,
-				Unit: p.param.PayCycleType,
+				Num:  filter.BuyCycle,
+				Unit: filter.BuyType,
 			}, utility.DateComp{
-				Num:  p.param.GifCycle,
-				Unit: p.param.GifCycleType,
+				Num:  filter.GiftCycle,
+				Unit: filter.GiftType,
 			})
-			_, err := vipEntPower(ctx, entId, identity.EntUserId, doType, account, areaCount, p.param.LinkedOrderId, vipStartTime, vipEndTime)
+			_, err := vipEntPower(ctx, entId, identity.EntUserId, doType, filter.FinalAccountCount, filter.FinalAreaCount, p.OrderDetail.LinkedOrderId, vipStartTime, vipEndTime)
 			if err != nil {
-				return errors.Wrap(err, fmt.Sprintf("超级订阅开通服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
+				return errors.Wrap(err, fmt.Sprintf("企业超级订阅开通服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
 			}
 		} else if doType == 2 { //续费
-			_, _, entTime, err := getLinkFilter(context.Background(), p.param.LinkedOrderId)
+			_, _, entTime, err := getLinkFilter(context.Background(), p.OrderDetail.LinkedOrderId)
 			if err != nil {
 				return err
 			}
@@ -68,32 +131,39 @@ func (p jySubVipProduct) OpenService(ctx context.Context) error {
 			}
 
 			vipStartTime, vipEndTime := utility.GetStartAndEndTime(newStartTime, utility.DateComp{
-				Num:  p.param.PayCycle,
-				Unit: p.param.PayCycleType,
+				Num:  filter.BuyCycle,
+				Unit: filter.BuyType,
 			}, utility.DateComp{
-				Num:  p.param.GifCycle,
-				Unit: p.param.GifCycleType,
+				Num:  filter.GiftCycle,
+				Unit: filter.GiftType,
 			})
-			_, err = vipEntPower(ctx, entId, identity.EntUserId, doType, account, areaCount, p.param.LinkedOrderId, vipStartTime, vipEndTime)
+			_, err = vipEntPower(ctx, entId, identity.EntUserId, doType, filter.FinalAccountCount, filter.FinalAreaCount, p.OrderDetail.LinkedOrderId, vipStartTime, vipEndTime)
 			if err != nil {
-				return errors.Wrap(err, fmt.Sprintf("超级订阅续费服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
+				return errors.Wrap(err, fmt.Sprintf("企业超级订阅续费服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
 			}
 		} else if doType == 3 { //升级
 			//areaCount account 需要包含之前购买的数量
-			filter, startTime, entTime, err := getLinkFilter(context.Background(), p.param.LinkedOrderId)
+			_, vipStartTime, vipEndTime, err = getLinkFilter(context.Background(), p.OrderDetail.LinkedOrderId)
 			if err != nil {
 				return err
 			}
-			//此订单filter??
-			_, err = vipEntPower(ctx, entId, identity.EntUserId, doType, filter.FinalAccountCount, filter.FinalAreaCount, p.param.LinkedOrderId, startTime, entTime)
+			_, err = vipEntPower(ctx, entId, identity.EntUserId, doType, filter.FinalAccountCount, filter.FinalAreaCount, p.OrderDetail.LinkedOrderId, vipStartTime, vipEndTime)
 			if err != nil {
-				return errors.Wrap(err, fmt.Sprintf("超级订阅续费服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
+				return errors.Wrap(err, fmt.Sprintf("企业超级订阅续费服务异常:vipEntPower 创建企业授权信息失败:%s", companyName))
 			}
 		}
 		jyutil.ClearBigVipUserPower(ctx, gconv.String(userPositionId))
 	default:
-		return fmt.Errorf("超级订阅开通服务异常:未知购买主体")
+		return fmt.Errorf("企业超级订阅开通服务异常:未知购买主体")
 	}
+
+	//更新订单明细
+	_, err = g.DB().Update(ctx, consts.OrderDetailTableName, g.Map{
+		"service_starttime": vipStartTime.Format(time.DateTime),
+		"service_endtime":   vipEndTime.Format(time.DateTime),
+		"is_service_open":   1,
+	}, "")
+
 	return nil
 }
 

+ 41 - 33
internal/logic/product/subvip/subvip.go

@@ -14,8 +14,8 @@ import (
 type (
 	//剑鱼超级订阅商品
 	jySubVipProduct struct {
-		param  model.SubVipParams
-		reqMap map[string]interface{}
+		OrderDetail model.SubVipParams
+		ReqMap      map[string]interface{}
 	}
 )
 
@@ -23,13 +23,28 @@ func init() {
 	product.JyProFunc.RegisterJyProductCreateFunc("cjdy", NewSubVipProduct)
 }
 
-func NewSubVipProduct(reqParam map[string]interface{}) product.JyProduct {
+func NewSubVipProduct(reqParam map[string]interface{}, detailId int64) (product.JyProduct, error) {
 	var p model.SubVipParams
-	_ = gconv.Struct(reqParam, &p)
-	return jySubVipProduct{
-		param:  p,
-		reqMap: reqParam,
+	//根据前段请求 初始化字段
+	if len(reqParam) > 0 {
+		if err := gconv.Struct(reqParam, &p); err != nil {
+			return nil, errors.Wrap(err, "")
+		}
 	}
+	//根据订单详情id,初始化字段
+	if detailId > 0 {
+		record, err := g.DB().GetOne(context.Background(), "SELECT * FROM jy_product_detail WHERE id=?", detailId)
+		if err != nil {
+			return nil, errors.Wrap(err, "未知订单详情id")
+		}
+		if err := record.Struct(p); err != nil {
+			return nil, err
+		}
+	}
+	return jySubVipProduct{
+		OrderDetail: p,
+		ReqMap:      reqParam,
+	}, nil
 }
 
 func (p jySubVipProduct) Check() error {
@@ -37,14 +52,14 @@ func (p jySubVipProduct) Check() error {
 	if err != nil {
 		return errors.Wrap(err, "金额校验计算异常")
 	}
-	if p.param.Amount != m {
+	if p.OrderDetail.Amount != m {
 		return errors.New("金额校验异常")
 	}
-	pcls, err := service.Product().GetProduct(p.param.ProductCode)
+	pcls, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
 	if err != nil {
 		return errors.Wrap(err, "未知商品类型")
 	}
-	if pcls.ProductClass.Tactics != 3 && p.param.Tactics != pcls.ProductClass.Tactics {
+	if pcls.ProductClass.Tactics != 3 && p.OrderDetail.Tactics != pcls.ProductClass.Tactics {
 		return errors.New("销售策略不支持")
 	}
 	return nil
@@ -53,39 +68,32 @@ func (p jySubVipProduct) Check() error {
 func (p jySubVipProduct) SaveUpdate(ctx context.Context) error {
 	var (
 		newData = g.Map{
-			"order_code":       p.param.OrderCode,
+			"order_code":       p.OrderDetail.OrderCode,
 			"product_type":     "VIP订阅",
-			"phone":            p.param.Phone,
-			"original_price":   p.param.OriginalPrice,
-			"final_price":      p.param.Amount,
-			"product_id":       p.param.ProductCode,
-			"billing_mode":     p.param.BillingMode,
-			"linked_detail_id": p.param.LinkedOrderId,
-		}
-		filter = model.JySubVipProductFilter{
-			BuyAccountCount:   p.param.SPayAccountNumber,
-			GiftAccountCount:  p.param.SGiftAccountNumber,
-			FinalAccountCount: 1 + p.param.SPayAccountNumber + p.param.SGiftAccountNumber,
-			FinalAreaCount:    0,
-			BuyCycle:          p.param.PayCycle,
-			BuyType:           p.param.PayCycleType,
-			GiftCycle:         p.param.GifCycle,
-			GiftType:          p.param.GifCycleType,
+			"phone":            p.OrderDetail.Phone,
+			"original_price":   p.OrderDetail.OriginalPrice,
+			"final_price":      p.OrderDetail.Amount,
+			"product_id":       p.OrderDetail.ProductCode,
+			"tactics":          p.OrderDetail.Tactics,
+			"linked_detail_id": p.OrderDetail.LinkedOrderId,
 		}
+
+		filter    = p.OrderDetail.Filter
 		oldFilter *model.JySubVipProductFilter
 		err       error
 	)
+	filter.FinalAccountCount = 1 + filter.BuyAccountCount + filter.GiftAccountCount
 
-	if p.param.RecordPayType == 2 || p.param.RecordPayType == 3 { //获取
-		oldFilter, _, _, err = getLinkFilter(ctx, p.param.LinkedOrderId)
+	if p.OrderDetail.RecordPayType == 2 || p.OrderDetail.RecordPayType == 3 { //获取
+		oldFilter, _, _, err = getLinkFilter(ctx, p.OrderDetail.LinkedOrderId)
 		if err != nil {
 			return err
 		}
 		filter.FinalAccountCount = oldFilter.FinalAccountCount
-		if p.param.RecordPayType == 2 {
+		if p.OrderDetail.RecordPayType == 2 {
 			filter.FinalAreaCount = oldFilter.FinalAreaCount
 		} else {
-			sVal, err := service.Product().GetProduct(p.param.ProductCode)
+			sVal, err := service.Product().GetProduct(p.OrderDetail.ProductCode)
 			if err != nil {
 				return err
 			}
@@ -93,8 +101,8 @@ func (p jySubVipProduct) SaveUpdate(ctx context.Context) error {
 		}
 	}
 	newData["filter"] = gconv.String(filter)
-	if p.param.Id > 0 {
-		res, err := g.DB().Ctx(ctx).Update(ctx, consts.OrderDetailTableName, newData, " id = ? ", p.param.Id)
+	if p.OrderDetail.Id > 0 {
+		res, err := g.DB().Ctx(ctx).Update(ctx, consts.OrderDetailTableName, newData, " id = ? ", p.OrderDetail.Id)
 		if err != nil {
 			return errors.Wrap(err, "超级订阅明细更新异常")
 		}

+ 20 - 20
internal/model/subvip.go

@@ -3,30 +3,30 @@ package model
 type (
 	SubVipParams struct {
 		*ProductCommonParam
-		OrderCode          string `json:"orderCode"`
-		ProductType        string `json:"productType,omitempty"`                        //产品类型
-		BillingMode        int    `json:"billingMode"`                                  //策略 购买 赠送
-		RecordPayType      int    `form:"recordPayType" json:"recordPayType,omitempty"` //付费类型 1:购买 2:续费 3:升级 4:试用
-		ZeroOrderType      string `json:"zeroOrderType"`                                //0原订单类型
-		LinkedOrderId      int64  `json:"linkedOrderId,omitempty"`                      //关联订单明细id
-		SPayAccountNumber  int    `json:"sPayAccountNumber"`                            //子账号付费数量
-		SGiftAccountNumber int    `json:"sGiftAccountNumber"`                           //子账号赠送数量
-		PayCycle           int    `json:"payCycle"`                                     //付费购买周期
-		PayCycleType       int    `json:"payCycleType"`                                 //付费周期类型:1天 2月 3年 4季度
-		GifCycle           int    `json:"gifCycle"`                                     //赠送周期
-		GifCycleType       int    `json:"gifCycleType"`                                 //赠送周期类型:1天 2月 3年 4季度
-		PaybackOpenServer  bool   `json:"paybackOpenServer,omitempty"`                  //是否全额回款开通
-		PayMoney           int    `form:"payMoney" json:"payMoney,omitempty"`           //合同金额
+		ProductType       string `json:"productType,omitempty"`                        //产品类型
+		RecordPayType     int    `form:"recordPayType" json:"recordPayType,omitempty"` //付费类型 1:购买 2:续费 3:升级 4:试用
+		LinkedOrderId     int64  `json:"linkedOrderId,omitempty"`                      //关联订单明细id
+		PaybackOpenServer bool   `json:"paybackOpenServer,omitempty"`                  //是否全额回款开通
+		PayMoney          int    `form:"payMoney" json:"payMoney,omitempty"`           //合同金额
+
+		//SPayAccountNumber  int                   `json:"sPayAccountNumber"`  //子账号付费数量
+		//SGiftAccountNumber int                   `json:"sGiftAccountNumber"` //子账号赠送数量
+		//PayCycle           int                   `json:"payCycle"`           //付费购买周期
+		//PayCycleType       int                   `json:"payCycleType"`       //付费周期类型:1天 2月 3年 4季度
+		//GifCycle           int                   `json:"gifCycle"`           //赠送周期
+		//GifCycleType       int                   `json:"gifCycleType"`       //赠送周期类型:1天 2月 3年 4季度
+		Filter JySubVipProductFilter `json:"filter,omitempty"` //大字段
 	}
 
 	JySubVipProductFilter struct {
-		BuyAccountCount   int `json:"buyAccountCount"`   //购买数量(仅购买主体是企业)
-		GiftAccountCount  int `json:"giftAccountCount"`  //赠送数量(仅购买主体是企业)
+		BuyAccountCount  int `json:"buyAccountCount"`  //购买数量(仅购买主体是企业)
+		GiftAccountCount int `json:"giftAccountCount"` //赠送数量(仅购买主体是企业)
+		BuyCycle         int `json:"buy_cycle"`        //购买周期
+		BuyType          int `json:"buy_type"`         //购买周期 类型 1天 2月 3年 4季度
+		GiftCycle        int `json:"give_cycle"`       //赠送周期
+		GiftType         int `json:"give_type"`        //赠送周期 类型 1天 2月 3年 4季度
+
 		FinalAccountCount int `json:"finalAccountCount"` //当前套餐最终
 		FinalAreaCount    int `json:"finalAreaCount"`
-		BuyCycle          int `json:"buy_cycle"`  //购买周期
-		BuyType           int `json:"buy_type"`   //购买周期 类型 1天 2月 3年 4季度
-		GiftCycle         int `json:"give_cycle"` //赠送周期
-		GiftType          int `json:"give_type"`  //赠送周期 类型 1天 2月 3年 4季度
 	}
 )

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio