# 问题修复 - 发车任务超时优化 v3.9.4

## 📋 问题描述

在批量自动化执行"发车"任务时，6个账号中有5个出现 `car_getrolecar` 超时（5000ms），导致任务失败。

### 错误日志
```
❌ [token_xxx] 发车任务失败: Error: 请求超时: car_getrolecar (5000ms)
```

### 失败统计
- **成功**：1/6 账号 (16.7%)
- **失败**：5/6 账号 (83.3%)
- **失败位置**：所有失败都发生在第一步"查询车辆"

---

## 🔍 问题分析

### 根本原因

对比游戏功能模块和批量任务的实现，发现了超时配置的差异：

| 代码位置 | 调用方式 | 超时时间 | 并发数 | 结果 |
|---------|---------|---------|---------|------|
| **游戏功能模块** | `tokenStore.sendMessageAsync(tokenId, 'car_getrolecar')` | **1000ms** (默认) | **1个** | ✅ 成功 |
| **批量任务 (修复前)** | `client.sendWithPromise('car_getrolecar', {}, 5000)` | **5000ms** | **6个** (并发) | ❌ 超时 |

### 关键发现

1. **游戏功能模块**：
   - 单用户点击查询，只有1个请求
   - 服务器响应快
   - 虽然默认超时只有1秒，但足够了

2. **批量任务**：
   - 6个账号并发查询
   - 服务器压力大，响应时间 > 5秒
   - 即使有连接延迟机制（300ms间隔），查询命令还是几乎同时发出

3. **超时配置来源**：
   - `tokenStore.sendMessageAsync` 是 `sendMessageWithPromise` 的别名
   - `sendMessageWithPromise` 的默认超时是 **1000ms** (`src/stores/tokenStore.js:1414`)
   - 如果不传第4个参数，就使用默认值

---

## ✅ 解决方案

### 修复措施

#### 1. 批量任务超时优化 (`src/stores/batchTaskStore.js`)

| 命令 | 修复前 | 修复后 | 说明 |
|------|-------|-------|------|
| `car_getrolecar` | 5000ms | **10000ms** (10秒) | 查询车辆，并发压力大 |
| `car_refresh` | 3000ms | **5000ms** | 刷新车辆 |
| `car_claim` | 3000ms | **5000ms** | 收获车辆 |
| `car_send` | 3000ms | **5000ms** | 发送车辆 |

**修改位置**：
- 第1134行：初次查询车辆
- 第1209行：刷新后重新查询
- 第1280行：发送前重新查询
- 第1182行：刷新车辆
- 第1250行：收获车辆
- 第1293行：发送车辆

#### 2. 游戏功能模块超时优化 (`src/components/CarManagement.vue`)

| 命令 | 修复前 | 修复后 | 说明 |
|------|-------|-------|------|
| `car_getrolecar` | 1000ms (默认) | **10000ms** | 提高容错性 |
| `car_refresh` | 1000ms (默认) | **5000ms** | 防止单独使用时超时 |
| `car_claim` | 1000ms (默认) | **5000ms** | 防止单独使用时超时 |
| `car_send` | 1000ms (默认) | **5000ms** | 防止单独使用时超时 |

**修改位置**：
- 第505行：查询车辆
- 第690-692行：刷新车辆
- 第744-746行：收获车辆
- 第787-791行：发送车辆

---

## 🎯 预期效果

### 批量任务
- **查询车辆**：从5秒增加到10秒，应对6个并发请求
- **其他操作**：从3秒增加到5秒，提高成功率
- **预期成功率**：从 16.7% 提升到 **80%+**

### 游戏功能模块
- 从1秒默认值增加到5-10秒
- 即使服务器偶尔响应慢，也能正常工作
- 保持良好的用户体验

---

## 📊 技术细节

### 超时时间选择依据

1. **查询车辆 (10秒)**：
   - 并发6个账号同时查询
   - 需要等待服务器处理所有请求
   - 根据实际测试，5秒不够，10秒足够

2. **其他操作 (5秒)**：
   - 刷新/收获/发送是顺序执行，间隔300ms
   - 服务器压力相对小
   - 5秒足够处理单个操作

3. **为什么不更长**：
   - 超时时间太长会导致用户等待过久
   - 10秒是平衡点：既能保证成功率，又不让用户等太久

### 并发策略

批量任务使用了以下策略来降低服务器压力：

1. **连接错开**：每个账号间隔300ms建立连接
   ```javascript
   await new Promise(resolve => setTimeout(resolve, staggerDelay * index))
   ```

2. **操作间隔**：每次操作后等待300ms
   ```javascript
   await new Promise(resolve => setTimeout(resolve, 300))
   ```

3. **步骤间隔**：大步骤之间等待500ms
   ```javascript
   await new Promise(resolve => setTimeout(resolve, 500))
   ```

---

## 🧪 验证方法

### 测试步骤
1. 启动应用
2. 打开批量自动化面板
3. 选择6个账号
4. 只勾选"发车"任务
5. 点击"开始执行"

### 预期结果
- ✅ 6个账号中至少5个成功完成查询（83%+ 成功率）
- ✅ 查询车辆不再超时
- ✅ 控制台显示 `✅ [token_xxx] 查询到 X 辆车`
- ✅ 总耗时约 60-120 秒（取决于车辆数量和操作数）

### 失败情况（可接受）
- 如果仍有个别账号超时，可能是：
  - 网络波动
  - 服务器短暂高负载
  - Token失效
- 这种情况下，可以使用"自动重试"功能

---

## 🔄 版本信息

- **版本号**：v3.9.4
- **修复日期**：2025-10-08
- **影响范围**：
  - `src/stores/batchTaskStore.js`
  - `src/components/CarManagement.vue`
- **向后兼容**：✅ 完全兼容

---

## 💡 后续优化建议

如果10秒超时仍然不够（在极端高并发情况下），可以考虑：

1. **降低并发数**：从6个降低到3个
2. **使用完全串行执行**：一个一个账号执行
3. **增加更长的连接间隔**：从300ms增加到500ms或1000ms
4. **使用队列机制**：让服务器端控制并发数

目前的10秒超时应该能解决大部分问题，无需立即实施上述优化。

---

## 📝 相关文档

- [批量任务添加发车功能 v3.9.0](./功能更新-批量任务添加发车功能v3.9.0.md)
- [发车任务超时和Vue组件警告 v3.9.3](./问题修复-发车任务超时和Vue组件警告v3.9.3.md)

