model()->with(['consumeItems', 'tags']); $grid->column('id', 'ID')->sortable(); $grid->column('name', '名称'); $grid->column('code', '编码'); $grid->column('description', '描述')->limit(30); // 标签列 $grid->column('tags', '标签')->display(function () { return $this->formatTags(); })->width(200); // 消耗详情列 $grid->column('consume_details', '消耗详情')->display(function () { return $this->formatConsumeDetails(); })->width(300); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 添加消耗项数量统计和链接 $grid->column('items_count', '消耗项数量')->display(function () { $count = GameConsumeItem::where('group_id', $this->getAttribute('id'))->count(); return "{$count} "; }); // 添加行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 添加复制操作 $actions->append(new DuplicateConsumeGroupAction()); // 添加管理消耗项操作 $actions->append(' 管理消耗项 '); }); $grid->filter(function (Grid\Filter $filter) { $filter->equal('id', 'ID'); $filter->like('name', '名称'); $filter->like('code', '编码'); // 标签筛选 $tagRepository = new \App\Module\Game\Repositorys\GameTagRepository(); $filter->whereHas('tags', '标签', function ($query) { $query->where('id', request('tags')); })->select($tagRepository->getActiveTagOptions()); }); }); } /** * 创建详情页 * * @param mixed $id * @return Show */ protected function detail($id) { return Show::make($id, new GameConsumeGroupRepository(['tags']), function (Show $show) { $show->field('id', 'ID'); $show->field('name', '名称'); $show->field('code', '编码'); $show->field('description', '描述'); // 标签显示 $show->field('tags', '标签')->as(function ($tags) { if (empty($tags)) { return '无标签'; } $tagHtml = []; foreach ($tags as $tag) { // 使用静态方法计算对比色 $contrastColor = \App\Module\Game\AdminControllers\GameConsumeGroupController::calculateContrastColor($tag['color']); $tagHtml[] = sprintf( '%s', $tag['color'], $contrastColor, $tag['name'] ); } return implode(' ', $tagHtml); }); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 显示消耗项列表 $show->relation('consumeItems', '消耗项列表', function ($model) { $grid = new Grid(new GameConsumeItemRepository()); $grid->model()->where('group_id', $model->id); $grid->column('id', 'ID'); $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; } // 使用统一的消耗类型描述器获取目标名称 $targetName = \App\Module\Game\Services\ConsumeTypeDescriptor::getTargetName($consumeItem->consume_type, $targetId); return "{$targetName} (ID: {$targetId})"; }); $grid->column('quantity', '数量'); // 添加操作按钮 $grid->disableCreateButton(); $grid->actions(function (Grid\Displayers\Actions $actions) { $actions->disableDelete(); $actions->disableEdit(); $actions->disableView(); // 添加编辑链接 $actions->append(' 编辑 '); }); $grid->disableBatchDelete(); $grid->disableRowSelector(); // 添加创建按钮 $grid->tools(function (Grid\Tools $tools) use ($model) { $tools->append(' 添加消耗项 '); }); return $grid; }); // 添加返回按钮 $show->tools(function (Show\Tools $tools) { $tools->append(' 返回列表 '); }); }); } /** * 创建表单 * * @return Form */ protected function form() { return Form::make(new GameConsumeGroupRepository(['tags']), function (Form $form) { $form->display('id', 'ID'); $form->text('name', '名称')->required(); $form->text('code', '编码') ->required() ->creationRules(['required', 'unique:game_consume_groups,code']) ->updateRules(['required', 'unique:game_consume_groups,code,{{id}}']); $form->textarea('description', '描述'); // 标签选择 $tagRepository = new \App\Module\Game\Repositorys\GameTagRepository(); $form->multipleSelect('tags', '标签') ->options($tagRepository->getActiveTagOptions()) ->help('可以选择多个标签来分类管理消耗组'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); // 添加提示信息,告知用户如何管理消耗项 if ($form->isEditing()) { $id = $form->getKey(); $form->html('

消耗项管理已移至单独页面,请保存当前表单后使用以下链接管理消耗项:

管理消耗项
'); } else { $form->html('

消耗项管理已移至单独页面,请先保存当前表单,然后才能添加消耗项。

'); } }); } /** * 根据背景色获取对比色 * * @param string $hexColor * @return string */ public static function calculateContrastColor(string $hexColor): string { $hexColor = ltrim($hexColor, '#'); $r = hexdec(substr($hexColor, 0, 2)); $g = hexdec(substr($hexColor, 2, 2)); $b = hexdec(substr($hexColor, 4, 2)); $brightness = ($r * 299 + $g * 587 + $b * 114) / 1000; return $brightness > 128 ? '#000000' : '#ffffff'; } }