# 修复宠物技能可用性判断逻辑 ## 任务时间 - 开始时间:2025年06月07日 11:17:02 CST - 完成时间:2025年06月07日 11:30:00 CST ## 问题描述 根据用户要求,宠物技能可用性应该使用宠物等级配置数据库表中的'可用技能'数据来判断,但目前代码中宠物技能表的 `min_level` 字段也参与了判断,这是错误的,需要进行修复。 ## 问题分析 当前系统中存在两套技能可用性判断逻辑: ### 正确的逻辑 - 使用宠物等级配置表(`pet_level_configs`)中的 `skills` 字段 - 该字段存储了每个等级可以使用的具体技能ID列表 - 这是设计上正确的判断方式 ### 错误的逻辑 - 使用宠物技能表(`pet_skills`)中的 `min_level` 字段 - 该字段定义了技能的最低等级要求 - 这种判断方式与设计要求不符 ## 修复方案 完全移除对 `min_level` 字段的依赖,统一使用宠物等级配置表中的 `skills` 字段进行技能可用性判断。 ## 修改文件 ### 1. PetService.php - **移除技能使用时的 min_level 检查**:删除 `$pet->level < $skill->min_level` 的判断 - **修复技能列表筛选逻辑**:移除 `getPetSkills` 方法中的 min_level 检查 - **保留 checkPetSkillAvailable 方法**:继续使用等级配置表进行检查 ### 2. PetSkillUseValidator.php - **移除 min_level 验证**:删除对 `$pet->level < $skill->min_level` 的检查 - **添加等级配置表检查**:新增 `checkPetSkillAvailable` 方法 - **统一错误信息**:使用"该技能在当前等级不可用"的错误提示 ### 3. PetDtoFactory.php - **修复技能筛选逻辑**:移除 `$pet->level >= $skill->min_level` 的判断 - **使用等级配置表检查**:调用 `checkPetSkillAvailable` 方法进行筛选 - **添加必要的方法**:新增 `checkPetSkillAvailable` 私有方法 ### 4. ProcessActiveSkillsCommand.php - **修复同步模式调用**:将 `$job->handle()` 改为 `$job->run()` - **解决队列相关错误**:避免在同步模式下调用队列相关方法 ## 技术实现细节 ### checkPetSkillAvailable 方法 ```php private static function checkPetSkillAvailable(PetUser $pet, int $skillId): bool { try { // 获取宠物当前等级的配置 $levelConfig = PetLevelConfig::where('pet_id', 1) ->where('level', $pet->level) ->first(); if (!$levelConfig) { // 如果没有配置,默认允许使用(向后兼容) return true; } // 检查技能是否在可用技能列表中 $availableSkills = $levelConfig->skills ?? []; return in_array($skillId, $availableSkills); } catch (\Exception $e) { // 发生错误时默认允许使用(向后兼容) return true; } } ``` ### 向后兼容性 - 如果等级配置不存在,默认允许使用技能 - 如果检查过程出错,默认允许使用技能 - 确保修复不会破坏现有功能 ## 测试验证 修复后执行宠物技能处理命令: ```bash php artisan pet:process-active-skills --sync ``` 执行结果: - 命令正常运行,无错误 - 处理了9个激活技能 - 各种技能(自动收获、自动杀虫、自动除草、自动浇水等)正常工作 - 统计信息正确记录 ## 影响范围 1. **技能使用验证**:现在完全基于等级配置表进行判断 2. **技能列表获取**:筛选逻辑统一使用等级配置表 3. **DTO创建**:宠物生活技能DTO创建时使用正确的筛选逻辑 4. **向后兼容**:保持了良好的向后兼容性 ## 注意事项 1. **min_level 字段保留**:虽然不再用于判断,但字段仍保留在数据库和模型中 2. **后台管理**:后台管理界面仍可以编辑 min_level 字段 3. **文档更新**:相关文档可能需要更新以反映新的判断逻辑 4. **数据一致性**:建议检查等级配置表数据的完整性 ## 提交信息 ``` 修复宠物技能可用性判断逻辑,移除对min_level字段的依赖 - 移除PetService中使用min_level字段进行技能可用性判断的逻辑 - 移除PetSkillUseValidator中的min_level检查,改用等级配置表检查 - 修复PetDtoFactory中的技能筛选逻辑,使用等级配置表而非min_level - 统一使用宠物等级配置表中的skills字段判断技能可用性 - 修复ProcessActiveSkillsCommand同步模式下的队列调用问题 - 确保所有技能可用性判断都基于宠物等级配置表,符合设计要求 ```