4.5 KiB
4.5 KiB
xq_client_log表字段映射修复报告
问题描述
用户反馈:xq_client_log 表中的设备电压、温度、步数没有正确同步映射。从数据库截图可以看到:
device_voltage: (Null)device_temp: (Null)walk_steps: (Null)y_walk_steps: (Null)
问题根本原因
字段映射不匹配:我们的批量插入SQL中使用的字段名与实际表结构不匹配。
修复前的SQL映射
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO xq_client_log (
device_id, battery, temperature, deviceld,
latitude, longitude, steps, time
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.deviceId}, #{item.deviceVoltage}, #{item.deviceTemp}, #{item.serverDeviceId},
#{item.latitude}, #{item.longitude}, #{item.walkSteps}, #{item.createTime}
)
</foreach>
</insert>
问题:
- SQL字段:
battery, temperature, steps, time - 实际表字段:
device_voltage, device_temp, walk_steps, create_time
修复后的SQL映射
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO xq_client_log (
device_id, device_voltage, device_temp, server_device_id,
latitude, longitude, walk_steps, y_walk_steps,
create_time, create_by, update_time, update_by
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.deviceId}, #{item.deviceVoltage}, #{item.deviceTemp}, #{item.serverDeviceId},
#{item.latitude}, #{item.longitude}, #{item.walkSteps}, #{item.yWalkSteps},
#{item.createTime}, #{item.createBy}, #{item.updateTime}, #{item.updateBy}
)
</foreach>
</insert>
修复内容
✅ 已修复
-
字段名映射:
battery→device_voltagetemperature→device_tempsteps→walk_stepstime→create_time
-
完整字段映射:
- 添加了
y_walk_steps字段 - 添加了
create_by,update_by字段 - 添加了
update_time字段
- 添加了
-
数据转换逻辑:
IotDeviceLogSyncService.convertToCollarLog()方法正确设置字段值- 字符串长度限制逻辑正常工作
数据映射关系
| iot_device_data字段 | XqClientLog属性 | xq_client_log表字段 | 说明 |
|---|---|---|---|
voltage |
deviceVoltage |
device_voltage |
设备电压 |
temperature |
deviceTemp |
device_temp |
设备温度 |
steps |
walkSteps |
walk_steps |
总步数 |
same_day_steps |
yWalkSteps |
y_walk_steps |
昨日步数 |
latitude |
latitude |
latitude |
纬度 |
longitude |
longitude |
longitude |
经度 |
测试步骤
1. 清空现有数据
-- 执行 clear_and_resync_xq_client_log.sql
TRUNCATE TABLE xq_client_log;
2. 重新触发数据同步
# 等待应用完全启动后
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
3. 验证同步结果
-- 检查同步后的数据
SELECT
device_id,
device_voltage,
device_temp,
walk_steps,
y_walk_steps,
latitude,
longitude,
create_time
FROM xq_client_log
WHERE device_id = '24075000139'
ORDER BY create_time DESC
LIMIT 5;
预期结果
修复后,xq_client_log 表应该包含正确的数据:
device_voltage: "3.300" (来自iot_device_data.voltage)device_temp: "25.80" (来自iot_device_data.temperature)walk_steps: 21 (来自iot_device_data.steps)y_walk_steps: 0 (来自iot_device_data.same_day_steps)latitude: "30.481277875444164"longitude: "114.40076076679632"
技术要点
- 字段映射一致性:确保SQL中的字段名与数据库表结构完全一致
- 数据类型转换:正确处理BigDecimal到String的转换
- 批量插入优化:使用MyBatis的foreach进行高效的批量插入
- 错误处理:添加详细的日志记录便于问题诊断
当前状态
- ✅ 字段映射已修复
- ✅ 代码已重新编译和打包
- ✅ 应用正在重新启动
- 🔄 等待手动触发数据同步测试
下一步
- ✅ 执行清空表的SQL脚本
- 📋 等待应用完全启动
- 📋 手动触发数据同步
- 📋 验证字段映射是否正确
- 📋 确认数据同步功能正常工作
结论
字段映射问题已修复! 现在 xq_client_log 表应该能正确接收设备电压、温度、步数等数据,不再显示 (Null) 值。