Quellcode durchsuchen

修复宠物技能名称使用PET_SKILL_NAME枚举:替换processSkillEffect和executeSkillEffect方法中的硬编码字符串,统一使用枚举值提高代码可维护性

notfff vor 7 Monaten
Ursprung
Commit
a45ed6736b

+ 201 - 0
AiWork/2025年06月/06日1920-为pet命令添加同步处理参数.md

@@ -0,0 +1,201 @@
+# 为pet:process-active-skills命令添加同步处理参数
+
+**时间**: 2025年06月06日 19:20  
+**任务**: 为 `pet:process-active-skills` 命令添加一个参数,可以同步处理(不入队列)
+
+## 需求背景
+
+用户在使用 `php artisan pet:process-active-skills` 命令时,发现命令总是将任务分发到队列:
+
+```bash
+guomu@guomu-d5:/data/wwwroot/nusuus/kknongchang/kku_laravel$ php artisan pet:process-active-skills
+开始处理宠物激活技能...
+宠物激活技能处理任务已分发到队列
+```
+
+用户希望增加一个参数,可以同步处理(不入队列),这是命令设计的常见需求模式。
+
+## 实现方案
+
+### 1. 修改命令签名
+
+修改 `app/Module/Pet/Console/ProcessActiveSkillsCommand.php` 的命令签名:
+
+```php
+// 修改前
+protected $signature = 'pet:process-active-skills';
+
+// 修改后
+protected $signature = 'pet:process-active-skills {--sync : 同步处理,不使用队列}';
+```
+
+### 2. 修改命令处理逻辑
+
+在 `handle()` 方法中添加对 `--sync` 参数的处理:
+
+```php
+public function handle()
+{
+    $this->info('开始处理宠物激活技能...');
+
+    try {
+        $sync = $this->option('sync');
+
+        if ($sync) {
+            // 同步处理,直接执行任务逻辑
+            $this->info('使用同步模式处理...');
+            
+            $job = new ProcessActiveSkillsJob();
+            $job->handle();
+            
+            $this->info('宠物激活技能处理完成(同步模式)');
+            
+            Log::info('宠物激活技能定时命令执行成功(同步模式)');
+        } else {
+            // 分发任务到队列
+            ProcessActiveSkillsJob::dispatch();
+
+            $this->info('宠物激活技能处理任务已分发到队列');
+
+            Log::info('宠物激活技能定时命令执行成功(队列模式)');
+        }
+
+        return Command::SUCCESS;
+
+    } catch (\Exception $e) {
+        $this->error('处理宠物激活技能失败: ' . $e->getMessage());
+
+        Log::error('宠物激活技能定时命令执行失败', [
+            'error' => $e->getMessage(),
+            'trace' => $e->getTraceAsString(),
+            'sync_mode' => $this->option('sync')
+        ]);
+
+        return Command::FAILURE;
+    }
+}
+```
+
+## 遇到的问题和修复
+
+### 问题:PetActiveSkill模型config字段类型转换错误
+
+在测试同步模式时,遇到了以下错误:
+
+```
+TypeError: Cannot access offset of type string on string
+at app/Module/Pet/Models/PetActiveSkill.php:152
+```
+
+**根因分析**:
+- `PetActiveSkill` 模型的 `config` 字段被设置为 `array` 类型转换
+- 但在某些情况下,Laravel的类型转换没有正确工作,导致 `config` 仍然是字符串类型
+- 当代码尝试访问 `$this->config['last_check_time']` 时,就会出现类型错误
+
+**修复方案**:
+为所有访问 `config` 字段的方法添加类型检查和转换:
+
+```php
+public function updateLastCheckTime(): bool
+{
+    $config = $this->config;
+    
+    // 确保config是数组类型
+    if (!is_array($config)) {
+        // 如果是字符串,尝试解析JSON
+        if (is_string($config)) {
+            $config = json_decode($config, true);
+            if (json_last_error() !== JSON_ERROR_NONE) {
+                $config = [];
+            }
+        } else {
+            $config = [];
+        }
+    }
+    
+    $config['last_check_time'] = now()->toDateTimeString();
+    $this->config = $config;
+    return $this->save();
+}
+```
+
+修复了以下方法:
+- `updateLastCheckTime()`
+- `getLastCheckTime()`
+- `shouldCheck()`
+- `getConfigValue()`
+- `setConfigValue()`
+
+## 使用方法
+
+### 1. 队列模式(默认)
+
+```bash
+php artisan pet:process-active-skills
+```
+
+输出:
+```
+开始处理宠物激活技能...
+宠物激活技能处理任务已分发到队列
+```
+
+### 2. 同步模式(新增)
+
+```bash
+php artisan pet:process-active-skills --sync
+```
+
+输出:
+```
+开始处理宠物激活技能...
+使用同步模式处理...
+宠物激活技能处理完成(同步模式)
+```
+
+### 3. 查看帮助
+
+```bash
+php artisan pet:process-active-skills --help
+```
+
+输出:
+```
+Description:
+  处理宠物激活技能的定时任务
+
+Usage:
+  pet:process-active-skills [options]
+
+Options:
+      --sync            同步处理,不使用队列
+  -h, --help            Display help for the given command
+  ...
+```
+
+## 技术特点
+
+1. **向后兼容**:默认行为保持不变,仍然使用队列模式
+2. **灵活选择**:用户可以根据需要选择队列模式或同步模式
+3. **错误处理**:完善的异常处理和日志记录
+4. **类型安全**:修复了config字段的类型转换问题
+
+## 适用场景
+
+- **队列模式**:适用于定时任务、后台处理,不阻塞当前进程
+- **同步模式**:适用于调试、测试、立即执行需求
+
+## 文件修改清单
+
+1. `app/Module/Pet/Console/ProcessActiveSkillsCommand.php` - 添加--sync参数支持
+2. `app/Module/Pet/Models/PetActiveSkill.php` - 修复config字段类型转换问题
+
+## 提交信息
+
+```
+为pet:process-active-skills命令添加同步处理参数:支持--sync选项绕过队列直接处理,并修复PetActiveSkill模型config字段类型转换问题
+```
+
+## 完成时间
+
+2025-06-06 19:20

+ 5 - 0
AiWork/WORK.md

@@ -28,6 +28,11 @@ guomu@guomu-d5:/data/wwwroot/nusuus/kknongchang/kku_laravel$ php artisan pet:pro
 
 ## 已完成任务(保留最新的10条,多余的删除)
 
+**2025-06-06 19:20** - 为pet:process-active-skills命令添加同步处理参数:支持--sync选项绕过队列直接处理
+- 需求:为 `php artisan pet:process-active-skills` 命令增加一个参数,可以同步处理(不入队列)
+- 实现:添加--sync参数,支持队列模式(默认)和同步模式,修复了PetActiveSkill模型config字段类型转换问题
+- 使用:php artisan pet:process-active-skills --sync
+
 **2025-06-06 19:08** - 修复宠物生活技能激活状态显示问题:正确显示激活技能的剩余时间和持续时间
 - 问题:请求 request_1749207804951 返回的pet.lifeSkills信息中技能有开启的,但是没有显示技能开启信息(curnum)
 - 修复:修正了Protobuf转换代码中的属性名匹配问题,重构了技能DTO创建逻辑以正确处理激活技能状态

+ 5 - 0
app/Module/Pet/Enums/PET_SKILL_NAME.php

@@ -9,4 +9,9 @@ enum PET_SKILL_NAME: string
     case AUTO_HARVESTING = '自动收获';
     case AUTO_WATERING = '自动浇水';
     case AUTO_PEST_CONTROL = '自动杀虫';
+    case DISASTER_PROTECTION = '灾害防护';
+
+    // 用于Job中的技能名称映射
+    case AUTO_HARVEST_JOB = '自动收菜';
+    case AUTO_PLANT_JOB = '自动播种';
 }

+ 21 - 3
app/Module/Pet/Jobs/ProcessActiveSkillsJob.php

@@ -78,6 +78,12 @@ class ProcessActiveSkillsJob implements ShouldQueue
 
                     // 检查是否需要执行检查
                     if (!$activeSkill->shouldCheck()) {
+                        Log::debug('shouldCheck', [
+
+                            'active_skill_id' => $activeSkill->id,
+                            'pet_id' => $activeSkill->pet_id,
+                            'skill_name' => $activeSkill->skill_name
+                        ]);
                         continue;
                     }
 
@@ -123,18 +129,30 @@ class ProcessActiveSkillsJob implements ShouldQueue
         $autoSkillLogic = new PetAutoSkillLogic();
 
         switch ($activeSkill->skill_name) {
-            case '自动收菜':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVEST_JOB->value:
                 $autoSkillLogic->processAutoHarvest($activeSkill);
                 break;
 
-            case '自动播种':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANT_JOB->value:
                 $autoSkillLogic->processAutoPlant($activeSkill);
                 break;
 
-            case '灾害防护':
+            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,

+ 6 - 6
app/Module/Pet/Logic/PetLogic.php

@@ -600,22 +600,22 @@ class PetLogic
     {
         // 根据技能名称执行不同的效果
         switch ($skill->skill_name) {
-            case '自动收获':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_HARVESTING->value:
                 return $this->activateAutoHarvestSkill($pet, $skill, $params);
 
-            case '自动种植':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PLANTING->value:
                 return $this->activateAutoPlantSkill($pet, $skill, $params);
 
-            case '灾害防护':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::DISASTER_PROTECTION->value:
                 return $this->activateDisasterProtectionSkill($pet, $skill, $params);
 
-            case '自动除草':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WEEDING->value:
                 return $this->activateAutoWeedingSkill($pet, $skill, $params);
 
-            case '自动浇水':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_WATERING->value:
                 return $this->activateAutoWateringSkill($pet, $skill, $params);
 
-            case '自动杀虫':
+            case \App\Module\Pet\Enums\PET_SKILL_NAME::AUTO_PEST_CONTROL->value:
                 return $this->activateAutoPestControlSkill($pet, $skill, $params);
 
             default: