column('id', 'ID')->sortable(); $grid->column('pet_id', '宠物ID')->display(function ($value) { return "{$value}"; }); $grid->column('pet.user_id', '用户ID')->display(function ($value) { return "{$value}"; }); $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 '未检查'; } $time = \Carbon\Carbon::parse($value); $diffSeconds = $time->diffInSeconds(now()); if ($diffSeconds < 60) { return "{$time->format('Y-m-d H:i:s')}"; } elseif ($diffSeconds < 300) { return "{$time->format('Y-m-d H:i:s')}"; } else { return "{$time->format('Y-m-d H:i:s')}"; } })->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 '已过期'; } $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('取消技能'); } }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append('刷新'); }); }); } /** * 详情页面 * * @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(); }); } }