FullSyncStoreSkuBindAct

This commit is contained in:
gazebo
2020-01-20 18:14:00 +08:00
parent ac0e99b38d
commit af658360dd
4 changed files with 164 additions and 44 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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
}