ConsumeGroupService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 int|string $consumeGroupCode 消耗组ID或编码
  43. * @return array 消耗组材料
  44. */
  45. public static function getConsumeMaterials($consumeGroupCode): array
  46. {
  47. try {
  48. // 获取消耗组
  49. $consumeGroup = self::getConsumeGroup($consumeGroupCode);
  50. if (!$consumeGroup || $consumeGroup->consumeItems->isEmpty()) {
  51. return [];
  52. }
  53. return self::consumeItems2Array($consumeGroup->consumeItems);
  54. } catch (\Exception $e) {
  55. Log::error('获取消耗组材料失败', [
  56. 'consume_group' => $consumeGroupCode,
  57. 'error' => $e->getMessage()
  58. ]);
  59. return [];
  60. }
  61. }
  62. /**
  63. * 消耗组材料数组
  64. * @param array|GameConsumeItem[] $consumeGroup 消耗组
  65. * @return array 消耗组材料
  66. */
  67. static public function consumeItems2Array( $consumeItems )
  68. {
  69. $materials = [];
  70. // 处理每个消耗项
  71. foreach ($consumeItems as $item) {
  72. if ($item->consume_type == CONSUME_TYPE::ITEM->value) {
  73. // 获取物品信息
  74. $itemInfo = Item::find($item->target_id);
  75. $materials[] = [
  76. 'type' => $item->consume_type,
  77. 'item_id' => $item->target_id,
  78. 'item_name' => $itemInfo ? $itemInfo->name : "物品 {$item->target_id}",
  79. 'amount' => $item->quantity
  80. ];
  81. } elseif ($item->consume_type == CONSUME_TYPE::CURRENCY->value) {
  82. // 获取货币信息
  83. $currencyInfo = FundCurrencyModel::find($item->target_id);
  84. $materials[] = [
  85. 'type' => $item->consume_type,
  86. 'currency_id' => $item->target_id,
  87. 'currency_name' => $currencyInfo ? $currencyInfo->name : "货币 {$item->target_id}",
  88. 'amount' => $item->quantity
  89. ];
  90. } elseif ($item->consume_type == CONSUME_TYPE::FUND_CONFIG->value) {
  91. // 获取代币账户信息
  92. $fundInfo = FundConfigModel::find($item->target_id);
  93. $materials[] = [
  94. 'type' => $item->consume_type,
  95. 'fund_id' => $item->target_id,
  96. 'fund_name' => $fundInfo ? $fundInfo->name : "代币账户 {$item->target_id}",
  97. 'amount' => $item->quantity
  98. ];
  99. }
  100. }
  101. return $materials;
  102. }
  103. }