144 lines
4.2 KiB
Markdown
144 lines
4.2 KiB
Markdown
|
|
# 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字符
|
|||
|
|
- 优化了数据类型转换过程
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
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. 执行数据库修复脚本
|
|||
|
|
```sql
|
|||
|
|
-- 执行 comprehensive_fix_xq_client_log_fields.sql
|
|||
|
|
-- 扩展所有字段长度
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 手动触发数据同步
|
|||
|
|
```bash
|
|||
|
|
# 等待应用完全启动后
|
|||
|
|
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 验证同步结果
|
|||
|
|
```sql
|
|||
|
|
-- 检查同步后的数据
|
|||
|
|
SELECT * FROM xq_client_log WHERE device_id = '24075000139' ORDER BY time DESC LIMIT 5;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 检查同步统计
|
|||
|
|
```bash
|
|||
|
|
# 获取同步统计信息
|
|||
|
|
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进行高效的批量数据插入
|
|||
|
|
- **错误处理**: 添加详细的日志记录便于问题诊断
|