123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- <?php
- namespace App\Services\Dwbs;
- use App\Jobs\Dwbs\MakeUserChengJiuJob;
- use App\Repositories\Criteria\Dwbs\RankingCriteria;
- use App\Repositories\Eloquent\Dwbs\RankingRepositoryEloquent;
- use App\Repositories\Enums\Dwbs\DayTypeEnum;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Models\Base\Setting;
- use App\Repositories\Models\Base\User;
- use App\Repositories\Models\Dwbs\Chengjiu;
- use App\Repositories\Models\Dwbs\Order;
- use App\Repositories\Models\Dwbs\Ranking;
- use App\Repositories\Models\Dwbs\UserXuefen;
- use App\Repositories\Presenters\Dwbs\RankingPresenter;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Cache;
- class RankingService
- {
- /**
- * @var RankingRepositoryEloquent
- */
- private $repository;
- /**
- * RankingService constructor.
- *
- * @param RankingRepositoryEloquent $rankingRepositoryEloquent
- */
- public function __construct(RankingRepositoryEloquent $repository)
- {
- $this->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']];
- }
- }
|