RewardGroupService.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace App\Module\Game\Services;
  3. use App\Module\Fund\Models\FundConfigModel;
  4. use App\Module\Fund\Models\FundCurrencyModel;
  5. use App\Module\Game\Enums\REWARD_TYPE;
  6. use App\Module\Game\Models\GameRewardGroup;
  7. use App\Module\GameItems\Models\Item;
  8. use App\Module\Pet\Models\PetConfig;
  9. use Illuminate\Support\Facades\Log;
  10. /**
  11. * 奖励组服务类
  12. *
  13. * 提供奖励组相关的服务,包括获取奖励组详情、获取奖励组奖励等功能
  14. */
  15. class RewardGroupService
  16. {
  17. /**
  18. * 获取奖励组详情
  19. *
  20. * @param int|string $rewardGroupCode 奖励组ID或编码
  21. * @return GameRewardGroup|null 奖励组详情
  22. */
  23. public static function getRewardGroup($rewardGroupCode): ?GameRewardGroup
  24. {
  25. try {
  26. // 获取奖励组
  27. $rewardGroup = is_numeric($rewardGroupCode)
  28. ? GameRewardGroup::with('rewardItems')->find($rewardGroupCode)
  29. : GameRewardGroup::with('rewardItems')->where('code', $rewardGroupCode)->first();
  30. return $rewardGroup;
  31. } catch (\Exception $e) {
  32. Log::error('获取奖励组详情失败', [
  33. 'reward_group' => $rewardGroupCode,
  34. 'error' => $e->getMessage()
  35. ]);
  36. return null;
  37. }
  38. }
  39. /**
  40. * 批量获取奖励组详情
  41. *
  42. * @param array $rewardGroupIds 奖励组ID数组
  43. * @return array 奖励组详情数组,以ID为键
  44. */
  45. public static function getRewardGroups(array $rewardGroupIds): array
  46. {
  47. try {
  48. if (empty($rewardGroupIds)) {
  49. return [];
  50. }
  51. // 批量获取奖励组
  52. $rewardGroups = GameRewardGroup::with('rewardItems')
  53. ->whereIn('id', $rewardGroupIds)
  54. ->get()
  55. ->keyBy('id');
  56. return $rewardGroups->toArray();
  57. } catch (\Exception $e) {
  58. Log::error('批量获取奖励组详情失败', [
  59. 'reward_group_ids' => $rewardGroupIds,
  60. 'error' => $e->getMessage()
  61. ]);
  62. return [];
  63. }
  64. }
  65. /**
  66. * 获取奖励组奖励
  67. *
  68. * @param int|string $rewardGroupCode 奖励组ID或编码
  69. * @return array 奖励组奖励
  70. */
  71. public static function getRewardItems($rewardGroupCode): array
  72. {
  73. try {
  74. // 获取奖励组
  75. $rewardGroup = self::getRewardGroup($rewardGroupCode);
  76. if (!$rewardGroup || $rewardGroup->rewardItems->isEmpty()) {
  77. return [];
  78. }
  79. $rewards = [];
  80. // 处理每个奖励项
  81. foreach ($rewardGroup->rewardItems as $item) {
  82. $rewardItem = [
  83. 'id' => $item->id,
  84. 'type' => $item->reward_type,
  85. 'target_id' => $item->target_id,
  86. 'quantity' => $item->quantity,
  87. 'weight' => $item->weight,
  88. 'is_guaranteed' => $item->is_guaranteed,
  89. 'group_id' => $rewardGroup->id,
  90. 'group_code' => $rewardGroup->code,
  91. 'group_name' => $rewardGroup->name,
  92. 'is_random' => $rewardGroup->is_random,
  93. 'random_count' => $rewardGroup->random_count
  94. ];
  95. // 根据奖励类型获取目标名称
  96. if ($item->reward_type == REWARD_TYPE::ITEM->value) {
  97. $itemInfo = Item::find($item->target_id);
  98. $rewardItem['target_name'] = $itemInfo ? $itemInfo->name : "物品 {$item->target_id}";
  99. $rewardItem['reward_name'] = "物品奖励";
  100. } elseif ($item->reward_type == REWARD_TYPE::CURRENCY->value) {
  101. $currency = FundCurrencyModel::find($item->target_id);
  102. $rewardItem['target_name'] = $currency ? $currency->name : "货币 {$item->target_id}";
  103. $rewardItem['reward_name'] = "货币奖励";
  104. } elseif ($item->reward_type == REWARD_TYPE::PET_EXP->value) {
  105. $pet = PetConfig::find($item->target_id);
  106. $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
  107. $rewardItem['reward_name'] = "宠物经验";
  108. } elseif ($item->reward_type == REWARD_TYPE::PET_ENERGY->value) {
  109. $pet = PetConfig::find($item->target_id);
  110. $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
  111. $rewardItem['reward_name'] = "宠物体力";
  112. } elseif ($item->reward_type == REWARD_TYPE::FUND_CONFIG->value) {
  113. $fund = FundConfigModel::find($item->target_id);
  114. $rewardItem['target_name'] = $fund ? $fund->name : "代币账户 {$item->target_id}";
  115. $rewardItem['reward_name'] = "代币奖励";
  116. } elseif ($item->reward_type == REWARD_TYPE::PET->value) {
  117. $petConfig = \App\Module\Pet\Models\PetConfig::find($item->target_id);
  118. $rewardItem['target_name'] = $petConfig ? $petConfig->name : "宠物配置 {$item->target_id}";
  119. $rewardItem['reward_name'] = "宠物奖励";
  120. } elseif ($item->reward_type == REWARD_TYPE::PET_POWER->value) {
  121. $pet = \App\Module\Pet\Models\PetUser::find($item->target_id);
  122. $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
  123. $rewardItem['reward_name'] = "宠物体力奖励";
  124. } else {
  125. $rewardItem['target_name'] = "其他 {$item->target_id}";
  126. $rewardItem['reward_name'] = "其他奖励";
  127. }
  128. $rewards[] = $rewardItem;
  129. }
  130. return $rewards;
  131. } catch (\Exception $e) {
  132. Log::error('获取奖励组奖励失败', [
  133. 'reward_group' => $rewardGroupCode,
  134. 'error' => $e->getMessage()
  135. ]);
  136. return [];
  137. }
  138. }
  139. }