StatisticsCommand.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Command;
  4. use App\Model\CollectionsModel;
  5. use App\Model\Mongo\RegisterModel;
  6. use App\Model\Mongo\StatisticsModel;
  7. use App\Model\VipOrderModel;
  8. use Carbon\Carbon;
  9. use Hyperf\Command\Command as HyperfCommand;
  10. use Hyperf\Command\Annotation\Command;
  11. use Hyperf\Redis\Redis;
  12. use Symfony\Component\Console\Input\InputArgument;
  13. /**
  14. * @Command
  15. */
  16. class StatisticsCommand extends HyperfCommand
  17. {
  18. public function __construct()
  19. {
  20. parent::__construct('statistics:info');
  21. }
  22. public function configure()
  23. {
  24. parent::configure();
  25. $this->setDescription('活跃/注册/充值统计');
  26. $this->addArgument('startDate', InputArgument::OPTIONAL, '开始日期', '-1 days');
  27. $this->addArgument('endDate', InputArgument::OPTIONAL, '结束日期', '0 days');
  28. }
  29. public function handle()
  30. {
  31. $startDate = $this->input->getArgument('startDate');
  32. $endDate = $this->input->getArgument('endDate');
  33. $startDate = Carbon::parse($startDate)->toDateString();
  34. $endDate = Carbon::parse($endDate)->toDateString();
  35. if ($endDate < $startDate) {
  36. throw new \Exception('结束日期不能小于开始日期.');
  37. }
  38. $date = $startDate;
  39. while (1) {
  40. if ($date > $endDate) {
  41. break;
  42. }
  43. $this->handleDB($date);
  44. $date = Carbon::parse($date)->addDay()->toDateString();
  45. }
  46. $this->info('success');
  47. }
  48. /**
  49. * @param $date
  50. */
  51. public function handleDB($date)
  52. {
  53. $dateTime = Carbon::now()->toDateTimeString();
  54. $data = [
  55. 'price' => '0.00',
  56. 'true_price' => '0.00',
  57. 'ios_price' => '0.00',
  58. 'android_price' => '0.00',
  59. 'ios_register' => 0,
  60. 'android_register' => 0,
  61. 'vip_register' => 0,
  62. 'normal_register' => 0,
  63. 'all_register' => 0,
  64. 'ios_active' => 0,
  65. 'android_active' => 0,
  66. 'vip_active' => 0,
  67. 'normal_active' => 0,
  68. 'all_active' => 0,
  69. 'order_count' => 0,
  70. 'pay_count' => 0,
  71. 'date' => $date,
  72. 'update' => $dateTime,
  73. ];
  74. $data['ios_register'] = make(RegisterModel::class)->db()
  75. ->countDocuments(
  76. [
  77. 'dt' => 'I',
  78. 'date' => $date
  79. ]
  80. );
  81. $data['android_register'] = make(RegisterModel::class)->db()
  82. ->countDocuments(
  83. [
  84. 'dt' => 'A',
  85. 'date' => $date
  86. ]
  87. );
  88. $data['vip_register'] = make(RegisterModel::class)->db()
  89. ->countDocuments(
  90. [
  91. 'is_vip' => 1,
  92. 'date' => $date
  93. ]
  94. );
  95. $data['normal_register'] = make(RegisterModel::class)->db()
  96. ->countDocuments(
  97. [
  98. 'is_vip' => 0,
  99. 'date' => $date
  100. ]
  101. );
  102. $data['vip_register'] = make(RegisterModel::class)->db()
  103. ->countDocuments(
  104. [
  105. 'is_vip' => 1,
  106. 'date' => $date
  107. ]
  108. );
  109. $data['all_register'] = $data['ios_register'] + $data['android_register'];
  110. $redis = make(Redis::class);
  111. $cachePrefix = env('SERVER_CACHE_PREFIX', 'c:');
  112. $prfix = $cachePrefix . 'active:' . $date;
  113. //日活统计key
  114. $data['ios_active'] = $redis->pfcount($prfix . ':I');
  115. $data['android_active'] = $redis->pfcount($prfix . ':A');
  116. $data['vip_active'] = $redis->pfcount($prfix . ':y');
  117. $data['normal_active'] = $redis->pfcount($prfix . ':n');
  118. $data['all_active'] = $redis->pfcount($prfix);
  119. $data['pay_count'] = CollectionsModel::query()->whereBetween(
  120. 'created_at',
  121. [
  122. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  123. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  124. ]
  125. )->count();
  126. $data['order_count'] = VipOrderModel::query()->whereBetween(
  127. 'created_at',
  128. [
  129. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  130. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  131. ]
  132. )->count();
  133. $data['price'] = (string)CollectionsModel::query()->whereBetween(
  134. 'created_at',
  135. [
  136. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  137. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  138. ]
  139. )->sum('order_amount');
  140. $data['true_price'] = (string)CollectionsModel::query()->whereBetween(
  141. 'created_at',
  142. [
  143. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  144. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  145. ]
  146. )->sum('real_amount');
  147. $data['ios_price'] = (string)CollectionsModel::query()->whereBetween(
  148. 'created_at',
  149. [
  150. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  151. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  152. ]
  153. )->where('device_type', 'I')->sum('real_amount');
  154. $data['android_price'] = (string)CollectionsModel::query()->whereBetween(
  155. 'created_at',
  156. [
  157. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  158. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  159. ]
  160. )->where('device_type', 'A')->sum('real_amount');
  161. $count = make(StatisticsModel::class)->db()
  162. ->countDocuments(['date' => $data['date']]);
  163. if ($count) {
  164. make(StatisticsModel::class)->db()->updateOne(
  165. ['date' => $data['date']],
  166. [
  167. '$set' =>
  168. [
  169. 'price' => $data['price'],
  170. 'true_price' => $data['true_price'],
  171. 'ios_price' => $data['ios_price'],
  172. 'android_price' => $data['android_price'],
  173. 'ios_register' => $data['ios_register'],
  174. 'android_register' => $data['android_register'],
  175. 'vip_register' => $data['vip_register'],
  176. 'normal_register' => $data['normal_register'],
  177. 'all_register' => $data['all_register'],
  178. 'ios_active' => $data['ios_active'],
  179. 'android_active' => $data['android_active'],
  180. 'vip_active' => $data['vip_active'],
  181. 'normal_active' => $data['normal_active'],
  182. 'all_active' => $data['all_active'],
  183. 'pay_count' => $data['pay_count'],
  184. 'order_count' => $data['order_count'],
  185. 'update' => $dateTime,
  186. ]
  187. ]
  188. );
  189. $this->info('update --> ' . $data['date']);
  190. } else {
  191. make(StatisticsModel::class)->db()->insertOne($data);
  192. $this->info('insert --> ' . $data['date']);
  193. }
  194. }
  195. }