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