| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <?php
- namespace App\Module\Game\AdminControllers;
- use App\Module\Game\AdminControllers\Actions\DuplicateConsumeGroupAction;
- use App\Module\Game\Enums\CONSUME_TYPE;
- use App\Module\Game\Models\GameConsumeItem;
- use App\Module\Game\Repositorys\GameConsumeGroupRepository;
- use App\Module\Game\Repositorys\GameConsumeItemRepository;
- use Dcat\Admin\Form;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Dcat\Admin\Http\Controllers\AdminController;
- use Spatie\RouteAttributes\Attributes\Resource;
- /**
- * 消耗组管理控制器
- */
- #[Resource('game-consume-groups', names: 'dcat.admin.game-consume-groups')]
- class GameConsumeGroupController extends AdminController
- {
- /**
- * 标题
- *
- * @return string
- */
- protected function title()
- {
- return '消耗组管理';
- }
- /**
- * 创建表格
- *
- * @return Grid
- */
- protected function grid()
- {
- return Grid::make(new GameConsumeGroupRepository(), function (Grid $grid) {
- // 预加载消耗项和标签关联数据
- $grid->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 "<a href='/admin/game-consume-items?group_id={$this->getAttribute('id')}' target=\"_blank\" class='btn btn-sm btn-primary'>{$count} <i class='fa fa-arrow-right'></i></a>";
- });
- // 添加行操作
- $grid->actions(function (Grid\Displayers\Actions $actions) {
- // 添加复制操作
- $actions->append(new DuplicateConsumeGroupAction());
- // 添加管理消耗项操作
- $actions->append('<a href="/admin/game-consume-items?group_id='.$actions->getKey().'" target="_blank" class="btn btn-sm btn-primary">
- <i class="fa fa-list"></i> 管理消耗项
- </a>');
- });
- $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 '<span class="text-muted">无标签</span>';
- }
- $tagHtml = [];
- foreach ($tags as $tag) {
- // 使用静态方法计算对比色
- $contrastColor = \App\Module\Game\AdminControllers\GameConsumeGroupController::calculateContrastColor($tag['color']);
- $tagHtml[] = sprintf(
- '<span class="badge" style="background-color: %s; color: %s;">%s</span>',
- $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;
- }
- // 根据消耗类型显示目标名称
- if ($consumeItem->consume_type == CONSUME_TYPE::ITEM->value) {
- $item = \App\Module\GameItems\Models\Item::find($targetId);
- return $item ? "{$item->name} (ID: {$targetId})" : "物品 (ID: {$targetId})";
- } elseif ($consumeItem->consume_type == CONSUME_TYPE::CURRENCY->value) {
- $currency = \App\Module\Fund\Models\FundCurrencyModel::find($targetId);
- return $currency ? "{$currency->name} (ID: {$targetId})" : "货币 (ID: {$targetId})";
- } elseif ($consumeItem->consume_type == CONSUME_TYPE::FUND_CONFIG->value) {
- $fund = \App\Module\Fund\Models\FundConfigModel::find($targetId);
- return $fund ? "{$fund->name} (ID: {$targetId})" : "代币账户 (ID: {$targetId})";
- }
- return $targetId;
- });
- $grid->column('quantity', '数量');
- // 添加操作按钮
- $grid->disableCreateButton();
- $grid->actions(function (Grid\Displayers\Actions $actions) {
- $actions->disableDelete();
- $actions->disableEdit();
- $actions->disableView();
- // 添加编辑链接
- $actions->append('<a href="/admin/game-consume-items/'.$actions->getKey().'/edit" class="btn btn-sm btn-primary">
- <i class="fa fa-edit"></i> 编辑
- </a>');
- });
- $grid->disableBatchDelete();
- $grid->disableRowSelector();
- // 添加创建按钮
- $grid->tools(function (Grid\Tools $tools) use ($model) {
- $tools->append('<a href="/admin/game-consume-items/create?group_id='.$model->id.'" class="btn btn-sm btn-success">
- <i class="fa fa-plus"></i> 添加消耗项
- </a>');
- });
- return $grid;
- });
- // 添加返回按钮
- $show->tools(function (Show\Tools $tools) {
- $tools->append('<a href="/admin/game-consume-groups" class="btn btn-sm btn-default">
- <i class="fa fa-arrow-left"></i> 返回列表
- </a>');
- });
- });
- }
- /**
- * 创建表单
- *
- * @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('<div class="alert alert-info">
- <p><i class="fa fa-info-circle"></i> 消耗项管理已移至单独页面,请保存当前表单后使用以下链接管理消耗项:</p>
- <a href="'.admin_url('game-consume-items?group_id='.$id).'" class="btn btn-primary" target="_blank">
- <i class="fa fa-list"></i> 管理消耗项
- </a>
- </div>');
- } else {
- $form->html('<div class="alert alert-info">
- <p><i class="fa fa-info-circle"></i> 消耗项管理已移至单独页面,请先保存当前表单,然后才能添加消耗项。</p>
- </div>');
- }
- });
- }
- /**
- * 根据背景色获取对比色
- *
- * @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';
- }
- }
|