| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <?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
- {
- /**
- * 充值相关统计
- * @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);
- }
- }
|