门店商品直接活动
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user