package com.ruoyi.quartz.task; import java.util.Calendar; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.system.service.IVehicleGpsSegmentMileageService; import com.ruoyi.system.service.ISysConfigService; /** * 车辆GPS分段里程计算定时任务 */ @Component("vehicleGpsSegmentMileageTask") public class VehicleGpsSegmentMileageTask { private static final Logger logger = LoggerFactory.getLogger(VehicleGpsSegmentMileageTask.class); @Autowired private IVehicleGpsSegmentMileageService segmentMileageService; @Autowired private ISysConfigService configService; /** * 计算最近一段时间的GPS分段里程 * 默认计算最近1小时的数据 */ public void calculateRecentSegmentMileage() { calculateRecentSegmentMileage("60"); } /** * 计算最近指定分钟数的GPS分段里程 * * @param params 参数字符串,格式:分钟数(如:60表示最近60分钟) */ public void calculateRecentSegmentMileage(String params) { try { // 解析参数:要计算的时间范围(分钟) int minutes = 60; // 默认60分钟 if (params != null && !params.trim().isEmpty()) { try { minutes = Integer.parseInt(params.trim()); } catch (NumberFormatException e) { logger.warn("参数格式错误,使用默认值60分钟: {}", params); } } // 获取配置的时间间隔 int segmentMinutes = 5; // 默认5分钟 String segmentConfig = configService.selectConfigByKey("gps.mileage.segment.minutes"); if (segmentConfig != null && !segmentConfig.isEmpty()) { try { segmentMinutes = Integer.parseInt(segmentConfig); } catch (NumberFormatException e) { logger.warn("分段时间间隔配置错误,使用默认值5分钟"); } } // 计算时间范围 Calendar cal = Calendar.getInstance(); Date endTime = cal.getTime(); cal.add(Calendar.MINUTE, -minutes); Date startTime = cal.getTime(); logger.info("开始计算GPS分段里程 - 时间范围: {} 到 {}, 时间段间隔: {}分钟", startTime, endTime, segmentMinutes); // 批量计算 int successCount = segmentMileageService.batchCalculateSegmentMileage(startTime, endTime); logger.info("GPS分段里程计算完成 - 成功处理 {} 辆车", successCount); } catch (Exception e) { logger.error("GPS分段里程计算任务执行失败", e); } } /** * 计算指定日期的GPS分段里程 * * @param params 参数字符串,格式:yyyy-MM-dd(如:2025-01-15) */ public void calculateDateSegmentMileage(String params) { try { if (params == null || params.trim().isEmpty()) { logger.error("日期参数不能为空"); return; } // 解析日期 java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(params.trim()); // 计算当天的起止时间 Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); Date startTime = cal.getTime(); cal.add(Calendar.DAY_OF_MONTH, 1); Date endTime = cal.getTime(); logger.info("开始计算指定日期GPS分段里程 - 日期: {}, 时间范围: {} 到 {}", params, startTime, endTime); // 批量计算 int successCount = segmentMileageService.batchCalculateSegmentMileage(startTime, endTime); logger.info("指定日期GPS分段里程计算完成 - 成功处理 {} 辆车", successCount); } catch (Exception e) { logger.error("指定日期GPS分段里程计算任务执行失败 - 参数: {}", params, e); } } }