| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- <?php
- declare(strict_types=1);
- namespace App\Command;
- use App\Model\CollectionsModel;
- use App\Model\Mongo\RegisterModel;
- use App\Model\Mongo\StatisticsModel;
- use App\Model\VipOrderModel;
- use Carbon\Carbon;
- use Hyperf\Command\Command as HyperfCommand;
- use Hyperf\Command\Annotation\Command;
- use Hyperf\Redis\Redis;
- use Symfony\Component\Console\Input\InputArgument;
- /**
- * @Command
- */
- class StatisticsCommand extends HyperfCommand
- {
- public function __construct()
- {
- parent::__construct('statistics:info');
- }
- public function configure()
- {
- parent::configure();
- $this->setDescription('活跃/注册/充值统计');
- $this->addArgument('startDate', InputArgument::OPTIONAL, '开始日期', '-1 days');
- $this->addArgument('endDate', InputArgument::OPTIONAL, '结束日期', '0 days');
- }
- public function handle()
- {
- $startDate = $this->input->getArgument('startDate');
- $endDate = $this->input->getArgument('endDate');
- $startDate = Carbon::parse($startDate)->toDateString();
- $endDate = Carbon::parse($endDate)->toDateString();
- if ($endDate < $startDate) {
- throw new \Exception('结束日期不能小于开始日期.');
- }
- $date = $startDate;
- while (1) {
- if ($date > $endDate) {
- break;
- }
- $this->handleDB($date);
- $date = Carbon::parse($date)->addDay()->toDateString();
- }
- $this->info('success');
- }
- /**
- * @param $date
- */
- public function handleDB($date)
- {
- $dateTime = Carbon::now()->toDateTimeString();
- $data = [
- 'price' => '0.00',
- 'true_price' => '0.00',
- 'ios_price' => '0.00',
- 'android_price' => '0.00',
- 'ios_register' => 0,
- 'android_register' => 0,
- 'vip_register' => 0,
- 'normal_register' => 0,
- 'all_register' => 0,
- 'ios_active' => 0,
- 'android_active' => 0,
- 'vip_active' => 0,
- 'normal_active' => 0,
- 'all_active' => 0,
- 'order_count' => 0,
- 'pay_count' => 0,
- 'date' => $date,
- 'update' => $dateTime,
- ];
- $data['ios_register'] = make(RegisterModel::class)->db()
- ->countDocuments(
- [
- 'dt' => 'I',
- 'date' => $date
- ]
- );
- $data['android_register'] = make(RegisterModel::class)->db()
- ->countDocuments(
- [
- 'dt' => 'A',
- 'date' => $date
- ]
- );
- $data['vip_register'] = make(RegisterModel::class)->db()
- ->countDocuments(
- [
- 'is_vip' => 1,
- 'date' => $date
- ]
- );
- $data['normal_register'] = make(RegisterModel::class)->db()
- ->countDocuments(
- [
- 'is_vip' => 0,
- 'date' => $date
- ]
- );
- $data['vip_register'] = make(RegisterModel::class)->db()
- ->countDocuments(
- [
- 'is_vip' => 1,
- 'date' => $date
- ]
- );
- $data['all_register'] = $data['ios_register'] + $data['android_register'];
- $redis = make(Redis::class);
- $cachePrefix = env('SERVER_CACHE_PREFIX', 'c:');
- $prfix = $cachePrefix . 'active:' . $date;
- //日活统计key
- $data['ios_active'] = $redis->pfcount($prfix . ':I');
- $data['android_active'] = $redis->pfcount($prfix . ':A');
- $data['vip_active'] = $redis->pfcount($prfix . ':y');
- $data['normal_active'] = $redis->pfcount($prfix . ':n');
- $data['all_active'] = $redis->pfcount($prfix);
- $data['pay_count'] = CollectionsModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->count();
- $data['order_count'] = VipOrderModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->count();
- $data['price'] = (string)CollectionsModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->sum('order_amount');
- $data['true_price'] = (string)CollectionsModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->sum('real_amount');
- $data['ios_price'] = (string)CollectionsModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->where('device_type', 'I')->sum('real_amount');
- $data['android_price'] = (string)CollectionsModel::query()->whereBetween(
- 'created_at',
- [
- Carbon::parse($date)->startOfDay()->toDateTimeString(),
- Carbon::parse($date)->endOfDay()->toDateTimeString(),
- ]
- )->where('device_type', 'A')->sum('real_amount');
- $count = make(StatisticsModel::class)->db()
- ->countDocuments(['date' => $data['date']]);
- if ($count) {
- make(StatisticsModel::class)->db()->updateOne(
- ['date' => $data['date']],
- [
- '$set' =>
- [
- 'price' => $data['price'],
- 'true_price' => $data['true_price'],
- 'ios_price' => $data['ios_price'],
- 'android_price' => $data['android_price'],
- 'ios_register' => $data['ios_register'],
- 'android_register' => $data['android_register'],
- 'vip_register' => $data['vip_register'],
- 'normal_register' => $data['normal_register'],
- 'all_register' => $data['all_register'],
- 'ios_active' => $data['ios_active'],
- 'android_active' => $data['android_active'],
- 'vip_active' => $data['vip_active'],
- 'normal_active' => $data['normal_active'],
- 'all_active' => $data['all_active'],
- 'pay_count' => $data['pay_count'],
- 'order_count' => $data['order_count'],
- 'update' => $dateTime,
- ]
- ]
- );
- $this->info('update --> ' . $data['date']);
- } else {
- make(StatisticsModel::class)->db()->insertOne($data);
- $this->info('insert --> ' . $data['date']);
- }
- }
- }
|