Files
xyzw_web_helper/MD说明文件夹/功能优化-同步服务器发车次数v3.10.0.md
2025-10-17 20:56:50 +08:00

10 KiB
Raw Blame History

功能优化 - 同步服务器发车次数 (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. 查询车辆时同步发车次数

位置: 初次查询车辆后

代码:

// 获取服务器端的发车次数并同步到本地
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. 刷新车辆后再次同步

位置: 批量刷新车辆并重新查询后

代码:

// 重新查询车辆状态
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秒状态同步后发送车辆前

代码:

// 重新查询车辆状态
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. 增强错误处理

位置: 发送车辆失败时

代码:

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 任务

解决问题:

  • 客户端和服务器端发车次数不一致
  • 发车次数达到上限后仍尝试发送
  • 错误信息不明确

性能提升:

  • 减少无效的发送请求
  • 提前检测并退出,节省时间
  • 日志更清晰,便于排查问题