Files
cattleTransportation/tradeCattle/60_MINUTE_SYNC_ISSUE_DIAGNOSIS.md

122 lines
3.8 KiB
Markdown
Raw Normal View History

2025-10-24 17:32:42 +08:00
# 60分钟自动同步数据问题诊断报告
## 问题描述
用户反馈60分钟自动同步数据功能没有正常工作`xq_client_log` 表中仍然是空数据。
## 问题分析
### 1. 当前状态
- ✅ 应用正在运行PID 17008
- ✅ 定时任务配置正确60分钟间隔
- ❌ 数据同步失败:`Data truncation: Data too long for column 'latitude'`
-`xq_client_log` 表查询结果为0条记录
### 2. 根本原因
**数据库字段长度限制**`latitude` 字段长度不够,导致数据截断错误,批量插入失败。
## 解决方案
### 第一步:修复数据库字段长度
```sql
-- 执行 emergency_fix_field_length.sql
ALTER TABLE xq_client_log MODIFY COLUMN latitude VARCHAR(500) DEFAULT NULL COMMENT '纬度';
ALTER TABLE xq_client_log MODIFY COLUMN longitude VARCHAR(500) DEFAULT NULL COMMENT '经度';
ALTER TABLE xq_client_log MODIFY COLUMN device_voltage VARCHAR(500) DEFAULT NULL COMMENT '设备电量';
ALTER TABLE xq_client_log MODIFY COLUMN device_temp VARCHAR(500) DEFAULT NULL COMMENT '设备温度';
ALTER TABLE xq_client_log MODIFY COLUMN server_device_id VARCHAR(500) DEFAULT NULL COMMENT '主机设备ID';
```
### 第二步:清空表并重新同步
```sql
-- 清空现有数据
TRUNCATE TABLE xq_client_log;
```
### 第三步:手动触发同步
```bash
# 手动触发数据同步
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
```
## 技术细节
### 1. 定时任务配置
```java
@Scheduled(fixedRate = 60 * 60 * 1000) // 60分钟
public void syncDeviceDataToLogs() {
try {
logger.info("开始执行设备日志同步定时任务");
iotDeviceLogSyncService.syncDeviceDataToLogs();
logger.info("设备日志同步定时任务执行完成");
iotDeviceLogSyncService.logSyncStatistics();
} catch (Exception e) {
logger.error("设备日志同步定时任务执行失败", e);
}
}
```
### 2. 数据同步逻辑
- 查询 `iot_device_data` 表的所有设备
- 按设备类型分组1=主机2=耳标4=项圈)
- 转换为对应的日志实体
- 批量插入到日志表
### 3. 字段映射关系
| iot_device_data | xq_client_log | 说明 |
|----------------|---------------|------|
| `voltage` | `device_voltage` | 设备电压 |
| `temperature` | `device_temp` | 设备温度 |
| `steps` | `walk_steps` | 总步数 |
| `same_day_steps` | `y_walk_steps` | 昨日步数 |
| `latitude` | `latitude` | 纬度 |
| `longitude` | `longitude` | 经度 |
## 测试验证
### 1. 数据库字段长度测试
```sql
-- 执行 test_data_sync_functionality.sql
-- 验证字段长度是否足够
```
### 2. 手动插入测试
```sql
-- 手动插入一条测试记录
INSERT INTO xq_client_log (...) VALUES (...);
```
### 3. 批量同步测试
```bash
# 手动触发同步
POST /api/deliveryDevice/manualSyncDeviceLogs
```
## 预期结果
修复后,应该看到:
1. **数据库字段长度**:所有字段长度 >= 500字符
2. **数据同步成功**:不再有 `Data truncation` 错误
3. **日志表有数据**`xq_client_log` 表包含设备数据
4. **定时任务正常**每60分钟自动同步数据
## 故障排除
如果问题仍然存在,请检查:
1. **数据库权限**确认应用有ALTER TABLE权限
2. **字段类型**确认字段类型支持VARCHAR(500)
3. **数据格式**:确认经纬度数据格式正确
4. **日志输出**:查看应用日志中的详细错误信息
## 下一步行动
1. ✅ 执行数据库字段长度修复脚本
2. ✅ 清空 `xq_client_log`
3. 📋 手动触发数据同步
4. 📋 验证同步结果
5. 📋 确认60分钟定时任务正常工作
## 结论
**问题已定位**数据库字段长度限制导致数据同步失败。修复字段长度后60分钟自动同步功能应该能正常工作。