Files
xyzw_web_helper/MD说明文件夹/问题修复-批量加钟失败修复v3.13.4.md
2025-10-17 20:56:50 +08:00

482 lines
14 KiB
Markdown
Raw Permalink 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.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)