RecipeController.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. /**
  15. * 合成配方管理控制器
  16. *
  17. * @package App\Module\GameItems\AdminControllers
  18. */
  19. #[Resource('game-items-recipes', names: 'dcat.admin.game-items-recipes')]
  20. class RecipeController 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 ItemRecipeRepository(), 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('consume_group_id', '消耗组')->display(function ($value) {
  42. if (!$value) return '无';
  43. $group = \App\Module\Game\Models\GameConsumeGroup::find($value);
  44. return $group ? $group->name : "消耗组 {$value}";
  45. });
  46. $grid->column('reward_group_id', '奖励组')->display(function ($value) {
  47. if (!$value) return '无';
  48. $group = \App\Module\Game\Models\GameRewardGroup::find($value);
  49. return $group ? $group->name : "奖励组 {$value}";
  50. });
  51. $grid->column('condition_group_id', '条件组')->display(function ($value) {
  52. if (!$value) return '无';
  53. $group = \App\Module\Game\Models\GameConditionGroup::find($value);
  54. return $group ? $group->name : "条件组 {$value}";
  55. });
  56. $grid->column('success_rate', '成功率')->display(function ($value) {
  57. return ($value * 100) . '%';
  58. });
  59. $grid->column('cooldown_seconds', '冷却时间(秒)');
  60. $grid->column('is_active', '是否激活')->switch();
  61. $grid->column('created_at', '创建时间');
  62. $grid->column('updated_at', '更新时间');
  63. // 筛选
  64. $grid->filter(function ($filter) {
  65. $helper = new FilterHelper($filter, $this);
  66. $helper->equal('id', 'ID');
  67. $filter->like('name', '配方名称');
  68. $filter->like('code', '配方编码');
  69. $filter->equal('consume_group_id', '消耗组')->select(
  70. \App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id')
  71. );
  72. $filter->equal('reward_group_id', '奖励组')->select(
  73. \App\Module\Game\Models\GameRewardGroup::pluck('name', 'id')
  74. );
  75. $filter->equal('condition_group_id', '条件组')->select(
  76. \App\Module\Game\Models\GameConditionGroup::pluck('name', 'id')
  77. );
  78. $filter->equal('is_active', '是否激活')->radio([
  79. 1 => '是',
  80. 0 => '否',
  81. ]);
  82. });
  83. });
  84. }
  85. /**
  86. * 详情页
  87. *
  88. * @param mixed $id
  89. * @param Content $content
  90. * @return Content
  91. */
  92. public function show($id, Content $content)
  93. {
  94. return $content
  95. ->header($this->title)
  96. ->description('详情')
  97. ->body($this->detail($id));
  98. }
  99. /**
  100. * 详情页
  101. *
  102. * @param mixed $id
  103. * @return Show
  104. */
  105. protected function detail($id)
  106. {
  107. return Show::make($id, new ItemRecipeRepository(), function (Show $show) {
  108. $helper = new ShowHelper($show, $this);
  109. $helper->field('id', 'ID');
  110. $helper->field('name', '配方名称');
  111. $helper->field('code', '配方编码');
  112. $helper->field('description', '配方描述');
  113. $show->field('success_rate', '成功率')->as(function ($value) {
  114. return ($value * 100) . '%';
  115. });
  116. $helper->field('cooldown_seconds', '冷却时间(秒)');
  117. $show->field('is_active', '是否激活')->as(function ($value) {
  118. return $value ? '是' : '否';
  119. });
  120. // 显示消耗组
  121. $show->divider('消耗组');
  122. $show->field('consumeGroup.name', '消耗组名称');
  123. $show->field('consumeGroup.description', '消耗组描述');
  124. // 显示奖励组
  125. $show->divider('奖励组');
  126. $show->field('rewardGroup.name', '奖励组名称');
  127. $show->field('rewardGroup.description', '奖励组描述');
  128. // 显示条件组
  129. $show->divider('条件组');
  130. $show->field('conditionGroup.name', '条件组名称');
  131. $show->field('conditionGroup.description', '条件组描述');
  132. $helper->field('created_at', '创建时间');
  133. $helper->field('updated_at', '更新时间');
  134. });
  135. }
  136. /**
  137. * 创建页
  138. *
  139. * @param Content $content
  140. * @return Content
  141. */
  142. public function create(Content $content)
  143. {
  144. return $content
  145. ->header($this->title)
  146. ->description('创建')
  147. ->body($this->form());
  148. }
  149. /**
  150. * 编辑页
  151. *
  152. * @param mixed $id
  153. * @param Content $content
  154. * @return Content
  155. */
  156. public function edit($id, Content $content)
  157. {
  158. return $content
  159. ->header($this->title)
  160. ->description('编辑')
  161. ->body($this->form()->edit($id));
  162. }
  163. /**
  164. * 表单
  165. *
  166. * @return Form
  167. */
  168. protected function form()
  169. {
  170. return Form::make(new ItemRecipeRepository(), function (Form $form) {
  171. $helper = new \App\Module\GameItems\AdminControllers\Helper\FormHelper($form, $this);
  172. $helper->text('name', '配方名称')->required();
  173. $helper->text('code', '配方编码')
  174. ->help('唯一的配方编码,用于程序识别');
  175. $form->textarea('description', '配方描述')
  176. ->help('配方的详细描述');
  177. // 消耗组选择
  178. $form->select('consume_group_id', '消耗组')
  179. ->options(\App\Module\Game\Models\GameConsumeGroup::pluck('name', 'id'))
  180. ->help('选择合成时需要消耗的材料组');
  181. // 奖励组选择
  182. $form->select('reward_group_id', '奖励组')
  183. ->options(\App\Module\Game\Models\GameRewardGroup::pluck('name', 'id'))
  184. ->help('选择合成成功后获得的奖励组')
  185. ->required();
  186. // 条件组选择
  187. $form->select('condition_group_id', '条件组')
  188. ->options(\App\Module\Game\Models\GameConditionGroup::pluck('name', 'id'))
  189. ->help('选择解锁该配方需要满足的条件组(可选)');
  190. $form->rate('success_rate', '成功率')
  191. ->default(1)
  192. ->help('合成成功的概率,1表示100%');
  193. $form->number('cooldown_seconds', '冷却时间(秒)')
  194. ->default(0)
  195. ->min(0)
  196. ->help('两次合成之间的冷却时间,0表示无冷却');
  197. $form->number('sort_order', '排序权重')
  198. ->default(0)
  199. ->help('数值越大排序越靠前');
  200. $form->switch('is_active', '是否激活')
  201. ->default(true)
  202. ->help('是否激活该配方');
  203. });
  204. }
  205. }