06日1845-修复宠物技能开启问题.md 5.0 KB

修复宠物技能开启问题

任务信息

  • 任务时间: 2025年06月06日 18:45
  • 问题标识: request_1749206571089
  • 任务类型: Bug修复
  • 影响模块: Pet模块、Game模块

问题描述

用户反馈宠物技能开启功能异常:

  1. 技能看似开启了,但实际没有生效
  2. 宠物体力没有减少
  3. 日志中出现错误信息

问题分析

1. 主要问题:事务回滚

LifeSkillUseHandler.php 第126行发现:

// 提交事务
//            DB::commit();
DB::rollBack();

所有数据库操作被回滚,导致技能激活、体力扣除等操作都没有实际生效。

2. 次要问题:属性访问错误

PetTemp.php 第87-89行,代码尝试访问 PetStatusTempDto 不存在的属性:

Log::info("宠物{$eventType}数据已临时存储", [
    'user_id' => $userId,
    'pet_id' => $petId,
    'name' => $tempDto->name,      // 不存在的属性
    'level' => $tempDto->level,    // 不存在的属性
    'grade' => $tempDto->grade,    // 不存在的属性
]);

错误日志:

[2025-06-06T18:43:15.109651+08:00] laravel.ERROR: 获取宠物数据失败 {"error":"Undefined property: App\\Module\\Game\\Dtos\\PetStatusTempDto::$name","user_id":10002,"pet_id":9}
[2025-06-06T18:43:15.109844+08:00] laravel.ERROR: 宠物技能使用数据临时存储失败 {"error":"Undefined property: App\\Module\\Game\\Dtos\\PetStatusTempDto::$name","user_id":10002,"pet_id":9}

解决方案

1. 修复事务回滚问题

文件: app/Module/AppGame/Handler/Pet/LifeSkillUseHandler.php

修改前:

// 提交事务
//            DB::commit();
DB::rollBack();

修改后:

// 提交事务
DB::commit();

2. 修复属性访问问题

文件: app/Module/Game/Logics/PetTemp.php

修改前:

Log::info("宠物{$eventType}数据已临时存储", [
    'user_id' => $userId,
    'pet_id' => $petId,
    'name' => $tempDto->name,
    'level' => $tempDto->level,
    'grade' => $tempDto->grade,
]);

修改后:

Log::info("宠物{$eventType}数据已临时存储", [
    'user_id' => $userId,
    'pet_id' => $petId,
    'updated_at' => $tempDto->updatedAt,
]);

设计说明

PetStatusTempDto 的设计理念

根据用户说明,PetStatusTempDto 应该继承自 BaseDto 而不是 PetDataDto,设计理念是:

  • 暂存区只记录变更的目标(用户id+宠物id)
  • 不记录完整的宠物信息
  • 只包含 idupdatedAt 属性

这种设计避免了存储冗余数据,提高了性能。

验证结果

修复前

  • 技能激活失败,所有操作被回滚
  • 宠物体力保持不变
  • 日志中出现属性访问错误

修复后

运行验证命令 php artisan debug:reproduce-error request_1749206571089

  1. 技能成功激活

    [2025-06-06T18:52:14.409743+08:00] laravel.INFO: 自动除草技能激活成功 {"pet_id":9,"skill_id":1,"duration":10800,"end_time":"2025-06-06 21:52:14","active_skill_id":36}
    
  2. 宠物体力正常减少

    [2025-06-06T18:52:14.498135+08:00] laravel.DEBUG: SQL {"sql":"update `kku_pet_users` set `stamina` = 2240, ...
    

    体力从 2250 减少到 2240

  3. 暂存数据正常记录

    [2025-06-06T18:52:14.594014+08:00] laravel.INFO: 宠物技能使用数据已临时存储 {"user_id":10002,"pet_id":9,"updated_at":1749207134}
    
  4. 响应正常返回

    {
     "runUnid": "6842c85d60438",
     "runMs": "997",
     "code": "OK",
     "callpath": "Pet-LifeSkillUse",
     "lastData": {
       "pets": [{
         "id": "9",
         "name": "松狮",
         "level": "22",
         "power": "2240",
         "maxpower": "600",
         "score": "100",
         "status": "1",
         "lifeSkills": [{"skillId": 1}, {"skillId": 2}, {"skillId": 3}, {"skillId": 4}, {"skillId": 5}],
         "fightingCapacity": "100"
       }]
     },
     "petLifeSkillUse": []
    }
    

数据库验证

激活技能记录

SELECT * FROM kku_pet_active_skills WHERE pet_id = 9 ORDER BY created_at DESC LIMIT 1;

结果:技能ID 36 成功创建,状态为 'active',结束时间为 '2025-06-06 21:52:14'

宠物体力更新

SELECT stamina FROM kku_pet_users WHERE id = 9;

结果:体力值为 2240(从 2250 减少了 10 点)

影响范围

  • Pet模块: 宠物技能使用功能恢复正常
  • Game模块: 宠物暂存数据记录功能恢复正常
  • 用户体验: 技能激活、体力消耗等功能正常工作

提交信息

修复宠物技能开启问题

1. 修复LifeSkillUseHandler中的事务回滚问题,将DB::rollBack()改为DB::commit()
2. 修复PetTemp.php中访问不存在属性的问题,调整日志记录内容
3. 验证修复效果:技能成功激活,宠物体力正常减少,无错误日志

总结

通过修复事务回滚和属性访问两个问题,成功恢复了宠物技能开启功能。修复后的系统能够正常激活技能、扣除体力、记录日志,用户体验得到显著改善。