UserTaskService.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace App\Modules\UserTask\Services;
  3. use App\Jobs\UserTaskJob;
  4. use App\Modules\UserTask\Models\Task;
  5. use App\Modules\UserTask\Models\UserRepeatTask;
  6. use App\Modules\UserTask\Models\UserTask;
  7. use Illuminate\Database\Eloquent\Collection;
  8. class UserTaskService
  9. {
  10. const add_trigger = 'add';
  11. const judge_trigger = 'judge';
  12. private $uid;
  13. /**
  14. * Create a new job instance.
  15. *
  16. * @return void
  17. */
  18. public function __construct(int $uid)
  19. {
  20. $this->uid = $uid;
  21. }
  22. /**
  23. * 触发任务
  24. * @param string $type 任务类型
  25. * @param string $trigger_type 触发类型
  26. */
  27. public function trigger(string $type, string $trigger_type)
  28. {
  29. $model = $this->model($type);
  30. $tasks = Task::where('type', $type)->get();
  31. foreach ($tasks as $task) {
  32. $model->setTask($task);
  33. switch ($trigger_type) {
  34. case self::add_trigger:
  35. $model->handleAddUserTask();
  36. break;
  37. case self::judge_trigger:
  38. $model->handleAddUserTask();
  39. $model->handleUpToUserTask();
  40. break;
  41. }
  42. }
  43. }
  44. /**
  45. * 领取任务奖励
  46. * @return int
  47. */
  48. public function getTaskReward(int $task_id)
  49. {
  50. $task = Task::find($task_id);
  51. $model = $this->model($task->type, $task);
  52. return $model->handleUserTaskReward();
  53. }
  54. /**
  55. * 获取任务model
  56. * @return SingleTask|ChargeTask|ReadTask
  57. */
  58. public function model(string $type, Task $task = null)
  59. {
  60. switch ($type) {
  61. case SingleTask::register:
  62. case SingleTask::bind_phone:
  63. case SingleTask::add_desk:
  64. return new SingleTask($this->uid, $task);
  65. break;
  66. case RepeatTask::charge:
  67. return new ChargeTask($this->uid, $task);
  68. break;
  69. case RepeatTask::read:
  70. return new ReadTask($this->uid, $task);
  71. break;
  72. }
  73. }
  74. /**
  75. * 添加用户任务队列
  76. * @param int $uid
  77. * @param string $type 任务类型
  78. * @param string $trigger_type 触发类型
  79. */
  80. public static function addUserTaskQueue(int $uid, string $type, string $trigger_type)
  81. {
  82. $job = new UserTaskJob($uid, $type, $trigger_type);
  83. dispatch($job)->onConnection('redis_queue')->onQueue('{qapp_user_task_queue}');
  84. }
  85. /**
  86. * 新手任务
  87. */
  88. public function findNewUserTaskList()
  89. {
  90. $tasks = $this->findTaskList(BaseTask::new_user_codes);
  91. $this->setUserTaskStatus($tasks, 'new');
  92. return $tasks;
  93. }
  94. /**
  95. * 用户每日任务
  96. */
  97. public function findDateUserTaskList()
  98. {
  99. $tasks = $this->findTaskList(BaseTask::date_codes);
  100. $this->setUserTaskStatus($tasks, 'date');
  101. return $tasks;
  102. }
  103. /**
  104. * 查找任务列表
  105. * @return Collection
  106. */
  107. private function findTaskList(array $codes)
  108. {
  109. return Task::whereIn('code', $codes)->where('is_enabled', 1)->get();
  110. }
  111. /**
  112. * 查找用户单次任务
  113. * @return Collection
  114. */
  115. private function findUserTasks(array $task_ids)
  116. {
  117. return UserTask::whereIn('task_id', $task_ids)->where('uid', $this->uid)->get();
  118. }
  119. /**
  120. * 查找用户每日任务
  121. * @return Collection
  122. */
  123. private function findUserDateTasks(array $task_ids)
  124. {
  125. $model = UserRepeatTask::model($this->uid);
  126. $date = date('Y-m-d');
  127. return $model::whereIn('task_id', $task_ids)
  128. ->where('date', '>=', $date)
  129. ->where('uid', $this->uid)
  130. ->get();
  131. }
  132. /**
  133. * 设置用户任务状态标记
  134. */
  135. private function setUserTaskStatus(Collection $tasks, string $code_type)
  136. {
  137. $task_ids = $tasks->pluck('id')->all();
  138. if ($code_type == 'new') {
  139. $user_tasks = $this->findUserTasks($task_ids);
  140. } else if ($code_type == 'date') {
  141. $user_tasks = $this->findUserDateTasks($task_ids);
  142. } else {
  143. $user_tasks = collect();
  144. }
  145. $tasks->transform(function (Task $task) use ($user_tasks) {
  146. $user_task = $user_tasks->where('task_id', $task->id)->first();
  147. $task->status = $user_task ? $user_task->status : 0;
  148. return $task;
  149. });
  150. }
  151. public function hasPendingTask()
  152. {
  153. }
  154. }