# 问题修复 - 重试失败日志增强 v3.12.6 **版本**: v3.12.6 **日期**: 2025-10-08 **类型**: 问题修复 / 日志增强 ## 问题描述 用户反馈: > "失败重试的时候,没有把上次运行失败的项添加进去" **可能的问题**: 1. 重试时没有正确筛选失败的Token 2. 重试时执行了所有Token而不是只执行失败的 3. 日志信息不够详细,无法确认哪些Token被重试 ## 问题分析 ### 当前的重试逻辑 ```javascript const retryFailedTasks = async () => { // 获取所有失败的token ID const failedTokenIds = Object.keys(taskProgress.value).filter( tokenId => taskProgress.value[tokenId].status === 'failed' ) if (failedTokenIds.length === 0) { console.warn('⚠️ 没有失败的任务需要重试') return } console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`) // 使用当前模板的任务列表 const tasks = currentTemplateTasks.value // 执行失败的token(标记为重试) await startBatchExecution(failedTokenIds, tasks, true) } ``` **逻辑分析**: - ✅ 正确筛选了 `status === 'failed'` 的Token - ✅ 正确传递给 `startBatchExecution` - ❌ 日志信息不够详细,看不到具体哪些Token被重试 ### 可能的问题场景 #### 场景1:页面刷新后重试 ``` 1. 执行批量任务,3个Token失败 2. 用户刷新页面 3. taskProgress 数据丢失(不是持久化存储) 4. 点击"重试失败"按钮 5. failedTokenIds 为空数组 [] 6. 提示"没有失败的任务需要重试" ``` #### 场景2:关闭进度显示后重试 ``` 1. 执行批量任务,3个Token失败 2. 用户点击"关闭"按钮 3. 进度面板隐藏 4. taskProgress 仍然保留 5. 点击"重试失败"按钮 6. 应该能正常重试 ``` #### 场景3:日志信息不够清晰 ``` 1. 执行批量任务,3个Token失败 2. 点击"重试失败"按钮 3. 控制台只显示:"🔄 开始重试 3 个失败的任务" 4. 看不到具体是哪3个Token 5. 用户无法确认是否正确 ``` ## 解决方案 ### 增强日志输出 添加详细的重试信息日志,让用户能清楚看到哪些Token被重试: #### 修改前 ```javascript const retryFailedTasks = async () => { const failedTokenIds = Object.keys(taskProgress.value).filter( tokenId => taskProgress.value[tokenId].status === 'failed' ) if (failedTokenIds.length === 0) { console.warn('⚠️ 没有失败的任务需要重试') return } console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`) const tasks = currentTemplateTasks.value await startBatchExecution(failedTokenIds, tasks, true) } ``` #### 修改后 ```javascript const retryFailedTasks = async () => { // 获取所有失败的token ID const failedTokenIds = Object.keys(taskProgress.value).filter( tokenId => taskProgress.value[tokenId].status === 'failed' ) if (failedTokenIds.length === 0) { console.warn('⚠️ 没有失败的任务需要重试') return } // 🆕 详细的重试信息日志 console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`) console.log(`🔄 开始重试失败任务`) console.log(`📊 失败Token数量: ${failedTokenIds.length}`) console.log(`📋 失败Token列表:`, failedTokenIds) console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`) const tasks = currentTemplateTasks.value await startBatchExecution(failedTokenIds, tasks, true) } ``` ### 增强startBatchExecution的日志 在重试模式下,显示具体要执行的Token列表: #### 修改前 ```javascript console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`) console.log(`📋 Token数量: ${targetTokens.length}`) console.log(`📋 任务列表:`, targetTasks) ``` #### 修改后 ```javascript console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`) console.log(`📋 Token数量: ${targetTokens.length}`) // 🆕 重试模式下显示Token列表 if (isRetry) { console.log(`📋 重试Token列表:`, targetTokens) } console.log(`📋 任务列表:`, targetTasks) ``` ## 修改文件 ### src/stores/batchTaskStore.js **修改位置1**: Line 2053-2057 (retryFailedTasks) - 添加分隔线和详细的日志输出 - 显示失败Token的数量和具体列表 **修改位置2**: Line 320-322 (startBatchExecution) - 在重试模式下显示Token列表 ## 控制台输出效果 ### 修改前 ``` 🔄 开始重试 3 个失败的任务 🚀 开始批量执行任务 (重试) 📋 Token数量: 3 📋 任务列表: ['dailyFix', 'legionSignIn', ...] ``` ### 修改后 ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄 开始重试失败任务 📊 失败Token数量: 3 📋 失败Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...'] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 开始批量执行任务 (重试) 📋 Token数量: 3 📋 重试Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...'] 📋 任务列表: ['dailyFix', 'legionSignIn', 'autoStudy', ...] ``` ## 诊断指南 ### 如何确认重试功能是否正常工作? #### 步骤1:执行批量任务 1. 开始执行批量任务 2. 等待执行完成 3. 观察统计信息: ``` 成功: 97 失败: 3 ``` #### 步骤2:点击"重试失败"按钮 1. 点击"重试失败 (3个)"按钮 2. 打开浏览器控制台(F12) 3. 观察日志输出 #### 步骤3:验证日志信息 **预期日志**: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄 开始重试失败任务 📊 失败Token数量: 3 📋 失败Token列表: ['Token1', 'Token2', 'Token3'] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 开始批量执行任务 (重试) 📋 Token数量: 3 📋 重试Token列表: ['Token1', 'Token2', 'Token3'] ``` **验证要点**: - ✅ 失败Token数量 = 重试Token数量 = 3 - ✅ 失败Token列表与重试Token列表一致 - ✅ 只执行失败的3个Token,不执行成功的97个 ### 常见问题诊断 #### 问题1:显示"没有失败的任务需要重试" ``` 控制台输出: ⚠️ 没有失败的任务需要重试 ``` **可能原因**: 1. **页面已刷新**:taskProgress 数据丢失 2. **已全部重试成功**:所有失败任务都已重试成功 3. **进度数据被清空**:某个操作清空了 taskProgress **解决方法**: - 重新执行批量任务 - 不要刷新页面 - 失败后立即重试 #### 问题2:重试的Token数量不对 ``` 预期:3个失败 实际:重试了100个 控制台输出: 📊 失败Token数量: 3 📋 Token数量: 100 ← 数量不一致! ``` **可能原因**: - 代码逻辑错误 - targetTokens 被错误覆盖 **排查方法**: - 检查 `📋 重试Token列表` 是否正确 - 检查是否有其他代码修改了 targetTokens #### 问题3:重试后仍然失败 ``` 第1次执行:失败 3个 重试:失败 3个(相同的Token) ``` **可能原因**: 1. **错误原因未解决**:如未加入俱乐部 2. **临时性错误**:网络问题、服务器繁忙 3. **配置问题**:任务配置不正确 **解决方法**: - 检查失败的具体错误信息 - 解决根本原因(如加入俱乐部) - 调整任务配置或参数 ## 技术实现 ### 重试流程 ``` 用户点击"重试失败" ↓ handleRetryFailed() (BatchTaskPanel.vue) ↓ batchStore.retryFailedTasks() ↓ 筛选失败的Token: filter(status === 'failed') ↓ 输出详细日志(新增) ↓ startBatchExecution(failedTokenIds, tasks, true) ↓ 执行失败的Token ``` ### 数据流 ``` taskProgress = { 'token1': { status: 'completed', ... }, 'token2': { status: 'failed', ... }, ← 筛选 'token3': { status: 'completed', ... }, 'token4': { status: 'failed', ... }, ← 筛选 'token5': { status: 'failed', ... }, ← 筛选 } ↓ failedTokenIds = ['token2', 'token4', 'token5'] ↓ startBatchExecution(failedTokenIds, tasks, true) ↓ 只执行 token2, token4, token5 ``` ### 日志格式说明 **分隔线**: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` 作用:区分不同的日志块,提高可读性 **信息格式**: ``` 🔄 开始重试失败任务 ← 主标题 📊 失败Token数量: 3 ← 统计信息 📋 失败Token列表: [...] ← 详细列表 ``` ## 测试场景 ### 场景1:正常重试 ``` 前置条件: - 执行100个Token - 3个失败,97个成功 操作: 1. 点击"重试失败 (3个)"按钮 预期结果: 控制台输出: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄 开始重试失败任务 📊 失败Token数量: 3 📋 失败Token列表: ['Token2', 'Token4', 'Token5'] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 开始批量执行任务 (重试) 📋 Token数量: 3 📋 重试Token列表: ['Token2', 'Token4', 'Token5'] 验证: ✅ 数量一致 ✅ Token列表一致 ✅ 只执行3个Token ``` ### 场景2:无失败任务 ``` 前置条件: - 执行100个Token - 全部成功 操作: 1. 点击"重试失败 (0个)"按钮(如果显示) 预期结果: ⚠️ 没有失败的任务需要重试 (或按钮禁用/隐藏) ``` ### 场景3:页面刷新后重试 ``` 前置条件: - 执行100个Token - 3个失败 操作: 1. 刷新页面(F5) 2. 尝试点击"重试失败"按钮 预期结果: ⚠️ 没有失败的任务需要重试 (taskProgress 数据丢失) 建议: 添加持久化存储以支持刷新后重试 ``` ## 最佳实践 ### 1. 重试前的检查 ```javascript // ✅ 好的做法:检查是否有失败的任务 if (failedTokenIds.length === 0) { console.warn('⚠️ 没有失败的任务需要重试') return } // ❌ 不好的做法:不检查直接执行 await startBatchExecution(failedTokenIds, tasks, true) ``` ### 2. 详细的日志输出 ```javascript // ✅ 好的做法:输出详细信息 console.log(`📊 失败Token数量: ${failedTokenIds.length}`) console.log(`📋 失败Token列表:`, failedTokenIds) // ❌ 不好的做法:只输出数量 console.log(`重试 ${failedTokenIds.length} 个`) ``` ### 3. 使用分隔线 ```javascript // ✅ 好的做法:使用分隔线区分日志块 console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`) console.log(`🔄 开始重试失败任务`) console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`) // ❌ 不好的做法:日志混在一起 console.log(`🔄 开始重试失败任务`) ``` ## 未来改进 ### 1. 持久化失败记录 ```javascript // 将失败的Token保存到localStorage const saveFailedTokens = (failedTokenIds) => { localStorage.setItem('failedTokens', JSON.stringify({ tokenIds: failedTokenIds, timestamp: Date.now() })) } // 页面刷新后恢复失败记录 const loadFailedTokens = () => { const saved = localStorage.getItem('failedTokens') if (saved) { const data = JSON.parse(saved) // 检查是否过期(如24小时) if (Date.now() - data.timestamp < 24 * 60 * 60 * 1000) { return data.tokenIds } } return [] } ``` ### 2. 失败原因分析 ```javascript // 统计失败原因 const failureReasons = failedTokenIds.map(tokenId => { const progress = taskProgress.value[tokenId] return { tokenId, error: progress.error, failedTasks: Object.keys(progress.result || {}).filter( taskId => !progress.result[taskId].success ) } }) console.log(`📊 失败原因统计:`, failureReasons) ``` ### 3. 智能重试建议 ```javascript // 分析失败原因并给出建议 const analyzeFailures = (failedTokenIds) => { const clubErrors = failedTokenIds.filter(id => taskProgress.value[id].error?.includes('未加入俱乐部') ) if (clubErrors.length > 0) { console.warn(`⚠️ ${clubErrors.length} 个Token因未加入俱乐部失败`) console.log(`💡 建议:请先让这些账号加入俱乐部再重试`) } } ``` ## 相关版本 - **v3.7.0**: 首次添加自动重试功能 - **v3.12.6**: 增强重试日志输出(本版本) ## 总结 **问题**: - ⚠️ 重试时日志信息不够详细 - ⚠️ 无法确认哪些Token被重试 - ⚠️ 难以诊断重试问题 **改进**: - ✅ 添加详细的重试信息日志 - ✅ 显示失败Token数量和具体列表 - ✅ 使用分隔线提高可读性 - ✅ 重试模式下显示Token列表 **效果**: - ✅ 用户可以清楚看到哪些Token被重试 - ✅ 便于验证重试功能是否正常工作 - ✅ 便于诊断重试问题 - ✅ 提高透明度和可信度 --- **状态**: ✅ 已改进 **版本**: v3.12.6