diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 4102d66cf..5a41bc9c8 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -47,6 +47,25 @@ type ActVendorInfo struct { VendorList []*ActMapPureInfo } +type tPreCreateActVendorInfo struct { + VendorID int + + VendorPrice int64 `orm:"" json:"vendorPrice"` // 单品级活动用,创建活动时商品的原始平台价 + ActualActPrice int64 `orm:"" json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 +} + +type tPreCreateActStoreSku struct { + model.ActStoreSku + VendorInfoList []*tPreCreateActVendorInfo `json:"vendorInfoList"` +} + +type tPreCreateActInfo struct { + model.Act + + ValidVendorIDs []int + ActStoreSku []*tPreCreateActStoreSku `json:"actStoreSku"` +} + func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { wholeValidVendorMap := make(map[int]int) if len(actStoreSku) > 0 { @@ -84,7 +103,8 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac SkuID: v.SkuID, VendorID: vendorID, - SyncStatus: model.SyncFlagNewMask, + SyncStatus: model.SyncFlagNewMask, + VendorPrice: int64(jxutils.CaculateSkuVendorPrice(storeSkuInfo.Price, int(storeDetail.PricePercentage), 0)), } if v.ActPrice != 0 { actSkuMap.ActualActPrice = v.ActPrice @@ -93,8 +113,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac if v.PricePercentage != 0 { percentage = v.PricePercentage } - percentage = percentage * int(storeDetail.PricePercentage) / 100 - actSkuMap.ActualActPrice = int64(jxutils.CaculateSkuVendorPrice(storeSkuInfo.Price, percentage, 0)) + actSkuMap.ActualActPrice = int64(jxutils.CaculateSkuVendorPrice(int(actSkuMap.VendorPrice), percentage, 0)) } dao.WrapAddIDCULDEntity(actSkuMap, ctx.GetUserName()) actStoreSkuMapList = append(actStoreSkuMapList, actSkuMap) @@ -245,10 +264,53 @@ func checkActValidation(act *model.Act, vendorIDs []int) (err error) { return fmt.Errorf("%s", strings.Join(strList, ",\n")) } +func setActDefault(act *model.Act) { + if act.LimitCount == 0 { + act.LimitCount = 1 // 缺省限购一份,如果确定不限,明确给一个很大的值 + } + act.Status = model.ActStatusCreated +} + +func PreCreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (preCreateActInfo *tPreCreateActInfo, err error) { + if err = checkActValidation(act, vendorIDs); err != nil { + return nil, err + } + setActDefault(act) + + db := dao.GetDB() + validVendorIDs, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku) + if err != nil { + return nil, err + } + + preCreateActInfo = &tPreCreateActInfo{ + ValidVendorIDs: validVendorIDs, + } + storeSkuMap := make(map[int64]*tPreCreateActStoreSku) + for _, v := range actStoreSkuList { + tmp := &tPreCreateActStoreSku{ + ActStoreSku: *v, + } + storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = tmp + preCreateActInfo.ActStoreSku = append(preCreateActInfo.ActStoreSku, tmp) + } + + for _, v := range actStoreSkuMapList { + index := jxutils.Combine2Int(v.StoreID, v.SkuID) + storeSkuMap[index].VendorInfoList = append(storeSkuMap[index].VendorInfoList, &tPreCreateActVendorInfo{ + VendorID: v.VendorID, + VendorPrice: v.VendorPrice, + ActualActPrice: v.ActualActPrice, + }) + } + return preCreateActInfo, nil +} + func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam, isAsync bool) (hint string, err error) { if err = checkActValidation(act, vendorIDs); err != nil { return "", err } + setActDefault(act) db := dao.GetDB() dao.Begin(db) @@ -258,10 +320,6 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules panic(r) } }() - if act.LimitCount == 0 { - act.LimitCount = 1 // 缺省限购一份,如果确定不限,明确给一个很大的值 - } - act.Status = model.ActStatusCreated dao.WrapAddIDCULDEntity(act, ctx.GetUserName()) err = dao.CreateEntity(db, act) if err != nil { diff --git a/business/model/act.go b/business/model/act.go index dbda67228..0d642beb5 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -138,6 +138,7 @@ type ActStoreSkuMap struct { VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` SyncStatus int `orm:"default(2)" json:"syncStatus"` + VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 ActualActPrice int64 `orm:"" json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 97c3f49bc..84924602e 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -272,3 +272,18 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa } return err } + +func (c *PurchaseHandler) OnActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { + jxutils.CallMsgHandler(func() { + retVal = c.onActMsg(msg) + }, jxutils.ComposeUniversalOrderID(msg.BillID, model.VendorIDJD)) + return retVal +} + +func (c *PurchaseHandler) onActMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { + return retVal +} + +func getActFromJD(promotionID int64) (act *model.Act, actStoreSkuList []*model.ActStoreSku) { + return act, actStoreSkuList +} diff --git a/controllers/act.go b/controllers/act.go index 64d292803..3d626d3fd 100644 --- a/controllers/act.go +++ b/controllers/act.go @@ -14,6 +14,54 @@ type ActController struct { beego.Controller } +// @Title 预创建活动 +// @Description 预创建活动 +// @Param token header string true "认证token" +// @Param name formData string true "活动名,必须唯一(所以名子上最好带上日期)" +// @Param type formData int true "活动类型,3:直降,4:秒杀(美团当前不支持秒杀)" +// @Param vendorIDs formData string true "厂商ID,当前只支持,京东:0,京西(用于记录活动信息):99" +// @Param beginAt formData string true "开始日期" +// @Param endAt formData string true "结束日期" +// @Param pricePercentage formData int true "活动价格比例" +// @Param advertising formData string true "广告语" +// @Param actStoreSkuList formData string true "活动门店商品信息" +// @Param limitDaily formData int false "是否按日0-不限,>0限购单数(秒杀需填)" +// @Param limitUser formData int false "是否用户限购0-不限,1-限购" +// @Param limitCount formData int false "限购件数 0-不限,如账号限购、设备限购有一个为1,则限购件数必须大于0的整数" +// @Param remark formData string false "备注" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /PreCreateAct [post] +func (c *ActController) PreCreateAct() { + c.callPreCreateAct(func(params *tActPreCreateActParams) (retVal interface{}, errCode string, err error) { + var ( + vendorIDs []int + actStoreSkuList []*act.ActStoreSkuParam + ) + timeList, err := jxutils.BatchStr2Time(params.BeginAt, params.EndAt) + if err == nil { + if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDs, params.ActStoreSkuList, &actStoreSkuList); err == nil { + actObj := &model.Act{ + Name: params.Name, + Type: params.Type, + LimitUser: params.LimitUser, + LimitDaily: params.LimitDaily, + LimitCount: params.LimitCount, + // Source:, + CreateType: model.ActCreateTypeAPI, + PricePercentage: params.PricePercentage, + BeginAt: timeList[0], + EndAt: timeList[1], + Advertising: params.Advertising, + Remark: params.Remark, + } + retVal, err = act.PreCreateAct(params.Ctx, actObj, vendorIDs, nil, actStoreSkuList) + } + } + return retVal, "", err + }) +} + // @Title 创建活动 // @Description 创建活动 // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 3333ad274..00489ab53 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -43,6 +43,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ActController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ActController"], + beego.ControllerComments{ + Method: "PreCreateAct", + Router: `/PreCreateAct`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ActController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ActController"], beego.ControllerComments{ Method: "QueryActs",