params = $params; } public function handle() { try { $params = $this->params; // 获取已推荐人数 $number = UserModel::query()->where('parent_uid', $params['user_id'])->count(); // 任务 $taskInfo = make(UserTaskRepoistory::class)->findBy('reward_type', 7); // 奖励 $reward = json_decode($taskInfo->reward, true); // 条件 $taskCondition = json_decode($taskInfo->task_condition, true); $endTime = strtotime($taskCondition['end_time']); $dateTime = strtotime(date('Y-m-d')); if ($endTime < $dateTime) { logger('TimeTaskListener:限时任务已过期', []); return true; } // 获取任务日志 $taskLogInfo = make(TaskAwarkLogRepository::class)->findWhere(['reward_way' => TaskAwarkLogModel::REWARD_WAY_TIME_FILL_IN, 'uid' => $params['user_id']], ['subtask_id'])->keyBy('subtask_id'); foreach ($taskCondition['condition'] as $k => $val) { if (!isset($taskLogInfo[$k]) && $val == $number) { $rewardData['reward'] = $reward[$k]; $rewardData['subtask_id'] = $k; $rewardData['user_id'] = $params['user_id']; // 异步发放奖励 logger('TimeTaskListener:准备异步发放奖励', [$params['user_id']]); $this->sendReward($rewardData); logger('TimeTaskListener:限时任务奖励发放成功', [$params['user_id']]); } } } catch (\Exception $exception) { logger('SendSignInRewardsJob', [$exception->getMessage()]); } } /** * 发送奖励 * * @param $reward * @return void */ private function sendReward($reward) { $setData = [ 'uid' => $reward['user_id'], 'is_add_up' => 1, 'date' => date('Y-m-d'), 'reward_way' => TaskAwarkLogModel::REWARD_WAY_TIME_FILL_IN, 'subtask_id' => $reward['subtask_id'] ]; $awarkLogRepo = make(TaskAwarkLogRepository::class); foreach ($reward['reward'] as $k => $v) { if ($v == 0) { continue; } $setData['reward'] = $v; switch ($k) { case 'vipTime': $setData['reward_type'] = TaskAwarkLogModel::REWARD_VIP_TIME; //加会员天数 $userInfo = make(UserRepository::class) ->getUserInfoFromCache($reward['user_id']); if ($userInfo['is_vip'] == 'y') { $vipTime = Carbon::parse($userInfo['vip_expired']) ->addDays($v) ->toDateTimeString(); } else { $vipTime = Carbon::now() ->addDays($v) ->toDateTimeString(); } UserModel::query() ->where('code', $reward['user_id']) ->update(['vip_expired' => $vipTime]); break; case 'house': $setData['reward_type'] = TaskAwarkLogModel::REWARD_TYPE_OPEN_HOUSE_COUNT; UserModel::where('code', $reward['user_id'])->increment('max_open_house', $v); break; case 'movie': $setData['reward_type'] = TaskAwarkLogModel::REWARD_TYPE_MOVIE_CONUT; break; case 'comment': $setData['reward_type'] = TaskAwarkLogModel::REWARD_TYPE_COMMENT_COUNT; break; case 'coin': $setData['reward_type'] = TaskAwarkLogModel::REWARD_TYPE_COIN; break; } //插入日志 $awarkLogRepo->create($setData); make(UserRepository::class)->delUserCache($reward['user_id']); } } }