SendOrderChargeStatService.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Modules\SendOrder\Services;
  3. use App\Modules\Order\Services\OrderService;
  4. use App\Modules\SendOrder\Models\SendOrder;
  5. use App\Modules\SendOrder\Models\SendOrderRechargeDayStat;
  6. class SendOrderChargeStatService
  7. {
  8. /**
  9. * 根据日期获取订单信息
  10. * @param string $date
  11. * @return bool
  12. */
  13. public static function getOrdersByDate(string $date): bool
  14. {
  15. myLog('getOrdersByDate')->info('[start] ' . date('Y-m-d H:i:s'));
  16. // 计算时间
  17. $timestamp = strtotime($date);
  18. [$startTime, $endTime] = [date('Y-m-d', $timestamp), date('Y-m-d 23:59:59', $timestamp)];
  19. myLog('getOrdersByDate')->info('1', compact('startTime', 'endTime'));
  20. // 获取订单信息
  21. $instance = new OrderService();
  22. $orders = $instance->getSendOrdersByDate($startTime, $endTime);
  23. myLog('getOrdersByDate')->info('2', ['orders_num' => count($orders)]);
  24. if (empty($orders)) {
  25. return false;
  26. }
  27. // 获取所有派单
  28. $sendOrderIds = array_unique(array_values(array_column($orders, 'send_order_id')));
  29. $sendOrders = SendOrder::getSendOrdersByIds($sendOrderIds);
  30. myLog('getOrdersByDate')->info('2', ['sendOrderIds' => count($sendOrderIds)]);
  31. // 组装数据
  32. $insertDataList = self::buildRechargeStats($date, $sendOrderIds, $sendOrders, $orders);
  33. $insertDataArr = array_chunk($insertDataList, 500);
  34. foreach ($insertDataArr as $insertData) {
  35. SendOrderRechargeDayStat::insertData($insertData);
  36. }
  37. myLog('getOrdersByDate')->info('[end] ' . date('Y-m-d H:i:s'));
  38. return true;
  39. }
  40. /**
  41. * @param $date
  42. * @param $sendOrderIds
  43. * @param $sendOrders
  44. * @param $orders
  45. * @return array
  46. */
  47. private static function buildRechargeStats($date, $sendOrderIds, $sendOrders, $orders): array
  48. {
  49. // 重组派单信息
  50. $sendOrdersArr = array_column($sendOrders, NULL, 'id');
  51. // 初始化
  52. $sendOrderStats = [];
  53. $paidOrderUidList = [];
  54. foreach ($sendOrderIds as $sendOrderId) {
  55. $sendOrder = getProp($sendOrdersArr, $sendOrderId);
  56. if (!$sendOrder) {
  57. continue;
  58. }
  59. $paidOrderUidList[$sendOrderId] = [];
  60. $sendOrderStats[$sendOrderId] = [
  61. 'send_order_id' => $sendOrderId,
  62. 'distribution_channel_id' => getProp($sendOrder, 'distribution_channel_id'),
  63. 'book_name' => getProp($sendOrder, 'book_name'),
  64. 'bid' => getProp($sendOrder, 'book_id'),
  65. 'recharge_amount' => 0.00,
  66. 'order_num' => 0,
  67. 'paid_order_num' => 0,
  68. 'unpaid_order_num' => 0,
  69. 'paid_user_num' => 0,
  70. 'date' => $date,
  71. 'created_at' => date('Y-m-d H:i:s'),
  72. 'updated_at' => date('Y-m-d H:i:s'),
  73. ];
  74. }
  75. // 循环订单信息
  76. foreach ($orders as $order) {
  77. $sendOrderId = getProp($order, 'send_order_id');
  78. $orderStatus = getProp($order, 'status');
  79. if (getProp($sendOrderStats, $sendOrderId)) {
  80. // 订单总数
  81. $sendOrderStats[$sendOrderId]['order_num'] += 1;
  82. // 区分支付订单和未支付订单
  83. if ($orderStatus === 'PAID') {
  84. // 支付总额、支付订单数、支付用户集合
  85. $sendOrderStats[$sendOrderId]['recharge_amount'] += (float)getProp($order, 'price');
  86. $sendOrderStats[$sendOrderId]['paid_order_num'] += 1;
  87. $paidOrderUidList[$sendOrderId][] = getProp($order, 'uid');
  88. } else {
  89. // 未支付数
  90. $sendOrderStats[$sendOrderId]['unpaid_order_num'] += 1;
  91. }
  92. }
  93. }
  94. // 重新循环stats
  95. $result = [];
  96. foreach ($sendOrderStats as $sendOrderId => $sendOrderStat) {
  97. // 过滤掉没有支付的派单
  98. if ((int)getProp($sendOrderStat, 'paid_order_num') < 1) {
  99. continue;
  100. }
  101. $item = $sendOrderStat;
  102. $paidUidList = getProp($paidOrderUidList, $sendOrderId);
  103. if ($paidUidList) {
  104. $paidUserNum = count(array_unique($paidUidList));
  105. $item['paid_user_num'] = $paidUserNum;
  106. }
  107. $result[] = $item;
  108. }
  109. return $result;
  110. }
  111. /**
  112. * @param $date
  113. * @return bool
  114. */
  115. public static function deleteSendOrderStatsByDate($date)
  116. {
  117. myLog('getOrdersByDate')->info('[delete] 删除已存在数据');
  118. return SendOrderRechargeDayStat::deleteData(['date' => $date]);
  119. }
  120. }