Files
cattleTransportation/tradeCattle/XQ_CLIENT_LOG_SYNC_FIX_SUMMARY.md
2025-10-24 17:32:42 +08:00

4.2 KiB
Raw Blame History

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. 根本原因

  1. 字段映射不匹配xq_client_log表的实际字段结构与实体类不匹配
  2. 数据类型转换问题latitude/longitude字段长度超限导致数据截断
  3. 数据同步未执行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: 24075000139
  • battery: 3.300 (来自iot_device_data.voltage)
  • temperature: 25.80 (来自iot_device_data.temperature)
  • steps: 21
  • latitude: 30.4812778 (截断到50字符)
  • longitude: 114.401791 (截断到50字符)
  • time: 当前时间戳

故障排除

如果同步仍然失败,请检查:

  1. 应用日志: 查看控制台输出,确认同步过程中的错误信息
  2. 数据库连接: 确认应用能够正常连接数据库
  3. 字段权限: 确认数据库用户有INSERT权限
  4. 数据格式: 确认数据类型转换正确

下一步行动

  1. 执行数据库修复脚本
  2. 🔄 等待应用完全启动
  3. 📋 手动触发数据同步
  4. 📋 验证同步结果
  5. 📋 测试日志查询和轨迹功能

技术要点

  • 字段映射: 使用@TableField注解确保正确的数据库字段映射
  • 数据类型: 注意BigDecimal到String的转换和长度限制
  • 批量插入: 使用MyBatis的foreach进行高效的批量数据插入
  • 错误处理: 添加详细的日志记录便于问题诊断