本功能实现了车辆GPS行驶里程的自动统计,包括:
1. 总里程统计:基于GPS点计算车辆每日总行驶里程
2. 任务时段里程:计算车辆在执行任务期间的行驶里程
3. 非任务时段里程:计算车辆非执行任务期间的行驶里程
4. 任务里程占比:计算任务里程占总里程的比例
使用 Haversine公式 计算相邻GPS点之间的实际距离(考虑地球曲率)
根据GPS记录的时间区间与任务时间区间的**重叠比例**,将每段距离分摊到任务里程和非任务里程:
时间重叠比例 = 重叠时长 / 总时长
任务里程 = 段距离 × 时间重叠比例
非任务里程 = 段距离 × (1 - 时间重叠比例)
按顺序执行以下SQL文件:
# 1. 创建统计表
sql/vehicle_mileage_stats.sql
# 2. 添加定时任务
sql/vehicle_mileage_stats_job.sql
# 3. 添加菜单权限
sql/vehicle_mileage_stats_menu.sql
以下代码文件已创建:
实体类:
- VehicleMileageStats.java - 里程统计实体
- TaskTimeInterval.java - 任务时间区间
数据访问层:
- VehicleMileageStatsMapper.java - 里程统计Mapper接口
- VehicleMileageStatsMapper.xml - MyBatis映射文件
- VehicleGpsMapper.java - 扩展GPS查询方法
业务层:
- IVehicleMileageStatsService.java - Service接口
- VehicleMileageStatsServiceImpl.java - Service实现(核心算法)
控制层:
- VehicleMileageStatsController.java - REST API接口
定时任务:
- VehicleMileageStatsTask.java - 定时统计任务
系统会自动添加定时任务,默认配置:
- 执行时间:每天凌晨 1:30
- 统计范围:前一天的所有车辆GPS数据
- Cron表达式:0 30 1 * * ?
在系统管理 -> 定时任务中可以查看和管理该任务。
定时任务每天凌晨自动执行,无需人工干预。
调用接口: POST /system/mileageStats/calculate 参数: - vehicleId: 车辆ID - statDate: 统计日期(格式:yyyy-MM-dd)
调用接口: POST /system/mileageStats/batchCalculate 参数: - statDate: 统计日期(格式:yyyy-MM-dd)
在定时任务管理中,执行: vehicleMileageStatsTask.calculateMileageByDate('2025-11-09')
GET /system/mileageStats/list
参数(可选):
- vehicleId: 车辆ID
- vehicleNo: 车牌号
- statDate: 统计日期
- beginStatDate: 开始日期
- endStatDate: 结束日期
POST /system/mileageStats/export
参数:同查询接口
| 字段 | 类型 | 说明 |
|---|---|---|
| stats_id | bigint | 统计ID(主键) |
| vehicle_id | bigint | 车辆ID |
| vehicle_no | varchar(20) | 车牌号 |
| stat_date | date | 统计日期 |
| total_mileage | decimal(10,2) | 总里程(公里) |
| task_mileage | decimal(10,2) | 任务时段里程(公里) |
| non_task_mileage | decimal(10,2) | 非任务时段里程(公里) |
| task_ratio | decimal(5,4) | 任务里程占比(0-1) |
| gps_point_count | int | GPS点数量 |
| task_count | int | 任务数量 |
用于调试和追溯,记录每段GPS轨迹的里程分摊明细。
任务时段 = 从任务创建时间(create_time)到任务完成时间(actual_end_time)
确保任务表中这两个字段准确记录。
如需补算历史数据,可以通过定时任务或API接口批量执行:
// 补算最近7天的数据示例
for (int i = 1; i <= 7; i++) {
String date = "2025-11-" + String.format("%02d", i);
vehicleMileageStatsTask.calculateMileageByDate(date);
}
虽然核心算法使用Haversine公式计算距离,但系统已集成天地图接口,可用于:
如需使用天地图API进行路径距离计算,可参考 VehicleGpsController 中的天地图接口。
如有问题,请检查:
1. 数据库表是否正确创建
2. 定时任务是否正常启动
3. GPS数据是否正常采集
4. 任务表的时间字段是否准确
日志位置:
- Service层日志:搜索 VehicleMileageStatsServiceImpl
- 定时任务日志:搜索 VehicleMileageStatsTask