RankingService.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <?php
  2. namespace App\Services\Dwbs;
  3. use App\Jobs\Dwbs\MakeUserChengJiuJob;
  4. use App\Repositories\Criteria\Dwbs\RankingCriteria;
  5. use App\Repositories\Eloquent\Dwbs\RankingRepositoryEloquent;
  6. use App\Repositories\Enums\Dwbs\DayTypeEnum;
  7. use App\Repositories\Enums\ModelStatusEnum;
  8. use App\Repositories\Enums\ResponseCodeEnum;
  9. use App\Repositories\Models\Base\Setting;
  10. use App\Repositories\Models\Base\User;
  11. use App\Repositories\Models\Dwbs\Chengjiu;
  12. use App\Repositories\Models\Dwbs\Order;
  13. use App\Repositories\Models\Dwbs\Ranking;
  14. use App\Repositories\Models\Dwbs\UserXuefen;
  15. use App\Repositories\Presenters\Dwbs\RankingPresenter;
  16. use Carbon\Carbon;
  17. use Illuminate\Http\Request;
  18. use Illuminate\Support\Facades\Cache;
  19. class RankingService
  20. {
  21. /**
  22. * @var RankingRepositoryEloquent
  23. */
  24. private $repository;
  25. /**
  26. * RankingService constructor.
  27. *
  28. * @param RankingRepositoryEloquent $rankingRepositoryEloquent
  29. */
  30. public function __construct(RankingRepositoryEloquent $repository)
  31. {
  32. $this->repository = $repository;
  33. }
  34. /**
  35. * @param Request $request
  36. *
  37. * @return mixed
  38. * @throws \Prettus\Repository\Exceptions\RepositoryException
  39. */
  40. public function handleList(Request $request)
  41. {
  42. $this->repository->pushCriteria(new RankingCriteria($request));
  43. $this->repository->setPresenter(RankingPresenter::class);
  44. return $this->repository->searchListsPage();
  45. }
  46. /**
  47. * @param $id
  48. *
  49. * @return \Illuminate\Database\Eloquent\Model
  50. */
  51. public function handleProfile($id)
  52. {
  53. $this->repository->setPresenter(RankingPresenter::class);
  54. return $this->repository->searchBy($id);
  55. }
  56. /**
  57. * @param array $data
  58. *
  59. * @return mixed
  60. * @throws \Prettus\Validator\Exceptions\ValidatorException
  61. */
  62. public function handleStore($data)
  63. {
  64. $ranking = $this->repository->create($data);
  65. return $ranking;
  66. }
  67. /**
  68. * @param array $data
  69. *
  70. * @return mixed
  71. * @throws \Prettus\Validator\Exceptions\ValidatorException
  72. */
  73. public function handleUpdate($data)
  74. {
  75. $ranking = $this->repository->update($data, $data['id']);
  76. return $ranking;
  77. }
  78. /**
  79. * @param Request $request
  80. *
  81. * @return mixed
  82. * @throws \Prettus\Validator\Exceptions\ValidatorException
  83. */
  84. public function handleDelete($id)
  85. {
  86. return $this->repository->delete($id);
  87. }
  88. /**
  89. * 选项
  90. * @param Request $request
  91. * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Support\Collection|mixed
  92. * @throws \Prettus\Repository\Exceptions\RepositoryException
  93. */
  94. public function handleSelectOptions(Request $request)
  95. {
  96. $this->repository->pushCriteria(new RankingCriteria($request));
  97. return $this->repository->all(['id', 'name']);
  98. }
  99. /**
  100. * 批量删除
  101. * @param $ids
  102. * @return mixed
  103. */
  104. public function handleBatchDelete($ids)
  105. {
  106. return $this->repository->whereIn('id', $ids)->delete();
  107. }
  108. /**
  109. * @param Request $request
  110. *
  111. * @return mixed
  112. * @throws \Prettus\Repository\Exceptions\RepositoryException
  113. */
  114. public function handleAll(Request $request)
  115. {
  116. $this->repository->pushCriteria(new RankingCriteria($request));
  117. $this->repository->setPresenter(RankingPresenter::class);
  118. return $this->repository->get();
  119. }
  120. /**
  121. * @param Request $request
  122. *
  123. * @return mixed
  124. * @throws \Prettus\Repository\Exceptions\RepositoryException
  125. */
  126. public function handleIds(Request $request)
  127. {
  128. $this->repository->pushCriteria(new RankingCriteria($request));
  129. return $this->repository->pluck('id');
  130. }
  131. /**
  132. * 排行榜
  133. * @param $user
  134. * @return array
  135. */
  136. public function handleRanking($user)
  137. {
  138. $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user');
  139. $user = User::query()->where('id', $user->id)->select(['id', 'nickname', 'headimg', 'xuefen', 'last_update_time', 'group_id', 'yesterday_mingci'])->first();
  140. $ranking = $user->mingci;
  141. $per_page = request('per_page', 15);
  142. $page = request('page', 1);
  143. $users = User::query()->when($isOpenGroup, function ($query) use ($user) {
  144. return $query->where('group_id', $user->group_id);
  145. })->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);
  146. $rankings = [];
  147. foreach ($users as $k => $us) {
  148. $rankings[] = [
  149. 'id' => $us['id'],
  150. 'ranking' => $k + 1 + ($page - 1) * $per_page,
  151. 'nickname' => $us['nickname'],
  152. 'headimg' => $us->headimg,
  153. 'xuefen' => $us->xuefen,
  154. ];
  155. }
  156. return [
  157. 'me' => [
  158. 'id' => $user['id'],
  159. 'ranking' => $ranking,
  160. 'nickname' => $user['nickname'],
  161. 'headimg' => $user->headimg,
  162. 'xuefen' => $user->xuefen,
  163. 'yesterday_mingci' => $user->yesterday_mingci,
  164. ],
  165. 'users' => $rankings
  166. ];
  167. }
  168. /**
  169. * 排名是否上升
  170. * @param $user
  171. * @return boolean
  172. */
  173. public function handleIsUpRanking($user_id)
  174. {
  175. $day = date('Ymd');
  176. $key = "service:ranking:handleIsUpRanking:{$day}:{$user_id}";
  177. if (Cache::get($key, 0)) {
  178. return false;
  179. }
  180. $user = User::query()->where('id', $user_id)->select(['id', 'xuefen', 'last_update_time', 'yesterday_mingci', 'group_id'])->first();
  181. $ranking = $user->mingci;
  182. $yesterday_mingci = $user->yesterday_mingci;
  183. if (!$yesterday_mingci) return false;
  184. $status = ($ranking < $yesterday_mingci);
  185. if ($status) {
  186. Cache::put($key, 1, Carbon::now()->addDay());
  187. if (Chengjiu::query()->where('user_id', $user_id)->where('day', $day)->where('type', 1)->exists()) {
  188. return false;
  189. }
  190. //生成成就
  191. $chengjiu = Chengjiu::query()->create([
  192. 'user_id' => $user['id'],
  193. 'day' => $day,
  194. 'type' => 1,
  195. 'name' => '排名上升',
  196. 'data' => [
  197. 'mingci' => $ranking,
  198. 'yesterday_mingci' => $yesterday_mingci,
  199. ],
  200. 'status' => ModelStatusEnum::PAUSE
  201. ]);
  202. dispatch(new MakeUserChengJiuJob($chengjiu['id']));
  203. }
  204. return $status;
  205. }
  206. /**
  207. * 当天的学分是否超过昨天的学分
  208. * @param $user_id
  209. * @return bool
  210. */
  211. public function handleIsUpDayXuefen($user_id)
  212. {
  213. $day = date('Ymd');
  214. $key = "service:ranking:handleIsUpDayXuefen:{$day}:{$user_id}";
  215. if (Cache::get($key, 0)) {
  216. return false;
  217. }
  218. $user = login_user();
  219. if (!$user['yesterday_mingci']) return false;
  220. $xuefen = UserXuefen::query()->where('user_id', $user_id)->where('day', '=', $day)->where('status', ModelStatusEnum::OK)->sum('xuefen') ?? 0;
  221. $yesterday_xuefen = Ranking::query()->where('day_type', DayTypeEnum::day)->where('day', Carbon::yesterday()->toDateString())->where('user_id', $user_id)->value('day_xuefen') ?? 0;
  222. $status = ($xuefen > $yesterday_xuefen);
  223. if (!$status) {
  224. return false;
  225. }
  226. Cache::put($key, 1, Carbon::now()->addDay());
  227. $tip = Setting::byCodeGetSetting('h5_base_user_xuefen_up_tip');
  228. return $tip;
  229. }
  230. /**
  231. * 获取历史排行榜
  232. * @param $user
  233. * @param $day
  234. * @param $day_type
  235. * @return array
  236. */
  237. public function handleWeekRanking($user, $day, $day_type)
  238. {
  239. $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user');
  240. $per_page = request('per_page', 15);
  241. $page = request('page', 1);
  242. // Cache::forget("service:ranking:handleWeekRanking:1:{$day}:{$day_type}:{$user['id']}:{$isOpenGroup}");
  243. // Cache::forget("service:ranking:handleWeekRanking:2:{$day}:{$day_type}:{$per_page}:{$page}:{$isOpenGroup}");
  244. 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) {
  245. $userRank = Ranking::query()->where([
  246. 'day' => $day,
  247. 'day_type' => $day_type,
  248. ])->where('user_id', $user->id)->select(['id', 'user_id', 'xuefen', 'last_update_time', 'day_group_id'])->first();
  249. $ranking = 0;
  250. if ($userRank && $userRank->xuefen) {
  251. $ranking = Ranking::query()->where([
  252. 'day' => $day,
  253. 'day_type' => $day_type,
  254. ])->where('day_group_id', $userRank->day_group_id)->where('xuefen', '>', $userRank->xuefen)->where('status', ModelStatusEnum::OK)->count();
  255. $ranking += Ranking::query()->where([
  256. 'day' => $day,
  257. 'day_type' => $day_type,
  258. ])->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();
  259. $ranking += 1;
  260. }
  261. return [$userRank, $ranking];
  262. });
  263. $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) {
  264. $users = Ranking::query()
  265. ->where([
  266. 'day' => $day,
  267. 'day_type' => $day_type,
  268. ])
  269. ->where('status', ModelStatusEnum::OK)
  270. ->when($userRank, function ($query) use ($userRank) {
  271. return $query->where('day_group_id', $userRank->day_group_id);
  272. })
  273. ->where('xuefen', '>', 0)
  274. ->select(['user_id', 'xuefen', 'last_update_time'])
  275. ->orderByDesc('xuefen')
  276. ->orderBy('last_update_time')
  277. ->with(['user'])
  278. ->paginate($per_page);
  279. $rankings = [];
  280. foreach ($users as $k => $us) {
  281. $u = $us['user'];
  282. $rankings[] = [
  283. 'id' => $u['id'],
  284. 'ranking' => $k + 1 + ($page - 1) * $per_page,
  285. 'nickname' => $u['nickname'],
  286. 'headimg' => $u['headimg'],
  287. 'xuefen' => $us->xuefen,
  288. ];
  289. }
  290. return $rankings;
  291. });
  292. return [
  293. 'me' => [
  294. 'id' => $user['id'],
  295. 'ranking' => $ranking,
  296. 'nickname' => $user['nickname'],
  297. 'headimg' => $user['headimg'],
  298. 'xuefen' => $userRank ? $userRank['xuefen'] : 0,
  299. ],
  300. 'users' => $rankings
  301. ];
  302. }
  303. /**
  304. * 是否未读
  305. * @param $id
  306. * @return bool
  307. */
  308. public function handleIsNoRead($id, $user_id = 0)
  309. {
  310. $key = "service:ranking:handleIsNoRead:{$id}:{$user_id}";
  311. if (Cache::has($key)) {
  312. return false;
  313. }
  314. if (!$user_id) $user_id = login_user_id();
  315. $ranking = UserXuefen::query()->where('user_id', $user_id)->where('id', $id)->select(['id', 'is_read', 'xuefen'])->first();
  316. Cache::put($key, 1, Carbon::now()->addHours(8));
  317. if (!$ranking) {
  318. return false;
  319. }
  320. if ($ranking->is_read) return false;
  321. $ranking->is_read = 1;
  322. $ranking->save();
  323. return $ranking->xuefen;
  324. }
  325. public function handleNewIsRead($user_id = 0)
  326. {
  327. $key = "service:ranking:handleNewIsRead:{$user_id}";
  328. if (!$user_id) $user_id = login_user_id();
  329. $ranking = UserXuefen::query()->where('user_id', $user_id)->orderByDesc('id')->select(['id', 'is_read', 'xuefen'])->first();
  330. if (!$ranking) return false;
  331. if ($ranking->is_read) return false;
  332. if (!Cache::has($key)) {
  333. Cache::put($key, $ranking->id);
  334. return $ranking->xuefen;
  335. }
  336. $id = Cache::get($key,);
  337. if ((int)$id !== (int)$ranking->id) {
  338. Cache::put($key, $ranking->id);
  339. return $ranking->xuefen;
  340. }
  341. return false;
  342. }
  343. /**
  344. * 是否超时没有卖货
  345. * @param $user_id
  346. * @return array|false[]
  347. */
  348. public function handleTimeOutNoOrder($user_id)
  349. {
  350. $day = date('Ymd');
  351. $key = "service:ranking:handleTimeOutNoOrder:{$day}:{$user_id}";
  352. if (Cache::get($key, 0)) {
  353. return ['status' => false];
  354. }
  355. $isOrder = Order::query()->where('user_id', $user_id)->where('status', ModelStatusEnum::OK)->exists();
  356. if (!$isOrder) return ['status' => false];
  357. $time_out_settings = Setting::byCodesGetSettings([
  358. 'h5_base_user_no_order_tip',
  359. 'h5_base_user_no_order_hour',
  360. ]);
  361. $isOut = Order::query()
  362. ->where('user_id', $user_id)
  363. ->where('order_time', '>=', Carbon::now()->addDays(-$time_out_settings['h5_base_user_no_order_hour'])->toDateTimeString())
  364. ->where('status', ModelStatusEnum::OK)
  365. ->exists();
  366. if ($isOut) {
  367. return ['status' => false];
  368. }
  369. Cache::put($key, 1, Carbon::now()->addDay());
  370. return ['status' => true, 'tip' => $time_out_settings['h5_base_user_no_order_tip']];
  371. }
  372. }