| | |
| | | |
| | | 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; |
| | |
| | | private ISysConfigService configService; |
| | | |
| | | /** |
| | | * 服务启动时执行补偿计算 |
| | | * 检查最近7天内未被处理的GPS坐标并进行补偿计算 |
| | | * 执行GPS分段里程补偿计算 |
| | | * 检查最近N天内未被处理的GPS坐标并进行补偿计算 |
| | | * 建议配置为每天执行一次,例如凌晨2点 |
| | | */ |
| | | @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天"); |
| | | } |
| | | public void executeCompensationCalculation() { |
| | | executeCompensationCalculation("7"); |
| | | } |
| | | |
| | | /** |
| | | * 执行GPS分段里程补偿计算(带参数) |
| | | * |
| | | * @param params 参数字符串,格式:回溯天数(如:7表示回溯7天) |
| | | */ |
| | | public void executeCompensationCalculation(String params) { |
| | | try { |
| | | // 解析参数:回溯天数 |
| | | int lookbackDays = 7; // 默认7天 |
| | | if (params != null && !params.trim().isEmpty()) { |
| | | try { |
| | | lookbackDays = Integer.parseInt(params.trim()); |
| | | } catch (NumberFormatException e) { |
| | | logger.warn("参数格式错误,使用默认值7天: {}", params); |
| | | } |
| | | |
| | | // 执行补偿计算 |
| | | 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(); |
| | | |
| | | // logger.info("========== 开始执行GPS分段里程补偿计算 - 回溯{}天 ==========", lookbackDays); |
| | | |
| | | // 执行补偿计算 |
| | | int successCount = segmentMileageService.compensateCalculation(lookbackDays); |
| | | |
| | | // logger.info("========== GPS分段里程补偿计算完成 - 成功处理 {} 辆车 ==========", successCount); |
| | | |
| | | } catch (Exception e) { |
| | | logger.error("GPS分段里程补偿计算失败", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | // 注意:此方法只计算最近时间段的数据,历史遗漏数据由补偿机制处理 |
| | | |
| | | logger.info("开始计算GPS分段里程 - 时间范围: {} 到 {}, 时间段间隔: {}分钟", |
| | | startTime, endTime, segmentMinutes); |
| | | // logger.info("开始计算GPS分段里程 - 时间范围: {} 到 {}, 时间段间隔: {}分钟", |
| | | // startTime, endTime, segmentMinutes); |
| | | |
| | | // 批量计算 |
| | | int successCount = segmentMileageService.batchCalculateSegmentMileage(startTime, endTime); |
| | | |
| | | logger.info("GPS分段里程计算完成 - 成功处理 {} 辆车", successCount); |
| | | // logger.info("GPS分段里程计算完成 - 成功处理 {} 辆车", successCount); |
| | | |
| | | } catch (Exception e) { |
| | | logger.error("GPS分段里程计算任务执行失败", e); |