ConsumeGroupService.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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\CONSUME_TYPE;
  6. use App\Module\Game\Models\GameConsumeGroup;
  7. use App\Module\Game\Models\GameConsumeItem;
  8. use App\Module\GameItems\Models\Item;
  9. use Illuminate\Support\Facades\Log;
  10. /**
  11. * 消耗组服务类
  12. *
  13. * 提供消耗组相关的服务,包括获取消耗组详情、获取消耗组材料等功能
  14. */
  15. class ConsumeGroupService
  16. {
  17. /**
  18. * 获取消耗组详情
  19. *
  20. * @param int|string $consumeGroupCode 消耗组ID或编码
  21. * @return GameConsumeGroup|null 消耗组详情
  22. */
  23. public static function getConsumeGroup($consumeGroupCode): ?GameConsumeGroup
  24. {
  25. try {
  26. // 获取消耗组
  27. $consumeGroup = is_numeric($consumeGroupCode)
  28. ? GameConsumeGroup::with('consumeItems')->find($consumeGroupCode)
  29. : GameConsumeGroup::with('consumeItems')->where('code', $consumeGroupCode)->first();
  30. return $consumeGroup;
  31. } catch (\Exception $e) {
  32. Log::error('获取消耗组详情失败', [
  33. 'consume_group' => $consumeGroupCode,
  34. 'error' => $e->getMessage()
  35. ]);
  36. return null;
  37. }
  38. }
  39. /**
  40. * 批量获取消耗组详情
  41. *
  42. * @param array $consumeGroupIds 消耗组ID数组
  43. * @return array 消耗组详情数组,以ID为键
  44. */
  45. public static function getConsumeGroups(array $consumeGroupIds): array
  46. {
  47. try {
  48. if (empty($consumeGroupIds)) {
  49. return [];
  50. }
  51. // 批量获取消耗组
  52. $consumeGroups = GameConsumeGroup::with('consumeItems')
  53. ->whereIn('id', $consumeGroupIds)
  54. ->get()
  55. ->keyBy('id');
  56. return $consumeGroups->toArray();
  57. } catch (\Exception $e) {
  58. Log::error('批量获取消耗组详情失败', [
  59. 'consume_group_ids' => $consumeGroupIds,
  60. 'error' => $e->getMessage()
  61. ]);
  62. return [];
  63. }
  64. }
  65. /**
  66. * 获取消耗组材料
  67. *
  68. * @param int|string $consumeGroupCode 消耗组ID或编码
  69. * @return array 消耗组材料
  70. */
  71. public static function getConsumeMaterials($consumeGroupCode): array
  72. {
  73. try {
  74. // 获取消耗组
  75. $consumeGroup = self::getConsumeGroup($consumeGroupCode);
  76. if (!$consumeGroup || $consumeGroup->consumeItems->isEmpty()) {
  77. return [];
  78. }
  79. return self::consumeItems2Array($consumeGroup->consumeItems);
  80. } catch (\Exception $e) {
  81. Log::error('获取消耗组材料失败', [
  82. 'consume_group' => $consumeGroupCode,
  83. 'error' => $e->getMessage()
  84. ]);
  85. return [];
  86. }
  87. }
  88. /**
  89. * 消耗组材料数组
  90. * @param array|GameConsumeItem[] $consumeGroup 消耗组
  91. * @return array 消耗组材料
  92. */
  93. static public function consumeItems2Array( $consumeItems )
  94. {
  95. $materials = [];
  96. // 处理每个消耗项
  97. foreach ($consumeItems as $item) {
  98. if ($item->consume_type == CONSUME_TYPE::ITEM->value) {
  99. // 获取物品信息
  100. $itemInfo = Item::find($item->target_id);
  101. $materials[] = [
  102. 'type' => $item->consume_type,
  103. 'item_id' => $item->target_id,
  104. 'item_name' => $itemInfo ? $itemInfo->name : "物品 {$item->target_id}",
  105. 'amount' => $item->quantity
  106. ];
  107. } elseif ($item->consume_type == CONSUME_TYPE::CURRENCY->value) {
  108. // 获取货币信息
  109. $currencyInfo = FundCurrencyModel::find($item->target_id);
  110. $materials[] = [
  111. 'type' => $item->consume_type,
  112. 'currency_id' => $item->target_id,
  113. 'currency_name' => $currencyInfo ? $currencyInfo->name : "货币 {$item->target_id}",
  114. 'amount' => $item->quantity
  115. ];
  116. } elseif ($item->consume_type == CONSUME_TYPE::FUND_CONFIG->value) {
  117. // 获取代币账户信息
  118. $fundInfo = FundConfigModel::find($item->target_id);
  119. $materials[] = [
  120. 'type' => $item->consume_type,
  121. 'fund_id' => $item->target_id,
  122. 'fund_name' => $fundInfo ? $fundInfo->name : "代币账户 {$item->target_id}",
  123. 'amount' => $item->quantity
  124. ];
  125. }
  126. }
  127. return $materials;
  128. }
  129. }