SendOrderForceDayStatService.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2017/12/2
  6. * Time: 15:36
  7. */
  8. namespace App\Modules\SendOrder\Services;
  9. use App\Modules\Book\Models\BookConfig;
  10. use App\Modules\Channel\Services\ChannelService;
  11. use App\Modules\SendOrder\Models\SendOrderForceDayStat;
  12. use App\Modules\Trade\Services\OrderService;
  13. use DB;
  14. class SendOrderForceDayStatService
  15. {
  16. //按书统计
  17. static function getSendOrderDayStatsByBook($params)
  18. {
  19. return SendOrderForceDayStat::getSendOrderDayStatsByBook($params);
  20. }
  21. //生成
  22. static function generateForceDayStat($date)
  23. {
  24. $end_send_time = date('Y-m-d H:i:s', strtotime($date) + 86400 - 1);
  25. $fields = DB::raw("
  26. send_order_id,
  27. count(1) paid_num,
  28. sum(price) recharge_amount,
  29. count(distinct uid) pay_user_num
  30. ");
  31. //TODO 解除limit
  32. $order_data = DB::table('orders')->select($fields)->where('status', 'PAID')->where('created_at','>=', $date)->where('created_at','<=', $end_send_time)->groupBy('send_order_id')->get();
  33. $order_data_array = [];
  34. if ($order_data) {
  35. foreach ($order_data as $order) {
  36. $order_data_array[$order->send_order_id] = $order;
  37. }
  38. }
  39. $order_total_fields = DB::raw("
  40. send_order_id,
  41. count(1) order_num
  42. ");
  43. $order_total_data = DB::table('orders')->select($order_total_fields)->where('created_at','>=', $date)->where('created_at','<=', $end_send_time)->groupBy('send_order_id')->get();
  44. $order_total_data_array = [];
  45. if ($order_total_data) {
  46. foreach ($order_total_data as $_order) {
  47. $order_total_data_array[$_order->send_order_id] = $_order;
  48. }
  49. }
  50. //注册用户
  51. $register_fields = DB::raw("
  52. send_order_id,
  53. count(1) num
  54. ");
  55. $register_data = DB::table('users')->select($register_fields)->where('created_at','>=', $date)->where('created_at','<=', $end_send_time)->groupBy('send_order_id')->get();
  56. $register_data_array = [];
  57. if ($register_data) {
  58. foreach ($register_data as $_register_data) {
  59. $register_data_array[$_register_data->send_order_id] = $_register_data->num;
  60. }
  61. }
  62. DB::table('send_orders')->where('is_enable', 1)->where('send_time', '<=', $end_send_time)->orderBy('id')->chunk(1000,function($send_orders) use($date,$order_data_array,$order_total_data_array,$register_data_array){
  63. // $send_orders = SendOrderService::search(compact('end_send_time'), true);
  64. $return_data = [];
  65. foreach ($send_orders as $send_order) {
  66. $data = [];
  67. $data['send_order_id'] = $send_order->id;
  68. $data['date'] = $date;
  69. $data['create_time'] = $send_order->created_at;
  70. $data['name'] = $send_order->name;
  71. $data['charge_type'] = $send_order->charge_type;
  72. if(isset($book_name_array[$send_order->book_id])){
  73. $book_name = $book_name_array[$send_order->book_id];
  74. }else{
  75. $book_name =self::getBookNameByBid($send_order->book_id);
  76. $book_name_array[$send_order->book_id] = $book_name;
  77. }
  78. $data['book_name'] = $book_name;
  79. $data['bid'] = $send_order->book_id;
  80. $uv = SendOrderService::getUvInfo($send_order->id);
  81. $pv = SendOrderService::getPvInfo($send_order->id);
  82. $data['total_uv'] = isset($uv['total']) ? $uv['total'] : 0;
  83. $data['uv'] = isset($uv[$date]) ? $uv[$date] : 0;
  84. $data['total_pv'] = isset($pv['total']) ? $pv['total'] : 0;
  85. $data['pv'] = isset($pv[$date]) ? $pv[$date] : 0;
  86. $data['recharge_amount'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->recharge_amount : 0;
  87. $data['paid_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->paid_num : 0;
  88. $data['unpaid_num'] = isset($order_total_data_array[$send_order->id]) ? $order_total_data_array[$send_order->id]->order_num - $data['paid_num'] : 0;
  89. $data['pay_user_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->pay_user_num : 0;
  90. $data['distribution_channel_id'] = $send_order->distribution_channel_id;
  91. $data['distribution_channel_name'] = ChannelService::getChannelCompanyNameById($send_order->distribution_channel_id);//ChannelService::getChannelNicknameById($send_order->distribution_channel_id);
  92. $data['cost'] = $send_order->cost;
  93. $data['send_time'] = $send_order->send_time;
  94. $total_order_num = $data['unpaid_num'] + $data['paid_num'];
  95. //强关用户数
  96. $force_user_num = DB::table('force_subscribe_users')->where('send_order_id', $send_order->id)->whereDate('created_at', $date)->count();
  97. $data['force_user_num'] = $force_user_num;
  98. //注册用户数
  99. $data['register_user_num'] = isset($register_data_array[$send_order->id]) ? $register_data_array[$send_order->id] : 0;
  100. //首充数据
  101. if ($data['pay_user_num']) {
  102. $begin_time = $date;
  103. $end_time = date("Y-m-d", strtotime($date) + 86400);
  104. $first_data = DB::select("select count(distinct uid) count,sum(price) amount from orders a where created_at>='{$begin_time}' and created_at<'{$end_time}' and send_order_id = '{$send_order->id}' and status ='PAID' and not exists (select uid from orders where a.uid = uid and created_at < '{$begin_time}' and status= 'PAID' limit 1)");
  105. $data['first_recharge_user_num'] = (int)$first_data[0]->count;
  106. $data['first_recharge_amount'] = (float)$first_data[0]->amount;
  107. } else {
  108. $data['first_recharge_user_num'] = 0;
  109. $data['first_recharge_amount'] = 0;
  110. }
  111. //12小时充值数据
  112. if ($send_order->send_time) {
  113. $end_timestamp = min(strtotime($send_order->send_time) + 7 * 24 * 3600, strtotime($date) + 86400);
  114. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  115. $data['recharge_amount_in_two_weeks'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  116. $end_timestamp = min(strtotime($send_order->send_time) + 12 * 3600, strtotime($date) + 86400);
  117. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  118. $data['recharge_amount_in_half_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  119. //24小时
  120. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 24 * 3600,strtotime($date) + 86400));
  121. $data['recharge_amount_in_one_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  122. //3天
  123. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 3 * 24 * 3600,strtotime($date) + 86400));
  124. $data['recharge_amount_in_three_days'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  125. } else {
  126. $data['recharge_amount_in_two_weeks'] = 0;
  127. $data['recharge_amount_in_half_day'] = 0;
  128. $data['recharge_amount_in_one_day'] = 0;
  129. $data['recharge_amount_in_three_days'] = 0;
  130. }
  131. //包年充值用户数
  132. $data['year_recharge_user_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->whereDate('created_at', $date)->where('order_type', 'YEAR')->where('status', 'PAID')->distinct('uid')->where('send_order_id', $send_order->id)->count() : 0;
  133. $data['ticket_recharge_user_num'] = $data['pay_user_num'] - $data['year_recharge_user_num'];
  134. $data['year_paid_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->whereDate('created_at', $date)->where('order_type', 'YEAR')->where('status', 'PAID')->where('send_order_id', $send_order->id)->count() : 0;
  135. $data['year_unpaid_num'] = $total_order_num ? (int)DB::table('orders')->whereDate('created_at', $date)->where('order_type', 'YEAR')->where('status', 'UNPAID')->where('send_order_id', $send_order->id)->count() : 0;
  136. SendOrderForceDayStat::generateForceDayStat($data);
  137. $return_data[] = $data;
  138. }
  139. SendOrderStatService::generateStatsByDayStats($return_data,$date);
  140. });
  141. //return $return_data;
  142. }
  143. /**
  144. * 管理后台获历史取派单信息
  145. * @param $params 字段列表
  146. * @param string $isAll 是否获取所有
  147. * @return mixed
  148. */
  149. static function getHistorySendOrders($params = [], $is_all = false)
  150. {
  151. return SendOrderForceDayStat::getHistorySendOrders($params, $is_all);
  152. }
  153. public static function getSendOrdersRechargeDetail($distribution_channels) {
  154. SendOrderForceDayStat::getBookSendOrdersRechargeStats();
  155. }
  156. private static function getBookNameByBid($bid){
  157. $book = BookConfig::where('bid',$bid)->select('book_name')->first();
  158. if($book)
  159. return $book->book_name;
  160. return 'unknown';
  161. }
  162. }