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();
});
}
}