StatisticsController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. /**
  19. * 充值相关统计
  20. * @param ValidatorFactoryInterface $validatorFactory
  21. * @return mixed
  22. */
  23. public function info(ValidatorFactoryInterface $validatorFactory)
  24. {
  25. $inputData = $this->getJsonData();
  26. $rules = [
  27. 'last_day' => 'required|numeric',
  28. 'start_date' => 'date',
  29. 'end_date' => 'date',
  30. ];
  31. $validator = $validatorFactory->make($inputData, $rules);
  32. if ($validator->fails()) {
  33. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  34. return json_fail($validator->errors()->first());
  35. }
  36. if ($inputData['start_date'] && $inputData['end_date']) {
  37. $where = [
  38. 'date' => [
  39. '$gte' => $inputData['start_date'],
  40. '$lte' => $inputData['end_date']
  41. ]
  42. ];
  43. } else {
  44. $where = [
  45. 'date' => [
  46. '$gt' => Carbon::now()
  47. ->subDays($inputData['last_day'])
  48. ->toDateString()
  49. ]
  50. ];
  51. }
  52. $items = make(StatisticsModel::class)->db()
  53. ->find($where, ['sort' => ['date' => 1]])->toArray();
  54. $date = collect($items)->pluck('date');
  55. $update = collect($items)->sortByDesc('date')->first()->update;
  56. $price = collect($items)->pluck('true_price');
  57. $ios_price = collect($items)->pluck('ios_price');
  58. $android_price = collect($items)->pluck('android_price');
  59. $ios_register = collect($items)->pluck('ios_register');
  60. $android_register = collect($items)->pluck('android_register');
  61. $vip_register = collect($items)->pluck('vip_register');
  62. $normal_register = collect($items)->pluck('normal_register');
  63. $all_register = collect($items)->pluck('all_register');
  64. $ios_active = collect($items)->pluck('ios_active');
  65. $android_active = collect($items)->pluck('android_active');
  66. $vip_active = collect($items)->pluck('vip_active');
  67. $normal_active = collect($items)->pluck('normal_active');
  68. $all_active = collect($items)->pluck('all_active');
  69. $order_count = collect($items)->pluck('order_count');
  70. $pay_count = collect($items)->pluck('pay_count');
  71. $data = [
  72. 'update' => $update,
  73. 'date' => $date,
  74. 'price' => $price,
  75. 'ios_price' => $ios_price,
  76. 'android_price' => $android_price,
  77. 'ios_register' => $ios_register,
  78. 'android_register' => $android_register,
  79. 'vip_register' => $vip_register,
  80. 'normal_register' => $normal_register,
  81. 'all_register' => $all_register,
  82. 'ios_active' => $ios_active,
  83. 'android_active' => $android_active,
  84. 'vip_active' => $vip_active,
  85. 'normal_active' => $normal_active,
  86. 'all_active' => $all_active,
  87. 'order_count' => $order_count,
  88. 'pay_count' => $pay_count
  89. ];
  90. return json_success($data);
  91. }
  92. /**
  93. * 用户相关统计
  94. * @param ValidatorFactoryInterface $validatorFactory
  95. * @return mixed
  96. */
  97. public function data(ValidatorFactoryInterface $validatorFactory)
  98. {
  99. $inputData = $this->getJsonData();
  100. $rules = [
  101. 'start_date' => 'date',
  102. 'end_date' => 'date',
  103. ];
  104. $validator = $validatorFactory->make($inputData, $rules);
  105. if ($validator->fails()) {
  106. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  107. return json_fail($validator->errors()->first());
  108. }
  109. if (!$inputData['start_date']) {
  110. $inputData['start_date'] = Carbon::now()->firstOfMonth()->toDateString();
  111. $inputData['end_date'] = Carbon::now()->endOfMonth()->toDateString();
  112. }
  113. $data['count'] = [
  114. 'user' => UserModel::query()->count(),
  115. 'ios' => UserModel::query()->where('device_type', 'I')->count(),
  116. 'android' => UserModel::query()->where('device_type', 'A')->count(),
  117. 'pay' => CollectionsModel::query()->sum('real_amount'),
  118. 'ios_pay' => CollectionsModel::query()
  119. ->where('device_type', 'I')
  120. ->sum('real_amount'),
  121. 'android_pay' => CollectionsModel::query()
  122. ->where('device_type', 'A')
  123. ->sum('real_amount'),
  124. ];
  125. $where = [
  126. 'date' => [
  127. '$gte' => $inputData['start_date'],
  128. '$lte' => $inputData['end_date']
  129. ]
  130. ];
  131. $data['list'] = make(StatisticsModel::class)->db()
  132. ->find($where, ['sort' => ['date' => 1]])->toArray();
  133. foreach ($data['list'] as $k => $v) {
  134. unset($data['list'][$k]['_id'], $data['list'][$k]['update']);
  135. $data['list'][$k]['kdj'] = $v['pay_count'] ? round($v['true_price'] / $v['pay_count'], 2) : 0;
  136. $data['list'][$k]['day_pay'] = round((round($v['pay_count'] / $v['all_active'], 4) * 100), 2); //根据产品需求,调整为%且保留2位小数
  137. $data['list'][$k]['arpu'] = round($v['true_price'] / $v['all_active'], 2);
  138. }
  139. $count = count($data['list']);
  140. $data['list'][$count]['date'] = '汇总';
  141. $data['list'][$count]['price'] = (string)collect($data['list'])->pluck('price')->sum();
  142. $data['list'][$count]['true_price'] = (string)collect($data['list'])->pluck('true_price')->sum();
  143. $data['list'][$count]['ios_price'] = (string)collect($data['list'])->pluck('ios_price')->sum();
  144. $data['list'][$count]['android_price'] = (string)collect($data['list'])->pluck('android_price')->sum();
  145. $data['list'][$count]['ios_register'] = collect($data['list'])->pluck('ios_register')->sum();
  146. $data['list'][$count]['android_register'] = collect($data['list'])->pluck('android_register')->sum();
  147. $data['list'][$count]['vip_register'] = collect($data['list'])->pluck('vip_register')->sum();
  148. $data['list'][$count]['normal_register'] = collect($data['list'])->pluck('normal_register')->sum();
  149. $data['list'][$count]['all_register'] = collect($data['list'])->pluck('all_register')->sum();
  150. $data['list'][$count]['ios_active'] = collect($data['list'])->pluck('ios_active')->sum();
  151. $data['list'][$count]['android_active'] = collect($data['list'])->pluck('android_active')->sum();
  152. $data['list'][$count]['vip_active'] = collect($data['list'])->pluck('vip_active')->sum();
  153. $data['list'][$count]['normal_active'] = collect($data['list'])->pluck('normal_active')->sum();
  154. $data['list'][$count]['all_active'] = collect($data['list'])->pluck('all_active')->sum();
  155. $data['list'][$count]['order_count'] = collect($data['list'])->pluck('order_count')->sum();
  156. $data['list'][$count]['pay_count'] = collect($data['list'])->pluck('pay_count')->sum();
  157. $data['list'][$count]['kdj'] = $data['list'][$count]['pay_count'] ? round($data['list'][$count]['true_price'] / $data['list'][$count]['pay_count'], 2) : 0;
  158. $data['list'][$count]['day_pay'] = round((round($data['list'][$count]['pay_count'] / $data['list'][$count]['all_active'], 4) * 100), 2);
  159. $data['list'][$count]['arpu'] = round($data['list'][$count]['true_price'] / $data['list'][$count]['all_active'], 2);
  160. return json_success($data);
  161. }
  162. /**
  163. * 渠道相关统计
  164. * @param ValidatorFactoryInterface $validatorFactory
  165. * @return mixed
  166. */
  167. public function channel(ValidatorFactoryInterface $validatorFactory)
  168. {
  169. $inputData = $this->getJsonData();
  170. $rules = [
  171. 'last_day' => 'required|numeric',
  172. 'channel' => 'required|string',
  173. 'start_date' => 'date',
  174. 'end_date' => 'date',
  175. ];
  176. $validator = $validatorFactory->make($inputData, $rules);
  177. if ($validator->fails()) {
  178. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  179. return json_fail($validator->errors()->first());
  180. }
  181. if ($inputData['start_date'] && $inputData['end_date']) {
  182. $where = [
  183. 'date' => [
  184. '$gte' => $inputData['start_date'],
  185. '$lte' => $inputData['end_date']
  186. ]
  187. ];
  188. } else {
  189. $where = [
  190. 'date' => [
  191. '$gt' => Carbon::now()
  192. ->subDays($inputData['last_day'])
  193. ->toDateString()
  194. ]
  195. ];
  196. }
  197. $items = make(StatisticsChannelModel::class)->db()
  198. ->find($where, ['sort'=>['date'=>1]])->toArray();
  199. $date = collect($items)->pluck('date');
  200. $data = [
  201. 'date' => $date,
  202. 'reg' => collect($items)->pluck("{$inputData['channel']}_reg"),
  203. 'count' => collect($items)->pluck("{$inputData['channel']}_count"),
  204. 'price' => collect($items)->pluck("{$inputData['channel']}_price"),
  205. 'update' => collect($items)->sortByDesc('date')->first()->update
  206. ];
  207. foreach ($data['reg'] as $k => $v) {
  208. if (!$v) {
  209. $data['reg'][$k] = 0;
  210. }
  211. if (!$data['count'][$k]) {
  212. $data['count'][$k] = 0;
  213. }
  214. if (!$data['price'][$k]) {
  215. $data['price'][$k] = '0.00';
  216. }
  217. }
  218. return json_success($data);
  219. }
  220. /**
  221. * 渠道相关统计
  222. *
  223. * @return mixed
  224. */
  225. public function channelCount()
  226. {
  227. $channel_list = make(CacheInterface::class)->remember(
  228. 'channel_list',
  229. 60 * 60,
  230. function () {
  231. return ChannelModel::query()
  232. ->where('status', 1)
  233. ->pluck('channel');
  234. }
  235. );
  236. $channel = [
  237. 'channel_list' => $channel_list, //渠道列表
  238. 'channel_count' => count($channel_list), //渠道数量
  239. 'channel_user_count' => UserModel::query()->whereIn('channel_id', $channel_list)->count(), //渠道注册用户总数
  240. 'channel_pay_count' => CollectionsModel::query()->whereIn('channel', $channel_list)->count(), //渠道充值用户总数
  241. 'channel_user_pay' => CollectionsModel::query()->whereIn('channel', $channel_list)->sum('real_amount'), //渠道充值金额
  242. 'update' => Carbon::now()->toDateTimeString()
  243. ];
  244. return json_success($channel);
  245. }
  246. }