get('group_id'); // 如果有消耗组ID,则显示该消耗组的信息 if ($groupId) { $group = GameConsumeGroup::find($groupId); if ($group) { $content->body(new Card( '消耗组信息', "
ID: {$group->id}
" . "名称: {$group->name}
" . "编码: {$group->code}
" . "描述: {$group->description}
" )); } } return $content ->title($this->title()) ->description('管理消耗项') ->body($this->grid()); } /** * 创建表格 * * @return Grid */ protected function grid() { return Grid::make(new GameConsumeItemRepository(), 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(' 添加消耗项 '); }); } $grid->column('id', 'ID')->sortable(); $grid->column('group_id', '消耗组')->display(function ($groupId) { $group = GameConsumeGroup::find($groupId); return $group ? "{$group->name} ({$group->code})" : "未知 ({$groupId})"; }); $grid->column('consume_type', '消耗类型')->display(function ($type) { return CONSUME_TYPE::getName($type); }); $grid->column('target_id', '目标')->display(function ($targetId) { // 获取完整的消耗项对象 $consumeItem = GameConsumeItem::find($this->getAttribute('id')); if (!$consumeItem) { return $targetId; } // 根据消耗类型显示目标名称 if ($consumeItem->consume_type == CONSUME_TYPE::ITEM->value) { $item = Item::find($targetId); return $item ? "{$item->name} (ID: {$targetId})" : "物品 (ID: {$targetId})"; } elseif ($consumeItem->consume_type == CONSUME_TYPE::CURRENCY->value) { $currency = FundCurrencyModel::find($targetId); return $currency ? "{$currency->name} (ID: {$targetId})" : "货币 (ID: {$targetId})"; } elseif ($consumeItem->consume_type == CONSUME_TYPE::FUND_CONFIG->value) { $fund = FundConfigModel::find($targetId); return $fund ? "{$fund->name} (ID: {$targetId})" : "代币账户 (ID: {$targetId})"; } return $targetId; }); $grid->column('quantity', '数量'); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 添加行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 添加复制操作 $actions->append(new DuplicateConsumeItemAction()); }); $grid->filter(function (Grid\Filter $filter) { $filter->equal('id', 'ID'); $filter->equal('group_id', '消耗组')->select( GameConsumeGroup::pluck('name', 'id') ); $filter->equal('consume_type', '消耗类型')->select(CONSUME_TYPE::getAll()); $filter->equal('target_id', '目标ID'); }); }); } /** * 创建详情页 * * @param mixed $id * @return Show */ protected function detail($id) { return Show::make($id, new GameConsumeItemRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('group_id', '消耗组')->as(function ($groupId) { $group = GameConsumeGroup::find($groupId); return $group ? "{$group->name} ({$group->code})" : "未知 ({$groupId})"; }); $show->field('consume_type', '消耗类型')->as(function ($type) { return CONSUME_TYPE::getName($type); }); $show->field('target_id', '目标ID')->as(function ($targetId) { // 根据消耗类型显示目标名称 $consumeType = $this->getAttribute('consume_type'); if ($consumeType == CONSUME_TYPE::ITEM->value) { $item = Item::find($targetId); return $item ? "{$item->name} ({$targetId})" : $targetId; } elseif ($consumeType == CONSUME_TYPE::CURRENCY->value) { $currency = FundCurrencyModel::find($targetId); return $currency ? "{$currency->name} ({$targetId})" : $targetId; } elseif ($consumeType == CONSUME_TYPE::FUND_CONFIG->value) { $fund = FundConfigModel::find($targetId); return $fund ? "{$fund->name} ({$targetId})" : $targetId; } return $targetId; }); $show->field('param1', '参数1'); $show->field('param2', '参数2'); $show->field('quantity', '数量'); $show->field('extra_data', '额外数据')->json(); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); }); } /** * 创建表单 * * @return Form */ protected function form() { return Form::make(new GameConsumeItemRepository(), function (Form $form) { $form->display('id', 'ID'); // 如果有group_id参数,则默认选中该消耗组 $groupId = request()->get('group_id'); $form->select('group_id', '消耗组') ->options(GameConsumeGroup::pluck('name', 'id')) ->default($groupId); $form->select('consume_type', '消耗类型') ->options(CONSUME_TYPE::getAll()) ->required() ->default(request()->input('consume_type')); $form->select('target_id', '目标ID') ->options(function () { $consumeType = request()->input('consume_type', $this->consume_type); // 使用统一的消耗类型描述器获取目标选项 return \App\Module\Game\Services\ConsumeTypeDescriptor::getTargetOptions($consumeType); }); $form->number('param1', '参数1') ->default(0) ->help('根据消耗类型不同含义,如物品的品质、货币的来源等'); $form->number('param2', '参数2') ->default(0) ->help('根据消耗类型不同含义,如物品的绑定状态、货币的类型等'); $form->number('quantity', '数量') ->default(1) ->min(1) ->required(); $form->textarea('extra_data', '额外数据') ->help('JSON格式,可存储特定消耗类型的额外参数'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); Admin::script(<<