This commit is contained in:
van
2026-04-11 00:48:37 +08:00
parent fed0158444
commit 5205d8c155
8 changed files with 111 additions and 12 deletions

View File

@@ -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();