From 786239a897ce084c3a9a26c0d88ecf4319fe4bfc Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 13 Mar 2019 10:54:47 +0800 Subject: [PATCH] - optimize SyncStoreSkus, isContinueWhenError will really continue --- business/partner/purchase/jd/store_sku.go | 39 +++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/business/partner/purchase/jd/store_sku.go b/business/partner/purchase/jd/store_sku.go index 860889abd..108f224e5 100644 --- a/business/partner/purchase/jd/store_sku.go +++ b/business/partner/purchase/jd/store_sku.go @@ -1,6 +1,8 @@ package jd import ( + "fmt" + "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -52,7 +54,7 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks if err = dao.GetRows(db, &storeSkus, sql, append(sqlParams, sqlWhereParams...)...); err != nil { return "", err } - task := tasksch.NewParallelTask("SyncStoresSkus京东", tasksch.NewParallelConfig().SetBatchSize(jdapi.MaxStoreSkuBatchSize).SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { + task := tasksch.NewParallelTask("SyncStoresSkus京东", tasksch.NewParallelConfig().SetBatchSize(jdapi.MaxStoreSkuBatchSize).SetIsContinueWhenError(isContinueWhenError), ctx.GetUserName(), func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { var skuPriceInfoList []*jdapi.SkuPriceInfo var skuVendibilityList []*jdapi.StockVendibility var skuStockList []*jdapi.SkuStock @@ -103,26 +105,45 @@ func (p *PurchaseHandler) SyncStoreSkus(ctx *jxcontext.Context, parentTask tasks } } } + syncMask := 0 + errList := []error{} if globals.EnableStoreWrite { // todo 以下可以优化为并行操作 globals.SugarLogger.Debug(utils.Format4Output(skuVendibilityList, false), utils.Format4Output(skuPriceInfoList, false), utils.Format4Output(skuStockList, false)) if len(skuVendibilityList) > 0 { - _, err = api.JdAPI.BatchUpdateVendibility("", stationNo, skuVendibilityList, ctx.GetUserName()) + if _, err = api.JdAPI.BatchUpdateVendibility("", stationNo, skuVendibilityList, ctx.GetUserName()); err == nil { + syncMask |= model.SyncFlagSaleMask + } else { + errList = append(errList, err) + } } - if err == nil && len(skuStockList) > 0 { - _, err = api.JdAPI.BatchUpdateCurrentQtys("", stationNo, skuStockList, ctx.GetUserName()) + if (err == nil || isContinueWhenError) && len(skuStockList) > 0 { + if _, err = api.JdAPI.BatchUpdateCurrentQtys("", stationNo, skuStockList, ctx.GetUserName()); err == nil { + syncMask |= model.SyncFlagNewMask | model.SyncFlagDeletedMask + } else { + errList = append(errList, err) + } } - if err == nil && len(skuPriceInfoList) > 0 { - _, err = api.JdAPI.UpdateVendorStationPrice("", stationNo, skuPriceInfoList) + if (err == nil || isContinueWhenError) && len(skuPriceInfoList) > 0 { + if _, err = api.JdAPI.UpdateVendorStationPrice("", stationNo, skuPriceInfoList); err == nil { + syncMask |= model.SyncFlagPriceMask + } else { + errList = append(errList, err) + } } } - if err == nil && len(batchSkuIDs) > 0 { + if len(errList) == 0 { + syncMask = -1 + } else if len(errList) > 1 { + err = fmt.Errorf("%v", errList) + } + if syncMask != 0 && len(batchSkuIDs) > 0 { db := dao.GetDB() // 多线程问题 sql := ` UPDATE store_sku_bind t1 - SET t1.jd_sync_status = 0 + SET t1.jd_sync_status = t1.jd_sync_status & ? ` + sqlWhere0 + " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(batchSkuIDs)) + ")" - _, err = dao.ExecuteSQL(db, sql, storeID, batchSkuIDs) + _, err = dao.ExecuteSQL(db, sql, ^syncMask, storeID, batchSkuIDs) } return nil, err }, storeSkus)