SendOrderForceDayStatService.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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. use Redis;
  15. class SendOrderForceDayStatService
  16. {
  17. //按书统计
  18. static function getSendOrderDayStatsByBook($params)
  19. {
  20. return SendOrderForceDayStat::getSendOrderDayStatsByBook($params);
  21. }
  22. //生成
  23. static function generateForceDayStat($date)
  24. {
  25. $end_send_time = date('Y-m-d H:i:s', strtotime($date) + 86400 - 1);
  26. $fields = DB::raw("
  27. send_order_id,
  28. count(1) paid_num,
  29. sum(price) recharge_amount,
  30. count(distinct uid) pay_user_num
  31. ");
  32. //TODO 解除limit
  33. $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();
  34. $order_data_array = [];
  35. if ($order_data) {
  36. foreach ($order_data as $order) {
  37. $order_data_array[$order->send_order_id] = $order;
  38. }
  39. }
  40. $order_total_fields = DB::raw("
  41. send_order_id,
  42. count(1) order_num
  43. ");
  44. $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();
  45. $order_total_data_array = [];
  46. if ($order_total_data) {
  47. foreach ($order_total_data as $_order) {
  48. $order_total_data_array[$_order->send_order_id] = $_order;
  49. }
  50. }
  51. //注册用户
  52. $register_fields = DB::raw("
  53. send_order_id,
  54. count(1) num
  55. ");
  56. $register_data = DB::table('users')->select($register_fields)->where('created_at','>=', $date)->where('created_at','<=', $end_send_time)->groupBy('send_order_id')->get();
  57. $register_data_array = [];
  58. if ($register_data) {
  59. foreach ($register_data as $_register_data) {
  60. $register_data_array[$_register_data->send_order_id] = $_register_data->num;
  61. }
  62. }
  63. //满足有订单,有注册用户,有访问其中之一的派单才进行统计
  64. $send_order_list_has_order = $order_total_data->pluck('send_order_id')->toArray();
  65. $send_order_list_has_register = $register_data->pluck('send_order_id')->toArray();
  66. $send_order_list_has_visit = Redis::SMEMBERS('send_order'.$date);
  67. $send_order_list = array_values(array_unique(array_merge($send_order_list_has_order,$send_order_list_has_register,$send_order_list_has_visit)));
  68. foreach ($chunk_result = array_chunk($send_order_list, 500) as $send_order_ids)
  69. {
  70. $send_orders = DB::table('send_orders')->whereIn('id',$send_order_ids)->where('send_time', '>', '2019-01-01')->where('send_time', '<=', $end_send_time)->get();
  71. $return_data = [];
  72. foreach ($send_orders as $send_order) {
  73. $data = [];
  74. $data['send_order_id'] = $send_order->id;
  75. $data['date'] = $date;
  76. $data['create_time'] = $send_order->created_at;
  77. $data['name'] = $send_order->name;
  78. $data['charge_type'] = $send_order->charge_type;
  79. if(isset($book_name_array[$send_order->book_id])){
  80. $book_name = $book_name_array[$send_order->book_id];
  81. }else{
  82. $book_name =self::getBookNameByBid($send_order->book_id);
  83. $book_name_array[$send_order->book_id] = $book_name;
  84. }
  85. $data['book_name'] = $book_name;
  86. $data['bid'] = $send_order->book_id;
  87. $uv = SendOrderService::getUvInfo($send_order->id);
  88. $pv = SendOrderService::getPvInfo($send_order->id);
  89. $data['total_uv'] = isset($uv['total']) ? $uv['total'] : 0;
  90. $data['uv'] = isset($uv[$date]) ? $uv[$date] : 0;
  91. $data['total_pv'] = isset($pv['total']) ? $pv['total'] : 0;
  92. $data['pv'] = isset($pv[$date]) ? $pv[$date] : 0;
  93. $data['recharge_amount'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->recharge_amount : 0;
  94. $data['paid_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->paid_num : 0;
  95. $data['unpaid_num'] = isset($order_total_data_array[$send_order->id]) ? $order_total_data_array[$send_order->id]->order_num - $data['paid_num'] : 0;
  96. $data['pay_user_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->pay_user_num : 0;
  97. $data['distribution_channel_id'] = $send_order->distribution_channel_id;
  98. $data['distribution_channel_name'] = ChannelService::getChannelCompanyNameById($send_order->distribution_channel_id);//ChannelService::getChannelNicknameById($send_order->distribution_channel_id);
  99. $data['cost'] = $send_order->cost;
  100. $data['send_time'] = $send_order->send_time;
  101. $total_order_num = $data['unpaid_num'] + $data['paid_num'];
  102. //强关用户数
  103. $force_user_num = DB::table('force_subscribe_users')
  104. ->where('send_order_id', $send_order->id)
  105. ->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))
  106. ->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))
  107. ->count();
  108. $data['force_user_num'] = $force_user_num;
  109. //注册用户数
  110. $data['register_user_num'] = isset($register_data_array[$send_order->id]) ? $register_data_array[$send_order->id] : 0;
  111. //首充数据
  112. if ($data['pay_user_num']) {
  113. $begin_time = $date;
  114. $end_time = date("Y-m-d", strtotime($date) + 86400);
  115. // $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)");
  116. $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 pay_type=1");
  117. $data['first_recharge_user_num'] = (int)$first_data[0]->count;
  118. $data['first_recharge_amount'] = (float)$first_data[0]->amount;
  119. } else {
  120. $data['first_recharge_user_num'] = 0;
  121. $data['first_recharge_amount'] = 0;
  122. }
  123. //12小时充值数据
  124. if ($send_order->send_time) {
  125. $end_timestamp = min(strtotime($send_order->send_time) + 14 * 24 * 3600, strtotime($date) + 86400);
  126. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  127. $data['recharge_amount_in_two_weeks'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  128. $end_timestamp = min(strtotime($send_order->send_time) + 12 * 3600, strtotime($date) + 86400);
  129. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  130. $data['recharge_amount_in_half_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  131. //24小时
  132. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 24 * 3600,strtotime($date) + 86400));
  133. $data['recharge_amount_in_one_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  134. //3天
  135. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 3 * 24 * 3600,strtotime($date) + 86400));
  136. $data['recharge_amount_in_three_days'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  137. } else {
  138. $data['recharge_amount_in_two_weeks'] = 0;
  139. $data['recharge_amount_in_half_day'] = 0;
  140. $data['recharge_amount_in_one_day'] = 0;
  141. $data['recharge_amount_in_three_days'] = 0;
  142. }
  143. //包年充值用户数
  144. $data['year_recharge_user_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'PAID')->distinct('uid')->where('send_order_id', $send_order->id)->count() : 0;
  145. $data['ticket_recharge_user_num'] = $data['pay_user_num'] - $data['year_recharge_user_num'];
  146. $data['year_paid_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'PAID')->where('send_order_id', $send_order->id)->count() : 0;
  147. $data['year_unpaid_num'] = $total_order_num ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'UNPAID')->where('send_order_id', $send_order->id)->count() : 0;
  148. SendOrderForceDayStat::generateForceDayStat($data);
  149. $return_data[] = $data;
  150. }
  151. SendOrderStatService::generateStatsByDayStats($return_data,$date);
  152. //});
  153. }
  154. //return $return_data;
  155. }
  156. static function generateSingleForceDayStat($send_order_id,$date)
  157. {
  158. $end_send_time = date('Y-m-d H:i:s', strtotime($date) + 86400 - 1);
  159. $fields = DB::raw("
  160. send_order_id,
  161. count(1) paid_num,
  162. sum(price) recharge_amount,
  163. count(distinct uid) pay_user_num
  164. ");
  165. //TODO 解除limit
  166. $order_data = DB::table('orders')->select($fields)
  167. ->where('status', 'PAID')->where('created_at','>=', $date)
  168. ->where('send_order_id',$send_order_id)
  169. ->where('created_at','<=', $end_send_time)->groupBy('send_order_id')->get();
  170. $order_data_array = [];
  171. if ($order_data) {
  172. foreach ($order_data as $order) {
  173. $order_data_array[$order->send_order_id] = $order;
  174. }
  175. }
  176. $order_total_fields = DB::raw("
  177. send_order_id,
  178. count(1) order_num
  179. ");
  180. $order_total_data = DB::table('orders')->select($order_total_fields)
  181. ->where('created_at','>=', $date)
  182. ->where('created_at','<=', $end_send_time)
  183. ->where('send_order_id',$send_order_id)
  184. ->groupBy('send_order_id')->get();
  185. $order_total_data_array = [];
  186. if ($order_total_data) {
  187. foreach ($order_total_data as $_order) {
  188. $order_total_data_array[$_order->send_order_id] = $_order;
  189. }
  190. }
  191. //注册用户
  192. $register_fields = DB::raw("
  193. send_order_id,
  194. count(1) num
  195. ");
  196. $register_data = DB::table('users')->select($register_fields)
  197. ->where('created_at','>=', $date)
  198. ->where('created_at','<=', $end_send_time)
  199. ->where('send_order_id',$send_order_id)
  200. ->groupBy('send_order_id')->get();
  201. $register_data_array = [];
  202. if ($register_data) {
  203. foreach ($register_data as $_register_data) {
  204. $register_data_array[$_register_data->send_order_id] = $_register_data->num;
  205. }
  206. }
  207. DB::table('send_orders')->where('is_enable', 1)
  208. //->where('send_time', '<=', $end_send_time)
  209. ->where('id', '<=', $send_order_id)
  210. ->orderBy('id')->chunk(1000,function($send_orders) use($date,$order_data_array,$order_total_data_array,$register_data_array){
  211. // $send_orders = SendOrderService::search(compact('end_send_time'), true);
  212. $return_data = [];
  213. foreach ($send_orders as $send_order) {
  214. $data = [];
  215. $data['send_order_id'] = $send_order->id;
  216. $data['date'] = $date;
  217. $data['create_time'] = $send_order->created_at;
  218. $data['name'] = $send_order->name;
  219. $data['charge_type'] = $send_order->charge_type;
  220. if(isset($book_name_array[$send_order->book_id])){
  221. $book_name = $book_name_array[$send_order->book_id];
  222. }else{
  223. $book_name =self::getBookNameByBid($send_order->book_id);
  224. $book_name_array[$send_order->book_id] = $book_name;
  225. }
  226. $data['book_name'] = $book_name;
  227. $data['bid'] = $send_order->book_id;
  228. $uv = SendOrderService::getUvInfo($send_order->id);
  229. $pv = SendOrderService::getPvInfo($send_order->id);
  230. $data['total_uv'] = isset($uv['total']) ? $uv['total'] : 0;
  231. $data['uv'] = isset($uv[$date]) ? $uv[$date] : 0;
  232. $data['total_pv'] = isset($pv['total']) ? $pv['total'] : 0;
  233. $data['pv'] = isset($pv[$date]) ? $pv[$date] : 0;
  234. $data['recharge_amount'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->recharge_amount : 0;
  235. $data['paid_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->paid_num : 0;
  236. $data['unpaid_num'] = isset($order_total_data_array[$send_order->id]) ? $order_total_data_array[$send_order->id]->order_num - $data['paid_num'] : 0;
  237. $data['pay_user_num'] = isset($order_data_array[$send_order->id]) ? $order_data_array[$send_order->id]->pay_user_num : 0;
  238. $data['distribution_channel_id'] = $send_order->distribution_channel_id;
  239. $data['distribution_channel_name'] = ChannelService::getChannelCompanyNameById($send_order->distribution_channel_id);//ChannelService::getChannelNicknameById($send_order->distribution_channel_id);
  240. $data['cost'] = $send_order->cost;
  241. $data['send_time'] = $send_order->send_time;
  242. $total_order_num = $data['unpaid_num'] + $data['paid_num'];
  243. //强关用户数
  244. $force_user_num = DB::table('force_subscribe_users')
  245. ->where('send_order_id', $send_order->id)
  246. ->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))
  247. ->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))
  248. ->count();
  249. $data['force_user_num'] = $force_user_num;
  250. //注册用户数
  251. $data['register_user_num'] = isset($register_data_array[$send_order->id]) ? $register_data_array[$send_order->id] : 0;
  252. //首充数据
  253. if ($data['pay_user_num']) {
  254. $begin_time = $date;
  255. $end_time = date("Y-m-d", strtotime($date) + 86400);
  256. $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)");
  257. $data['first_recharge_user_num'] = (int)$first_data[0]->count;
  258. $data['first_recharge_amount'] = (float)$first_data[0]->amount;
  259. } else {
  260. $data['first_recharge_user_num'] = 0;
  261. $data['first_recharge_amount'] = 0;
  262. }
  263. //12小时充值数据
  264. if ($send_order->send_time) {
  265. $end_timestamp = min(strtotime($send_order->send_time) + 7 * 24 * 3600, strtotime($date) + 86400);
  266. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  267. $data['recharge_amount_in_two_weeks'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  268. $end_timestamp = min(strtotime($send_order->send_time) + 12 * 3600, strtotime($date) + 86400);
  269. $end_time = date("Y-m-d H:i:s", $end_timestamp);
  270. $data['recharge_amount_in_half_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  271. //24小时
  272. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 24 * 3600,strtotime($date) + 86400));
  273. $data['recharge_amount_in_one_day'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  274. //3天
  275. $end_time = date("Y-m-d H:i:s", min(strtotime($send_order->send_time) + 3 * 24 * 3600,strtotime($date) + 86400));
  276. $data['recharge_amount_in_three_days'] = OrderService::getAmount(['send_order_id' => $send_order->id, 'end_time' => $end_time]);
  277. } else {
  278. $data['recharge_amount_in_two_weeks'] = 0;
  279. $data['recharge_amount_in_half_day'] = 0;
  280. $data['recharge_amount_in_one_day'] = 0;
  281. $data['recharge_amount_in_three_days'] = 0;
  282. }
  283. //包年充值用户数
  284. $data['year_recharge_user_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'PAID')->distinct('uid')->where('send_order_id', $send_order->id)->count() : 0;
  285. $data['ticket_recharge_user_num'] = $data['pay_user_num'] - $data['year_recharge_user_num'];
  286. $data['year_paid_num'] = $data['pay_user_num'] ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'PAID')->where('send_order_id', $send_order->id)->count() : 0;
  287. $data['year_unpaid_num'] = $total_order_num ? (int)DB::table('orders')->where('created_at','>=',date('Y-m-d 00:00:00',strtotime($date)))->where('created_at','<=',date('Y-m-d 23:59:59',strtotime($date)))->where('order_type', 'YEAR')->where('status', 'UNPAID')->where('send_order_id', $send_order->id)->count() : 0;
  288. SendOrderForceDayStat::generateForceDayStat($data);
  289. $return_data[] = $data;
  290. }
  291. SendOrderStatService::generateStatsByDayStats($return_data,$date);
  292. });
  293. //return $return_data;
  294. }
  295. /**
  296. * 管理后台获历史取派单信息
  297. * @param $params 字段列表
  298. * @param string $isAll 是否获取所有
  299. * @return mixed
  300. */
  301. static function getHistorySendOrders($params = [], $is_all = false)
  302. {
  303. return SendOrderForceDayStat::getHistorySendOrders($params, $is_all);
  304. }
  305. public static function getSendOrdersRechargeDetail($distribution_channels) {
  306. SendOrderForceDayStat::getBookSendOrdersRechargeStats();
  307. }
  308. private static function getBookNameByBid($bid){
  309. $book = BookConfig::where('bid',$bid)->select('book_name')->first();
  310. if($book)
  311. return $book->book_name;
  312. return 'unknown';
  313. }
  314. public static function getSendOrdersDayStatsByBid($date) {
  315. $sql = "select bid, book_name,sum(recharge_amount) as rechareg_amount,sum(uv) uv,
  316. sum(pv) pv,sum(paid_num) success_order_num,book_categories.pid as type,date,
  317. sum(unpaid_num) as unpaid_num,sum(register_user_num) as register_user_num,NOW() as created_at,NOW() as updated_at
  318. from send_orders_force_day_stats force index(date_bid)
  319. inner join books on books.id=send_orders_force_day_stats.bid
  320. INNER JOIN book_categories ON book_categories.id=books.category_id
  321. where total_uv > 20 and date ='{$date}'
  322. group by bid";
  323. return \DB::select($sql);
  324. }
  325. }