- refactor ebai SyncStoreSkus

This commit is contained in:
gazebo
2018-11-13 19:12:21 +08:00
parent 70bcf0cec2
commit b692f9adae

View File

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