From b849f2c19522b3ccf53f0dd2a74e8a097da9da8a Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 17 Jan 2020 09:42:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=A8=E5=BA=97=E5=95=86=E5=93=81=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 27 ++++++----- business/partner/purchase/ebai/act.go | 4 +- business/partner/purchase/ebai/store_sku2.go | 4 +- business/partner/purchase/jd/store_sku2.go | 2 +- business/partner/purchase/mtwm/act.go | 47 +++++++++++++++++--- business/partner/purchase/mtwm/store_sku2.go | 10 ++++- business/partner/putils/store_sku.go | 34 +++++++++++++- 7 files changed, 102 insertions(+), 26 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 6e6d6608c..ffd32161d 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -608,7 +608,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag if len(priceList) > 0 { _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { if isNeedHandleAct(causeFlag) { - cancelStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) + cancelStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList, true) } var failedList []*partner.StoreSkuInfoWithErr failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) @@ -620,7 +620,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagPriceMask) } if isNeedHandleAct(causeFlag) { - createStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) + createStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList, true) } return nil, len(successList), err }, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError2) @@ -934,13 +934,14 @@ func MergeSkuSaleStatusWithStoreOpTime(sku *dao.StoreSkuSyncInfo, storeDetail *d } func GetVendorSkuIDList(l []*partner.StoreSkuInfoWithErr) (vendorSkuIDs []string) { - vendorSkuIDs2 := make([]string, len(l)) if len(l) > 0 { - for k, v := range l { - vendorSkuIDs2[k] = v.StoreSkuInfo.VendorSkuID + for _, v := range l { + if v.StoreSkuInfo != nil { + vendorSkuIDs = append(vendorSkuIDs, v.StoreSkuInfo.VendorSkuID) + } } } - return vendorSkuIDs2 + return vendorSkuIDs } func skuAct2Update(storeSkuAct *model.StoreSkuAct, isCreateAct bool) (item *dao.KVUpdateItem) { @@ -1005,7 +1006,7 @@ func parseStoreSkuActList(isCreateAct bool, storeSkuList []*partner.StoreSkuInfo return outStoreSkuList, storeSkuActMap } -func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { +func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, isChangePrice bool) (err error) { globals.SugarLogger.Debugf("createStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() @@ -1013,6 +1014,9 @@ func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor if err == nil { storeSkuList2, storeSkuActMap := parseStoreSkuActList(true, storeSkuList, storeSkuActList) if len(storeSkuList2) > 0 { + if isChangePrice { + time.Sleep(1 * time.Second) // 改价后马上建活动可能失败 + } storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) _, err = putils.FreeBatchStoreSkuInfo(fmt.Sprintf("创建门店%d直降活动", storeID), func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { var failedList []*partner.StoreSkuInfoWithErr @@ -1020,7 +1024,7 @@ func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor if len(failedList) > 0 { task.AddFailedList(failedList) } - successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList)) + successList := putils.UnselectStoreSkuListBySkuIDs(batchedStoreSkuList, putils.StoreSkuInfoWithErrList2SkuIDs(failedList)) if len(successList) > 0 { updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), true) } @@ -1031,7 +1035,7 @@ func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor return err } -func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { +func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, isChangePrice bool) (err error) { globals.SugarLogger.Debugf("cancelStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() @@ -1046,12 +1050,15 @@ func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor if len(failedList) > 0 { task.AddFailedList(failedList) } - successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList)) + successList := putils.UnselectStoreSkuListBySkuIDs(batchedStoreSkuList, putils.StoreSkuInfoWithErrList2SkuIDs(failedList)) if len(successList) > 0 { updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), false) } return nil, len(successList), err }, ctx, parentTask, storeSkuList2, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncCancelActs), true) + if isChangePrice && vendorID == model.VendorIDJD { + time.Sleep(1 * time.Second) // 取消活动后马上改价可能失败 + } } } return err diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index 316051e95..beda910c4 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -74,7 +74,7 @@ func actStoreSu2Ebai4Delete(oneStoreActSku []*model.ActStoreSku2) (skus []string func act2EbaiActivity(act *model.Act2, actOrderRules []*model.ActOrderRule) (activity *ebaiapi.ActivityInfo) { activity = &ebaiapi.ActivityInfo{ - ActivityName: act.GetRealActName(), + ActivityName: utils.LimitMixedStringLen(act.GetRealActName(), ebaiapi.MaxActivityNameLength), ActivityType: actType2Ebai(act.Type), StartTime: act.BeginAt.Unix(), EndTime: act.EndAt.Unix(), @@ -83,7 +83,7 @@ func act2EbaiActivity(act *model.Act2, actOrderRules []*model.ActOrderRule) (act WeekDay: "0,1,2,3,4,5,6", ActivityDesc: act.Advertising, ShowCategory: model.ActTypeName[act.Type], - PromotionSkuDesc: act.Advertising, + PromotionSkuDesc: utils.LimitMixedStringLen(act.Advertising, ebaiapi.MaxActivityDescLength), DayLimit: act.LimitDaily, ActivityPlatform: ebaiapi.ActivityPFAll, } diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index 11f96be62..e6e2de22d 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -465,10 +465,10 @@ func SelectStoreSkuListByOpResult(storeSkuList []*partner.StoreSkuInfo, opResult func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { for _, v := range storeSkuList { - if vendorActID, err2 := createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, v.SkuID), utils.Int2Str(storeID), putils.StoreSku2ActStoreSku([]*partner.StoreSkuInfo{v})); err2 != nil { + if vendorActID, err2 := createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, v.SkuID), utils.Int2Str(storeID), putils.StoreSku2ActStoreSku(model.SyncFlagNewMask, vendorStoreID, []*partner.StoreSkuInfo{v})); err2 != nil { failedList = append(failedList, &partner.StoreSkuInfoWithErr{ StoreSkuInfo: v, - VendoreID: model.VendorIDJD, + VendoreID: model.VendorIDEBAI, StoreID: storeID, ErrMsg: err2.Error(), }) diff --git a/business/partner/purchase/jd/store_sku2.go b/business/partner/purchase/jd/store_sku2.go index cfbb21fe2..e7d8cb00b 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -264,7 +264,7 @@ func SelectStoreSkuListByResponseList(storeSkuList []*partner.StoreSkuInfo, resp func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { for _, v := range storeSkuList { - if vendorActID, err2 := createSkuAct(ctx, putils.GetFixDirectDownAct(vendorOrgCode, storeID, v.SkuID), putils.StoreSku2ActStoreSku([]*partner.StoreSkuInfo{v})); err2 != nil { + if vendorActID, err2 := createSkuAct(ctx, putils.GetFixDirectDownAct(vendorOrgCode, storeID, v.SkuID), putils.StoreSku2ActStoreSku(model.SyncFlagNewMask, vendorStoreID, []*partner.StoreSkuInfo{v})); err2 != nil { failedList = append(failedList, &partner.StoreSkuInfoWithErr{ StoreSkuInfo: v, VendoreID: model.VendorIDJD, diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 450264eea..939b854cc 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -9,6 +9,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/business/partner/putils" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -58,7 +59,7 @@ func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handle ActPrice: jxutils.IntPrice2Standard(v.ActualActPrice), // DiscountCoefficient: 0, // Sequence: int(v.ActPrice), // 此字段不允许重复 - ItemID: utils.Str2Int64WithDefault(v.VendorActID, 0), + // ItemID: utils.Str2Int64WithDefault(v.VendorActID, 0), }) } } @@ -85,14 +86,17 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode if len(actData) > 0 { if globals.EnableMtwmStoreWrite { actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData) - // globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2) - if err = err2; err != nil { - return nil, err - } + err = err2 + // 忽略错误,都放在failedList里 + // if err != nil { + // return nil, err + // } + // globals.SugarLogger.Debugf("mtwm createOneShopAct actResult:%s, faileInfoList:%s err2:%v", utils.Format4Output(actResult, true), utils.Format4Output(faileInfoList, true), err2) 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) @@ -122,7 +126,25 @@ 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 { - err = api.MtwmAPI.RetailDiscountDelete(vendorStoreID, jxActType2Mtwm(act.Type), list) + 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) { + failedList = append(failedList, &partner.StoreSkuInfoWithErr{ + StoreSkuInfo: &partner.StoreSkuInfo{ + SkuID: actStoreSkuMap[utils.Int64ToStr(v.ActID)].SkuID, + }, + StoreID: int(utils.Str2Int64WithDefault(vendorStoreID, 0)), + ErrMsg: v.ErrorMsg, + VendoreID: model.VendorIDMTWM, + }) + } + } + err = err2 + err = nil // 强制不返回错误,使用部分错误 } } return failedList, err @@ -142,7 +164,18 @@ func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.A task := tasksch.NewParallelTask("mtwm createSkuAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { list := batchItemList[0].([]*model.ActStoreSku2) - if _, err = createOneShopAct(act, list[0].VendorStoreID, list); err == nil { + failedList, err2 := createOneShopAct(act, list[0].VendorStoreID, list) + if err = err2; err2 == nil { + if len(failedList) > 0 { + failedMap := putils.StoreSkuInfoWithErrList2MapBySku(failedList) + list = []*model.ActStoreSku2{} + for _, v := range actStoreSku { + if failedMap[v.SkuID] == nil { + list = append(list, v) + } + } + list = []*model.ActStoreSku2{} + } retVal = []interface{}{list} } return retVal, err diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index f83a3a82a..8e96a3b96 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -580,9 +580,15 @@ func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi. } func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - return createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(storeSkuList)) + actStoreSkuList := putils.StoreSku2ActStoreSku(model.SyncFlagNewMask, vendorStoreID, storeSkuList) + failedList, err = createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, actStoreSkuList) + storeSkuMap := putils.StoreSkuList2MapBySkuID(storeSkuList) + for _, v := range actStoreSkuList { + storeSkuMap[v.SkuID].VendorActID = v.VendorActID + } + return failedList, err } func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(storeSkuList)) + return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList)) } diff --git a/business/partner/putils/store_sku.go b/business/partner/putils/store_sku.go index 7a085a977..871e497e6 100644 --- a/business/partner/putils/store_sku.go +++ b/business/partner/putils/store_sku.go @@ -340,20 +340,33 @@ func GenPartialFailedErr(failedInfo interface{}, failedCount int) (err error) { return err } -func StoreSku2ActStoreSku(storeSkuList []*partner.StoreSkuInfo) (actStoreSku []*model.ActStoreSku2) { +func StoreSku2ActStoreSku(syncStatus int8, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (actStoreSku []*model.ActStoreSku2) { for _, v := range storeSkuList { actStoreSku = append(actStoreSku, &model.ActStoreSku2{ ActStoreSku: model.ActStoreSku{ SkuID: v.SkuID, Stock: 200, }, + VendorStoreID: vendorStoreID, VendorSkuID: v.VendorSkuID, + VendorActID: v.VendorActID, ActualActPrice: v.ActPrice, + SyncStatus: syncStatus, }) } return actStoreSku } +func UpdateStoreSkuByActStoreSku(storeSkuList []*partner.StoreSkuInfo, actStoreSku []*model.ActStoreSku2) []*partner.StoreSkuInfo { + storeSkuMap := StoreSkuList2MapBySkuID(storeSkuList) + for _, v := range actStoreSku { + if storeSku := storeSkuMap[v.SkuID]; storeSku != nil { + storeSku.VendorActID = v.VendorActID + } + } + return storeSkuList +} + func GetFixDirectDownAct(vendorOrgCode string, storeID, skuID int) (act *model.Act2) { name := fmt.Sprintf("自动直降活动%d:%d:%d", storeID, skuID, time.Now().Unix()) act = &model.Act2{ @@ -365,9 +378,26 @@ func GetFixDirectDownAct(vendorOrgCode string, storeID, skuID int) (act *model.A LimitUser: 1, LimitCount: 1, BeginAt: utils.Time2Date(time.Now()), - EndAt: utils.Time2Date(time.Now().Add(365 * 24 * time.Hour)), + EndAt: utils.Time2Date(time.Now().Add(50 * 24 * time.Hour)), // 饿百平台要求只能是2个月长的活动 }, VendorOrgCode: vendorOrgCode, } return act } + +func StoreSkuInfoWithErrList2SkuIDs(list []*partner.StoreSkuInfoWithErr) (skuIDs []int) { + for _, v := range list { + if v.StoreSkuInfo != nil && v.StoreSkuInfo.SkuID > 0 { + skuIDs = append(skuIDs, v.StoreSkuInfo.SkuID) + } + } + return skuIDs +} + +func StoreSkuInfoWithErrList2MapBySku(list []*partner.StoreSkuInfoWithErr) (mapInfo map[int]*partner.StoreSkuInfoWithErr) { + mapInfo = make(map[int]*partner.StoreSkuInfoWithErr) + for _, v := range list { + mapInfo[v.StoreSkuInfo.SkuID] = v + } + return mapInfo +}