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

2.9 KiB
Raw Blame History

日志同步问题根本原因分析

🎯 问题根源

发现的关键问题

XqClientLogMapper.xml 文件中发现了字段映射不一致的严重问题:

问题1resultMap字段映射错误

<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.XqClientLog">
    <result column="battery" property="deviceVoltage" />         <!-- ❌ 错误使用battery -->
    <result column="temperature" property="deviceTemp" />        <!-- ❌ 错误使用temperature -->
    <result column="deviceld" property="serverDeviceId" />       <!-- ❌ 错误使用deviceld -->
</resultMap>

问题2批量插入SQL使用不同的字段名

<insert id="batchInsert">
    INSERT INTO xq_client_log (
        device_voltage, device_temp, server_device_id,  <!-- ✅ 正确使用device_voltage, device_temp -->
        ...
    )
</insert>

🔍 根本原因

字段名不一致导致的问题:

  1. resultMap 使用的是旧的字段名battery, temperature, deviceld
  2. 批量插入SQL使用的是新的字段名device_voltage, device_temp, server_device_id
  3. 实体类 XqClientLog.java 使用的是新的字段名

这导致:

  • 查询时:使用 battery 字段,但表中可能没有这个字段
  • 插入时:使用 device_voltage 字段,这是正确的
  • 但是数据截断错误可能是因为字段长度定义不足

🛠️ 解决方案

方案1修复resultMap字段映射

resultMap 中的字段名修改为与实际表结构一致:

<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.XqClientLog">
    <result column="device_voltage" property="deviceVoltage" />
    <result column="device_temp" property="deviceTemp" />
    <result column="server_device_id" property="serverDeviceId" />
</resultMap>

方案2修复Base_Column_List

<sql id="Base_Column_List">
    id, device_id, device_voltage, device_temp, server_device_id, 
    latitude, longitude, walk_steps, y_walk_steps, 
    create_time, create_by, update_time, update_by
</sql>

方案3修复查询SQL

<select id="xqLogList" resultMap="BaseResultMap">  <!-- 使用resultMap而不是resultType -->
    SELECT
        <include refid="Base_Column_List"/>
    FROM
        xq_client_log log
    WHERE
        log.device_id IN (...)
        AND log.create_time BETWEEN #{createTime} AND #{checkTime}
    ORDER BY log.create_time DESC
</select>

📋 实施步骤

  1. 步骤1:修复 XqClientLogMapper.xml 中的字段映射
  2. 步骤2:重新编译和打包应用
  3. 步骤3重启Java后端应用端口16200
  4. 步骤4:清空 xq_client_log
  5. 步骤5:测试手动同步功能
  6. 步骤6验证60分钟自动同步功能

🎯 预期结果

修复后应该能够:

  • 成功批量插入项圈日志数据
  • 正确查询项圈日志数据
  • 60分钟自动同步功能正常工作