package com.ruoyi.web.controller.system; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.VehicleGpsSegmentMileage; import com.ruoyi.system.mapper.VehicleGpsSegmentMileageMapper; import com.ruoyi.system.service.IVehicleGpsSegmentMileageService; import com.ruoyi.system.service.ISysConfigService; /** * GPS分段里程Controller */ @RestController @RequestMapping("/system/gpsSegment") public class VehicleGpsSegmentMileageController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(VehicleGpsSegmentMileageController.class); @Autowired private VehicleGpsSegmentMileageMapper segmentMileageMapper; @Autowired private IVehicleGpsSegmentMileageService segmentMileageService; @Autowired private ISysConfigService configService; /** * 查询GPS分段里程列表 */ @PreAuthorize("@ss.hasPermi('system:gpsSegment:list')") @GetMapping("/list") public TableDataInfo list(VehicleGpsSegmentMileage segmentMileage) { startPage(); List list = segmentMileageMapper.selectVehicleGpsSegmentMileageList(segmentMileage); return getDataTable(list); } /** * 按任务ID查询GPS分段里程列表 */ @PreAuthorize("@ss.hasPermi('system:gpsSegment:query')") @GetMapping("/task/{taskId}") public AjaxResult getSegmentsByTask(@PathVariable("taskId") Long taskId) { try { List list = segmentMileageMapper.selectSegmentsByTaskId(taskId); return success(list); } catch (Exception e) { logger.error("查询任务GPS里程失败 - taskId: {}", taskId, e); return error("查询失败:" + e.getMessage()); } } /** * 查询任务的总里程 */ @PreAuthorize("@ss.hasPermi('system:gpsSegment:query')") @GetMapping("/task/{taskId}/total") public AjaxResult getTaskTotalMileage(@PathVariable("taskId") Long taskId) { try { BigDecimal totalMileage = segmentMileageMapper.selectTotalMileageByTaskId(taskId); return success(totalMileage); } catch (Exception e) { logger.error("查询任务总里程失败 - taskId: {}", taskId, e); return error("查询失败:" + e.getMessage()); } } /** * 查询车辆指定日期范围的GPS分段里程 */ @PreAuthorize("@ss.hasPermi('system:gpsSegment:query')") @GetMapping("/range") public AjaxResult getSegmentsByDateRange( @RequestParam("vehicleId") Long vehicleId, @RequestParam("startDate") String startDateStr, @RequestParam("endDate") String endDateStr) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startDate = sdf.parse(startDateStr + " 00:00:00"); Date endDate = sdf.parse(endDateStr + " 23:59:59"); List list = segmentMileageMapper.selectSegmentsByDateRange(vehicleId, startDate, endDate); return success(list); } catch (Exception e) { logger.error("查询GPS分段里程失败 - vehicleId: {}, dateRange: {} - {}", vehicleId, startDateStr, endDateStr, e); return error("查询失败:" + e.getMessage()); } } /** * 补偿计算:查找并计算未被处理的GPS数据 * 用于服务重启后的数据修复 */ @PreAuthorize("@ss.hasPermi('system:gpsSegment:compensate')") @Log(title = "GPS里程补偿计算", businessType = BusinessType.OTHER) @PostMapping("/compensate") public AjaxResult compensateCalculation() { try { // 从配置中获取回溯天数,默认2天 String lookbackDaysConfig = configService.selectConfigByKey("gps.mileage.compensate.lookback.days"); int lookbackDays = lookbackDaysConfig != null ? Integer.parseInt(lookbackDaysConfig) : 2; logger.info("开始执行GPS里程补偿计算 - 回溯天数: {}", lookbackDays); int successCount = segmentMileageService.compensateCalculation(lookbackDays); return success("补偿计算完成,处理 " + successCount + " 辆车"); } catch (Exception e) { logger.error("GPS里程补偿计算失败", e); return error("补偿计算失败:" + e.getMessage()); } } }