Files
xyzw_web_helper/MD说明文件夹/问题修复-重试失败日志增强v3.12.6.md
2025-10-17 20:56:50 +08:00

529 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 问题修复 - 重试失败日志增强 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