1
This commit is contained in:
@@ -5,15 +5,18 @@ import com.ruoyi.jarvis.service.IJDOrderService;
|
||||
import com.ruoyi.jarvis.service.ILogisticsService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 物流信息扫描定时任务
|
||||
* 每15分钟扫描一次分销标记为F或PDD的订单(最近30天),获取物流信息并推送;结束后处理企微分享链 adhoc 队列
|
||||
* 按配置周期(默认每 20 分钟)扫描分销标记为 F/PDD 等的订单(最近 30 天),拉物流并推送;
|
||||
* 结束后处理企微分享链 adhoc 队列。
|
||||
*/
|
||||
@Component
|
||||
public class LogisticsScanTask {
|
||||
@@ -25,11 +28,18 @@ public class LogisticsScanTask {
|
||||
@Resource
|
||||
private ILogisticsService logisticsService;
|
||||
|
||||
/** 每条订单处理后的间隔(毫秒),减轻下游物流 HTTP 压力;0 表示不睡眠 */
|
||||
@Value("${jarvis.server.logistics.scan.order-delay-ms:250}")
|
||||
private long orderDelayMs;
|
||||
|
||||
/** 单轮最多处理的订单数,0 表示不限制(候选很多时可限制单轮耗时) */
|
||||
@Value("${jarvis.server.logistics.scan.max-orders-per-round:0}")
|
||||
private int maxOrdersPerRound;
|
||||
|
||||
/**
|
||||
* 定时任务:每15分钟执行一次(与 @Scheduled 中 cron 一致)
|
||||
* 只扫描最近30天的订单
|
||||
* 只扫描最近 30 天的订单(SQL 固定);周期与单轮上限见 jarvis.server.logistics.scan.*
|
||||
*/
|
||||
@Scheduled(cron = "0 */15 * * * ?")
|
||||
@Scheduled(cron = "${jarvis.server.logistics.scan.cron:0 */20 * * * ?}")
|
||||
public void scanAndFetchLogistics() {
|
||||
long t0 = System.currentTimeMillis();
|
||||
int orderCandidates = 0;
|
||||
@@ -47,8 +57,14 @@ public class LogisticsScanTask {
|
||||
if (orders == null || orders.isEmpty()) {
|
||||
logger.info("订单扫描:候选 0 条(最近30天 F/PDD 有物流链)");
|
||||
} else {
|
||||
int totalFromDb = orders.size();
|
||||
if (maxOrdersPerRound > 0 && orders.size() > maxOrdersPerRound) {
|
||||
logger.info("订单扫描:库中候选 {} 条,本轮按 max-orders-per-round={} 仅处理前 {} 条(余下轮次继续)",
|
||||
totalFromDb, maxOrdersPerRound, maxOrdersPerRound);
|
||||
orders = new ArrayList<>(orders.subList(0, maxOrdersPerRound));
|
||||
}
|
||||
orderCandidates = orders.size();
|
||||
logger.info("订单扫描:候选 {} 条(最近30天 F/PDD 有物流链)", orderCandidates);
|
||||
logger.info("订单扫描:本轮处理列表 {} 条(最近30天 F/PDD 有物流链)", orderCandidates);
|
||||
|
||||
for (JDOrder order : orders) {
|
||||
try {
|
||||
@@ -57,7 +73,7 @@ public class LogisticsScanTask {
|
||||
continue;
|
||||
}
|
||||
|
||||
logger.info("订单扫描:处理中 id={} orderId={} mark={}",
|
||||
logger.debug("订单扫描:处理中 id={} orderId={} mark={}",
|
||||
order.getId(), order.getOrderId(), order.getDistributionMark());
|
||||
|
||||
boolean success = logisticsService.fetchLogisticsAndPush(order);
|
||||
@@ -70,7 +86,9 @@ public class LogisticsScanTask {
|
||||
logger.warn("订单扫描:未成功 id={} orderId={}", order.getId(), order.getOrderId());
|
||||
}
|
||||
|
||||
Thread.sleep(500);
|
||||
if (orderDelayMs > 0) {
|
||||
Thread.sleep(orderDelayMs);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
logger.error("定时任务被中断", e);
|
||||
Thread.currentThread().interrupt();
|
||||
|
||||
Reference in New Issue
Block a user