From da6601322f48b8461c139cbf32830c4191ad779d Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 23 Oct 2019 14:06:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84PruneMissingStoreSkus?= =?UTF-8?q?=E4=B8=8EAddCreateFlagForJxStoreSku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync_store_sku.go | 154 +++++++++++++++++-------- 1 file changed, 103 insertions(+), 51 deletions(-) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 57a860550..b54a2f2aa 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -21,6 +21,12 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" ) +const ( + AmmendPruneOnlyAmend = 1 + AmmendPruneOnlyPrune = 2 + AmmendPruneAll = 3 +) + var ( subSensitiveWordRegexp = regexp.MustCompile(`[^\[\]\"\}]`) ) @@ -572,9 +578,20 @@ func checkRemoteCatExist(localCatMap map[string]*dao.SkuStoreCatInfo, catList [] return cat2Delete } +func fillRemoteCatMap(catList []*partner.BareCategoryInfo, catMap map[string]int) { + for _, v := range catList { + catMap[v.VendorCatID] = 1 + fillRemoteCatMap(v.Children, catMap) + } +} + // 清除京西没有,平台有的商品与商家分类 // todo !!!,因为美团外卖分类当前是用的名字关联的,所以改名后如果没有及时同步,这个函数会导致美团平台的分类被误删 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) if handler == nil { 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 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, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { 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) if err = err2; err == nil { + remoteSkuMap := make(map[int]int) for _, v := range remoteSkuList { + remoteSkuMap[v.SkuList[0].SkuID] = 1 if localSkuMap[v.SkuList[0].SkuID] == nil { sku2Delete = append(sku2Delete, &partner.StoreSkuInfo{ 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: - 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 = handler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList) return nil, 0, err @@ -632,9 +667,26 @@ func PruneMissingStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, ven remoteCatList, err2 := handler.GetStoreAllCategories(ctx, storeID, vendorStoreID) if err = err2; err == nil { 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: - 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++ { level := 2 - i 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) { - handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) - if handler == nil { - return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) - } - db := dao.GetDB() - localSkuList, err := dao.GetStoreSkus2(db, vendorID, storeID, nil, false) - if err != nil { - return "", err - } + return ammendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, isAsync, isContinueWhenError, AmmendPruneOnlyAmend) + // handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) + // if handler == nil { + // return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID]) + // } + // db := dao.GetDB() - var storeSkuBindIDs []int - seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: - remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) - if err = err2; err == nil { - remoteSkuMap := make(map[int]int) - for _, value := range remoteSkuList { - for _, skuInfo := range value.SkuList { - remoteSkuMap[skuInfo.SkuID] = 1 - } - } - 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) - } - } - localSkuList = nil - } - case 1: - if 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) - } - } - } - return nil, err - } - task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2) - tasksch.HandleTask(task, parentTask, true).Run() - if isAsync { - hint = task.GetID() - } else { - _, err = task.GetResult(0) - } - return hint, err + // var storeSkuBindIDs []int + // seqTaskFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + // switch step { + // case 0: + // localSkuList, err2 := dao.GetStoreSkus2(db, vendorID, storeID, nil, false) + // if err = err2; err != nil { + // return nil, err + // } + // remoteSkuList, err2 := handler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, nil) + // if err = err2; err == nil { + // remoteSkuMap := make(map[int]int) + // for _, value := range remoteSkuList { + // for _, skuInfo := range value.SkuList { + // remoteSkuMap[skuInfo.SkuID] = 1 + // } + // } + // 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: + // if 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) + // } + // } + // } + // return nil, err + // } + // task := tasksch.NewSeqTask(fmt.Sprintf("处理京西门店商品加待创建标记:%s", model.VendorChineseNames[vendorID]), ctx, seqTaskFunc, 2) + // tasksch.HandleTask(task, parentTask, true).Run() + // if isAsync { + // hint = task.GetID() + // } 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) {