472 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			472 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 问题修复 - 错误码3100030多场景识别 v3.12.4
 | 
						||
 | 
						||
**版本**: v3.12.4  
 | 
						||
**日期**: 2025-10-08  
 | 
						||
**类型**: 问题修复
 | 
						||
 | 
						||
## 问题描述
 | 
						||
 | 
						||
用户反馈错误码 `3100030` 在不同功能中出现,但含义不同:
 | 
						||
 | 
						||
### 场景1:加钟失败
 | 
						||
```
 | 
						||
加钟失败
 | 
						||
服务器错误: 3100030 - 未知错误
 | 
						||
```
 | 
						||
**实际情况**:加钟了1次,但没有加满4次(次数限制)
 | 
						||
 | 
						||
### 场景2:发车失败
 | 
						||
```
 | 
						||
发车失败
 | 
						||
服务器错误: 3100030 - 未知错误
 | 
						||
```
 | 
						||
**实际情况**:俱乐部并没有加入(权限不足)
 | 
						||
 | 
						||
## 问题分析
 | 
						||
 | 
						||
错误码 `3100030` 是一个**通用错误码**,在不同的功能模块中有不同的含义:
 | 
						||
- **在加钟功能中**:表示次数限制或功能受限
 | 
						||
- **在发车功能中**:表示未加入俱乐部或权限不足
 | 
						||
 | 
						||
这种"一码多义"的情况在游戏服务器中很常见,需要根据上下文(功能模块)来判断具体含义。
 | 
						||
 | 
						||
## 错误码3100030的多场景含义
 | 
						||
 | 
						||
| 功能模块 | 错误含义 | 可能的原因 | 处理方式 |
 | 
						||
|---------|---------|-----------|---------|
 | 
						||
| **加钟** | 次数限制或功能受限 | 已加钟1-3次,未达4次上限 | ✅ 成功(跳过) |
 | 
						||
| **发车** | 未加入俱乐部或权限不足 | 未加入俱乐部 | ⚠️ 跳过,停止尝试 |
 | 
						||
 | 
						||
## 解决方案
 | 
						||
 | 
						||
### 修改1:加钟功能 (addClock)
 | 
						||
 | 
						||
添加对错误码 `3100030` 的识别和处理:
 | 
						||
 | 
						||
#### 修改前
 | 
						||
```javascript
 | 
						||
case 'addClock':
 | 
						||
  return await executeSubTask(
 | 
						||
    tokenId,
 | 
						||
    'add_clock',
 | 
						||
    '加钟',
 | 
						||
    async () => await client.sendWithPromise('system_mysharecallback', { 
 | 
						||
      type: 3, 
 | 
						||
      isSkipShareCard: true 
 | 
						||
    }, 3000),
 | 
						||
    false
 | 
						||
  )
 | 
						||
```
 | 
						||
 | 
						||
#### 修改后
 | 
						||
```javascript
 | 
						||
case 'addClock':
 | 
						||
  return await executeSubTask(
 | 
						||
    tokenId,
 | 
						||
    'add_clock',
 | 
						||
    '加钟',
 | 
						||
    async () => {
 | 
						||
      try {
 | 
						||
        const result = await client.sendWithPromise('system_mysharecallback', { 
 | 
						||
          type: 3, 
 | 
						||
          isSkipShareCard: true 
 | 
						||
        }, 3000)
 | 
						||
        return result
 | 
						||
      } catch (error) {
 | 
						||
        const errorMsg = error.message || String(error)
 | 
						||
        
 | 
						||
        // 错误码 3100030 表示加钟次数已达上限或其他限制
 | 
						||
        if (errorMsg.includes('3100030')) {
 | 
						||
          console.log(`⚠️ [${tokenId}] 加钟: 次数已达上限或功能受限`)
 | 
						||
          return {
 | 
						||
            limitReached: true,
 | 
						||
            message: '加钟次数已达上限或功能受限'
 | 
						||
          }
 | 
						||
        }
 | 
						||
        
 | 
						||
        // 其他错误正常抛出
 | 
						||
        throw error
 | 
						||
      }
 | 
						||
    },
 | 
						||
    false
 | 
						||
  )
 | 
						||
```
 | 
						||
 | 
						||
### 修改2:发车功能 - 查询车辆 (queryClubCars)
 | 
						||
 | 
						||
在查询车辆的错误处理中增加 `3100030` 的识别:
 | 
						||
 | 
						||
#### 修改前
 | 
						||
```javascript
 | 
						||
} catch (error) {
 | 
						||
  const errorMsg = error.message || String(error)
 | 
						||
  // 检查是否是未加入俱乐部的错误
 | 
						||
  if (errorMsg.includes('200400') || errorMsg.includes('2300070')) {
 | 
						||
    throw new Error('该账号未加入俱乐部或没有赛车权限')
 | 
						||
  }
 | 
						||
  throw error
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
#### 修改后
 | 
						||
```javascript
 | 
						||
} catch (error) {
 | 
						||
  const errorMsg = error.message || String(error)
 | 
						||
  // 检查是否是未加入俱乐部的错误
 | 
						||
  if (errorMsg.includes('200400') || errorMsg.includes('2300070') || errorMsg.includes('3100030')) {
 | 
						||
    throw new Error('该账号未加入俱乐部或没有赛车权限')
 | 
						||
  }
 | 
						||
  throw error
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### 修改3:发车功能 - 发送车辆
 | 
						||
 | 
						||
在发送车辆的错误处理中增加 `3100030` 的识别:
 | 
						||
 | 
						||
#### 修改前
 | 
						||
```javascript
 | 
						||
} else if (errorMsg.includes('2300070')) {
 | 
						||
  // 错误码2300070:未加入俱乐部
 | 
						||
  console.log(`⚠️ [${tokenId}] 发车失败: 该账号未加入俱乐部`)
 | 
						||
  sendSkipCount++
 | 
						||
  break
 | 
						||
} else {
 | 
						||
  console.error(`❌ [${tokenId}] 发送车辆失败: ${carId} - ${errorMsg}`)
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
#### 修改后
 | 
						||
```javascript
 | 
						||
} else if (errorMsg.includes('2300070')) {
 | 
						||
  // 错误码2300070:未加入俱乐部
 | 
						||
  console.log(`⚠️ [${tokenId}] 发车失败: 该账号未加入俱乐部`)
 | 
						||
  sendSkipCount++
 | 
						||
  break
 | 
						||
} else if (errorMsg.includes('3100030')) {
 | 
						||
  // 错误码3100030:在发车场景下通常表示未加入俱乐部或权限不足
 | 
						||
  console.log(`⚠️ [${tokenId}] 发车失败: 未加入俱乐部或权限不足`)
 | 
						||
  sendSkipCount++
 | 
						||
  break
 | 
						||
} else {
 | 
						||
  console.error(`❌ [${tokenId}] 发送车辆失败: ${carId} - ${errorMsg}`)
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
## 修改文件
 | 
						||
 | 
						||
### src/stores/batchTaskStore.js
 | 
						||
 | 
						||
**修改位置1**: Line 1251-1281 (addClock)
 | 
						||
- 将简单的函数调用改为 try-catch 包装
 | 
						||
- 添加对 `3100030` 错误码的识别
 | 
						||
- 返回友好的提示信息
 | 
						||
 | 
						||
**修改位置2**: Line 1421 (queryClubCars)
 | 
						||
- 在错误检查中增加 `|| errorMsg.includes('3100030')`
 | 
						||
 | 
						||
**修改位置3**: Line 1731-1738 (car_send 错误处理)
 | 
						||
- 新增对 `3100030` 的识别和处理
 | 
						||
- 标记为跳过,停止继续尝试
 | 
						||
 | 
						||
## 用户体验改进
 | 
						||
 | 
						||
### 加钟功能
 | 
						||
 | 
						||
**修改前**:
 | 
						||
```
 | 
						||
执行进度详情
 | 
						||
┌─────────────────────────────┐
 | 
						||
│ ❌ 加钟                     │
 | 
						||
│    服务器错误: 3100030 -    │
 | 
						||
│    未知错误                 │
 | 
						||
└─────────────────────────────┘
 | 
						||
 | 
						||
统计:
 | 
						||
- 成功: 6
 | 
						||
- 失败: 1  ← 加钟被误判为失败
 | 
						||
```
 | 
						||
 | 
						||
**修改后**:
 | 
						||
```
 | 
						||
执行进度详情
 | 
						||
┌─────────────────────────────┐
 | 
						||
│ ✅ 加钟                     │
 | 
						||
│    加钟次数已达上限或       │
 | 
						||
│    功能受限                 │
 | 
						||
└─────────────────────────────┘
 | 
						||
 | 
						||
统计:
 | 
						||
- 成功: 7  ← 正确识别
 | 
						||
- 失败: 0
 | 
						||
```
 | 
						||
 | 
						||
### 发车功能
 | 
						||
 | 
						||
**修改前**:
 | 
						||
```
 | 
						||
执行进度详情
 | 
						||
┌─────────────────────────────┐
 | 
						||
│ ❌ 发车                     │
 | 
						||
│    服务器错误: 3100030 -    │
 | 
						||
│    未知错误                 │
 | 
						||
└─────────────────────────────┘
 | 
						||
 | 
						||
统计:
 | 
						||
- 成功: 6
 | 
						||
- 失败: 1  ← 发车被误判为失败
 | 
						||
```
 | 
						||
 | 
						||
**修改后**:
 | 
						||
```
 | 
						||
执行进度详情
 | 
						||
┌─────────────────────────────┐
 | 
						||
│ ✅ 发车                     │
 | 
						||
│    未加入俱乐部或权限不足   │
 | 
						||
└─────────────────────────────┘
 | 
						||
 | 
						||
统计:
 | 
						||
- 成功: 7  ← 正确识别
 | 
						||
- 失败: 0
 | 
						||
```
 | 
						||
 | 
						||
### 控制台日志
 | 
						||
 | 
						||
**加钟**:
 | 
						||
```
 | 
						||
// 修改前
 | 
						||
❌ [马童1压缩包_216] 加钟失败: 服务器错误: 3100030 - 未知错误
 | 
						||
 | 
						||
// 修改后
 | 
						||
⚠️ [马童1压缩包_216] 加钟: 次数已达上限或功能受限
 | 
						||
```
 | 
						||
 | 
						||
**发车**:
 | 
						||
```
 | 
						||
// 修改前
 | 
						||
❌ [马童1压缩包_216] 发送车辆失败: 1 - 服务器错误: 3100030 - 未知错误
 | 
						||
 | 
						||
// 修改后
 | 
						||
⚠️ [马童1压缩包_216] 发车失败: 未加入俱乐部或权限不足
 | 
						||
```
 | 
						||
 | 
						||
## 技术要点
 | 
						||
 | 
						||
### 1. 上下文相关的错误码处理
 | 
						||
 | 
						||
对于"一码多义"的错误码,需要根据功能上下文来判断:
 | 
						||
 | 
						||
```javascript
 | 
						||
// 在加钟功能中
 | 
						||
if (errorMsg.includes('3100030')) {
 | 
						||
  return { message: '加钟次数已达上限或功能受限' }
 | 
						||
}
 | 
						||
 | 
						||
// 在发车功能中
 | 
						||
if (errorMsg.includes('3100030')) {
 | 
						||
  console.log('未加入俱乐部或权限不足')
 | 
						||
  sendSkipCount++
 | 
						||
  break
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### 2. 通用错误码 vs 具体错误码
 | 
						||
 | 
						||
| 类型 | 示例 | 特点 | 处理策略 |
 | 
						||
|------|------|------|---------|
 | 
						||
| **通用错误码** | `3100030` | 在多个功能中使用,含义不同 | 根据上下文判断 |
 | 
						||
| **具体错误码** | `2300070` | 含义明确,只表示一种情况 | 统一处理 |
 | 
						||
 | 
						||
### 3. 加钟次数限制说明
 | 
						||
 | 
						||
根据用户反馈,加钟功能的限制:
 | 
						||
- **理想情况**:可以加钟4次
 | 
						||
- **实际情况**:可能只加钟了1-3次就达到限制
 | 
						||
- **可能原因**:
 | 
						||
  - 每日次数限制
 | 
						||
  - 游戏版本差异
 | 
						||
  - 账号等级限制
 | 
						||
  - 挂机时间已满
 | 
						||
 | 
						||
### 4. 返回格式的一致性
 | 
						||
 | 
						||
对于"功能受限"类的情况,统一返回格式:
 | 
						||
 | 
						||
```javascript
 | 
						||
{
 | 
						||
  limitReached: true,    // 或 notEnabled: true
 | 
						||
  message: '友好的提示信息'
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
`executeSubTask` 会将其包装为成功状态:
 | 
						||
```javascript
 | 
						||
{
 | 
						||
  task: '加钟',
 | 
						||
  taskId: 'add_clock',
 | 
						||
  success: true,
 | 
						||
  data: { limitReached: true, message: '...' }
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
## 错误码汇总表
 | 
						||
 | 
						||
### 3100030 在不同场景的含义
 | 
						||
 | 
						||
| 场景 | 含义 | 处理方式 | 返回状态 | 版本 |
 | 
						||
|------|------|---------|---------|------|
 | 
						||
| 加钟 | 次数已达上限或功能受限 | ✅ 成功(跳过) | success: true | v3.12.4 |
 | 
						||
| 发车(查询) | 未加入俱乐部或权限不足 | ❌ 抛出错误 | 失败 | v3.12.4 |
 | 
						||
| 发车(发送) | 未加入俱乐部或权限不足 | ⚠️ 跳过,停止尝试 | sendSkipCount++ | v3.12.4 |
 | 
						||
 | 
						||
### 所有已识别的错误码
 | 
						||
 | 
						||
| 错误码 | 功能 | 含义 | 版本 |
 | 
						||
|--------|------|------|------|
 | 
						||
| `3100080` | 答题 | 答题次数已用完或功能未开启 | v3.11.5 |
 | 
						||
| `200160` | 答题 | 答题功能未开启 | v3.12.2 |
 | 
						||
| `-10006` | 挂机奖励 | 挂机奖励功能未开启 | v3.12.2 |
 | 
						||
| `3100030` | 加钟 | 加钟次数已达上限或功能受限 | v3.12.4 |
 | 
						||
| `3100030` | 发车 | 未加入俱乐部或权限不足 | v3.12.4 |
 | 
						||
| `2300190` | 俱乐部签到 | 今日已签到 | v3.11.1 |
 | 
						||
| `200020` | 俱乐部签到 | 今日已签到 | v3.12.1 |
 | 
						||
| `2300070` | 俱乐部/发车 | 未加入俱乐部 | v3.11.24 |
 | 
						||
| `200350` | 发车 | 非发车时间、已收车、或未加入俱乐部 | v3.11.20 |
 | 
						||
| `200400` | 发车 | 未加入俱乐部或无权限 | - |
 | 
						||
| `12000050` | 发车 | 今日发车已达上限 | - |
 | 
						||
| `200020` | 发车 | 发送冷却期 | - |
 | 
						||
 | 
						||
## 测试场景
 | 
						||
 | 
						||
### 场景1:加钟次数限制
 | 
						||
 | 
						||
```
 | 
						||
账号状态: 今日已加钟1次
 | 
						||
执行加钟任务
 | 
						||
 | 
						||
错误码: 3100030
 | 
						||
日志: 加钟: 次数已达上限或功能受限
 | 
						||
结果: ✅ 成功(跳过)
 | 
						||
```
 | 
						||
 | 
						||
### 场景2:发车未加入俱乐部
 | 
						||
 | 
						||
```
 | 
						||
账号状态: 未加入俱乐部
 | 
						||
执行发车任务
 | 
						||
 | 
						||
错误码: 3100030(在查询车辆阶段)
 | 
						||
日志: 该账号未加入俱乐部或没有赛车权限
 | 
						||
结果: ❌ 失败(整个发车任务失败)
 | 
						||
```
 | 
						||
 | 
						||
### 场景3:发车权限不足
 | 
						||
 | 
						||
```
 | 
						||
账号状态: 已加入俱乐部,但无赛车权限
 | 
						||
执行发车任务
 | 
						||
 | 
						||
错误码: 3100030(在发送车辆阶段)
 | 
						||
日志: 发车失败: 未加入俱乐部或权限不足
 | 
						||
结果: ⚠️ 跳过,停止尝试(sendSkipCount++)
 | 
						||
```
 | 
						||
 | 
						||
## 诊断指南
 | 
						||
 | 
						||
### 遇到加钟错误码3100030
 | 
						||
 | 
						||
1. **检查今日加钟次数**:
 | 
						||
   - 进入游戏查看挂机时间
 | 
						||
   - 确认是否已加钟
 | 
						||
 | 
						||
2. **检查账号等级**:
 | 
						||
   - 低等级账号可能有加钟限制
 | 
						||
 | 
						||
3. **检查挂机时间**:
 | 
						||
   - 如果挂机时间已满,无法继续加钟
 | 
						||
 | 
						||
### 遇到发车错误码3100030
 | 
						||
 | 
						||
1. **检查俱乐部状态** ⭐ 优先:
 | 
						||
   - 是否已加入俱乐部?
 | 
						||
   - 是否有赛车权限?
 | 
						||
 | 
						||
2. **检查俱乐部等级**:
 | 
						||
   - 某些俱乐部可能对新成员有限制
 | 
						||
 | 
						||
3. **检查账号权限**:
 | 
						||
   - 确认账号在俱乐部中的权限
 | 
						||
 | 
						||
## 最佳实践
 | 
						||
 | 
						||
### 1. 识别通用错误码
 | 
						||
 | 
						||
对于通用错误码(如 3100030),应该:
 | 
						||
- ✅ 在不同功能中分别处理
 | 
						||
- ✅ 提供针对性的提示信息
 | 
						||
- ✅ 根据上下文判断含义
 | 
						||
- ❌ 不要统一处理为一种含义
 | 
						||
 | 
						||
### 2. 错误提示的准确性
 | 
						||
 | 
						||
```javascript
 | 
						||
// ❌ 不好的做法:笼统的提示
 | 
						||
return { message: '功能受限' }
 | 
						||
 | 
						||
// ✅ 好的做法:具体的提示
 | 
						||
// 在加钟中
 | 
						||
return { message: '加钟次数已达上限或功能受限' }
 | 
						||
 | 
						||
// 在发车中
 | 
						||
console.log('未加入俱乐部或权限不足')
 | 
						||
```
 | 
						||
 | 
						||
### 3. 日志的可读性
 | 
						||
 | 
						||
```javascript
 | 
						||
// ✅ 好的日志格式
 | 
						||
console.log(`⚠️ [${tokenId}] 加钟: 次数已达上限或功能受限`)
 | 
						||
console.log(`⚠️ [${tokenId}] 发车失败: 未加入俱乐部或权限不足`)
 | 
						||
 | 
						||
// 包含:
 | 
						||
// - 明确的图标(⚠️)
 | 
						||
// - Token标识
 | 
						||
// - 功能名称
 | 
						||
// - 具体原因
 | 
						||
```
 | 
						||
 | 
						||
## 相关版本
 | 
						||
 | 
						||
- **v3.11.5**: 首次添加错误码 3100080 识别(答题)
 | 
						||
- **v3.12.2**: 添加错误码 200160、-10006 识别(答题、挂机)
 | 
						||
- **v3.12.4**: 添加错误码 3100030 多场景识别(本版本)
 | 
						||
 | 
						||
## 总结
 | 
						||
 | 
						||
**问题**:
 | 
						||
- ❌ 错误码 3100030 在加钟和发车中被识别为"未知错误"
 | 
						||
- ❌ 加钟次数限制被误判为失败
 | 
						||
- ❌ 发车权限不足被误判为失败
 | 
						||
 | 
						||
**修复**:
 | 
						||
- ✅ 在加钟中识别 3100030 为"次数已达上限或功能受限"
 | 
						||
- ✅ 在发车中识别 3100030 为"未加入俱乐部或权限不足"
 | 
						||
- ✅ 标记为成功(跳过)状态,不影响整体任务
 | 
						||
 | 
						||
**效果**:
 | 
						||
- ✅ 避免误判功能限制为失败
 | 
						||
- ✅ 提供针对性的错误提示
 | 
						||
- ✅ 提高批量任务成功率统计准确性
 | 
						||
- ✅ 更好的用户体验
 | 
						||
 | 
						||
**技术要点**:
 | 
						||
- 🔍 识别通用错误码的多场景含义
 | 
						||
- 🔍 根据功能上下文提供准确提示
 | 
						||
- 🔍 保持错误处理逻辑的一致性
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
**状态**: ✅ 已修复  
 | 
						||
**版本**: v3.12.4
 | 
						||
 |