RecipeController.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace App\Module\GameItems\AdminControllers;
  3. use App\Module\GameItems\Repositorys\ItemRecipeRepository;
  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\DuplicateItemRecipeAction;
  15. /**
  16. * 合成配方管理控制器
  17. *
  18. * @package App\Module\GameItems\AdminControllers
  19. */
  20. #[Resource('game-items-recipes', names: 'dcat.admin.game-items-recipes')]
  21. class RecipeController 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 ItemRecipeRepository(), function (Grid $grid) {
  37. // 首先设置关联查询,确保数据正确预加载
  38. $grid->model()->with(['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. // 消耗组列 - 可点击跳转
  45. $grid->column('consumeGroup.name', '消耗组')->display(function ($name) {
  46. if (!$name || !$this->consume_group_id) {
  47. return '<span class="text-muted">无消耗</span>';
  48. }
  49. return $name;
  50. })->link(function () {
  51. if (!$this->consume_group_id) {
  52. return '';
  53. }
  54. return admin_url('game-consume-groups/' . $this->consume_group_id);
  55. });
  56. // 奖励组列 - 可点击跳转
  57. $grid->column('rewardGroup.name', '奖励组')->display(function ($name) {
  58. if (!$name || !$this->reward_group_id) {
  59. return '<span class="text-danger">未配置</span>';
  60. }
  61. return $name;
  62. })->link(function () {
  63. if (!$this->reward_group_id) {
  64. return '';
  65. }
  66. return admin_url('game-reward-groups/' . $this->reward_group_id);
  67. });
  68. // 条件组列 - 可点击跳转
  69. $grid->column('conditionGroup.name', '条件组')->display(function ($name) {
  70. if (!$name || !$this->condition_group_id) {
  71. return '<span class="text-muted">无条件</span>';
  72. }
  73. return $name;
  74. })->link(function () {
  75. if (!$this->condition_group_id) {
  76. return '';
  77. }
  78. return admin_url('game-condition-groups/' . $this->condition_group_id);
  79. });
  80. // 消耗组详情列
  81. $grid->column('consume_group_details', '消耗组详情')->display(function () {
  82. return $this->formatConsumeDetails();
  83. })->width('200px');
  84. // 奖励组详情列
  85. $grid->column('reward_group_details', '奖励组详情')->display(function () {
  86. return $this->formatRewardDetails();
  87. })->width('200px');
  88. // 条件组详情列
  89. $grid->column('condition_group_details', '条件组详情')->display(function () {
  90. return $this->formatConditionDetails();
  91. })->width('200px');
  92. $grid->column('success_rate', '成功率')->display(function ($value) {
  93. return ($value * 100) . '%';
  94. });
  95. $grid->column('cooldown_seconds', '冷却时间(秒)');
  96. $grid->column('is_active', '是否激活')->switch();
  97. $grid->column('created_at', '创建时间');
  98. $grid->column('updated_at', '更新时间');
  99. // 筛选
  100. $grid->filter(function ($filter) {
  101. $helper = new FilterHelper($filter, $this);
  102. $helper->equal('id', 'ID');
  103. $filter->like('name', '配方名称');
  104. $filter->like('code', '配方编码');
  105. $filter->equal('consume_group_id', '消耗组')->select(
  106. \App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id')
  107. );
  108. $filter->equal('reward_group_id', '奖励组')->select(
  109. \App\Module\Game\Models\GameRewardGroup::pluck('name', 'id')
  110. );
  111. $filter->equal('condition_group_id', '条件组')->select(
  112. \App\Module\Game\Models\GameConditionGroup::pluck('name', 'id')
  113. );
  114. $filter->equal('is_active', '是否激活')->radio([
  115. 1 => '是',
  116. 0 => '否',
  117. ]);
  118. });
  119. // 行操作
  120. $grid->actions(function (Grid\Displayers\Actions $actions) {
  121. // 添加复制按钮
  122. $actions->append(new DuplicateItemRecipeAction());
  123. });
  124. });
  125. }
  126. /**
  127. * 详情页
  128. *
  129. * @param mixed $id
  130. * @param Content $content
  131. * @return Content
  132. */
  133. public function show($id, Content $content)
  134. {
  135. return $content
  136. ->header($this->title)
  137. ->description('详情')
  138. ->body($this->detail($id));
  139. }
  140. /**
  141. * 详情页
  142. *
  143. * @param mixed $id
  144. * @return Show
  145. */
  146. protected function detail($id)
  147. {
  148. return Show::make($id, new ItemRecipeRepository(), function (Show $show) {
  149. $helper = new ShowHelper($show, $this);
  150. $helper->field('id', 'ID');
  151. $helper->field('name', '配方名称');
  152. $helper->field('code', '配方编码');
  153. $helper->field('description', '配方描述');
  154. $show->field('success_rate', '成功率')->as(function ($value) {
  155. return ($value * 100) . '%';
  156. });
  157. $helper->field('cooldown_seconds', '冷却时间(秒)');
  158. $show->field('is_active', '是否激活')->as(function ($value) {
  159. return $value ? '是' : '否';
  160. });
  161. // 显示消耗组
  162. $show->divider('消耗组');
  163. $show->field('consumeGroup.name', '消耗组名称');
  164. $show->field('consumeGroup.description', '消耗组描述');
  165. // 显示奖励组
  166. $show->divider('奖励组');
  167. $show->field('rewardGroup.name', '奖励组名称');
  168. $show->field('rewardGroup.description', '奖励组描述');
  169. // 显示条件组
  170. $show->divider('条件组');
  171. $show->field('conditionGroup.name', '条件组名称');
  172. $show->field('conditionGroup.description', '条件组描述');
  173. $helper->field('created_at', '创建时间');
  174. $helper->field('updated_at', '更新时间');
  175. });
  176. }
  177. /**
  178. * 创建页
  179. *
  180. * @param Content $content
  181. * @return Content
  182. */
  183. public function create(Content $content)
  184. {
  185. return $content
  186. ->header($this->title)
  187. ->description('创建')
  188. ->body($this->form());
  189. }
  190. /**
  191. * 编辑页
  192. *
  193. * @param mixed $id
  194. * @param Content $content
  195. * @return Content
  196. */
  197. public function edit($id, Content $content)
  198. {
  199. return $content
  200. ->header($this->title)
  201. ->description('编辑')
  202. ->body($this->form()->edit($id));
  203. }
  204. /**
  205. * 表单
  206. *
  207. * @return Form
  208. */
  209. protected function form()
  210. {
  211. return Form::make(new ItemRecipeRepository(), function (Form $form) {
  212. $helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this);
  213. $helper->text('name', '配方名称')->required();
  214. $helper->text('code', '配方编码')
  215. ->help('唯一的配方编码,用于程序识别');
  216. $form->textarea('description', '配方描述')
  217. ->help('配方的详细描述');
  218. // 消耗组选择
  219. $form->select('consume_group_id', '消耗组')
  220. ->options(\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id'))
  221. ->help('选择合成时需要消耗的材料组');
  222. // 奖励组选择
  223. $form->select('reward_group_id', '奖励组')
  224. ->options(\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id'))
  225. ->help('选择合成成功后获得的奖励组')
  226. ->required();
  227. // 条件组选择
  228. $form->select('condition_group_id', '条件组')
  229. ->options(\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id'))
  230. ->help('选择解锁该配方需要满足的条件组(可选)');
  231. $form->rate('success_rate', '成功率')
  232. ->default(1)
  233. ->help('合成成功的概率,1表示100%');
  234. $form->number('cooldown_seconds', '冷却时间(秒)')
  235. ->default(0)
  236. ->min(0)
  237. ->help('两次合成之间的冷却时间,0表示无冷却');
  238. $form->number('sort_order', '排序权重')
  239. ->default(0)
  240. ->help('数值越大排序越靠前');
  241. $form->switch('is_active', '是否激活')
  242. ->default(true)
  243. ->help('是否激活该配方');
  244. });
  245. }
  246. }