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';
}
}