149 lines
4.5 KiB
Markdown
149 lines
4.5 KiB
Markdown
|
|
# xq_client_log表字段映射修复报告
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
用户反馈:`xq_client_log` 表中的设备电压、温度、步数没有正确同步映射。从数据库截图可以看到:
|
|||
|
|
- `device_voltage`: (Null)
|
|||
|
|
- `device_temp`: (Null)
|
|||
|
|
- `walk_steps`: (Null)
|
|||
|
|
- `y_walk_steps`: (Null)
|
|||
|
|
|
|||
|
|
## 问题根本原因
|
|||
|
|
|
|||
|
|
**字段映射不匹配**:我们的批量插入SQL中使用的字段名与实际表结构不匹配。
|
|||
|
|
|
|||
|
|
### 修复前的SQL映射
|
|||
|
|
```xml
|
|||
|
|
<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映射
|
|||
|
|
```xml
|
|||
|
|
<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>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 修复内容
|
|||
|
|
|
|||
|
|
### ✅ 已修复
|
|||
|
|
1. **字段名映射**:
|
|||
|
|
- `battery` → `device_voltage`
|
|||
|
|
- `temperature` → `device_temp`
|
|||
|
|
- `steps` → `walk_steps`
|
|||
|
|
- `time` → `create_time`
|
|||
|
|
|
|||
|
|
2. **完整字段映射**:
|
|||
|
|
- 添加了 `y_walk_steps` 字段
|
|||
|
|
- 添加了 `create_by`, `update_by` 字段
|
|||
|
|
- 添加了 `update_time` 字段
|
|||
|
|
|
|||
|
|
3. **数据转换逻辑**:
|
|||
|
|
- `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. 清空现有数据
|
|||
|
|
```sql
|
|||
|
|
-- 执行 clear_and_resync_xq_client_log.sql
|
|||
|
|
TRUNCATE TABLE xq_client_log;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 重新触发数据同步
|
|||
|
|
```bash
|
|||
|
|
# 等待应用完全启动后
|
|||
|
|
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 验证同步结果
|
|||
|
|
```sql
|
|||
|
|
-- 检查同步后的数据
|
|||
|
|
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"
|
|||
|
|
|
|||
|
|
## 技术要点
|
|||
|
|
|
|||
|
|
1. **字段映射一致性**:确保SQL中的字段名与数据库表结构完全一致
|
|||
|
|
2. **数据类型转换**:正确处理BigDecimal到String的转换
|
|||
|
|
3. **批量插入优化**:使用MyBatis的foreach进行高效的批量插入
|
|||
|
|
4. **错误处理**:添加详细的日志记录便于问题诊断
|
|||
|
|
|
|||
|
|
## 当前状态
|
|||
|
|
|
|||
|
|
- ✅ 字段映射已修复
|
|||
|
|
- ✅ 代码已重新编译和打包
|
|||
|
|
- ✅ 应用正在重新启动
|
|||
|
|
- 🔄 等待手动触发数据同步测试
|
|||
|
|
|
|||
|
|
## 下一步
|
|||
|
|
|
|||
|
|
1. ✅ 执行清空表的SQL脚本
|
|||
|
|
2. 📋 等待应用完全启动
|
|||
|
|
3. 📋 手动触发数据同步
|
|||
|
|
4. 📋 验证字段映射是否正确
|
|||
|
|
5. 📋 确认数据同步功能正常工作
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
**字段映射问题已修复!** 现在 `xq_client_log` 表应该能正确接收设备电压、温度、步数等数据,不再显示 `(Null)` 值。
|