wkyuer 5 mesi fa
parent
commit
db962410a2

+ 3 - 3
internal/cmd/cmd.go

@@ -29,9 +29,9 @@ var (
 				})
 
 				s.Group("/order", func(group *ghttp.RouterGroup) {
-					group.GET("/submit", controller.EmptyHandler) //创建订单
-					group.GET("/list", controller.EmptyHandler)   //订单列表
-					group.GET("/detail", controller.EmptyHandler) //订单详情
+					group.GET("/save", controller.SaveOrderHandler) //创建订单
+					group.GET("/list", controller.EmptyHandler)     //订单列表
+					group.GET("/detail", controller.EmptyHandler)   //订单详情
 				})
 			})
 			s.Run()

+ 30 - 0
internal/controller/orderHandler.go

@@ -1 +1,31 @@
 package controller
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/pkg/errors"
+	"jyOrderManager/internal/logic/order"
+	"jyOrderManager/internal/model"
+)
+
+// SaveOrderHandler 创建订单
+func SaveOrderHandler(r *ghttp.Request) {
+	rData, err := func() (interface{}, error) {
+		var param model.OrderParams
+		err := gconv.Struct(r.GetBody(), &param)
+		if err != nil {
+			return nil, errors.Wrap(err, "数据校验异常")
+		}
+		orderCode, err := order.SaveOrder(r.Context(), param)
+		if err != nil {
+			return nil, errors.Wrap(err, "订单创建异常")
+		}
+		return orderCode, nil
+	}()
+	if err != nil {
+		g.Log().Errorf(r.Context(), "创建订单异常 %v", err)
+	}
+	r.Response.WriteJson(NewResult(rData, err))
+}

+ 34 - 11
internal/controller/productHandler.go

@@ -1,29 +1,52 @@
 package controller
 
 import (
+	. "app.yhyue.com/moapp/jybase/api"
 	"encoding/json"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/pkg/errors"
+	"jyOrderManager/internal/logic/product"
 	"jyOrderManager/internal/service"
 )
 
 // GetProductListHandler 获取商品列表
 func GetProductListHandler(r *ghttp.Request) {
-	productList := service.Product().GetList()
-	var rDataJson []g.Map
-	bytesArr, err := json.Marshal(productList)
+	rData, err := func() (interface{}, error) {
+		productList := service.Product().GetList()
+		var rDataJson []g.Map
+		bytesArr, err := json.Marshal(productList)
+		if err != nil {
+			return nil, errors.Wrap(err, "获取数据异常")
+		}
+		if err := json.Unmarshal(bytesArr, &rDataJson); err != nil {
+			return nil, errors.Wrap(err, "数据结构异常")
+		}
+		return nil, nil
+	}()
 	if err != nil {
-		r.SetError(err)
-		return
+		g.Log().Errorf(r.Context(), "获取商品列表出错 %v", err)
 	}
-	if err := json.Unmarshal(bytesArr, &rDataJson); err != nil {
-		r.SetError(err)
-		return
-	}
-	r.Response.WriteJson(rDataJson)
+	r.Response.WriteJson(NewResult(rData, err))
 }
 
 // GetProductPriceHandler 获取商品价格
 func GetProductPriceHandler(r *ghttp.Request) {
-	g.Dump(service.Product().GetPriceConfig("cjdy001"))
+	rData, err := func() (interface{}, error) {
+		rj, err := r.GetJson()
+		pCode := rj.Get("code").String()
+		pFunc, err := product.JyProFunc.GetProductInitFuncByCode(pCode)
+		if err != nil {
+			return "", err
+		}
+		price, err := pFunc(rj.Map()).GetPrice()
+		if err != nil {
+			return nil, errors.Wrap(err, "获取价格异常")
+		}
+		return price, nil
+	}()
+	if err != nil {
+		g.Log().Errorf(r.Context(), "获取商品列表出错 %v", err)
+	}
+	r.Response.WriteJson(NewResult(rData, err))
 }

+ 6 - 6
internal/logic/productManager/order.go → internal/logic/order/order.go

@@ -1,4 +1,4 @@
-package productManager
+package order
 
 import (
 	"app.yhyue.com/moapp/jybase/common"
@@ -13,7 +13,7 @@ import (
 )
 
 // SaveOrder 订单保存
-func (p *sProductManager) SaveOrder(ctx context.Context, param model.OrderParams) error {
+func SaveOrder(ctx context.Context, param model.OrderParams) (string, error) {
 	// todo 参数校验
 	var (
 		productArr []product.JyProduct
@@ -25,17 +25,17 @@ func (p *sProductManager) SaveOrder(ctx context.Context, param model.OrderParams
 		tParam["order_code"] = orderCode
 		pFunc, err := product.JyProFunc.GetProductInitFuncByCode(tParam["code"])
 		if err != nil {
-			return err
+			return "", err
 		}
 		pObj := pFunc(tParam)
 		if err := pObj.Check(); err != nil {
-			return err
+			return "", err
 		}
 		productArr = append(productArr, pObj)
 	}
 
-	//数据操作
-	return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
+	//数据操作
+	return orderCode, g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
 		//todo 插入订单表
 		if _, err := g.DB().Ctx(ctx).Insert(ctx, "dataexport_order", g.Map{
 			"order_code": orderCode,

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

@@ -11,10 +11,10 @@ var JyProFunc jyProductFuncMapping
 
 type (
 	JyProduct interface {
-		Check() error                         //参数校验
-		GetPrice() (int64, error)             //查询价格
-		SaveUpdate(ctx context.Context) error //保存更新
-		OpenService() error                   //开通服务
+		Check() error                          //参数校验
+		GetPrice() (int64, error)              //查询价格
+		SaveUpdate(ctx context.Context) error  //保存更新
+		OpenService(ctx context.Context) error //开通服务
 	}
 	jyProductFuncMapping struct {
 		initFuncMapping map[string]func(map[string]interface{}) JyProduct

+ 0 - 4
internal/logic/product/subvip/price.go

@@ -70,7 +70,3 @@ func (ps priceSetting) GetPrice(num, cycleType int) (int64, error) {
 	}
 	return -1, gerror.NewCode(gcode.CodeInvalidParameter, "未知时间参数")
 }
-
-func (p jySubVipProduct) OpenService() error {
-	return nil
-}

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

@@ -0,0 +1,96 @@
+package subvip
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/pkg/errors"
+	"jyOrderManager/internal/consts"
+	"jyOrderManager/utility"
+	"regexp"
+	"time"
+)
+
+// OpenService 超级订阅开通服务
+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)
+	if err != nil || record.IsEmpty() {
+		return errors.Wrap(err, "未知订单编号")
+	}
+	var (
+		userId, userData          = FindUserDataByPhone(p.param.Phone)
+		orderId                   = gconv.Int(record["id"])
+		mgoUserId, userPositionId string
+		buySubject                = gconv.Int64(record["buy_subject"])
+		companyName               = gconv.String(record["company_name"])
+		entId                     = gconv.Int(record["ent_id"])
+	)
+
+	if p.param.RecordPayType == 1 || p.param.RecordPayType == 4 { //新购
+		var (
+			entService int
+			userCount  int
+		)
+		mgoUserId = userId
+		vipStartTime, vipEndTime := utility.GetStartAndEndTime(time.Now(), utility.DateComp{
+			Num:  p.param.PayCycle,
+			Unit: p.param.PayCycleType,
+		}, utility.DateComp{
+			Num:  p.param.GifCycle,
+			Unit: p.param.GifCycleType,
+		})
+		if buySubject == 2 { //购买主体是企业,手机号改变,需要重新创建企业
+			entId, err, userPositionId = utility.AutomaticallyCreatingEnt(companyName, p.param.Phone, p.param.OrderCode, userId)
+			if err != nil {
+				return errors.Wrap(err, fmt.Sprintf("AutomaticallyCreatingEn 自动创建企业信息失败: %s", companyName))
+			}
+			var (
+				userId                = userPositionId
+				entService, userCount = utility.EntServiceOpen(entId, p.param.Phone)
+				buyCount              = p.param.SGiftAccountNumber + p.param.SPayAccountNumber
+			)
+
+			if entId != 0 && buyCount > 1 {
+				regRuler := "^1[3456789]{1}\\d{9}$"
+				reg := regexp.MustCompile(regRuler)
+				if reg.MatchString(p.param.Phone) && companyName != "" {
+					err, _ := utility.EntLicense(entId, buyCount, -1, orderId, userCount, "VIP订阅", vipStartTime.Format(date.Date_Full_Layout), vipEndTime.Format(date.Date_Full_Layout), p.param.Phone)
+					if err != nil {
+						return errors.Wrap(err, fmt.Sprintf("EntLicense 创建企业授权信息失败:%s", companyName))
+					}
+				}
+			}
+			if entService != 1 {
+				ClearBigVipUserPower(userId)
+			}
+		}
+	} else if p.param.RecordPayType == 2 { //续费
+
+	} else if p.param.RecordPayType == 3 { //升级
+
+	}
+	return nil
+}
+
+func GetStartAndEndTime(startTime string, cycleCount, cycleUnit int) (vipStartTime, endTime time.Time) {
+	//根据开始时间计算结束时间
+	month := 0
+	if cycleUnit == 1 {
+		month = cycleCount * 12
+	} else if cycleUnit == 2 {
+		month = cycleCount
+	} else if cycleUnit == 4 {
+		month = cycleCount * 3
+	}
+	vipStartTime, _ = time.ParseInLocation(date.Date_Short_Layout, startTime, time.Local)
+	if cycleUnit == 3 {
+		_endTime := vipStartTime.AddDate(0, 0, cycleCount)
+		t := _endTime.Format(date.Date_Short_Layout) + " 23:59:59"
+		endTime, _ = time.ParseInLocation(date.Date_Full_Layout, t, time.Local)
+	} else {
+		endTime = GetDATE1(month, vipStartTime.Unix())
+	}
+	return vipStartTime, endTime
+}

+ 20 - 0
internal/logic/product/subvip/user.go

@@ -1,5 +1,25 @@
 package subvip
 
+import (
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"jyOrderManager/utility"
+)
+
 func getUserVipStatus(phone string) (int, int64, int64) {
 	return -1, -1, -1
 }
+
+func FindUserDataByPhone(phone string) (userId string, userData map[string]interface{}) {
+	userInfo, ok := utility.MG.DB().FindOne("user", map[string]interface{}{"s_phone": phone})
+	if ok && userInfo != nil && len(*userInfo) > 0 {
+		userId = mongodb.BsonIdToSId((*userInfo)["_id"])
+		userData = *userInfo
+	} else {
+		userInfo, ok = utility.MG.DB().FindOne("user", map[string]interface{}{"s_m_phone": phone})
+		if ok && userInfo != nil && len(*userInfo) > 0 {
+			userId = mongodb.BsonIdToSId((*userInfo)["_id"])
+			userData = *userInfo
+		}
+	}
+	return userId, userData
+}

+ 17 - 17
internal/model/orderParams.go

@@ -89,23 +89,23 @@ type (
 	}
 
 	//SubVipParams 超级订阅
-	SubVipParams struct {
-		*ProductCommonParam
-		OrderCode          string `json:"orderCode"`
-		ProductType        string `json:"productType,omitempty"`                        //产品类型
-		BillingMode        int    `json:"billingMode"`                                  //策略 购买 赠送
-		RecordPayType      int    `form:"recordPayType" json:"recordPayType,omitempty"` //付费类型 购买 续费 升级 试用
-		ZeroOrderType      string `json:"zeroOrderType"`                                //0原订单类型
-		LinkedOrderId      string `json:"linkedOrderId,omitempty"`                      //关联订单明细id
-		SPayAccountNumber  int    `json:"sPayAccountNumber"`                            //子账号付费数量
-		SGiftAccountNumber int    `json:"sGiftAccountNumber"`                           //子账号赠送数量
-		PayCycle           int    `json:"payCycle"`                                     //付费购买周期
-		PayCycleType       int    `json:"payCycleType"`                                 //付费周期类型:0-月 1-天 2-年 3-季
-		GifCycle           int    `json:"gifCycle"`                                     //赠送周期
-		GifCycleType       int    `json:"gifCycleType"`                                 //赠送周期类型:0-月 1-天 2-年 3-季
-		PaybackOpenServer  bool   `json:"paybackOpenServer,omitempty"`                  //是否全额回款开通
-		PayMoney           int    `form:"payMoney" json:"payMoney,omitempty"`           //合同金额
-	}
+	//SubVipParams struct {
+	//	*ProductCommonParam
+	//	OrderCode          string `json:"orderCode"`
+	//	ProductType        string `json:"productType,omitempty"`                        //产品类型
+	//	BillingMode        int    `json:"billingMode"`                                  //策略 购买 赠送
+	//	RecordPayType      int    `form:"recordPayType" json:"recordPayType,omitempty"` //付费类型 购买 续费 升级 试用
+	//	ZeroOrderType      string `json:"zeroOrderType"`                                //0原订单类型
+	//	LinkedOrderId      string `json:"linkedOrderId,omitempty"`                      //关联订单明细id
+	//	SPayAccountNumber  int    `json:"sPayAccountNumber"`                            //子账号付费数量
+	//	SGiftAccountNumber int    `json:"sGiftAccountNumber"`                           //子账号赠送数量
+	//	PayCycle           int    `json:"payCycle"`                                     //付费购买周期
+	//	PayCycleType       int    `json:"payCycleType"`                                 //付费周期类型:0-月 1-天 2-年 3-季
+	//	GifCycle           int    `json:"gifCycle"`                                     //赠送周期
+	//	GifCycleType       int    `json:"gifCycleType"`                                 //赠送周期类型:0-月 1-天 2-年 3-季
+	//	PaybackOpenServer  bool   `json:"paybackOpenServer,omitempty"`                  //是否全额回款开通
+	//	PayMoney           int    `form:"payMoney" json:"payMoney,omitempty"`           //合同金额
+	//}
 
 	//HistoricalStructParams 历史数据&结构化数据
 	HistoricalStructParams struct {

+ 15 - 1
internal/model/subvip.go

@@ -1,8 +1,22 @@
 package model
 
 type (
-	JySubVipProductParam struct {
+	SubVipParams struct {
 		*ProductCommonParam
+		OrderCode          string `json:"orderCode"`
+		ProductType        string `json:"productType,omitempty"`                        //产品类型
+		BillingMode        int    `json:"billingMode"`                                  //策略 购买 赠送
+		RecordPayType      int    `form:"recordPayType" json:"recordPayType,omitempty"` //付费类型 购买 续费 升级 试用
+		ZeroOrderType      string `json:"zeroOrderType"`                                //0原订单类型
+		LinkedOrderId      string `json:"linkedOrderId,omitempty"`                      //关联订单明细id
+		SPayAccountNumber  int    `json:"sPayAccountNumber"`                            //子账号付费数量
+		SGiftAccountNumber int    `json:"sGiftAccountNumber"`                           //子账号赠送数量
+		PayCycle           int    `json:"payCycle"`                                     //付费购买周期
+		PayCycleType       int    `json:"payCycleType"`                                 //付费周期类型:0-月 1-天 2-年 3-季
+		GifCycle           int    `json:"gifCycle"`                                     //赠送周期
+		GifCycleType       int    `json:"gifCycleType"`                                 //赠送周期类型:0-月 1-天 2-年 3-季
+		PaybackOpenServer  bool   `json:"paybackOpenServer,omitempty"`                  //是否全额回款开通
+		PayMoney           int    `form:"payMoney" json:"payMoney,omitempty"`           //合同金额
 	}
 	JySubVipProductFilter struct {
 		BuyAccountCount  int `json:"buyAccountCount"`  //购买数量(仅购买主体是企业)

+ 0 - 15
internal/service/product.go

@@ -1,15 +0,0 @@
-package service
-
-type (
-	JyProduct interface {
-		GetPrice(peoductCode string) (int64, error) //查询价格
-		Check(param interface{}) error              //参数校验
-		//Save(ctx context.Context, param interface{}) error  //保存
-		//Update(ctx context.Context, param interface{}) error //更新
-		OpenService(productDetailId int64) error //开通服务
-	}
-)
-
-func NewProduct() JyProduct {
-	return nil
-}

+ 1 - 1
internal/service/producttManager.go

@@ -12,7 +12,7 @@ type (
 		GetList() []*model.ProductTop
 		// GetPriceConfig 获取价格计算
 		GetPriceConfig(productCode string) (*model.PriceConfig, error)
-		// GetProductTopClass 获取商品分离
+		// GetProductTopClass 获取商品详情
 		GetProduct(productCode string) (*model.Product, error)
 	}
 )

+ 36 - 0
utility/dateUtil.go

@@ -0,0 +1,36 @@
+package utility
+
+import (
+	"time"
+)
+
+type DateComp struct {
+	Num  int
+	Unit int // 1-天 2-月 3-季 4-年
+}
+
+func GetStartAndEndTime(s time.Time, d ...DateComp) (st, et time.Time) {
+	var stDate time.Time
+	if s.IsZero() {
+		now := time.Now()
+		stDate = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local)
+	} else {
+		stDate = time.Date(s.Year(), s.Month(), s.Day(), 0, 0, 0, 0, time.Local)
+	}
+	st, et = stDate, stDate
+	for _, comp := range d {
+		if comp.Num > 0 {
+			switch comp.Unit {
+			case 1:
+				et = et.AddDate(0, 0, comp.Num)
+			case 2:
+				et = et.AddDate(0, comp.Num, 0)
+			case 3:
+				et = et.AddDate(0, comp.Num*3, 0)
+			case 4:
+				et = et.AddDate(comp.Num, 0, 0)
+			}
+		}
+	}
+	return
+}