$groupUserIds], ]; $date = $params['date'] ?? []; empty($date) && $with = [ 'userAchievementStatisticsTotal' => function ($query) { $query->select('user_id, user_order_num, pay_selling_price, user_goods_price_total'); } ]; $list = User::listPage([ 'with' => $with ?? [], 'select' => 'id, nickname, avatar_url, mobile, level', 'where' => $userBaseWhere, 'limit' => $params['limit'] ?? 10 ]); if ($list === false) { return false; } if (empty($list['list'])) { return $list; } $userStatistics = []; // 按日期查 $where = [ ['user_id' => $groupUserIds], ]; if ($date) { $date = array_map(function ($val) { return is_numeric($val) ? $val : date('Ymd', strtotime($val)); }, $date); $where[] = ['between', 'date', reset($date), end($date)]; } $userStatisticsFind = UserAchievementStatistics::find(); UserAchievementStatistics::paramPack([ 'select' => 'user_id, SUM(user_order_num) total_order_num, SUM(user_goods_price_total) total_achievement, SUM(pay_selling_price) total_product_amount, mall_id', 'where' => $where, 'group' => 'user_id', 'index' => 'user_id' ], $userStatisticsFind); $userStatistics = $userStatisticsFind->asArray()->all(); array_walk($list['list'], function (&$item) use ($userStatistics) { $item['total_order_num'] = $userStatistics[$item['id']]['total_order_num'] ?? ($item['userStatisticsTotal']['user_order_num'] ?? 0); $item['total_product_amount'] = $userStatistics[$item['id']]['total_product_amount'] ?? ($item['userStatisticsTotal']['pay_selling_price'] ?? 0); $item['total_achievement'] = $userStatistics[$item['id']]['total_achievement'] ?? ($item['userStatisticsTotal']['user_goods_price_total'] ?? 0); }); // 不包含自己的(群组订单数、群组订单金额、群组订单业绩) $list['other_data'] = $this->getGroupLeaderStatisticsTotal($params['user_id'], $date); $thisMonth = DateHelper::thisMonth(); $list['other_data']['default_date_filter'] = [ date('Y-m-d', $thisMonth['start']), date('Y-m-d', $thisMonth['end']) ]; return $list; } public function getGroupLeaderStatisticsTotal(int $userId, array $date): array { if ($date) { $date = array_map(function ($val) { return is_numeric($val) ? $val : date('Ymd', strtotime($val)); }, $date); // 群组数据 $userTeamDateStatisticsSelect = 'SUM(team_order_num) team_order_num, ' . 'SUM(team_pay_selling_price) team_pay_selling_price, ' . 'SUM(team_goods_price_total) team_goods_price_total'; $groupDataStatisticsTotalFind = UserTeamDateAchievementStatistics::setTableNumAndReturnSelf($userId, false)->asArray(); UserTeamDateAchievementStatistics::paramPack([ 'select' => $userTeamDateStatisticsSelect, 'where' => [ ['user_id' => $userId], ['between', 'date', reset($date), end($date)] ], 'group' => 'user_id', ], $groupDataStatisticsTotalFind); $userTeamStatisticsData = $groupDataStatisticsTotalFind->one(); // 自己的数据 $userStatisticsSelect = 'SUM(user_order_num) user_order_num, ' . 'SUM(pay_selling_price) pay_selling_price, ' . 'SUM(user_goods_price_total) user_goods_price_total'; $userStatisticsDataFind = UserAchievementStatistics::find()->asArray(); UserAchievementStatistics::paramPack([ 'select' => $userStatisticsSelect, 'where' => [ ['user_id' => $userId], ['between', 'date', reset($date), end($date)] ], 'group' => 'user_id', ], $userStatisticsDataFind); $userStatisticsData = $userStatisticsDataFind->one(); } else { // 群组数据 $userTeamStatisticsData = UserTeamAchievementStatistics::getOne( [['user_id' => $userId]], true, [], false, 'team_pay_selling_price, team_goods_price_total, team_order_num' ); // 自己的数据 $userStatisticsData = UserAchievementStatisticsTotal::getOne( [['user_id' => $userId]], true, [], false, 'user_order_num, pay_selling_price, user_goods_price_total' ); } return [ 'child_total_order_num' => bcadd( ($userTeamStatisticsData['team_order_num'] ?? 0), ($userStatisticsData['user_order_num'] ?? 0), 2 ), 'child_total_product_amount' => bcadd( ($userTeamStatisticsData['team_pay_selling_price'] ?? 0), ($userStatisticsData['pay_selling_price'] ?? 0), 2 ), 'child_total_achievement' => bcadd( ($userTeamStatisticsData['team_goods_price_total'] ?? 0), ($userStatisticsData['user_goods_price_total'] ?? 0), 2 ), ]; } public function getGroupDetail(array $params = []): array { $date = $params['date'] ?? []; $limit = $params['limit'] ?? 10; $direct = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);// 直推 $indirect = UserPartitionRelationship::getChildIdArr($params['user_id'], 2);// 间推 $getChildIdArr = array_merge($direct, $indirect, [$params['user_id']]);// 包含自己 // 只查询业绩订单 $achievementOrderIdsColumn = OrderAchievementGoods::find() ->where(['user_id' => $getChildIdArr]) ->select('order_id') ->column(); $where = [ [ 'id' => $achievementOrderIdsColumn, 'pay_status' => OrderStatusEnum::PAY, 'status' => StatusEnum::ENABLED, ], ]; if ($date) { $date[1] .= ' 23:59:59'; $date2Timestamp = array_map(function ($val) { return strtotime($val); }, $date); $where[] = ['between', 'created_at', reset($date2Timestamp), end($date2Timestamp)]; } // 查询出因换货导致总订单表的order_status = OrderStatusEnum::REPEAL 的订单 $repealOrderFind = Order::find(); Order::paramPack(['where' => $where, 'select' => 'id'], $repealOrderFind); $repealOrderIds = $repealOrderFind->column(); $exchangeOrderIds = OrderRefund::find() ->where(['order_id' => $repealOrderIds, 'refund_status' => RefundStatusEnum::FINISH, 'type' => RefundTypeEnum::EXCHANGE_GOODS]) ->select('order_id') ->column(); // 不显示已经关闭的订单 或者 已经关闭的订单但是售后是换货导致的订单关闭 if ($exchangeOrderIds) { $where[] = ['or', ['!=', 'order_status', OrderStatusEnum::REPEAL], ['in', 'id', $exchangeOrderIds]]; }else { // 正常订单的条件 $where[] = ['!=', 'order_status', OrderStatusEnum::REPEAL]; } $orderList = Order::listPage([ 'where' => $where, 'select' => 'id, user_id, goods_price, order_no, shipping_money, created_at, pay_time, original_goods_price', 'with' => [ 'user' => function ($query) { $query->select('id, mobile, level, nickname, avatar_url'); } ], 'limit' => $limit, 'order' => 'id desc' ]); // 查出订单的业绩商品 $achievementOrderIds = array_column($orderList['list'], 'id'); $achievementOrderDetailsIds = OrderAchievementGoods::find() ->where(['order_id' => $achievementOrderIds]) ->select('order_details_ids') ->column(); array_walk($achievementOrderDetailsIds, function (&$item) { $item = json_decode($item, true); $item = is_array($item) ? $item : []; }); $mergedDetailsIds = []; if (!empty($achievementOrderDetailsIds)) { $mergedDetailsIds = array_merge(...array_filter($achievementOrderDetailsIds)); } $achievementOrderDetail = OrderDetail::find() ->where(['id' => $mergedDetailsIds]) // 使用处理后的数组 ->select('id, order_id, is_feedback, goods_price, original_goods_price') ->asArray() ->all(); $orderList['list'] = array_column($orderList['list'], null, 'id'); foreach ($achievementOrderDetail as $orderDetail) { if (isset($orderList['list'][$orderDetail['order_id']])) { $orderList['list'][$orderDetail['order_id']]['detail'][] = $orderDetail; } } $orderList['list'] = array_values($orderList['list']); // 售后成功的商品 $refundSuccessOrderDetailIds = []; foreach ($orderList['list'] as &$item) { if (empty($item['detail'])) { continue; } $item['goods_price'] = number_format(array_sum(array_column($item['detail'], 'goods_price')), 2); $item['original_goods_price'] = number_format(array_sum(array_column($item['detail'], 'original_goods_price')), 2); foreach ($item['detail'] as $detail) { // 售后成功的子订单 if ($detail['is_feedback'] == OrderStatusEnum::FEEDBACKED) { $refundSuccessOrderDetailIds[] = $detail['id']; } } } // 如果存在售后成功的商品,需要将主订单的金额减少(换货不需要减) if ($refundSuccessOrderDetailIds) { $refundSuccessOrderDetailIds = OrderRefund::find() ->where(['order_detail_id' => $refundSuccessOrderDetailIds, 'refund_status' => RefundStatusEnum::FINISH]) ->andWhere(['!=', 'type', RefundTypeEnum::EXCHANGE_GOODS]) ->select('order_detail_id') ->column(); if ($refundSuccessOrderDetailIds) { foreach ($orderList['list'] as &$item) { foreach ($item['detail'] as $detail) { // 在售后成功数组里,则减少 if (in_array($detail['id'], $refundSuccessOrderDetailIds)) { $item['goods_price'] = bcsub($item['goods_price'], $detail['goods_price'], 2); $item['original_goods_price'] = bcsub($item['original_goods_price'], $detail['original_goods_price'], 2); } } } } } return [ 'statistics_data' => $this->getGroupLeaderStatisticsTotal($params['user_id'], $date), 'order_list' => $orderList ]; } }