重构PruneMissingStoreSkus与AddCreateFlagForJxStoreSku

This commit is contained in:
gazebo
2019-10-23 14:06:13 +08:00
parent 06d8781cb0
commit da6601322f

View File

@@ -21,6 +21,12 @@ import (
"git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner"
) )
const (
AmmendPruneOnlyAmend = 1
AmmendPruneOnlyPrune = 2
AmmendPruneAll = 3
)
var ( var (
subSensitiveWordRegexp = regexp.MustCompile(`[^\[\]\"\}]`) subSensitiveWordRegexp = regexp.MustCompile(`[^\[\]\"\}]`)
) )
@@ -572,9 +578,20 @@ func checkRemoteCatExist(localCatMap map[string]*dao.SkuStoreCatInfo, catList []
return cat2Delete return cat2Delete
} }
func fillRemoteCatMap(catList []*partner.BareCategoryInfo, catMap map[string]int) {
for _, v := range catList {
catMap[v.VendorCatID] = 1
fillRemoteCatMap(v.Children, catMap)
}
}
// 清除京西没有,平台有的商品与商家分类 // 清除京西没有,平台有的商品与商家分类
// todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删 // todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删
func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {
return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyPrune)
}
func ammendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool, opType int) (hint string, err error) {
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
if handler == nil { if handler == nil {
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
@@ -583,7 +600,8 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
var sku2Delete []*partner.StoreSkuInfo var sku2Delete []*partner.StoreSkuInfo
var cat2Delete []*partner.BareCategoryInfo var cat2Delete []*partner.BareCategoryInfo
task := tasksch.NewParallelTask(fmt.Sprintf("清除平台:%s上多余的门店商品", model.VendorChineseNames[vendorID]), var storeSkuBindIDs, storeCatBindIDs []int
task := tasksch.NewParallelTask(fmt.Sprintf("修补平台:%s上的门店商品与分类", model.VendorChineseNames[vendorID]),
tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
step := batchItemList[0].(int) step := batchItemList[0].(int)
@@ -600,7 +618,9 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
if err = err2; err == nil { if err = err2; err == nil {
remoteSkuMap := make(map[int]int)
for _, v := range remoteSkuList { for _, v := range remoteSkuList {
remoteSkuMap[v.SkuList[0].SkuID] = 1
if localSkuMap[v.SkuList[0].SkuID] == nil { if localSkuMap[v.SkuList[0].SkuID] == nil {
sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{ sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{
SkuID: v.SkuList[0].SkuID, SkuID: v.SkuList[0].SkuID,
@@ -608,9 +628,24 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
}) })
} }
} }
for _, v := range localSkuList {
if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 {
storeSkuBindIDs = append(storeSkuBindIDs, v.BindID)
}
}
} }
case 1: case 1:
if len(sku2Delete) > 0 { if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeSkuBindIDs) > 0 {
for _, bindID := range storeSkuBindIDs {
fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
skuBind := &model.StoreSkuBind{}
skuBind.ID = bindID
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
}
}
if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(sku2Delete) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { _, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
_, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList) _, err = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
return nil, 0, err return nil, 0, err
@@ -632,9 +667,26 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
remoteCatList, err2 := handler.GetStoreAllCategories(ctx, storeID, vendorStoreID) remoteCatList, err2 := handler.GetStoreAllCategories(ctx, storeID, vendorStoreID)
if err = err2; err == nil { if err = err2; err == nil {
cat2Delete = checkRemoteCatExist(localCatMap, remoteCatList) cat2Delete = checkRemoteCatExist(localCatMap, remoteCatList)
remoteCatMap := make(map[string]int)
fillRemoteCatMap(remoteCatList, remoteCatMap)
for _, v := range localCatList {
if remoteCatMap[v.VendorCatID] == 0 && !model.IsSyncStatusNew(v.StoreCatSyncStatus) && !model.IsSyncStatusDelete(v.StoreCatSyncStatus) && v.MapID != 0 {
storeCatBindIDs = append(storeCatBindIDs, v.MapID)
}
}
} }
case 3: case 3:
if len(cat2Delete) > 0 { if (opType == AmmendPruneOnlyAmend || opType == AmmendPruneAll) && len(storeCatBindIDs) > 0 {
for _, bindID := range storeCatBindIDs {
fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
catBind := &model.StoreSkuCategoryMap{}
catBind.ID = bindID
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, catBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
}
}
if (opType == AmmendPruneOnlyPrune || opType == AmmendPruneAll) && len(cat2Delete) > 0 {
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
level := 2 - i level := 2 - i
var levelCat2Delete []*partner.BareCategoryInfo var levelCat2Delete []*partner.BareCategoryInfo
@@ -670,55 +722,55 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven
// 把京西有,平台无且没有待创建标记的商品加上待创建标记 // 把京西有,平台无且没有待创建标记的商品加上待创建标记
func AddCreateFlagForJxStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { func AddCreateFlagForJxStoreSku(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyAmend)
if handler == nil { // handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) // if handler == nil {
} // return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
db := dao.GetDB() // }
localSkuList, err := dao.GetStoreSkus2(db, vendorID, storeID, nil, false) // db := dao.GetDB()
if err != nil {
return "", err
}
var storeSkuBindIDs []int // var storeSkuBindIDs []int
seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
switch step { // switch step {
case 0: // case 0:
remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) // localSkuList, err2 := dao.GetStoreSkus2(db, vendorID, storeID, nil, false)
if err = err2; err == nil { // if err = err2; err != nil {
remoteSkuMap := make(map[int]int) // return nil, err
for _, value := range remoteSkuList { // }
for _, skuInfo := range value.SkuList { // remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil)
remoteSkuMap[skuInfo.SkuID] = 1 // if err = err2; err == nil {
} // remoteSkuMap := make(map[int]int)
} // for _, value := range remoteSkuList {
for _, v := range localSkuList { // for _, skuInfo := range value.SkuList {
if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 { // remoteSkuMap[skuInfo.SkuID] = 1
storeSkuBindIDs = append(storeSkuBindIDs, v.BindID) // }
} // }
} // for _, v := range localSkuList {
localSkuList = nil // if remoteSkuMap[v.SkuID] == 0 && !model.IsSyncStatusNew(v.StoreSkuSyncStatus) && !model.IsSyncStatusDelete(v.StoreSkuSyncStatus) && v.BindID != 0 {
} // storeSkuBindIDs = append(storeSkuBindIDs, v.BindID)
case 1: // }
if len(storeSkuBindIDs) > 0 { // }
for _, bindID := range storeSkuBindIDs { // }
fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) // case 1:
skuBind := &model.StoreSkuBind{} // if len(storeSkuBindIDs) > 0 {
skuBind.ID = bindID // for _, bindID := range storeSkuBindIDs {
dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask) // fieldStatus := dao.GetSyncStatusStructField(model.VendorNames[vendorID])
} // skuBind := &model.StoreSkuBind{}
} // skuBind.ID = bindID
} // dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, skuBind, nil, ctx.GetUserName(), nil, fieldStatus, model.SyncFlagNewMask)
return nil, err // }
} // }
task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2) // }
tasksch.HandleTask(task, parentTask, true).Run() // return nil, err
if isAsync { // }
hint = task.GetID() // task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2)
} else { // tasksch.HandleTask(task, parentTask, true).Run()
_, err = task.GetResult(0) // if isAsync {
} // hint = task.GetID()
return hint, err // } else {
// _, err = task.GetResult(0)
// }
// return hint, err
} }
func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { func ClearRemoteStoreStuffAndSetNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) {