wlzboy
2025-11-29 364adbc9a93a396b74e154f910c2a0a72bfb1a0f
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleGpsSegmentMileageTask.java
@@ -2,6 +2,7 @@
import java.util.Calendar;
import java.util.Date;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +23,45 @@
    
    @Autowired
    private ISysConfigService configService;
    /**
     * 服务启动时执行补偿计算
     * 检查最近7天内未被处理的GPS坐标并进行补偿计算
     */
    @PostConstruct
    public void init() {
        // 启动后延迟执行,避免影响服务启动速度
        new Thread(() -> {
            try {
                // 延迟30秒启动,确保所有服务已就绪
                Thread.sleep(30000);
                logger.info("========== 开始执行GPS分段里程补偿计算 ==========");
                // 获取配置的回溯天数,默认7天
                int lookbackDays = 7;
                String lookbackConfig = configService.selectConfigByKey("gps.mileage.compensation.days");
                if (lookbackConfig != null && !lookbackConfig.isEmpty()) {
                    try {
                        lookbackDays = Integer.parseInt(lookbackConfig);
                    } catch (NumberFormatException e) {
                        logger.warn("补偿回溯天数配置错误,使用默认值7天");
                    }
                }
                // 执行补偿计算
                int successCount = segmentMileageService.compensateCalculation(lookbackDays);
                logger.info("========== GPS分段里程补偿计算完成 - 成功处理 {} 辆车 ==========", successCount);
            } catch (InterruptedException e) {
                logger.error("补偿计算线程被中断", e);
                Thread.currentThread().interrupt();
            } catch (Exception e) {
                logger.error("GPS分段里程补偿计算失败", e);
            }
        }, "GPS-Compensation-Thread").start();
    }
    /**
     * 计算最近一段时间的GPS分段里程
@@ -59,12 +99,14 @@
                }
            }
            
            // 计算时间范围
            // 计算时间范围(向前回溯指定分钟数)
            Calendar cal = Calendar.getInstance();
            Date endTime = cal.getTime();
            cal.add(Calendar.MINUTE, -minutes);
            Date startTime = cal.getTime();
            
            // 注意:此方法只计算最近时间段的数据,历史遗漏数据由补偿机制处理
            logger.info("开始计算GPS分段里程 - 时间范围: {} 到 {}, 时间段间隔: {}分钟", 
                       startTime, endTime, segmentMinutes);