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

97 lines
2.9 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.

# 日志同步问题根本原因分析
## 🎯 问题根源
### 发现的关键问题
`XqClientLogMapper.xml` 文件中发现了**字段映射不一致**的严重问题:
#### 问题1resultMap字段映射错误
```xml
<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使用不同的字段名
```xml
<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` 中的字段名修改为与实际表结构一致:
```xml
<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
```xml
<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
```xml
<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分钟自动同步功能正常工作