| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | <?phpnamespace App\Modules\UserTask\Services;use App\Jobs\UserTaskJob;use App\Modules\UserTask\Models\Task;use App\Modules\UserTask\Models\UserRepeatTask;use App\Modules\UserTask\Models\UserTask;use Illuminate\Database\Eloquent\Collection;class UserTaskService{    const add_trigger = 'add';    const judge_trigger = 'judge';    private $uid;    /**     * Create a new job instance.     *     * @return void     */    public function __construct(int $uid)    {        $this->uid = $uid;    }    /**     * 触发任务     * @param string $type 任务类型     * @param string $trigger_type 触发类型     */    public function trigger(string $type, string $trigger_type)    {        $model = $this->model($type);        $tasks = Task::where('type', $type)->get();        foreach ($tasks as $task) {            $model->setTask($task);            switch ($trigger_type) {                case self::add_trigger:                    $model->handleAddUserTask();                    break;                case self::judge_trigger:                    $model->handleAddUserTask();                    $model->handleUpToUserTask();                    break;            }        }    }    /**     * 领取任务奖励     * @return int     */    public function getTaskReward(int $task_id)    {        $task = Task::find($task_id);        $model = $this->model($task->type, $task);        return $model->handleUserTaskReward();    }    /**     * 获取任务model     * @return SingleTask|ChargeTask|ReadTask     */    public function model(string $type, Task $task = null)    {        switch ($type) {            case SingleTask::register:            case SingleTask::bind_phone:            case SingleTask::add_desk:                return new SingleTask($this->uid, $task);                break;            case RepeatTask::charge:                return new ChargeTask($this->uid, $task);                break;            case RepeatTask::read:                return new ReadTask($this->uid, $task);                break;        }    }    /**     * 添加用户任务队列     * @param int $uid      * @param string $type 任务类型     * @param string $trigger_type 触发类型     */    public static function addUserTaskQueue(int $uid, string $type, string $trigger_type)    {        $job = new UserTaskJob($uid, $type, $trigger_type);        dispatch($job)->onConnection('rabbitmq')->onQueue('qapp_user_task_queue');    }    /**     * 新手任务     */    public function findNewUserTaskList()    {        $tasks = $this->findTaskList(BaseTask::new_user_codes);        $this->setUserTaskStatus($tasks, 'new');        return $tasks;    }    /**     * 用户每日任务     */    public function findDateUserTaskList()    {        $tasks = $this->findTaskList(BaseTask::date_codes);        $this->setUserTaskStatus($tasks, 'date');        return $tasks;    }    /**     * 查找任务列表     * @return Collection     */    private function findTaskList(array $codes)    {        return Task::whereIn('code', $codes)->where('is_enabled', 1)->get();    }    /**     * 查找用户单次任务     * @return Collection     */    private function findUserTasks(array $task_ids)    {        return UserTask::whereIn('task_id', $task_ids)->where('uid', $this->uid)->get();    }    /**     * 查找用户每日任务     * @return Collection     */    private function findUserDateTasks(array $task_ids)    {        $model = UserRepeatTask::model($this->uid);        $date = date('Y-m-d');        return  $model::whereIn('task_id', $task_ids)            ->where('date', '>=', $date)            ->where('uid', $this->uid)            ->get();    }    /**     * 设置用户任务状态标记     */    private function setUserTaskStatus(Collection $tasks, string $code_type)    {        $task_ids = $tasks->pluck('id')->all();        if ($code_type == 'new') {            $user_tasks = $this->findUserTasks($task_ids);        } else if ($code_type == 'date') {            $user_tasks = $this->findUserDateTasks($task_ids);        } else {            $user_tasks = collect();        }        $tasks->transform(function (Task $task) use ($user_tasks) {            $user_task = $user_tasks->where('task_id', $task->id)->first();            $task->status = $user_task ?  $user_task->status : 0;            return $task;        });    }}
 |