123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <?php
- namespace App\Console\Commands\Trade;
- use App\Modules\Trade\Models\NewUserChargeStatistic;
- use App\Modules\Trade\Models\Order;
- use App\Modules\User\Models\User;
- use Illuminate\Console\Command;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\Log;
- use stdClass;
- class NewUserStatistic extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'new_user_charge_statistic {--begin_date=} {--end_date=} {--date=}';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '新注册用户充值统计';
- /**
- * Create a new command instance.
- *
- * @return void
- */
- public function __construct()
- {
- parent::__construct();
- }
- /**
- * Execute the console command.
- *
- * @return mixed
- */
- public function handle()
- {
- print_r("======新注册用户充值统计 【任务执行开始】=====" . date("y-m-d H:i:s" . "\n"));
- Log::info("======新注册用户充值统计 【任务执行开始】=====" . date("y-m-d H:i:s" . "\n"));
- ini_set('memory_limit', '256M');
- $begin_date = $this->option('begin_date');
- $end_date = $this->option('end_date');
- if ($begin_date) {
- $date = $begin_date;
- while (strtotime($date) < strtotime($end_date)) {
- Log::info("======新注册用户充值统计 【任务执行中】===== 日期:" . $date . ' ' . date("y-m-d H:i:s" . "\n"));
- print_r("======新注册用户充值统计 【任务执行中】===== 日期:" . $date . ' ' . date("y-m-d H:i:s" . "\n"));
- $this->statistic($date);
- $date = date('Y-m-d', strtotime('+1 days', strtotime($date)));
- }
- } else {
- $date = $this->option('date');
- $date = $date ? $date : date('Y-m-d', strtotime('-1 days'));
- $this->statistic($date);
- }
- print_r("======新注册用户充值统计 【任务执行结束】=====" . date("y-m-d H:i:s" . "\n"));
- Log::info("======新注册用户充值统计 【任务执行结束】=====" . date("y-m-d H:i:s" . "\n"));
- }
- /**
- * 新用户数据统计
- * @param string $date 统计日期
- */
- public function statistic(string $date)
- {
- $statistic_info = $this->runSql($date);
- $collections = collect($statistic_info);
- $diff_days = [0, 1, 2, 3, 4, 5, 6];
- $days_items = $collections->whereIn('diff_day', $diff_days)->all();
- foreach ($days_items as $item) {
- $this->saveStatistic($item, $item->register_date, $item->diff_day);
- }
- $acc_days = [7, 14, 29];
- foreach ($acc_days as $day) {
- $this->saveStatisticAccumulate($collections, $day);
- }
- }
- public function runSql(string $date)
- {
- $end_date = date('Y-m-d', strtotime('+1 days', strtotime($date)));
- return Order::join('users', 'orders.uid', 'users.id')
- ->where('orders.created_at', '>=', $date)
- ->where('orders.created_at', '<', $end_date)
- ->where('status', 'PAID')
- ->selectRaw("orders.distribution_channel_id as channel_id,sum(price) as amount,
- timestampdiff(day,DATE_FORMAT(users.created_at, '%Y-%m-%d'),DATE_FORMAT(orders.created_at, '%Y-%m-%d')) as diff_day,
- DATE_FORMAT(users.created_at, '%Y-%m-%d') as register_date,
- count(distinct uid) as users,count(orders.id) as count")
- ->groupBy('channel_id', 'register_date')
- ->get();
- }
- /**
- * 保存统计数据
- * @param string $date 统计日期
- * @param Collection $collect 统计数据
- * @param int $day 第几天
- */
- private function saveStatistic($item, string $date, int $day)
- {
- $params = [];
- switch ($day) {
- case 0:
- $params = [
- 'first_day_count' => $item->count,
- 'first_day_amount' => $item->amount,
- 'first_day_users' => $item->users,
- ];
- break;
- case 1:
- $params = [
- 'second_day_count' => $item->count,
- 'second_day_amount' => $item->amount,
- 'second_day_users' => $item->users,
- ];
- break;
- case 2:
- $params = [
- 'third_day_count' => $item->count,
- 'third_day_amount' => $item->amount,
- 'third_day_users' => $item->users,
- ];
- break;
- case 3:
- $params = [
- 'forth_day_count' => $item->count,
- 'forth_day_amount' => $item->amount,
- 'forth_day_users' => $item->users,
- ];
- break;
- case 4:
- $params = [
- 'fifth_day_count' => $item->count,
- 'fifth_day_amount' => $item->amount,
- 'fifth_day_users' => $item->users,
- ];
- break;
- case 5:
- $params = [
- 'sixth_day_count' => $item->count,
- 'sixth_day_amount' => $item->amount,
- 'sixth_day_users' => $item->users,
- ];
- break;
- case 6:
- $params = [
- 'seventh_day_count' => $item->count,
- 'seventh_day_amount' => $item->amount,
- 'seventh_day_users' => $item->users,
- ];
- break;
- }
- NewUserChargeStatistic::updateOrCreate(
- [
- 'date' => $date,
- 'channel_id' => $item->channel_id,
- ],
- $params
- );
- }
- /**
- * 保存累计充值统计数据(不能重复跑)
- */
- private function saveStatisticAccumulate(Collection $collections, int $day)
- {
- switch ($day) {
- case 7:
- $items = $collections->where('diff_day', '>=', 7)->where('diff_day', '<', 30);
- break;
- case 14:
- case 29:
- $items = $collections->where('diff_day', '<=', $day);
- break;
- }
- switch ($day) {
- case 7:
- $columns = [
- 'count',
- 'amount',
- 'users',
- ];
- break;
- case 14:
- $columns = [
- '15_day_count',
- '15_day_amount',
- '15_day_users',
- ];
- break;
- case 29:
- $columns = [
- '30_day_count',
- '30_day_amount',
- '30_day_users',
- ];
- break;
- }
- $items->each(function ($item) use ($columns) {
- $info = NewUserChargeStatistic::where(
- [
- 'date' => $item->register_date,
- 'channel_id' => $item->channel_id,
- ]
- )->select(
- 'id',
- 'date',
- 'channel_id',
- $columns[0],
- $columns[1],
- $columns[2]
- )->first();
- if ($info) {
- $info[$columns[0]] += $item->count;
- $info[$columns[1]] += $item->amount;
- $info[$columns[2]] += $item->users;
- $info->save();
- } else {
- $data = [
- 'date' => $item->register_date,
- 'channel_id' => $item->channel_id,
- ];
- $data[$columns[0]] = $item->count;
- $data[$columns[1]] = $item->amount;
- $data[$columns[2]] = $item->users;
- NewUserChargeStatistic::create($data);
- }
- });
- }
- }
|