| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- <?php
- namespace App\Module\Pet\AdminControllers;
- use App\Module\Pet\Models\PetActiveSkill;
- use UCore\DcatAdmin\AdminController;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Dcat\Admin\Form;
- use Spatie\RouteAttributes\Attributes\Resource;
- /**
- * 宠物激活技能管理
- *
- * @AdminController(
- * title="宠物激活技能",
- * permission="pet.active_skill",
- * menu_title="激活技能管理",
- * menu_parent="宠物管理",
- * menu_order=45
- * )
- */
- #[Resource('pet-active-skills', names: 'dcat.admin.pet-active-skills')]
- class PetActiveSkillController extends AdminController
- {
- /**
- * 列表页面
- *
- * @return Grid
- */
- protected function grid(): Grid
- {
- return Grid::make(PetActiveSkill::with(['pet']), function (Grid $grid) {
- $grid->column('id', 'ID')->sortable();
-
- $grid->column('pet_id', '宠物ID')->display(function ($value) {
- return "<a href='/admin/pet-users/{$value}' target='_blank'>{$value}</a>";
- });
-
- $grid->column('pet.user_id', '用户ID')->display(function ($value) {
- return "<a href='/admin/users/{$value}' target='_blank'>{$value}</a>";
- });
-
- $grid->column('pet.name', '宠物名称')->limit(20);
-
- $grid->column('skill_name', '技能名称')->label([
- '自动收菜' => 'success',
- '自动播种' => 'primary',
- '自动浇水' => 'info',
- '自动除草' => 'warning',
- '自动杀虫' => 'danger',
- '自动施肥' => 'secondary',
- ]);
-
- $grid->column('status', '状态')->using([
- 'active' => '生效中',
- 'expired' => '已过期',
- 'cancelled' => '已取消'
- ])->label([
- 'active' => 'success',
- 'expired' => 'secondary',
- 'cancelled' => 'danger'
- ]);
-
- $grid->column('start_time', '开始时间')->sortable();
- $grid->column('end_time', '结束时间')->sortable();
-
- $grid->column('last_check_time', '最后检查时间')->display(function ($value) {
- if (!$value) {
- return '<span class="text-muted">未检查</span>';
- }
-
- $time = \Carbon\Carbon::parse($value);
- $diffSeconds = $time->diffInSeconds(now());
-
- if ($diffSeconds < 60) {
- return "<span class='text-success'>{$time->format('Y-m-d H:i:s')}</span>";
- } elseif ($diffSeconds < 300) {
- return "<span class='text-warning'>{$time->format('Y-m-d H:i:s')}</span>";
- } else {
- return "<span class='text-danger'>{$time->format('Y-m-d H:i:s')}</span>";
- }
- })->sortable();
-
- $grid->column('check_interval', '检查间隔(秒)')->display(function () {
- $config = $this->config;
- return is_array($config) ? ($config['check_interval'] ?? 60) : 60;
- });
-
- $grid->column('remaining_time', '剩余时间')->display(function () {
- if ($this->isExpired()) {
- return '<span class="text-danger">已过期</span>';
- }
-
- $seconds = $this->getRemainingSeconds();
- $hours = floor($seconds / 3600);
- $minutes = floor(($seconds % 3600) / 60);
- $remainingSeconds = $seconds % 60;
-
- return sprintf('%02d:%02d:%02d', $hours, $minutes, $remainingSeconds);
- });
-
- // 筛选器
- $grid->filter(function (Grid\Filter $filter) {
- $filter->equal('pet.user_id', '用户ID');
- $filter->equal('pet_id', '宠物ID');
- $filter->equal('skill_name', '技能名称')->select([
- '自动收菜' => '自动收菜',
- '自动播种' => '自动播种',
- '自动浇水' => '自动浇水',
- '自动除草' => '自动除草',
- '自动杀虫' => '自动杀虫',
- '自动施肥' => '自动施肥',
- ]);
- $filter->equal('status', '状态')->select([
- 'active' => '生效中',
- 'expired' => '已过期',
- 'cancelled' => '已取消'
- ]);
- $filter->between('start_time', '开始时间')->datetime();
- $filter->between('end_time', '结束时间')->datetime();
- $filter->between('last_check_time', '最后检查时间')->datetime();
-
- // 添加特殊筛选条件
- $filter->where(function ($query) {
- $query->needCheck();
- }, '需要检查', 'need_check')->checkbox(['1' => '是']);
-
- $filter->where(function ($query) {
- $query->whereNull('last_check_time');
- }, '未检查过', 'never_checked')->checkbox(['1' => '是']);
- });
-
- // 默认排序:按最后检查时间倒序
- $grid->model()->orderByLastCheckTime('desc');
-
- // 禁用操作
- $grid->disableCreateButton();
- $grid->disableEditButton();
- $grid->disableDeleteButton();
- $grid->disableBatchDelete();
-
- // 行操作
- $grid->actions(function (Grid\Displayers\Actions $actions) {
- $actions->disableEdit();
- $actions->disableDelete();
-
- // 添加取消技能操作
- if ($actions->getRow()->status === 'active') {
- $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-outline-danger" onclick="cancelSkill(' . $actions->getKey() . ')">取消技能</a>');
- }
- });
-
- // 工具栏
- $grid->tools(function (Grid\Tools $tools) {
- $tools->append('<a href="javascript:void(0)" class="btn btn-sm btn-outline-primary" onclick="location.reload()">刷新</a>');
- });
- });
- }
- /**
- * 详情页面
- *
- * @return Show
- */
- protected function detail(): Show
- {
- return Show::make(PetActiveSkill::with(['pet', 'skill']), function (Show $show) {
- $show->field('id', 'ID');
- $show->field('pet_id', '宠物ID');
- $show->field('pet.user_id', '用户ID');
- $show->field('pet.name', '宠物名称');
- $show->field('skill_id', '技能ID');
- $show->field('skill_name', '技能名称');
-
- $show->field('status', '状态')->using([
- 'active' => '生效中',
- 'expired' => '已过期',
- 'cancelled' => '已取消'
- ]);
-
- $show->field('start_time', '开始时间');
- $show->field('end_time', '结束时间');
- $show->field('last_check_time', '最后检查时间');
-
- $show->field('config', '技能配置')->json();
-
- $show->field('created_at', '创建时间');
- $show->field('updated_at', '更新时间');
-
- // 计算字段
- $show->divider();
-
- $show->field('remaining_seconds', '剩余秒数')->as(function () {
- return $this->getRemainingSeconds();
- });
-
- $show->field('is_expired', '是否过期')->as(function () {
- return $this->isExpired() ? '是' : '否';
- });
-
- $show->field('should_check', '是否需要检查')->as(function () {
- return $this->shouldCheck() ? '是' : '否';
- });
-
- // 关联信息
- if ($show->getModel()->skill) {
- $show->field('skill.skill_name', '技能配置名称');
- $show->field('skill.description', '技能描述');
- }
- });
- }
- /**
- * 表单页面(禁用)
- *
- * @return Form
- */
- protected function form(): Form
- {
- return Form::make(new PetActiveSkill(), function (Form $form) {
- $form->display('id', 'ID');
- $form->display('pet_id', '宠物ID');
- $form->display('skill_id', '技能ID');
- $form->display('skill_name', '技能名称');
- $form->display('start_time', '开始时间');
- $form->display('end_time', '结束时间');
- $form->display('status', '状态');
- $form->display('last_check_time', '最后检查时间');
- $form->display('config', '技能配置');
- $form->display('created_at', '创建时间');
- $form->display('updated_at', '更新时间');
-
- $form->disableCreatingCheck();
- $form->disableEditingCheck();
- $form->disableViewCheck();
- });
- }
- }
|