DismantleRuleController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <?php
  2. namespace App\Module\GameItems\AdminControllers;
  3. use App\Module\GameItems\Repositorys\ItemDismantleRuleRepository;
  4. use Dcat\Admin\Form;
  5. use Dcat\Admin\Grid;
  6. use Dcat\Admin\Show;
  7. use UCore\DcatAdmin\AdminController;
  8. use Dcat\Admin\Layout\Content;
  9. use Spatie\RouteAttributes\Attributes\Resource;
  10. use App\Module\GameItems\AdminControllers\Helper\FilterHelper;
  11. use App\Module\GameItems\AdminControllers\Helper\FormHelper;
  12. use App\Module\GameItems\AdminControllers\Helper\GridHelper;
  13. use App\Module\GameItems\AdminControllers\Helper\ShowHelper;
  14. /**
  15. * 物品分解规则管理控制器
  16. *
  17. * @package App\Module\GameItems\AdminControllers
  18. */
  19. #[Resource('game-items-dismantle-rules', names: 'dcat.admin.game-items-dismantle-rules')]
  20. class DismantleRuleController extends AdminController
  21. {
  22. /**
  23. * 标题
  24. *
  25. * @var string
  26. */
  27. protected $title = '物品分解规则管理';
  28. /**
  29. * 列表页
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new ItemDismantleRuleRepository(), function (Grid $grid) {
  36. $helper = new GridHelper($grid, $this);
  37. $helper->columnId();
  38. $grid->column('name', '规则名称');
  39. $grid->column('code', '规则编码');
  40. $grid->column('description', '描述')->limit(50);
  41. $grid->column('rule_type', '规则类型')->display(function () {
  42. if (!empty($this->item_id)) {
  43. return '物品规则';
  44. } elseif (!empty($this->category_id)) {
  45. return '分类规则';
  46. } else {
  47. return '通用规则';
  48. }
  49. });
  50. $grid->column('item.name', '物品名称');
  51. $grid->column('category.name', '分类名称');
  52. $grid->column('consume_group_id', '消耗组')->display(function ($value) {
  53. if (!$value) return '无';
  54. $group = \App\Module\Game\Models\GameConsumeGroup::find($value);
  55. return $group ? $group->name : "消耗组 {$value}";
  56. });
  57. $grid->column('reward_group_id', '奖励组')->display(function ($value) {
  58. if (!$value) return '无';
  59. $group = \App\Module\Game\Models\GameRewardGroup::find($value);
  60. return $group ? $group->name : "奖励组 {$value}";
  61. });
  62. $grid->column('condition_group_id', '条件组')->display(function ($value) {
  63. if (!$value) return '无';
  64. $group = \App\Module\Game\Models\GameConditionGroup::find($value);
  65. return $group ? $group->name : "条件组 {$value}";
  66. });
  67. $grid->column('priority', '优先级')->sortable();
  68. $grid->column('is_active', '是否启用')->switch();
  69. $grid->column('created_at', '创建时间');
  70. $grid->column('updated_at', '更新时间');
  71. // 筛选
  72. $grid->filter(function ($filter) {
  73. $helper = new FilterHelper($filter, $this);
  74. $helper->equal('id', 'ID');
  75. $filter->like('name', '规则名称');
  76. $filter->like('code', '规则编码');
  77. $filter->equal('item_id', '物品')->select(
  78. \App\Module\GameItems\Models\Item::pluck('name', 'id')
  79. );
  80. $filter->equal('category_id', '分类')->select(
  81. \App\Module\GameItems\Models\ItemCategory::pluck('name', 'id')
  82. );
  83. $filter->equal('consume_group_id', '消耗组')->select(
  84. \App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id')
  85. );
  86. $filter->equal('reward_group_id', '奖励组')->select(
  87. \App\Module\Game\Models\GameRewardGroup::pluck('name', 'id')
  88. );
  89. $filter->equal('condition_group_id', '条件组')->select(
  90. \App\Module\Game\Models\GameConditionGroup::pluck('name', 'id')
  91. );
  92. $filter->equal('is_active', '是否启用')->radio([
  93. 1 => '是',
  94. 0 => '否',
  95. ]);
  96. });
  97. });
  98. }
  99. /**
  100. * 详情页
  101. *
  102. * @param mixed $id
  103. * @param Content $content
  104. * @return Content
  105. */
  106. public function show($id, Content $content)
  107. {
  108. return $content
  109. ->header($this->title)
  110. ->description('详情')
  111. ->body($this->detail($id));
  112. }
  113. /**
  114. * 详情页
  115. *
  116. * @param mixed $id
  117. * @return Show
  118. */
  119. protected function detail($id)
  120. {
  121. return Show::make($id, new ItemDismantleRuleRepository(), function (Show $show) {
  122. $helper = new ShowHelper($show, $this);
  123. $helper->field('id', 'ID');
  124. $helper->field('name', '规则名称');
  125. $helper->field('code', '规则编码');
  126. $helper->field('description', '规则描述');
  127. // 规则类型
  128. $show->field('rule_type', '规则类型')->as(function () {
  129. if (!empty($this->item_id)) {
  130. return '物品规则';
  131. } elseif (!empty($this->category_id)) {
  132. return '分类规则';
  133. } else {
  134. return '通用规则';
  135. }
  136. });
  137. // 根据规则类型显示不同字段
  138. $show->field('item.name', '物品名称');
  139. $show->field('category.name', '分类名称');
  140. $helper->field('priority', '优先级');
  141. $helper->field('sort_order', '排序权重');
  142. $show->field('is_active', '是否启用')->as(function ($value) {
  143. return $value ? '是' : '否';
  144. });
  145. // 显示消耗组
  146. $show->divider('消耗组');
  147. $show->field('consumeGroup.name', '消耗组名称');
  148. $show->field('consumeGroup.description', '消耗组描述');
  149. // 显示奖励组
  150. $show->divider('奖励组');
  151. $show->field('rewardGroup.name', '奖励组名称');
  152. $show->field('rewardGroup.description', '奖励组描述');
  153. // 显示条件组
  154. $show->divider('条件组');
  155. $show->field('conditionGroup.name', '条件组名称');
  156. $show->field('conditionGroup.description', '条件组描述');
  157. $helper->field('created_at', '创建时间');
  158. $helper->field('updated_at', '更新时间');
  159. });
  160. }
  161. /**
  162. * 创建页
  163. *
  164. * @param Content $content
  165. * @return Content
  166. */
  167. public function create(Content $content)
  168. {
  169. return $content
  170. ->header($this->title)
  171. ->description('创建')
  172. ->body($this->form());
  173. }
  174. /**
  175. * 编辑页
  176. *
  177. * @param mixed $id
  178. * @param Content $content
  179. * @return Content
  180. */
  181. public function edit($id, Content $content)
  182. {
  183. return $content
  184. ->header($this->title)
  185. ->description('编辑')
  186. ->body($this->form()->edit($id));
  187. }
  188. /**
  189. * 表单
  190. *
  191. * @return Form
  192. */
  193. protected function form()
  194. {
  195. return Form::make(new ItemDismantleRuleRepository(), function (Form $form) {
  196. $helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this);
  197. $helper->text('name', '规则名称')->required();
  198. $helper->text('code', '规则编码')
  199. ->help('唯一的规则编码,用于程序识别');
  200. $form->textarea('description', '规则描述')
  201. ->help('规则的详细描述');
  202. // 规则类型
  203. $form->radio('rule_type', '规则类型')
  204. ->options(['item' => '物品规则', 'category' => '分类规则', 'general' => '通用规则'])
  205. ->default('general')
  206. ->when('item', function (Form $form) {
  207. $form->select('item_id', '物品')
  208. ->options(\App\Module\GameItems\Models\Item::pluck('name', 'id'))
  209. ->required();
  210. })
  211. ->when('category', function (Form $form) {
  212. $form->select('category_id', '分类')
  213. ->options(\App\Module\GameItems\Models\ItemCategory::pluck('name', 'id'))
  214. ->required();
  215. });
  216. // 消耗组选择
  217. $form->select('consume_group_id', '消耗组')
  218. ->options(\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id'))
  219. ->help('选择分解时需要额外消耗的材料组(如分解工具等)');
  220. // 奖励组选择
  221. $form->select('reward_group_id', '奖励组')
  222. ->options(\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id'))
  223. ->help('选择分解后获得的奖励组')
  224. ->required();
  225. // 条件组选择
  226. $form->select('condition_group_id', '条件组')
  227. ->options(\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id'))
  228. ->help('选择使用该分解规则需要满足的条件组(可选)');
  229. $helper->number('priority')
  230. ->default(0)
  231. ->help('数字越大优先级越高,当物品同时匹配多个规则时,使用优先级最高的规则');
  232. $form->number('sort_order', '排序权重')
  233. ->default(0)
  234. ->help('数值越大排序越靠前');
  235. $form->switch('is_active', '是否启用')
  236. ->default(true)
  237. ->help('是否启用该分解规则');
  238. // 保存前回调
  239. $form->saving(function (Form $form) {
  240. // 根据规则类型设置对应的字段
  241. if ($form->rule_type == 'item') {
  242. $form->category_id = null;
  243. } elseif ($form->rule_type == 'category') {
  244. $form->item_id = null;
  245. } else {
  246. // 通用规则
  247. $form->item_id = null;
  248. $form->category_id = null;
  249. }
  250. });
  251. });
  252. }
  253. }