model()->with(['conditionItems', 'tags']); $grid->column('id', 'ID')->sortable(); $grid->column('name', '名称'); $grid->column('code', '编码'); $grid->column('description', '描述')->limit(30); $grid->column('logic_type', '逻辑类型')->display(function ($logicType) { return GameConditionGroup::getLogicTypes()[$logicType] ?? '未知'; }); // 标签列 $grid->column('tags', '标签')->display(function () { return $this->formatTags(); })->width(200); // 条件详情列 $grid->column('condition_details', '条件详情')->display(function () { return $this->formatConditionDetails(); })->width(300); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 添加条件项数量统计 $grid->column('items_count', '条件项数量')->display(function () { return GameConditionItem::where('group_id', $this->getAttribute('id'))->count(); }); $grid->filter(function (Grid\Filter $filter) { $filter->equal('id', 'ID'); $filter->like('name', '名称'); $filter->like('code', '编码'); $filter->equal('logic_type', '逻辑类型')->select(GameConditionGroup::getLogicTypes()); // 标签筛选 $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 GameConditionGroupRepository(['tags']), function (Show $show) { $show->field('id', 'ID'); $show->field('name', '名称'); $show->field('code', '编码'); $show->field('description', '描述'); $show->field('logic_type', '逻辑类型')->as(function ($logicType) { return GameConditionGroup::getLogicTypes()[$logicType] ?? '未知'; }); // 标签显示 $show->field('tags', '标签')->as(function ($tags) { if (empty($tags)) { return '无标签'; } $tagHtml = []; foreach ($tags as $tag) { $tagHtml[] = sprintf( '%s', $tag['color'], $this->getContrastColor($tag['color']), $tag['name'] ); } return implode(' ', $tagHtml); }); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 显示条件项列表 $show->relation('conditionItems', '条件项列表', function ($model) { $grid = new Grid(new \App\Module\Game\Repositorys\GameConditionItemRepository()); $grid->model()->where('group_id', $model->id); $grid->column('id', 'ID'); $grid->column('condition_type', '条件类型')->display(function ($type) { return \App\Module\Game\Enums\CONDITION_TYPE::getName($type); }); $grid->column('target_id', '目标ID'); $grid->column('operator', '比较运算符')->display(function ($operator) { return \App\Module\Game\Enums\CONDITION_OPERATOR::getSymbol($operator); }); $grid->column('value', '比较值'); $grid->disableCreateButton(); $grid->disableActions(); $grid->disableBatchDelete(); $grid->disableRowSelector(); return $grid; }); }); } /** * 创建表单 * * @return Form */ protected function form() { return Form::make(new GameConditionGroupRepository(['tags']), function (Form $form) { $form->display('id', 'ID'); $form->text('name', '名称')->required(); $form->text('code', '编码') ->required() ->creationRules(['required', 'unique:game_condition_groups,code']) ->updateRules(['required', 'unique:game_condition_groups,code,{{id}}']); $form->textarea('description', '描述'); $form->select('logic_type', '逻辑类型') ->options(GameConditionGroup::getLogicTypes()) ->default(GameConditionGroup::LOGIC_TYPE_ALL) ->required() ->help('全部满足:所有条件都必须满足才算通过;任一满足:只要有一个条件满足就算通过'); // 标签选择 $tagRepository = new \App\Module\Game\Repositorys\GameTagRepository(); $form->multipleSelect('tags', '标签') ->options($tagRepository->getActiveTagOptions()) ->help('可以选择多个标签来分类管理条件组'); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); }); } /** * 根据背景色获取对比色 * * @param string $hexColor * @return string */ private function getContrastColor(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'; } }