# 问题修复 - 批量加钟任务失败修复 v3.13.4

## 问题描述

**现象：**
- 批量自动化里的加钟任务失败
- 错误信息：`请求超时: system_mysharecallback (5000ms)`
- 实际游戏并没有加钟成功

**影响范围：**
- 批量任务中的 `addClock`（加钟）任务
- 用户在批量自动化中无法成功加钟，影响挂机奖励的获取

## 问题分析

### 原因定位

通过对比游戏功能模块和批量任务模块的加钟实现，发现了关键差异：

#### 1. 批量任务的加钟实现（修复前）
```javascript
// 位置：src/stores/batchTaskStore.js 第1642-1645行
const result = await client.sendWithPromise('system_mysharecallback', { 
  type: 3,  // ❌ 错误：使用了 type: 3
  isSkipShareCard: true 
}, 5000)
```

**问题：**
- 使用了错误的参数 `type: 3`
- 只发送1次请求
- 虽然设置了5000ms超时，但由于参数错误导致服务器无响应

#### 2. 游戏功能模块的加钟实现（正确的）
```javascript
// 位置：src/components/GameStatus.vue 第435-486行
for (let i = 0; i < 4; i++) {
  const result = tokenStore.sendMessage(tokenId, 'system_mysharecallback', {
    isSkipShareCard: true,
    type: 2  // ✅ 正确：使用 type: 2
  })
}
```

**正确做法：**
- 使用参数 `type: 2`（分享/加钟类型）
- 发送4次请求，每次间隔300ms
- 游戏功能模块能正常工作

### 参数含义

根据代码分析：
- `type: 2` - 分享游戏/加钟操作
- `type: 3` - 其他功能（可能是领取挂机奖励后的操作）

## 修复方案

### 修复内容

**修改文件：** `src/stores/batchTaskStore.js`

**修改位置：** 第1633-1692行（`addClock` 任务）

**核心改动：**

1. **参数修复：** `type: 3` → `type: 2`
2. **请求次数：** 1次 → 4次
3. **请求间隔：** 增加每次间隔300ms
4. **保持超时：** 维持5000ms超时（避免连接池模式下的网络拥堵）

### 修复后的代码

```javascript
case 'addClock':
  // 加钟（挂机时间延长）- 必须在领取挂机奖励之后
  // 🔧 修复：参考游戏功能模块的加钟逻辑，使用 type: 2 并发送4次
  return await executeSubTask(
    tokenId,
    'add_clock',
    '加钟',
    async () => {
      try {
        console.log(`🕐 [${tokenId}] 开始加钟操作（发送4次请求）`)
        
        // 🔧 关键修复：参考 GameStatus.vue 的 extendHangUp 函数
        // 发送4次分享回调请求，使用 type: 2（而不是 type: 3）
        const promises = []
        for (let i = 0; i < 4; i++) {
          const promise = (async () => {
            // 每次请求间隔300ms
            if (i > 0) {
              await new Promise(resolve => setTimeout(resolve, 300))
            }
            
            console.log(`🕐 [${tokenId}] 发送第${i+1}/4次加钟请求`)
            const result = await client.sendWithPromise('system_mysharecallback', {
              isSkipShareCard: true,
              type: 2  // 🔧 修复：使用 type: 2（分享/加钟），而不是 type: 3
            }, 5000)  // 保持5000ms超时，避免连接池模式下的网络拥堵
            
            console.log(`✅ [${tokenId}] 第${i+1}/4次加钟请求完成`)
            return result
          })()
          promises.push(promise)
        }
        
        // 等待所有请求完成
        const results = await Promise.all(promises)
        console.log(`✅ [${tokenId}] 加钟操作完成（已发送4次请求）`)
        
        return {
          success: true,
          message: '加钟完成',
          results: results
        }
      } catch (error) {
        const errorMsg = error.message || String(error)
        
        // 错误码 3100030 表示加钟次数已达上限或其他限制
        if (errorMsg.includes('3100030')) {
          console.log(`⚠️ [${tokenId}] 加钟: 次数已达上限或功能受限`)
          return {
            limitReached: true,
            message: '加钟次数已达上限或功能受限'
          }
        }
        
        // 其他错误正常抛出
        throw error
      }
    },
    false
  )
```

## 修复效果

### 预期效果

✅ **加钟任务成功执行**
- 发送4次 `system_mysharecallback` 请求（type: 2）
- 每次请求间隔300ms，确保稳定性
- 挂机时间成功延长

✅ **日志输出清晰**
```
🕐 [tokenId] 开始加钟操作（发送4次请求）
🕐 [tokenId] 发送第1/4次加钟请求
✅ [tokenId] 第1/4次加钟请求完成
🕐 [tokenId] 发送第2/4次加钟请求
✅ [tokenId] 第2/4次加钟请求完成
🕐 [tokenId] 发送第3/4次加钟请求
✅ [tokenId] 第3/4次加钟请求完成
🕐 [tokenId] 发送第4/4次加钟请求
✅ [tokenId] 第4/4次加钟请求完成
✅ [tokenId] 加钟操作完成（已发送4次请求）
```

✅ **错误处理完善**
- 识别错误码 3100030（次数上限）
- 超时保护（5000ms）
- 详细的错误日志

## 测试建议

### 测试步骤

1. **启动批量任务**（包含加钟任务）
   ```
   完整套餐 或 快速套餐
   ```

2. **观察控制台日志**
   - 检查是否输出 "开始加钟操作（发送4次请求）"
   - 检查是否成功发送4次请求
   - 检查是否有错误信息

3. **检查游戏内挂机时间**
   - 执行前记录挂机剩余时间
   - 执行后检查时间是否延长
   - 每次加钟应延长2小时（4次 × 30分钟）

### 预期结果

✅ **正常情况**
- 控制台显示4次加钟请求成功
- 游戏内挂机时间增加约2小时
- 任务状态显示 "加钟完成"

⚠️ **达到上限**
- 控制台显示 "加钟: 次数已达上限或功能受限"
- 任务仍标记为成功（不影响整体任务流程）

❌ **网络错误**
- 控制台显示具体错误信息
- 任务标记为失败（触发重试机制）

## 相关代码对比

### system_mysharecallback 参数类型说明

根据项目中的使用场景：

| type值 | 用途 | 位置 | 备注 |
|--------|------|------|------|
| `type: 2` | 分享游戏/加钟 | GameStatus.vue (extendHangUp)<br>batchTaskStore.js (分享游戏)<br>batchTaskStore.js (加钟) | ✅ 正确的加钟参数 |
| `type: 3` | 未明确 | ~~旧的加钟实现~~ | ❌ 导致加钟失败 |

### 一键补差中的分享任务

```javascript
// 位置：src/stores/batchTaskStore.js 第1124-1133行
const shareResult = await client.sendWithPromise('system_mysharecallback', {
  isSkipShareCard: true,
  type: 2  // 使用 type: 2
}, 3000)
```

**说明：** 一键补差中的"分享游戏"任务也使用 `type: 2`，进一步证实了参数的正确性。

## 技术细节

### 为什么要发送4次？

游戏服务器的加钟机制可能需要：
1. 每次分享回调可延长30分钟
2. 4次请求共延长2小时
3. 服务器可能有防作弊机制，需要多次确认

### 间隔300ms的作用

1. **避免请求过快**导致服务器拒绝
2. **确保每次请求独立处理**
3. **防止触发反作弊机制**

### 5000ms超时的意义

1. **连接池模式优化**：在连接池模式下，同时有多个Token在执行任务，网络可能拥堵
2. **避免误判**：较长的超时时间减少因网络波动导致的失败
3. **平衡性能**：不会因超时设置过长导致任务卡住

## 🔧 追加修复：串行执行问题（v3.13.4.1）

### 问题发现

用户反馈：虽然发送了4次请求，但**实际只加了3次钟**。

### 问题分析

原代码使用了**并发执行**：

```javascript
// ❌ 错误的并发执行
const promises = []
for (let i = 0; i < 4; i++) {
  const promise = (async () => {
    if (i > 0) {
      await new Promise(resolve => setTimeout(resolve, 300))
    }
    // 发送请求
  })()
  promises.push(promise)
}
await Promise.all(promises)
```

**实际执行时序：**
- **0ms:** 第1个请求发送 ✅
- **300ms:** 第2、3、4个请求**几乎同时发送** ❌

**问题根源：** 所有promise同时创建并启动，导致后3个请求在300ms后几乎同时到达服务器，可能被服务器识别为异常请求而拒绝其中1个。

### 修复方案

改为**串行执行**：

```javascript
// ✅ 正确的串行执行
const results = []
for (let i = 0; i < 4; i++) {
  // 每次请求前间隔300ms（第1次除外）
  if (i > 0) {
    await new Promise(resolve => setTimeout(resolve, 300))
  }
  
  const result = await client.sendWithPromise('system_mysharecallback', {
    isSkipShareCard: true,
    type: 2
  }, 5000)
  
  results.push(result)
}
```

**正确的执行时序：**
- **0ms:** 第1个请求发送 ✅
- **300ms:** 第2个请求发送 ✅
- **600ms:** 第3个请求发送 ✅
- **900ms:** 第4个请求发送 ✅

每次请求都有**300ms的间隔**，服务器可以正确处理每个请求。

---

## 🔄 再次调整：并行模式10次加钟（v3.13.4.2）

### 用户需求

用户要求：
1. 恢复使用**并行模式**（更快）
2. 增加加钟次数到**10次**（延长更多时间）

### 调整方案

**最终代码：**

```javascript
// ✅ 并行模式，发送10次加钟请求
const promises = []
for (let i = 0; i < 10; i++) {
  const promise = new Promise((resolve) => {
    setTimeout(() => {
      client.sendWithPromise('system_mysharecallback', {
        isSkipShareCard: true,
        type: 2  // 使用 type: 2（分享/加钟）
      }, 5000)
        .then(result => {
          console.log(`✅ 第${i+1}/10次加钟请求完成`)
          resolve(result)
        })
        .catch(error => {
          console.warn(`⚠️ 第${i+1}/10次加钟请求失败`)
          resolve(null) // 即使失败也resolve，不影响其他请求
        })
    }, i * 300) // 每次间隔300ms启动
  })
  promises.push(promise)
}

const results = await Promise.all(promises)
const successCount = results.filter(r => r !== null).length
console.log(`✅ 加钟操作完成（发送10次，成功${successCount}次）`)
```

**执行时序：**
- **0ms:** 第1个请求发送
- **300ms:** 第2个请求发送
- **600ms:** 第3个请求发送
- **900ms:** 第4个请求发送
- **1200ms:** 第5个请求发送
- **1500ms:** 第6个请求发送
- **1800ms:** 第7个请求发送
- **2100ms:** 第8个请求发送
- **2400ms:** 第9个请求发送
- **2700ms:** 第10个请求发送

**优势：**
- ⚡ 并行执行，总耗时约3秒（而非串行的4.5秒）
- 🛡️ 间隔300ms启动，避免瞬间压力
- 🔄 单个失败不影响其他请求
- 📊 统计成功次数，便于调试

**预期效果：**
- 每次加钟30分钟 × 10次 = **延长5小时**（如果全部成功）
- 即使部分失败，也能延长对应时间

---

## ⚡ 最终优化：一次性同时发送（v3.13.4.3）

### 用户需求

用户要求：**去掉所有延迟，一次性同时发送10个请求**

### 最终代码

```javascript
// ⚡ 一次性同时发送10次加钟请求（无延迟）
const promises = []
for (let i = 0; i < 10; i++) {
  console.log(`🕐 发送第${i+1}/10次加钟请求`)
  const promise = client.sendWithPromise('system_mysharecallback', {
    isSkipShareCard: true,
    type: 2  // 使用 type: 2（分享/加钟）
  }, 5000)
    .then(result => {
      console.log(`✅ 第${i+1}/10次加钟请求完成`)
      return result
    })
    .catch(error => {
      console.warn(`⚠️ 第${i+1}/10次加钟请求失败`)
      return null
    })
  
  promises.push(promise)
}

const results = await Promise.all(promises)
const successCount = results.filter(r => r !== null).length
console.log(`✅ 加钟操作完成（一次性发送10次，成功${successCount}次）`)
```

**特点：**
- ⚡ **极速执行** - 10个请求在0ms时刻同时发送
- 🔄 **完全并发** - 无任何延迟，最快速度
- 🛡️ **容错机制** - 单个失败不影响其他请求
- 📊 **成功统计** - 显示实际成功次数

---

## 版本信息

**最终版本：** v3.13.4.3

**修复日期：** 2025-01-09

**修改历程：**
1. ✅ v3.13.4：参数修复 `type: 3` → `type: 2`，4次请求
2. ✅ v3.13.4.1：改为串行执行，避免并发问题
3. ✅ v3.13.4.2：恢复并行模式，增加到10次，300ms间隔
4. ✅ v3.13.4.3：**去掉延迟，一次性同时发送10次（最终版）**

**影响范围：**
- ✅ 批量任务 - 加钟功能
- ✅ 完整套餐
- ✅ 快速套餐

**兼容性：**
- ✅ 传统模式
- ✅ 连接池模式（v3.13.0+）
- ✅ 100并发优化（v3.11.0+）

## 附录：完整修改记录

### 修改前（错误代码）
```javascript
const result = await client.sendWithPromise('system_mysharecallback', { 
  type: 3,  // ❌ 错误参数
  isSkipShareCard: true 
}, 5000)
```

### 修改后（正确代码）
```javascript
const promises = []
for (let i = 0; i < 4; i++) {
  const promise = (async () => {
    if (i > 0) {
      await new Promise(resolve => setTimeout(resolve, 300))
    }
    
    const result = await client.sendWithPromise('system_mysharecallback', {
      isSkipShareCard: true,
      type: 2  // ✅ 正确参数
    }, 5000)
    
    return result
  })()
  promises.push(promise)
}

const results = await Promise.all(promises)
```

## 总结

本次修复通过对比游戏功能模块和批量任务模块的加钟实现，发现并修正了参数错误：

1. **核心问题：** 参数 `type: 3` 应改为 `type: 2`
2. **次要优化：** 从发送1次改为发送4次，与游戏模块保持一致
3. **稳定性提升：** 增加请求间隔（300ms）和详细日志

修复后，批量加钟任务应能正常工作，与游戏内手动加钟效果一致。

---

**相关文档：**
- [连接池模式 v3.13.0](./架构优化-100并发稳定运行方案v3.13.0.md)
- [问题修复-加钟超时和发车错误码v3.11.20](./问题修复-加钟超时和发车错误码v3.11.20.md)
- [批量自动化-超时延迟配置表v3.11](./批量自动化-超时延迟配置表v3.11.md)

