ConsumeGroupService.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. namespace App\Module\Game\Services;
  3. use App\Module\Game\Models\GameConsumeGroup;
  4. use Illuminate\Support\Facades\Log;
  5. /**
  6. * 消耗组服务类
  7. *
  8. * 提供消耗组相关的服务,包括获取消耗组详情、获取消耗组材料等功能
  9. */
  10. class ConsumeGroupService
  11. {
  12. /**
  13. * 获取消耗组详情
  14. *
  15. * @param int|string $consumeGroupCode 消耗组ID或编码
  16. * @return GameConsumeGroup|null 消耗组详情
  17. */
  18. public static function getConsumeGroup($consumeGroupCode): ?GameConsumeGroup
  19. {
  20. try {
  21. // 获取消耗组
  22. $consumeGroup = is_numeric($consumeGroupCode)
  23. ? GameConsumeGroup::with('consumeItems')->find($consumeGroupCode)
  24. : GameConsumeGroup::with('consumeItems')->where('code', $consumeGroupCode)->first();
  25. return $consumeGroup;
  26. } catch (\Exception $e) {
  27. Log::error('获取消耗组详情失败', [
  28. 'consume_group' => $consumeGroupCode,
  29. 'error' => $e->getMessage()
  30. ]);
  31. return null;
  32. }
  33. }
  34. /**
  35. * 批量获取消耗组详情
  36. *
  37. * @param array $consumeGroupIds 消耗组ID数组
  38. * @return array 消耗组详情数组,以ID为键
  39. */
  40. public static function getConsumeGroups(array $consumeGroupIds): array
  41. {
  42. try {
  43. if (empty($consumeGroupIds)) {
  44. return [];
  45. }
  46. // 批量获取消耗组
  47. $consumeGroups = GameConsumeGroup::with('consumeItems')
  48. ->whereIn('id', $consumeGroupIds)
  49. ->get()
  50. ->keyBy('id');
  51. return $consumeGroups->toArray();
  52. } catch (\Exception $e) {
  53. Log::error('批量获取消耗组详情失败', [
  54. 'consume_group_ids' => $consumeGroupIds,
  55. 'error' => $e->getMessage()
  56. ]);
  57. return [];
  58. }
  59. }
  60. /**
  61. * 获取消耗组材料
  62. *
  63. * @param int|string $consumeGroupCode 消耗组ID或编码
  64. * @return array 消耗组材料
  65. */
  66. public static function getConsumeMaterials($consumeGroupCode): array
  67. {
  68. try {
  69. // 获取消耗组
  70. $consumeGroup = self::getConsumeGroup($consumeGroupCode);
  71. if (!$consumeGroup || $consumeGroup->consumeItems->isEmpty()) {
  72. return [];
  73. }
  74. return self::consumeItems2Array($consumeGroup->consumeItems);
  75. } catch (\Exception $e) {
  76. Log::error('获取消耗组材料失败', [
  77. 'consume_group' => $consumeGroupCode,
  78. 'error' => $e->getMessage()
  79. ]);
  80. return [];
  81. }
  82. }
  83. /**
  84. * 消耗组材料数组
  85. * @param array|GameConsumeItem[] $consumeGroup 消耗组
  86. * @return array 消耗组材料
  87. */
  88. static public function consumeItems2Array( $consumeItems )
  89. {
  90. $materials = [];
  91. // 处理每个消耗项
  92. foreach ($consumeItems as $item) {
  93. // 使用统一的消耗类型描述器转换为数组
  94. $materials[] = \App\Module\Game\Services\ConsumeTypeDescriptor::convertToArray($item);
  95. }
  96. return $materials;
  97. }
  98. }