4.2 KiB
4.2 KiB
xq_client_log数据同步问题修复总结
问题描述
用户反馈:项圈编号为24075000139在iot_device_data表中有温度和电压数据,但是在xq_client_log表中没有数据,没有正确更新到。
问题分析
1. 数据现状
- iot_device_data表:设备24075000139有完整数据
- voltage: 3.300
- temperature: 25.80
- device_type: 4 (项圈)
- delivery_id: 86
- xq_client_log表:对应字段为空
- device_voltage: (Null)
- device_temp: (Null)
- server_device_id: (Null)
2. 根本原因
- 字段映射不匹配:xq_client_log表的实际字段结构与实体类不匹配
- 数据类型转换问题:latitude/longitude字段长度超限导致数据截断
- 数据同步未执行:60分钟定时任务可能未执行或失败
已实施的修复方案
1. 字段映射修复 ✅
文件: XqClientLogMapper.xml
- 建立了实际表字段与实体类属性的正确映射
- 适配了xq_client_log表的实际结构
| 实际表字段 | 实体类属性 | 说明 |
|---|---|---|
battery |
deviceVoltage |
电池电量→设备电压 |
temperature |
deviceTemp |
温度 |
deviceld |
serverDeviceId |
设备长ID→主机设备ID |
steps |
walkSteps |
步数 |
time |
createTime/updateTime |
时间字段 |
2. 数据类型转换优化 ✅
文件: IotDeviceLogSyncService.java
- 添加了字符串长度限制逻辑
- 确保latitude/longitude字段不超过50字符
- 优化了数据类型转换过程
if (device.getLatitude() != null) {
String latStr = device.getLatitude().toString();
if (latStr.length() > 50) {
latStr = latStr.substring(0, 50);
}
log.setLatitude(latStr);
}
3. 数据库字段长度修复 ✅
文件: comprehensive_fix_xq_client_log_fields.sql
- 扩展了所有可能超长的字段长度
- latitude/longitude: VARCHAR(100)
- device_voltage/device_temp: VARCHAR(100)
- 其他字段也相应扩展
4. 测试和验证脚本 ✅
文件:
check_data_length_analysis.sql- 数据分析脚本clear_and_test_xq_client_log.sql- 清空测试脚本
当前状态
✅ 已完成
- 字段映射修复
- 数据类型转换优化
- 数据库字段长度修复脚本
- 代码重新编译和打包
🔄 进行中
- 应用重新启动
- 等待手动触发数据同步测试
📋 待验证
- 数据同步功能是否正常工作
- xq_client_log表是否正确接收数据
- 日志查询和轨迹功能是否正常
测试步骤
1. 执行数据库修复脚本
-- 执行 comprehensive_fix_xq_client_log_fields.sql
-- 扩展所有字段长度
2. 手动触发数据同步
# 等待应用完全启动后
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
3. 验证同步结果
-- 检查同步后的数据
SELECT * FROM xq_client_log WHERE device_id = '24075000139' ORDER BY time DESC LIMIT 5;
4. 检查同步统计
# 获取同步统计信息
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/getLogSyncStatistics" -Method GET
预期结果
同步成功后,xq_client_log表应该包含:
device_id: 24075000139battery: 3.300 (来自iot_device_data.voltage)temperature: 25.80 (来自iot_device_data.temperature)steps: 21latitude: 30.4812778 (截断到50字符)longitude: 114.401791 (截断到50字符)time: 当前时间戳
故障排除
如果同步仍然失败,请检查:
- 应用日志: 查看控制台输出,确认同步过程中的错误信息
- 数据库连接: 确认应用能够正常连接数据库
- 字段权限: 确认数据库用户有INSERT权限
- 数据格式: 确认数据类型转换正确
下一步行动
- ✅ 执行数据库修复脚本
- 🔄 等待应用完全启动
- 📋 手动触发数据同步
- 📋 验证同步结果
- 📋 测试日志查询和轨迹功能
技术要点
- 字段映射: 使用@TableField注解确保正确的数据库字段映射
- 数据类型: 注意BigDecimal到String的转换和长度限制
- 批量插入: 使用MyBatis的foreach进行高效的批量数据插入
- 错误处理: 添加详细的日志记录便于问题诊断