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

3.8 KiB
Raw Blame History

60分钟自动同步数据问题诊断报告

问题描述

用户反馈60分钟自动同步数据功能没有正常工作xq_client_log 表中仍然是空数据。

问题分析

1. 当前状态

  • 应用正在运行PID 17008
  • 定时任务配置正确60分钟间隔
  • 数据同步失败:Data truncation: Data too long for column 'latitude'
  • xq_client_log 表查询结果为0条记录

2. 根本原因

数据库字段长度限制latitude 字段长度不够,导致数据截断错误,批量插入失败。

解决方案

第一步:修复数据库字段长度

-- 执行 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';

第二步:清空表并重新同步

-- 清空现有数据
TRUNCATE TABLE xq_client_log;

第三步:手动触发同步

# 手动触发数据同步
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST

技术细节

1. 定时任务配置

@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. 数据库字段长度测试

-- 执行 test_data_sync_functionality.sql
-- 验证字段长度是否足够

2. 手动插入测试

-- 手动插入一条测试记录
INSERT INTO xq_client_log (...) VALUES (...);

3. 批量同步测试

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