# 任务GPS里程统计功能集成指南
## 功能概述
该功能实现了任务与GPS里程的自动关联,可以在任务详情页面直接展示该任务执行期间的GPS行驶里程统计。
## 核心特性
- ✅ 自动关联:GPS里程计算时自动关联正在执行的任务
- ✅ 实时查询:支持按任务ID快速查询关联的GPS里程数据
- ✅ 分段展示:显示任务期间每5分钟的GPS里程分段明细
- ✅ 统计汇总:自动计算任务总里程、分段数、GPS点数
- ✅ 可视化组件:提供开箱即用的Vue组件
## 快速开始
### 1. 执行数据库迁移
```bash
mysql -u root -p < sql/updates/add_task_id_to_segment_mileage.sql
```
### 2. 在任务详情页面集成组件
```vue
```
### 3. API调用示例
```javascript
import { getTaskTotalMileage, getSegmentsByTaskId } from '@/api/system/gpsSegment'
// 查询任务总里程
getTaskTotalMileage(taskId).then(res => {
console.log('任务总里程:', res.data, 'km')
})
// 查询任务GPS分段明细
getSegmentsByTaskId(taskId).then(res => {
console.log('分段明细:', res.data)
})
```
## 组件属性
### TaskMileageDetail
| 属性 | 类型 | 必填 | 说明 |
|-----|------|------|------|
| taskId | Number/String | 是 | 任务ID |
## API接口说明
### 1. 按任务ID查询GPS分段里程
**接口地址**: `GET /system/gpsSegment/task/{taskId}`
**权限**: `system:gpsSegment:query`
**返回示例**:
```json
{
"code": 200,
"data": [
{
"segmentId": 1,
"vehicleId": 10,
"vehicleNo": "粤A12345",
"taskId": 100,
"taskCode": "T20250115001",
"segmentStartTime": "2025-01-15 10:00:00",
"segmentEndTime": "2025-01-15 10:05:00",
"segmentDistance": 2.5,
"gpsPointCount": 5,
"startLongitude": 113.264385,
"startLatitude": 23.129112,
"endLongitude": 113.280637,
"endLatitude": 23.125178
}
]
}
```
### 2. 查询任务总里程
**接口地址**: `GET /system/gpsSegment/task/{taskId}/total`
**权限**: `system:gpsSegment:query`
**返回示例**:
```json
{
"code": 200,
"data": 15.8
}
```
### 3. 按日期范围查询GPS分段里程
**接口地址**: `GET /system/gpsSegment/range`
**参数**:
- `vehicleId`: 车辆ID
- `startDate`: 开始日期 (格式: yyyy-MM-dd)
- `endDate`: 结束日期 (格式: yyyy-MM-dd)
## 数据流程
```mermaid
graph LR
A[定时任务触发] --> B[计算GPS里程]
B --> C[查询车辆正在执行的任务]
C --> D{时间段是否重叠?}
D -->|是| E[关联task_id和task_code]
D -->|否| F[task_id为NULL]
E --> G[保存分段里程记录]
F --> G
G --> H[前端查询展示]
```
## 统计逻辑
1. **时间重叠判断**:
- GPS分段时间段:`[segmentStartTime, segmentEndTime]`
- 任务执行时间段:`[actualStartTime, actualEndTime]`
- 重叠条件:`segmentStartTime < taskEndTime && segmentEndTime > taskStartTime`
2. **优先级**:
- 优先使用任务的实际开始/结束时间
- 如果实际时间为空,则使用计划时间
3. **跨段里程**:
- 自动计算相邻5分钟段之间的间隙距离
- 避免里程统计遗漏
## 注意事项
1. **权限配置**:确保用户拥有 `system:gpsSegment:query` 权限
2. **数据准确性**:GPS里程计算后才会有关联数据
3. **实时性**:数据由定时任务更新,非实时数据
4. **历史数据**:已计算的历史GPS数据不会自动关联任务,需重新计算
## 扩展建议
1. **任务列表展示**:在任务列表中直接显示任务里程
2. **报表统计**:基于task_id进行任务里程分析
3. **异常检测**:对比预估里程与实际GPS里程,发现异常
4. **成本核算**:基于任务里程进行费用计算
## 性能优化
- ✅ 使用索引:`idx_task_id`, `idx_vehicle_task`
- ✅ 聚合查询:直接SUM计算总里程
- ✅ 分页加载:分段明细支持分页
- ✅ 缓存策略:可对任务总里程进行Redis缓存
## 技术栈
- **后端**: Spring Boot + MyBatis
- **前端**: Vue 2 + Element UI
- **数据库**: MySQL 5.7+