| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- <?php
- namespace App\Module\Activity\AdminControllers;
- use App\Module\Activity\Enums\PARTICIPATION_STATUS;
- use App\Module\Activity\Enums\REWARD_STATUS;
- use App\Module\Activity\Models\ActivityConfig;
- use App\Module\Activity\Models\ActivityParticipation;
- use App\Module\Activity\Repositorys\ActivityParticipationRepository;
- use Dcat\Admin\Form;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use Dcat\Admin\Http\Controllers\AdminController;
- use Dcat\Admin\Layout\Content;
- /**
- * 活动参与记录控制器
- */
- class ActivityParticipationController extends AdminController
- {
- /**
- * 标题
- *
- * @return string
- */
- protected function title()
- {
- return '活动参与记录';
- }
- /**
- * 创建表格
- *
- * @return Grid
- */
- protected function grid()
- {
- return Grid::make(new ActivityParticipationRepository(), function (Grid $grid) {
- $grid->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('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/complete') . '"><i class="fa fa-check"></i> 标记完成</a>');
- }
-
- // 如果已完成但未领取奖励,添加标记为已领取按钮
- if ($actions->row->completion_status === PARTICIPATION_STATUS::COMPLETED && $actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) {
- $actions->append('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/claim') . '"><i class="fa fa-gift"></i> 标记已领取</a>');
- }
-
- // 如果未领取奖励,添加标记为已过期按钮
- if ($actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) {
- $actions->append('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/expire') . '"><i class="fa fa-clock-o"></i> 标记已过期</a>');
- }
- });
- });
- }
- /**
- * 创建详情页
- *
- * @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 = '<div class="table-responsive"><table class="table table-bordered">';
- $html .= '<tr><th>进度</th><td>' . $userData->progress . '</td></tr>';
- $html .= '<tr><th>最后更新</th><td>' . $userData->last_update . '</td></tr>';
- $html .= '<tr><th>详细进度数据</th><td><pre>' . json_encode($userData->progress_data, JSON_PRETTY_PRINT) . '</pre></td></tr>';
- $html .= '</table></div>';
-
- 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("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
- }
- /**
- * 标记为已领取
- *
- * @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("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
- }
- /**
- * 标记为已过期
- *
- * @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("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
- }
- }
|