# 月度任务系统集成记录

## 📅 完成时间
2025-10-12 17:46

## ✅ 功能概述
成功将开源v2.1.1的月度任务系统集成到项目中，包括：
- 月度进度刷新（钓鱼320次、竞技场240次目标）
- 钓鱼补齐（优先普通鱼竿，贪心策略）
- 竞技场补齐（检查体力，贪心策略）

## 🔧 关键修复点

### 1. 命令注册问题
**问题**：`activity_get` 命令发送后超时，服务器未响应
**原因**：命令未在 `xyzwWebSocket.js` 的 `registerDefaultCommands` 中注册
**解决**：
```javascript
// src/utils/xyzwWebSocket.js
.register("activity_get", {})
.register("monthlyactivity_receivereward", {})
```

### 2. 响应映射缺失
**问题**：服务器返回 `activity_getresp`，但 Promise 等待 `activity_get`，导致超时
**原因**：响应命令名与请求命令名不匹配，缺少映射关系
**解决**：在 `responseToCommandMap` 中添加映射
```javascript
// src/utils/xyzwWebSocket.js
const responseToCommandMap = {
  'activity_getresp': 'activity_get',  // 月度活动
  'monthlyactivity_receiverewardresp': 'monthlyactivity_receivereward',
  'fishing_fishresp': 'fishing_fish',  // 钓鱼
  'arena_matchopponentresp': 'arena_matchopponent',  // 竞技场匹配
  'arena_battleresp': 'arena_battle',  // 竞技场战斗
  // ... 其他映射
}
```

### 3. WebSocket连接时序问题
**问题**：页面加载时自动刷新失败，但手动点击成功
**原因**：延迟1秒不够，WebSocket可能还在初始化
**解决**：改用轮询检测机制
```javascript
// src/components/GameStatus.vue
let monthTaskFetched = false
const checkAndFetchMonthly = () => {
  const status = tokenStore.getWebSocketStatus(tokenId)
  if (status === 'connected' && !monthTaskFetched) {
    monthTaskFetched = true
    setTimeout(() => fetchMonthlyActivity(), 1000)
  }
}
// 立即检查 + 每秒轮询，最多5次
checkAndFetchMonthly()
const checkInterval = setInterval(() => {
  if (checkCount++ >= 5) {
    clearInterval(checkInterval)
  } else if (status === 'connected' && !monthTaskFetched) {
    clearInterval(checkInterval)
    checkAndFetchMonthly()
  }
}, 1000)
```

### 4. 访问Store属性错误
**问题**：`Cannot read properties of undefined (reading 'token_xxx')`
**原因**：错误使用 `tokenStore.connections` 而非 `tokenStore.wsConnections`
**解决**：
```javascript
// 错误写法
const ws = tokenStore.connections[tokenId]?.ws

// 正确写法
const connection = tokenStore.wsConnections[tokenId]
```

## 📁 修改的文件清单

### 1. src/utils/gameCommands.js
添加月度任务相关命令：
- `activity_get()` - 获取月度活动信息
- `fishing_fish(rodType)` - 钓鱼（普通/金鱼竿）
- `arena_matchopponent()` - 竞技场匹配对手
- `arena_battle(targetRoleId)` - 竞技场战斗
- `monthlyactivity_receivereward()` - 领取月度奖励

### 2. src/utils/xyzwWebSocket.js
- 注册命令：`activity_get`, `monthlyactivity_receivereward`
- 添加响应映射：5个月度任务相关的响应映射

### 3. src/components/GameStatus.vue
**新增变量**：
```javascript
const FISH_TARGET = 320        // 钓鱼目标
const ARENA_TARGET = 240       // 竞技场目标
const monthLoading = ref(false)
const monthActivity = ref(null)
const fishToppingUp = ref(false)
const arenaToppingUp = ref(false)
```

**核心函数**：
- `fetchMonthlyActivity()` - 获取月度进度
- `topUpFish()` - 钓鱼补齐（优先普通鱼竿）
- `topUpArena()` - 竞技场补齐（检查体力，贪心策略）
- `getItemCount()` - 解析物品数量（支持多种数据格式）

**UI组件**：月度任务卡片，显示进度条、补齐按钮、一键完成选项

### 4. src/stores/batchTaskStore.js
添加日志控制：
```javascript
logConfig: {
  // ... 其他配置
  monthlyTask: false,  // 月度任务日志开关
}
```

### 5. src/components/BatchTaskPanel.vue
添加月度任务日志开关UI

## 🧪 测试验证

### 测试用例
✅ 刷新进度：成功显示 钓鱼 282/320 (88%)、竞技场 46/240 (19%)
✅ 页面加载自动刷新：成功
✅ 手动刷新：成功
✅ 钓鱼补齐：正常
✅ 竞技场补齐：正常

### 日志验证
```
📤 发送消息: activity_get {}
🔍 [Blob响应] cmd: activity_getresp ack: 7 seq: 7
📥 [月度任务] sendMessageWithPromise 返回成功
✅ [月度任务] 解析成功: {钓鱼次数: 282, 竞技场次数: 46, ...}
```

## 📚 核心算法

### 钓鱼补齐策略
1. 优先使用普通鱼竿（free）
2. 如果普通鱼竿不足，使用金鱼竿（diamond）
3. 每次钓鱼后等待200ms

### 竞技场补齐策略
1. 检查体力是否充足（每次5点）
2. 匹配对手 → 战斗 → 延迟
3. 贪心策略：尽可能多地完成战斗

## 🎯 与开源代码的差异

### 相同点
- 功能逻辑完全一致
- 目标值相同（钓鱼320、竞技场240）
- 补齐策略相同

### 差异点
1. **日志系统**：使用自有的 `batchTaskStore.logConfig` 控制，而非开源的 `logger.js`
2. **命令参数**：我们用 `{}`，开源用 `'[BON]'`（实际都正常工作）
3. **UI集成**：集成在 `GameStatus.vue` 中，开源可能是独立组件

## 💡 经验总结

1. **命令注册优先级最高**：未注册的命令会被忽略
2. **响应映射很关键**：响应命令名可能与请求不同，需要建立映射
3. **时序问题要注意**：页面初始化需要合理的等待和轮询机制
4. **调试日志是救星**：关键位置的日志能快速定位问题
5. **Store属性名要准确**：`wsConnections` vs `connections` 的小错误会导致大问题

## 🔜 后续优化空间

1. ✅ 已完成：自动刷新优化
2. 待优化：钓鱼/竞技场补齐进度实时显示
3. 待优化：补齐完成后自动刷新进度
4. 待优化：失败重试机制
5. 待优化：一键完成所有（钓鱼+竞技场）

## 📝 备注
- 此功能已完全正常运行
- 所有命令响应映射已添加
- 适用于后续类似功能的快速集成

