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

122 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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分钟自动同步功能应该能正常工作。