# 月度任务系统集成记录 ## 📅 完成时间 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. 待优化:一键完成所有(钓鱼+竞技场) ## 📝 备注 - 此功能已完全正常运行 - 所有命令响应映射已添加 - 适用于后续类似功能的快速集成