From b0ff1e6c7f509d9c5ff57c8ba41b45a780083089 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 27 Nov 2018 19:57:25 +0800 Subject: [PATCH] - mtwm SyncStoreSkus done. --- business/partner/purchase/mtwm/store_sku.go | 125 +++++++++++++------- 1 file changed, 81 insertions(+), 44 deletions(-) diff --git a/business/partner/purchase/mtwm/store_sku.go b/business/partner/purchase/mtwm/store_sku.go index 5dbed1077..36aea306e 100644 --- a/business/partner/purchase/mtwm/store_sku.go +++ b/business/partner/purchase/mtwm/store_sku.go @@ -1,6 +1,8 @@ package mtwm import ( + "errors" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -16,62 +18,69 @@ const ( defVendorCatID = 200000380 ) +// hint,如果是异步,返回的是任务ID,如果是同步,返回是本次需要同步的目录数 func (p *PurchaseHandler) SyncStoreCategory(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync bool) (hint string, err error) { userName := ctx.GetUserName() strStoreID := utils.Int2Str(storeID) + num := 0 db := dao.GetDB() rootTask := tasksch.NewSeqTask("mtwm SyncStoreCategory", userName, func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { level := step + 1 catList, err := dao.GetStoreCategories(db, model.VendorIDMTWM, storeID, level) - task := tasksch.NewParallelTask("mtwm SyncStoreCategory2", nil, userName, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDMTWM])} - catInfo := batchItemList[0].(*dao.StoreCatSyncInfo) - globals.SugarLogger.Debug(globals.EnableStoreWrite, " ", globals.EnableMtwmStoreWrite) - if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { - if catInfo.MtwmSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 - err = api.MtwmAPI.RetailCatDelete(strStoreID, catInfo.MtwmID) - } else if catInfo.MtwmSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增 - catName := catInfo.CatName - subCatName := "" - originName := "" - if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { - originName = catInfo.MtwmID - } - if level == 2 { - originName = catInfo.ParentCatName - catName = catInfo.ParentCatName - subCatName = catInfo.CatName + if len(catList) > 0 { + num += len(catList) + task := tasksch.NewParallelTask("mtwm SyncStoreCategory2", nil, userName, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[model.VendorIDMTWM])} + catInfo := batchItemList[0].(*dao.StoreCatSyncInfo) + if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { + if catInfo.MtwmSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除 + err = api.MtwmAPI.RetailCatDelete(strStoreID, catInfo.MtwmID) + } else if catInfo.MtwmSyncStatus&(model.SyncFlagNewMask|model.SyncFlagModifiedMask) != 0 { // 新增 + catName := catInfo.CatName + subCatName := "" + originName := "" if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { originName = catInfo.MtwmID - catName = catInfo.CatName - subCatName = "" + } + if level == 2 { + originName = catInfo.ParentCatName + catName = catInfo.ParentCatName + subCatName = catInfo.CatName + if catInfo.MtwmSyncStatus&model.SyncFlagNewMask == 0 { + originName = catInfo.MtwmID + catName = catInfo.CatName + subCatName = "" + } + } + if catName == "" { + panic("catName is empty") + } + if err := api.MtwmAPI.RetailCatUpdate(strStoreID, originName, catName, subCatName, catInfo.Seq); err == nil { + catInfo.MtwmID = catInfo.CatName + updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM])) } } - if catName == "" { - panic("catName is empty") - } - if err := api.MtwmAPI.RetailCatUpdate(strStoreID, originName, catName, subCatName, catInfo.Seq); err == nil { - catInfo.MtwmID = catInfo.CatName - updateFields = append(updateFields, dao.GetVendorThingIDStructField(model.VendorNames[model.VendorIDMTWM])) - } } - } - if err == nil { - db2 := dao.GetDB() - catInfo.MtwmSyncStatus = 0 - _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...) - } - return nil, err - }, catList) - rootTask.AddChild(task).Run() - _, err = task.GetResult(0) + if err == nil { + db2 := dao.GetDB() + catInfo.MtwmSyncStatus = 0 + _, err = dao.UpdateEntity(db2, &catInfo.StoreSkuCategoryMap, updateFields...) + } + return nil, err + }, catList) + rootTask.AddChild(task).Run() + _, err = task.GetResult(0) + } return nil, err }, 2) tasksch.AddChild(parentTask, rootTask).Run() if !isAsync { + hint = utils.Int2Str(num) _, err = rootTask.GetResult(0) + } else { + hint = rootTask.ID } - return rootTask.ID, err + return hint, err } func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error) { @@ -84,6 +93,7 @@ func (p *PurchaseHandler) ReadStoreCategories(storeID int) (cats []*model.SkuCat // 远程有,本地有,映射有, --> 不处理 // 远程无,本地有,映射无, --> 添加本地 // 远程无,本地有,映射有, --> 同步标记改为新增 +// hint,如果是异步,返回的是任务ID,如果是同步,返回是本次需要同步的目录数 func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao.DaoDB, storeID int, isCheckRemote, isAsync bool) (hint string, err error) { if db == nil { db = dao.GetDB() @@ -118,9 +128,10 @@ func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao localCat := catMap[level-1][parentCatName+"/"+catName] // globals.SugarLogger.Debug(parentCatName, " ", catName, " ", localCat) if localCat == nil { // 本地分类就没有这个名字,直接删除 - globals.SugarLogger.Debug(parentCatName, " ", catName, " ", localCat, strStoreID) - if err = api.MtwmAPI.RetailCatDelete(strStoreID, catName); err != nil { - return err + if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { + if err = api.MtwmAPI.RetailCatDelete(strStoreID, catName); err != nil { + return err + } } } else { // 本地分类有这个名字 if localCat.MapID == 0 { // 本地映射没有 @@ -138,6 +149,7 @@ func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao defer func() { dao.Rollback(db) }() + num := 0 for i := 0; i < 2; i++ { for _, v := range catMap[i] { if v.MapID == -1 || v.MapID == 0 { // 本地缺失 @@ -153,6 +165,7 @@ func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao EbaiSyncStatus: model.SyncFlagNewMask, ElmSyncStatus: model.SyncFlagNewMask, } + num++ dao.WrapAddIDCULDEntity(catMap, ctx.GetUserName()) if err = dao.CreateEntity(db, catMap); err != nil { return "", err @@ -162,6 +175,7 @@ func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao MtwmSyncStatus: model.SyncFlagNewMask, } catMap.ID = v.MapID + num++ if _, err = dao.UpdateEntity(db, catMap, "MtwmSyncStatus"); err != nil { return "", err } @@ -169,7 +183,7 @@ func (p *PurchaseHandler) SyncLocalStoreCategory(ctx *jxcontext.Context, db *dao } } dao.Commit(db) - return "", err + return utils.Int2Str(num), err } func TranverseRemoteCatList(parentCatName string, remoteCats []*mtwmapi.RetailCategoryInfo, handler func(level int, parentCatName, catName string) error) (err error) { @@ -187,8 +201,26 @@ func (p *PurchaseHandler) ReadStoreSku(storeID, skuID int) (skuNameExt *model.Sk return nil, nil } +// hint,如果是异步,返回的是任务ID,如果是同步,返回是本次需要同步的目录数 func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { db := dao.GetDB() + for i := 0; i < 3; i++ { // 最多重试三次 + if hint, err = p.SyncLocalStoreCategory(ctx, db, storeID, false, false); err != nil { + return "", err + } + if hint != "0" { + if hint, err = p.SyncStoreCategory(ctx, parentTask, storeID, false); err != nil { + return "", err + } + } + if hint == "0" { + break + } + } + if hint != "0" { + return "", errors.New("同步门店商品所需目录失败") + } + skus, err := dao.GetStoreSkus(db, model.VendorIDMTWM, storeID, skuIDs) // globals.SugarLogger.Debug(utils.Format4Output(skus, false)) strStoreID := utils.Int2Str(storeID) @@ -227,7 +259,9 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks "stock": "*", }, } - err = api.MtwmAPI.RetailBatchInitData(strStoreID, foodDataList) + if globals.EnableStoreWrite && globals.EnableMtwmStoreWrite { + err = api.MtwmAPI.RetailBatchInitData(strStoreID, foodDataList) + } } if err == nil { storeSkuBind := &model.StoreSkuBind{} @@ -242,8 +276,11 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks rootTask.Run() if !isAsync { _, err = rootTask.GetResult(0) + hint = utils.Int2Str(len(skus)) + } else { + hint = rootTask.ID } - return rootTask.ID, err + return hint, err } func (p *PurchaseHandler) RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error) {