TaskUserProgressController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Module\Task\AdminControllers;
  3. use App\Module\Task\AdminControllers\Helper\FilterHelper;
  4. use App\Module\Task\AdminControllers\Helper\FormHelper;
  5. use App\Module\Task\AdminControllers\Helper\GridHelper;
  6. use App\Module\Task\AdminControllers\Helper\ShowHelper;
  7. use App\Module\Task\Models\TaskUserProgress;
  8. use App\Module\Task\Repositorys\TaskUserProgressRepository;
  9. use Dcat\Admin\Form;
  10. use Dcat\Admin\Grid;
  11. use Dcat\Admin\Show;
  12. use Spatie\RouteAttributes\Attributes\Resource;
  13. use UCore\DcatAdmin\AdminController;
  14. /**
  15. * 用户任务进度控制器
  16. *
  17. * @package App\Module\Task\AdminControllers
  18. */
  19. #[Resource('task-user-progress', names: 'dcat.admin.task-user-progress')]
  20. class TaskUserProgressController extends AdminController
  21. {
  22. /**
  23. * 标题
  24. *
  25. * @var string
  26. */
  27. protected $title = '用户任务进度管理';
  28. /**
  29. * 表格构建
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new TaskUserProgressRepository(), function (Grid $grid) {
  36. $helper = new GridHelper($grid, $this);
  37. $helper->columnId();
  38. $helper->columnUserId();
  39. // 任务名称列,添加链接到任务详情
  40. $grid->column('task.name', '任务名称')->display(function ($name) {
  41. if (!$name) {
  42. return '<span class="text-muted">未知任务</span>';
  43. }
  44. $taskId = $this->task_id ?? 0;
  45. $url = admin_url("tasks/{$taskId}");
  46. return "<a href='{$url}' target='_blank'>{$name}</a>";
  47. });
  48. // 条件名称列
  49. $grid->column('achievementCondition.condition.name', '条件名称')->display(function ($name) {
  50. return $name ?: '<span class="text-muted">未知条件</span>';
  51. });
  52. // 任务状态列(手动查询用户任务状态)
  53. $grid->column('task_status', '任务状态')->display(function () {
  54. // 手动查询用户任务状态
  55. $userTask = \App\Module\Task\Models\TaskUserTask::where('user_id', $this->user_id ?? 0)
  56. ->where('task_id', $this->task_id ?? 0)
  57. ->first();
  58. $status = $userTask ? $userTask->status : null;
  59. if ($status === null) {
  60. return '<span class="badge badge-secondary">未接取</span>';
  61. }
  62. $statusMap = [
  63. 0 => '<span class="badge badge-secondary">未接取</span>',
  64. 1 => '<span class="badge badge-primary">进行中</span>',
  65. 2 => '<span class="badge badge-success">已完成</span>',
  66. 3 => '<span class="badge badge-info">已领取奖励</span>',
  67. 4 => '<span class="badge badge-danger">已失败</span>',
  68. 5 => '<span class="badge badge-warning">已过期</span>',
  69. ];
  70. return $statusMap[$status] ?? '<span class="badge badge-secondary">未知状态</span>';
  71. });
  72. $grid->column('current_value', '当前值')->display(function ($value) {
  73. return number_format($value);
  74. });
  75. $grid->column('target_value', '目标值')->display(function ($value) {
  76. return number_format($value);
  77. });
  78. $helper->columnCalculatedProgress();
  79. // 最后更新时间
  80. $grid->column('last_update_time', '最后更新')->display(function ($time) {
  81. return $time ? $time : '<span class="text-muted">从未更新</span>';
  82. })->sortable();
  83. $grid->column('created_at', '创建时间')->sortable();
  84. $grid->filter(function (Grid\Filter $filter) {
  85. $filterHelper = new FilterHelper($filter, $this);
  86. $filterHelper->equalId();
  87. $filterHelper->equalUserId();
  88. $filterHelper->equalTaskId();
  89. $filterHelper->equal('achievement_condition_id', '达成条件ID');
  90. $filter->between('current_value', '当前值范围');
  91. $filter->between('target_value', '目标值范围');
  92. $filter->between('created_at', '创建时间')->datetime();
  93. });
  94. });
  95. }
  96. /**
  97. * 详情页构建
  98. *
  99. * @param mixed $id
  100. * @return Show
  101. */
  102. protected function detail($id)
  103. {
  104. return Show::make(TaskUserProgress::with(['task', 'achievementCondition.condition', 'userTask'])->findOrFail($id), function (Show $show) {
  105. $helper = new ShowHelper($show, $this);
  106. $helper->fieldId();
  107. $show->field('user_id', '用户ID');
  108. $show->field('task.name', '任务名称');
  109. $show->field('task.description', '任务描述');
  110. $show->field('achievementCondition.condition.name', '条件名称');
  111. $show->field('achievementCondition.condition.description', '条件描述');
  112. $show->field('current_value', '当前值')->as(function ($value) {
  113. return number_format($value);
  114. });
  115. $show->field('target_value', '目标值')->as(function ($value) {
  116. return number_format($value);
  117. });
  118. $helper->fieldCalculatedProgress();
  119. // 任务状态暂时移除,可以通过用户任务管理页面查看
  120. $show->field('last_update_time', '最后更新时间');
  121. $helper->fieldCreatedAt();
  122. $helper->fieldUpdatedAt();
  123. });
  124. }
  125. /**
  126. * 表单构建
  127. *
  128. * @return Form
  129. */
  130. protected function form()
  131. {
  132. return Form::make(new TaskUserProgressRepository(), function (Form $form) {
  133. $helper = new FormHelper($form, $this);
  134. $form->display('id', 'ID');
  135. $form->number('user_id', '用户ID')->required();
  136. $helper->selectTask();
  137. $form->select('achievement_condition_id', '达成条件ID')->options(function () {
  138. return \App\Module\Task\Models\TaskAchievementCondition::with('condition')
  139. ->get()
  140. ->pluck('condition.name', 'id');
  141. })->required();
  142. $form->number('current_value', '当前值')->default(0)->min(0);
  143. $form->number('target_value', '目标值')->default(1)->min(1);
  144. $form->display('created_at', '创建时间');
  145. $form->display('updated_at', '更新时间');
  146. });
  147. }
  148. }