Modules_Manage_Controllers_StatisticsController.proxy.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. /**
  3. * 统计相关
  4. * @author x.b
  5. */
  6. declare (strict_types=1);
  7. namespace Modules\Manage\Controllers;
  8. use App\Model\ChannelModel;
  9. use App\Model\CollectionsModel;
  10. use App\Model\Mongo\StatisticsChannelModel;
  11. use App\Model\Mongo\StatisticsModel;
  12. use App\Model\UserModel;
  13. use Carbon\Carbon;
  14. use Hyperf\Validation\Contract\ValidatorFactoryInterface;
  15. use Psr\SimpleCache\CacheInterface;
  16. class StatisticsController extends BaseController
  17. {
  18. use \Hyperf\Di\Aop\ProxyTrait;
  19. use \Hyperf\Di\Aop\PropertyHandlerTrait;
  20. function __construct()
  21. {
  22. if (method_exists(parent::class, '__construct')) {
  23. parent::__construct(...func_get_args());
  24. }
  25. $this->__handlePropertyHandler(__CLASS__);
  26. }
  27. /**
  28. * 充值相关统计
  29. * @param ValidatorFactoryInterface $validatorFactory
  30. * @return mixed
  31. */
  32. public function info(ValidatorFactoryInterface $validatorFactory)
  33. {
  34. $inputData = $this->getJsonData();
  35. $rules = ['last_day' => 'required|numeric', 'start_date' => 'date', 'end_date' => 'date'];
  36. $validator = $validatorFactory->make($inputData, $rules);
  37. if ($validator->fails()) {
  38. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  39. return json_fail($validator->errors()->first());
  40. }
  41. if ($inputData['start_date'] && $inputData['end_date']) {
  42. $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
  43. } else {
  44. $where = ['date' => ['$gt' => Carbon::now()->subDays($inputData['last_day'])->toDateString()]];
  45. }
  46. $items = make(StatisticsModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
  47. $date = collect($items)->pluck('date');
  48. $update = collect($items)->sortByDesc('date')->first()->update;
  49. $price = collect($items)->pluck('true_price');
  50. $ios_price = collect($items)->pluck('ios_price');
  51. $android_price = collect($items)->pluck('android_price');
  52. $ios_register = collect($items)->pluck('ios_register');
  53. $android_register = collect($items)->pluck('android_register');
  54. $vip_register = collect($items)->pluck('vip_register');
  55. $normal_register = collect($items)->pluck('normal_register');
  56. $all_register = collect($items)->pluck('all_register');
  57. $ios_active = collect($items)->pluck('ios_active');
  58. $android_active = collect($items)->pluck('android_active');
  59. $vip_active = collect($items)->pluck('vip_active');
  60. $normal_active = collect($items)->pluck('normal_active');
  61. $all_active = collect($items)->pluck('all_active');
  62. $order_count = collect($items)->pluck('order_count');
  63. $pay_count = collect($items)->pluck('pay_count');
  64. $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];
  65. return json_success($data);
  66. }
  67. /**
  68. * 用户相关统计
  69. * @param ValidatorFactoryInterface $validatorFactory
  70. * @return mixed
  71. */
  72. public function data(ValidatorFactoryInterface $validatorFactory)
  73. {
  74. $inputData = $this->getJsonData();
  75. $rules = ['start_date' => 'date', 'end_date' => 'date'];
  76. $validator = $validatorFactory->make($inputData, $rules);
  77. if ($validator->fails()) {
  78. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  79. return json_fail($validator->errors()->first());
  80. }
  81. if (!$inputData['start_date']) {
  82. $inputData['start_date'] = Carbon::now()->firstOfMonth()->toDateString();
  83. $inputData['end_date'] = Carbon::now()->endOfMonth()->toDateString();
  84. }
  85. $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')];
  86. $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
  87. $data['list'] = make(StatisticsModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
  88. foreach ($data['list'] as $k => $v) {
  89. unset($data['list'][$k]['_id'], $data['list'][$k]['update']);
  90. $data['list'][$k]['kdj'] = $v['pay_count'] ? round($v['true_price'] / $v['pay_count'], 2) : 0;
  91. $data['list'][$k]['day_pay'] = round(round($v['pay_count'] / $v['all_active'], 4) * 100, 2);
  92. //根据产品需求,调整为%且保留2位小数
  93. $data['list'][$k]['arpu'] = round($v['true_price'] / $v['all_active'], 2);
  94. }
  95. $count = count($data['list']);
  96. $data['list'][$count]['date'] = '汇总';
  97. $data['list'][$count]['price'] = (string) collect($data['list'])->pluck('price')->sum();
  98. $data['list'][$count]['true_price'] = (string) collect($data['list'])->pluck('true_price')->sum();
  99. $data['list'][$count]['ios_price'] = (string) collect($data['list'])->pluck('ios_price')->sum();
  100. $data['list'][$count]['android_price'] = (string) collect($data['list'])->pluck('android_price')->sum();
  101. $data['list'][$count]['ios_register'] = collect($data['list'])->pluck('ios_register')->sum();
  102. $data['list'][$count]['android_register'] = collect($data['list'])->pluck('android_register')->sum();
  103. $data['list'][$count]['vip_register'] = collect($data['list'])->pluck('vip_register')->sum();
  104. $data['list'][$count]['normal_register'] = collect($data['list'])->pluck('normal_register')->sum();
  105. $data['list'][$count]['all_register'] = collect($data['list'])->pluck('all_register')->sum();
  106. $data['list'][$count]['ios_active'] = collect($data['list'])->pluck('ios_active')->sum();
  107. $data['list'][$count]['android_active'] = collect($data['list'])->pluck('android_active')->sum();
  108. $data['list'][$count]['vip_active'] = collect($data['list'])->pluck('vip_active')->sum();
  109. $data['list'][$count]['normal_active'] = collect($data['list'])->pluck('normal_active')->sum();
  110. $data['list'][$count]['all_active'] = collect($data['list'])->pluck('all_active')->sum();
  111. $data['list'][$count]['order_count'] = collect($data['list'])->pluck('order_count')->sum();
  112. $data['list'][$count]['pay_count'] = collect($data['list'])->pluck('pay_count')->sum();
  113. $data['list'][$count]['kdj'] = $data['list'][$count]['pay_count'] ? round($data['list'][$count]['true_price'] / $data['list'][$count]['pay_count'], 2) : 0;
  114. $data['list'][$count]['day_pay'] = round(round($data['list'][$count]['pay_count'] / $data['list'][$count]['all_active'], 4) * 100, 2);
  115. $data['list'][$count]['arpu'] = round($data['list'][$count]['true_price'] / $data['list'][$count]['all_active'], 2);
  116. return json_success($data);
  117. }
  118. /**
  119. * 渠道相关统计
  120. * @param ValidatorFactoryInterface $validatorFactory
  121. * @return mixed
  122. */
  123. public function channel(ValidatorFactoryInterface $validatorFactory)
  124. {
  125. $inputData = $this->getJsonData();
  126. $rules = ['last_day' => 'required|numeric', 'channel' => 'required|string', 'start_date' => 'date', 'end_date' => 'date'];
  127. $validator = $validatorFactory->make($inputData, $rules);
  128. if ($validator->fails()) {
  129. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  130. return json_fail($validator->errors()->first());
  131. }
  132. if ($inputData['start_date'] && $inputData['end_date']) {
  133. $where = ['date' => ['$gte' => $inputData['start_date'], '$lte' => $inputData['end_date']]];
  134. } else {
  135. $where = ['date' => ['$gt' => Carbon::now()->subDays($inputData['last_day'])->toDateString()]];
  136. }
  137. $items = make(StatisticsChannelModel::class)->db()->find($where, ['sort' => ['date' => 1]])->toArray();
  138. $date = collect($items)->pluck('date');
  139. $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];
  140. foreach ($data['reg'] as $k => $v) {
  141. if (!$v) {
  142. $data['reg'][$k] = 0;
  143. }
  144. if (!$data['count'][$k]) {
  145. $data['count'][$k] = 0;
  146. }
  147. if (!$data['price'][$k]) {
  148. $data['price'][$k] = '0.00';
  149. }
  150. }
  151. return json_success($data);
  152. }
  153. /**
  154. * 渠道相关统计
  155. *
  156. * @return mixed
  157. */
  158. public function channelCount()
  159. {
  160. $channel_list = make(CacheInterface::class)->remember('channel_list', 60 * 60, function () {
  161. return ChannelModel::query()->where('status', 1)->pluck('channel');
  162. });
  163. $channel = [
  164. 'channel_list' => $channel_list,
  165. //渠道列表
  166. 'channel_count' => count($channel_list),
  167. //渠道数量
  168. 'channel_user_count' => UserModel::query()->whereIn('channel_id', $channel_list)->count(),
  169. //渠道注册用户总数
  170. 'channel_pay_count' => CollectionsModel::query()->whereIn('channel', $channel_list)->count(),
  171. //渠道充值用户总数
  172. 'channel_user_pay' => CollectionsModel::query()->whereIn('channel', $channel_list)->sum('real_amount'),
  173. //渠道充值金额
  174. 'update' => Carbon::now()->toDateTimeString(),
  175. ];
  176. return json_success($channel);
  177. }
  178. }