251 lines
7.9 KiB
Markdown
251 lines
7.9 KiB
Markdown
# 问题修复:部分任务失败触发重试 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)
|
||
|