From 4d153031498c57fcffd3aebbf90edd6ce36c608a Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 12 Dec 2019 15:53:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=88=9B=E5=BB=BA=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=98=AF=E7=9A=84=E7=88=B6=E5=AD=90=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync2.go | 82 +++++++++++++++++++++++----- business/partner/purchase/jd/sku2.go | 6 +- 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/business/jxstore/cms/sync2.go b/business/jxstore/cms/sync2.go index 722716469..476dce2a7 100644 --- a/business/jxstore/cms/sync2.go +++ b/business/jxstore/cms/sync2.go @@ -39,15 +39,15 @@ func getMultiStoreVendorInfoList() (list []*MultiStoreVendorInfo) { return list } -func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, catIDs []int, isAsync bool) (hint string, err error) { - globals.SugarLogger.Debugf("SyncCategories catIDs:%v", catIDs) - db := dao.GetDB() - catList, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, catIDs, true) - if err == nil && len(catList) > 0 { +func syncCategories(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, catList []*dao.SkuStoreCatInfo, isAsync bool) (hint string, err error) { + if len(catList) > 0 { // todo 按vendorID orgCode合并操作 - task := tasksch.NewParallelTask(fmt.Sprintf("同步分类:%v", catIDs), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, + task := tasksch.NewParallelTask(fmt.Sprintf("同步分类2:%v"), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { catVendorInfo := batchItemList[0].(*dao.SkuStoreCatInfo) + if catVendorInfo.Level != 1 && catVendorInfo.ParentVendorCatID == "" { + return nil, fmt.Errorf("%d的父目录%d没有同步", catVendorInfo.ID, catVendorInfo.ParentID) + } if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(catVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { if model.IsSyncStatusDelete(catVendorInfo.CatSyncStatus) { //删除 if !dao.IsVendorThingIDEmpty(catVendorInfo.VendorCatID) && @@ -67,7 +67,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs } return retVal, err }, catList) - tasksch.HandleTask(task, parentTask, len(catIDs) > 0).Run() + tasksch.HandleTask(task, parentTask, len(catList) == 0 || len(catList) > 10).Run() if isAsync { hint = task.GetID() } else { @@ -80,6 +80,50 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs return hint, err } +func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, catIDs []int, isAsync bool) (hint string, err error) { + globals.SugarLogger.Debugf("SyncCategories catIDs:%v", catIDs) + db := dao.GetDB() + catList, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, catIDs, true) + if err == nil && len(catList) > 0 { + var needSyncParentIDs []int + for _, cat := range catList { + if cat.Level == 2 && cat.ParentVendorCatID == "" { + needSyncParentIDs = append(needSyncParentIDs, cat.ParentID) + } + } + if len(needSyncParentIDs) > 0 { + task := tasksch.NewSeqTask(fmt.Sprintf("同步分类1:%v", catIDs), ctx, + func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + catList2, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, needSyncParentIDs, true) + if err == nil { + _, err = syncCategories(ctx, db, task, vendorIDs, appOrgCodes, catList2, false) + } + case 1: + catList2, err := dao.GetSkuCategoryWithVendor(db, nil, nil, -1, catIDs, true) + if err == nil { + _, err = syncCategories(ctx, db, task, vendorIDs, appOrgCodes, catList2, false) + } + } + return result, err + }, 2) + tasksch.HandleTask(task, parentTask, len(catIDs) == 0 || len(catIDs) > 10).Run() + if isAsync { + hint = task.GetID() + } else { + resultList, err2 := task.GetResult(0) + if err = err2; err == nil { + hint = utils.Int2Str(len(resultList)) + } + } + } else { + hint, err = syncCategories(ctx, db, parentTask, vendorIDs, appOrgCodes, catList, false) + } + } + return hint, err +} + func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, appOrgCodes []string, nameIDs, skuIDs []int, isAsync bool) (hint string, err error) { globals.SugarLogger.Debugf("SyncSkus nameIDs:%v, skuIDs:%v", nameIDs, skuIDs) db := dao.GetDB() @@ -89,6 +133,9 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, task := tasksch.NewParallelTask(fmt.Sprintf("同步商品:%v,%v", nameIDs, skuIDs), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo) + if skuVendorInfo.VendorCatID == "" { + return nil, fmt.Errorf("商品:%d的商家分类没有同步", skuVendorInfo.SkuID) + } skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0) skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus) if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok { @@ -110,7 +157,7 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int, } return retVal, err }, skuList) - tasksch.HandleTask(task, parentTask, len(skuList) > 0).Run() + tasksch.HandleTask(task, parentTask, len(skuList) == 0 || len(skuList) > 10).Run() if isAsync { hint = task.GetID() } else { @@ -174,8 +221,13 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult SyncStatus: model.SyncFlagNewMask, } dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName()) - errList.AddErr(dao.CreateEntity(db, thingMap)) - + if err2 := dao.CreateEntity(db, thingMap); err2 != nil { + if dao.IsDuplicateError(err2) { + errList.AddErr(onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagNewMask)) + } else { + errList.AddErr(err2) + } + } updateThingMapEntity(db, thingMap) } if globals.IsUseThingMap { @@ -184,7 +236,7 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult return err } -func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) { +func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8, syncStatus int8) (err error) { if thingType == model.ThingTypeSkuName { return nil } @@ -201,7 +253,7 @@ func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult } thingMap.DeletedAt = utils.DefaultTimeValue if err2 := getThingMap(db, thingMap); err2 == nil { - thingMap.SyncStatus |= model.SyncFlagModifiedMask + thingMap.SyncStatus |= syncStatus thingMap.LastOperator = ctx.GetUserName() _, err2 = dao.UpdateEntity(db, thingMap) errList.AddErr(err2) @@ -217,6 +269,10 @@ func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult return err } +func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) { + return onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagModifiedMask) +} + func OnDeleteThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) { if thingType == model.ThingTypeSkuName { return nil @@ -489,7 +545,7 @@ func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo if multiStoreHandler == nil { return "", fmt.Errorf("vendorID:%d不是多门店平台", vendorID) } - task := tasksch.NewParallelTask("FullSyncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, + task := tasksch.NewParallelTask("FullSyncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false), ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { step := batchItemList[0].(int) switch step { diff --git a/business/partner/purchase/jd/sku2.go b/business/partner/purchase/jd/sku2.go index c3d58ada5..5529bb772 100644 --- a/business/partner/purchase/jd/sku2.go +++ b/business/partner/purchase/jd/sku2.go @@ -71,8 +71,12 @@ func (p *PurchaseHandler) GetAllCategories(ctx *jxcontext.Context, vendorOrgCode func (p *PurchaseHandler) CreateCategory2(ctx *jxcontext.Context, cat *dao.SkuStoreCatInfo) (err error) { globals.SugarLogger.Debugf("CreateCategory2 cat:%s", utils.Format4Output(cat, true)) + parentID := int64(0) + if cat.Level != 1 { + parentID = utils.Str2Int64(cat.ParentVendorCatID) + } if globals.EnableJdStoreWrite { - result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(utils.Str2Int64(cat.ParentVendorCatID), cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) + result, err2 := getAPI(cat.VendorOrgCode).AddShopCategory(parentID, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) if err = err2; err == nil { if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { cat.VendorCatID = utils.Int64ToStr(jdID)