AnalyzeUserCommand.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Command;
  4. use App\Model\CollectionsModel;
  5. use App\Model\Mongo\StatUserModel;
  6. use App\Model\UserModel;
  7. use Carbon\Carbon;
  8. use Hyperf\Command\Command as HyperfCommand;
  9. use Hyperf\Command\Annotation\Command;
  10. /**
  11. * @Command
  12. */
  13. class AnalyzeUserCommand extends HyperfCommand
  14. {
  15. /**
  16. * 执行的命令行
  17. *
  18. * @var string
  19. */
  20. protected $name = 'analyze:user';
  21. public function handle()
  22. {
  23. $startDate = Carbon::parse('-1 days')->toDateString();
  24. $endDate = Carbon::parse('0 days')->toDateString();
  25. if ($endDate < $startDate) {
  26. throw new \Exception('结束日期不能小于开始日期.');
  27. }
  28. $date = $startDate;
  29. while (1) {
  30. if ($date > $endDate) {
  31. break;
  32. }
  33. $this->handleDB($date);
  34. $date = Carbon::parse($date)->addDay(1)->toDateString();
  35. }
  36. $this->info('success');
  37. }
  38. /**
  39. * @param $date
  40. */
  41. public function handleDB($date)
  42. {
  43. $data = [
  44. 'register_normal_count' => 0,
  45. 'register_visitor_count' => 0,
  46. 'ios_active_count' => 0,
  47. 'android_active_count' => 0,
  48. 'date' => Carbon::parse($date)->toDateString()
  49. ];
  50. $data['register_visitor_count'] = UserModel::query()->whereBetween(
  51. 'created_at',
  52. [
  53. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  54. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  55. ]
  56. )->where('mobile', '')->count();
  57. $data['register_mobile_count'] = UserModel::query()->whereBetween(
  58. 'created_at',
  59. [
  60. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  61. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  62. ]
  63. )->where('mobile', '!=', '')->count();
  64. $data['price'] = CollectionsModel::query()->whereBetween(
  65. 'created_at',
  66. [
  67. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  68. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  69. ]
  70. )->sum('order_amount');
  71. $data['true_price'] = CollectionsModel::query()->whereBetween(
  72. 'paid_at',
  73. [
  74. Carbon::parse($date)->startOfDay()->toDateTimeString(),
  75. Carbon::parse($date)->endOfDay()->toDateTimeString(),
  76. ]
  77. )->sum('real_amount');
  78. $count = make(StatUserModel::class)->db()
  79. ->countDocuments(['date' => $data['date']]);
  80. if ($count) {
  81. make(StatUserModel::class)->db()->updateOne(
  82. ['date'=>Carbon::parse($date)->toDateString()],
  83. ['$set' =>
  84. [
  85. 'price' => $data['android_active_count'],
  86. 'true_price' => $data['android_active_count'],
  87. 'register_mobile_count' => $data['register_mobile_count'],
  88. 'register_visitor_count' => $data['register_visitor_count'],
  89. 'ios_active_count' => $data['ios_active_count'],
  90. 'android_active_count' => $data['android_active_count'],
  91. ]
  92. ]
  93. );
  94. $this->info('update --> ' . $data['date']);
  95. } else {
  96. make(StatUserModel::class)->db()->insertOne($data);
  97. $this->info('insert --> ' . $data['date']);
  98. }
  99. }
  100. }