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']); } } }