1.0
This commit is contained in:
301
MD说明文件夹/问题修复-服务器sendCount不可靠v3.10.1.md
Normal file
301
MD说明文件夹/问题修复-服务器sendCount不可靠v3.10.1.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# 问题修复 - 服务器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次)
|
||||
- 第二次运行时直接跳过,节省所有发送请求
|
||||
|
||||
Reference in New Issue
Block a user