This commit is contained in:
2025-10-17 20:56:50 +08:00
commit 90094ccd5a
342 changed files with 144988 additions and 0 deletions

View File

@@ -0,0 +1,528 @@
# 问题修复 - 重试失败日志增强 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