diff --git a/business/partner/purchase/ebai/store_sku.go b/business/partner/purchase/ebai/store_sku.go index c30db72f1..873f36c12 100644 --- a/business/partner/purchase/ebai/store_sku.go +++ b/business/partner/purchase/ebai/store_sku.go @@ -1,6 +1,7 @@ package ebai import ( + "errors" "fmt" "strings" "time" @@ -74,14 +75,7 @@ var ( } ) -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 - } +func (p *PurchaseHandler) getDirtyStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int) (storeSkuInfoList []*tStoreSkuFullInfo, err error) { sql := ` SELECT t8.price_percentage, t1.*, t2.spec_quality, t2.spec_unit, t2.weight, t2.status sku_status, t3.prefix, t3.name, t2.comment, t3.is_global, t3.unit, t3.img, @@ -114,70 +108,101 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } - strStoreID := utils.Int2Str(storeID) - var storeSkuInfoList []*tStoreSkuFullInfo - if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { - // globals.SugarLogger.Debug(utils.Format4Output(storeSkuInfoList, false)) - catList2Add := make(map[int]int) - for _, storeSku := range storeSkuInfoList { - if storeSku.EbaiSyncStatus&model.SyncFlagNewMask != 0 { - if storeSku.ParentCatEbaiID == 0 { - catList2Add[storeSku.ParentCatID] = 1 - } - if storeSku.CatEbaiID == 0 { - catList2Add[storeSku.CatID] = 1 - } + err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...) + return storeSkuInfoList, err +} + +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.ParentCatEbaiID == 0 { + catList2Add[storeSku.ParentCatID] = 1 + } + if storeSku.CatEbaiID == 0 { + catList2Add[storeSku.CatID] = 1 } } + } + num = int64(len(catList2Add)) + if num > 0 { for k := range catList2Add { - if err = dao.AddStoreCategoryMap(db, storeID, k, model.VendorIDEBAI, "", model.SyncFlagNewMask, userName); err != nil { - return "", err + if err = dao.AddStoreCategoryMap(db, storeID, k, model.VendorIDEBAI, "", model.SyncFlagNewMask, ctx.GetUserName()); err != nil { + return 0, err } } if _, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil { - return "", err - } - if err = dao.GetRows(db, &storeSkuInfoList, sql, sqlParams...); err == nil { - 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)) - } - } - } - 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(parentTask, task).Run() - _, err = task.GetResult(0) + return 0, err } } + return num, nil +} + +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...) + } + }) + } + } 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...) + } + return nil, err + }, storeSkuInfoList) + tasksch.AddChild(parentTask, task).Run() + _, err = task.GetResult(0) + return "", err }