# 问题修复 - 服务器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次）
- 第二次运行时直接跳过，节省所有发送请求

