column('id', 'ID')->sortable(); $grid->column('user_id', '用户ID'); $grid->column('activity_id', '活动')->display(function ($activityId) { $activity = ActivityConfig::find($activityId); return $activity ? $activity->name : "未知活动({$activityId})"; }); $grid->column('participate_time', '参与时间')->sortable(); $grid->column('completion_status', '完成状态')->display(function ($status) { return PARTICIPATION_STATUS::getName($status); })->label([ PARTICIPATION_STATUS::IN_PROGRESS => 'primary', PARTICIPATION_STATUS::COMPLETED => 'success', PARTICIPATION_STATUS::FAILED => 'danger', ]); $grid->column('completion_time', '完成时间'); $grid->column('reward_status', '奖励状态')->display(function ($status) { return REWARD_STATUS::getName($status); })->label([ REWARD_STATUS::NOT_CLAIMED => 'warning', REWARD_STATUS::CLAIMED => 'success', REWARD_STATUS::EXPIRED => 'danger', ]); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); $grid->filter(function (Grid\Filter $filter) { $filter->equal('id', 'ID'); $filter->equal('user_id', '用户ID'); $filter->equal('activity_id', '活动')->select( ActivityConfig::pluck('name', 'id') ); $filter->equal('completion_status', '完成状态')->select(PARTICIPATION_STATUS::getAll()); $filter->equal('reward_status', '奖励状态')->select(REWARD_STATUS::getAll()); $filter->between('participate_time', '参与时间')->datetime(); $filter->between('completion_time', '完成时间')->datetime(); }); // 禁用创建按钮 $grid->disableCreateButton(); // 添加操作按钮 $grid->actions(function (Grid\Displayers\Actions $actions) { // 如果未完成,添加标记为完成按钮 if ($actions->row->completion_status === PARTICIPATION_STATUS::IN_PROGRESS) { $actions->append(' 标记完成'); } // 如果已完成但未领取奖励,添加标记为已领取按钮 if ($actions->row->completion_status === PARTICIPATION_STATUS::COMPLETED && $actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) { $actions->append(' 标记已领取'); } // 如果未领取奖励,添加标记为已过期按钮 if ($actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) { $actions->append(' 标记已过期'); } }); }); } /** * 创建详情页 * * @param mixed $id * @return Show */ protected function detail($id) { return Show::make($id, new ActivityParticipationRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('user_id', '用户ID'); $show->field('activity_id', '活动')->as(function ($activityId) { $activity = ActivityConfig::find($activityId); return $activity ? $activity->name : "未知活动({$activityId})"; }); $show->field('participate_time', '参与时间'); $show->field('completion_status', '完成状态')->as(function ($status) { return PARTICIPATION_STATUS::getName($status); }); $show->field('completion_time', '完成时间'); $show->field('reward_status', '奖励状态')->as(function ($status) { return REWARD_STATUS::getName($status); }); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); // 显示用户活动数据 $show->divider(); $show->field('用户活动数据')->as(function () { $userData = \App\Module\Activity\Models\UserActivityData::where('user_id', $this->user_id) ->where('activity_id', $this->activity_id) ->first(); if (!$userData) { return '无数据'; } $html = '
'; $html .= ''; $html .= ''; $html .= ''; $html .= '
进度' . $userData->progress . '
最后更新' . $userData->last_update . '
详细进度数据
' . json_encode($userData->progress_data, JSON_PRETTY_PRINT) . '
'; return $html; })->unescape(); }); } /** * 创建表单 * * @return Form */ protected function form() { return Form::make(new ActivityParticipationRepository(), function (Form $form) { $form->display('id', 'ID'); $form->display('user_id', '用户ID'); $form->display('activity_id', '活动ID'); $form->display('participate_time', '参与时间'); $form->select('completion_status', '完成状态') ->options(PARTICIPATION_STATUS::getAll()) ->required(); $form->datetime('completion_time', '完成时间'); $form->select('reward_status', '奖励状态') ->options(REWARD_STATUS::getAll()) ->required(); $form->display('created_at', '创建时间'); $form->display('updated_at', '更新时间'); }); } /** * 标记为完成 * * @param int $id * @param Content $content * @return Content */ public function complete($id, Content $content) { $participation = ActivityParticipation::findOrFail($id); if ($participation->completion_status !== PARTICIPATION_STATUS::IN_PROGRESS) { return $content ->title($this->title()) ->description('标记完成') ->body(admin_error('操作失败', '只有进行中的参与记录才能标记为完成')); } $participation->completion_status = PARTICIPATION_STATUS::COMPLETED; $participation->completion_time = now(); $participation->save(); // 触发活动完成事件 event(new \App\Module\Activity\Events\ActivityCompletedEvent( $participation->user_id, $participation->activity_id )); return $content ->title($this->title()) ->description('标记完成') ->body(admin_success('操作成功', "参与记录 [{$id}] 已标记为完成")) ->body(""); } /** * 标记为已领取 * * @param int $id * @param Content $content * @return Content */ public function claim($id, Content $content) { $participation = ActivityParticipation::findOrFail($id); if ($participation->completion_status !== PARTICIPATION_STATUS::COMPLETED) { return $content ->title($this->title()) ->description('标记已领取') ->body(admin_error('操作失败', '只有已完成的参与记录才能标记为已领取')); } if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) { return $content ->title($this->title()) ->description('标记已领取') ->body(admin_error('操作失败', '只有未领取的奖励才能标记为已领取')); } $participation->reward_status = REWARD_STATUS::CLAIMED; $participation->save(); // 触发奖励领取事件 event(new \App\Module\Activity\Events\ActivityRewardClaimedEvent( $participation->user_id, $participation->activity_id, ['success' => true, 'message' => '管理员手动标记', 'rewards' => []] )); return $content ->title($this->title()) ->description('标记已领取') ->body(admin_success('操作成功', "参与记录 [{$id}] 的奖励已标记为已领取")) ->body(""); } /** * 标记为已过期 * * @param int $id * @param Content $content * @return Content */ public function expire($id, Content $content) { $participation = ActivityParticipation::findOrFail($id); if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) { return $content ->title($this->title()) ->description('标记已过期') ->body(admin_error('操作失败', '只有未领取的奖励才能标记为已过期')); } $participation->reward_status = REWARD_STATUS::EXPIRED; $participation->save(); return $content ->title($this->title()) ->description('标记已过期') ->body(admin_success('操作成功', "参与记录 [{$id}] 的奖励已标记为已过期")) ->body(""); } }