# 🐛 BUG修复 - 统计数据修复 v3.13.5.6 ## 📋 修复的问题 ### 1. 总计数统计不准确 **问题描述**: 当选择"重新开始上一次进度"时,如果用户在此期间增加或删除了Token,总计数(total)会与实际Token数量不符。 **原因分析**: 系统从保存的进度中恢复统计数据时,直接使用了保存时的`total`值,没有检查当前Token列表是否发生了变化。 **修复方案**: ```javascript // 🔧 修复:检查当前token列表是否与保存的匹配 const currentAvailableTokenIds = tokenStore.gameTokens.map(t => t.id) const stillExistTokens = targetTokens.filter(id => currentAvailableTokenIds.includes(id)) const stillExistCompleted = completedTokenIds.filter(id => currentAvailableTokenIds.includes(id)) // 如果token数量有变化,更新列表并重新计算统计 if (stillExistTokens.length !== targetTokens.length) { console.warn(`⚠️ Token列表已变化:原${targetTokens.length}个 → 现${stillExistTokens.length}个`) targetTokens = stillExistTokens completedTokenIds = stillExistCompleted } // 使用当前实际token数量作为total executionStats.value = { ...executionStats.value, total: targetTokens.length, // 🔧 修复:使用当前实际token数量 success: savedProgress.value.stats.success, failed: savedProgress.value.stats.failed, skipped: savedProgress.value.stats.skipped } ``` **修复效果**: - ✅ 总计数始终反映当前实际的Token数量 - ✅ 自动过滤已删除的Token - ✅ 显示Token列表变化警告信息 --- ### 2. 失败原因不显示 **问题描述**: 任务执行过程中或刷新页面后继续执行时,失败原因统计不显示。 **原因分析**: 失败原因统计只在`finishBatchExecution()`(任务完成时)才会收集。如果: - 任务还在执行中 - 刷新页面后继续执行(之前的失败统计没保存) - 失败的token进度被清理掉了 就会导致失败原因无法显示。 **修复方案**: #### 步骤1:提取失败原因收集为独立函数 ```javascript /** * 🔧 v3.13.5.6: 收集当前所有失败Token的原因统计 * 提取为独立函数,供保存进度和完成任务时使用 */ const collectFailureReasons = () => { const failureReasons = {} Object.entries(taskProgress.value).forEach(([tokenId, progress]) => { if (progress.status === 'failed') { // ... 错误分类逻辑 ... failureReasons[reason] = (failureReasons[reason] || 0) + 1 } }) return failureReasons } ``` #### 步骤2:任务失败时实时更新统计 ```javascript // 在 updateTaskProgress 函数中 if (updates.status === 'failed' && updates.error) { // 重新收集并更新失败原因统计 failureReasonsStats.value = collectFailureReasons() } ``` #### 步骤3:保存失败原因统计到localStorage ```javascript const saveExecutionProgress = (completedTokenIds, allTokenIds, tasks) => { // 🔧 实时收集失败原因(不等到任务结束) const currentFailureReasons = collectFailureReasons() const progress = { // ... 其他字段 ... // 🔧 新增:保存失败原因统计 failureReasons: currentFailureReasons } storageCache.set('batchTaskProgress', progress) } ``` #### 步骤4:恢复时加载失败原因统计 ```javascript // 在继续执行时恢复失败原因统计 if (savedProgress.value.failureReasons) { failureReasonsStats.value = savedProgress.value.failureReasons console.log(`📊 已恢复失败原因统计:${Object.keys(savedProgress.value.failureReasons).length}种原因`) } ``` **修复效果**: - ✅ 任务失败时立即显示失败原因 - ✅ 刷新页面后能够显示之前的失败原因 - ✅ 执行过程中可以实时查看失败原因统计 - ✅ 代码更简洁(提取公共逻辑,减少重复代码100+行) --- ## 🎯 支持的错误类型 失败原因自动分类,支持以下错误类型: | 错误类型 | 匹配规则 | |---------|---------| | WebSocket连接超时 | `WebSocket未在...内连接` | | WebSocket连接失败 | `WebSocket未连接` / `连接失败` / `WebSocket is closed` | | 服务器维护时间 | `服务器维护时间` | | 请求超时 | `请求超时` / `timeout` | | 服务器限流 (200400) | `200400` | | 服务器限流 (200350) | `200350` | | 未加入俱乐部 (2300070) | `2300070` | | 未知错误 3100080 | `3100080` | | 未知错误 2300190 | `2300190` | | 其他错误 | 其他未分类错误 | **智能提取任务名称**: 如果错误信息包含任务名称,会自动提取并显示,例如: - `领取挂机奖励: WebSocket连接超时` - `一键补差: 服务器限流 (200400)` --- ## 📊 UI显示 修复后,失败原因统计会在以下情况显示: 1. **任务执行中**:任何Token失败后立即显示 2. **任务完成后**:显示完整的失败原因汇总 3. **刷新页面后**:继续执行时恢复之前的失败原因 4. **定时重试时**:保留之前轮次的失败统计 显示位置:批量任务面板 - 统计信息下方 ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━ 📋 失败原因统计 ━━━━━━━━━━━━━━━━━━━━━━━━━━ WebSocket连接超时 3个Token 服务器限流 (200400) 2个Token 未加入俱乐部 (2300070) 1个Token ━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` --- ## 🔍 调试信息 修复后会输出更详细的调试信息: ``` ⚠️ Token列表已变化:原300个 → 现295个 📊 已恢复失败原因统计:3种原因 ``` 在控制台(F12)中可以查看: - Token列表变化警告 - 失败原因恢复确认 - 详细的失败统计数据 --- ## 📂 修改的文件 - `src/stores/batchTaskStore.js` - 修复total计数逻辑(第487-517行) - 新增`collectFailureReasons()`函数(第363-441行) - 修改`saveExecutionProgress()`函数(第131-153行) - 修改`updateTaskProgress()`函数(第3416-3445行) - 简化`finishBatchExecution()`函数(第3490-3494行) --- ## ✅ 测试建议 1. **测试总计数修复**: - 开始一个批量任务,执行到一半 - 删除/添加几个Token - 刷新页面,选择"继续上一次进度" - 检查总计数是否正确反映当前Token数量 2. **测试失败原因显示**: - 开始批量任务,等待部分Token失败 - 检查是否立即显示失败原因统计 - 刷新页面,选择"继续上一次进度" - 检查之前的失败原因是否正确显示 3. **测试多轮重试**: - 启用自动重试功能 - 让部分Token持续失败 - 检查每轮重试后失败原因是否累积正确 --- ## 📌 版本信息 - **版本号**:v3.13.5.6 - **修复日期**:2025-10-11 - **影响范围**:批量任务执行统计功能 - **向后兼容**:是(旧版本保存的进度仍可继续) --- ## 💡 注意事项 1. **Token列表变化**:如果继续执行时Token列表变化较大,建议重新开始而不是继续上一次进度 2. **失败原因准确性**:失败原因分类依赖错误消息的关键词匹配,如遇到新的错误类型可能归为"其他错误" 3. **性能影响**:每次任务失败都会调用`collectFailureReasons()`,但由于只处理失败的Token,对性能影响极小 --- ## 🚀 未来优化方向 1. 支持更多错误类型的自动分类 2. 失败原因可视化图表展示 3. 失败Token一键导出/重试 4. 按失败原因筛选Token列表