diff --git a/business/jxstore/promotion/jd_promotion.go b/business/jxstore/promotion/jd_promotion.go index 060f1db66..a36a43278 100644 --- a/business/jxstore/promotion/jd_promotion.go +++ b/business/jxstore/promotion/jd_promotion.go @@ -48,7 +48,9 @@ const ( ) const ( - defSearchDays = 7 + defSearchDays = 7 + stockRefreshGap = 1 * time.Minute + userName = "jdpromotion" ) type SkuPrice struct { @@ -171,18 +173,27 @@ func init() { func scheduleDailyRoutine() { executeTime := utils.GetCurDate().Add(24*time.Hour + 5*time.Minute) // 凌晨00:05执行 duration := executeTime.Sub(time.Now()) + if duration > 1*time.Hour { + UpdateJdPromotionStatus() + } // globals.SugarLogger.Debug(duration) time.AfterFunc(duration, func() { UpdateJdPromotionStatus() - RefreshJdLockStoreSku() scheduleDailyRoutine() }) } +func scheduleRoutine() { + time.AfterFunc(stockRefreshGap, func() { + RefreshJdLockStoreSku() + RefreshJdStoreSkuStock() + scheduleRoutine() + }) +} + func Init() { - UpdateJdPromotionStatus() - RefreshJdLockStoreSku() scheduleDailyRoutine() + scheduleRoutine() } func CreateJdPromotion(ctx *jxcontext.Context, isIDJd bool, isAsync bool, params *PromotionParams, userName string) (hint string, err error) { @@ -602,7 +613,7 @@ func CancelJdPromotion(ctx *jxcontext.Context, promotionID int) (err error) { return err } -// 每晚凌晨运行一次 +// 每一段时间运行一次 func RefreshJdLockStoreSku() (err error) { sql := ` SELECT t1.end_at, t22.vendor_store_id, t32.jd_id, t3.* @@ -611,7 +622,7 @@ func RefreshJdLockStoreSku() (err error) { JOIN store_map t22 ON t2.store_id = t22.store_id AND t22.vendor_id = ? AND t22.deleted_at = ? JOIN promotion_sku t3 ON t1.id = t3.promotion_id JOIN sku t32 ON t3.sku_id = t32.id - WHERE t1.deleted_at = ? AND t1.vendor_id = ? AND t1.status = ? AND (t1.beginAt <= ? AND t1.endAt >= ?) + WHERE t1.deleted_at = ? AND t1.vendor_id = ? AND t1.status = ? AND (t1.begin_at <= ? AND t1.end_at >= ?) ` nowDate := utils.GetCurDate() sqlParams := []interface{}{ @@ -626,11 +637,76 @@ func RefreshJdLockStoreSku() (err error) { var promotionItemList []*tPromotionItemInfo db := dao.GetDB() if err = dao.GetRows(db, &promotionItemList, sql, sqlParams...); err != nil { + if !dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("RefreshJdLockStoreSku GetRows failed with error:%v", err) + } return err } return RefreshJdPromotionItemListLockStatus(promotionItemList) } +func RefreshJdStoreSkuStock() (err error) { + sql := ` + SELECT t4.store_id, t4.sku_id + FROM promotion t1 + JOIN promotion_store t2 ON t1.id = t2.promotion_id + JOIN store_map t22 ON t2.store_id = t22.store_id AND t22.vendor_id = ? AND t22.deleted_at = ? + JOIN promotion_sku t3 ON t1.id = t3.promotion_id AND t3.is_lock = 1 + JOIN store_sku_bind t4 ON t2.store_id = t4.store_id AND t3.sku_id = t4.sku_id AND t4.deleted_at = ? + WHERE t3.is_lock = 1 AND t1.deleted_at = ? AND t1.vendor_id = ? AND t1.status = ? AND (t1.beginAt <= ? AND t1.endAt >= ?) + GROUP BY 1,2 + ORDER BY 1,2 + ` + nowDate := utils.GetCurDate() + sqlParams := []interface{}{ + model.VendorIDJD, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + model.VendorIDJD, + model.PromotionStatusRemoteCreated, + nowDate, + nowDate, + } + var promotionItemList []*tPromotionItemInfo + db := dao.GetDB() + if err = dao.GetRows(db, &promotionItemList, sql, sqlParams...); err != nil { + if !dao.IsNoRowsError(err) { + globals.SugarLogger.Warnf("RefreshJdStoreSkuStock GetRows failed with error:%v", err) + } + return err + } + if len(promotionItemList) > 0 { + task := tasksch.NewParallelTask("RefreshJdStoreSkuStock", tasksch.NewParallelConfig().SetBatchSize(jdapi.MaxStoreSkuBatchSize).SetIsContinueWhenError(true), "schedule", func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + stockList := make([]*jdapi.SkuStock, 0) + stationNo := batchItemList[0].(*tPromotionItemInfo).JdStoreID + for _, v := range batchItemList { + promotionItem := v.(*tPromotionItemInfo) + if promotionItem.JdStoreID != stationNo { + _, err = api.JdAPI.BatchUpdateCurrentQtys("", stationNo, stockList, userName) + if err != nil { + globals.SugarLogger.Warnf("RefreshJdStoreSkuStock BatchUpdateCurrentQtys failed with error:%v", err) + } + stockList = make([]*jdapi.SkuStock, 0) + stationNo = promotionItem.JdStoreID + } + stockList = append(stockList, &jdapi.SkuStock{ + OutSkuId: utils.Int2Str(promotionItem.SkuID), + StockQty: model.MaxStoreSkuStockQty, + }) + } + _, err = api.JdAPI.BatchUpdateCurrentQtys("", stationNo, stockList, userName) + if err != nil { + globals.SugarLogger.Warnf("RefreshJdStoreSkuStock BatchUpdateCurrentQtys failed with error:%v", err) + } + return nil, err + }, promotionItemList) + task.Run() + _, err = task.GetResult(0) + } + return err +} + // 每晚凌晨运行一次 func UpdateJdPromotionStatus() (num int64, err error) { sql := ` @@ -710,7 +786,7 @@ func OnStoreStockMsg(msg *jdapi.CallbackStoreStockMsg) (retVal *jdapi.CallbackRe } _, err = api.JdAPI.BatchUpdateVendibility("", msg.StationNo, []*jdapi.StockVendibility{ vendibility, - }, "prevent") + }, userName) } if !msg.Have { stock := &jdapi.SkuStock{ @@ -719,7 +795,7 @@ func OnStoreStockMsg(msg *jdapi.CallbackStoreStockMsg) (retVal *jdapi.CallbackRe } _, err = api.JdAPI.BatchUpdateCurrentQtys("", msg.StationNo, []*jdapi.SkuStock{ stock, - }, "prevent") + }, userName) } } }