GameConsumeGroupController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Module\Game\AdminControllers;
  3. use App\Module\Game\AdminControllers\Actions\DuplicateConsumeGroupAction;
  4. use App\Module\Game\Enums\CONSUME_TYPE;
  5. use App\Module\Game\Models\GameConsumeItem;
  6. use App\Module\Game\Repositorys\GameConsumeGroupRepository;
  7. use App\Module\Game\Repositorys\GameConsumeItemRepository;
  8. use Dcat\Admin\Form;
  9. use Dcat\Admin\Grid;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Http\Controllers\AdminController;
  12. use Spatie\RouteAttributes\Attributes\Resource;
  13. /**
  14. * 消耗组管理控制器
  15. */
  16. #[Resource('game-consume-groups', names: 'dcat.admin.game-consume-groups')]
  17. class GameConsumeGroupController extends AdminController
  18. {
  19. /**
  20. * 标题
  21. *
  22. * @return string
  23. */
  24. protected function title()
  25. {
  26. return '消耗组管理';
  27. }
  28. /**
  29. * 创建表格
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new GameConsumeGroupRepository(), function (Grid $grid) {
  36. $grid->column('id', 'ID')->sortable();
  37. $grid->column('name', '名称');
  38. $grid->column('code', '编码');
  39. $grid->column('description', '描述')->limit(30);
  40. $grid->column('created_at', '创建时间');
  41. $grid->column('updated_at', '更新时间');
  42. // 添加消耗项数量统计和链接
  43. $grid->column('items_count', '消耗项数量')->display(function () {
  44. $count = GameConsumeItem::where('group_id', $this->getAttribute('id'))->count();
  45. return "<a href='/admin/game-consume-items?group_id={$this->getAttribute('id')}' class='btn btn-sm btn-primary'>{$count} <i class='fa fa-arrow-right'></i></a>";
  46. });
  47. // 添加行操作
  48. $grid->actions(function (Grid\Displayers\Actions $actions) {
  49. // 添加复制操作
  50. $actions->append(new DuplicateConsumeGroupAction());
  51. // 添加管理消耗项操作
  52. $actions->append('<a href="/admin/game-consume-items?group_id='.$actions->getKey().'" class="btn btn-sm btn-primary">
  53. <i class="fa fa-list"></i> 管理消耗项
  54. </a>');
  55. });
  56. $grid->filter(function (Grid\Filter $filter) {
  57. $filter->equal('id', 'ID');
  58. $filter->like('name', '名称');
  59. $filter->like('code', '编码');
  60. });
  61. });
  62. }
  63. /**
  64. * 创建详情页
  65. *
  66. * @param mixed $id
  67. * @return Show
  68. */
  69. protected function detail($id)
  70. {
  71. return Show::make($id, new GameConsumeGroupRepository(), function (Show $show) {
  72. $show->field('id', 'ID');
  73. $show->field('name', '名称');
  74. $show->field('code', '编码');
  75. $show->field('description', '描述');
  76. $show->field('created_at', '创建时间');
  77. $show->field('updated_at', '更新时间');
  78. // 显示消耗项列表
  79. $show->relation('consumeItems', '消耗项列表', function ($model) {
  80. $grid = new Grid(new GameConsumeItemRepository());
  81. $grid->model()->where('group_id', $model->id);
  82. $grid->column('id', 'ID');
  83. $grid->column('consume_type', '消耗类型')->display(function ($type) {
  84. return CONSUME_TYPE::getName($type);
  85. });
  86. $grid->column('target_id', '目标')->display(function ($targetId) {
  87. // 获取完整的消耗项对象
  88. $consumeItem = GameConsumeItem::find($this->getAttribute('id'));
  89. if (!$consumeItem) {
  90. return $targetId;
  91. }
  92. // 根据消耗类型显示目标名称
  93. if ($consumeItem->consume_type == CONSUME_TYPE::ITEM->value) {
  94. $item = \App\Module\GameItems\Models\Item::find($targetId);
  95. return $item ? "{$item->name} (ID: {$targetId})" : "物品 (ID: {$targetId})";
  96. } elseif ($consumeItem->consume_type == CONSUME_TYPE::CURRENCY->value) {
  97. $currency = \App\Module\Fund\Models\FundCurrencyModel::find($targetId);
  98. return $currency ? "{$currency->name} (ID: {$targetId})" : "货币 (ID: {$targetId})";
  99. } elseif ($consumeItem->consume_type == CONSUME_TYPE::FUND->value) {
  100. $fund = \App\Module\Fund\Models\FundConfigModel::find($targetId);
  101. return $fund ? "{$fund->name} (ID: {$targetId})" : "代币账户 (ID: {$targetId})";
  102. }
  103. return $targetId;
  104. });
  105. $grid->column('quantity', '数量');
  106. // 添加操作按钮
  107. $grid->disableCreateButton();
  108. $grid->actions(function (Grid\Displayers\Actions $actions) {
  109. $actions->disableDelete();
  110. $actions->disableEdit();
  111. $actions->disableView();
  112. // 添加编辑链接
  113. $actions->append('<a href="/admin/game-consume-items/'.$actions->getKey().'/edit" class="btn btn-sm btn-primary">
  114. <i class="fa fa-edit"></i> 编辑
  115. </a>');
  116. });
  117. $grid->disableBatchDelete();
  118. $grid->disableRowSelector();
  119. // 添加创建按钮
  120. $grid->tools(function (Grid\Tools $tools) use ($model) {
  121. $tools->append('<a href="/admin/game-consume-items/create?group_id='.$model->id.'" class="btn btn-sm btn-success">
  122. <i class="fa fa-plus"></i> 添加消耗项
  123. </a>');
  124. });
  125. return $grid;
  126. });
  127. // 添加返回按钮
  128. $show->tools(function (Show\Tools $tools) {
  129. $tools->append('<a href="/admin/game-consume-groups" class="btn btn-sm btn-default">
  130. <i class="fa fa-arrow-left"></i> 返回列表
  131. </a>');
  132. });
  133. });
  134. }
  135. /**
  136. * 创建表单
  137. *
  138. * @return Form
  139. */
  140. protected function form()
  141. {
  142. return Form::make(new GameConsumeGroupRepository(), function (Form $form) {
  143. $form->display('id', 'ID');
  144. $form->text('name', '名称')->required();
  145. $form->text('code', '编码')
  146. ->required()
  147. ->creationRules(['required', 'unique:game_consume_groups,code'])
  148. ->updateRules(['required', 'unique:game_consume_groups,code,{{id}}']);
  149. $form->textarea('description', '描述');
  150. $form->display('created_at', '创建时间');
  151. $form->display('updated_at', '更新时间');
  152. // 添加提示信息,告知用户如何管理消耗项
  153. if ($form->isEditing()) {
  154. $id = $form->getKey();
  155. $form->html('<div class="alert alert-info">
  156. <p><i class="fa fa-info-circle"></i> 消耗项管理已移至单独页面,请保存当前表单后使用以下链接管理消耗项:</p>
  157. <a href="'.admin_url('game-consume-items?group_id='.$id).'" class="btn btn-primary" target="_blank">
  158. <i class="fa fa-list"></i> 管理消耗项
  159. </a>
  160. </div>');
  161. } else {
  162. $form->html('<div class="alert alert-info">
  163. <p><i class="fa fa-info-circle"></i> 消耗项管理已移至单独页面,请先保存当前表单,然后才能添加消耗项。</p>
  164. </div>');
  165. }
  166. });
  167. }
  168. }