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