Files
xyzw_web_helper/MD说明文件夹/问题修复-服务器sendCount不可靠v3.10.1.md
2025-10-17 20:56:50 +08:00

302 lines
10 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.

# 问题修复 - 服务器sendCount不可靠 (v3.10.1)
## 📋 问题发现
### v3.10.0 测试结果
在v3.10.0中,我们尝试同步服务器端的 `sendCount` 字段,但测试发现了一个严重问题:
```
✅ [token_xxx] 查询到 4 辆车(今日已发车: 0/4 ← 服务器返回 sendCount=0
📊 [token_xxx] 检查每日发车次数限制: 0/4
🚀 [token_xxx] 待发车: 4辆剩余额度: 4个将发送: 4辆
⚠️ [token_xxx] 车辆 xxx 发送失败: 今日发车次数已达上限(服务器端限制)
⚠️ [token_xxx] 车辆 xxx 发送失败: 今日发车次数已达上限(服务器端限制)
⚠️ [token_xxx] 车辆 xxx 发送失败: 今日发车次数已达上限(服务器端限制)
⚠️ [token_xxx] 车辆 xxx 发送失败: 今日发车次数已达上限(服务器端限制)
🚀 [token_xxx] 发送完成成功0次跳过0次
```
### 矛盾点
| 数据来源 | 显示的发车次数 | 是否准确 |
|---------|---------------|---------|
| 服务器 `roleCar.sendCount` | 0/4 | ❌ **不准确** |
| 服务器实际记录(通过错误码推断) | 4/4已达上限 | ✅ **准确** |
### 结论
**服务器的 `roleCar.sendCount` 字段不可靠!**
- 该字段总是返回 `0`,即使服务器内部已经记录了发车次数
- 真实的发车次数只能通过尝试发车时的错误码 `12000050` 来判断
- 我们不能依赖 `sendCount` 字段来同步客户端的发车次数
## 💡 v3.10.1 修复方案
### 核心思路
**放弃服务器 `sendCount`,依靠错误码 `12000050` 来同步**
1. **不再从服务器同步 `sendCount`**:因为该字段不可靠
2. **保留客户端 localStorage 记录**:作为主要的发车次数记录
3. **使用 `12000050` 错误码作为同步信号**当收到此错误时说明服务器端实际已达上限4次更新客户端记录
### 修复内容
#### 1. 移除服务器 `sendCount` 同步逻辑
**修改前v3.10.0**
```javascript
// 获取服务器端的发车次数并同步到本地
const serverSendCount = queryResponse.roleCar?.sendCount || 0
const dailySendKey = getTodayKey(tokenId)
let dailySendCount = parseInt(localStorage.getItem(dailySendKey) || '0')
// 以服务器端的值为准(服务器端更权威)
if (serverSendCount !== dailySendCount) {
console.log(`🔄 [${tokenId}] 同步服务器发车次数: 客户端${dailySendCount} → 服务器${serverSendCount}`)
localStorage.setItem(dailySendKey, serverSendCount.toString())
dailySendCount = serverSendCount
}
```
**修改后v3.10.1**
```javascript
// 获取客户端的发车次数记录
const dailySendKey = getTodayKey(tokenId)
let dailySendCount = parseInt(localStorage.getItem(dailySendKey) || '0')
// 注意:服务器的 sendCount 字段不可靠总是返回0所以不同步
console.log(`✅ [${tokenId}] 查询到 ${carIds.length} 辆车(今日已发车: ${dailySendCount}/4`)
```
#### 2. 使用 `12000050` 错误码更新客户端记录
**修改前v3.10.0**
```javascript
catch (error) {
const errorMsg = error.message || String(error)
if (errorMsg.includes('12000050')) {
console.log(`⚠️ [${tokenId}] 车辆 ${carId} 发送失败: 今日发车次数已达上限(服务器端限制)`)
// 没有更新客户端记录,导致客户端和服务器端不一致
}
// ...
}
```
**修改后v3.10.1**
```javascript
catch (error) {
const errorMsg = error.message || String(error)
if (errorMsg.includes('12000050')) {
console.log(`⚠️ [${tokenId}] 车辆 ${carId} 发送失败: 今日发车次数已达上限(服务器端限制)`)
// 服务器返回已达上限说明服务器端实际已有4次发车记录
// 更新客户端记录以保持一致
console.log(`🔄 [${tokenId}] 根据服务器错误码,更新客户端发车次数: ${dailySendCount} → 4`)
localStorage.setItem(dailySendKey, '4')
dailySendCount = 4
// 已达上限,停止继续发送
break
}
// ...
}
```
**关键改进**
- 当收到 `12000050` 错误时,将客户端的 `dailySendCount` 强制设置为 `4`
- 使用 `break` 停止继续发送,避免浪费请求
- 下次运行时,客户端会提前检测到已达上限,不会再尝试发送
#### 3. 移除其他同步逻辑
同时移除了以下位置的服务器同步代码:
- 刷新车辆后的同步(已移除)
- 发送前的同步(已移除)
## 📊 修复效果对比
### 修改前v3.10.0
**场景服务器端已有4次发车记录**
```
✅ 查询到 4 辆车(今日已发车: 0/4 ← 从服务器同步的错误值
📊 检查每日发车次数限制: 0/4
🚀 待发车: 4辆剩余额度: 4个将发送: 4辆
⚠️ 车辆 xxx 发送失败: 今日发车次数已达上限 ← 尝试发送,失败
⚠️ 车辆 xxx 发送失败: 今日发车次数已达上限 ← 继续尝试
⚠️ 车辆 xxx 发送失败: 今日发车次数已达上限 ← 继续尝试
⚠️ 车辆 xxx 发送失败: 今日发车次数已达上限 ← 继续尝试
🚀 发送完成成功0次跳过0次
客户端记录依然是 0/4错误
下次运行还会继续尝试发送(浪费!)
```
### 修改后v3.10.1
**场景服务器端已有4次发车记录**
```
✅ 查询到 4 辆车(今日已发车: 0/4 ← 客户端记录(暂时不准确)
📊 检查每日发车次数限制: 0/4
🚀 待发车: 4辆剩余额度: 4个将发送: 4辆
⚠️ 车辆 xxx 发送失败: 今日发车次数已达上限(服务器端限制)
🔄 根据服务器错误码,更新客户端发车次数: 0 → 4 ← 立即更新!
🚀 发送完成成功0次跳过0次
客户端记录已更新为 4/4正确
下次运行会提前检测到已达上限(高效!)
```
**第二次运行(已更新客户端记录)**
```
✅ 查询到 4 辆车(今日已发车: 4/4 ← 客户端记录准确
📊 检查每日发车次数限制: 4/4
⚠️ 发送前检查: 今日发车次数已达上限(4/4),跳过发送 ← 提前退出!
不再尝试发送节省4次请求
```
## 🎯 关键优势
| 特性 | v3.10.0 | v3.10.1 |
|------|---------|---------|
| **数据来源** | 服务器 `sendCount`(不可靠) | 客户端 localStorage + 错误码反馈 |
| **同步时机** | 查询、刷新、发送前都尝试同步 | 只在收到 `12000050` 时更新 |
| **准确性** | ❌ 不准确服务器总是返回0 | ✅ 准确(错误码是真实反馈) |
| **效率** | ❌ 每次都尝试发送4辆车 | ✅ 第二次运行提前退出 |
| **用户体验** | ❌ 多次失败尝试 | ✅ 清晰告知原因 |
## 🔄 完整流程图
### 第一次运行服务器端已有4次记录
```
1. 查询车辆
└─ 客户端记录: 0/4 (不准确)
2. 检查发车次数
└─ 0 < 4继续
3. 尝试发送第1辆车
└─ 服务器返回: 12000050
└─ 捕获错误,更新客户端: 0 → 4
└─ break 停止发送
4. 结束
└─ 客户端记录: 4/4 (准确)
```
### 第二次运行(客户端记录已更新)
```
1. 查询车辆
└─ 客户端记录: 4/4 (准确)
2. 检查发车次数
└─ 4 >= 4已达上限
3. 提前退出
└─ 跳过发送节省4次请求
4. 结束
└─ 客户端记录: 4/4 (准确)
```
## 📝 技术细节
### 为什么服务器的 `sendCount` 不可靠?
可能的原因:
1. **字段未实现**:服务器端可能没有正确实现这个字段的更新逻辑
2. **缓存问题**:服务器可能返回了缓存的旧数据
3. **协议版本**:可能是协议版本不匹配导致的字段缺失
### 为什么依赖 `12000050` 错误码?
1. **唯一可靠的真实信号**:这是服务器端在真正检查发车次数后返回的错误
2. **实时反馈**:每次发车请求都会触发服务器端的真实检查
3. **精确判断**:错误码 `12000050` 专门表示"今日发车次数已达上限"
### 为什么设置为 4 而不是累加?
```javascript
// 错误的做法
dailySendCount++ // 从 0 变成 1但服务器实际是 4
// 正确的做法
dailySendCount = 4 // 直接设置为上限值
```
因为:
1. 错误码 `12000050` 表示**已达上限**,而不是"再发一次就达上限"
2. 服务器端的上限是固定的 4 次
3. 直接设置为 4 可以避免多次尝试
## 🧪 测试建议
### 测试场景1服务器端已有4次发车记录
1. 清除客户端 localStorage 中的发车记录
2. 运行批量自动化的发车任务
3. **预期结果**
- 第1次运行尝试发送1辆车失败更新客户端为 4/4
- 第2次运行提前检测到 4/4跳过发送
### 测试场景2服务器端有2次发车记录
1. 清除客户端 localStorage 中的发车记录
2. 运行批量自动化的发车任务
3. **预期结果**
- 成功发送2辆车
- 客户端更新为 4/4
- 第2次运行时跳过发送
### 测试场景3服务器端0次发车记录
1. 等待服务器日切后每日0次
2. 运行批量自动化的发车任务
3. **预期结果**
- 成功发送4辆车
- 客户端更新为 4/4
- 第2次运行时跳过发送
## 🔗 相关文档
- **MD说明/问题分析-发车失败错误12000050v3.9.9.md** - 问题发现
- **MD说明/功能优化-同步服务器发车次数v3.10.0.md** - 失败的尝试
- **MD说明/问题修复-服务器sendCount不可靠v3.10.1.md** - 本次修复(当前文档)
## 📋 更新日志
**版本**: v3.10.1
**日期**: 2025-10-08
**类型**: 问题修复
**修改内容**:
1. ❌ 移除了从服务器 `sendCount` 字段同步发车次数的逻辑
2. ✅ 保留客户端 localStorage 作为主要的发车次数记录
3. ✅ 使用 `12000050` 错误码作为同步信号
4. ✅ 当收到 `12000050` 时,立即将客户端记录更新为 4
5. ✅ 使用 `break` 停止继续发送,避免浪费请求
**影响范围**:
- `src/stores/batchTaskStore.js` - `sendCar` 任务
**解决问题**:
- 服务器 `sendCount` 字段不可靠总是返回0
- 客户端和服务器端发车次数不一致
- 重复尝试发送已达上限的车辆
**性能提升**:
- 第一次运行时减少3次无效请求从4次减少到1次
- 第二次运行时直接跳过,节省所有发送请求