diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 620b64220..a7b4fd0df 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -1176,14 +1176,14 @@ func SyncActStoreSku2StoreSkuAct(ctx *jxcontext.Context, db *dao.DaoDB, parentTa t1.updated_at = NOW(), t1.last_operator = ?, t1.hint_act_id = t2.act_id - WHERE t1.vendor_id = ? + WHERE t1.vendor_id = ? AND t1.act_percentage <> IF(t2.sync_status & ? = 0 AND t3.deleted_at = ?, t3.price_percentage, 0) ` sqlParams := []interface{}{ act.ID, model.SyncFlagDeletedMask, utils.DefaultTimeValue, model.SyncFlagModifiedMask, ctx.GetUserName(), - act.VendorID, + act.VendorID, model.SyncFlagDeletedMask, utils.DefaultTimeValue, } _, err = dao.ExecuteSQL(dao.GetDB(), sql, sqlParams...) if err != nil { @@ -1243,6 +1243,8 @@ func SyncActStoreSku2StoreSkuAct(ctx *jxcontext.Context, db *dao.DaoDB, parentTa func SyncSpecialAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { db := dao.GetDB() - err = SyncActStoreSku2StoreSkuAct(ctx, db, parentTask, act) + if err = SyncActStoreSku2StoreSkuAct(ctx, db, parentTask, act); err == nil { + err = cms.FullSyncStoreSkuBindAct(ctx, parentTask, act.ID, nil, nil) + } return err } diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 539dd03e6..735140ea1 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -1010,27 +1010,12 @@ func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor globals.SugarLogger.Debugf("createStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() - storeSkuActList, err := dao.GetStoresSkusAct(db, 0, []int{storeID}, skuIDs, []int{vendorID}, 1, 0) + storeSkuActList, err := dao.GetStoresSkusAct(db, 0, false, []int{storeID}, skuIDs, []int{vendorID}, false, 1, 0) 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 - failedList, err = storeSkuHandler.CreateStoreSkusAct(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) - if len(failedList) > 0 { - task.AddFailedList(failedList) - } - successList := putils.UnselectStoreSkuListBySkuIDs(batchedStoreSkuList, putils.StoreSkuInfoWithErrList2SkuIDs(failedList)) - if len(successList) > 0 { - updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), true) - } - return nil, len(successList), err - }, ctx, parentTask, storeSkuList2, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncCancelActs), true) + if isChangePrice && vendorID == model.VendorIDJD { + time.Sleep(1 * time.Second) // 改价后马上建活动可能失败 } + err = createStoreSkuActs2(ctx, parentTask, vendorID, vendorOrgCode, storeID, vendorStoreID, storeSkuList, storeSkuActList) } return err } @@ -1039,27 +1024,154 @@ func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendor globals.SugarLogger.Debugf("cancelStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) skuIDs := putils.StoreSkuList2IDs(storeSkuList) db := dao.GetDB() - storeSkuActList, err := dao.GetStoresSkusAct(db, 0, []int{storeID}, skuIDs, []int{vendorID}, 0, 0) + storeSkuActList, err := dao.GetStoresSkusAct(db, 0, false, []int{storeID}, skuIDs, []int{vendorID}, true, 0, 0) if err == nil { - storeSkuList2, storeSkuActMap := parseStoreSkuActList(false, storeSkuList, storeSkuActList) - if len(storeSkuList2) > 0 { - 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 - failedList, err = storeSkuHandler.CancelActs(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) - if len(failedList) > 0 { - task.AddFailedList(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) // 取消活动后马上改价可能失败 - } + err = cancelStoreSkuActs2(ctx, parentTask, vendorID, vendorOrgCode, storeID, vendorStoreID, storeSkuList, storeSkuActList) + if err == nil && isChangePrice && vendorID == model.VendorIDJD { + time.Sleep(1 * time.Second) // 取消活动后马上改价可能失败 } } return err } + +func createStoreSkuActs2(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, + storeSkuList []*partner.StoreSkuInfo, storeSkuActList []*model.StoreSkuAct) (err error) { + globals.SugarLogger.Debugf("createStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) + storeSkuList2, storeSkuActMap := parseStoreSkuActList(true, storeSkuList, storeSkuActList) + if len(storeSkuList2) > 0 { + 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 + failedList, err = storeSkuHandler.CreateStoreSkusAct(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) + if len(failedList) > 0 { + task.AddFailedList(failedList) + } + successList := putils.UnselectStoreSkuListBySkuIDs(batchedStoreSkuList, putils.StoreSkuInfoWithErrList2SkuIDs(failedList)) + if len(successList) > 0 { + updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), true) + } + return nil, len(successList), err + }, ctx, parentTask, storeSkuList2, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncCancelActs), true) + } + return err +} + +func cancelStoreSkuActs2(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, + storeSkuList []*partner.StoreSkuInfo, storeSkuActList []*model.StoreSkuAct) (err error) { + globals.SugarLogger.Debugf("cancelStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true)) + storeSkuList2, storeSkuActMap := parseStoreSkuActList(false, storeSkuList, storeSkuActList) + if len(storeSkuList2) > 0 { + 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 + failedList, err = storeSkuHandler.CancelActs(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) + if len(failedList) > 0 { + task.AddFailedList(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) + } + return err +} + +func SyncStoreSkuBindAct(ctx *jxcontext.Context, parentTask tasksch.ITask, isCreate bool, hintActID int, storeIDs, skuIDs []int) (err error) { + db := dao.GetDB() + var mustHaveVendorActID bool + var minActPercentage int + if isCreate { + mustHaveVendorActID = false + minActPercentage = 1 + } else { + mustHaveVendorActID = true + minActPercentage = 0 + } + storeSkuActList, err := dao.GetStoresSkusAct(db, hintActID, true, storeIDs, skuIDs, nil, mustHaveVendorActID, minActPercentage, 0) + if err != nil || len(storeSkuActList) == 0 { + return err + } + + storeMap := make(map[int]int) + skuMap := make(map[int]int) + storeVendorMap := make(map[int]map[int]int) + storeSkuActMap := make(map[int]map[int][]*model.StoreSkuAct) + for _, v := range storeSkuActList { + storeMap[v.StoreID] = 1 + skuMap[v.SkuID] = 1 + + if storeVendorMap[v.StoreID] == nil { + storeVendorMap[v.StoreID] = make(map[int]int) + } + storeVendorMap[v.StoreID][v.VendorID] = 1 + + if storeSkuActMap[v.StoreID] == nil { + storeSkuActMap[v.StoreID] = make(map[int][]*model.StoreSkuAct) + } + storeSkuActMap[v.StoreID][v.VendorID] = append(storeSkuActMap[v.StoreID][v.VendorID], v) + } + + storeIDs = jxutils.IntMap2List(storeMap) + storeSkuList, err := dao.GetStoresSkusInfo(db, storeIDs, jxutils.IntMap2List(skuMap)) + if err != nil || len(storeSkuList) == 0 { + return err + } + storeSkuMap := make(map[int]map[int][]*partner.StoreSkuInfo) + for _, v := range storeSkuList { + if storeSkuMap[v.StoreID] == nil { + storeSkuMap[v.StoreID] = make(map[int][]*partner.StoreSkuInfo) + } + for vendorID := range storeVendorMap[v.StoreID] { + storeSku := &partner.StoreSkuInfo{ + SkuID: v.SkuID, + VendorPrice: int64(dao.GetStoreSkuBindVendorPrice(v, vendorID)), + } + storeSkuMap[v.StoreID][vendorID] = append(storeSkuMap[v.StoreID][vendorID], storeSku) + } + } + + task := tasksch.NewParallelTask("处理门店商品绑定活动", nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeID := batchItemList[0].(int) + vendorIDs := jxutils.IntMap2List(storeVendorMap[storeID]) + subTask := tasksch.NewParallelTask(fmt.Sprintf("处理门店商品绑定活动门店:%d", storeID), nil, ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + vendorID := batchItemList[0].(int) + storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID) + if err == nil { + if isCreate { + err = createStoreSkuActs2(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeSkuMap[storeID][vendorID], storeSkuActMap[storeID][vendorID]) + } else { + err = cancelStoreSkuActs2(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeSkuMap[storeID][vendorID], storeSkuActMap[storeID][vendorID]) + } + } + return retVal, err + }, vendorIDs) + tasksch.HandleTask(subTask, task, true).Run() + _, err = subTask.GetResult(0) + return retVal, err + }, storeIDs) + tasksch.HandleTask(task, parentTask, true).Run() + _, err = task.GetResult(0) + + return err +} + +func FullSyncStoreSkuBindAct(ctx *jxcontext.Context, parentTask tasksch.ITask, hintActID int, storeIDs, skuIDs []int) (err error) { + task := tasksch.NewParallelTask("同步门店商品绑定活动", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0] + switch step { + case 0: + err = SyncStoreSkuBindAct(ctx, task, false, hintActID, storeIDs, skuIDs) + case 1: + err = SyncStoreSkuBindAct(ctx, task, true, hintActID, storeIDs, skuIDs) + } + return retVal, err + }, []int{0, 1}) + tasksch.HandleTask(task, parentTask, true).Run() + _, err = task.GetResult(0) + return err +} diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 1b4a29877..bf18b3da7 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -511,7 +511,7 @@ func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err e return err } -func GetStoresSkusAct(db *DaoDB, hintActID int, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuActList []*model.StoreSkuAct, err error) { +func GetStoresSkusAct(db *DaoDB, hintActID int, mustDirty bool, storeIDs, skuIDs, vendorIDs []int, mustHaveVendorActID bool, minActPercentage, maxActPercentage int) (storeSkuActList []*model.StoreSkuAct, err error) { sql := ` SELECT * FROM store_sku_act t1 @@ -522,6 +522,9 @@ func GetStoresSkusAct(db *DaoDB, hintActID int, storeIDs, skuIDs, vendorIDs []in sql += " AND t1.hint_act_id = ?" sqlParams = append(sqlParams, hintActID) } + if mustDirty { + sql += " AND t1.sync_status <> 0" + } if len(storeIDs) > 0 { sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" sqlParams = append(sqlParams, storeIDs) @@ -534,6 +537,9 @@ func GetStoresSkusAct(db *DaoDB, hintActID int, storeIDs, skuIDs, vendorIDs []in sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } + if mustHaveVendorActID { + sql += " AND t1.vendor_act_id <> ''" + } if minActPercentage > 0 { sql += " AND t1.act_percentage >= ?" sqlParams = append(sqlParams, minActPercentage) @@ -549,7 +555,7 @@ func GetStoresSkusAct(db *DaoDB, hintActID int, storeIDs, skuIDs, vendorIDs []in func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuAndActList []*StoreSkuAndAct, err error) { storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs) if err == nil && len(storeSkuList) > 0 { - storeSkuActList, err2 := GetStoresSkusAct(db, 0, storeIDs, skuIDs, vendorIDs, minActPercentage, maxActPercentage) + storeSkuActList, err2 := GetStoresSkusAct(db, 0, false, storeIDs, skuIDs, vendorIDs, false, minActPercentage, maxActPercentage) if err = err2; err == nil { actMap := make(map[int64][]*model.StoreSkuAct) for _, v := range storeSkuActList { diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index acda916ca..c5ce30cef 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -1259,7 +1259,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI return err } storeMapMap = StoreMapList2Map(storeMapList) - storeSkuActList, err2 := GetStoresSkusAct(db, 0, storeIDs, skuIDs, nil, 0, 0) + storeSkuActList, err2 := GetStoresSkusAct(db, 0, false, storeIDs, skuIDs, nil, false, 0, 0) if err = err2; err != nil { return err }