LifeSkillUseHandler.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. namespace App\Module\AppGame\Handler\Pet;
  3. use App\Module\AppGame\Handler\BaseHandler;
  4. use App\Module\Pet\Services\PetService;
  5. use Google\Protobuf\Internal\Message;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Log;
  8. use Uraus\Kku\Request\RequestPetLifeSkillUse;
  9. use Uraus\Kku\Response\ResponsePetLifeSkillUse;
  10. use UCore\Exception\LogicException;
  11. /**
  12. * 处理使用宠物生活技能请求
  13. */
  14. class LifeSkillUseHandler extends BaseHandler
  15. {
  16. /**
  17. * 是否需要登录
  18. * @var bool
  19. */
  20. protected bool $need_login = true;
  21. /**
  22. * 处理使用宠物生活技能请求
  23. *
  24. * @param RequestPetLifeSkillUse $data 使用宠物生活技能请求数据
  25. * @return ResponsePetLifeSkillUse 使用宠物生活技能响应
  26. */
  27. public function handle(Message $data): Message
  28. {
  29. // 创建响应对象
  30. $response = new ResponsePetLifeSkillUse();
  31. try {
  32. // 获取请求参数
  33. $petId = $data->getPetId();
  34. $skillIds = $data->getSkillId(); // RepeatedField,包含多个技能ID
  35. $userId = $this->user_id;
  36. // 将RepeatedField转换为数组
  37. $skillIdArray = [];
  38. foreach ($skillIds as $skillId) {
  39. $skillIdArray[] = $skillId;
  40. }
  41. // 技能参数(暂时使用默认值)
  42. $params = [];
  43. Log::info('用户批量使用宠物生活技能', [
  44. 'user_id' => $userId,
  45. 'pet_id' => $petId,
  46. 'skill_ids' => $skillIdArray,
  47. 'skill_count' => count($skillIdArray)
  48. ]);
  49. // 验证参数
  50. if (!$petId || $petId <= 0) {
  51. throw new LogicException("宠物ID无效");
  52. }
  53. if (empty($skillIdArray)) {
  54. throw new LogicException("技能ID列表不能为空");
  55. }
  56. // 验证技能ID
  57. foreach ($skillIdArray as $skillId) {
  58. if (!$skillId || $skillId <= 0) {
  59. throw new LogicException("技能ID无效: {$skillId}");
  60. }
  61. }
  62. // 开启事务
  63. DB::beginTransaction();
  64. $successCount = 0;
  65. $failedSkills = [];
  66. $errorMessages = [];
  67. // 逐个激活技能
  68. foreach ($skillIdArray as $skillId) {
  69. try {
  70. // 调用宠物服务使用技能
  71. $result = PetService::useSkill($userId, $petId, $skillId, $params);
  72. $successCount++;
  73. Log::info('单个技能激活成功', [
  74. 'user_id' => $userId,
  75. 'pet_id' => $petId,
  76. 'skill_id' => $skillId
  77. ]);
  78. } catch (\Exception $e) {
  79. $failedSkills[] = $skillId;
  80. $errorMessages[] = "技能{$skillId}: " . $e->getMessage();
  81. Log::warning('单个技能激活失败', [
  82. 'user_id' => $userId,
  83. 'pet_id' => $petId,
  84. 'skill_id' => $skillId,
  85. 'error' => $e->getMessage()
  86. ]);
  87. }
  88. }
  89. // 如果有失败的技能,抛出异常说明情况
  90. if (!empty($failedSkills)) {
  91. $errorMsg = "部分技能激活失败:" . implode('; ', $errorMessages);
  92. if ($successCount === 0) {
  93. // 全部失败
  94. throw new LogicException("所有技能激活失败:" . implode('; ', $errorMessages));
  95. } else {
  96. // 部分失败,记录警告但不抛出异常
  97. Log::warning('部分技能激活失败', [
  98. 'user_id' => $userId,
  99. 'pet_id' => $petId,
  100. 'success_count' => $successCount,
  101. 'failed_count' => count($failedSkills),
  102. 'error_message' => $errorMsg
  103. ]);
  104. }
  105. }
  106. // 提交事务
  107. DB::commit();
  108. Log::info('宠物生活技能批量使用完成', [
  109. 'user_id' => $userId,
  110. 'pet_id' => $petId,
  111. 'total_skills' => count($skillIdArray),
  112. 'success_count' => $successCount,
  113. 'failed_count' => count($failedSkills),
  114. 'failed_skills' => $failedSkills
  115. ]);
  116. } catch (\UCore\Exception\ValidateException $e) {
  117. // 验证失败
  118. DB::rollBack();
  119. Log::warning('宠物生活技能使用验证失败', [
  120. 'user_id' => $this->user_id,
  121. 'pet_id' => $petId ?? null,
  122. 'skill_id' => $skillId ?? null,
  123. 'error' => $e->getMessage()
  124. ]);
  125. throw $e;
  126. } catch (LogicException $e) {
  127. // 业务逻辑异常
  128. if (DB::transactionLevel() > 0) {
  129. DB::rollBack();
  130. }
  131. Log::warning('宠物生活技能使用失败', [
  132. 'user_id' => $this->user_id,
  133. 'pet_id' => $petId ?? null,
  134. 'skill_id' => $skillId ?? null,
  135. 'error' => $e->getMessage()
  136. ]);
  137. throw $e;
  138. } catch (\Exception $e) {
  139. // 系统异常
  140. if (DB::transactionLevel() > 0) {
  141. DB::rollBack();
  142. }
  143. Log::error('宠物生活技能使用异常', [
  144. 'user_id' => $this->user_id,
  145. 'pet_id' => $petId ?? null,
  146. 'skill_id' => $skillId ?? null,
  147. 'error' => $e->getMessage(),
  148. 'trace' => $e->getTraceAsString()
  149. ]);
  150. throw $e;
  151. }
  152. return $response;
  153. }
  154. }