# 问题修复：部分任务失败触发重试 v3.11.4

## 📋 更新时间
2025-10-08

## 🎯 修复目标
解决批量自动化中，当token的**部分任务失败**时，不被计入失败统计，无法触发自动重试机制的问题。

## ❌ 问题描述

### 现象
用户运行批量自动化（9个token，每个7个任务）：
- 3个token显示"部分任务失败 (1/7)"
- 6个token全部成功

**期望结果：**
- 全局统计：成功6，失败3
- 自动重试轮数：1/3（触发重试）

**实际结果：**
- 全局统计：成功9，失败0 ❌
- 自动重试轮数：0/3（未触发重试）❌

### 根本原因

在 `src/stores/batchTaskStore.js` 的 `executeTokenTasks` 函数中：

```javascript
// 旧逻辑（v3.11.3及之前）
if (allTasksFailed) {
  // 所有任务都失败 - 标记为失败
  status: 'failed'
  executionStats.value.failed++
} else if (hasAnyTaskFailed) {
  // 部分任务失败 - 标记为部分完成（视为完成但记录错误）
  status: 'completed'  // ⬅️ 问题：部分失败仍算成功
  executionStats.value.success++  // ⬅️ 问题：计入成功统计
} else {
  // 所有任务成功
  status: 'completed'
  executionStats.value.success++
}
```

**问题分析：**
1. 只有**所有任务都失败**时，才会标记为 `status: 'failed'`
2. 如果有**部分任务失败**，则标记为 `status: 'completed'`
3. `status: 'completed'` 的token不会被 `retryFailedTasks()` 重试（它只重试 `status: 'failed'` 的）
4. 导致有问题的token无法进入重试流程

## ✅ 解决方案

### 核心思路
**任何任务失败（无论是部分还是全部），都应该标记为失败，触发自动重试机制。**

### 实现逻辑

修改 `executeTokenTasks` 函数的任务状态判断逻辑：

```javascript
// 新逻辑（v3.11.4）
if (hasAnyTaskFailed) {
  // 🔴 任何任务失败（包括部分或全部）- 统一标记为失败，触发重试机制
  updateTaskProgress(tokenId, {
    status: 'failed',
    progress: 100,
    currentTask: null,
    error: allTasksFailed 
      ? `所有任务执行失败 (${taskFailedCount}/${tasks.length})`
      : `部分任务失败 (${taskFailedCount}/${tasks.length})`,
    endTime: Date.now()
  })
  executionStats.value.failed++
  console.log(`❌ Token失败: ${token.name} (${taskFailedCount}/${tasks.length}个任务失败)`)
} else {
  // 🟢 所有任务成功 - 标记为完成
  updateTaskProgress(tokenId, {
    status: 'completed',
    progress: 100,
    currentTask: null,
    endTime: Date.now()
  })
  executionStats.value.success++
  console.log(`✅ Token完成: ${token.name}`)
}
```

### 关键改进点

1. **简化判断逻辑**：
   - 移除了 `else if (hasAnyTaskFailed)` 分支
   - 将"部分失败"和"全部失败"合并为一个分支处理
   
2. **统一失败标记**：
   - 只要 `hasAnyTaskFailed === true`（即 `taskFailedCount > 0`），就标记为 `'failed'`
   - 错误信息中仍然区分"所有任务失败"和"部分任务失败"，便于调试
   
3. **触发重试机制**：
   - `status: 'failed'` 的token会被 `retryFailedTasks()` 自动收集
   - 自动重试机制正常工作

## 🎉 优化效果

### 用户体验

**修复前：**
```
总计: 9, 成功: 9, 失败: 0
重试轮数: 0/3
❌ 有失败的任务但不会重试
```

**修复后：**
```
总计: 9, 成功: 6, 失败: 3
重试轮数: 1/3
✅ 失败的任务自动进入重试流程
```

### 技术优势

1. ✅ **准确统计**：失败数量准确反映实际情况
2. ✅ **自动重试**：部分失败的token也能进入重试流程
3. ✅ **明确状态**：token卡片显示为"失败"状态（红色），更直观
4. ✅ **保留详情**：错误信息仍然显示具体失败数量（如"部分任务失败 1/7"）

## 📊 日志示例

### 部分任务失败

**修复前：**
```
⚠️ Token部分完成: 641服-2-6... (1个任务失败)
📊 统计信息: { total: 9, success: 9, failed: 0 }  ❌
```

**修复后：**
```
❌ Token失败: 641服-2-6... (1/7个任务失败)
📊 统计信息: { total: 9, success: 6, failed: 3 }  ✅
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 自动重试失败任务
📊 失败数量: 3
🔢 重试轮数: 1/3
⏳ 等待 1 秒后开始重试...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

### 所有任务失败

**修复前：**
```
❌ Token失败: 某token (所有任务都失败)
📊 统计信息: { total: 1, success: 0, failed: 1 }
```

**修复后：**
```
❌ Token失败: 某token (7/7个任务失败)
📊 统计信息: { total: 1, success: 0, failed: 1 }
```

## 🧪 测试建议

### 测试场景1：部分任务失败
1. 准备3个token，其中1个token的某个任务会失败（如发车任务未加入俱乐部）
2. 启用"自动重试失败任务"，设置最大重试轮数为3轮
3. 运行批量自动化
4. 观察：
   - ✅ 全局统计应显示：成功2，失败1
   - ✅ 重试轮数应显示：1/3
   - ✅ 失败的token会自动进入重试流程
   - ✅ token卡片显示为"失败"状态（红色）

### 测试场景2：全部任务成功
1. 准备3个token，所有任务都能正常完成
2. 运行批量自动化
3. 观察：
   - ✅ 全局统计应显示：成功3，失败0
   - ✅ 重试轮数应显示：0/3（不触发重试）
   - ✅ 所有token卡片显示为"已完成"状态（绿色）

### 测试场景3：所有任务失败
1. 准备1个token，其所有任务都会失败（如未连接WSS）
2. 运行批量自动化
3. 观察：
   - ✅ 全局统计应显示：成功0，失败1
   - ✅ 重试轮数应显示：1/3
   - ✅ 失败的token会自动进入重试流程
   - ✅ token卡片显示为"失败"状态（红色）

### 测试场景4：重试后成功
1. 准备1个token，第一次某个任务失败，重试后成功
2. 运行批量自动化，启用自动重试
3. 观察：
   - ✅ 第1轮：成功0，失败1，触发重试
   - ✅ 第2轮：成功1，失败0，完成所有任务
   - ✅ 最终状态：成功1，失败0

## 📝 相关文件

### 修改的文件
- `src/stores/batchTaskStore.js` (第 418-445 行)
  - 修改了 `executeTokenTasks` 函数的任务状态判断逻辑
  - 将"部分任务失败"从成功统计改为失败统计

### 相关文件（无需修改）
- `src/components/BatchTaskPanel.vue` - 批量任务面板（自动显示正确的统计）
- `src/components/TaskProgressCard.vue` - 执行进度卡片（自动显示"失败"状态）
- `finishBatchExecution()` - 自动重试逻辑（自动检测失败token）

## 🔄 版本历史

### v3.11.4 (2025-10-08)
- 🐛 修复：部分任务失败时不计入失败统计的问题
- ✨ 新增：任何任务失败（包括部分或全部）都会触发自动重试机制
- 🔄 重构：简化了任务状态判断逻辑

### v3.11.3 (2025-10-08)
- ✨ 新增：发车任务完成后的最终验证步骤

### v3.11.2 (2025-10-08)
- 🐛 修复：游戏功能模块的赛车管理也会统计运输中的车辆

### v3.11.1 (2025-10-08)
- 🐛 修复：俱乐部签到错误码 2300190（已签到）不应视为失败

## 💡 后续优化建议

1. **可配置失败策略**：
   - 增加配置项，允许用户选择是否将"部分失败"也计为失败
   - 某些场景下，用户可能只关心关键任务（如发车、爬塔）是否成功
   
2. **失败任务详情**：
   - 在重试日志中显示哪些具体任务失败了
   - 便于快速定位问题
   
3. **智能重试**：
   - 仅重试失败的任务，跳过已成功的任务
   - 提高重试效率，减少服务器压力

4. **失败任务统计**：
   - 在全局统计中增加"部分失败"和"完全失败"的细分统计
   - 提供更详细的执行报告

## 🔗 相关问题

- [功能更新-自动重试失败任务v3.7.0.md](./功能更新-自动重试失败任务v3.7.0.md)
- [问题修复-批量任务统计计数错误v3.6.1.md](./问题修复-批量任务统计计数错误v3.6.1.md)

