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

