10 KiB
10 KiB
问题修复 - 服务器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 来同步
- 不再从服务器同步
sendCount:因为该字段不可靠 - 保留客户端 localStorage 记录:作为主要的发车次数记录
- 使用
12000050错误码作为同步信号:当收到此错误时,说明服务器端实际已达上限(4次),更新客户端记录
修复内容
1. 移除服务器 sendCount 同步逻辑
修改前(v3.10.0):
// 获取服务器端的发车次数并同步到本地
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):
// 获取客户端的发车次数记录
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):
catch (error) {
const errorMsg = error.message || String(error)
if (errorMsg.includes('12000050')) {
console.log(`⚠️ [${tokenId}] 车辆 ${carId} 发送失败: 今日发车次数已达上限(服务器端限制)`)
// 没有更新客户端记录,导致客户端和服务器端不一致
}
// ...
}
修改后(v3.10.1):
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 不可靠?
可能的原因:
- 字段未实现:服务器端可能没有正确实现这个字段的更新逻辑
- 缓存问题:服务器可能返回了缓存的旧数据
- 协议版本:可能是协议版本不匹配导致的字段缺失
为什么依赖 12000050 错误码?
- 唯一可靠的真实信号:这是服务器端在真正检查发车次数后返回的错误
- 实时反馈:每次发车请求都会触发服务器端的真实检查
- 精确判断:错误码
12000050专门表示"今日发车次数已达上限"
为什么设置为 4 而不是累加?
// 错误的做法
dailySendCount++ // 从 0 变成 1,但服务器实际是 4
// 正确的做法
dailySendCount = 4 // 直接设置为上限值
因为:
- 错误码
12000050表示已达上限,而不是"再发一次就达上限" - 服务器端的上限是固定的 4 次
- 直接设置为 4 可以避免多次尝试
🧪 测试建议
测试场景1:服务器端已有4次发车记录
- 清除客户端 localStorage 中的发车记录
- 运行批量自动化的发车任务
- 预期结果:
- 第1次运行:尝试发送1辆车,失败,更新客户端为 4/4
- 第2次运行:提前检测到 4/4,跳过发送
测试场景2:服务器端有2次发车记录
- 清除客户端 localStorage 中的发车记录
- 运行批量自动化的发车任务
- 预期结果:
- 成功发送2辆车
- 客户端更新为 4/4
- 第2次运行时跳过发送
测试场景3:服务器端0次发车记录
- 等待服务器日切后(每日0次)
- 运行批量自动化的发车任务
- 预期结果:
- 成功发送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
类型: 问题修复
修改内容:
- ❌ 移除了从服务器
sendCount字段同步发车次数的逻辑 - ✅ 保留客户端 localStorage 作为主要的发车次数记录
- ✅ 使用
12000050错误码作为同步信号 - ✅ 当收到
12000050时,立即将客户端记录更新为 4 - ✅ 使用
break停止继续发送,避免浪费请求
影响范围:
src/stores/batchTaskStore.js-sendCar任务
解决问题:
- 服务器
sendCount字段不可靠(总是返回0) - 客户端和服务器端发车次数不一致
- 重复尝试发送已达上限的车辆
性能提升:
- 第一次运行时减少3次无效请求(从4次减少到1次)
- 第二次运行时直接跳过,节省所有发送请求