|
|
@@ -0,0 +1,215 @@
|
|
|
+# 修复宠物技能名称使用PET_SKILL_NAME枚举
|
|
|
+
|
|
|
+**时间**: 2025年06月06日 19:55
|
|
|
+**任务**: 修复 processSkillEffect 和 executeSkillEffect 方法中的硬编码技能名称,统一使用 PET_SKILL_NAME 枚举
|
|
|
+
|
|
|
+## 需求背景
|
|
|
+
|
|
|
+在代码审查中发现,宠物技能相关的代码中存在硬编码的技能名称字符串,这违反了代码规范,应该使用 PET_SKILL_NAME 枚举来统一管理技能名称。
|
|
|
+
|
|
|
+### 发现的问题
|
|
|
+
|
|
|
+1. **PetLogic::executeSkillEffect方法** - 使用硬编码字符串匹配技能名称
|
|
|
+2. **ProcessActiveSkillsJob::processSkillEffect方法** - 使用硬编码字符串匹配技能名称
|
|
|
+3. **PET_SKILL_NAME枚举不完整** - 缺少一些技能名称的定义
|
|
|
+
|
|
|
+### 硬编码字符串示例
|
|
|
+
|
|
|
+```php
|
|
|
+// PetLogic.php 中的问题代码
|
|
|
+switch ($skill->skill_name) {
|
|
|
+ case '自动收获':
|
|
|
+ return $this->activateAutoHarvestSkill($pet, $skill, $params);
|
|
|
+ case '自动种植':
|
|
|
+ return $this->activateAutoPlantSkill($pet, $skill, $params);
|
|
|
+ // ...
|
|
|
+}
|
|
|
+
|
|
|
+// ProcessActiveSkillsJob.php 中的问题代码
|
|
|
+switch ($activeSkill->skill_name) {
|
|
|
+ case '自动收菜':
|
|
|
+ $autoSkillLogic->processAutoHarvest($activeSkill);
|
|
|
+ break;
|
|
|
+ case '自动播种':
|
|
|
+ $autoSkillLogic->processAutoPlant($activeSkill);
|
|
|
+ break;
|
|
|
+ // ...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 实现方案
|
|
|
+
|
|
|
+### 1. 扩展PET_SKILL_NAME枚举
|
|
|
+
|
|
|
+首先完善枚举定义,添加缺失的技能名称:
|
|
|
+
|
|
|
+```php
|
|
|
+enum PET_SKILL_NAME: string
|
|
|
+{
|
|
|
+ case AUTO_WEEDING = '自动除草';
|
|
|
+ case AUTO_PLANTING = '自动种植';
|
|
|
+ case AUTO_HARVESTING = '自动收获';
|
|
|
+ case AUTO_WATERING = '自动浇水';
|
|
|
+ case AUTO_PEST_CONTROL = '自动杀虫';
|
|
|
+ case DISASTER_PROTECTION = '灾害防护';
|
|
|
+
|
|
|
+ // 用于Job中的技能名称映射
|
|
|
+ case AUTO_HARVEST_JOB = '自动收菜';
|
|
|
+ case AUTO_PLANT_JOB = '自动播种';
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 修复PetLogic::executeSkillEffect方法
|
|
|
+
|
|
|
+将硬编码字符串替换为枚举值:
|
|
|
+
|
|
|
+```php
|
|
|
+protected function executeSkillEffect(PetUser $pet, PetSkill $skill, array $params): array
|
|
|
+{
|
|
|
+ // 根据技能名称执行不同的效果
|
|
|
+ switch ($skill->skill_name) {
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVESTING->value:
|
|
|
+ return $this->activateAutoHarvestSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANTING->value:
|
|
|
+ return $this->activateAutoPlantSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::DISASTER_PROTECTION->value:
|
|
|
+ return $this->activateDisasterProtectionSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WEEDING->value:
|
|
|
+ return $this->activateAutoWeedingSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WATERING->value:
|
|
|
+ return $this->activateAutoWateringSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PEST_CONTROL->value:
|
|
|
+ return $this->activateAutoPestControlSkill($pet, $skill, $params);
|
|
|
+
|
|
|
+ default:
|
|
|
+ return [
|
|
|
+ 'success' => false,
|
|
|
+ 'message' => '未知技能效果'
|
|
|
+ ];
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 修复ProcessActiveSkillsJob::processSkillEffect方法
|
|
|
+
|
|
|
+同样将硬编码字符串替换为枚举值:
|
|
|
+
|
|
|
+```php
|
|
|
+protected function processSkillEffect(PetActiveSkill $activeSkill): void
|
|
|
+{
|
|
|
+ $autoSkillLogic = new PetAutoSkillLogic();
|
|
|
+
|
|
|
+ switch ($activeSkill->skill_name) {
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVEST_JOB->value:
|
|
|
+ $autoSkillLogic->processAutoHarvest($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANT_JOB->value:
|
|
|
+ $autoSkillLogic->processAutoPlant($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::DISASTER_PROTECTION->value:
|
|
|
+ $autoSkillLogic->processDisasterProtection($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WEEDING->value:
|
|
|
+ $autoSkillLogic->processAutoWeeding($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WATERING->value:
|
|
|
+ $autoSkillLogic->processAutoWatering($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PEST_CONTROL->value:
|
|
|
+ $autoSkillLogic->processAutoPestControl($activeSkill);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ Log::warning('未知的技能类型', [
|
|
|
+ 'active_skill_id' => $activeSkill->id,
|
|
|
+ 'skill_name' => $activeSkill->skill_name
|
|
|
+ ]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新最后检查时间
|
|
|
+ $activeSkill->updateLastCheckTime();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 技能名称映射说明
|
|
|
+
|
|
|
+### 为什么需要两套技能名称?
|
|
|
+
|
|
|
+在实现过程中发现,技能激活时使用的名称和Job处理时使用的名称不完全一致:
|
|
|
+
|
|
|
+- **激活时的技能名称**:'自动收获'、'自动种植'
|
|
|
+- **Job处理时的技能名称**:'自动收菜'、'自动播种'
|
|
|
+
|
|
|
+这是因为:
|
|
|
+1. 技能定义时使用的是标准名称(如'自动收获')
|
|
|
+2. 但在实际激活记录中,可能使用了更口语化的名称(如'自动收菜')
|
|
|
+
|
|
|
+为了保持兼容性,在枚举中定义了两套映射:
|
|
|
+- 标准技能名称:用于技能激活逻辑
|
|
|
+- Job专用名称:用于定时任务处理逻辑
|
|
|
+
|
|
|
+## 验证测试
|
|
|
+
|
|
|
+修复完成后,运行同步处理命令验证:
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan pet:process-active-skills --sync
|
|
|
+```
|
|
|
+
|
|
|
+输出:
|
|
|
+```
|
|
|
+开始处理宠物激活技能...
|
|
|
+使用同步模式处理...
|
|
|
+宠物激活技能处理完成(同步模式)
|
|
|
+```
|
|
|
+
|
|
|
+语法检查:
|
|
|
+```bash
|
|
|
+php -l app/Module/Pet/Enums/PET_SKILL_NAME.php
|
|
|
+php -l app/Module/Pet/Logic/PetLogic.php
|
|
|
+php -l app/Module/Pet/Jobs/ProcessActiveSkillsJob.php
|
|
|
+```
|
|
|
+
|
|
|
+所有文件语法检查通过。
|
|
|
+
|
|
|
+## 技术优势
|
|
|
+
|
|
|
+### 1. 代码可维护性
|
|
|
+- **统一管理**:所有技能名称在枚举中集中定义
|
|
|
+- **类型安全**:使用枚举值避免拼写错误
|
|
|
+- **IDE支持**:更好的代码提示和重构支持
|
|
|
+
|
|
|
+### 2. 扩展性
|
|
|
+- **新增技能**:只需在枚举中添加新的case
|
|
|
+- **名称变更**:只需修改枚举值,不需要搜索替换所有硬编码字符串
|
|
|
+
|
|
|
+### 3. 一致性
|
|
|
+- **命名规范**:遵循PSR-4命名标准
|
|
|
+- **代码风格**:与项目其他枚举保持一致
|
|
|
+
|
|
|
+## 文件修改清单
|
|
|
+
|
|
|
+1. `app/Module/Pet/Enums/PET_SKILL_NAME.php` - 扩展枚举定义
|
|
|
+2. `app/Module/Pet/Logic/PetLogic.php` - 修复executeSkillEffect方法
|
|
|
+3. `app/Module/Pet/Jobs/ProcessActiveSkillsJob.php` - 修复processSkillEffect方法
|
|
|
+
|
|
|
+## 提交信息
|
|
|
+
|
|
|
+```
|
|
|
+修复宠物技能名称使用PET_SKILL_NAME枚举:替换processSkillEffect和executeSkillEffect方法中的硬编码字符串,统一使用枚举值提高代码可维护性
|
|
|
+```
|
|
|
+
|
|
|
+## 完成时间
|
|
|
+
|
|
|
+2025-06-06 19:55
|