123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?php
- namespace App\Console\Commands\Dwbs;
- use App\Repositories\Enums\Dwbs\DayTypeEnum;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Models\Base\Setting;
- use App\Repositories\Models\Base\User;
- use App\Repositories\Models\Dwbs\Ranking;
- use App\Repositories\Models\Dwbs\UserJifen;
- use App\Repositories\Models\Dwbs\UserXuefen;
- use Carbon\Carbon;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Log;
- /**
- * 统计用户数据
- * @package Prettus\Repository\Generators\Commands
- * @author Anderson Andrade <contato@andersonandra.de>
- */
- 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;
- }
- }
|