package jd import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) const ( MaxStockQty = 100000000 MaxSkuBatchSize = 50 ) type tStoreSkuBindExt struct { model.StoreSkuBind PricePercentage int } // 京东到家,以有库存表示关注(认领) func (p *PurchaseHandler) SyncStoresSkus(db *dao.DaoDB, storeIDs []int, skuIDs []int, isAsync bool, userName string) (hint string, err error) { parallelCount := 1 if len(skuIDs) < MaxSkuBatchSize { parallelCount = 10 } task := tasksch.RunManagedTask("SyncStoresSkus", false, nil, parallelCount, 1, userName, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { storeID := batchItemList[0].(int) sqlParams := []interface{}{ utils.DefaultTimeValue, storeID, } sql := ` SELECT t1.*, t2.price_percentage FROM store_sku_bind t1 JOIN store_map t2 ON t1.store_id = t2.store_id WHERE (t1.deleted_at = ? OR t1.jd_sync_status <> 0) AND t1.store_id = ? ` if skuIDs != nil && len(skuIDs) > 0 { sql += " AND t1.sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } var storeSkus []*tStoreSkuBindExt // globals.SugarLogger.Debug(sql, sqlParams) if err = dao.GetRows(db, &storeSkus, sql, sqlParams); err == nil { outStationNo := utils.Int2Str(storeID) task := tasksch.RunTask("", false, nil, 0, MaxSkuBatchSize, userName, func(batchItemList []interface{}, params ...interface{}) (interface{}, error) { var skuPriceInfoList []*jdapi.SkuPriceInfo var skuVendibilityList []*jdapi.StockVendibility var skuStockList []*jdapi.SkuStock for _, v := range batchItemList { storeSku := v.(*tStoreSkuBindExt) if storeSku.JdSyncStatus&model.SyncFlagChangedMask != 0 { if storeSku.JdSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 { skuPriceInfoList = append(skuPriceInfoList, &jdapi.SkuPriceInfo{ OutSkuId: utils.Int2Str(storeSku.SkuID), Price: jxutils.CaculateSkuVendorPrice(storeSku.Price, storeSku.PricePercentage), }) } if storeSku.JdSyncStatus&(model.SyncFlagSaleMask|model.SyncFlagNewMask) != 0 { vendibility := &jdapi.StockVendibility{ OutSkuId: utils.Int2Str(storeSku.SkuID), DoSale: true, } if storeSku.Status != model.StoreSkuBindStatusNormal { vendibility.DoSale = false } skuVendibilityList = append(skuVendibilityList, vendibility) } if storeSku.JdSyncStatus&(model.SyncFlagDeletedMask|model.SyncFlagNewMask) != 0 { // 关注或取消关注 stock := &jdapi.SkuStock{ OutSkuId: utils.Int2Str(storeSku.SkuID), StockQty: MaxStockQty, } if storeSku.DeletedAt != utils.DefaultTimeValue { stock.StockQty = 0 } } } } if globals.EnableStoreWrite { // todo 以下可以优化为并行操作 if len(skuVendibilityList) > 0 { _, err = api.JdAPI.BatchUpdateVendibility(outStationNo, "", skuVendibilityList, userName) } if err == nil && len(skuPriceInfoList) > 0 { _, err = api.JdAPI.UpdateVendorStationPrice(outStationNo, "", skuPriceInfoList) } if err == nil && len(skuStockList) > 0 { _, err = api.JdAPI.BatchUpdateCurrentQtys(outStationNo, "", skuStockList, userName) } } return nil, err }, storeSkus) if _, err = task.GetResult(0); err == nil { sql := ` UPDATE store_sku_bind t1 SET t1.jd_sync_status = 0 WHERE (t1.deleted_at = ? OR t1.jd_sync_status <> 0) AND t1.store_id = ? ` if skuIDs != nil && len(skuIDs) > 0 { sql += " AND sku_id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")" } _, err = dao.ExecuteSQL(db, sql, sqlParams) } } return nil, err }, storeIDs) if isAsync { return task.ID, nil } _, err = task.GetResult(0) return "", err }