package com.ruoyi.quartz.task; import java.text.ParseException; import java.text.SimpleDateFormat; 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.IVehicleMileageStatsService; /** * 车辆里程统计定时任务 */ @Component("vehicleMileageStatsTask") public class VehicleMileageStatsTask { private static final Logger logger = LoggerFactory.getLogger(VehicleMileageStatsTask.class); @Autowired private IVehicleMileageStatsService vehicleMileageStatsService; /** * 计算昨日所有车辆的里程统计 */ public void calculateYesterdayMileage() { logger.info("开始执行车辆里程统计定时任务 - 统计昨日里程"); try { // 获取昨天的日期 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date yesterday = calendar.getTime(); // 批量计算里程统计 int successCount = vehicleMileageStatsService.batchCalculateMileageStats(yesterday); // logger.info("车辆里程统计定时任务执行完成 - 成功统计: {} 辆车", successCount); } catch (Exception e) { logger.error("车辆里程统计定时任务执行失败", e); throw new RuntimeException("定时任务执行失败: " + e.getMessage()); } } /** * 计算指定日期的里程统计(用于手动触发或补算历史数据) * * @param dateStr 日期字符串,格式:yyyy-MM-dd */ public void calculateMileageByDate(String dateStr) { logger.info("开始执行车辆里程统计定时任务 - 统计日期: {}", dateStr); try { if (dateStr == null || dateStr.trim().isEmpty()) { throw new IllegalArgumentException("日期不能为空"); } // 使用SimpleDateFormat解析日期字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.setLenient(false); // 严格解析日期 Date targetDate = sdf.parse(dateStr.trim()); // 批量计算里程统计 int successCount = vehicleMileageStatsService.batchCalculateMileageStats(targetDate); logger.info("车辆里程统计定时任务执行完成 - 日期: {}, 成功统计: {} 辆车", dateStr, successCount); } catch (ParseException e) { logger.error("车辆里程统计定时任务执行失败 - 日期格式错误: {}", dateStr, e); throw new RuntimeException("定时任务执行失败: 日期格式错误,应为 yyyy-MM-dd"); } catch (Exception e) { logger.error("车辆里程统计定时任务执行失败 - 日期: {}", dateStr, e); throw new RuntimeException("定时任务执行失败: " + e.getMessage()); } } /** * 从GPS分段里程汇总生成昨日统计数据 * (推荐使用此方法,基于已计算的分段里程数据汇总,性能更好) */ public void aggregateYesterdayFromSegments() { logger.info("开始执行从分段里程汇总任务 - 统计昨日数据"); try { // 获取昨天的日期 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date yesterday = calendar.getTime(); // 从分段里程汇总生成统计 int successCount = vehicleMileageStatsService.batchAggregateFromSegmentMileage(yesterday); logger.info("从分段里程汇总任务执行完成 - 成功统计: {} 辆车", successCount); } catch (Exception e) { logger.error("从分段里程汇总任务执行失败", e); throw new RuntimeException("汇总任务执行失败: " + e.getMessage()); } } /** * 从GPS分段里程汇总生成指定日期的统计数据 * * @param dateStr 日期字符串,格式:yyyy-MM-dd */ public void aggregateFromSegmentsByDate(String dateStr) { logger.info("开始执行从分段里程汇总任务 - 统计日期: {}", dateStr); try { if (dateStr == null || dateStr.trim().isEmpty()) { throw new IllegalArgumentException("日期不能为空"); } // 使用SimpleDateFormat解析日期字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.setLenient(false); // 严格解析日期 Date targetDate = sdf.parse(dateStr.trim()); // 从分段里程汇总生成统计 int successCount = vehicleMileageStatsService.batchAggregateFromSegmentMileage(targetDate); logger.info("从分段里程汇总任务执行完成 - 日期: {}, 成功统计: {} 辆车", dateStr, successCount); } catch (ParseException e) { logger.error("从分段里程汇总任务执行失败 - 日期格式错误: {}", dateStr, e); throw new RuntimeException("汇总任务执行失败: 日期格式错误,应为 yyyy-MM-dd"); } catch (Exception e) { logger.error("从分段里程汇总任务执行失败 - 日期: {}", dateStr, e); throw new RuntimeException("汇总任务执行失败: " + e.getMessage()); } } }