在手机端操作任务状态变更时(如出发、到达、返程、完成等),系统会自动获取当前用户的GPS位置信息和地理位置信息,并记录到任务操作日志中。
在 sys_task_log 表中新增了以下字段用于存储GPS和位置信息:
| 字段名 | 类型 | 说明 |
|---|---|---|
| latitude | DECIMAL(10,6) | 纬度 |
| longitude | DECIMAL(10,6) | 经度 |
| location_address | VARCHAR(500) | 位置地址(街道或POI名称) |
| location_province | VARCHAR(50) | 省份 |
| location_city | VARCHAR(50) | 城市 |
| location_district | VARCHAR(50) | 区县 |
| gps_accuracy | DECIMAL(10,2) | GPS精度(米) |
| altitude | DECIMAL(10,2) | 海拔高度(米) |
| speed | DECIMAL(10,2) | 速度(米/秒) |
| heading | DECIMAL(10,2) | 方向角度(0-360度) |
-- 执行此脚本添加GPS位置字段
source sql/add_location_fields.sql
SysTaskLog.java - 添加GPS位置信息字段及getter/setter方法
SysTaskLogMapper.xml - 更新SQL语句,支持GPS字段的查询和插入
ISysTaskService.java - 新增带GPS位置信息的状态变更方法java public int changeTaskStatusWithLocation(Long taskId, TaskStatus newStatus, String remark, SysTaskLog locationLog);
SysTaskServiceImpl.java - 实现GPS位置记录逻辑
- 保留原有的 changeTaskStatus 方法(不带GPS信息)
- 新增 changeTaskStatusWithLocation 方法(带GPS信息)
- 修改 recordTaskLog 方法支持GPS信息传递
SysTaskController.java
- ChangeStatusRequest 请求对象新增GPS位置信息字段
- changeTaskStatus 方法自动判断是否包含GPS信息,调用对应的Service方法
以下三个页面的任务状态变更功能均已集成GPS定位:
使用UniApp的 uni.getLocation API获取GPS信息:
uni.getLocation({
type: 'gcj02', // 使用国测局坐标系
geocode: true, // 解析地址信息
altitude: true, // 获取高度信息
success: function(res) {
// GPS定位成功,携带位置信息更新状态
},
fail: function(err) {
// GPS定位失败,提示用户是否继续
}
})
latitude, longitudeaddress.province, address.city, address.district, address.streetaccuracy(米)altitude(米)speed(米/秒)heading/direction(度)所有页面的 updateTaskStatus 方法统一改为调用 getLocationAndUpdateStatus 方法:
// 更新任务状态
updateTaskStatus(taskId, status, remark) {
this.getLocationAndUpdateStatus(taskId, status, remark)
},
// 获取位置信息并更新状态
getLocationAndUpdateStatus(taskId, status, remark) {
const that = this
uni.getLocation({
type: 'gcj02',
geocode: true,
altitude: true,
success: function(res) {
// 携带GPS信息更新状态
const statusData = {
taskStatus: status,
remark: remark,
latitude: res.latitude,
longitude: res.longitude,
locationAddress: res.address ? res.address.street || res.address.poiName || '' : '',
locationProvince: res.address ? res.address.province || '' : '',
locationCity: res.address ? res.address.city || '' : '',
locationDistrict: res.address ? res.address.district || '' : '',
gpsAccuracy: res.accuracy,
altitude: res.altitude,
speed: res.speed,
heading: res.direction || res.heading
}
changeTaskStatus(taskId, statusData).then(response => {
that.$modal.showToast('状态更新成功')
that.loadTaskList()
})
},
fail: function(err) {
// GPS定位失败,提示用户
that.$modal.confirm('GPS定位失败,是否继续更新状态?').then(() => {
// 不带GPS信息更新
})
}
})
}
PUT /task/{taskId}/status
Content-Type: application/json
{
"taskStatus": "DEPARTING",
"remark": "任务已出发",
"latitude": 39.908722,
"longitude": 116.397496,
"locationAddress": "东长安街",
"locationProvince": "北京市",
"locationCity": "北京市",
"locationDistrict": "东城区",
"gpsAccuracy": 15.5,
"altitude": 45.2,
"speed": 0.0,
"heading": 90.5
}
{
"code": 200,
"msg": "操作成功"
}
需要在 manifest.json 中添加定位权限:
{
"mp-weixin": {
"permission": {
"scope.userLocation": {
"desc": "您的位置信息将用于记录任务操作位置"
}
}
},
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>"
]
},
"ios": {
"idfa": false,
"privacyDescription": {
"NSLocationWhenInUseUsageDescription": "此应用需要获取您的位置信息用于记录任务操作位置"
}
}
}
}
}
此功能适用于所有需要记录操作位置的任务状态变更操作:
SELECT
log_id, task_id, operation_type, operation_desc,
operator_name, operation_time,
latitude, longitude, location_address,
location_province, location_city, location_district,
gps_accuracy, altitude, speed, heading
FROM sys_task_log
WHERE task_id = ?
ORDER BY operation_time DESC;
SELECT
task_id, operation_type, operator_name, operation_time,
latitude, longitude, location_address
FROM sys_task_log
WHERE operation_time BETWEEN ? AND ?
AND latitude IS NOT NULL
AND longitude IS NOT NULL
ORDER BY operation_time DESC;