| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | <?phpnamespace App\Modules\SendOrder\Services;use App\Modules\Order\Services\OrderService;use App\Modules\SendOrder\Models\SendOrder;use App\Modules\SendOrder\Models\SendOrderRechargeDayStat;class SendOrderChargeStatService{    /**     * 根据日期获取订单信息     * @param string $date     * @return bool     */    public static function getOrdersByDate(string $date): bool    {        myLog('getOrdersByDate')->info('[start] ' . date('Y-m-d H:i:s'));        // 计算时间        $timestamp = strtotime($date);        [$startTime, $endTime] = [date('Y-m-d', $timestamp), date('Y-m-d 23:59:59', $timestamp)];        myLog('getOrdersByDate')->info('1', compact('startTime', 'endTime'));        // 获取订单信息        $instance = new OrderService();        $orders   = $instance->getSendOrdersByDate($startTime, $endTime);        myLog('getOrdersByDate')->info('2', ['orders_num' => count($orders)]);        if (empty($orders)) {            return false;        }        // 获取所有派单        $sendOrderIds = array_unique(array_values(array_column($orders, 'send_order_id')));        $sendOrders   = SendOrder::getSendOrdersByIds($sendOrderIds);        myLog('getOrdersByDate')->info('2', ['sendOrderIds' => count($sendOrderIds)]);        // 组装数据        $insertDataList = self::buildRechargeStats($date, $sendOrderIds, $sendOrders, $orders);        $insertDataArr  = array_chunk($insertDataList, 500);        foreach ($insertDataArr as $insertData) {            SendOrderRechargeDayStat::insertData($insertData);        }        myLog('getOrdersByDate')->info('[end] ' . date('Y-m-d H:i:s'));        return true;    }    /**     * @param $date     * @param $sendOrderIds     * @param $sendOrders     * @param $orders     * @return array     */    private static function buildRechargeStats($date, $sendOrderIds, $sendOrders, $orders): array    {        // 重组派单信息        $sendOrdersArr = array_column($sendOrders, NULL, 'id');        // 初始化        $sendOrderStats   = [];        $paidOrderUidList = [];        foreach ($sendOrderIds as $sendOrderId) {            $sendOrder = getProp($sendOrdersArr, $sendOrderId);            if (!$sendOrder) {                continue;            }            $paidOrderUidList[$sendOrderId] = [];            $sendOrderStats[$sendOrderId]   = [                'send_order_id'           => $sendOrderId,                'distribution_channel_id' => getProp($sendOrder, 'distribution_channel_id'),                'book_name'               => getProp($sendOrder, 'book_name'),                'bid'                     => getProp($sendOrder, 'book_id'),                'recharge_amount'         => 0.00,                'order_num'               => 0,                'paid_order_num'          => 0,                'unpaid_order_num'        => 0,                'paid_user_num'           => 0,                'date'                    => $date,                'created_at'              => date('Y-m-d H:i:s'),                'updated_at'              => date('Y-m-d H:i:s'),            ];        }        // 循环订单信息        foreach ($orders as $order) {            $sendOrderId = getProp($order, 'send_order_id');            $orderStatus = getProp($order, 'status');            if (getProp($sendOrderStats, $sendOrderId)) {                // 订单总数                $sendOrderStats[$sendOrderId]['order_num'] += 1;                // 区分支付订单和未支付订单                if ($orderStatus === 'PAID') {                    // 支付总额、支付订单数、支付用户集合                    $sendOrderStats[$sendOrderId]['recharge_amount'] += (float)getProp($order, 'price');                    $sendOrderStats[$sendOrderId]['paid_order_num']  += 1;                    $paidOrderUidList[$sendOrderId][]                = getProp($order, 'uid');                } else {                    // 未支付数                    $sendOrderStats[$sendOrderId]['unpaid_order_num'] += 1;                }            }        }        // 重新循环stats        $result = [];        foreach ($sendOrderStats as $sendOrderId => $sendOrderStat) {            // 过滤掉没有支付的派单            if ((int)getProp($sendOrderStat, 'paid_order_num') < 1) {                continue;            }            $item        = $sendOrderStat;            $paidUidList = getProp($paidOrderUidList, $sendOrderId);            if ($paidUidList) {                $paidUserNum           = count(array_unique($paidUidList));                $item['paid_user_num'] = $paidUserNum;            }            $result[] = $item;        }        return $result;    }    /**     * @param $date     * @return bool     */    public static function deleteSendOrderStatsByDate($date)    {        myLog('getOrdersByDate')->info('[delete] 删除已存在数据');        return SendOrderRechargeDayStat::deleteData(['date' => $date]);    }}
 |