get('group_id'); // 如果有奖励组ID,则显示该奖励组的信息 if ($groupId) { $group = GameRewardGroup::find($groupId); if ($group) { $content->body(new Card( '奖励组信息', "
ID: {$group->id}
" . "名称: {$group->name}
" . "编码: {$group->code}
" . "描述: {$group->description}
" . "随机发放: " . ($group->is_random ? '是' : '否') . "
" . ($group->is_random ? "随机数量: {$group->random_count}
" : '') )); } } return $content ->title($this->title()) ->description('管理奖励项') ->body($this->grid()); } /** * 创建表格 * * @return Grid */ protected function grid() { return Grid::make(new GameRewardItemRepository(), function (Grid $grid) { // 获取请求中的奖励组ID $groupId = request()->get('group_id'); // 如果有奖励组ID,则只显示该奖励组的奖励项 if ($groupId) { $grid->model()->where('group_id', $groupId); // 添加返回按钮 $grid->tools(function (Grid\Tools $tools) use ($groupId) { $tools->append(' 返回奖励组 '); }); // 添加创建按钮 $grid->tools(function (Grid\Tools $tools) use ($groupId) { $tools->append(' 添加奖励项 '); }); } else { // 如果没有奖励组ID,则添加奖励组筛选 $grid->filter(function (Grid\Filter $filter) { $filter->equal('id', 'ID'); $filter->equal('group_id', '奖励组')->select( GameRewardGroup::pluck('name', 'id') ); $filter->equal('reward_type', '奖励类型')->select(REWARD_TYPE::getAll()); $filter->equal('target_id', '目标ID'); $filter->equal('is_guaranteed', '必中')->select([0 => '否', 1 => '是']); }); } $grid->column('id', 'ID')->sortable(); $grid->column('group_id', '奖励组')->display(function ($groupId) { $group = GameRewardGroup::find($groupId); return $group ? "{$group->name} (ID: {$groupId})" : "未知 ({$groupId})"; }); $grid->column('reward_type', '奖励类型')->display(function ($type) { return REWARD_TYPE::getName($type); }); $grid->column('target_id', '目标')->display(function ($targetId) { // 使用统一的奖励类型描述器 $rewardType = $this->getAttribute('reward_type'); $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'); $grid->column('quantity', '数量'); $grid->column('min_quantity', '最小数量'); $grid->column('max_quantity', '最大数量'); $grid->column('weight', '权重'); $grid->column('probability', '概率(%)'); $grid->column('is_guaranteed', '必中')->switch(); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 添加行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 添加复制按钮 $actions->append(new DuplicateRewardItemAction()); }); }); } /** * 创建详情页 * * @param mixed $id * @return Show */ protected function detail($id) { return Show::make($id, new GameRewardItemRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('group_id', '奖励组')->as(function ($groupId) { $group = GameRewardGroup::find($groupId); return $group ? "{$group->name} (ID: {$groupId})" : "未知 ({$groupId})"; }); $show->field('reward_type', '奖励类型')->as(function ($type) { return REWARD_TYPE::getName($type); }); // 根据奖励类型显示不同的目标信息 $show->field('target_id', '目标')->unescape()->as(function ($targetId) { // 使用统一的奖励类型描述器 $rewardType = $this->getAttribute('reward_type'); $param1 = $this->getAttribute('param1'); $param2 = $this->getAttribute('param2'); $targetName = \App\Module\Game\Services\RewardTypeDescriptor::getTargetName($rewardType, $targetId, $param1, $param2); return "{$targetName} (ID: {$targetId})"; }); $show->field('param1', '参数1'); $show->field('param2', '参数2'); $show->field('quantity', '数量'); $show->field('min_quantity', '最小数量'); $show->field('max_quantity', '最大数量'); $show->field('weight', '权重'); $show->field('probability', '概率(%)'); $show->field('is_guaranteed', '必中')->as(function ($value) { return $value ? '是' : '否'; }); $show->field('extra_data', '额外数据')->json(); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 添加返回按钮 $show->tools(function (Show\Tools $tools) { // 简单地添加返回列表按钮,不需要获取当前记录ID $tools->append(' 返回列表 '); }); }); } /** * 创建表单 * * @return Form */ protected function form() { return Form::make(new GameRewardItemRepository(), function (Form $form) { $form->display('id', 'ID'); // 获取请求中的奖励组ID $groupId = request()->get('group_id'); $form->tools(function ( Form\Tools $tools) { $tools->append(new RewareItemGroupInfoList()); $tools->append(new RewareGroupInfo()); // $tools->disableDelete(); }); $rewardType = $form->model()->reward_type ?? request()->get('reward_type'); // 如果有奖励组ID,则设置默认值 if ($groupId && $form->isCreating()) { $form->hidden('group_id')->default($groupId); // 显示奖励组信息 $group = GameRewardGroup::find($groupId); if ($group) { $form->display('group_info', '奖励组')->value("{$group->name} (ID: {$groupId})"); } } else { $form->select('group_id', '奖励组') ->options(GameRewardGroup::pluck('name', 'id')) ->required()->readOnly(); } if($form->isEditing()) { $form->select('reward_type', '奖励类型') ->options(REWARD_TYPE::getAll()) ->readOnly() ->required(); }else{ $form->select('reward_type', '奖励类型') ->options(REWARD_TYPE::getAll()) ->default($rewardType); } $form->select('target_id', '目标ID') ->options(function () use ($form,$rewardType) { // 获取当前奖励类型 // 根据奖励类型返回不同的选项 if ($rewardType == REWARD_TYPE::ITEM->value) { // 物品类型,返回物品列表 return Item::pluck('name', 'id')->toArray(); } elseif ($rewardType == REWARD_TYPE::CURRENCY->value) { // 货币类型,返回货币列表 return FundCurrencyModel::pluck('name', 'id')->toArray(); } elseif ($rewardType == REWARD_TYPE::FUND_CONFIG->value) { // 代币账户类型,返回代币账户列表 return FundConfigModel::pluck('name', 'id')->toArray(); } elseif ($rewardType == REWARD_TYPE::FARM_SHRINE->value) { // 神像类型,返回神像类型列表 return \App\Module\Farm\Enums\BUFF_TYPE::getAll(); }elseif ($rewardType == REWARD_TYPE::PET->value) { // 宠物 return PetConfig::pluck('name', 'id')->toArray(); }elseif ($rewardType == REWARD_TYPE::SKIN->value) { // 宠物 return SKIN::getValueDescription(); } // 默认返回空选项 return []; }) ->required() ->help('根据奖励类型不同,表示物品ID、货币ID等'); $form->number('param1', '参数1') ->default(0) ->help('根据奖励类型不同含义:物品-品质,货币-来源,神像-神像类型(与目标ID相同)'); $form->number('param2', '参数2') ->default(0) ->help('根据奖励类型不同含义:物品-绑定状态,货币-类型,神像-持续时间(小时,默认24)'); $form->number('quantity', '数量') ->default(1) ->min(1) ->required() ->help('当最小/最大数量为空时使用此数量'); $form->number('min_quantity', '最小数量') ->min(1) ->help('数量范围的最小值,为空时使用数量字段'); $form->number('max_quantity', '最大数量') ->min(1) ->help('数量范围的最大值,为空时使用数量字段'); $form->number('weight', '权重') ->default(1.00) ->required() ->help('权重选择模式时使用,权重越高,被选中的概率越大'); $form->number('probability', '概率(%)') ->min(0) ->max(100) ->help('独立概率模式时使用,0-100的百分比概率'); $form->switch('is_guaranteed', '必中') ->default(0) ->help('开启后,在随机发放时会优先选择'); $form->textarea('extra_data', '额外数据') ->help('JSON格式,可存储特定奖励类型的额外参数'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); // 添加动态更新目标ID选择器的JavaScript Admin::script(<<