From baf80e3e9b42622440e9bd4719a1f2520125c302 Mon Sep 17 00:00:00 2001 From: richboo111 Date: Wed, 28 Jun 2023 11:38:41 +0800 Subject: [PATCH] txd --- business/jxstore/cms/store.go | 80 +++++++ .../partner/purchase/tao_vegetable/act.go | 222 +++++++++++++----- controllers/cms_store.go | 19 ++ routers/commentsRouter_controllers.go | 10 +- 4 files changed, 269 insertions(+), 62 deletions(-) diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index a35e06dca..198e39576 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -14,6 +14,8 @@ import ( "strings" "time" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" warehouse_getFences_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/warehouse_getFences/response" @@ -6321,6 +6323,84 @@ func BatchUpdateMTStoreLogos(vendorOrgCode string, relInfo []MtRelInfo) (hint st return "" } +type TaoBindInfo struct { + VendorStoreID string `json:"vendorStoreID"` + VendorStoreName string `json:"vendorStoreName"` + Status string `json:"status"` //渠道营业状态 +} + +var TaoStoreStatus = map[string]int{ + tao_vegetable.StoreOnlineWord: model.StoreStatusOpened, + tao_vegetable.StoreOfflineWord: model.StoreStatusClosed, +} + +// SingleBindTaoVegetable 单独绑定淘鲜达平台三方映射 +func SingleBindTaoVegetable(ctx *jxcontext.Context, bind []TaoBindInfo) (error, string) { + var ( + storeID = "" + db *dao.DaoDB + errList errlist.ErrList + errIDName = make([]string, 0) + storeMaps = make([]model.StoreMap, 0) + ) + if len(bind) == 0 { + return fmt.Errorf("绑定门店数据为空,请检查"), "" + } + for _, v := range bind { + if len(v.VendorStoreID) == 0 || len(v.VendorStoreName) == 0 { + errIDName = append(errIDName, v.VendorStoreID) + //errList.AddErr(fmt.Errorf("门店%s Id/名字不合法", v.VendorStoreID)) + } else { + if strings.Contains(v.VendorStoreID, "X") { + temp := strings.Split(v.VendorStoreID, "X") + storeID = temp[1] + } else { + return fmt.Errorf("淘鲜达门店ID不合法"), "" + } + } + storeMap := model.StoreMap{ + StoreID: utils.Str2Int(storeID), + VendorID: model.VendorIDTaoVegetable, + VendorOrgCode: "", + Status: TaoStoreStatus[v.Status], + DeliveryType: model.StoreDeliveryTypeByStore, + SyncStatus: 0, + VendorStoreName: v.VendorStoreName, + MtwmToken: "", + MtwmRefreshToken: "", + VendorStoreID: v.VendorStoreID, + } + storeMaps = append(storeMaps, storeMap) + } + userName := ctx.GetUserName() + for _, k := range storeMaps { + dao.WrapAddIDCULDEntity(k, userName) + if db == nil { + db = dao.GetDB() + } + txDB, _ := dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db, txDB) + panic(r) + } + }() + if err := dao.CreateEntity(db, k); err == nil { + errList.AddErr(fmt.Errorf("%s:%v", k.VendorStoreID, err)) + dao.Commit(db, txDB) + } else { + dao.Rollback(db, txDB) + } + } + if len(errIDName) > 0 { + errList.AddErr(fmt.Errorf("门店%s Id/名字不合法", errIDName)) + } + if errList.GetErrListAsOne() != nil { + return nil, fmt.Sprintf("批量绑定淘鲜达门店错误:%v", errList.GetErrListAsOne()) + } + return nil, "" +} + //操作 freight_template func ReplaceInsertFreight(storeID, templateID, warehouseID, tradeLimitID int, vendorStoreID, fenceID string) error { return dao.ReplaceInsertFreight2(storeID, templateID, warehouseID, tradeLimitID, vendorStoreID, fenceID) diff --git a/business/partner/purchase/tao_vegetable/act.go b/business/partner/purchase/tao_vegetable/act.go index 1db6de94c..5dc36a323 100644 --- a/business/partner/purchase/tao_vegetable/act.go +++ b/business/partner/purchase/tao_vegetable/act.go @@ -1,7 +1,13 @@ package mtwm import ( + "fmt" + "time" + + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability2770/domain" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -14,15 +20,15 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) -func jxActType2Mtwm(actType int) int { +func actType2Txd(actType int) *int64 { if actType == model.ActSkuDirectDown { - actType = mtwmapi.RetailActTypeDirectDown + actType = tao_vegetable.DiscountTypeDeductMoney } else if actType == model.ActSkuSecKill { - actType = mtwmapi.RetailActTypeSecKill + actType = tao_vegetable.DiscountTypeOnePrice } else { - actType = 0 + actType = tao_vegetable.DiscountTypeDiscounts } - return actType + return utils.Int64ToPointer(int64(actType)) } func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwmapi.FullDiscountActDetail) { @@ -35,37 +41,83 @@ func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwm return actDetails } -func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actData []*mtwmapi.RetailDiscountActData) { - orderLimit := 1 - if act.LimitCount > 0 { - orderLimit = act.LimitCount +//创建活动详情 +func act2TxdActivity(act *model.Act2) (activity *domain.AlibabaRetailMarketingItemdiscountActivityCreateItemDiscountActivityOperateRequest) { + actName := act.GetRealActName() + activity = &domain.AlibabaRetailMarketingItemdiscountActivityCreateItemDiscountActivityOperateRequest{ + ActivityName: &actName, + CreatorId: &act.VendorActID, + CreatorName: &act.LastOperator, + Description: &act.Advertising, + Terminals: &[]int32{tao_vegetable.TerminalsAPP, tao_vegetable.TerminalsPOS}, + //StoreIds: &[]string{act.Act.}, + DiscountType: actType2Txd(act.Type), + StartTime: utils.Int64ToPointer(act.BeginAt.UnixNano() / int64(time.Millisecond)), + EndTime: utils.Int64ToPointer(act.EndAt.UnixNano() / int64(time.Millisecond)), } + return activity +} + +func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actData *domain.AlibabaRetailMarketingItemdiscountActivitySkuAddItemDiscountActivityElementOperateRequest) { + var ( + limitCount = int64(1) + userLimitCount = int64(1) + fixPriceMoney = int64(0) + discountRate = int64(0) + decreaseMoney = int64(0) + limitDaily = int64(0) + ) + if act.LimitCount > 0 { + limitCount = int64(act.LimitCount) + if act.LimitUser > 0 { + userLimitCount = int64(act.LimitCount) + } + } else if act.LimitDaily > 0 { + limitDaily = int64(act.LimitDaily) + } + for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { - dayLimit := -1 + stock := int64(0) if v.Stock > 0 { - dayLimit = v.Stock + stock = int64(v.Stock) } - actData = append(actData, &mtwmapi.RetailDiscountActData{ - AppFoodCode: utils.Int2Str(v.SkuID), - // UserType: 0, - StartTime: act.BeginAt.Unix(), - EndTime: act.EndAt.Unix(), - OrderLimit: orderLimit, - DayLimit: dayLimit, - // Period: "", - // WeeksTime: "", - SettingType: mtwmapi.SettingTypeAsPrice, - ActPrice: jxutils.IntPrice2Standard(v.ActualActPrice), - // DiscountCoefficient: 0, - // Sequence: int(v.ActPrice), // 此字段不允许重复 - // ItemID: utils.Str2Int64WithDefault(v.VendorActID, 0), - }) + + sType := *actType2Txd(v.Type) + switch sType { + case tao_vegetable.DiscountTypeDeductMoney: + decreaseMoney = v.VendorPrice - v.ActualActPrice + case tao_vegetable.DiscountTypeOnePrice: + fixPriceMoney = v.ActualActPrice + case tao_vegetable.DiscountTypeDiscounts: + discountRate = int64(v.PricePercentage * 10) + } + + actData = &domain.AlibabaRetailMarketingItemdiscountActivitySkuAddItemDiscountActivityElementOperateRequest{ + SkuElements: &[]domain.AlibabaRetailMarketingItemdiscountActivitySkuAddSkuActivityElementDto{{ + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + FixPriceMoney: &fixPriceMoney, + DiscountRate: &discountRate, + DecreaseMoney: &decreaseMoney, + Limit: &domain.AlibabaRetailMarketingItemdiscountActivitySkuAddLimitDto{ + TotalLimitCnt: &stock, + DailyTotalLimitCnt: &limitDaily, + UserTotalLimitCnt: &userLimitCount, + UserDailyLimitCnt: &userLimitCount, + OrderLimitCnt: &limitCount, + }, + }}, + CreatorId: &v.VendorSkuID, + CreatorName: &v.LastOperator, + OutActId: utils.String2Pointer(utils.Int2Str(v.ActID)), + } + //actData = append(actData, temp) } } return actData } +//删除活动详情 func storeSku2ActData4Delete(actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actIDList []string) { for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { @@ -77,46 +129,86 @@ func storeSku2ActData4Delete(actStoreSku []*model.ActStoreSku2, handler func(int return actIDList } +//删除活动的商品详情 +func actSku2Delete(actIDs []string) (map[string]domain.AlibabaRetailMarketingItemdiscountActivitySkuDeleteItemDiscountActivityElementOperateRequest, error) { + var ( + SkuElement []domain.AlibabaRetailMarketingItemdiscountActivitySkuDeleteSkuActivityElementDto + deData = make(map[string]domain.AlibabaRetailMarketingItemdiscountActivitySkuDeleteItemDiscountActivityElementOperateRequest, 0) + ) + for _, v := range actIDs { + i := utils.Str2Int64(v) + if skus, err := api.TaoVegetableApi.ActivitySkuQuery(i); err == nil { + //查询商品 + for _, sku := range skus { + SkuElement = append(SkuElement, domain.AlibabaRetailMarketingItemdiscountActivitySkuDeleteSkuActivityElementDto{ + SkuCode: sku.SkuCode, + }) + } + //查询活动详情 + act, err := api.TaoVegetableApi.ActivityQuery(i, "") + if err != nil { + return nil, err + } + deData[v] = domain.AlibabaRetailMarketingItemdiscountActivitySkuDeleteItemDiscountActivityElementOperateRequest{ + SkuElements: &SkuElement, + ActId: &i, + CreatorId: act.CreatorId, + CreatorName: act.CreatorName, + } + } + } + return deData, nil +} + func isCreateOrUpdate(syncStatus int8) bool { return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus) } func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (failedList []*partner.StoreSkuInfoWithErr, err error) { - actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate) - if len(actData) > 0 { + //1 活动详情 + actData := act2TxdActivity(act) + //2 活动商品详情 + actSkuData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate) + + if actData != nil && actSkuData != nil { if globals.EnableMtwmStoreWrite { - actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData) - err = err2 - // 忽略错误,都放在failedList里 - // if err != nil { - // return nil, err - // } + //创建活动 + actID, err1 := api.TaoVegetableApi.ActivityCreate(*actData) + if err1 != nil || actID == 0 { + failedList = append(failedList, &partner.StoreSkuInfoWithErr{ + VendoreID: model.VendorIDTaoVegetable, + ErrMsg: fmt.Sprintf("%v", err1), + StoreID: int(utils.Str2Int64WithDefault(vendorStoreID, 0)), + }) + return failedList, err1 + } + //活动增加商品 + actSkuData.ActId = &actID + err3, successSkuCode, failSkuCode := api.TaoVegetableApi.ActivitySkuCreate(*actSkuData) + err = err3 actStoreSkuMap := make(map[int]*model.ActStoreSku2) for _, v := range actStoreSku { actStoreSkuMap[v.SkuID] = v } - for _, v := range actResult { - if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v.AppFoodCode, 0))]; v2 != nil { - v2.VendorActID = utils.Int64ToStr(v.ActID) + for _, v := range successSkuCode.SkuID { + if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v, 0))]; v2 != nil { + v2.VendorActID = utils.Int64ToStr(successSkuCode.ActID) } } - for _, v := range faileInfoList { - if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v.AppFoodCode, 0))]; v2 != nil { + + for _, v := range failSkuCode { + if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v, 0))]; v2 != nil { failedList = append(failedList, &partner.StoreSkuInfoWithErr{ StoreSkuInfo: &partner.StoreSkuInfo{ SkuID: v2.SkuID, }, - VendoreID: model.VendorIDMTWM, + VendoreID: model.VendorIDTaoVegetable, StoreID: int(utils.Str2Int64WithDefault(vendorStoreID, 0)), - ErrMsg: v.ErrorMsg, + ErrMsg: fmt.Sprint(err3), }) } } - } else { - for _, v := range actStoreSku { - v.VendorActID = utils.Int64ToStr(jxutils.GenFakeID()) - } } } return failedList, err @@ -125,24 +217,32 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode func cancelOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (failedList []*partner.StoreSkuInfoWithErr, err error) { if list := storeSku2ActData4Delete(actStoreSku, nil /*model.IsSyncStatusNeedDelete*/); len(list) > 0 { if globals.EnableMtwmStoreWrite { - failedList2, err2 := api.MtwmAPI.RetailDiscountDelete2(vendorStoreID, jxActType2Mtwm(act.Type), list) actStoreSkuMap := make(map[string]*model.ActStoreSku2) for _, v := range actStoreSku { actStoreSkuMap[v.VendorActID] = v } - for _, v := range failedList2 { - if !mtwmapi.CanDeleteActErrMsgIgnore(v.ErrorMsg) { + //查找删除的活动商品 + sku2Delete, err := actSku2Delete(list) + if err != nil { + return nil, err + } + //删除活动以及商品 + for k, v := range sku2Delete { + if err = api.TaoVegetableApi.ActivitySkuDelete(v); err == nil { + err = api.TaoVegetableApi.ActivityDelete(*v.CreatorId, *v.CreatorName, utils.Str2Int64(k)) + } + if err != nil { failedList = append(failedList, &partner.StoreSkuInfoWithErr{ StoreSkuInfo: &partner.StoreSkuInfo{ - SkuID: actStoreSkuMap[utils.Int64ToStr(v.ActID)].SkuID, + SkuID: actStoreSkuMap[k].SkuID, }, StoreID: int(utils.Str2Int64WithDefault(vendorStoreID, 0)), - ErrMsg: v.ErrorMsg, - VendoreID: model.VendorIDMTWM, + ErrMsg: fmt.Sprint(err), + VendoreID: model.VendorIDTaoVegetable, }) } } - err = err2 + err = nil // 强制不返回错误,使用部分错误 } } @@ -254,12 +354,12 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa return err } -func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) { - for _, v := range mtwmapi.ActTypeList { - //1表示进行中 - if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil { - ample += len(actList) - } - } - return ample, err -} +//func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) { +// for _, v := range mtwmapi.ActTypeList { +// //1表示进行中 +// if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil { +// ample += len(actList) +// } +// } +// return ample, err +//} diff --git a/controllers/cms_store.go b/controllers/cms_store.go index 8968b525d..9b52e000f 100644 --- a/controllers/cms_store.go +++ b/controllers/cms_store.go @@ -1658,6 +1658,25 @@ func (c *StoreController) BatchUpdateMTStoreLogos() { }) } +// @Title 批量绑定淘鲜达门店 +// @Description 批量绑定淘鲜达门店 +// @Param token header string true "认证token" +// @Param bindInfos formData string true "TaoBindInfo" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /SingleBindTaoVegetable [post] +func (c *StoreController) SingleBindTaoVegetable() { + c.callSingleBindTaoVegetable(func(params *tStoreSingleBindTaoVegetableParams) (retVal interface{}, hint string, err error) { + taoBindInfo := make([]cms.TaoBindInfo, 0) + b := bytes.NewBufferString(params.BindInfos) + decoder := json.NewDecoder(b) + if err = decoder.Decode(&taoBindInfo); err == nil { + err, hint = cms.SingleBindTaoVegetable(params.Ctx, taoBindInfo) + } + return nil, hint, err + }) +} + // @Title 测试操作freight_template // @Description 测试操作freight_template // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index e5f20286e..71ea103eb 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -3109,7 +3109,15 @@ func init() { MethodParams: param.Make(), Filters: nil, Params: nil}) - + //单独绑定淘鲜达门店 + web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], + web.ControllerComments{ + Method: "SingleBindTaoVegetable", + Router: `/SingleBindTaoVegetable`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) //测试用-ysq web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreController"], web.ControllerComments{