编辑 | blame | 历史 | 原始文档

任务管理GPS坐标功能说明

功能概述

为通用任务管理系统增加了GPS坐标记录和距离计算功能,用于记录车辆的路程信息。

新增字段

数据库表字段

sys_task 表中新增以下字段:

字段名 类型 说明
departure_longitude DECIMAL(10,7) 出发地经度
departure_latitude DECIMAL(10,7) 出发地纬度
destination_longitude DECIMAL(10,7) 目的地经度
destination_latitude DECIMAL(10,7) 目的地纬度
estimated_distance DECIMAL(8,2) 预计公里数

技术实现

1. 数据库层

  • 表结构更新sql/task_tables.sql - 新表创建脚本
  • 现有表更新sql/add_gps_coordinates.sql - 现有表字段添加脚本

2. 实体层

  • SysTask实体类:添加GPS坐标相关字段和getter/setter方法
  • TaskCreateVO:任务创建对象,支持GPS坐标输入
  • TaskUpdateVO:任务更新对象,支持GPS坐标修改

3. 数据访问层

  • SysTaskMapper.xml:更新MyBatis映射文件,支持GPS坐标字段的增删改查

4. 业务逻辑层

  • SysTaskServiceImpl:在创建和更新任务时自动计算预计公里数
  • GpsDistanceUtils:GPS坐标距离计算工具类

5. 工具类

  • GpsDistanceUtils:提供以下功能
  • 使用Haversine公式计算两点间球面距离
  • GPS坐标有效性验证
  • 坐标格式化显示
  • 度分秒格式转换

距离计算算法

Haversine公式

使用Haversine公式计算地球表面两点间的球面距离:

a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2( √a, √(1−a) )
d = R ⋅ c

其中:
- φ1, φ2:两点的纬度
- Δφ:纬度差
- Δλ:经度差
- R:地球半径(6371公里)

精度说明

  • 经度纬度:保留7位小数,精度约1.1厘米
  • 距离:保留2位小数,精度到米
  • 适用于中短距离计算(< 1000公里)

功能特性

1. 自动距离计算

  • 创建任务时:如果提供了完整的GPS坐标,自动计算预计公里数
  • 更新任务时:如果修改了GPS坐标,重新计算预计公里数
  • 坐标验证:自动验证GPS坐标的有效性

2. 数据验证

  • 纬度范围:-90° 到 90°
  • 经度范围:-180° 到 180°
  • 无效坐标:距离设置为0

3. 容错处理

  • 坐标不完整:距离设置为0
  • 坐标无效:距离设置为0
  • 计算异常:距离设置为0

使用示例

创建任务时设置GPS坐标

{
  "taskType": "MAINTENANCE",
  "taskDescription": "车辆维修任务",
  "departureAddress": "北京市朝阳区",
  "destinationAddress": "北京市海淀区",
  "departureLongitude": 116.397128,
  "departureLatitude": 39.916527,
  "destinationLongitude": 116.298056,
  "destinationLatitude": 39.959444,
  "plannedStartTime": "2024-01-15 09:00:00",
  "plannedEndTime": "2024-01-15 17:00:00"
}

系统自动计算

系统会自动计算两点间距离并设置到 estimatedDistance 字段。

执行步骤

新部署

  1. 使用 sql/task_tables.sql 创建新表

现有系统升级

  1. 执行 sql/add_gps_coordinates.sql 添加字段
  2. 重新部署应用程序

验证方法

数据库验证

-- 查看表结构
SHOW CREATE TABLE sys_task;

-- 查看新增字段
DESCRIBE sys_task;

-- 测试数据插入
INSERT INTO sys_task (
    task_code, task_type, task_status, creator_id, dept_id, create_by,
    departure_longitude, departure_latitude, destination_longitude, destination_latitude
) VALUES (
    'TEST001', 'MAINTENANCE', 'PENDING', 1, 1, 'admin',
    116.397128, 39.916527, 116.298056, 39.959444
);

功能验证

  1. 创建任务时输入GPS坐标,检查是否自动计算距离
  2. 更新任务的GPS坐标,检查是否重新计算距离
  3. 输入无效坐标,检查距离是否为0
  4. 不输入坐标,检查距离是否为0

相关文件清单

数据库文件

  • sql/task_tables.sql - 新表创建脚本
  • sql/add_gps_coordinates.sql - 现有表更新脚本

Java文件

  • ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTask.java - 实体类
  • ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskCreateVO.java - 创建VO
  • ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TaskUpdateVO.java - 更新VO
  • ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java - 服务实现
  • ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml - MyBatis映射
  • ruoyi-common/src/main/java/com/ruoyi/common/utils/GpsDistanceUtils.java - 工具类

注意事项

  1. 坐标系统:使用WGS84坐标系(GPS标准坐标系)
  2. 精度要求:经度纬度建议保留6-7位小数
  3. 距离范围:适用于中短距离计算,长距离可能有误差
  4. 性能考虑:大量数据时可考虑添加空间索引
  5. 数据完整性:建议同时提供地址和坐标信息

扩展功能建议

  1. 地图集成:集成地图API进行坐标选择
  2. 路径规划:集成路径规划API计算实际行驶距离
  3. 历史轨迹:记录车辆实际行驶轨迹
  4. 距离统计:按时间段统计总行驶距离
  5. 地理围栏:设置任务执行的地理范围