Prechádzať zdrojové kódy

refactor(pet): 重构宠物数据处理逻辑

- 引入 PetDataDto 和 PetService 以简化宠物数据处理
- 重构 PetStatusTempDto,减少冗余属性和方法
- 优化宠物数据转换和缓存逻辑
- 调整数据库表结构,增加宠物经验上限和体力上限字段
notfff 7 mesiacov pred
rodič
commit
aaa0153006

+ 13 - 35
app/Module/AppGame/Listeners/AppGameProtobufResponseListener.php

@@ -3,6 +3,7 @@
 namespace App\Module\AppGame\Listeners;
 
 use App\Module\AppGame\Events\ProtobufResponseEvent;
+use App\Module\AppGame\Proto\PetDataDto;
 use App\Module\AppGame\SessionApp;
 use App\Module\Game\Logics\FundTemp;
 use App\Module\Game\Logics\GodTemp;
@@ -12,6 +13,7 @@ use App\Module\Game\Logics\LandTemp;
 use App\Module\Game\Logics\PetTemp;
 use App\Module\Game\Services\DeductCollectorService;
 use App\Module\Game\Services\RewardCollectorService;
+use App\Module\Pet\Services\PetService;
 use Illuminate\Support\Facades\Log;
 use Uraus\Kku\Common\DataCoin;
 use Uraus\Kku\Common\DataGod;
@@ -74,6 +76,7 @@ class AppGameProtobufResponseListener
             $lastData->setItems($itemLs);
         }
         // 宠物简单数据 start
+
         $pets = PetTemp::getUserPetStatus($user_id);
 
         $petLs = [];
@@ -94,44 +97,19 @@ class AppGameProtobufResponseListener
             $lastData->setPetSimple($petLs);
         }
         // 宠物简单数据 end
+
         // 宠物详细数据 start
-        $pets = PetTemp::getUserPetUpdates($user_id);
+        $pets2 = PetTemp::getUserPetUpdates($user_id);
         $petLs = [];
-        foreach ($pets as $pet){
-            $p = new \Uraus\Kku\Common\DataPet();
-            $p->setId($pet->id);
-            $p->setTypeId($pet->typeId);
-            $p->setLevel($pet->level);
-            $p->setName($pet->name);
-            $p->setExp($pet->exp);
-            $p->setPower($pet->power);
-            $p->setMaxpower($pet->maxpower);
-            $p->setScore($pet->score);
-            $p->setGrade($pet->grade);
-            $lifeSkills=[];
-
-            foreach ($pet->lifeSkills as $lifeSkill){
-                $ls = new \Uraus\Kku\Common\PetLifeSkill();
-
-                // 兼容处理:支持对象和数组两种格式
-                if (is_object($lifeSkill)) {
-                    // 对象格式(正常情况)
-                    $ls->setSkillId($lifeSkill->skillId);
-                    $ls->setCanuse($lifeSkill->canuse);
-                    $ls->setCurnum($lifeSkill->curnum);
-                    $ls->setMaxnum($lifeSkill->maxnum);
-                } elseif (is_array($lifeSkill)) {
-                    // 数组格式(缓存恢复时的兼容处理)
-                    $ls->setSkillId($lifeSkill['skill_id'] ?? $lifeSkill['skillId'] ?? 0);
-                    $ls->setCanuse($lifeSkill['canuse'] ?? false);
-                    $ls->setCurnum($lifeSkill['curnum'] ?? 0);
-                    $ls->setMaxnum($lifeSkill['maxnum'] ?? 0);
-                }
-
-                $lifeSkills[] = $ls;
+        foreach ($pets2 as $petStatusTempDto){
+            $petDataDto = PetService::getPetStatus($user_id,$petStatusTempDto->id);
+            if($petDataDto){
+                // 转换为Protobuf的DataPet对象
+                $dataPet = PetDataDto::toDataPet($petDataDto);
             }
-            $p->setLifeSkills($lifeSkills);
-            $petLs[] = $p;
+
+
+            $petLs[] = $dataPet;
         }
         if($petLs){
             $lastData->setPets($petLs);

+ 10 - 60
app/Module/Game/Dtos/PetStatusTempDto.php

@@ -4,6 +4,7 @@ namespace App\Module\Game\Dtos;
 
 use App\Module\Pet\Dtos\PetDataDto;
 use App\Module\Pet\Dtos\PetLifeSkillDto;
+use UCore\Dto\BaseDto;
 
 /**
  * 宠物状态临时数据DTO
@@ -12,8 +13,15 @@ use App\Module\Pet\Dtos\PetLifeSkillDto;
  * 继承自PetDataDto,包含宠物的完整数据
  * 适用于PetCreatedEvent和PetUpdateEvent事件的数据存储
  */
-class PetStatusTempDto extends PetDataDto
+class PetStatusTempDto extends BaseDto
 {
+    /**
+     * 宠物唯一ID
+     *
+     * @var int
+     */
+    public int $id = 0;
+
     /**
      * 更新时间戳
      *
@@ -44,7 +52,7 @@ class PetStatusTempDto extends PetDataDto
         foreach ($cachedData as $key => $item) {
             if ($item instanceof static) {
                 // 如果已经是正确的对象类型,检查并修复lifeSkills
-                self::fixLifeSkills($item);
+
                 $result[$key] = $item;
             } elseif (is_array($item)) {
                 // 从数组创建DTO对象
@@ -52,38 +60,8 @@ class PetStatusTempDto extends PetDataDto
 
                 // 复制基本属性
                 $dto->id = $item['id'] ?? 0;
-                $dto->typeId = $item['type_id'] ?? $item['typeId'] ?? 0;
-                $dto->name = $item['name'] ?? '';
-                $dto->level = $item['level'] ?? 1;
-                $dto->exp = $item['exp'] ?? 0;
-                $dto->power = $item['power'] ?? 0;
-                $dto->maxpower = $item['maxpower'] ?? 100;
-                $dto->score = $item['score'] ?? 0;
-                $dto->fightingCapacity = $item['fighting_capacity'] ?? $item['fightingCapacity'] ?? 0;
-                $dto->grade = $item['grade'] ?? 0;
-                $dto->status = $item['status'] ?? 1;
-                $dto->updatedAt = $item['updated_at'] ?? $item['updatedAt'] ?? time();
 
-                // 特殊处理lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
-                $lifeSkills = [];
-                $skillsData = $item['life_skills'] ?? $item['lifeSkills'] ?? [];
 
-                if (is_array($skillsData)) {
-                    foreach ($skillsData as $skillData) {
-                        if ($skillData instanceof PetLifeSkillDto) {
-                            $lifeSkills[] = $skillData;
-                        } elseif (is_array($skillData)) {
-                            $skillDto = new PetLifeSkillDto();
-                            $skillDto->skillId = $skillData['skill_id'] ?? $skillData['skillId'] ?? 0;
-                            $skillDto->canuse = $skillData['canuse'] ?? false;
-                            $skillDto->curnum = $skillData['curnum'] ?? 0;
-                            $skillDto->maxnum = $skillData['maxnum'] ?? 0;
-                            $lifeSkills[] = $skillDto;
-                        }
-                    }
-                }
-
-                $dto->lifeSkills = $lifeSkills;
                 $result[$key] = $dto;
             }
         }
@@ -91,33 +69,5 @@ class PetStatusTempDto extends PetDataDto
         return $result;
     }
 
-    /**
-     * 修复lifeSkills数组,确保其中的元素是PetLifeSkillDto对象
-     *
-     * @param PetStatusTempDto $dto
-     * @return void
-     */
-    private static function fixLifeSkills(PetStatusTempDto $dto): void
-    {
-        if (!isset($dto->lifeSkills) || !is_array($dto->lifeSkills)) {
-            $dto->lifeSkills = [];
-            return;
-        }
-
-        $fixedSkills = [];
-        foreach ($dto->lifeSkills as $skill) {
-            if ($skill instanceof PetLifeSkillDto) {
-                $fixedSkills[] = $skill;
-            } elseif (is_array($skill)) {
-                $skillDto = new PetLifeSkillDto();
-                $skillDto->skillId = $skill['skill_id'] ?? $skill['skillId'] ?? 0;
-                $skillDto->canuse = $skill['canuse'] ?? false;
-                $skillDto->curnum = $skill['curnum'] ?? 0;
-                $skillDto->maxnum = $skill['maxnum'] ?? 0;
-                $fixedSkills[] = $skillDto;
-            }
-        }
 
-        $dto->lifeSkills = $fixedSkills;
-    }
 }

+ 4 - 14
app/Module/Game/Logics/PetTemp.php

@@ -62,24 +62,14 @@ class PetTemp
 
             try {
                 // 使用服务层获取宠物数据,避免跨模块直接访问Model
-                $petDto = PetService::getPetStatus($userId, $petId);
+
 
                 // 创建PetStatusTempDto对象
                 $tempDto = new PetStatusTempDto();
 
                 // 直接复制对象属性,避免toArray()导致的对象数组转换问题
-                $tempDto->id = $petDto->id;
-                $tempDto->typeId = $petDto->typeId;
-                $tempDto->name = $petDto->name;
-                $tempDto->level = $petDto->level;
-                $tempDto->exp = $petDto->exp;
-                $tempDto->power = $petDto->power;
-                $tempDto->maxpower = $petDto->maxpower;
-                $tempDto->score = $petDto->score;
-                $tempDto->fightingCapacity = $petDto->fightingCapacity;
-                $tempDto->grade = $petDto->grade;
-                $tempDto->status = $petDto->status;
-                $tempDto->lifeSkills = $petDto->lifeSkills; // 直接复制对象数组,保持DTO对象类型
+
+                $tempDto->id = $petId;
 
                 // 设置更新时间
                 $tempDto->updatedAt = time();
@@ -159,7 +149,7 @@ class PetTemp
             $tempDto->maxpower = $event->petData->maxpower;
             $tempDto->score = $event->petData->score;
             $tempDto->status = $event->newStatusData->status;
-            $tempDto->grade = $event->petData->grade;
+//            $tempDto->grade = $event->petData->grade;
 
             // 设置状态变更相关属性
             $tempDto->oldStatus = $event->oldStatusData->status;

+ 20 - 21
app/Module/Game/Models/GameRewardItem.php

@@ -9,26 +9,25 @@ use UCore\ModelCore;
 /**
  * 奖励项
  *
- * field start
- *
- * @property  int $id  主键
- * @property  int $group_id  奖励组ID,外键关联game_reward_groups表
- * @property  int $reward_type  奖励类型(1:物品, 2:货币, 3:宠物经验, 4:宠物体力, 5:其他)
- * @property  int $target_id  目标ID(物品ID、货币ID等,根据reward_type解释)
- * @property  int $param1  参数1(根据reward_type不同含义,如物品的品质、货币的来源等)
- * @property  int $param2  参数2(根据reward_type不同含义,如物品的绑定状态、货币的类型等)
- * @property  int $quantity  数量
- * @property  int $min_quantity  最小数量(NULL表示使用quantity字段)
- * @property  int $max_quantity  最大数量(NULL表示使用quantity字段)
- * @property  float $weight  权重(随机发放时使用)
- * @property  float $probability  获得概率(百分比,0-100,NULL表示使用权重机制)
- * @property  bool $is_guaranteed  是否必中(0:非必中, 1:必中)
- * @property  int $pity_threshold  保底阈值(0表示不启用保底)
- * @property  float $pity_weight_factor  保底权重因子(递增概率的倍数)
- * @property  bool $pity_enabled  是否启用保底机制
- * @property  array $extra_data  额外数据(JSON格式,可存储特定奖励类型的额外参数)
- * @property  \Carbon\Carbon $created_at  创建时间
- * @property  \Carbon\Carbon $updated_at  更新时间
+ * field start 
+ * @property  int  $id  主键
+ * @property  int  $group_id  奖励组ID,外键关联game_reward_groups表
+ * @property  int  $reward_type  奖励类型(1:物品, 2:货币, 3:宠物经验, 4:宠物体力, 5:其他)
+ * @property  int  $target_id  目标ID(物品ID、货币ID等,根据reward_type解释)
+ * @property  int  $param1  参数1(根据reward_type不同含义,如物品的品质、货币的来源等)
+ * @property  int  $param2  参数2(根据reward_type不同含义,如物品的绑定状态、货币的类型等)
+ * @property  int  $quantity  数量
+ * @property  int  $min_quantity  最小数量(NULL表示使用quantity字段)
+ * @property  int  $max_quantity  最大数量(NULL表示使用quantity字段)
+ * @property  float  $weight  权重(随机发放时使用)
+ * @property  float  $probability  获得概率(百分比,0-100,NULL表示使用权重机制)
+ * @property  bool  $is_guaranteed  是否必中(0:非必中, 1:必中)
+ * @property  int  $pity_threshold  保底阈值(0表示不启用保底)
+ * @property  float  $pity_weight_factor  保底权重因子(递增概率的倍数)
+ * @property  bool  $pity_enabled  是否启用保底机制
+ * @property  array  $extra_data  额外数据(JSON格式,可存储特定奖励类型的额外参数)
+ * @property  \Carbon\Carbon  $created_at  创建时间
+ * @property  \Carbon\Carbon  $updated_at  更新时间
  * field end
  */
 class GameRewardItem extends ModelCore
@@ -41,7 +40,7 @@ class GameRewardItem extends ModelCore
      */
     protected $table = 'game_reward_items';
 
-    // attrlist start
+    // attrlist start 
     protected $fillable = [
         'id',
         'group_id',

+ 2 - 2
app/Module/GameItems/Models/Item.php

@@ -11,7 +11,7 @@ use UCore\ModelCore;
 /**
  * 物品基础信息
  *
- * field start
+ * field start 
  * @property  int  $id  物品ID,主键
  * @property  string  $name  物品名称
  * @property  string  $description  物品描述
@@ -42,7 +42,7 @@ class Item extends ModelCore
      */
     protected $table = 'item_items';
 
-    // attrlist start
+    // attrlist start 
     protected $fillable = [
         'id',
         'name',

+ 2 - 0
app/Module/Pet/Databases/GenerateSql/pet_users.sql

@@ -12,6 +12,8 @@ CREATE TABLE `kku_pet_users` (
   `level` tinyint unsigned DEFAULT '1' COMMENT '等级',
   `experience` int unsigned DEFAULT '0' COMMENT '经验',
   `stamina` smallint unsigned DEFAULT '100' COMMENT '体力',
+  `max_experience` int unsigned DEFAULT '0' COMMENT '最高经验',
+  `max_stamina` smallint unsigned DEFAULT '100' COMMENT '体力 上限',
   `status` tinyint unsigned DEFAULT '1' COMMENT '宠物状态:0未知,1正常,2战斗中,3死亡',
   `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
   `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

+ 309 - 311
app/Module/Pet/Logic/PetLogic.php

@@ -20,6 +20,7 @@ use App\Module\Pet\Models\PetUser;
 use Exception;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
+use UCore\Dto\Res;
 use UCore\Exception\LogicException;
 use Uraus\Kku\Common\DataPetSimple;
 
@@ -32,6 +33,7 @@ use Uraus\Kku\Common\DataPetSimple;
  */
 class PetLogic
 {
+
     /**
      * 构造函数
      */
@@ -59,7 +61,7 @@ class PetLogic
 
         // 检查用户宠物数量限制
         $petCount = PetUser::where('user_id', $userId)->count();
-        $maxPets = config('pet.max_pets_per_user', 3);
+        $maxPets  = config('pet.max_pets_per_user', 3);
 
         if ($petCount >= $maxPets) {
             throw new Exception("已达到最大宠物数量限制: {$maxPets}");
@@ -72,6 +74,8 @@ class PetLogic
 
         // 获取宠物配置
         $petConfig = PetConfig::where('pet_type', $options['pet_type'] ?? 'default')->first();
+        $nextLevelConfig = PetLevelConfig::where('level', 2)->first();
+
         if (!$petConfig) {
             $petConfig = PetConfig::first(); // 使用默认配置
             if (!$petConfig) {
@@ -80,32 +84,34 @@ class PetLogic
         }
 
         // 创建宠物
-        $pet = new PetUser();
-        $pet->user_id = $userId;
-        $pet->name = $name;
-        $pet->grade = $grade;
-        $pet->level = 1;
+        $pet             = new PetUser();
+        $pet->user_id    = $userId;
+        $pet->name       = $name;
+        $pet->grade      = $grade;
+        $pet->level      = 1;
         $pet->experience = 0;
-        $pet->stamina = $petConfig->stamina_max ?? 100;
-        $pet->status = PetStatus::NORMAL;
+        $pet->max_experience = $nextLevelConfig->exp_required;
+        $pet->stamina    = $petConfig->stamina_max ?? 100;
+        $pet->max_stamina    = $petConfig->stamina_max ?? 100;
+        $pet->status     = PetStatus::NORMAL;
         $pet->save();
 
         // 触发宠物创建事件
         event(new PetCreatedEvent(
-            $userId,
-            $pet->id
-        ));
+                  $userId,
+                  $pet->id
+              ));
 
         Log::info('宠物创建成功', [
             'user_id' => $userId,
-            'pet_id' => $pet->id,
-            'name' => $name,
-            'grade' => $grade
+            'pet_id'  => $pet->id,
+            'name'    => $name,
+            'grade'   => $grade
         ]);
 
         return [
             'pet_id' => $pet->id,
-            'grade' => $grade
+            'grade'  => $grade
         ];
     }
 
@@ -123,7 +129,7 @@ class PetLogic
             4 => 0.05   // 四品阶:5%
         ]);
 
-        $rand = mt_rand(1, 100) / 100;
+        $rand       = mt_rand(1, 100) / 100;
         $cumulative = 0;
 
         foreach ($probabilities as $grade => $probability) {
@@ -142,35 +148,36 @@ class PetLogic
      *
      * @param int $petId 宠物ID
      * @return array 升级结果
-     * @throws Exception
      */
-    public function levelUpPet(int $petId): array
+    public function levelUpPet(PetUser $pet): Res
     {
-        // 获取宠物信息
-        $pet = PetUser::findOrFail($petId);
 
         // 获取当前等级配置
         $currentLevelConfig = PetLevelConfig::where('level', $pet->level)->first();
         if (!$currentLevelConfig) {
             throw new Exception("宠物等级配置不存在");
+
         }
 
         // 获取下一级配置
         $nextLevelConfig = PetLevelConfig::where('level', $pet->level + 1)->first();
         if (!$nextLevelConfig) {
-            throw new Exception("宠物已达到最大等级");
-        }
-
-        // 检查经验值是否足够
-        if ($pet->experience < $nextLevelConfig->exp_required) {
-            throw new Exception("经验值不足,无法升级");
+            return Res::error('宠物已达到最大等级');
         }
+        // 获取下一级配置
+        $nextLevelConfig2 = PetLevelConfig::where('level', $pet->level + 2)->first();
 
         // 记录旧等级
         $oldLevel = $pet->level;
 
         // 升级宠物
-        $pet->level += 1;
+        $pet->level      += 1;
+        $pet->experience = $pet->experience - $nextLevelConfig->exp_required;
+        if($nextLevelConfig2 ){
+            $pet->max_experience =$nextLevelConfig2->exp_required;
+        }else{
+            $pet->max_experience = 0;
+        }
         $pet->save();
 
         // 获取新解锁的技能
@@ -181,31 +188,27 @@ class PetLogic
 
         // 触发宠物升级事件
         event(new PetLevelUpEvent(
-            $pet->user_id,
-            $pet->id,
-            $oldLevel,
-            $pet->level,
-            $unlockedSkills
-        ));
+                  $pet->user_id,
+                  $pet->id,
+                  $oldLevel,
+                  $pet->level,
+                  $unlockedSkills
+              ));
 
         // 触发宠物更新事件,表示宠物数据发生重大变更
         event(new PetUpdateEvent(
-            $pet->user_id,
-            $pet->id
-        ));
+                  $pet->user_id,
+                  $pet->id
+              ));
 
         Log::info('宠物升级成功', [
-            'pet_id' => $petId,
-            'old_level' => $oldLevel,
-            'new_level' => $pet->level,
+            'pet_id'          => $pet->id,
+            'old_level'       => $oldLevel,
+            'new_level'       => $pet->level,
             'unlocked_skills' => $unlockedSkills
         ]);
 
-        return [
-            'old_level' => $oldLevel,
-            'new_level' => $pet->level,
-            'unlocked_skills' => $unlockedSkills
-        ];
+        return Res::success('');
     }
 
     /**
@@ -243,8 +246,8 @@ class PetLogic
             $amount,
             [
                 'source_type' => 'pet_feed',
-                'source_id' => $petId,
-                'details' => ['pet_id' => $petId]
+                'source_id'   => $petId,
+                'details'     => [ 'pet_id' => $petId ]
             ]
         );
 
@@ -253,51 +256,53 @@ class PetLogic
         }
 
         // 计算获得的经验值和体力
-        $expGained = ($item->numericAttributes['pet_exp'] ?? 0) * $amount;
+        $expGained     = ($item->numericAttributes['pet_exp'] ?? 0) * $amount;
         $staminaGained = ($item->numericAttributes['pet_power'] ?? 0) * $amount;
-        if(!$expGained && !$staminaGained ){
+        if (!$expGained && !$staminaGained) {
             throw new LogicException('错误的参数');
         }
 
-        // 增加经验值
-        $levelUpOccurred = $this->addExperience($petId, $expGained);
 
-        // 恢复体力
-        $this->addStamina($petId, $staminaGained);
+        // 增加经验值
+        $pet->experience += $expGained;
+        // 更新体力值
+        $pet->stamina += $staminaGained;
+        $pet->save();
 
         // 喂养完成后恢复正常状态
-        $pet->refresh();
-        $pet->status = PetStatus::NORMAL;
+//        $pet->refresh();
+//        $pet->status = PetStatus::NORMAL;
         $pet->save();
-
+        // 检查升级
+        $this->check_uplevel($pet);
         // 创建旧状态数据
-        $oldStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $oldStatusData->id = $pet->id;
+        $oldStatusData         = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $oldStatusData->id     = $pet->id;
         $oldStatusData->status = PetStatus::FEEDING->value;
 
         // 创建新状态数据
-        $newStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $newStatusData->id = $pet->id;
+        $newStatusData         = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $newStatusData->id     = $pet->id;
         $newStatusData->status = PetStatus::NORMAL->value;
 
         // 创建完整的宠物数据
-        $petData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $petData->id = $pet->id;
-        $petData->name = $pet->name;
+        $petData        = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $petData->id    = $pet->id;
+        $petData->name  = $pet->name;
         $petData->level = $pet->level;
 //        $petData->grade = $pet->grade->value;
         $petData->power = $pet->stamina;
-        $petData->exp = $pet->experience;
+        $petData->exp   = $pet->experience;
 
         // 触发宠物状态变更事件
         event(new PetStatusChangedEvent(
-            $pet->user_id,
-            $pet->id,
-            $oldStatusData,
-            $newStatusData,
-            'pet_feed_complete',
-            $petData
-        ));
+                  $pet->user_id,
+                  $pet->id,
+                  $oldStatusData,
+                  $newStatusData,
+                  'pet_feed_complete',
+                  $petData
+              ));
 
         Log::info('宠物喂养成功', [
             'pet_id'         => $petId,
@@ -305,13 +310,11 @@ class PetLogic
             'amount'         => $amount,
             'exp_gained'     => $expGained,
             'stamina_gained' => $staminaGained,
-            'level_up'       => $levelUpOccurred
         ]);
 
         return [
-            'exp_gained' => $expGained,
+            'exp_gained'     => $expGained,
             'stamina_gained' => $staminaGained,
-            'level_up' => $levelUpOccurred
         ];
     }
 
@@ -322,31 +325,16 @@ class PetLogic
      * @param int $expAmount 经验值数量
      * @return bool 是否触发升级
      */
-    protected function addExperience(int $petId, int $expAmount): bool
+    protected function check_uplevel(PetUser $pet): Res
     {
-        // 获取宠物信息
-        $pet = PetUser::findOrFail($petId);
-
-        // 增加经验值
-        $pet->experience += $expAmount;
-        $pet->save();
-
-        // 检查是否可以升级
-        $nextLevelConfig = PetLevelConfig::where('level', $pet->level + 1)->first();
-        if ($nextLevelConfig && $pet->experience >= $nextLevelConfig->exp_required) {
-            try {
-                $this->levelUpPet($petId);
-                return true;
-            } catch (Exception $e) {
-                Log::error('宠物升级失败', [
-                    'pet_id' => $petId,
-                    'error' => $e->getMessage()
-                ]);
-                return false;
-            }
+        if($pet->max_experience ===0 ){
+            return Res::error('最高等级,无法升级');
+        }
+        if ($pet->experience > $pet->max_experience) {
+            return $this->levelUpPet($pet);
         }
 
-        return false;
+        return Res::error('经验不足');
     }
 
     /**
@@ -356,23 +344,19 @@ class PetLogic
      * @param int $staminaAmount 体力数量
      * @return int 实际增加的体力值
      */
-    protected function addStamina(int $petId, int $staminaAmount): int
+    protected function addStamina(PetUser $pet, int $staminaAmount): int
     {
-        // 获取宠物信息
-        $pet = PetUser::findOrFail($petId);
 
         // 获取宠物等级配置
         $levelConfig = PetLevelConfig::where('level', $pet->level)->first();
-        $maxStamina = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
+        $maxStamina  = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
 
         // 计算实际增加的体力值
-        $oldStamina = $pet->stamina;
-        $newStamina = max($maxStamina, $oldStamina + $staminaAmount);
+        $oldStamina   = $pet->stamina;
+        $newStamina   = max($maxStamina, $oldStamina + $staminaAmount);
         $actualGained = $newStamina - $oldStamina;
 
-        // 更新体力值
-        $pet->stamina = $newStamina;
-        $pet->save();
+
 
         return $actualGained;
     }
@@ -409,8 +393,8 @@ class PetLogic
                 1,
                 [
                     'source_type' => 'pet_remould',
-                    'source_id' => $petId,
-                    'details' => ['pet_id' => $petId]
+                    'source_id'   => $petId,
+                    'details'     => [ 'pet_id' => $petId ]
                 ]
             );
 
@@ -440,31 +424,31 @@ class PetLogic
 
         // 记录洗髓日志
         PetRemouldLog::create([
-            'pet_id' => $petId,
-            'old_grade' => $oldGrade,
-            'new_grade' => $newGrade,
-            'remould_time' => now()
-        ]);
+                                  'pet_id'       => $petId,
+                                  'old_grade'    => $oldGrade,
+                                  'new_grade'    => $newGrade,
+                                  'remould_time' => now()
+                              ]);
 
         // 触发宠物洗髓事件
         event(new PetRemouldEvent(
-            $pet->user_id,
-            $pet->id,
-            $oldGrade,
-            $newGrade
-        ));
+                  $pet->user_id,
+                  $pet->id,
+                  $oldGrade,
+                  $newGrade
+              ));
 
         // 触发宠物更新事件,表示宠物数据发生重大变更
         event(new PetUpdateEvent(
-            $pet->user_id,
-            $pet->id
-        ));
+                  $pet->user_id,
+                  $pet->id
+              ));
 
         Log::info('宠物洗髓成功', [
-            'pet_id' => $petId,
+            'pet_id'    => $petId,
             'old_grade' => $oldGrade,
             'new_grade' => $newGrade,
-            'item_id' => $itemId
+            'item_id'   => $itemId
         ]);
 
         return [
@@ -498,23 +482,23 @@ class PetLogic
 
         if ($lastUsed) {
             $cooldownSeconds = $skill->cool_down;
-            $now = now();
-            $lastUsedTime = $lastUsed->used_at;
+            $now             = now();
+            $lastUsedTime    = $lastUsed->used_at;
 
             // 确保时间计算的正确性
             if ($lastUsedTime instanceof \Carbon\Carbon) {
                 $secondsSinceLastUse = $now->diffInSeconds($lastUsedTime, false);
             } else {
                 // 如果不是Carbon对象,尝试解析
-                $lastUsedTime = \Carbon\Carbon::parse($lastUsedTime);
+                $lastUsedTime        = \Carbon\Carbon::parse($lastUsedTime);
                 $secondsSinceLastUse = $now->diffInSeconds($lastUsedTime, false);
             }
 
             // 如果secondsSinceLastUse为负数,说明lastUsed时间在未来,这是异常情况
             if ($secondsSinceLastUse < 0) {
                 Log::warning('检测到异常的技能使用时间', [
-                    'pet_id' => $petId,
-                    'skill_id' => $skillId,
+                    'pet_id'       => $petId,
+                    'skill_id'     => $skillId,
                     'last_used_at' => $lastUsedTime->toDateTimeString(),
                     'current_time' => $now->toDateTimeString(),
                     'seconds_diff' => $secondsSinceLastUse
@@ -528,13 +512,13 @@ class PetLogic
 
                 // 记录详细的冷却信息用于调试
                 Log::info('技能冷却检查', [
-                    'pet_id' => $petId,
-                    'skill_id' => $skillId,
-                    'cooldown_seconds' => $cooldownSeconds,
+                    'pet_id'                 => $petId,
+                    'skill_id'               => $skillId,
+                    'cooldown_seconds'       => $cooldownSeconds,
                     'seconds_since_last_use' => $secondsSinceLastUse,
-                    'remaining_cooldown' => $remainingCooldown,
-                    'last_used_at' => $lastUsedTime->toDateTimeString(),
-                    'current_time' => $now->toDateTimeString()
+                    'remaining_cooldown'     => $remainingCooldown,
+                    'last_used_at'           => $lastUsedTime->toDateTimeString(),
+                    'current_time'           => $now->toDateTimeString()
                 ]);
 
                 throw new Exception("技能冷却中,还需等待 {$remainingCooldown} 秒");
@@ -553,11 +537,11 @@ class PetLogic
         if (isset($effectResult['success']) && $effectResult['success'] === false) {
             // 技能效果执行失败,记录失败日志但不消耗体力,不进入冷却
             Log::warning('宠物技能使用失败', [
-                'pet_id' => $petId,
-                'skill_id' => $skillId,
-                'params' => $params,
+                'pet_id'        => $petId,
+                'skill_id'      => $skillId,
+                'params'        => $params,
                 'effect_result' => $effectResult,
-                'reason' => $effectResult['message'] ?? '技能使用失败'
+                'reason'        => $effectResult['message'] ?? '技能使用失败'
             ]);
 
             throw new Exception($effectResult['message'] ?? '技能使用失败');
@@ -569,24 +553,24 @@ class PetLogic
 
         // 记录技能使用日志(只有成功时才记录)
         $skillLog = PetSkillLog::create([
-            'pet_id' => $petId,
-            'skill_id' => $skillId,
-            'used_at' => now(),
-            'effect_result' => json_encode($effectResult)
-        ]);
+                                            'pet_id'        => $petId,
+                                            'skill_id'      => $skillId,
+                                            'used_at'       => now(),
+                                            'effect_result' => json_encode($effectResult)
+                                        ]);
 
         // 触发宠物技能使用事件
         event(new PetSkillUsedEvent(
-            $pet->user_id,
-            $pet->id,
-            $skillId,
-            $params
-        ));
+                  $pet->user_id,
+                  $pet->id,
+                  $skillId,
+                  $params
+              ));
 
         Log::info('宠物技能使用成功', [
-            'pet_id' => $petId,
-            'skill_id' => $skillId,
-            'params' => $params,
+            'pet_id'        => $petId,
+            'skill_id'      => $skillId,
+            'params'        => $params,
             'effect_result' => $effectResult
         ]);
 
@@ -659,37 +643,38 @@ class PetLogic
 
         // 技能持续时间(默认2小时)
         $duration = $params['duration'] ?? 7200; // 2小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'auto_harvest' => true,
-                'check_interval' => 60, // 每分钟检查一次
-                'last_check_time' => now()->toDateTimeString()
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'auto_harvest'    => true,
+                                                                                                         'check_interval'  => 60,
+                                                                                                         // 每分钟检查一次
+                                                                                                         'last_check_time' => now()->toDateTimeString()
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('自动收菜技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'auto_harvest',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "自动收菜技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "自动收菜技能已激活,持续时间:{$duration}秒"
         ];
     }
 
@@ -719,38 +704,40 @@ class PetLogic
 
         // 技能持续时间(默认4小时)
         $duration = $params['duration'] ?? 14400; // 4小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'auto_plant' => true,
-                'check_interval' => 60, // 每分钟检查一次
-                'last_check_time' => now()->toDateTimeString(),
-                'preferred_seeds' => $params['preferred_seeds'] ?? [] // 优先使用的种子ID列表
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'auto_plant'      => true,
+                                                                                                         'check_interval'  => 60,
+                                                                                                         // 每分钟检查一次
+                                                                                                         'last_check_time' => now()->toDateTimeString(),
+                                                                                                         'preferred_seeds' => $params['preferred_seeds'] ?? []
+                                                                                                         // 优先使用的种子ID列表
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('自动播种技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'auto_plant',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "自动播种技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "自动播种技能已激活,持续时间:{$duration}秒"
         ];
     }
 
@@ -780,38 +767,40 @@ class PetLogic
 
         // 技能持续时间(默认6小时)
         $duration = $params['duration'] ?? 21600; // 6小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'disaster_protection' => true,
-                'protected_types' => $params['disaster_types'] ?? ['all'], // 防护的灾害类型
-                'check_interval' => 300, // 每5分钟检查一次
-                'last_check_time' => now()->toDateTimeString()
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'disaster_protection' => true,
+                                                                                                         'protected_types'     => $params['disaster_types'] ?? [ 'all' ],
+                                                                                                         // 防护的灾害类型
+                                                                                                         'check_interval'      => 300,
+                                                                                                         // 每5分钟检查一次
+                                                                                                         'last_check_time'     => now()->toDateTimeString()
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('灾害防护技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'disaster_protection',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "灾害防护技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "灾害防护技能已激活,持续时间:{$duration}秒"
         ];
     }
 
@@ -841,39 +830,39 @@ class PetLogic
         $pet->save();
 
         // 创建旧状态数据
-        $oldStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $oldStatusData->id = $pet->id;
+        $oldStatusData         = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $oldStatusData->id     = $pet->id;
         $oldStatusData->status = $oldStatus->value;
 
         // 创建新状态数据
-        $newStatusData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $newStatusData->id = $pet->id;
+        $newStatusData         = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $newStatusData->id     = $pet->id;
         $newStatusData->status = $status->value;
 
         // 创建完整的宠物数据
-        $petData = new \App\Module\Pet\Dtos\DataPetSimpleDto();
-        $petData->id = $pet->id;
-        $petData->name = $pet->name;
+        $petData         = new \App\Module\Pet\Dtos\DataPetSimpleDto();
+        $petData->id     = $pet->id;
+        $petData->name   = $pet->name;
         $petData->typeId = $pet->type_id;
-        $petData->level = $pet->level;
-        $petData->grade = $pet->grade->value;
+        $petData->level  = $pet->level;
+        $petData->grade  = $pet->grade->value;
         $petData->status = $status->value;
 
         // 触发宠物状态变更事件
         event(new PetStatusChangedEvent(
-            $pet->user_id,
-            $pet->id,
-            $oldStatusData,
-            $newStatusData,
-            $reason,
-            $petData
-        ));
+                  $pet->user_id,
+                  $pet->id,
+                  $oldStatusData,
+                  $newStatusData,
+                  $reason,
+                  $petData
+              ));
 
         Log::info('宠物状态变更成功', [
-            'pet_id' => $petId,
+            'pet_id'     => $petId,
             'old_status' => $oldStatus->value,
             'new_status' => $status->value,
-            'reason' => $reason
+            'reason'     => $reason
         ]);
 
         return true;
@@ -892,14 +881,14 @@ class PetLogic
         $pet = PetUser::findOrFail($petId);
 
         // 获取宠物等级配置
-        $levelConfig = PetLevelConfig::where('level', $pet->level)->first();
-        $maxStamina = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
+        $levelConfig  = PetLevelConfig::where('level', $pet->level)->first();
+        $maxStamina   = $levelConfig ? ($levelConfig->numeric_attributes->stamina_max ?? 100) : 100;
         $recoveryRate = $levelConfig ? ($levelConfig->numeric_attributes->stamina_recovery ?? 5) : 5;
 
         // 计算恢复的体力值
-        $recoveryAmount = $recoveryRate * $minutes;
-        $oldStamina = $pet->stamina;
-        $newStamina = min($maxStamina, $oldStamina + $recoveryAmount);
+        $recoveryAmount  = $recoveryRate * $minutes;
+        $oldStamina      = $pet->stamina;
+        $newStamina      = min($maxStamina, $oldStamina + $recoveryAmount);
         $actualRecovered = $newStamina - $oldStamina;
 
         // 更新体力值
@@ -908,11 +897,11 @@ class PetLogic
             $pet->save();
 
             Log::info('宠物体力恢复成功', [
-                'pet_id' => $petId,
-                'minutes' => $minutes,
-                'recovery_rate' => $recoveryRate,
-                'old_stamina' => $oldStamina,
-                'new_stamina' => $newStamina,
+                'pet_id'           => $petId,
+                'minutes'          => $minutes,
+                'recovery_rate'    => $recoveryRate,
+                'old_stamina'      => $oldStamina,
+                'new_stamina'      => $newStamina,
                 'actual_recovered' => $actualRecovered
             ]);
         }
@@ -972,39 +961,41 @@ class PetLogic
 
         // 技能持续时间(默认3小时)
         $duration = $params['duration'] ?? 10800; // 3小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'auto_weeding' => true,
-                'disaster_type' => \App\Module\Farm\Enums\DISASTER_TYPE::WEED->value, // 专门处理杂草灾害
-                'check_interval' => 300,
-                'last_check_time' => now()->toDateTimeString(),
-                'auto_use_items' => $params['auto_use_items'] ?? true // 是否自动使用除草道具
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'auto_weeding'    => true,
+                                                                                                         'disaster_type'   => \App\Module\Farm\Enums\DISASTER_TYPE::WEED->value,
+                                                                                                         // 专门处理杂草灾害
+                                                                                                         'check_interval'  => 300,
+                                                                                                         'last_check_time' => now()->toDateTimeString(),
+                                                                                                         'auto_use_items'  => $params['auto_use_items'] ?? true
+                                                                                                         // 是否自动使用除草道具
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('自动除草技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'auto_weeding',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "自动除草技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "自动除草技能已激活,持续时间:{$duration}秒"
         ];
     }
 
@@ -1034,39 +1025,42 @@ class PetLogic
 
         // 技能持续时间(默认4小时)
         $duration = $params['duration'] ?? 14400; // 4小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'auto_watering' => true,
-                'disaster_type' => \App\Module\Farm\Enums\DISASTER_TYPE::DROUGHT->value, // 专门处理干旱灾害
-                'check_interval' => 300, // 每5分钟检查一次
-                'last_check_time' => now()->toDateTimeString(),
-                'auto_use_items' => $params['auto_use_items'] ?? true // 是否自动使用浇水道具
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'auto_watering'   => true,
+                                                                                                         'disaster_type'   => \App\Module\Farm\Enums\DISASTER_TYPE::DROUGHT->value,
+                                                                                                         // 专门处理干旱灾害
+                                                                                                         'check_interval'  => 300,
+                                                                                                         // 每5分钟检查一次
+                                                                                                         'last_check_time' => now()->toDateTimeString(),
+                                                                                                         'auto_use_items'  => $params['auto_use_items'] ?? true
+                                                                                                         // 是否自动使用浇水道具
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('自动浇水技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'auto_watering',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "自动浇水技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "自动浇水技能已激活,持续时间:{$duration}秒"
         ];
     }
 
@@ -1096,39 +1090,43 @@ class PetLogic
 
         // 技能持续时间(默认3小时)
         $duration = $params['duration'] ?? 10800; // 3小时
-        $endTime = now()->addSeconds($duration);
+        $endTime  = now()->addSeconds($duration);
 
         // 创建技能激活记录
         $activeSkill = \App\Module\Pet\Models\PetActiveSkill::create([
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'skill_name' => $skill->skill_name,
-            'start_time' => now(),
-            'end_time' => $endTime,
-            'status' => 'active',
-            'config' => json_encode([
-                'auto_pest_control' => true,
-                'disaster_type' => \App\Module\Farm\Enums\DISASTER_TYPE::PEST->value, // 专门处理虫害灾害
-                'check_interval' => 300, // 每5分钟检查一次
-                'last_check_time' => now()->toDateTimeString(),
-                'auto_use_items' => $params['auto_use_items'] ?? true // 是否自动使用杀虫道具
-            ])
-        ]);
+                                                                         'pet_id'     => $pet->id,
+                                                                         'skill_id'   => $skill->id,
+                                                                         'skill_name' => $skill->skill_name,
+                                                                         'start_time' => now(),
+                                                                         'end_time'   => $endTime,
+                                                                         'status'     => 'active',
+                                                                         'config'     => json_encode([
+                                                                                                         'auto_pest_control' => true,
+                                                                                                         'disaster_type'     => \App\Module\Farm\Enums\DISASTER_TYPE::PEST->value,
+                                                                                                         // 专门处理虫害灾害
+                                                                                                         'check_interval'    => 300,
+                                                                                                         // 每5分钟检查一次
+                                                                                                         'last_check_time'   => now()->toDateTimeString(),
+                                                                                                         'auto_use_items'    => $params['auto_use_items'] ?? true
+                                                                                                         // 是否自动使用杀虫道具
+                                                                                                     ])
+                                                                     ]);
 
         Log::info('自动杀虫技能激活成功', [
-            'pet_id' => $pet->id,
-            'skill_id' => $skill->id,
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
+            'pet_id'          => $pet->id,
+            'skill_id'        => $skill->id,
+            'duration'        => $duration,
+            'end_time'        => $endTime->toDateTimeString(),
             'active_skill_id' => $activeSkill->id
         ]);
 
         return [
-            'success' => true,
+            'success'    => true,
             'skill_type' => 'auto_pest_control',
-            'duration' => $duration,
-            'end_time' => $endTime->toDateTimeString(),
-            'message' => "自动杀虫技能已激活,持续时间:{$duration}秒"
+            'duration'   => $duration,
+            'end_time'   => $endTime->toDateTimeString(),
+            'message'    => "自动杀虫技能已激活,持续时间:{$duration}秒"
         ];
     }
+
 }

+ 21 - 15
app/Module/Pet/Models/PetUser.php

@@ -11,20 +11,24 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  * 宠物模型
  *
  * field start
- * @property  int  $id
- * @property  int  $user_id  用户ID
- * @property  string  $name  宠物名称
- * @property  int  $grade  品阶
- * @property  int  $level  等级
- * @property  int  $experience  经验
- * @property  int  $stamina  体力
- * @property  \App\Module\Pet\Enums\PetStatus  $status  宠物状态:0未知,1正常,2战斗中,3死亡
- * @property  \Carbon\Carbon  $created_at
- * @property  \Carbon\Carbon  $updated_at
+ *
+ * @property  int $id
+ * @property  int $user_id  用户ID
+ * @property  string $name  宠物名称
+ * @property  int $grade  品阶
+ * @property  int $level  等级
+ * @property  int $experience  经验
+ * @property  int $stamina  体力
+ * @property  int $max_experience  最高经验
+ * @property  int $max_stamina  体力 上限
+ * @property  App\Module\Pet\Enums\PetStatus $status  宠物状态:0未知,1正常,2战斗中,3死亡
+ * @property  \Carbon\Carbon $created_at
+ * @property  \Carbon\Carbon $updated_at
  * field end
  */
 class PetUser extends ModelCore
 {
+
     /**
      * 与模型关联的表名
      *
@@ -46,6 +50,8 @@ class PetUser extends ModelCore
         'level',
         'experience',
         'stamina',
+        'max_experience',
+        'max_stamina',
         'status',
     ];
     // attrlist end
@@ -56,12 +62,12 @@ class PetUser extends ModelCore
      * @var array
      */
     protected $casts = [
-        'user_id' => 'integer',
-        'level' => 'integer',
+        'user_id'    => 'integer',
+        'level'      => 'integer',
         'experience' => 'integer',
-        'stamina' => 'integer',
-        'status' => PetStatus::class,
-        'grade' => 'integer',
+        'stamina'    => 'integer',
+        'status'     => PetStatus::class,
+        'grade'      => 'integer',
         'created_at' => 'datetime',
         'updated_at' => 'datetime',
     ];

+ 3 - 52
app/Module/Pet/Services/PetService.php

@@ -104,55 +104,7 @@ class PetService
         }
     }
 
-    /**
-     * 宠物升级
-     *
-     * 注意:调用此方法前,请确保已开启数据库事务
-     *
-     * @param int $userId 用户ID
-     * @param int $petId 宠物ID
-     * @return array 升级结果
-     * @throws Exception
-     */
-    public static function levelUpPet(int $userId, int $petId): array
-    {
-        // 验证事务是否已开启
-        Helper::check_tr();
-
-        try {
-            // 宠物逻辑
-            $petLogic = new PetLogic();
-
-            // 获取宠物信息
-            $pet = PetUser::where('id', $petId)
-                ->where('user_id', $userId)
-                ->first();
-
-            if (!$pet) {
-                throw new Exception("宠物不存在或不属于该用户");
-            }
 
-            // 执行升级逻辑
-            $result = $petLogic->levelUpPet($petId);
-
-            return [
-                'success'         => true,
-                'pet_id'          => $petId,
-                'old_level'       => $result['old_level'],
-                'new_level'       => $result['new_level'],
-                'unlocked_skills' => $result['unlocked_skills'] ?? [],
-                'message'         => '宠物升级成功'
-            ];
-        } catch (Exception $e) {
-            Log::error('宠物升级失败', [
-                'user_id' => $userId,
-                'pet_id'  => $petId,
-                'error'   => $e->getMessage()
-            ]);
-
-            throw $e;
-        }
-    }
 
     /**
      * 宠物喂养
@@ -192,13 +144,12 @@ class PetService
         // 执行喂养逻辑
         $result = $petLogic->feedPet($petId, $itemId, $amount);
 
+
         return Res::success('', [
             'pet_id'         => $petId,
             'item_id'        => $itemId,
-            'amount'         => $amount,
-            'exp_gained'     => $result['exp_gained'],
-            'stamina_gained' => $result['stamina_gained'],
-            'level_up'       => $result['level_up'],
+            'amount'         => $amount
+
         ]);