diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 36cd478f6..5ca9829b4 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -913,7 +913,12 @@ func (v *VendorSync) SyncStoreSkusFromYb(ctx *jxcontext.Context, storeIDs []int, func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorStoreID string, isAsync, isContinueWhenError bool) (hint string, err error) { var ( - db = dao.GetDB() + db = dao.GetDB() + localSkuMap = make(map[string]*dao.StoreSkuSyncInfo) + vendorSkuMap = make(map[string]*partner.SkuNameInfo) + addList []*partner.SkuNameInfo + updateList []*partner.SkuNameInfo + deleteList []*dao.StoreSkuSyncInfo ) handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) store, _ := dao.GetStoreDetail(db, storeID, vendorID) @@ -922,7 +927,6 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt if err != nil { return "", err } - localSkuMap := make(map[string]*dao.StoreSkuSyncInfo) for _, v := range localSkuList { localSkuMap[v.VendorSkuID] = v } @@ -930,103 +934,119 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt if err != nil { return "", err } - task := tasksch.NewParallelTask("银豹平台拉取标品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - var ( - pricePercentagePack []*model.PricePercentageItem - v = batchItemList[0].(*partner.SkuNameInfo) - ) - //长度大于7就可能是标品,非标品一般是7位,前三位是yb_store_prefix后4位是yb_name_suffix - if len(v.YbBarCode) > 7 { - if localSkuMap[v.SkuList[0].VendorSkuID] == nil { - skuNames, err := dao.GetSkuNames(db, nil, []string{v.YbBarCode}, "", false) - if err != nil { - return retVal, err - } - //表示我们商品库中没有这个upc商品,如果有就直接关注上 - if len(skuNames) == 0 { - //我们商品库中有这个商品,但是upc没有填,则尝试用upc去查一下 - productInfos, err2 := GetJdUpcCodeByName(ctx, "", v.YbBarCode) - err = err2 - //表示用upc也没有找到这个商品,则再尝试用银豹上的名字去查 - if len(productInfos) == 0 { - skuNames2, err := dao.GetSkuNames(db, nil, nil, v.Name, false) + for _, v := range remoteSkuList { + if len(v.YbBarCode) > 7 { + if localSkuMap[v.SkuList[0].VendorSkuID] == nil { + addList = append(addList, v) + } else { + updateList = append(updateList, v) + } + vendorSkuMap[v.SkuList[0].VendorSkuID] = v + } + } + for _, v := range localSkuList { + if vendorSkuMap[v.VendorSkuID] == nil { + deleteList = append(deleteList, v) + } + } + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + var ( + v = batchItemList[0].(*partner.SkuNameInfo) + pricePercentagePack []*model.PricePercentageItem + upc = v.YbBarCode + ) + skuNames, err := dao.GetSkuNames(db, nil, []string{upc}, "", false) + if err != nil { + return retVal, err + } + + //表示我们商品库中没有这个upc商品,如果有就直接关注上 + if len(skuNames) == 0 { + //我们商品库中有这个商品,但是upc没有填,则尝试用upc去查一下 + productInfos, err2 := GetJdUpcCodeByName(ctx, "", upc) + err = err2 + //表示用upc也没有找到这个商品,则再尝试用银豹上的名字去查 + if len(productInfos) == 0 { + var skuNames []string + skuNames = append(skuNames, v.Name) //银豹上的名字 + for _, name := range skuNames { + skuNames2, err := dao.GetSkuNames(db, nil, nil, name, false) if err != nil { return retVal, err } - if len(skuNames2) > 1 { - return retVal, fmt.Errorf("此商品名在京西库中查询出了大于1个商品,[%v]", v.Name) - } - //表示查到了,需要把upc更新上去,没查到就要新建(//TODO新建不起,没得规格这些) + //表示查到了,需要把upc更新上去,没查到就要新建 if len(skuNames2) == 1 { skuNames2[0].Upc = &v.YbBarCode dao.UpdateEntity(db, skuNames2[0], "Upc") buildStoreSkuBindInfosAndFocus(ctx, db, store, v, skuNames2[0].ID, pricePercentagePack) } - if len(skuNames2) == 0 { - - } + } + } else { + productInfo := productInfos[0] + skuNames2, err := dao.GetSkuNames(db, nil, nil, productInfo.Name, false) + if err != nil { + return retVal, err + } + if len(skuNames2) > 1 { + return retVal, fmt.Errorf("此商品名在京西库中查询出了大于1个商品,[%v]", productInfo.Name) + } + //表示查到了,需要把upc更新上去,没查到就要新建 + if len(skuNames2) == 1 && (productInfo.SpecQuality == skuNames2[0].SpecQuality && productInfo.SpecUnit == skuNames2[0].SpecUnit) { + skuNames2[0].Upc = &v.YbBarCode + dao.UpdateEntity(db, skuNames2[0], "Upc") + buildStoreSkuBindInfosAndFocus(ctx, db, store, v, skuNames2[0].ID, pricePercentagePack) } else { - productInfo := productInfos[0] - skuNames2, err := dao.GetSkuNames(db, nil, nil, productInfo.Name, false) + skuNameExt := &model.SkuNameExt{ + SkuName: model.SkuName{ + Name: productInfo.Name, + Upc: &productInfo.UpcCode, + Status: model.SkuStatusNormal, + CategoryID: model.NoCatCatgoryID, + IsGlobal: model.YES, + Unit: productInfo.Unit, + }, + Skus: []*model.SkuWithVendor{ + &model.SkuWithVendor{ + Sku: &model.Sku{}, + }, + }, + // Places: []int{510100}, //默认成都 + } + if len(v.SkuList) > 0 { + skuNameExt.Price = int(v.SkuList[0].VendorPrice) + skuNameExt.Skus[0].SpecQuality = productInfo.SpecQuality + skuNameExt.Skus[0].SpecUnit = productInfo.SpecUnit + skuNameExt.Skus[0].Weight = int(utils.Str2Int64(utils.Float64ToStr(float64(productInfo.Weight)))) + skuNameExt.Skus[0].Status = model.SkuStatusNormal + } + if len(productInfo.ImgList) > 0 { + skuNameExt.Img = productInfo.ImgList[0] + } + outSkuNameExt, err := AddSkuName(ctx, skuNameExt, ctx.GetUserName()) if err != nil { return retVal, err } - if len(skuNames2) > 1 { - return retVal, fmt.Errorf("此商品名在京西库中查询出了大于1个商品,[%v]", productInfo.Name) - } - //表示查到了,需要把upc更新上去,没查到就要新建 - if len(skuNames2) == 1 && (productInfo.SpecQuality == skuNames2[0].SpecQuality && productInfo.SpecUnit == skuNames2[0].SpecUnit) { - skuNames2[0].Upc = &v.YbBarCode - dao.UpdateEntity(db, skuNames2[0], "Upc") - buildStoreSkuBindInfosAndFocus(ctx, db, store, v, skuNames2[0].ID, pricePercentagePack) - } else { - skuNameExt := &model.SkuNameExt{ - SkuName: model.SkuName{ - Name: productInfo.Name, - Upc: &productInfo.UpcCode, - Status: model.SkuStatusNormal, - CategoryID: model.NoCatCatgoryID, - IsGlobal: model.YES, - Unit: productInfo.Unit, - }, - Skus: []*model.SkuWithVendor{ - &model.SkuWithVendor{ - Sku: &model.Sku{}, - }, - }, - // Places: []int{510100}, //默认成都 - } - if len(v.SkuList) > 0 { - skuNameExt.Price = int(v.SkuList[0].VendorPrice) - skuNameExt.Skus[0].SpecQuality = productInfo.SpecQuality - skuNameExt.Skus[0].SpecUnit = productInfo.SpecUnit - skuNameExt.Skus[0].Weight = int(utils.Str2Int64(utils.Float64ToStr(float64(productInfo.Weight)))) - skuNameExt.Skus[0].Status = model.SkuStatusNormal - } - if len(productInfo.ImgList) > 0 { - skuNameExt.Img = productInfo.ImgList[0] - } - outSkuNameExt, err := AddSkuName(ctx, skuNameExt, ctx.GetUserName()) - if err != nil { - return retVal, err - } - buildStoreSkuBindInfosAndFocus(ctx, db, store, v, outSkuNameExt.ID, pricePercentagePack) - } + buildStoreSkuBindInfosAndFocus(ctx, db, store, v, outSkuNameExt.ID, pricePercentagePack) } - } else { - buildStoreSkuBindInfosAndFocus(ctx, db, store, v, skuNames[0].ID, pricePercentagePack) } + } else { + buildStoreSkuBindInfosAndFocus(ctx, db, store, v, skuNames[0].ID, pricePercentagePack) } + + return retVal, err } - return retVal, err - }, remoteSkuList) - tasksch.HandleTask(task, nil, true).Run() - if isAsync { - hint = task.GetID() - } else { - _, err = task.GetResult(0) - hint = "1" + taskParallel := tasksch.NewParallelTask("创建商品", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, addList) + tasksch.HandleTask(taskParallel, task, true).Run() + _, err = taskParallel.GetResult(0) + case 1: + } + return result, err } + taskSeq := tasksch.NewSeqTask2("同步银豹商品到京西", ctx, true, taskSeqFunc, 3) + tasksch.HandleTask(taskSeq, nil, true).Run() + hint = taskSeq.GetID() return hint, err } diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index e05026395..08f1fb3b2 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -455,7 +455,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag isAdded2Update := false // 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改 if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil { - if dao.IsVendorThingIDEmpty(sku.VendorCatID) { + if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB { globals.SugarLogger.Warnf("syncStoreSkuNew 修改门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID) } else { isAdded2Update = true