column('id', 'ID')->sortable();
$grid->column('name', '活动名称');
$grid->column('type', '活动类型')->display(function ($type) {
return ACTIVITY_TYPE::getName($type);
});
$grid->column('start_time', '开始时间')->sortable();
$grid->column('end_time', '结束时间')->sortable();
$grid->column('status', '状态')->display(function ($status) {
return ACTIVITY_STATUS::getName($status);
})->label([
ACTIVITY_STATUS::NOT_STARTED => 'default',
ACTIVITY_STATUS::IN_PROGRESS => 'success',
ACTIVITY_STATUS::ENDED => 'warning',
ACTIVITY_STATUS::CLOSED => 'danger',
]);
$grid->column('display_order', '显示顺序')->sortable();
$grid->column('reward_group_id', '奖励组ID');
$grid->column('reward_group_code', '奖励组编码');
$grid->column('created_at', '创建时间');
$grid->column('updated_at', '更新时间');
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id', 'ID');
$filter->like('name', '活动名称');
$filter->equal('type', '活动类型')->select(ACTIVITY_TYPE::getAll());
$filter->equal('status', '状态')->select(ACTIVITY_STATUS::getAll());
$filter->between('start_time', '开始时间')->datetime();
$filter->between('end_time', '结束时间')->datetime();
});
$grid->actions(function (Grid\Displayers\Actions $actions) {
// 添加复制按钮
$actions->append(' 复制');
// 添加更新状态按钮
if ($actions->row->status === ACTIVITY_STATUS::NOT_STARTED) {
$actions->append(' 开始');
} elseif ($actions->row->status === ACTIVITY_STATUS::IN_PROGRESS) {
$actions->append(' 结束');
} elseif ($actions->row->status === ACTIVITY_STATUS::ENDED) {
$actions->append(' 关闭');
}
});
});
}
/**
* 创建详情页
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new ActivityConfigRepository(), function (Show $show) {
$show->field('id', 'ID');
$show->field('name', '活动名称');
$show->field('type', '活动类型')->as(function ($type) {
return ACTIVITY_TYPE::getName($type);
});
$show->field('description', '活动描述');
$show->field('start_time', '开始时间');
$show->field('end_time', '结束时间');
$show->field('status', '状态')->as(function ($status) {
return ACTIVITY_STATUS::getName($status);
});
$show->field('display_order', '显示顺序');
$show->field('icon', '活动图标')->image();
$show->field('banner', '活动横幅')->image();
$show->field('reward_group_id', '奖励组ID');
$show->field('reward_group_code', '奖励组编码');
$show->field('config_params', '配置参数')->json();
$show->field('created_at', '创建时间');
$show->field('updated_at', '更新时间');
// 显示活动条件
$show->divider();
$show->field('条件')->as(function () {
$conditions = $this->conditions()->get();
if ($conditions->isEmpty()) {
return '无条件';
}
$headers = ['ID', '条件类型', '参与条件', '完成条件', '显示顺序'];
$rows = [];
foreach ($conditions as $condition) {
$rows[] = [
$condition->id,
$condition->getConditionTypeName(),
$condition->is_participation_condition ? '是' : '否',
$condition->is_completion_condition ? '是' : '否',
$condition->display_order
];
}
return Card::make(
Table::make($headers, $rows)
);
});
// 显示奖励信息
$show->divider();
$show->field('奖励信息')->as(function () {
if (!$this->reward_group_id && !$this->reward_group_code) {
return '未配置奖励';
}
$rewardInfo = '奖励组ID: ' . ($this->reward_group_id ?: '无') . '
';
$rewardInfo .= '奖励组编码: ' . ($this->reward_group_code ?: '无') . '
';
// 这里可以调用奖励组服务获取更详细的奖励信息
// 由于没有实际的奖励组服务,这里只返回基本信息
return $rewardInfo;
})->unescape();
});
}
/**
* 创建表单
*
* @return Form
*/
protected function form()
{
return Form::make(new ActivityConfigRepository(), function (Form $form) {
$form->display('id', 'ID');
$form->text('name', '活动名称')->required();
$form->select('type', '活动类型')->options(ACTIVITY_TYPE::getAll())->required();
$form->textarea('description', '活动描述');
$form->datetime('start_time', '开始时间')->required();
$form->datetime('end_time', '结束时间')->required();
$form->select('status', '状态')->options(ACTIVITY_STATUS::getAll())->default(ACTIVITY_STATUS::NOT_STARTED);
$form->number('display_order', '显示顺序')->default(0);
$form->image('icon', '活动图标')->autoUpload();
$form->image('banner', '活动横幅')->autoUpload();
// 奖励组选择
$form->divider('奖励配置');
$form->number('reward_group_id', '奖励组ID')->help('填写奖励组ID或奖励组编码,两者选其一即可');
$form->text('reward_group_code', '奖励组编码')->help('填写奖励组ID或奖励组编码,两者选其一即可');
// 活动条件
$form->divider('活动条件');
$form->hasMany('conditions', '条件', function (Form\NestedForm $form) {
$form->select('condition_type', '条件类型')->options(\App\Module\Activity\Enums\CONDITION_TYPE::getAll())->required();
$form->textarea('condition_params', '条件参数')->help('JSON格式,根据条件类型填写不同的参数');
$form->switch('is_participation_condition', '参与条件')->default(false);
$form->switch('is_completion_condition', '完成条件')->default(false);
$form->number('display_order', '显示顺序')->default(0);
});
// 高级配置
$form->divider('高级配置');
$form->textarea('config_params', '配置参数')->help('JSON格式,用于存储活动特定的配置参数');
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
/**
* 复制活动
*
* @param int $id
* @param Content $content
* @return Content
*/
public function duplicate($id, Content $content)
{
$activity = ActivityConfig::with('conditions')->findOrFail($id);
// 复制活动基本信息
$newActivity = $activity->replicate();
$newActivity->name = $activity->name . ' (复制)';
$newActivity->status = ACTIVITY_STATUS::NOT_STARTED;
$newActivity->save();
// 复制活动条件
foreach ($activity->conditions as $condition) {
$newCondition = $condition->replicate();
$newCondition->activity_id = $newActivity->id;
$newCondition->save();
}
return $content
->title($this->title())
->description('复制活动')
->body(admin_success('复制成功', "已成功复制活动 [{$newActivity->name}]"))
->body("");
}
/**
* 开始活动
*
* @param int $id
* @param Content $content
* @return Content
*/
public function start($id, Content $content)
{
$activity = ActivityConfig::findOrFail($id);
if ($activity->status !== ACTIVITY_STATUS::NOT_STARTED) {
return $content
->title($this->title())
->description('开始活动')
->body(admin_error('操作失败', '只有未开始的活动才能开始'));
}
$activity->status = ACTIVITY_STATUS::IN_PROGRESS;
$activity->save();
// 触发活动状态变更事件
event(new \App\Module\Activity\Events\ActivityStatusChangedEvent(
$activity->id,
ACTIVITY_STATUS::NOT_STARTED,
ACTIVITY_STATUS::IN_PROGRESS
));
return $content
->title($this->title())
->description('开始活动')
->body(admin_success('操作成功', "活动 [{$activity->name}] 已开始"))
->body("");
}
/**
* 结束活动
*
* @param int $id
* @param Content $content
* @return Content
*/
public function end($id, Content $content)
{
$activity = ActivityConfig::findOrFail($id);
if ($activity->status !== ACTIVITY_STATUS::IN_PROGRESS) {
return $content
->title($this->title())
->description('结束活动')
->body(admin_error('操作失败', '只有进行中的活动才能结束'));
}
$activity->status = ACTIVITY_STATUS::ENDED;
$activity->save();
// 触发活动状态变更事件
event(new \App\Module\Activity\Events\ActivityStatusChangedEvent(
$activity->id,
ACTIVITY_STATUS::IN_PROGRESS,
ACTIVITY_STATUS::ENDED
));
return $content
->title($this->title())
->description('结束活动')
->body(admin_success('操作成功', "活动 [{$activity->name}] 已结束"))
->body("");
}
/**
* 关闭活动
*
* @param int $id
* @param Content $content
* @return Content
*/
public function close($id, Content $content)
{
$activity = ActivityConfig::findOrFail($id);
if ($activity->status !== ACTIVITY_STATUS::ENDED) {
return $content
->title($this->title())
->description('关闭活动')
->body(admin_error('操作失败', '只有已结束的活动才能关闭'));
}
$activity->status = ACTIVITY_STATUS::CLOSED;
$activity->save();
// 触发活动状态变更事件
event(new \App\Module\Activity\Events\ActivityStatusChangedEvent(
$activity->id,
ACTIVITY_STATUS::ENDED,
ACTIVITY_STATUS::CLOSED
));
return $content
->title($this->title())
->description('关闭活动')
->body(admin_success('操作成功', "活动 [{$activity->name}] 已关闭"))
->body("");
}
}