Эх сурвалжийг харах

重构Game模块奖励类型处理逻辑,统一处理类型判断

- 创建RewardTypeDescriptor统一奖励类型描述器,集中处理所有奖励类型的名称获取和描述生成逻辑
- 扩展REWARD_TYPE枚举,添加getTypeInfo方法提供详细的奖励类型信息
- 重构GameRewardGroup、GameRewardItem模型,使用统一的描述器替换重复的switch语句
- 重构AdminController中的奖励显示逻辑,消除硬编码的奖励类型判断
- 重构RewardGroupService,简化奖励名称获取逻辑
- 删除各个类中重复的getTargetName、formatQuantityText等方法
- 提升代码维护性,避免硬编码,统一奖励类型处理标准
notfff 7 сар өмнө
parent
commit
38b393d9c2

+ 1 - 32
app/Module/Game/AdminControllers/Actions/RandomRewardAction.php

@@ -73,43 +73,12 @@ class RandomRewardAction extends RowAction
 
         $formatted = [];
         foreach ($items as $item) {
-            $rewardTypeName = \App\Module\Game\Enums\REWARD_TYPE::getName($item->rewardType);
-            $targetName = $this->getTargetName($item);
-            $formatted[] = "• {$rewardTypeName}: {$targetName} × {$item->quantity}";
+            $formatted[] = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromDto($item, false);
         }
 
         return implode("\n", $formatted);
     }
 
-    /**
-     * 获取目标名称
-     *
-     * @param \App\Module\Game\Dtos\RewardItemDto $item
-     * @return string
-     */
-    private function getTargetName($item): string
-    {
-        switch ($item->rewardType) {
-            case \App\Module\Game\Enums\REWARD_TYPE::ITEM->value:
-                $itemModel = \App\Module\GameItems\Models\Item::find($item->targetId);
-                return $itemModel ? $itemModel->name : "物品ID: {$item->targetId}";
-
-            case \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->value:
-                // 暂时返回固定名称,后续可以根据实际模型调整
-                return "货币ID: {$item->targetId}";
-
-            case \App\Module\Game\Enums\REWARD_TYPE::PET->value:
-                $pet = \App\Module\Pet\Models\PetConfig::find($item->targetId);
-                return $pet ? $pet->name : "宠物ID: {$item->targetId}";
-
-            case \App\Module\Game\Enums\REWARD_TYPE::PET_POWER->value:
-                return "宠物体力";
-
-            default:
-                return "未知奖励类型 (ID: {$item->targetId})";
-        }
-    }
-
     /**
      * 确认信息
      *

+ 3 - 8
app/Module/Game/AdminControllers/GameRewardGroupController.php

@@ -150,19 +150,14 @@ class GameRewardGroupController extends AdminController
 
                 $html = '<div class="reward-items-list">';
                 foreach ($group->rewardItems as $item) {
-                    $rewardTypeName = REWARD_TYPE::getName($item->reward_type);
-                    $targetName = $group->getTargetName($item);
-
-                    // 处理随机数量显示
-                    $quantityText = $this->formatQuantityText($item);
+                    // 使用统一的奖励类型描述器
+                    $displayText = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromModel($item, true);
 
                     $weight = $item->weight;
                     $guaranteed = $item->is_guaranteed ? '必中' : '非必中';
 
                     $html .= '<div class="reward-item mb-2 p-2 border rounded">';
-                    $html .= '<span class="badge badge-info mr-2">' . $rewardTypeName . '</span>';
-                    $html .= '<strong>' . $targetName . '</strong>';
-                    $html .= ' × ' . $quantityText;
+                    $html .= $displayText;
                     $html .= '<br><small class="text-muted">';
                     $html .= '权重: ' . $weight . ' | ' . $guaranteed;
 

+ 10 - 63
app/Module/Game/AdminControllers/GameRewardItemController.php

@@ -126,40 +126,12 @@ class GameRewardItemController extends AdminController
                 return REWARD_TYPE::getName($type);
             });
             $grid->column('target_id', '目标')->display(function ($targetId) {
-                // 获取当前行的奖励类型
+                // 使用统一的奖励类型描述器
                 $rewardType = $this->getAttribute('reward_type');
-                // 根据奖励类型显示不同的目标信息
-                switch ($rewardType) {
-                    case REWARD_TYPE::ITEM->value:
-                        $item = Item::find($targetId);
-                        return $item ? "{$item->name} (ID: {$targetId})" : "物品 (ID: {$targetId})";
-
-                    case REWARD_TYPE::CURRENCY->value:
-                        $currency = FundCurrencyModel::find($targetId);
-                        return $currency ? "{$currency->name} (ID: {$targetId})" : "货币 (ID: {$targetId})";
-
-                    case REWARD_TYPE::FUND_CONFIG->value:
-                        $fund = FundConfigModel::find($targetId);
-                        return $fund ? "{$fund->name} (ID: {$targetId})" : "代币账户 (ID: {$targetId})";
-
-                    case REWARD_TYPE::PET_EXP->value:
-                        return "宠物经验 (宠物ID: {$targetId})";
-
-                    case REWARD_TYPE::PET_ENERGY->value:
-                        return "宠物体力 (宠物ID: {$targetId})";
-
-                    case REWARD_TYPE::FARM_SHRINE->value:
-                        $shrineName = \App\Module\Farm\Enums\BUFF_TYPE::getName($targetId);
-                        return "神像:{$shrineName} (类型: {$targetId})";
-
-                    case REWARD_TYPE::OTHER->value:
-                        return "其他奖励 (ID: {$targetId})";
-                    case REWARD_TYPE::SKIN->value:
-                        return "皮肤 (ID: {$targetId})";
-
-                    default:
-                        return "未知奖励类型 (ID: {$targetId})";
-                }
+                $param1 = $this->getAttribute('param1');
+                $param2 = $this->getAttribute('param2');
+                $targetName = \App\Module\Game\Services\RewardTypeDescriptor::getTargetName($rewardType, $targetId, $param1, $param2);
+                return "{$targetName} (ID: {$targetId})";
             });
             $grid->column('param1', '参数1');
             $grid->column('param2', '参数2');
@@ -200,37 +172,12 @@ class GameRewardItemController extends AdminController
 
             // 根据奖励类型显示不同的目标信息
             $show->field('target_id', '目标')->unescape()->as(function ($targetId) {
-                // 获取当前记录的奖励类型
+                // 使用统一的奖励类型描述器
                 $rewardType = $this->getAttribute('reward_type');
-                switch ($rewardType) {
-                    case REWARD_TYPE::ITEM->value:
-                        $item = Item::find($targetId);
-                        return $item ? "<strong>{$item->name}</strong> (ID: {$targetId})" : "物品 (ID: {$targetId})";
-
-                    case REWARD_TYPE::CURRENCY->value:
-                        $currency = FundCurrencyModel::find($targetId);
-                        return $currency ? "<strong>{$currency->name}</strong> (ID: {$targetId})" : "货币 (ID: {$targetId})";
-
-                    case REWARD_TYPE::FUND_CONFIG->value:
-                        $fund = FundConfigModel::find($targetId);
-                        return $fund ? "<strong>{$fund->name}</strong> (ID: {$targetId})" : "代币账户 (ID: {$targetId})";
-
-                    case REWARD_TYPE::PET_EXP->value:
-                        return "宠物经验 (宠物ID: {$targetId})";
-
-                    case REWARD_TYPE::PET_ENERGY->value:
-                        return "宠物体力 (宠物ID: {$targetId})";
-
-                    case REWARD_TYPE::FARM_SHRINE->value:
-                        $shrineName = \App\Module\Farm\Enums\BUFF_TYPE::getName($targetId);
-                        return "神像:{$shrineName} (类型: {$targetId})";
-
-                    case REWARD_TYPE::OTHER->value:
-                        return "其他奖励 (ID: {$targetId})";
-
-                    default:
-                        return "未知奖励类型 (ID: {$targetId})";
-                }
+                $param1 = $this->getAttribute('param1');
+                $param2 = $this->getAttribute('param2');
+                $targetName = \App\Module\Game\Services\RewardTypeDescriptor::getTargetName($rewardType, $targetId, $param1, $param2);
+                return "<strong>{$targetName}</strong> (ID: {$targetId})";
             });
 
             $show->field('param1', '参数1');

+ 1 - 40
app/Module/Game/AdminControllers/LazyRenderable/RandomRewardResultLazyRenderable.php

@@ -131,12 +131,7 @@ class RandomRewardResultLazyRenderable extends LazyRenderable
                     continue;
                 }
 
-                $rewardType = $item->rewardType ?? 0;
-                $quantity = $item->quantity ?? 0;
-
-                $rewardTypeName = \App\Module\Game\Enums\REWARD_TYPE::getName($rewardType);
-                $targetName = $this->getTargetName($item);
-                $formatted[] = "<span class=\"badge badge-info\">{$rewardTypeName}</span> {$targetName} × {$quantity}";
+                $formatted[] = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromDto($item, true);
             } catch (\Exception $e) {
                 $formatted[] = "<span class=\"text-danger\">格式化错误: " . $e->getMessage() . "</span>";
             }
@@ -145,39 +140,5 @@ class RandomRewardResultLazyRenderable extends LazyRenderable
         return implode('<br>', $formatted);
     }
 
-    /**
-     * 获取目标名称
-     *
-     * @param \App\Module\Game\Dtos\RewardItemDto $item
-     * @return string
-     */
-    private function getTargetName($item): string
-    {
-        try {
-            $rewardType = $item->rewardType ?? 0;
-            $targetId = $item->targetId ?? 0;
-
-            switch ($rewardType) {
-                case \App\Module\Game\Enums\REWARD_TYPE::ITEM->valueInt():
-                    $itemModel = \App\Module\GameItems\Models\Item::find($targetId);
-                    return $itemModel ? $itemModel->name : "物品ID: {$targetId}";
 
-                case \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->valueInt():
-                    // 暂时返回固定名称,后续可以根据实际模型调整
-                    return "货币ID: {$targetId}";
-
-                case \App\Module\Game\Enums\REWARD_TYPE::PET->valueInt():
-                    $pet = \App\Module\Pet\Models\PetConfig::find($targetId);
-                    return $pet ? $pet->name : "宠物ID: {$targetId}";
-
-                case \App\Module\Game\Enums\REWARD_TYPE::PET_POWER->valueInt():
-                    return "宠物体力";
-
-                default:
-                    return "未知奖励类型 (ID: {$targetId})";
-            }
-        } catch (\Exception $e) {
-            return "获取名称失败: " . $e->getMessage();
-        }
-    }
 }

+ 90 - 0
app/Module/Game/Enums/REWARD_TYPE.php

@@ -120,4 +120,94 @@ enum REWARD_TYPE: int
     {
         return isset(self::getAll()[$type]);
     }
+
+    /**
+     * 获取奖励类型的描述信息
+     *
+     * @param int $type
+     * @return array
+     */
+    public static function getTypeInfo(int $type): array
+    {
+        $descriptions = [
+            self::ITEM->value => [
+                'name' => '物品',
+                'description' => '奖励用户背包中的物品',
+                'target_desc' => '物品ID',
+                'param1_desc' => '品质',
+                'param2_desc' => '绑定状态',
+            ],
+            self::FUND_CONFIG->value => [
+                'name' => '账户种类',
+                'description' => '奖励用户特定账户种类的资金',
+                'target_desc' => '账户种类ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::PET_EXP->value => [
+                'name' => '宠物经验',
+                'description' => '增加宠物经验值',
+                'target_desc' => '宠物ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::PET_ENERGY->value => [
+                'name' => '宠物体力',
+                'description' => '增加宠物体力值',
+                'target_desc' => '宠物ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::CURRENCY->value => [
+                'name' => '币种',
+                'description' => '奖励用户特定币种的资金',
+                'target_desc' => '币种ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::FARM_SHRINE->value => [
+                'name' => '神像(农场buff)',
+                'description' => '奖励用户神像加持时间',
+                'target_desc' => '神像类型',
+                'param1_desc' => '神像类型(兼容)',
+                'param2_desc' => '持续时间(小时)',
+            ],
+            self::PET->value => [
+                'name' => '宠物',
+                'description' => '奖励用户宠物',
+                'target_desc' => '宠物配置ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::PET_POWER->value => [
+                'name' => '宠物体力',
+                'description' => '增加宠物体力值',
+                'target_desc' => '宠物用户ID',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::SKIN->value => [
+                'name' => '皮肤',
+                'description' => '奖励用户皮肤',
+                'target_desc' => '皮肤ID(1-4)',
+                'param1_desc' => '保留参数',
+                'param2_desc' => '保留参数',
+            ],
+            self::OTHER->value => [
+                'name' => '其他',
+                'description' => '其他类型奖励',
+                'target_desc' => '自定义ID',
+                'param1_desc' => '自定义参数1',
+                'param2_desc' => '自定义参数2',
+            ],
+        ];
+
+        return $descriptions[$type] ?? [
+            'name' => '未知',
+            'description' => '未知奖励类型',
+            'target_desc' => '未知目标',
+            'param1_desc' => '未知参数1',
+            'param2_desc' => '未知参数2',
+        ];
+    }
 }

+ 4 - 104
app/Module/Game/Models/GameRewardGroup.php

@@ -121,120 +121,20 @@ class GameRewardGroup extends ModelCore
      */
     private function formatSingleRewardItem(GameRewardItem $item): string
     {
-        $rewardTypeName = \App\Module\Game\Enums\REWARD_TYPE::getName($item->reward_type);
-        $targetName     = $this->getTargetName($item);
-
-        // 处理随机数量显示
-        $quantityText = $this->formatQuantityText($item);
+        // 使用统一的奖励类型描述器
+        $displayText = \App\Module\Game\Services\RewardTypeDescriptor::formatRewardDisplayFromModel($item, true);
 
         $weight     = $item->weight;
         $guaranteed = $item->is_guaranteed ? '必中' : '非必中';
 
         return sprintf(
-            '<span class="badge badge-info">%s</span> %s × %s (权重: %.2f, %s)',
-            $rewardTypeName,
-            $targetName,
-            $quantityText,
+            '%s (权重: %.2f, %s)',
+            $displayText,
             $weight,
             $guaranteed
         );
     }
 
-    /**
-     * 格式化数量文本
-     *
-     * @param GameRewardItem $item
-     * @return string
-     */
-    private function formatQuantityText(GameRewardItem $item): string
-    {
-        // 如果设置了最小和最大数量,显示范围
-        if ($item->min_quantity > 0 && $item->max_quantity > 0) {
-            if ($item->min_quantity == $item->max_quantity) {
-                return (string)$item->min_quantity;
-            } else {
-                return $item->min_quantity . '-' . $item->max_quantity;
-            }
-        }
-        if( $item->min_quantity >0 || $item->max_quantity > 0){
-            // 如果只设置了最小数量
-            if ($item->min_quantity == 0) {
-                return ' 数量错误 ,缺少 最大值';
-            }
-
-            // 如果只设置了最大数量
-            if ($item->max_quantity == 0) {
-                return ' 数量错误 ,缺少 最小值';
-            }
-
-        }
 
-        // 默认使用固定数量
-        return (string)$item->quantity;
-    }
-
-    /**
-     * 获取目标名称
-     *
-     * @param GameRewardItem $item
-     * @return string
-     */
-    private function getTargetName(GameRewardItem $item): string
-    {
-//        dump($item);
-        switch ($item->reward_type) {
-            case \App\Module\Game\Enums\REWARD_TYPE::ITEM->value:
-                try {
-                    $itemModel = \App\Module\GameItems\Models\Item::find($item->target_id);
-
-                    return $itemModel ? $itemModel->name : "物品 (ID: {$item->target_id})";
-                } catch (\Exception $e) {
-                    return "物品 (ID: {$item->target_id})";
-                }
-
-            case \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->value:
-                try {
-                    $currency = \App\Module\Fund\Models\FundCurrencyModel::find($item->target_id);
-
-                    return $currency ? $currency->name : "货币 (ID: {$item->target_id})";
-                } catch (\Exception $e) {
-                    return "货币 (ID: {$item->target_id})";
-                }
-
-            case \App\Module\Game\Enums\REWARD_TYPE::FUND_CONFIG->value:
-                try {
-                    $fund = \App\Module\Fund\Models\FundConfigModel::find($item->target_id);
-
-                    return $fund ? $fund->name : "账户种类 (ID: {$item->target_id})";
-                } catch (\Exception $e) {
-                    return "账户种类 (ID: {$item->target_id})";
-                }
-
-            case \App\Module\Game\Enums\REWARD_TYPE::PET_EXP->value:
-                return "宠物经验 (宠物ID: {$item->target_id})";
-
-            case \App\Module\Game\Enums\REWARD_TYPE::PET_ENERGY->value:
-                return "宠物体力 (宠物ID: {$item->target_id})";
-            case \App\Module\Game\Enums\REWARD_TYPE::PET->value:
-                $pet = \App\Module\Pet\Models\PetConfig::find($item->target_id);
-
-                return "宠物 (宠物: {$pet->name})";
-            case \App\Module\Game\Enums\REWARD_TYPE::FARM_SHRINE->value:
-                try {
-                    $shrineName    = \App\Module\Farm\Enums\BUFF_TYPE::getName($item->target_id);
-                    $durationHours = $item->param2 > 0 ? $item->param2 : 24;
-
-                    return "{$shrineName} ({$durationHours}小时)";
-                } catch (\Exception $e) {
-                    return "神像 (类型: {$item->target_id})";
-                }
-
-            case \App\Module\Game\Enums\REWARD_TYPE::OTHER->value:
-                return "其他奖励 (ID: {$item->target_id})";
-
-            default:
-                return "未知奖励类型 (ID: {$item->target_id})";
-        }
-    }
 
 }

+ 1 - 52
app/Module/Game/Models/GameRewardItem.php

@@ -120,58 +120,7 @@ class GameRewardItem extends ModelCore
      */
     public function getTargetName(): string
     {
-        switch ($this->reward_type) {
-            case REWARD_TYPE::ITEM->value:
-                try {
-                    $itemModel = \App\Module\GameItems\Models\Item::find($this->target_id);
-
-                    return $itemModel ? $itemModel->name : "物品 (ID: {$this->target_id})";
-                } catch (\Exception $e) {
-                    return "物品 (ID: {$this->target_id})";
-                }
-
-            case REWARD_TYPE::CURRENCY->value:
-                try {
-                    $currency = \App\Module\Fund\Models\FundCurrencyModel::find($this->target_id);
-
-                    return $currency ? $currency->name : "货币 (ID: {$this->target_id})";
-                } catch (\Exception $e) {
-                    return "货币 (ID: {$this->target_id})";
-                }
-
-            case REWARD_TYPE::FUND_CONFIG->value:
-                try {
-                    $fund = \App\Module\Fund\Models\FundConfigModel::find($this->target_id);
-
-                    return $fund ? $fund->name : "账户种类 (ID: {$this->target_id})";
-                } catch (\Exception $e) {
-                    return "账户种类 (ID: {$this->target_id})";
-                }
-
-            case REWARD_TYPE::PET_EXP->value:
-                return "宠物经验";
-
-            case REWARD_TYPE::PET_ENERGY->value:
-                return "宠物体力";
-
-            case REWARD_TYPE::PET_POWER->value:
-                return "宠物体力";
-
-            case REWARD_TYPE::FARM_SHRINE->value:
-                return "神像(农场buff)";
-
-            case REWARD_TYPE::PET->value:
-                try {
-                    $pet = \App\Module\Pet\Models\PetConfig::find($this->target_id);
-
-                    return $pet ? $pet->name : "宠物 (ID: {$this->target_id})";
-                } catch (\Exception $e) {
-                    return "宠物 (ID: {$this->target_id})";
-                }
-
-            default:
-                return "未知奖励类型 (ID: {$this->target_id})";
-        }
+        return \App\Module\Game\Services\RewardTypeDescriptor::getTargetNameFromModel($this);
     }
 
     /**

+ 3 - 37
app/Module/Game/Services/RewardGroupService.php

@@ -2,12 +2,8 @@
 
 namespace App\Module\Game\Services;
 
-use App\Module\Fund\Models\FundConfigModel;
-use App\Module\Fund\Models\FundCurrencyModel;
 use App\Module\Game\Enums\REWARD_TYPE;
 use App\Module\Game\Models\GameRewardGroup;
-use App\Module\GameItems\Models\Item;
-use App\Module\Pet\Models\PetConfig;
 use Illuminate\Support\Facades\Log;
 
 /**
@@ -105,39 +101,9 @@ class RewardGroupService
                     'random_count' => $rewardGroup->random_count
                 ];
 
-                // 根据奖励类型获取目标名称
-                if ($item->reward_type == REWARD_TYPE::ITEM->value) {
-                    $itemInfo = Item::find($item->target_id);
-                    $rewardItem['target_name'] = $itemInfo ? $itemInfo->name : "物品 {$item->target_id}";
-                    $rewardItem['reward_name'] = "物品奖励";
-                } elseif ($item->reward_type == REWARD_TYPE::CURRENCY->value) {
-                    $currency = FundCurrencyModel::find($item->target_id);
-                    $rewardItem['target_name'] = $currency ? $currency->name : "货币 {$item->target_id}";
-                    $rewardItem['reward_name'] = "货币奖励";
-                } elseif ($item->reward_type == REWARD_TYPE::PET_EXP->value) {
-                    $pet = PetConfig::find($item->target_id);
-                    $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
-                    $rewardItem['reward_name'] = "宠物经验";
-                } elseif ($item->reward_type == REWARD_TYPE::PET_ENERGY->value) {
-                    $pet = PetConfig::find($item->target_id);
-                    $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
-                    $rewardItem['reward_name'] = "宠物体力";
-                } elseif ($item->reward_type == REWARD_TYPE::FUND_CONFIG->value) {
-                    $fund = FundConfigModel::find($item->target_id);
-                    $rewardItem['target_name'] = $fund ? $fund->name : "代币账户 {$item->target_id}";
-                    $rewardItem['reward_name'] = "代币奖励";
-                } elseif ($item->reward_type == REWARD_TYPE::PET->value) {
-                    $petConfig = \App\Module\Pet\Models\PetConfig::find($item->target_id);
-                    $rewardItem['target_name'] = $petConfig ? $petConfig->name : "宠物配置 {$item->target_id}";
-                    $rewardItem['reward_name'] = "宠物奖励";
-                } elseif ($item->reward_type == REWARD_TYPE::PET_POWER->value) {
-                    $pet = \App\Module\Pet\Models\PetUser::find($item->target_id);
-                    $rewardItem['target_name'] = $pet ? $pet->name : "宠物 {$item->target_id}";
-                    $rewardItem['reward_name'] = "宠物体力奖励";
-                } else {
-                    $rewardItem['target_name'] = "其他 {$item->target_id}";
-                    $rewardItem['reward_name'] = "其他奖励";
-                }
+                // 使用统一的奖励类型描述器获取目标名称和奖励名称
+                $rewardItem['target_name'] = \App\Module\Game\Services\RewardTypeDescriptor::getTargetNameFromModel($item);
+                $rewardItem['reward_name'] = REWARD_TYPE::getName($item->reward_type);
 
                 $rewards[] = $rewardItem;
             }

+ 318 - 0
app/Module/Game/Services/RewardTypeDescriptor.php

@@ -0,0 +1,318 @@
+<?php
+
+namespace App\Module\Game\Services;
+
+use App\Module\Game\Enums\REWARD_TYPE;
+use App\Module\Game\Dtos\RewardItemDto;
+use App\Module\Game\Models\GameRewardItem;
+use App\Module\GameItems\Models\Item;
+use App\Module\Fund\Models\FundCurrencyModel;
+use App\Module\Fund\Models\FundConfigModel;
+use App\Module\Pet\Models\PetConfig;
+use App\Module\Pet\Models\PetUser;
+use App\Module\Farm\Enums\BUFF_TYPE;
+use Exception;
+
+/**
+ * 奖励类型描述器
+ * 
+ * 统一处理所有奖励类型的描述、名称获取等逻辑
+ * 避免在各个类中重复实现相同的逻辑
+ */
+class RewardTypeDescriptor
+{
+    /**
+     * 获取奖励目标的名称
+     *
+     * @param int $rewardType 奖励类型
+     * @param int $targetId 目标ID
+     * @param int $param1 参数1
+     * @param int $param2 参数2
+     * @return string 目标名称
+     */
+    public static function getTargetName(int $rewardType, int $targetId, int $param1 = 0, int $param2 = 0): string
+    {
+        switch ($rewardType) {
+            case REWARD_TYPE::ITEM->value:
+                return self::getItemName($targetId);
+
+            case REWARD_TYPE::CURRENCY->value:
+                return self::getCurrencyName($targetId);
+
+            case REWARD_TYPE::FUND_CONFIG->value:
+                return self::getFundConfigName($targetId);
+
+            case REWARD_TYPE::PET_EXP->value:
+                return self::getPetExpName($targetId);
+
+            case REWARD_TYPE::PET_ENERGY->value:
+                return self::getPetEnergyName($targetId);
+
+            case REWARD_TYPE::PET->value:
+                return self::getPetName($targetId);
+
+            case REWARD_TYPE::PET_POWER->value:
+                return self::getPetPowerName($targetId);
+
+            case REWARD_TYPE::FARM_SHRINE->value:
+                return self::getFarmShrineName($targetId, $param2);
+
+            case REWARD_TYPE::SKIN->value:
+                return self::getSkinName($targetId);
+
+            case REWARD_TYPE::OTHER->value:
+                return "其他奖励 (ID: {$targetId})";
+
+            default:
+                return "未知奖励类型 (ID: {$targetId})";
+        }
+    }
+
+    /**
+     * 从RewardItemDto获取目标名称
+     *
+     * @param RewardItemDto $item 奖励项DTO
+     * @return string 目标名称
+     */
+    public static function getTargetNameFromDto(RewardItemDto $item): string
+    {
+        return self::getTargetName($item->rewardType, $item->targetId, $item->param1, $item->param2);
+    }
+
+    /**
+     * 从GameRewardItem模型获取目标名称
+     *
+     * @param GameRewardItem $item 奖励项模型
+     * @return string 目标名称
+     */
+    public static function getTargetNameFromModel(GameRewardItem $item): string
+    {
+        return self::getTargetName($item->reward_type, $item->target_id, $item->param1, $item->param2);
+    }
+
+    /**
+     * 格式化奖励项显示
+     *
+     * @param int $rewardType 奖励类型
+     * @param int $targetId 目标ID
+     * @param int $quantity 数量
+     * @param int $param1 参数1
+     * @param int $param2 参数2
+     * @param bool $withBadge 是否包含徽章样式
+     * @return string 格式化后的显示文本
+     */
+    public static function formatRewardDisplay(int $rewardType, int $targetId, int $quantity, int $param1 = 0, int $param2 = 0, bool $withBadge = true): string
+    {
+        $rewardTypeName = REWARD_TYPE::getName($rewardType);
+        $targetName = self::getTargetName($rewardType, $targetId, $param1, $param2);
+
+        if ($withBadge) {
+            return "<span class=\"badge badge-info\">{$rewardTypeName}</span> {$targetName} × {$quantity}";
+        } else {
+            return "• {$rewardTypeName}: {$targetName} × {$quantity}";
+        }
+    }
+
+    /**
+     * 从RewardItemDto格式化显示
+     *
+     * @param RewardItemDto $item 奖励项DTO
+     * @param bool $withBadge 是否包含徽章样式
+     * @return string 格式化后的显示文本
+     */
+    public static function formatRewardDisplayFromDto(RewardItemDto $item, bool $withBadge = true): string
+    {
+        return self::formatRewardDisplay(
+            $item->rewardType,
+            $item->targetId,
+            $item->quantity,
+            $item->param1,
+            $item->param2,
+            $withBadge
+        );
+    }
+
+    /**
+     * 从GameRewardItem模型格式化显示
+     *
+     * @param GameRewardItem $item 奖励项模型
+     * @param bool $withBadge 是否包含徽章样式
+     * @return string 格式化后的显示文本
+     */
+    public static function formatRewardDisplayFromModel(GameRewardItem $item, bool $withBadge = true): string
+    {
+        // 处理随机数量显示
+        $quantityText = self::formatQuantityText($item);
+
+        $rewardTypeName = REWARD_TYPE::getName($item->reward_type);
+        $targetName = self::getTargetNameFromModel($item);
+
+        if ($withBadge) {
+            return "<span class=\"badge badge-info\">{$rewardTypeName}</span> {$targetName} × {$quantityText}";
+        } else {
+            return "• {$rewardTypeName}: {$targetName} × {$quantityText}";
+        }
+    }
+
+    /**
+     * 格式化数量文本(支持随机数量)
+     *
+     * @param GameRewardItem $item 奖励项模型
+     * @return string 数量文本
+     */
+    public static function formatQuantityText(GameRewardItem $item): string
+    {
+        if ($item->min_quantity !== null && $item->max_quantity !== null) {
+            if ($item->min_quantity == $item->max_quantity) {
+                return (string)$item->min_quantity;
+            } else {
+                return "{$item->min_quantity}-{$item->max_quantity}";
+            }
+        }
+
+        return (string)$item->quantity;
+    }
+
+    /**
+     * 获取物品名称
+     *
+     * @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 $petId 宠物ID
+     * @return string 宠物经验名称
+     */
+    private static function getPetExpName(int $petId): string
+    {
+        try {
+            $pet = PetConfig::find($petId);
+            return $pet ? "{$pet->name}经验" : "宠物经验 (宠物ID: {$petId})";
+        } catch (Exception $e) {
+            return "宠物经验 (宠物ID: {$petId})";
+        }
+    }
+
+    /**
+     * 获取宠物体力名称
+     *
+     * @param int $petId 宠物ID
+     * @return string 宠物体力名称
+     */
+    private static function getPetEnergyName(int $petId): string
+    {
+        try {
+            $pet = PetConfig::find($petId);
+            return $pet ? "{$pet->name}体力" : "宠物体力 (宠物ID: {$petId})";
+        } catch (Exception $e) {
+            return "宠物体力 (宠物ID: {$petId})";
+        }
+    }
+
+    /**
+     * 获取宠物名称
+     *
+     * @param int $petConfigId 宠物配置ID
+     * @return string 宠物名称
+     */
+    private static function getPetName(int $petConfigId): string
+    {
+        try {
+            $pet = PetConfig::find($petConfigId);
+            return $pet ? "宠物 ({$pet->name})" : "宠物 (配置ID: {$petConfigId})";
+        } catch (Exception $e) {
+            return "宠物 (配置ID: {$petConfigId})";
+        }
+    }
+
+    /**
+     * 获取宠物体力名称(用户宠物)
+     *
+     * @param int $petUserId 用户宠物ID
+     * @return string 宠物体力名称
+     */
+    private static function getPetPowerName(int $petUserId): string
+    {
+        try {
+            $petUser = PetUser::find($petUserId);
+            return $petUser ? "宠物体力 ({$petUser->name})" : "宠物体力 (用户宠物ID: {$petUserId})";
+        } catch (Exception $e) {
+            return "宠物体力 (用户宠物ID: {$petUserId})";
+        }
+    }
+
+    /**
+     * 获取农场神像名称
+     *
+     * @param int $shrineType 神像类型
+     * @param int $durationHours 持续时间(小时)
+     * @return string 神像名称
+     */
+    private static function getFarmShrineName(int $shrineType, int $durationHours = 24): string
+    {
+        try {
+            $shrineName = BUFF_TYPE::getName($shrineType);
+            $duration = $durationHours > 0 ? $durationHours : 24;
+            return "{$shrineName} ({$duration}小时)";
+        } catch (Exception $e) {
+            return "神像 (类型: {$shrineType})";
+        }
+    }
+
+    /**
+     * 获取皮肤名称
+     *
+     * @param int $skinId 皮肤ID
+     * @return string 皮肤名称
+     */
+    private static function getSkinName(int $skinId): string
+    {
+        return SkinService::getSkinName($skinId);
+    }
+
+
+}