RewardGroupService.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace App\Module\Game\Services;
  3. use App\Module\Game\Enums\REWARD_TYPE;
  4. use App\Module\Game\Models\GameRewardGroup;
  5. use Illuminate\Support\Facades\Log;
  6. /**
  7. * 奖励组服务类
  8. *
  9. * 提供奖励组相关的服务,包括获取奖励组详情、获取奖励组奖励等功能
  10. */
  11. class RewardGroupService
  12. {
  13. /**
  14. * 获取奖励组详情
  15. *
  16. * @param int|string $rewardGroupCode 奖励组ID或编码
  17. * @return GameRewardGroup|null 奖励组详情
  18. */
  19. public static function getRewardGroup($rewardGroupCode): ?GameRewardGroup
  20. {
  21. try {
  22. // 获取奖励组
  23. $rewardGroup = is_numeric($rewardGroupCode)
  24. ? GameRewardGroup::with('rewardItems')->find($rewardGroupCode)
  25. : GameRewardGroup::with('rewardItems')->where('code', $rewardGroupCode)->first();
  26. return $rewardGroup;
  27. } catch (\Exception $e) {
  28. Log::error('获取奖励组详情失败', [
  29. 'reward_group' => $rewardGroupCode,
  30. 'error' => $e->getMessage()
  31. ]);
  32. return null;
  33. }
  34. }
  35. /**
  36. * 批量获取奖励组详情
  37. *
  38. * @param array $rewardGroupIds 奖励组ID数组
  39. * @return array 奖励组详情数组,以ID为键
  40. */
  41. public static function getRewardGroups(array $rewardGroupIds): array
  42. {
  43. try {
  44. if (empty($rewardGroupIds)) {
  45. return [];
  46. }
  47. // 批量获取奖励组
  48. $rewardGroups = GameRewardGroup::with('rewardItems')
  49. ->whereIn('id', $rewardGroupIds)
  50. ->get()
  51. ->keyBy('id');
  52. return $rewardGroups->toArray();
  53. } catch (\Exception $e) {
  54. Log::error('批量获取奖励组详情失败', [
  55. 'reward_group_ids' => $rewardGroupIds,
  56. 'error' => $e->getMessage()
  57. ]);
  58. return [];
  59. }
  60. }
  61. /**
  62. * 获取奖励组奖励
  63. *
  64. * @param int|string $rewardGroupCode 奖励组ID或编码
  65. * @return array 奖励组奖励
  66. */
  67. public static function getRewardItems($rewardGroupCode): array
  68. {
  69. try {
  70. // 获取奖励组
  71. $rewardGroup = self::getRewardGroup($rewardGroupCode);
  72. if (!$rewardGroup || $rewardGroup->rewardItems->isEmpty()) {
  73. return [];
  74. }
  75. $rewards = [];
  76. // 处理每个奖励项
  77. foreach ($rewardGroup->rewardItems as $item) {
  78. $rewardItem = [
  79. 'id' => $item->id,
  80. 'type' => $item->reward_type,
  81. 'target_id' => $item->target_id,
  82. 'quantity' => $item->quantity,
  83. 'weight' => $item->weight,
  84. 'is_guaranteed' => $item->is_guaranteed,
  85. 'group_id' => $rewardGroup->id,
  86. 'group_code' => $rewardGroup->code,
  87. 'group_name' => $rewardGroup->name,
  88. 'is_random' => $rewardGroup->is_random,
  89. 'random_count' => $rewardGroup->random_count
  90. ];
  91. // 使用统一的奖励类型描述器获取目标名称和奖励名称
  92. $rewardItem['target_name'] = \App\Module\Game\Services\RewardTypeDescriptor::getTargetNameFromModel($item);
  93. $rewardItem['reward_name'] = REWARD_TYPE::getName($item->reward_type);
  94. $rewards[] = $rewardItem;
  95. }
  96. return $rewards;
  97. } catch (\Exception $e) {
  98. Log::error('获取奖励组奖励失败', [
  99. 'reward_group' => $rewardGroupCode,
  100. 'error' => $e->getMessage()
  101. ]);
  102. return [];
  103. }
  104. }
  105. }