ActivityParticipationController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace App\Module\Activity\AdminControllers;
  3. use App\Module\Activity\Enums\PARTICIPATION_STATUS;
  4. use App\Module\Activity\Enums\REWARD_STATUS;
  5. use App\Module\Activity\Models\ActivityConfig;
  6. use App\Module\Activity\Models\ActivityParticipation;
  7. use App\Module\Activity\Repositorys\ActivityParticipationRepository;
  8. use Dcat\Admin\Form;
  9. use Dcat\Admin\Grid;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Http\Controllers\AdminController;
  12. use Dcat\Admin\Layout\Content;
  13. /**
  14. * 活动参与记录控制器
  15. */
  16. class ActivityParticipationController extends AdminController
  17. {
  18. /**
  19. * 标题
  20. *
  21. * @return string
  22. */
  23. protected function title()
  24. {
  25. return '活动参与记录';
  26. }
  27. /**
  28. * 创建表格
  29. *
  30. * @return Grid
  31. */
  32. protected function grid()
  33. {
  34. return Grid::make(new ActivityParticipationRepository(), function (Grid $grid) {
  35. $grid->column('id', 'ID')->sortable();
  36. $grid->column('user_id', '用户ID');
  37. $grid->column('activity_id', '活动')->display(function ($activityId) {
  38. $activity = ActivityConfig::find($activityId);
  39. return $activity ? $activity->name : "未知活动({$activityId})";
  40. });
  41. $grid->column('participate_time', '参与时间')->sortable();
  42. $grid->column('completion_status', '完成状态')->display(function ($status) {
  43. return PARTICIPATION_STATUS::getName($status);
  44. })->label([
  45. PARTICIPATION_STATUS::IN_PROGRESS => 'primary',
  46. PARTICIPATION_STATUS::COMPLETED => 'success',
  47. PARTICIPATION_STATUS::FAILED => 'danger',
  48. ]);
  49. $grid->column('completion_time', '完成时间');
  50. $grid->column('reward_status', '奖励状态')->display(function ($status) {
  51. return REWARD_STATUS::getName($status);
  52. })->label([
  53. REWARD_STATUS::NOT_CLAIMED => 'warning',
  54. REWARD_STATUS::CLAIMED => 'success',
  55. REWARD_STATUS::EXPIRED => 'danger',
  56. ]);
  57. $grid->column('created_at', '创建时间');
  58. $grid->column('updated_at', '更新时间');
  59. $grid->filter(function (Grid\Filter $filter) {
  60. $filter->equal('id', 'ID');
  61. $filter->equal('user_id', '用户ID');
  62. $filter->equal('activity_id', '活动')->select(
  63. ActivityConfig::pluck('name', 'id')
  64. );
  65. $filter->equal('completion_status', '完成状态')->select(PARTICIPATION_STATUS::getAll());
  66. $filter->equal('reward_status', '奖励状态')->select(REWARD_STATUS::getAll());
  67. $filter->between('participate_time', '参与时间')->datetime();
  68. $filter->between('completion_time', '完成时间')->datetime();
  69. });
  70. // 禁用创建按钮
  71. $grid->disableCreateButton();
  72. // 添加操作按钮
  73. $grid->actions(function (Grid\Displayers\Actions $actions) {
  74. // 如果未完成,添加标记为完成按钮
  75. if ($actions->row->completion_status === PARTICIPATION_STATUS::IN_PROGRESS) {
  76. $actions->append('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/complete') . '"><i class="fa fa-check"></i> 标记完成</a>');
  77. }
  78. // 如果已完成但未领取奖励,添加标记为已领取按钮
  79. if ($actions->row->completion_status === PARTICIPATION_STATUS::COMPLETED && $actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) {
  80. $actions->append('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/claim') . '"><i class="fa fa-gift"></i> 标记已领取</a>');
  81. }
  82. // 如果未领取奖励,添加标记为已过期按钮
  83. if ($actions->row->reward_status === REWARD_STATUS::NOT_CLAIMED) {
  84. $actions->append('<a href="' . admin_url('activity/participations/' . $actions->getKey() . '/expire') . '"><i class="fa fa-clock-o"></i> 标记已过期</a>');
  85. }
  86. });
  87. });
  88. }
  89. /**
  90. * 创建详情页
  91. *
  92. * @param mixed $id
  93. * @return Show
  94. */
  95. protected function detail($id)
  96. {
  97. return Show::make($id, new ActivityParticipationRepository(), function (Show $show) {
  98. $show->field('id', 'ID');
  99. $show->field('user_id', '用户ID');
  100. $show->field('activity_id', '活动')->as(function ($activityId) {
  101. $activity = ActivityConfig::find($activityId);
  102. return $activity ? $activity->name : "未知活动({$activityId})";
  103. });
  104. $show->field('participate_time', '参与时间');
  105. $show->field('completion_status', '完成状态')->as(function ($status) {
  106. return PARTICIPATION_STATUS::getName($status);
  107. });
  108. $show->field('completion_time', '完成时间');
  109. $show->field('reward_status', '奖励状态')->as(function ($status) {
  110. return REWARD_STATUS::getName($status);
  111. });
  112. $show->field('created_at', '创建时间');
  113. $show->field('updated_at', '更新时间');
  114. // 显示用户活动数据
  115. $show->divider();
  116. $show->field('用户活动数据')->as(function () {
  117. $userData = \App\Module\Activity\Models\UserActivityData::where('user_id', $this->user_id)
  118. ->where('activity_id', $this->activity_id)
  119. ->first();
  120. if (!$userData) {
  121. return '无数据';
  122. }
  123. $html = '<div class="table-responsive"><table class="table table-bordered">';
  124. $html .= '<tr><th>进度</th><td>' . $userData->progress . '</td></tr>';
  125. $html .= '<tr><th>最后更新</th><td>' . $userData->last_update . '</td></tr>';
  126. $html .= '<tr><th>详细进度数据</th><td><pre>' . json_encode($userData->progress_data, JSON_PRETTY_PRINT) . '</pre></td></tr>';
  127. $html .= '</table></div>';
  128. return $html;
  129. })->unescape();
  130. });
  131. }
  132. /**
  133. * 创建表单
  134. *
  135. * @return Form
  136. */
  137. protected function form()
  138. {
  139. return Form::make(new ActivityParticipationRepository(), function (Form $form) {
  140. $form->display('id', 'ID');
  141. $form->display('user_id', '用户ID');
  142. $form->display('activity_id', '活动ID');
  143. $form->display('participate_time', '参与时间');
  144. $form->select('completion_status', '完成状态')
  145. ->options(PARTICIPATION_STATUS::getAll())
  146. ->required();
  147. $form->datetime('completion_time', '完成时间');
  148. $form->select('reward_status', '奖励状态')
  149. ->options(REWARD_STATUS::getAll())
  150. ->required();
  151. $form->display('created_at', '创建时间');
  152. $form->display('updated_at', '更新时间');
  153. });
  154. }
  155. /**
  156. * 标记为完成
  157. *
  158. * @param int $id
  159. * @param Content $content
  160. * @return Content
  161. */
  162. public function complete($id, Content $content)
  163. {
  164. $participation = ActivityParticipation::findOrFail($id);
  165. if ($participation->completion_status !== PARTICIPATION_STATUS::IN_PROGRESS) {
  166. return $content
  167. ->title($this->title())
  168. ->description('标记完成')
  169. ->body(admin_error('操作失败', '只有进行中的参与记录才能标记为完成'));
  170. }
  171. $participation->completion_status = PARTICIPATION_STATUS::COMPLETED;
  172. $participation->completion_time = now();
  173. $participation->save();
  174. // 触发活动完成事件
  175. event(new \App\Module\Activity\Events\ActivityCompletedEvent(
  176. $participation->user_id,
  177. $participation->activity_id
  178. ));
  179. return $content
  180. ->title($this->title())
  181. ->description('标记完成')
  182. ->body(admin_success('操作成功', "参与记录 [{$id}] 已标记为完成"))
  183. ->body("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
  184. }
  185. /**
  186. * 标记为已领取
  187. *
  188. * @param int $id
  189. * @param Content $content
  190. * @return Content
  191. */
  192. public function claim($id, Content $content)
  193. {
  194. $participation = ActivityParticipation::findOrFail($id);
  195. if ($participation->completion_status !== PARTICIPATION_STATUS::COMPLETED) {
  196. return $content
  197. ->title($this->title())
  198. ->description('标记已领取')
  199. ->body(admin_error('操作失败', '只有已完成的参与记录才能标记为已领取'));
  200. }
  201. if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) {
  202. return $content
  203. ->title($this->title())
  204. ->description('标记已领取')
  205. ->body(admin_error('操作失败', '只有未领取的奖励才能标记为已领取'));
  206. }
  207. $participation->reward_status = REWARD_STATUS::CLAIMED;
  208. $participation->save();
  209. // 触发奖励领取事件
  210. event(new \App\Module\Activity\Events\ActivityRewardClaimedEvent(
  211. $participation->user_id,
  212. $participation->activity_id,
  213. ['success' => true, 'message' => '管理员手动标记', 'rewards' => []]
  214. ));
  215. return $content
  216. ->title($this->title())
  217. ->description('标记已领取')
  218. ->body(admin_success('操作成功', "参与记录 [{$id}] 的奖励已标记为已领取"))
  219. ->body("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
  220. }
  221. /**
  222. * 标记为已过期
  223. *
  224. * @param int $id
  225. * @param Content $content
  226. * @return Content
  227. */
  228. public function expire($id, Content $content)
  229. {
  230. $participation = ActivityParticipation::findOrFail($id);
  231. if ($participation->reward_status !== REWARD_STATUS::NOT_CLAIMED) {
  232. return $content
  233. ->title($this->title())
  234. ->description('标记已过期')
  235. ->body(admin_error('操作失败', '只有未领取的奖励才能标记为已过期'));
  236. }
  237. $participation->reward_status = REWARD_STATUS::EXPIRED;
  238. $participation->save();
  239. return $content
  240. ->title($this->title())
  241. ->description('标记已过期')
  242. ->body(admin_success('操作成功', "参与记录 [{$id}] 的奖励已标记为已过期"))
  243. ->body("<script>setTimeout(function(){ window.location.href = '" . admin_url('activity/participations') . "'; }, 2000);</script>");
  244. }
  245. }