PetActiveSkillController.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. namespace App\Module\Pet\AdminControllers;
  3. use App\Module\Pet\Models\PetActiveSkill;
  4. use UCore\DcatAdmin\AdminController;
  5. use Dcat\Admin\Grid;
  6. use Dcat\Admin\Show;
  7. use Dcat\Admin\Form;
  8. use Spatie\RouteAttributes\Attributes\Resource;
  9. /**
  10. * 宠物激活技能管理
  11. *
  12. * @AdminController(
  13. * title="宠物激活技能",
  14. * permission="pet.active_skill",
  15. * menu_title="激活技能管理",
  16. * menu_parent="宠物管理",
  17. * menu_order=45
  18. * )
  19. */
  20. #[Resource('pet-active-skills', names: 'dcat.admin.pet-active-skills')]
  21. class PetActiveSkillController extends AdminController
  22. {
  23. /**
  24. * 列表页面
  25. *
  26. * @return Grid
  27. */
  28. protected function grid(): Grid
  29. {
  30. return Grid::make(PetActiveSkill::with(['pet']), function (Grid $grid) {
  31. $grid->column('id', 'ID')->sortable();
  32. $grid->column('pet_id', '宠物ID')->display(function ($value) {
  33. return "<a href='/admin/pet-users/{$value}' target='_blank'>{$value}</a>";
  34. });
  35. $grid->column('pet.user_id', '用户ID')->display(function ($value) {
  36. return "<a href='/admin/users/{$value}' target='_blank'>{$value}</a>";
  37. });
  38. $grid->column('pet.name', '宠物名称')->limit(20);
  39. $grid->column('skill_name', '技能名称')->label([
  40. '自动收菜' => 'success',
  41. '自动播种' => 'primary',
  42. '自动浇水' => 'info',
  43. '自动除草' => 'warning',
  44. '自动杀虫' => 'danger',
  45. '自动施肥' => 'secondary',
  46. ]);
  47. $grid->column('status', '状态')->using([
  48. 'active' => '生效中',
  49. 'expired' => '已过期',
  50. 'cancelled' => '已取消'
  51. ])->label([
  52. 'active' => 'success',
  53. 'expired' => 'secondary',
  54. 'cancelled' => 'danger'
  55. ]);
  56. $grid->column('start_time', '开始时间')->sortable();
  57. $grid->column('end_time', '结束时间')->sortable();
  58. $grid->column('last_check_time', '最后检查时间')->display(function ($value) {
  59. if (!$value) {
  60. return '<span class="text-muted">未检查</span>';
  61. }
  62. $time = \Carbon\Carbon::parse($value);
  63. $diffSeconds = $time->diffInSeconds(now());
  64. if ($diffSeconds < 60) {
  65. return "<span class='text-success'>{$time->format('Y-m-d H:i:s')}</span>";
  66. } elseif ($diffSeconds < 300) {
  67. return "<span class='text-warning'>{$time->format('Y-m-d H:i:s')}</span>";
  68. } else {
  69. return "<span class='text-danger'>{$time->format('Y-m-d H:i:s')}</span>";
  70. }
  71. })->sortable();
  72. $grid->column('check_interval', '检查间隔(秒)')->display(function () {
  73. $config = $this->config;
  74. return is_array($config) ? ($config['check_interval'] ?? 60) : 60;
  75. });
  76. $grid->column('remaining_time', '剩余时间')->display(function () {
  77. if ($this->isExpired()) {
  78. return '<span class="text-danger">已过期</span>';
  79. }
  80. $seconds = $this->getRemainingSeconds();
  81. $hours = floor($seconds / 3600);
  82. $minutes = floor(($seconds % 3600) / 60);
  83. $remainingSeconds = $seconds % 60;
  84. return sprintf('%02d:%02d:%02d', $hours, $minutes, $remainingSeconds);
  85. });
  86. // 筛选器
  87. $grid->filter(function (Grid\Filter $filter) {
  88. $filter->equal('pet.user_id', '用户ID');
  89. $filter->equal('pet_id', '宠物ID');
  90. $filter->equal('skill_name', '技能名称')->select([
  91. '自动收菜' => '自动收菜',
  92. '自动播种' => '自动播种',
  93. '自动浇水' => '自动浇水',
  94. '自动除草' => '自动除草',
  95. '自动杀虫' => '自动杀虫',
  96. '自动施肥' => '自动施肥',
  97. ]);
  98. $filter->equal('status', '状态')->select([
  99. 'active' => '生效中',
  100. 'expired' => '已过期',
  101. 'cancelled' => '已取消'
  102. ]);
  103. $filter->between('start_time', '开始时间')->datetime();
  104. $filter->between('end_time', '结束时间')->datetime();
  105. $filter->between('last_check_time', '最后检查时间')->datetime();
  106. // 添加特殊筛选条件
  107. $filter->where(function ($query) {
  108. $query->needCheck();
  109. }, '需要检查', 'need_check')->checkbox(['1' => '是']);
  110. $filter->where(function ($query) {
  111. $query->whereNull('last_check_time');
  112. }, '未检查过', 'never_checked')->checkbox(['1' => '是']);
  113. });
  114. // 默认排序:按最后检查时间倒序
  115. $grid->model()->orderByLastCheckTime('desc');
  116. // 禁用操作
  117. $grid->disableCreateButton();
  118. $grid->disableEditButton();
  119. $grid->disableDeleteButton();
  120. $grid->disableBatchDelete();
  121. // 行操作
  122. $grid->actions(function (Grid\Displayers\Actions $actions) {
  123. $actions->disableEdit();
  124. $actions->disableDelete();
  125. // 添加取消技能操作
  126. if ($actions->getRow()->status === 'active') {
  127. $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-outline-danger" onclick="cancelSkill(' . $actions->getKey() . ')">取消技能</a>');
  128. }
  129. });
  130. // 工具栏
  131. $grid->tools(function (Grid\Tools $tools) {
  132. $tools->append('<a href="javascript:void(0)" class="btn btn-sm btn-outline-primary" onclick="location.reload()">刷新</a>');
  133. });
  134. });
  135. }
  136. /**
  137. * 详情页面
  138. *
  139. * @return Show
  140. */
  141. protected function detail(): Show
  142. {
  143. return Show::make(PetActiveSkill::with(['pet', 'skill']), function (Show $show) {
  144. $show->field('id', 'ID');
  145. $show->field('pet_id', '宠物ID');
  146. $show->field('pet.user_id', '用户ID');
  147. $show->field('pet.name', '宠物名称');
  148. $show->field('skill_id', '技能ID');
  149. $show->field('skill_name', '技能名称');
  150. $show->field('status', '状态')->using([
  151. 'active' => '生效中',
  152. 'expired' => '已过期',
  153. 'cancelled' => '已取消'
  154. ]);
  155. $show->field('start_time', '开始时间');
  156. $show->field('end_time', '结束时间');
  157. $show->field('last_check_time', '最后检查时间');
  158. $show->field('config', '技能配置')->json();
  159. $show->field('created_at', '创建时间');
  160. $show->field('updated_at', '更新时间');
  161. // 计算字段
  162. $show->divider();
  163. $show->field('remaining_seconds', '剩余秒数')->as(function () {
  164. return $this->getRemainingSeconds();
  165. });
  166. $show->field('is_expired', '是否过期')->as(function () {
  167. return $this->isExpired() ? '是' : '否';
  168. });
  169. $show->field('should_check', '是否需要检查')->as(function () {
  170. return $this->shouldCheck() ? '是' : '否';
  171. });
  172. // 关联信息
  173. if ($show->getModel()->skill) {
  174. $show->field('skill.skill_name', '技能配置名称');
  175. $show->field('skill.description', '技能描述');
  176. }
  177. });
  178. }
  179. /**
  180. * 表单页面(禁用)
  181. *
  182. * @return Form
  183. */
  184. protected function form(): Form
  185. {
  186. return Form::make(new PetActiveSkill(), function (Form $form) {
  187. $form->display('id', 'ID');
  188. $form->display('pet_id', '宠物ID');
  189. $form->display('skill_id', '技能ID');
  190. $form->display('skill_name', '技能名称');
  191. $form->display('start_time', '开始时间');
  192. $form->display('end_time', '结束时间');
  193. $form->display('status', '状态');
  194. $form->display('last_check_time', '最后检查时间');
  195. $form->display('config', '技能配置');
  196. $form->display('created_at', '创建时间');
  197. $form->display('updated_at', '更新时间');
  198. $form->disableCreatingCheck();
  199. $form->disableEditingCheck();
  200. $form->disableViewCheck();
  201. });
  202. }
  203. }