ActivityStats.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace App\Console\Commands\Activity;
  3. use App\Cache\Activity\ActivityCache;
  4. use App\Modules\Activity\Services\ActivityService;
  5. use App\Modules\Trade\Services\OrderService;
  6. use App\Modules\Activity\Models\ActivityStats as ActivityStatsModel;
  7. use Illuminate\Console\Command;
  8. class ActivityStats extends Command
  9. {
  10. /**
  11. * The name and signature of the console command.
  12. *
  13. * @var string
  14. */
  15. protected $signature = 'activity:stats';
  16. /**
  17. * The console command description.
  18. *
  19. * @var string
  20. */
  21. protected $description = '统计快应用活动相关数据';
  22. /**
  23. * @throws \GuzzleHttp\Exception\GuzzleException
  24. */
  25. public function handle()
  26. {
  27. // 获取所有有效快应用
  28. $activities = ActivityService::getValidActivities();
  29. if (empty($activities)) {
  30. return false;
  31. }
  32. // 获取活动统计
  33. $activityIds = array_column($activities, 'id');
  34. $activityStats = ActivityStatsModel::getActivityStatsByActivityIds($activityIds);
  35. $yesterday = date('Y-m-d');
  36. foreach ($activities as $activity) {
  37. [$activityId, $channelId] = [getProp($activity, 'id'), getProp($activity, 'distribution_channel_id')];
  38. [$startAt, $endAt] = [getProp($activity, 'start_time'), getProp($activity, 'end_time')];
  39. // 获取订单相关数据
  40. $orders = OrderService::getOrdersByActivityId($channelId, $startAt, $activityId);
  41. if (empty($orders)) {
  42. continue;
  43. }
  44. // 订单总数、订单成功数、订单总金额
  45. $orderNum = 0;
  46. $successOrderNum = 0;
  47. $rechargeAmount = 0;
  48. $paidUids = [];
  49. foreach ($orders as $order) {
  50. $uid = (int)getProp($order, 'uid');
  51. $orderNum++;
  52. if (getProp($order, 'status') === 'PAID') {
  53. $successOrderNum++;
  54. $rechargeAmount += getProp($order, 'price');
  55. if (!in_array($uid, $paidUids, true)) {
  56. $paidUids[] = $uid;
  57. }
  58. }
  59. }
  60. // 获取昨日uv、pv
  61. $uv = ActivityCache::getActivityUv($activityId, $yesterday);
  62. $pv = ActivityCache::getActivityPv($activityId, $yesterday);
  63. // 更新统计数据
  64. $activityStat = collect($activityStats)->firstWhere('activity_id', $activityId);
  65. if ($activityStat) {
  66. ActivityStatsModel::updateData(['activity_id' => $activityId], [
  67. 'success_order_num' => $successOrderNum,
  68. 'recharge_amount' => $rechargeAmount,
  69. 'order_num' => $orderNum,
  70. 'paid_user_num' => count($paidUids),
  71. 'uv' => $uv + (int)getProp($activityStat, 'uv'),
  72. 'pv' => $pv + (int)getProp($activityStat, 'pv'),
  73. 'updated_at' => date('Y-m-d H:i:s'),
  74. ]);
  75. } else {
  76. ActivityStatsModel::insertData([
  77. 'activity_id' => $activityId,
  78. 'channel_id' => $channelId,
  79. 'success_order_num' => $successOrderNum,
  80. 'recharge_amount' => $rechargeAmount,
  81. 'order_num' => $orderNum,
  82. 'paid_user_num' => count($paidUids),
  83. 'uv' => $uv,
  84. 'pv' => $pv,
  85. 'created_at' => date('Y-m-d H:i:s'),
  86. 'updated_at' => date('Y-m-d H:i:s'),
  87. ]);
  88. }
  89. }
  90. }
  91. }