|
|
@@ -0,0 +1,241 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Module\Game\Services;
|
|
|
+
|
|
|
+use App\Module\Game\Enums\CONSUME_TYPE;
|
|
|
+use App\Module\Game\Models\GameConsumeItem;
|
|
|
+use App\Module\GameItems\Models\Item;
|
|
|
+use App\Module\Fund\Models\FundCurrencyModel;
|
|
|
+use App\Module\Fund\Models\FundConfigModel;
|
|
|
+use Exception;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 消耗类型描述器
|
|
|
+ *
|
|
|
+ * 统一处理所有消耗类型的描述、名称获取等逻辑
|
|
|
+ * 避免在各个类中重复实现相同的逻辑
|
|
|
+ */
|
|
|
+class ConsumeTypeDescriptor
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * 获取消耗目标的名称
|
|
|
+ *
|
|
|
+ * @param int $consumeType 消耗类型
|
|
|
+ * @param int $targetId 目标ID
|
|
|
+ * @param int $param1 参数1
|
|
|
+ * @param int $param2 参数2
|
|
|
+ * @return string 目标名称
|
|
|
+ */
|
|
|
+ public static function getTargetName(int $consumeType, int $targetId, int $param1 = 0, int $param2 = 0): string
|
|
|
+ {
|
|
|
+ switch ($consumeType) {
|
|
|
+ case CONSUME_TYPE::ITEM->value:
|
|
|
+ return self::getItemName($targetId);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::CURRENCY->value:
|
|
|
+ return self::getCurrencyName($targetId);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::FUND_CONFIG->value:
|
|
|
+ return self::getFundConfigName($targetId);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::FUND_CONFIGS->value:
|
|
|
+ return self::getFundConfigsName($targetId);
|
|
|
+
|
|
|
+ default:
|
|
|
+ return "未知消耗类型 (ID: {$targetId})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从GameConsumeItem模型获取目标名称
|
|
|
+ *
|
|
|
+ * @param GameConsumeItem $item 消耗项模型
|
|
|
+ * @return string 目标名称
|
|
|
+ */
|
|
|
+ public static function getTargetNameFromModel(GameConsumeItem $item): string
|
|
|
+ {
|
|
|
+ return self::getTargetName($item->consume_type, $item->target_id, $item->param1, $item->param2);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化消耗项显示
|
|
|
+ *
|
|
|
+ * @param int $consumeType 消耗类型
|
|
|
+ * @param int $targetId 目标ID
|
|
|
+ * @param int $quantity 数量
|
|
|
+ * @param int $param1 参数1
|
|
|
+ * @param int $param2 参数2
|
|
|
+ * @param bool $withBadge 是否包含徽章样式
|
|
|
+ * @return string 格式化后的显示文本
|
|
|
+ */
|
|
|
+ public static function formatConsumeDisplay(int $consumeType, int $targetId, int $quantity, int $param1 = 0, int $param2 = 0, bool $withBadge = true): string
|
|
|
+ {
|
|
|
+ $consumeTypeName = CONSUME_TYPE::getName($consumeType);
|
|
|
+ $targetName = self::getTargetName($consumeType, $targetId, $param1, $param2);
|
|
|
+
|
|
|
+ if ($withBadge) {
|
|
|
+ return "<span class=\"badge badge-danger\">{$consumeTypeName}</span> {$targetName} × {$quantity}";
|
|
|
+ } else {
|
|
|
+ return "• {$consumeTypeName}: {$targetName} × {$quantity}";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从GameConsumeItem模型格式化显示
|
|
|
+ *
|
|
|
+ * @param GameConsumeItem $item 消耗项模型
|
|
|
+ * @param bool $withBadge 是否包含徽章样式
|
|
|
+ * @return string 格式化后的显示文本
|
|
|
+ */
|
|
|
+ public static function formatConsumeDisplayFromModel(GameConsumeItem $item, bool $withBadge = true): string
|
|
|
+ {
|
|
|
+ return self::formatConsumeDisplay(
|
|
|
+ $item->consume_type,
|
|
|
+ $item->target_id,
|
|
|
+ $item->quantity,
|
|
|
+ $item->param1,
|
|
|
+ $item->param2,
|
|
|
+ $withBadge
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取消耗类型的目标选项(用于表单)
|
|
|
+ *
|
|
|
+ * @param int $consumeType 消耗类型
|
|
|
+ * @return array 目标选项数组
|
|
|
+ */
|
|
|
+ public static function getTargetOptions(int $consumeType): array
|
|
|
+ {
|
|
|
+ switch ($consumeType) {
|
|
|
+ case CONSUME_TYPE::ITEM->value:
|
|
|
+ return Item::pluck('name', 'id')->toArray();
|
|
|
+
|
|
|
+ case CONSUME_TYPE::CURRENCY->value:
|
|
|
+ return FundCurrencyModel::pluck('name', 'id')->toArray();
|
|
|
+
|
|
|
+ case CONSUME_TYPE::FUND_CONFIG->value:
|
|
|
+ case CONSUME_TYPE::FUND_CONFIGS->value:
|
|
|
+ return FundConfigModel::pluck('name', 'id')->toArray();
|
|
|
+
|
|
|
+ default:
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换消耗项为数组格式(用于API返回)
|
|
|
+ *
|
|
|
+ * @param GameConsumeItem $item 消耗项模型
|
|
|
+ * @return array 消耗项数组
|
|
|
+ */
|
|
|
+ public static function convertToArray(GameConsumeItem $item): array
|
|
|
+ {
|
|
|
+ $baseArray = [
|
|
|
+ 'type' => $item->consume_type,
|
|
|
+ 'amount' => $item->quantity
|
|
|
+ ];
|
|
|
+
|
|
|
+ switch ($item->consume_type) {
|
|
|
+ case CONSUME_TYPE::ITEM->value:
|
|
|
+ $itemInfo = Item::find($item->target_id);
|
|
|
+ return array_merge($baseArray, [
|
|
|
+ 'item_id' => $item->target_id,
|
|
|
+ 'item_name' => $itemInfo ? $itemInfo->name : "物品 {$item->target_id}",
|
|
|
+ ]);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::CURRENCY->value:
|
|
|
+ $currencyInfo = FundCurrencyModel::find($item->target_id);
|
|
|
+ return array_merge($baseArray, [
|
|
|
+ 'currency_id' => $item->target_id,
|
|
|
+ 'currency_name' => $currencyInfo ? $currencyInfo->name : "货币 {$item->target_id}",
|
|
|
+ ]);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::FUND_CONFIG->value:
|
|
|
+ $fundInfo = FundConfigModel::find($item->target_id);
|
|
|
+ return array_merge($baseArray, [
|
|
|
+ 'fund_id' => $item->target_id,
|
|
|
+ 'fund_name' => $fundInfo ? $fundInfo->name : "代币账户 {$item->target_id}",
|
|
|
+ ]);
|
|
|
+
|
|
|
+ case CONSUME_TYPE::FUND_CONFIGS->value:
|
|
|
+ $fundInfo = FundConfigModel::find($item->target_id);
|
|
|
+ return array_merge($baseArray, [
|
|
|
+ 'fund_id' => $item->target_id,
|
|
|
+ 'fund_name' => $fundInfo ? $fundInfo->name : "代币账户 {$item->target_id}",
|
|
|
+ 'fund_configs' => $item->extra_data ? json_decode($item->extra_data, true) : [],
|
|
|
+ ]);
|
|
|
+
|
|
|
+ default:
|
|
|
+ return array_merge($baseArray, [
|
|
|
+ 'target_id' => $item->target_id,
|
|
|
+ 'target_name' => "未知类型 {$item->target_id}",
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取物品名称
|
|
|
+ *
|
|
|
+ * @param int $itemId 物品ID
|
|
|
+ * @return string 物品名称
|
|
|
+ */
|
|
|
+ private static function getItemName(int $itemId): string
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $item = Item::find($itemId);
|
|
|
+ return $item ? $item->name : "物品 (ID: {$itemId})";
|
|
|
+ } catch (Exception $e) {
|
|
|
+ return "物品 (ID: {$itemId})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取货币名称
|
|
|
+ *
|
|
|
+ * @param int $currencyId 货币ID
|
|
|
+ * @return string 货币名称
|
|
|
+ */
|
|
|
+ private static function getCurrencyName(int $currencyId): string
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $currency = FundCurrencyModel::find($currencyId);
|
|
|
+ return $currency ? $currency->name : "货币 (ID: {$currencyId})";
|
|
|
+ } catch (Exception $e) {
|
|
|
+ return "货币 (ID: {$currencyId})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取账户种类名称
|
|
|
+ *
|
|
|
+ * @param int $fundConfigId 账户种类ID
|
|
|
+ * @return string 账户种类名称
|
|
|
+ */
|
|
|
+ private static function getFundConfigName(int $fundConfigId): string
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $fund = FundConfigModel::find($fundConfigId);
|
|
|
+ return $fund ? $fund->name : "代币账户 (ID: {$fundConfigId})";
|
|
|
+ } catch (Exception $e) {
|
|
|
+ return "代币账户 (ID: {$fundConfigId})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取多账户种类名称
|
|
|
+ *
|
|
|
+ * @param int $fundConfigId 主账户种类ID
|
|
|
+ * @return string 多账户种类名称
|
|
|
+ */
|
|
|
+ private static function getFundConfigsName(int $fundConfigId): string
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ $fund = FundConfigModel::find($fundConfigId);
|
|
|
+ $baseName = $fund ? $fund->name : "代币账户 {$fundConfigId}";
|
|
|
+ return "多账户种类 ({$baseName})";
|
|
|
+ } catch (Exception $e) {
|
|
|
+ return "多账户种类 (ID: {$fundConfigId})";
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|