7.9 KiB
7.9 KiB
问题修复:部分任务失败触发重试 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 函数中:
// 旧逻辑(v3.11.3及之前)
if (allTasksFailed) {
// 所有任务都失败 - 标记为失败
status: 'failed'
executionStats.value.failed++
} else if (hasAnyTaskFailed) {
// 部分任务失败 - 标记为部分完成(视为完成但记录错误)
status: 'completed' // ⬅️ 问题:部分失败仍算成功
executionStats.value.success++ // ⬅️ 问题:计入成功统计
} else {
// 所有任务成功
status: 'completed'
executionStats.value.success++
}
问题分析:
- 只有所有任务都失败时,才会标记为
status: 'failed' - 如果有部分任务失败,则标记为
status: 'completed' status: 'completed'的token不会被retryFailedTasks()重试(它只重试status: 'failed'的)- 导致有问题的token无法进入重试流程
✅ 解决方案
核心思路
任何任务失败(无论是部分还是全部),都应该标记为失败,触发自动重试机制。
实现逻辑
修改 executeTokenTasks 函数的任务状态判断逻辑:
// 新逻辑(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}`)
}
关键改进点
-
简化判断逻辑:
- 移除了
else if (hasAnyTaskFailed)分支 - 将"部分失败"和"全部失败"合并为一个分支处理
- 移除了
-
统一失败标记:
- 只要
hasAnyTaskFailed === true(即taskFailedCount > 0),就标记为'failed' - 错误信息中仍然区分"所有任务失败"和"部分任务失败",便于调试
- 只要
-
触发重试机制:
status: 'failed'的token会被retryFailedTasks()自动收集- 自动重试机制正常工作
🎉 优化效果
用户体验
修复前:
总计: 9, 成功: 9, 失败: 0
重试轮数: 0/3
❌ 有失败的任务但不会重试
修复后:
总计: 9, 成功: 6, 失败: 3
重试轮数: 1/3
✅ 失败的任务自动进入重试流程
技术优势
- ✅ 准确统计:失败数量准确反映实际情况
- ✅ 自动重试:部分失败的token也能进入重试流程
- ✅ 明确状态:token卡片显示为"失败"状态(红色),更直观
- ✅ 保留详情:错误信息仍然显示具体失败数量(如"部分任务失败 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:部分任务失败
- 准备3个token,其中1个token的某个任务会失败(如发车任务未加入俱乐部)
- 启用"自动重试失败任务",设置最大重试轮数为3轮
- 运行批量自动化
- 观察:
- ✅ 全局统计应显示:成功2,失败1
- ✅ 重试轮数应显示:1/3
- ✅ 失败的token会自动进入重试流程
- ✅ token卡片显示为"失败"状态(红色)
测试场景2:全部任务成功
- 准备3个token,所有任务都能正常完成
- 运行批量自动化
- 观察:
- ✅ 全局统计应显示:成功3,失败0
- ✅ 重试轮数应显示:0/3(不触发重试)
- ✅ 所有token卡片显示为"已完成"状态(绿色)
测试场景3:所有任务失败
- 准备1个token,其所有任务都会失败(如未连接WSS)
- 运行批量自动化
- 观察:
- ✅ 全局统计应显示:成功0,失败1
- ✅ 重试轮数应显示:1/3
- ✅ 失败的token会自动进入重试流程
- ✅ token卡片显示为"失败"状态(红色)
测试场景4:重试后成功
- 准备1个token,第一次某个任务失败,重试后成功
- 运行批量自动化,启用自动重试
- 观察:
- ✅ 第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(已签到)不应视为失败
💡 后续优化建议
-
可配置失败策略:
- 增加配置项,允许用户选择是否将"部分失败"也计为失败
- 某些场景下,用户可能只关心关键任务(如发车、爬塔)是否成功
-
失败任务详情:
- 在重试日志中显示哪些具体任务失败了
- 便于快速定位问题
-
智能重试:
- 仅重试失败的任务,跳过已成功的任务
- 提高重试效率,减少服务器压力
-
失败任务统计:
- 在全局统计中增加"部分失败"和"完全失败"的细分统计
- 提供更详细的执行报告