SendOrderDayStatsCommand.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace App\Console\DyReport;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Redis;
  6. class SendOrderDayStatsCommand extends Command
  7. {
  8. /**
  9. * The name and signature of the console command.
  10. *
  11. * @var string
  12. */
  13. protected $signature = 'SendOrderDayStats {--day=} {--id=}';
  14. /**
  15. * The console command description.
  16. *
  17. * @var string
  18. */
  19. protected $description = '每日0点统计昨日各派单链接相关数据';
  20. /**
  21. * Create a new command instance.
  22. *
  23. * @return void
  24. */
  25. public function __construct()
  26. {
  27. parent::__construct();
  28. }
  29. /**
  30. * Execute the console command.
  31. *
  32. * @return mixed
  33. */
  34. public function handle()
  35. {
  36. dLog('command_logs')->info('~~~~~~~~~~~~~~~~~~~~~~~~~~开始统计昨日各派单链接相关数据~~~~~~~~~~~~~~~~~~~~~~~~~~');
  37. $executeStart = microtime(true);
  38. $date = $this->option('day');
  39. $send_order_id = $this->option('id');
  40. if ($date) { // 指定日期
  41. $day = $date;
  42. $start = date($date.' 00:00:00');
  43. $end = date($date.' 23:59:59');
  44. }else { // 未指定日期则默认昨日
  45. $day = date('Y-m-d', strtotime('-1 day'));
  46. $start = date('Y-m-d 00:00:00', strtotime('-1 day'));
  47. $end = date('Y-m-d 23:59:59', strtotime('-1 day'));
  48. }
  49. $query= DB::table('send_orders')->where('is_enable', '1')->where('created_at', '<', $end);
  50. if ($send_order_id) {
  51. $query->where('id', $send_order_id);
  52. }
  53. $send_orders = $query->select('id', 'uv', 'cost', 'total_register_pay_amount', 'total_profit', 'total_register_num', 'total_register_pay_num')
  54. ->get()->map(function ($value) {
  55. return (array)$value;
  56. })->toArray();
  57. foreach ($send_orders as $send_order) {
  58. $send_order_id = getProp($send_order, 'id');
  59. // 获取指定日期成本
  60. $cost = DB::table('send_order_day_stats')->where('send_order_id', $send_order_id)->where('day', $day)->value('cost');
  61. // 新增注册人数
  62. $register_num = DB::table('users')->where('send_order_id', $send_order_id)->whereBetween('created_at', [$start, $end])->count('id');
  63. // 注册充值人数(只计算首充)
  64. $register_pay_num = DB::table('orders')->leftJoin('users', 'orders.uid', 'users.id')->where('users.send_order_id', $send_order_id)
  65. ->where('orders.send_order_id', $send_order_id)->whereBetween('users.created_at', [$start, $end])
  66. ->where('orders.status', 'PAID')->whereBetween('orders.created_at', [$start, $end])->where('orders.pay_num', 1)->count('orders.id');
  67. // 注册用户充值金额(包含多充)
  68. $register_pay_amount = DB::table('users')->leftJoin('orders', 'orders.uid', 'users.id')->where('users.send_order_id', $send_order_id)
  69. ->where('orders.send_order_id', $send_order_id)->whereBetween('users.created_at', [$start, $end])
  70. ->where('orders.status', 'PAID')->whereBetween('orders.created_at', [$start, $end])->sum('orders.price');
  71. // 获取日数据汇总(指定日期之前的汇总)
  72. $total_data = DB::table('send_order_day_stats')->where('send_order_id', $send_order_id)
  73. ->where('day', '<', $day)->select(
  74. DB::raw('sum(cost) as total_cost'),
  75. DB::raw('sum(register_num) as total_register_num'),
  76. DB::raw('sum(register_pay_amount) as total_register_pay_amount'),
  77. DB::raw('sum(register_pay_num) as total_register_pay_num'),
  78. )->first();
  79. // 累计成本
  80. $total_cost = $cost + getProp($total_data, 'total_cost', 0);
  81. // 累计注册人数
  82. $total_register_num = $register_num + getProp($total_data, 'total_register_num', 0);
  83. // 累计充值金额(包含多充)
  84. $total_register_pay_amount = $register_pay_amount + getProp($total_data, 'total_register_pay_amount', 0);
  85. // 累计充值人数(只计算首充)
  86. $total_register_pay_num = $register_pay_num + getProp($total_data, 'total_register_pay_num', 0);
  87. // 累计盈利
  88. $total_profit = $total_register_pay_amount - $total_cost;
  89. $data = [
  90. 'send_order_id' => $send_order_id,
  91. 'day' => $day,
  92. 'register_num' => $register_num,
  93. 'register_pay_num' => $register_pay_num,
  94. 'register_pay_amount' => $register_pay_amount,
  95. // 'total_cost' => $total_cost,
  96. // 'total_profit' => $total_profit,
  97. // 'total_register_num' => $total_register_num,
  98. // 'total_register_pay_num' => $total_register_pay_num,
  99. // 'total_register_pay_amount' => $total_register_pay_amount,
  100. 'created_at' => date('Y-m-d H:i:s'),
  101. 'updated_at' => date('Y-m-d H:i:s'),
  102. ];
  103. // 更新派单数据日表
  104. $boolen = DB::table('send_order_day_stats')->updateOrInsert([
  105. 'send_order_id' => $send_order_id,
  106. 'day' => $day,
  107. ], $data);
  108. if (!$boolen) {
  109. dLog('command_logs')->info('派单链接日表统计失败: ', $data);
  110. }
  111. // 获取uv数据
  112. $uv = Redis::scard('send_order_uv_'.$send_order_id);
  113. $uv = $uv ? $uv : 0;
  114. $total_data = [
  115. 'uv' => $uv,
  116. 'cost' => $total_cost,
  117. 'total_register_pay_amount' => $total_register_pay_amount,
  118. 'total_profit' => $total_profit,
  119. 'total_register_num' => $total_register_num,
  120. 'total_register_pay_num' => $total_register_pay_num,
  121. 'updated_at' => date('Y-m-d H:i:s')
  122. ];
  123. // 更新派单数据总表
  124. $boolen1 = DB::table('send_orders')->where('id', $send_order_id)->update($total_data);
  125. if (!$boolen1) {
  126. $total_data['send_order_id'] = $send_order_id;
  127. dLog('command_logs')->info('派单链接总表统计失败: ', $total_data);
  128. }
  129. }
  130. $executeEnd = microtime(true);
  131. dLog('command_logs')->info('脚本运行时间: ', ['execute_time'=>round(($executeEnd - $executeStart), 6).'s']);
  132. dLog('command_logs')->info('~~~~~~~~~~~~~~~~~~~~~~~~~~结束统计昨日各派单链接相关数据~~~~~~~~~~~~~~~~~~~~~~~~~~');
  133. }
  134. }