|
|
@@ -0,0 +1,100 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Module\Game\Services;
|
|
|
+
|
|
|
+use App\Module\Fund\Models\FundConfigModel;
|
|
|
+use App\Module\Fund\Models\FundCurrencyModel;
|
|
|
+use App\Module\Game\Enums\CONSUME_TYPE;
|
|
|
+use App\Module\Game\Models\GameConsumeGroup;
|
|
|
+use App\Module\GameItems\Models\Item;
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 消耗组服务类
|
|
|
+ *
|
|
|
+ * 提供消耗组相关的服务,包括获取消耗组详情、获取消耗组材料等功能
|
|
|
+ */
|
|
|
+class ConsumeGroupService
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * 获取消耗组详情
|
|
|
+ *
|
|
|
+ * @param int|string $consumeGroupCode 消耗组ID或编码
|
|
|
+ * @return GameConsumeGroup|null 消耗组详情
|
|
|
+ */
|
|
|
+ public static function getConsumeGroup($consumeGroupCode): ?GameConsumeGroup
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 获取消耗组
|
|
|
+ $consumeGroup = is_numeric($consumeGroupCode)
|
|
|
+ ? GameConsumeGroup::with('consumeItems')->find($consumeGroupCode)
|
|
|
+ : GameConsumeGroup::with('consumeItems')->where('code', $consumeGroupCode)->first();
|
|
|
+
|
|
|
+ return $consumeGroup;
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('获取消耗组详情失败', [
|
|
|
+ 'consume_group' => $consumeGroupCode,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取消耗组材料
|
|
|
+ *
|
|
|
+ * @param int|string $consumeGroupCode 消耗组ID或编码
|
|
|
+ * @return array 消耗组材料
|
|
|
+ */
|
|
|
+ public static function getConsumeMaterials($consumeGroupCode): array
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 获取消耗组
|
|
|
+ $consumeGroup = self::getConsumeGroup($consumeGroupCode);
|
|
|
+ if (!$consumeGroup || $consumeGroup->consumeItems->isEmpty()) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ $materials = [];
|
|
|
+
|
|
|
+ // 处理每个消耗项
|
|
|
+ foreach ($consumeGroup->consumeItems as $item) {
|
|
|
+ if ($item->consume_type == CONSUME_TYPE::ITEM->value) {
|
|
|
+ // 获取物品信息
|
|
|
+ $itemInfo = Item::find($item->target_id);
|
|
|
+ $materials[] = [
|
|
|
+ 'item_id' => $item->target_id,
|
|
|
+ 'item_name' => $itemInfo ? $itemInfo->name : "物品 {$item->target_id}",
|
|
|
+ 'amount' => $item->quantity
|
|
|
+ ];
|
|
|
+ } elseif ($item->consume_type == CONSUME_TYPE::CURRENCY->value) {
|
|
|
+ // 获取货币信息
|
|
|
+ $currencyInfo = FundCurrencyModel::find($item->target_id);
|
|
|
+ $materials[] = [
|
|
|
+ 'currency_id' => $item->target_id,
|
|
|
+ 'currency_name' => $currencyInfo ? $currencyInfo->name : "货币 {$item->target_id}",
|
|
|
+ 'amount' => $item->quantity
|
|
|
+ ];
|
|
|
+ } elseif ($item->consume_type == CONSUME_TYPE::FUND->value) {
|
|
|
+ // 获取代币账户信息
|
|
|
+ $fundInfo = FundConfigModel::find($item->target_id);
|
|
|
+ $materials[] = [
|
|
|
+ 'fund_id' => $item->target_id,
|
|
|
+ 'fund_name' => $fundInfo ? $fundInfo->name : "代币账户 {$item->target_id}",
|
|
|
+ 'amount' => $item->quantity
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $materials;
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('获取消耗组材料失败', [
|
|
|
+ 'consume_group' => $consumeGroupCode,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|