ActivityParticipationController.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Module\Activity\AdminControllers;
  3. use App\Module\Activity\AdminControllers\Actions\ClaimRewardAction;
  4. use App\Module\Activity\AdminControllers\Actions\CompleteParticipationAction;
  5. use App\Module\Activity\AdminControllers\Actions\ExpireRewardAction;
  6. use App\Module\Activity\Enums\PARTICIPATION_STATUS;
  7. use App\Module\Activity\Enums\REWARD_STATUS;
  8. use App\Module\Activity\Models\ActivityConfig;
  9. use App\Module\Activity\Repositorys\ActivityParticipationRepository;
  10. use Dcat\Admin\Form;
  11. use Dcat\Admin\Grid;
  12. use Dcat\Admin\Show;
  13. use Dcat\Admin\Http\Controllers\AdminController;
  14. /**
  15. * 活动参与记录控制器
  16. */
  17. class ActivityParticipationController extends AdminController
  18. {
  19. /**
  20. * 标题
  21. *
  22. * @return string
  23. */
  24. protected function title()
  25. {
  26. return '活动参与记录';
  27. }
  28. /**
  29. * 创建表格
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new ActivityParticipationRepository(), function (Grid $grid) {
  36. $grid->column('id', 'ID')->sortable();
  37. $grid->column('user_id', '用户ID');
  38. $grid->column('activity_id', '活动')->display(function ($activityId) {
  39. $activity = ActivityConfig::find($activityId);
  40. return $activity ? $activity->name : "未知活动({$activityId})";
  41. });
  42. $grid->column('participate_time', '参与时间')->sortable();
  43. $grid->column('completion_status', '完成状态')->display(function ($status) {
  44. return PARTICIPATION_STATUS::getName($status);
  45. })->label([
  46. PARTICIPATION_STATUS::IN_PROGRESS => 'primary',
  47. PARTICIPATION_STATUS::COMPLETED => 'success',
  48. PARTICIPATION_STATUS::FAILED => 'danger',
  49. ]);
  50. $grid->column('completion_time', '完成时间');
  51. $grid->column('reward_status', '奖励状态')->display(function ($status) {
  52. return REWARD_STATUS::getName($status);
  53. })->label([
  54. REWARD_STATUS::NOT_CLAIMED => 'warning',
  55. REWARD_STATUS::CLAIMED => 'success',
  56. REWARD_STATUS::EXPIRED => 'danger',
  57. ]);
  58. $grid->column('created_at', '创建时间');
  59. $grid->column('updated_at', '更新时间');
  60. $grid->filter(function (Grid\Filter $filter) {
  61. $filter->equal('id', 'ID');
  62. $filter->equal('user_id', '用户ID');
  63. $filter->equal('activity_id', '活动')->select(
  64. ActivityConfig::pluck('name', 'id')
  65. );
  66. $filter->equal('completion_status', '完成状态')->select(PARTICIPATION_STATUS::getAll());
  67. $filter->equal('reward_status', '奖励状态')->select(REWARD_STATUS::getAll());
  68. $filter->between('participate_time', '参与时间')->datetime();
  69. $filter->between('completion_time', '完成时间')->datetime();
  70. });
  71. // 禁用创建按钮
  72. $grid->disableCreateButton();
  73. // 使用 RowAction 类添加行操作按钮
  74. $grid->actions(function (Grid\Displayers\Actions $actions) {
  75. // 添加标记完成按钮(只在进行中状态显示)
  76. $actions->append(new CompleteParticipationAction());
  77. // 添加标记已领取按钮(只在已完成且未领取状态显示)
  78. $actions->append(new ClaimRewardAction());
  79. // 添加标记已过期按钮(只在未领取状态显示)
  80. $actions->append(new ExpireRewardAction());
  81. });
  82. });
  83. }
  84. /**
  85. * 创建详情页
  86. *
  87. * @param mixed $id
  88. * @return Show
  89. */
  90. protected function detail($id)
  91. {
  92. return Show::make($id, new ActivityParticipationRepository(), function (Show $show) {
  93. $show->field('id', 'ID');
  94. $show->field('user_id', '用户ID');
  95. $show->field('activity_id', '活动')->as(function ($activityId) {
  96. $activity = ActivityConfig::find($activityId);
  97. return $activity ? $activity->name : "未知活动({$activityId})";
  98. });
  99. $show->field('participate_time', '参与时间');
  100. $show->field('completion_status', '完成状态')->as(function ($status) {
  101. return PARTICIPATION_STATUS::getName($status);
  102. });
  103. $show->field('completion_time', '完成时间');
  104. $show->field('reward_status', '奖励状态')->as(function ($status) {
  105. return REWARD_STATUS::getName($status);
  106. });
  107. $show->field('created_at', '创建时间');
  108. $show->field('updated_at', '更新时间');
  109. // 显示用户活动数据
  110. $show->divider();
  111. $show->field('用户活动数据')->as(function () {
  112. $model = $this->model();
  113. $userData = \App\Module\Activity\Models\UserActivityData::where('user_id', $model->user_id)
  114. ->where('activity_id', $model->activity_id)
  115. ->first();
  116. if (!$userData) {
  117. return '无数据';
  118. }
  119. $html = '<div class="table-responsive"><table class="table table-bordered">';
  120. $html .= '<tr><th>进度</th><td>' . $userData->progress . '</td></tr>';
  121. $html .= '<tr><th>最后更新</th><td>' . $userData->last_update . '</td></tr>';
  122. $html .= '<tr><th>详细进度数据</th><td><pre>' . json_encode($userData->progress_data, JSON_PRETTY_PRINT) . '</pre></td></tr>';
  123. $html .= '</table></div>';
  124. return $html;
  125. })->unescape();
  126. });
  127. }
  128. /**
  129. * 创建表单
  130. *
  131. * @return Form
  132. */
  133. protected function form()
  134. {
  135. return Form::make(new ActivityParticipationRepository(), function (Form $form) {
  136. $form->display('id', 'ID');
  137. $form->display('user_id', '用户ID');
  138. $form->display('activity_id', '活动ID');
  139. $form->display('participate_time', '参与时间');
  140. $form->select('completion_status', '完成状态')
  141. ->options(PARTICIPATION_STATUS::getAll())
  142. ->required();
  143. $form->datetime('completion_time', '完成时间');
  144. $form->select('reward_status', '奖励状态')
  145. ->options(REWARD_STATUS::getAll())
  146. ->required();
  147. $form->display('created_at', '创建时间');
  148. $form->display('updated_at', '更新时间');
  149. });
  150. }
  151. }