*/ class StatisticalUserCommand extends Command { /** * The name of command. * * @var string */ protected $signature = 'statistical:user {date?}'; /** * The description of command. * * @var string */ protected $description = '统计汇总数据'; /** * The type of class being generated. * * @var string */ protected $type = 'permission'; /** * Execute the command. * * @return void * @see fire() */ public function handle() { $day = $this->argument('date'); $now = Carbon::now()->toDateString(); if (!$day) { $day = Carbon::yesterday()->toDateString(); } else { $now = Carbon::parse($day)->toDateString(); $day = Carbon::parse($day)->subDay()->toDateString(); } try { //1.汇总天的数据 $this->line("天:{$day}"); $this->day($day); //2.汇周的数据 $firstDay = Carbon::parse($now)->startOfWeek(); if (Carbon::parse($now)->isSameDay($firstDay)) { $sDay = Carbon::parse($day)->startOfWeek()->toDateString(); $eDay = Carbon::parse($day)->endOfWeek()->toDateString(); $this->line("周:{$sDay}--{$eDay}"); $this->zhouqitongji($sDay, $eDay, DayTypeEnum::week, Carbon::parse($sDay)->subDays(7)->toDateString()); } //3.汇月的数据 $firstDay = Carbon::parse($now)->startOfMonth(); if (Carbon::parse($now)->isSameDay($firstDay)) { $sDay = Carbon::parse($day)->startOfMonth()->toDateString(); $eDay = Carbon::parse($day)->endOfMonth()->toDateString(); $this->line("月:{$sDay}--{$eDay}"); $this->zhouqitongji($sDay, $eDay, DayTypeEnum::month, Carbon::parse($sDay)->subMonth()->toDateString()); } //4.汇季度的数据 $firstDay = Carbon::parse($now)->startOfQuarter(); if (Carbon::parse($now)->isSameDay($firstDay)) { $sDay = Carbon::parse($day)->startOfQuarter()->toDateString(); $eDay = Carbon::parse($day)->endOfQuarter()->toDateString(); $this->line("季:{$sDay}--{$eDay}"); $this->zhouqitongji($sDay, $eDay, DayTypeEnum::quarter, Carbon::parse($sDay)->subQuarter()->toDateString()); } //5.汇年的数据 $firstDay = Carbon::parse($now)->startOfYear(); if (Carbon::parse($now)->isSameDay($firstDay)) { $sDay = Carbon::parse($day)->startOfYear()->toDateString(); $eDay = Carbon::parse($day)->endOfYear()->toDateString(); $this->line("年:{$sDay}--{$eDay}"); $this->zhouqitongji($sDay, $eDay, DayTypeEnum::year, Carbon::parse($sDay)->subYear()->toDateString()); } } catch (\Exception $exception) { log_record('每天汇总异常', compact('day', 'now')); Log::error($exception); } } /** * 周统计 * @param $sDay * @param $eDay * @return true */ public function zhouqitongji($sDay, $eDay, $day_type, $perv_date) { $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user'); User::query()->where('xuefen', '>', 0)->chunkById(100, function ($users) use ($sDay, $eDay, $day_type, $perv_date, $isOpenGroup) { foreach ($users as $user) { $user_id = $user['id']; $group_id = $user['group_id']; $day_group_id = 0; if ($isOpenGroup) $day_group_id = $group_id; $ranking = Ranking::query()->where([ 'day_type' => DayTypeEnum::day, 'day' => $eDay, 'user_id' => $user_id ])->first(); if (!$ranking) { $xuefen = 0; $last_update_time = Carbon::now(); $jifen = 0; $paiming = 0; continue; } else { $xuefen = $ranking->xuefen; $last_update_time = $ranking->last_update_time; $jifen = $ranking->jifen; $paiming = $ranking->paiming; } $yesterday_mingci = Ranking::query()->where('day_type', $day_type)->whereDate('day', $perv_date)->value('paiming') ?? 0; $is_inc_paiming = 0; if ($yesterday_mingci < $paiming) { $is_inc_paiming = -1; } elseif ($yesterday_mingci > $paiming) { $is_inc_paiming = 1; } if (!$yesterday_mingci) { $is_inc_paiming = 1; } $day_xuefen = Ranking::query()->where('user_id', $user_id)->whereDate('day', '<=', $eDay)->whereDate('day', '>=', $sDay)->where('status', ModelStatusEnum::OK)->sum('day_xuefen'); $day_jifen = Ranking::query()->where('user_id', $user_id)->whereDate('day', '<=', $eDay)->whereDate('day', '>=', $sDay)->where('status', ModelStatusEnum::OK)->sum('day_jifen'); Ranking::query()->updateOrCreate([ 'day_type' => $day_type, 'day' => $sDay, 'user_id' => $user_id, ], [ 'group_id' => $group_id, 'day_group_id' => $day_group_id, 'status' => ModelStatusEnum::OK, 'day_xuefen' => $day_xuefen, 'day_jifen' => $day_jifen, 'xuefen' => $xuefen, 'jifen' => $jifen, 'paiming' => $paiming, 'is_inc_paiming' => $is_inc_paiming, 'last_update_time' => $last_update_time, 'is_xueba' => 0, ]); } }); //学霸 if ($isOpenGroup) { foreach (User::GroupMaps as $map) { $ranking = Ranking::query()->where([ 'day_type' => $day_type, 'day' => $sDay, 'status' => ModelStatusEnum::OK, 'group_id' => $map['id'], ])->orderByDesc('xuefen')->first(); if ($ranking) { $ranking->is_xueba = 1; $ranking->save(); } } } else { $ranking = Ranking::query()->where([ 'day_type' => $day_type, 'day' => $sDay, 'status' => ModelStatusEnum::OK, ])->orderByDesc('xuefen')->first(); if ($ranking) { $ranking->is_xueba = 1; $ranking->save(); } } return true; } /** * 统计天的数据 * @param $day * @return true */ public function day($day) { $isOpenGroup = (bool)Setting::byCodeGetSetting('h5_paihangbang_is_group_user'); User::query()->where('xuefen', '>', 0)->chunkById(1000, function ($users) use ($day, $isOpenGroup) { foreach ($users as $user) { $user_id = $user['id']; $group_id = $user['group_id']; $day_group_id = 0; if ($isOpenGroup) $day_group_id = $group_id; $lastXuefen = UserXuefen::query()->where('user_id', $user_id)->whereDate('day', '<=', $day)->where('status', ModelStatusEnum::OK)->orderByDesc('id')->select(['user_xuefen', 'created_at'])->first(); if (!$lastXuefen) { continue; } $xuefen = $lastXuefen->user_xuefen; $last_update_time = $lastXuefen->created_at; $jifen = UserJifen::query()->where('user_id', $user_id)->whereDate('day', '<=', $day)->where('status', ModelStatusEnum::OK)->orderByDesc('id')->value('user_jifen') ?? 0; $paiming = 0; $is_inc_paiming = 0; if ((int)$user->xuefen === (int)$xuefen) { $paiming = $user->mingci; if ($user->yesterday_mingci < $paiming) { $is_inc_paiming = -1; } elseif ($user->yesterday_mingci > $paiming) { $is_inc_paiming = 1; } if (!$user->yesterday_mingci) { $is_inc_paiming = 1; } $user->yesterday_mingci = $paiming; $user->save(); } $day_xuefen = UserXuefen::query()->where('user_id', $user_id)->whereDate('day', $day)->where('status', ModelStatusEnum::OK)->sum('xuefen'); $day_jifen = UserJifen::query()->where('user_id', $user_id)->whereDate('day', $day)->where('status', ModelStatusEnum::OK)->sum('jifen'); Ranking::query()->updateOrCreate([ 'day_type' => DayTypeEnum::day, 'day' => $day, 'user_id' => $user_id, ], [ 'group_id' => $group_id, 'day_group_id' => $day_group_id, 'status' => ModelStatusEnum::OK, 'day_xuefen' => $day_xuefen, 'day_jifen' => $day_jifen, 'xuefen' => $xuefen, 'jifen' => $jifen, 'paiming' => $paiming, 'is_inc_paiming' => $is_inc_paiming, 'last_update_time' => $last_update_time, 'is_xueba' => 0, ]); } }); //补充排名 Ranking::query()->where([ 'day_type' => DayTypeEnum::day, 'day' => $day, 'status' => ModelStatusEnum::OK, 'paiming' => 0 ])->chunkById(1000, function ($ranks) use ($day, $isOpenGroup) { foreach ($ranks as $ranking) { $meXuefen = $ranking->xuefen; $last_update_time = $ranking->last_update_time; $day_group_id = $ranking->day_group_id; $paiming = Ranking::query()->where([ 'day_type' => DayTypeEnum::day, 'day' => $day, 'status' => ModelStatusEnum::OK, ])->when($isOpenGroup, function ($query) use ($day_group_id) { return $query->where('group_id', $day_group_id); })->where(function ($query) use ($meXuefen, $last_update_time) { return $query->orWhere('xuefen', '>', $meXuefen)->orWhere(function ($q) use ($last_update_time, $meXuefen) { return $q->where('xuefen', '=', $meXuefen)->where('last_update_time', '<', $last_update_time); }); })->where('status', ModelStatusEnum::OK)->count(); $paiming += 1; $ranking->paiming = $paiming; $user = User::query()->where('id', $ranking->user_id)->select(['id', 'xuefen', 'jifen', 'last_update_time', 'yesterday_mingci'])->first(); $is_inc_paiming = 0; if ($user->yesterday_mingci < $paiming) { $is_inc_paiming = -1; } elseif ($user->yesterday_mingci > $paiming) { $is_inc_paiming = 1; } if (!$user->yesterday_mingci) { $is_inc_paiming = 1; } $ranking->is_inc_paiming = $is_inc_paiming; $user->yesterday_mingci = $paiming; $user->save(); $ranking->save(); } }); //学霸 if ($isOpenGroup) { foreach (User::GroupMaps as $map) { $ranking = Ranking::query()->where([ 'day_type' => DayTypeEnum::day, 'day' => $day, 'status' => ModelStatusEnum::OK, 'group_id' => $map['id'], ])->orderByDesc('xuefen')->first(); if ($ranking) { $ranking->is_xueba = 1; $ranking->save(); } } } else { $ranking = Ranking::query()->where([ 'day_type' => DayTypeEnum::day, 'day' => $day, 'status' => ModelStatusEnum::OK, ])->orderByDesc('xuefen')->first(); if ($ranking) { $ranking->is_xueba = 1; $ranking->save(); } } return true; } }