DismantleRuleController.php 12 KB

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