|
|
@@ -0,0 +1,114 @@
|
|
|
+# 修复宠物技能可用性判断逻辑
|
|
|
+
|
|
|
+## 任务时间
|
|
|
+- 开始时间: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同步模式下的队列调用问题
|
|
|
+- 确保所有技能可用性判断都基于宠物等级配置表,符合设计要求
|
|
|
+```
|