Files
xyzw_web_helper/MD说明文件夹/功能优化-同步服务器发车次数v3.10.0.md

307 lines
10 KiB
Markdown
Raw Normal View History

2025-10-17 20:56:50 +08:00
# 功能优化 - 同步服务器发车次数 (v3.10.0)
## 📋 优化背景
### v3.9.9 测试发现的问题
在v3.9.9测试中,发现了客户端和服务器端发车次数不一致的问题:
| 位置 | 今日发车次数 | 是否达到上限 |
|------|-------------|-------------|
| **客户端localStorage** | 0/4 | 否 |
| **服务器端** | /4 | **是错误码12000050** |
**问题原因**
- 客户端使用 `localStorage` 存储发车次数
- 用户可能清除缓存或在不同设备登录
- 服务器端的发车次数是权威数据源
- 导致客户端和服务器端数据不一致
## 💡 v3.10.0 解决方案
### 核心思路
**服务器端数据为准,客户端实时同步**
1. 每次查询车辆时,获取服务器端的 `sendCount`
2. 与客户端 `localStorage` 中的值比较
3. 如果不一致,以服务器端为准,更新本地存储
4. 在发送前再次确认,避免不必要的发送尝试
### 优化点
#### 1. 查询车辆时同步发车次数
**位置**: 初次查询车辆后
**代码**:
```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
}
console.log(`✅ [${tokenId}] 查询到 ${carIds.length} 辆车(今日已发车: ${dailySendCount}/4`)
```
**效果**
- ✅ 立即发现并修正客户端和服务器端的差异
- ✅ 提前告知用户真实的发车次数
- ✅ 避免后续不必要的操作
#### 2. 刷新车辆后再次同步
**位置**: 批量刷新车辆并重新查询后
**代码**:
```javascript
// 重新查询车辆状态
const reQueryResponse = await tokenStore.sendMessageAsync(tokenId, 'car_getrolecar', {}, 20000)
if (reQueryResponse?.roleCar?.carDataMap) {
Object.assign(carDataMap, reQueryResponse.roleCar.carDataMap)
}
// 同步服务器端的发车次数
if (reQueryResponse?.roleCar?.sendCount !== undefined) {
const newServerSendCount = reQueryResponse.roleCar.sendCount
if (newServerSendCount !== dailySendCount) {
console.log(`🔄 [${tokenId}] 刷新后同步发车次数: ${dailySendCount} → ${newServerSendCount}`)
localStorage.setItem(dailySendKey, newServerSendCount.toString())
dailySendCount = newServerSendCount
}
}
```
**效果**
- ✅ 确保刷新操作后数据依然同步
- ✅ 检测是否有其他设备/页面发车
#### 3. 发送前最后一次确认
**位置**: 等待3秒状态同步后发送车辆前
**代码**:
```javascript
// 重新查询车辆状态
console.log(`🔍 [${tokenId}] 重新查询车辆状态...`)
const finalQueryResponse = await tokenStore.sendMessageAsync(tokenId, 'car_getrolecar', {}, 20000)
if (finalQueryResponse?.roleCar?.carDataMap) {
Object.assign(carDataMap, finalQueryResponse.roleCar.carDataMap)
}
// 同步服务器端的发车次数(发送前最后一次确认)
if (finalQueryResponse?.roleCar?.sendCount !== undefined) {
const latestServerSendCount = finalQueryResponse.roleCar.sendCount
if (latestServerSendCount !== dailySendCount) {
console.log(`🔄 [${tokenId}] 发送前同步发车次数: ${dailySendCount} → ${latestServerSendCount}`)
localStorage.setItem(dailySendKey, latestServerSendCount.toString())
dailySendCount = latestServerSendCount
}
}
// 最后检查发车次数限制
const currentRemainingSendCount = 4 - dailySendCount
if (currentRemainingSendCount <= 0) {
console.warn(`⚠️ [${tokenId}] 发送前检查: 今日发车次数已达上限(${dailySendCount}/4),跳过发送`)
sendCarResults.push({
task: '批量发送',
success: true,
message: `今日发车次数已达上限(${dailySendCount}/4),跳过发送`
})
return {
task: '发车',
taskId: 'send_car',
success: true,
data: sendCarResults,
message: `今日发车次数已达上限(${dailySendCount}/4)`
}
}
```
**效果**
- ✅ 发送前最后一次检查,避免浪费发送请求
- ✅ 如果已达上限,提前退出并告知用户
- ✅ 使用最新的发车次数计算剩余额度
#### 4. 增强错误处理
**位置**: 发送车辆失败时
**代码**:
```javascript
catch (error) {
const errorMsg = error.message || String(error)
// 区分不同的错误类型
if (errorMsg.includes('12000050')) {
console.log(`⚠️ [${tokenId}] 车辆 ${carId} 发送失败: 今日发车次数已达上限(服务器端限制)`)
} else if (errorMsg.includes('200020')) {
console.log(`⚠️ [${tokenId}] 车辆 ${carId} 发送失败: 处于冷却期或状态未同步`)
} else {
console.log(`❌ [${tokenId}] 发送车辆失败: ${carId} - ${errorMsg}`)
}
}
```
**效果**
- ✅ 清晰区分不同类型的失败原因
- ✅ 用户能快速理解问题所在
- ✅ 避免误认为是bug
## 📊 优化效果对比
### 修改前v3.9.9及之前)
```
📊 [token_xxx] 今日已发车次数: 0/4 ← 客户端数据(可能不准确)
🚀 [token_xxx] 待发车: 4辆剩余额度: 4个将发送: 4辆
❌ [token_xxx] 发送车辆失败: xxx - 服务器错误: 12000050 - 未知错误
❌ [token_xxx] 发送车辆失败: xxx - 服务器错误: 12000050 - 未知错误
❌ [token_xxx] 发送车辆失败: xxx - 服务器错误: 12000050 - 未知错误
❌ [token_xxx] 发送车辆失败: xxx - 服务器错误: 12000050 - 未知错误
🚀 [token_xxx] 发送完成成功0次跳过0次
```
**问题**
- ❌ 客户端显示 0/4但服务器认为已达上限
- ❌ 尝试发送4辆车全部失败
- ❌ 错误信息不明确("未知错误"
- ❌ 浪费了4次发送请求
### 修改后v3.10.0
**场景1服务器端已达上限**
```
✅ [token_xxx] 查询到 4 辆车(今日已发车: 0/4
🔄 [token_xxx] 同步服务器发车次数: 客户端0 → 服务器4 ← 立即发现差异
✅ [token_xxx] 查询到 4 辆车(今日已发车: 4/4 ← 更新显示
📊 [token_xxx] 检查每日发车次数限制: 4/4
⚠️ [token_xxx] 今日发车次数已达上限: 4/4 ← 提前检测
🚀 [token_xxx] 开始批量发送...
⏳ [token_xxx] 等待服务器状态同步3秒...
🔍 [token_xxx] 重新查询车辆状态...
⚠️ [token_xxx] 发送前检查: 今日发车次数已达上限(4/4),跳过发送 ← 提前退出
```
**效果**
- ✅ 立即发现并修正数据差异
- ✅ 提前检测到已达上限
- ✅ 避免了4次无效的发送请求
- ✅ 清晰告知用户原因
**场景2服务器端还有额度**
```
✅ [token_xxx] 查询到 4 辆车(今日已发车: 0/4
🔄 [token_xxx] 同步服务器发车次数: 客户端0 → 服务器2 ← 同步差异
✅ [token_xxx] 查询到 4 辆车(今日已发车: 2/4 ← 更新显示
📊 [token_xxx] 检查每日发车次数限制: 2/4
🚀 [token_xxx] 开始批量发送...
⏳ [token_xxx] 等待服务器状态同步3秒...
🔍 [token_xxx] 重新查询车辆状态...
🚀 [token_xxx] 待发车: 4辆剩余额度: 2个将发送: 2辆 ← 正确计算
✅ [token_xxx] 发送车辆成功: xxx
✅ [token_xxx] 发送车辆成功: xxx
🚀 [token_xxx] 发送完成成功2次跳过0次今日4/4 ← 完美!
```
**效果**
- ✅ 同步真实的发车次数
- ✅ 正确计算剩余额度
- ✅ 成功发送2辆车不多不少
- ✅ 最终达到每日上限 4/4
## 🎯 关键改进点总结
| 优化点 | 修改前 | 修改后 |
|--------|--------|--------|
| **数据来源** | 只使用客户端 localStorage | 以服务器端为准,实时同步 |
| **同步时机** | 只在发送成功后更新 | 查询、刷新、发送前都同步 |
| **错误处理** | 通用错误信息 | 区分 12000050、200020 等错误码 |
| **提前检测** | 无 | 发送前检测并提前退出 |
| **用户体验** | 尝试发送才知道失败 | 提前告知,避免无效请求 |
| **日志清晰度** | 显示客户端数据(可能不准) | 显示真实数据并标注同步 |
## 📝 测试建议
### 测试场景1客户端数据过期
1. 在游戏功能页面手动发车2辆
2. 清除浏览器 localStorage
3. 在批量自动化中发车
4. **预期**自动同步服务器端的2次记录只发送剩余2辆
### 测试场景2服务器端已达上限
1. 确保服务器端已有4次发车记录
2. 在批量自动化中尝试发车
3. **预期**
- 查询时立即发现并同步0→4
- 提前检测到已达上限
- 跳过发送,避免无效请求
- 清晰告知用户原因
### 测试场景3正常发车流程
1. 等待服务器日切后每日0次
2. 在批量自动化中发车
3. **预期**
- 同步服务器端的0次记录
- 成功发送4辆车
- 发送过程中实时更新计数
- 最终显示 4/4
### 测试场景4跨设备发车
1. 在设备A发车2辆
2. 在设备B批量自动化发车
3. **预期**
- 设备B查询时同步设备A的2次记录
- 只发送剩余2辆
- 两设备数据一致
## 📋 相关错误码说明
| 错误码 | 错误信息 | 原因 | 解决方法 |
|--------|---------|------|---------|
| **12000050** | 今日发车次数已达上限 | 服务器端已有4次发车记录 | 等待服务器日切或使用新账号 |
| **200020** | 出了点小问题 | 冷却期/状态未同步 | 已通过3秒等待修复 |
| **12000102** | 车未到终点 | 车辆还在运输中 | 等待车辆到达后收获 |
## 🔄 更新日志
**版本**: v3.10.0
**日期**: 2025-10-08
**类型**: 功能优化
**修改内容**:
1. ✅ 查询车辆时同步服务器端的 `sendCount`
2. ✅ 刷新车辆后再次同步 `sendCount`
3. ✅ 发送前最后一次确认并同步 `sendCount`
4. ✅ 发送前提前检测发车次数上限
5. ✅ 增强错误处理,区分 12000050 和 200020
6. ✅ 优化日志输出,显示同步过程
**影响范围**:
- `src/stores/batchTaskStore.js` - `sendCar` 任务
**解决问题**:
- 客户端和服务器端发车次数不一致
- 发车次数达到上限后仍尝试发送
- 错误信息不明确
**性能提升**:
- 减少无效的发送请求
- 提前检测并退出,节省时间
- 日志更清晰,便于排查问题