diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index 873f36c12..ad78dbae0 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -115,7 +115,7 @@ func (p *PurchaseHandler) getDirtyStoreSkus(db *dao.DaoDB, storeID int, skuIDs [ func (p *PurchaseHandler) createCatByStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, storeID int, storeSkuInfoList []*tStoreSkuFullInfo) (num int64, err error) { catList2Add := make(map[int]int) for _, storeSku := range storeSkuInfoList { - if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { + if storeSku.EbaiSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { if storeSku.ParentCatEbaiID == 0 { catList2Add[storeSku.ParentCatID] = 1 } @@ -131,9 +131,9 @@ func (p *PurchaseHandler) createCatByStoreSkus(ctx *jxcontext.Context, parentTas return 0, err } } - if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil { - return 0, err - } + } + if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil { + return 0, err } return num, nil } @@ -141,69 +141,77 @@ func (p *PurchaseHandler) createCatByStoreSkus(ctx *jxcontext.Context, parentTas func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { userName := ctx.GetUserName() globals.SugarLogger.Debugf("SyncStoreSkus storeID:%d, skuIDs:%v, isContinueWhenError:%t, userName:%s", storeID, skuIDs, isContinueWhenError, userName) - db := dao.GetDB() - if err = p.SyncLocalStoreCategory(db, storeID, userName); err != nil { - return "", err - } - strStoreID := utils.Int2Str(storeID) var storeSkuInfoList []*tStoreSkuFullInfo var num int64 - for i := 0; i < 3; i++ { - if storeSkuInfoList, err = p.getDirtyStoreSkus(db, storeID, skuIDs); err != nil { - return "", err - } - if num, err = p.createCatByStoreSkus(ctx, parentTask, db, storeID, storeSkuInfoList); err != nil { - return "", err - } - if num == 0 { - break - } - } - if num != 0 { - return "", errors.New("不能创建商品所需的类别") - } - - task := tasksch.NewParallelTask("SyncStoreSkus skus", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - storeSku := batchItemList[0].(*tStoreSkuFullInfo) - updateFields := []string{model.FieldEbaiSyncStatus} - isCreate := false - if globals.EnableStoreWrite && globals.EnableEbaiStoreWrite { - if storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { - err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID)) - } else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { - // globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false)) - if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { - updateFields = append(updateFields, model.FieldEbaiID) - isCreate = true - // 创建SKU后马上绑定分类,会失败,所以延迟绑定 - time.AfterFunc(3*time.Second, func() { - if err := api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)); err == nil { - storeSku.EbaiSyncStatus = 0 - dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) + strStoreID := utils.Int2Str(storeID) + rootTask := tasksch.NewSeqTask("SyncStoreSkus cat", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + if step == 0 { + db := dao.GetDB() + if err = p.SyncLocalStoreCategory(db, storeID, userName); err != nil { + return "", err + } + for i := 0; i < 3; i++ { + if storeSkuInfoList, err = p.getDirtyStoreSkus(db, storeID, skuIDs); err != nil { + return nil, err + } + if num, err = p.createCatByStoreSkus(ctx, parentTask, db, storeID, storeSkuInfoList); err != nil { + return nil, err + } + if num == 0 { + break + } + } + if num != 0 { + return nil, errors.New("不能创建商品所需的类别") + } + } else if step == 1 { + task := tasksch.NewParallelTask("SyncStoreSkus skus", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), userName, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeSku := batchItemList[0].(*tStoreSkuFullInfo) + updateFields := []string{model.FieldEbaiSyncStatus} + isCreate := false + if globals.EnableStoreWrite && globals.EnableEbaiStoreWrite { + if storeSku.EbaiSyncStatus&model.SyncFlagDeletedMask != 0 { + err = api.EbaiAPI.SkuDelete(strStoreID, utils.Int64ToStr(storeSku.EbaiID)) + } else if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { + // globals.SugarLogger.Debug(utils.Format4Output(genSkuParamsFromStoreSkuInfo(storeSku), false)) + if storeSku.EbaiID, err = api.EbaiAPI.SkuCreate(strStoreID, storeSku.SkuID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { + updateFields = append(updateFields, model.FieldEbaiID) + isCreate = true + // 创建SKU后马上绑定分类,会失败,所以延迟绑定 + time.AfterFunc(3*time.Second, func() { + if err := api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)); err == nil { + storeSku.EbaiSyncStatus = 0 + dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) + } + }) } - }) + } else if storeSku.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { + if _, err = api.EbaiAPI.SkuUpdate(strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { + err = api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)) + } + } } - } else if storeSku.EbaiSyncStatus&model.SyncFlagModifiedMask != 0 { - if _, err = api.EbaiAPI.SkuUpdate(strStoreID, storeSku.EbaiID, genSkuParamsFromStoreSkuInfo(storeSku)); err == nil { - err = api.EbaiAPI.SkuShopCategoryMap(strStoreID, storeSku.EbaiID, utils.Int64ToStr(storeSku.CatEbaiID)) + if err == nil { + if isCreate { + storeSku.EbaiSyncStatus = model.SyncFlagModifiedMask + } else { + storeSku.EbaiSyncStatus = 0 + } + _, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) } - } - } - if err == nil { - if isCreate { - storeSku.EbaiSyncStatus = model.SyncFlagModifiedMask - } else { - storeSku.EbaiSyncStatus = 0 - } - _, err = dao.UpdateEntity(nil, &storeSku.StoreSkuBind, updateFields...) + return nil, err + }, storeSkuInfoList) + tasksch.AddChild(rootTask, task).Run() + _, err = task.GetResult(0) } return nil, err - }, storeSkuInfoList) - tasksch.AddChild(parentTask, task).Run() - _, err = task.GetResult(0) - - return "", err + }, 2) + tasksch.AddChild(parentTask, rootTask).Run() + if !isAsync { + _, err = rootTask.GetResult(0) + } + return rootTask.ID, err } func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error) {