071117-修复宠物技能可用性判断逻辑.md 4.4 KB

修复宠物技能可用性判断逻辑

任务时间

  • 开始时间: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 方法

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;
    }
}

向后兼容性

  • 如果等级配置不存在,默认允许使用技能
  • 如果检查过程出错,默认允许使用技能
  • 确保修复不会破坏现有功能

测试验证

修复后执行宠物技能处理命令:

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同步模式下的队列调用问题
- 确保所有技能可用性判断都基于宠物等级配置表,符合设计要求