| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- <?php
- namespace common\services\mall\user;
- use common\enums\OrderStatusEnum;
- use common\enums\RefundStatusEnum;
- use common\enums\RefundTypeEnum;
- use common\enums\StatusEnum;
- use common\helpers\DateHelper;
- use common\models\common\MallSetting;
- use common\models\order\Order;
- use common\models\order\OrderAchievementGoods;
- use common\models\order\OrderDetail;
- use common\models\order\OrderRefund;
- use common\models\statistics\UserAchievementStatistics;
- use common\models\statistics\UserAchievementStatisticsTotal;
- use common\models\statistics\UserTeamAchievementStatistics;
- use common\models\statistics\UserTeamDateAchievementStatistics;
- use common\models\user\User;
- use common\models\user\UserLevel;
- use common\models\user\UserPartitionRelationship;
- class UserAchievementService
- {
- public function getListByUserId(array $params)
- {
- if (!$params['user_id']) {
- return [];
- }
- $direct = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);// 直推
- $indirect = UserPartitionRelationship::getChildIdArr($params['user_id'], 2);// 间推
- $groupUserIds = array_merge($direct, $indirect, [$params['user_id']]);// 包含自己
- $userBaseWhere = [
- ['=', 'status', StatusEnum::ENABLED],
- ['=', 'mall_id', $params['mall_id']],
- ['id' => $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
- ];
- }
- }
|