repository = $repository; } /** * @param Request $request * * @return mixed * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function handleList(Request $request) { $this->repository->pushCriteria(new RankingCriteria($request)); $this->repository->setPresenter(RankingPresenter::class); return $this->repository->searchListsPage(); } /** * @param $id * * @return \Illuminate\Database\Eloquent\Model */ public function handleProfile($id) { $this->repository->setPresenter(RankingPresenter::class); return $this->repository->searchBy($id); } /** * @param array $data * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleStore($data) { $ranking = $this->repository->create($data); return $ranking; } /** * @param array $data * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleUpdate($data) { $ranking = $this->repository->update($data, $data['id']); return $ranking; } /** * @param Request $request * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleDelete($id) { return $this->repository->delete($id); } /** * 选项 * @param Request $request * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Support\Collection|mixed * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function handleSelectOptions(Request $request) { $this->repository->pushCriteria(new RankingCriteria($request)); return $this->repository->all(['id', 'name']); } /** * 批量删除 * @param $ids * @return mixed */ public function handleBatchDelete($ids) { return $this->repository->whereIn('id', $ids)->delete(); } /** * @param Request $request * * @return mixed * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function handleAll(Request $request) { $this->repository->pushCriteria(new RankingCriteria($request)); $this->repository->setPresenter(RankingPresenter::class); return $this->repository->get(); } /** * @param Request $request * * @return mixed * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function handleIds(Request $request) { $this->repository->pushCriteria(new RankingCriteria($request)); return $this->repository->pluck('id'); } /** * 排行榜 * @param $user * @return array */ public function handleRanking($user) { $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user'); $user = User::query()->where('id', $user->id)->select(['id', 'nickname', 'headimg', 'xuefen', 'last_update_time', 'group_id', 'yesterday_mingci'])->first(); $ranking = $user->mingci; $per_page = request('per_page', 15); $page = request('page', 1); $users = User::query()->when($isOpenGroup, function ($query) use ($user) { return $query->where('group_id', $user->group_id); })->where('status', ModelStatusEnum::OK)->where('xuefen', '>', 0)->select(['id', 'nickname', 'headimg', 'xuefen', 'last_update_time', 'group_id'])->orderByDesc('xuefen')->orderBy('last_update_time')->paginate($per_page); $rankings = []; foreach ($users as $k => $us) { $rankings[] = [ 'id' => $us['id'], 'ranking' => $k + 1 + ($page - 1) * $per_page, 'nickname' => $us['nickname'], 'headimg' => $us->headimg, 'xuefen' => $us->xuefen, ]; } return [ 'me' => [ 'id' => $user['id'], 'ranking' => $ranking, 'nickname' => $user['nickname'], 'headimg' => $user->headimg, 'xuefen' => $user->xuefen, 'yesterday_mingci' => $user->yesterday_mingci, ], 'users' => $rankings ]; } /** * 排名是否上升 * @param $user * @return boolean */ public function handleIsUpRanking($user_id) { $day = date('Ymd'); $key = "service:ranking:handleIsUpRanking:{$day}:{$user_id}"; if (Cache::get($key, 0)) { return false; } $user = User::query()->where('id', $user_id)->select(['id', 'xuefen', 'last_update_time', 'yesterday_mingci', 'group_id'])->first(); $ranking = $user->mingci; $yesterday_mingci = $user->yesterday_mingci; if (!$yesterday_mingci) return false; $status = ($ranking < $yesterday_mingci); if ($status) { Cache::put($key, 1, Carbon::now()->addDay()); if (Chengjiu::query()->where('user_id', $user_id)->where('day', $day)->where('type', 1)->exists()) { return false; } //生成成就 $chengjiu = Chengjiu::query()->create([ 'user_id' => $user['id'], 'day' => $day, 'type' => 1, 'name' => '排名上升', 'data' => [ 'mingci' => $ranking, 'yesterday_mingci' => $yesterday_mingci, ], 'status' => ModelStatusEnum::PAUSE ]); dispatch(new MakeUserChengJiuJob($chengjiu['id'])); } return $status; } /** * 当天的学分是否超过昨天的学分 * @param $user_id * @return bool */ public function handleIsUpDayXuefen($user_id) { $day = date('Ymd'); $key = "service:ranking:handleIsUpDayXuefen:{$day}:{$user_id}"; if (Cache::get($key, 0)) { return false; } $user = login_user(); if (!$user['yesterday_mingci']) return false; $xuefen = UserXuefen::query()->where('user_id', $user_id)->where('day', '=', $day)->where('status', ModelStatusEnum::OK)->sum('xuefen') ?? 0; $yesterday_xuefen = Ranking::query()->where('day_type', DayTypeEnum::day)->where('day', Carbon::yesterday()->toDateString())->where('user_id', $user_id)->value('day_xuefen') ?? 0; $status = ($xuefen > $yesterday_xuefen); if (!$status) { return false; } Cache::put($key, 1, Carbon::now()->addDay()); $tip = Setting::byCodeGetSetting('h5_base_user_xuefen_up_tip'); return $tip; } /** * 获取历史排行榜 * @param $user * @param $day * @param $day_type * @return array */ public function handleWeekRanking($user, $day, $day_type) { $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user'); $per_page = request('per_page', 15); $page = request('page', 1); // Cache::forget("service:ranking:handleWeekRanking:1:{$day}:{$day_type}:{$user['id']}:{$isOpenGroup}"); // Cache::forget("service:ranking:handleWeekRanking:2:{$day}:{$day_type}:{$per_page}:{$page}:{$isOpenGroup}"); list($userRank, $ranking) = Cache::remember("service:ranking:handleWeekRanking:1:{$day}:{$day_type}:{$user['id']}:{$isOpenGroup}", Carbon::now()->addDay(), function () use ($day_type, $day, $user, $isOpenGroup) { $userRank = Ranking::query()->where([ 'day' => $day, 'day_type' => $day_type, ])->where('user_id', $user->id)->select(['id', 'user_id', 'xuefen', 'last_update_time', 'day_group_id'])->first(); $ranking = 0; if ($userRank && $userRank->xuefen) { $ranking = Ranking::query()->where([ 'day' => $day, 'day_type' => $day_type, ])->where('day_group_id', $userRank->day_group_id)->where('xuefen', '>', $userRank->xuefen)->where('status', ModelStatusEnum::OK)->count(); $ranking += Ranking::query()->where([ 'day' => $day, 'day_type' => $day_type, ])->where('day_group_id', $userRank->day_group_id)->where('xuefen', '=', $userRank->xuefen)->where('last_update_time', '<', $userRank->last_update_time)->where('status', ModelStatusEnum::OK)->count(); $ranking += 1; } return [$userRank, $ranking]; }); $rankings = Cache::remember("service:ranking:handleWeekRanking:2:{$day}:{$day_type}:{$per_page}:{$page}:{$isOpenGroup}", Carbon::now()->addDay(), function () use ($day_type, $day, $per_page, $page, $isOpenGroup, $userRank) { $users = Ranking::query() ->where([ 'day' => $day, 'day_type' => $day_type, ]) ->where('status', ModelStatusEnum::OK) ->when($userRank, function ($query) use ($userRank) { return $query->where('day_group_id', $userRank->day_group_id); }) ->where('xuefen', '>', 0) ->select(['user_id', 'xuefen', 'last_update_time']) ->orderByDesc('xuefen') ->orderBy('last_update_time') ->with(['user']) ->paginate($per_page); $rankings = []; foreach ($users as $k => $us) { $u = $us['user']; $rankings[] = [ 'id' => $u['id'], 'ranking' => $k + 1 + ($page - 1) * $per_page, 'nickname' => $u['nickname'], 'headimg' => $u['headimg'], 'xuefen' => $us->xuefen, ]; } return $rankings; }); return [ 'me' => [ 'id' => $user['id'], 'ranking' => $ranking, 'nickname' => $user['nickname'], 'headimg' => $user['headimg'], 'xuefen' => $userRank ? $userRank['xuefen'] : 0, ], 'users' => $rankings ]; } /** * 是否未读 * @param $id * @return bool */ public function handleIsNoRead($id, $user_id = 0) { $key = "service:ranking:handleIsNoRead:{$id}:{$user_id}"; if (Cache::has($key)) { return false; } if (!$user_id) $user_id = login_user_id(); $ranking = UserXuefen::query()->where('user_id', $user_id)->where('id', $id)->select(['id', 'is_read', 'xuefen'])->first(); Cache::put($key, 1, Carbon::now()->addHours(8)); if (!$ranking) { return false; } if ($ranking->is_read) return false; $ranking->is_read = 1; $ranking->save(); return $ranking->xuefen; } public function handleNewIsRead($user_id = 0) { $key = "service:ranking:handleNewIsRead:{$user_id}"; if (!$user_id) $user_id = login_user_id(); $ranking = UserXuefen::query()->where('user_id', $user_id)->orderByDesc('id')->select(['id', 'is_read', 'xuefen'])->first(); if (!$ranking) return false; if ($ranking->is_read) return false; if (!Cache::has($key)) { Cache::put($key, $ranking->id); return $ranking->xuefen; } $id = Cache::get($key,); if ((int)$id !== (int)$ranking->id) { Cache::put($key, $ranking->id); return $ranking->xuefen; } return false; } /** * 是否超时没有卖货 * @param $user_id * @return array|false[] */ public function handleTimeOutNoOrder($user_id) { $day = date('Ymd'); $key = "service:ranking:handleTimeOutNoOrder:{$day}:{$user_id}"; if (Cache::get($key, 0)) { return ['status' => false]; } $isOrder = Order::query()->where('user_id', $user_id)->where('status', ModelStatusEnum::OK)->exists(); if (!$isOrder) return ['status' => false]; $time_out_settings = Setting::byCodesGetSettings([ 'h5_base_user_no_order_tip', 'h5_base_user_no_order_hour', ]); $isOut = Order::query() ->where('user_id', $user_id) ->where('order_time', '>=', Carbon::now()->addDays(-$time_out_settings['h5_base_user_no_order_hour'])->toDateTimeString()) ->where('status', ModelStatusEnum::OK) ->exists(); if ($isOut) { return ['status' => false]; } Cache::put($key, 1, Carbon::now()->addDay()); return ['status' => true, 'tip' => $time_out_settings['h5_base_user_no_order_tip']]; } }