|
@@ -0,0 +1,175 @@
|
|
|
|
|
+# 修复合成配方JSON生成命令报错
|
|
|
|
|
+
|
|
|
|
|
+**时间**: 2025年06月10日 21:03:38 CST
|
|
|
|
|
+**任务**: 修复 `php artisan gameitems:generate-recipe-json` 命令执行报错
|
|
|
|
|
+
|
|
|
|
|
+## 问题描述
|
|
|
|
|
+
|
|
|
|
|
+执行 `php artisan gameitems:generate-recipe-json` 命令时出现以下错误:
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+Call to undefined method Uraus\Kku\Common\RewardSkin::setSkinId()
|
|
|
|
|
+at app/Module/Game/Services/ProtobufConverter.php:135
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 问题分析
|
|
|
|
|
+
|
|
|
|
|
+通过分析发现,`ProtobufConverter.php` 中调用了不存在的 Protobuf 类方法:
|
|
|
|
|
+
|
|
|
|
|
+1. **RewardSkin 类**:调用了不存在的 `setSkinId()` 方法,实际应该使用 `setId()`
|
|
|
|
|
+2. **RewardGod 类**:调用了不存在的 `setDuration()` 方法,实际应该使用 `setDiff()`
|
|
|
|
|
+3. **RewardPets 类**:调用了不存在的 `setPetId()` 方法,实际应该使用 `setPetType()`
|
|
|
|
|
+4. **RewardPetPowers 类**:调用了不存在的 `setPetUserId()` 和 `setPower()` 方法,实际应该使用 `setPetId()` 和 `setQuantity()`
|
|
|
|
|
+
|
|
|
|
|
+## 解决方案
|
|
|
|
|
+
|
|
|
|
|
+### 1. 修复 RewardSkin 类方法调用
|
|
|
|
|
+
|
|
|
|
|
+**修改前**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::SKIN->value:
|
|
|
|
|
+ $rewardSkin = new RewardSkin();
|
|
|
|
|
+ $rewardSkin->setSkinId($item->targetId);
|
|
|
|
|
+ $skins[] = $rewardSkin;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**修改后**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::SKIN->value:
|
|
|
|
|
+ $rewardSkin = new RewardSkin();
|
|
|
|
|
+ $rewardSkin->setId($item->targetId);
|
|
|
|
|
+ $rewardSkin->setQuantity($item->quantity);
|
|
|
|
|
+ $skins[] = $rewardSkin;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 修复 RewardGod 类方法调用
|
|
|
|
|
+
|
|
|
|
|
+**修改前**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::FARM_SHRINE->value:
|
|
|
|
|
+ $rewardGod = new RewardGod();
|
|
|
|
|
+ $rewardGod->setType($item->targetId);
|
|
|
|
|
+ $rewardGod->setDuration($item->param2 > 0 ? $item->param2 : 24);
|
|
|
|
|
+ $gods[] = $rewardGod;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**修改后**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::FARM_SHRINE->value:
|
|
|
|
|
+ $rewardGod = new RewardGod();
|
|
|
|
|
+ $rewardGod->setType($item->targetId);
|
|
|
|
|
+ // 将小时转换为秒
|
|
|
|
|
+ $durationHours = $item->param2 > 0 ? $item->param2 : 24; // 默认24小时
|
|
|
|
|
+ $rewardGod->setDiff($durationHours * 3600); // 转换为秒
|
|
|
|
|
+ $rewardGod->setQuantity($item->quantity);
|
|
|
|
|
+ $gods[] = $rewardGod;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 3. 修复 RewardPets 类方法调用
|
|
|
|
|
+
|
|
|
|
|
+**修改前**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::PET->value:
|
|
|
|
|
+ $rewardPet = new RewardPets();
|
|
|
|
|
+ $rewardPet->setPetId($item->targetId);
|
|
|
|
|
+ $rewardPet->setQuantity($item->quantity);
|
|
|
|
|
+ $pets[] = $rewardPet;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**修改后**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::PET->value:
|
|
|
|
|
+ $rewardPet = new RewardPets();
|
|
|
|
|
+ $rewardPet->setPetType($item->targetId);
|
|
|
|
|
+ $rewardPet->setQuantity($item->quantity);
|
|
|
|
|
+ $pets[] = $rewardPet;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 4. 修复 RewardPetPowers 类方法调用
|
|
|
|
|
+
|
|
|
|
|
+**修改前**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::PET_POWER->value:
|
|
|
|
|
+ $rewardPetPower = new RewardPetPowers();
|
|
|
|
|
+ $rewardPetPower->setPetUserId($item->targetId);
|
|
|
|
|
+ $rewardPetPower->setPower($item->quantity);
|
|
|
|
|
+ $petPowers[] = $rewardPetPower;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**修改后**:
|
|
|
|
|
+```php
|
|
|
|
|
+case REWARD_TYPE::PET_POWER->value:
|
|
|
|
|
+ $rewardPetPower = new RewardPetPowers();
|
|
|
|
|
+ $rewardPetPower->setPetId($item->targetId);
|
|
|
|
|
+ $rewardPetPower->setQuantity($item->quantity);
|
|
|
|
|
+ $petPowers[] = $rewardPetPower;
|
|
|
|
|
+ break;
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 测试验证
|
|
|
|
|
+
|
|
|
|
|
+### 1. 创建测试命令
|
|
|
|
|
+
|
|
|
|
|
+创建了 `TestRecipeJsonCommand` 测试命令来验证数据生成:
|
|
|
|
|
+
|
|
|
|
|
+```php
|
|
|
|
|
+php artisan test:recipe-json
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**测试结果**:
|
|
|
|
|
+```
|
|
|
|
|
+开始测试合成配方JSON数据生成...
|
|
|
|
|
+数据获取成功!
|
|
|
|
|
+生成时间戳: 1749474462
|
|
|
|
|
+配方数量: 8
|
|
|
|
|
+
|
|
|
|
|
+前3个配方信息:
|
|
|
|
|
+1. ID: 6, 名称: 木板制作, 代码: muban
|
|
|
|
|
+ 消耗组: 已配置
|
|
|
|
|
+ 奖励组: 已配置
|
|
|
|
|
+2. ID: 10, 名称: 钢铁合成, 代码: steel_craft
|
|
|
|
|
+ 消耗组: 已配置
|
|
|
|
|
+ 奖励组: 已配置
|
|
|
|
|
+3. ID: 11, 名称: 石材合成, 代码: steel_1749448834
|
|
|
|
|
+ 消耗组: 已配置
|
|
|
|
|
+ 奖励组: 已配置
|
|
|
|
|
+测试完成!数据生成正常。
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 原始命令测试
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+php artisan gameitems:generate-recipe-json
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**测试结果**:
|
|
|
|
|
+```
|
|
|
|
|
+Generating 合成配方 JSON data...
|
|
|
|
|
+Successfully generated recipe.json with timestamp
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 修改文件
|
|
|
|
|
+
|
|
|
|
|
+1. `app/Module/Game/Services/ProtobufConverter.php` - 修复所有 Protobuf 类方法调用错误
|
|
|
|
|
+2. `app/Console/Commands/TestRecipeJsonCommand.php` - 新增测试命令
|
|
|
|
|
+
|
|
|
|
|
+## 技术要点
|
|
|
|
|
+
|
|
|
|
|
+1. **Protobuf 类方法名称**:需要根据实际生成的 Protobuf 类文件确定正确的方法名
|
|
|
|
|
+2. **数据类型转换**:神像奖励的持续时间需要从小时转换为秒
|
|
|
|
|
+3. **字段映射**:确保 DTO 字段正确映射到 Protobuf 对象字段
|
|
|
|
|
+4. **缓存机制**:该系统使用缓存而非直接生成 JSON 文件
|
|
|
|
|
+
|
|
|
|
|
+## 结果
|
|
|
|
|
+
|
|
|
|
|
+✅ 命令执行成功,不再报错
|
|
|
|
|
+✅ 数据生成正常,包含完整的配方信息
|
|
|
|
|
+✅ 消耗组和奖励组数据正确转换为 Protobuf 格式
|
|
|
|
|
+✅ 添加了测试命令便于后续验证
|