| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?php
- /**
- * 统计相关
- * @author x.b
- */
- declare (strict_types=1);
- namespace Modules\Manage\Controllers;
- use App\Model\ChannelModel;
- use App\Model\CollectionsModel;
- use App\Model\Mongo\StatisticsChannelModel;
- use App\Model\Mongo\StatisticsModel;
- use App\Model\UserModel;
- use Carbon\Carbon;
- use Hyperf\Validation\Contract\ValidatorFactoryInterface;
- use Psr\SimpleCache\CacheInterface;
- class StatisticsController extends BaseController
- {
- use \Hyperf\Di\Aop\ProxyTrait;
- use \Hyperf\Di\Aop\PropertyHandlerTrait;
- function __construct()
- {
- if (method_exists(parent::class, '__construct')) {
- parent::__construct(...func_get_args());
- }
- $this->__handlePropertyHandler(__CLASS__);
- }
- /**
- * 充值相关统计
- * @param ValidatorFactoryInterface $validatorFactory
- * @return mixed
- */
- public function info(ValidatorFactoryInterface $validatorFactory)
- {
- $inputData = $this->getJsonData();
- $rules = ['last_day' => 'required|numeric', 'start_date' => 'date', 'end_date' => 'date'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- if ($inputData['start_date'] && $inputData['end_date']) {
- $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
- } else {
- $where = ['date' => ['$gt' => Carbon::now()->subDays($inputData['last_day'])->toDateString()]];
- }
- $items = make(StatisticsModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
- $date = collect($items)->pluck('date');
- $update = collect($items)->sortByDesc('date')->first()->update;
- $price = collect($items)->pluck('true_price');
- $ios_price = collect($items)->pluck('ios_price');
- $android_price = collect($items)->pluck('android_price');
- $ios_register = collect($items)->pluck('ios_register');
- $android_register = collect($items)->pluck('android_register');
- $vip_register = collect($items)->pluck('vip_register');
- $normal_register = collect($items)->pluck('normal_register');
- $all_register = collect($items)->pluck('all_register');
- $ios_active = collect($items)->pluck('ios_active');
- $android_active = collect($items)->pluck('android_active');
- $vip_active = collect($items)->pluck('vip_active');
- $normal_active = collect($items)->pluck('normal_active');
- $all_active = collect($items)->pluck('all_active');
- $order_count = collect($items)->pluck('order_count');
- $pay_count = collect($items)->pluck('pay_count');
- $data = ['update' => $update, 'date' => $date, 'price' => $price, 'ios_price' => $ios_price, 'android_price' => $android_price, 'ios_register' => $ios_register, 'android_register' => $android_register, 'vip_register' => $vip_register, 'normal_register' => $normal_register, 'all_register' => $all_register, 'ios_active' => $ios_active, 'android_active' => $android_active, 'vip_active' => $vip_active, 'normal_active' => $normal_active, 'all_active' => $all_active, 'order_count' => $order_count, 'pay_count' => $pay_count];
- return json_success($data);
- }
- /**
- * 用户相关统计
- * @param ValidatorFactoryInterface $validatorFactory
- * @return mixed
- */
- public function data(ValidatorFactoryInterface $validatorFactory)
- {
- $inputData = $this->getJsonData();
- $rules = ['start_date' => 'date', 'end_date' => 'date'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- if (!$inputData['start_date']) {
- $inputData['start_date'] = Carbon::now()->firstOfMonth()->toDateString();
- $inputData['end_date'] = Carbon::now()->endOfMonth()->toDateString();
- }
- $data['count'] = ['user' => UserModel::query()->count(), 'ios' => UserModel::query()->where('device_type', 'I')->count(), 'android' => UserModel::query()->where('device_type', 'A')->count(), 'pay' => CollectionsModel::query()->sum('real_amount'), 'ios_pay' => CollectionsModel::query()->where('device_type', 'I')->sum('real_amount'), 'android_pay' => CollectionsModel::query()->where('device_type', 'A')->sum('real_amount')];
- $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
- $data['list'] = make(StatisticsModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
- foreach ($data['list'] as $k => $v) {
- unset($data['list'][$k]['_id'], $data['list'][$k]['update']);
- $data['list'][$k]['kdj'] = $v['pay_count'] ? round($v['true_price'] / $v['pay_count'], 2) : 0;
- $data['list'][$k]['day_pay'] = round(round($v['pay_count'] / $v['all_active'], 4) * 100, 2);
- //根据产品需求,调整为%且保留2位小数
- $data['list'][$k]['arpu'] = round($v['true_price'] / $v['all_active'], 2);
- }
- $count = count($data['list']);
- $data['list'][$count]['date'] = '汇总';
- $data['list'][$count]['price'] = (string) collect($data['list'])->pluck('price')->sum();
- $data['list'][$count]['true_price'] = (string) collect($data['list'])->pluck('true_price')->sum();
- $data['list'][$count]['ios_price'] = (string) collect($data['list'])->pluck('ios_price')->sum();
- $data['list'][$count]['android_price'] = (string) collect($data['list'])->pluck('android_price')->sum();
- $data['list'][$count]['ios_register'] = collect($data['list'])->pluck('ios_register')->sum();
- $data['list'][$count]['android_register'] = collect($data['list'])->pluck('android_register')->sum();
- $data['list'][$count]['vip_register'] = collect($data['list'])->pluck('vip_register')->sum();
- $data['list'][$count]['normal_register'] = collect($data['list'])->pluck('normal_register')->sum();
- $data['list'][$count]['all_register'] = collect($data['list'])->pluck('all_register')->sum();
- $data['list'][$count]['ios_active'] = collect($data['list'])->pluck('ios_active')->sum();
- $data['list'][$count]['android_active'] = collect($data['list'])->pluck('android_active')->sum();
- $data['list'][$count]['vip_active'] = collect($data['list'])->pluck('vip_active')->sum();
- $data['list'][$count]['normal_active'] = collect($data['list'])->pluck('normal_active')->sum();
- $data['list'][$count]['all_active'] = collect($data['list'])->pluck('all_active')->sum();
- $data['list'][$count]['order_count'] = collect($data['list'])->pluck('order_count')->sum();
- $data['list'][$count]['pay_count'] = collect($data['list'])->pluck('pay_count')->sum();
- $data['list'][$count]['kdj'] = $data['list'][$count]['pay_count'] ? round($data['list'][$count]['true_price'] / $data['list'][$count]['pay_count'], 2) : 0;
- $data['list'][$count]['day_pay'] = round(round($data['list'][$count]['pay_count'] / $data['list'][$count]['all_active'], 4) * 100, 2);
- $data['list'][$count]['arpu'] = round($data['list'][$count]['true_price'] / $data['list'][$count]['all_active'], 2);
- return json_success($data);
- }
- /**
- * 渠道相关统计
- * @param ValidatorFactoryInterface $validatorFactory
- * @return mixed
- */
- public function channel(ValidatorFactoryInterface $validatorFactory)
- {
- $inputData = $this->getJsonData();
- $rules = ['last_day' => 'required|numeric', 'channel' => 'required|string', 'start_date' => 'date', 'end_date' => 'date'];
- $validator = $validatorFactory->make($inputData, $rules);
- if ($validator->fails()) {
- // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
- return json_fail($validator->errors()->first());
- }
- if ($inputData['start_date'] && $inputData['end_date']) {
- $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
- } else {
- $where = ['date' => ['$gt' => Carbon::now()->subDays($inputData['last_day'])->toDateString()]];
- }
- $items = make(StatisticsChannelModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
- $date = collect($items)->pluck('date');
- $data = ['date' => $date, 'reg' => collect($items)->pluck("{$inputData['channel']}_reg"), 'count' => collect($items)->pluck("{$inputData['channel']}_count"), 'price' => collect($items)->pluck("{$inputData['channel']}_price"), 'update' => collect($items)->sortByDesc('date')->first()->update];
- foreach ($data['reg'] as $k => $v) {
- if (!$v) {
- $data['reg'][$k] = 0;
- }
- if (!$data['count'][$k]) {
- $data['count'][$k] = 0;
- }
- if (!$data['price'][$k]) {
- $data['price'][$k] = '0.00';
- }
- }
- return json_success($data);
- }
- /**
- * 渠道相关统计
- *
- * @return mixed
- */
- public function channelCount()
- {
- $channel_list = make(CacheInterface::class)->remember('channel_list', 60 * 60, function () {
- return ChannelModel::query()->where('status', 1)->pluck('channel');
- });
- $channel = [
- 'channel_list' => $channel_list,
- //渠道列表
- 'channel_count' => count($channel_list),
- //渠道数量
- 'channel_user_count' => UserModel::query()->whereIn('channel_id', $channel_list)->count(),
- //渠道注册用户总数
- 'channel_pay_count' => CollectionsModel::query()->whereIn('channel', $channel_list)->count(),
- //渠道充值用户总数
- 'channel_user_pay' => CollectionsModel::query()->whereIn('channel', $channel_list)->sum('real_amount'),
- //渠道充值金额
- 'update' => Carbon::now()->toDateTimeString(),
- ];
- return json_success($channel);
- }
- }
|