From 56002f390d054fee07809ce0fd0bdcf770de0c38 Mon Sep 17 00:00:00 2001 From: youda Date: Sat, 12 Apr 2025 23:03:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=A2=E5=8D=95=E7=BC=96?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/view/user_rank/index.html | 33 +----- app/api/controller/Order.php | 2 +- app/common/service/RankService.php | 153 +++++++++++++--------------- 3 files changed, 78 insertions(+), 110 deletions(-) diff --git a/app/admin/view/user_rank/index.html b/app/admin/view/user_rank/index.html index 2f4852f..1e59310 100644 --- a/app/admin/view/user_rank/index.html +++ b/app/admin/view/user_rank/index.html @@ -20,19 +20,6 @@ - -
-
- -
- -
-
-
- @@ -52,6 +39,7 @@ {if $type=='loss'} + {/if} @@ -70,6 +58,7 @@ {if $type=='loss'} + {/if} @@ -96,22 +85,8 @@ // 排行榜类型切换 form.on('radio(rank_type)', function(data) { var type = data.value; - // 亏损补贴排行榜时显示排序选项 - if (type === 'loss') { - $('.loss-sort-option').show(); - } else { - $('.loss-sort-option').hide(); - } - // 跳转到对应类型的排行榜页面 - window.location.href = '{:url("/admin/user_rank")}?type=' + type + - '&sort_field=' + (type === 'loss' ? $('select[name="sort_field"]').val() : 'loss_money'); - }); - - // 排序方式切换 - form.on('select(sort_field)', function(data) { - var sortField = data.value; - window.location.href = '{:url("/admin/user_rank")}?type=loss&sort_field=' + sortField; + window.location.href = '{:url("/admin/user_rank")}?type=' + type; }); // 初始化分页 @@ -128,7 +103,7 @@ url += '&page=' + obj.curr; url += '&limit=' + obj.limit; if ('{$type}' === 'loss') { - url += '&sort_field={$sort_field}'; + url += ''; } window.location.href = url; } diff --git a/app/api/controller/Order.php b/app/api/controller/Order.php index a873686..dcb9452 100644 --- a/app/api/controller/Order.php +++ b/app/api/controller/Order.php @@ -86,7 +86,7 @@ class Order extends Base // 获取订单详情 $orderInfo = Db::name('order') - ->field('goods_id, goods_title, goods_price, id, order_total, order_zhe_total, price, use_money, use_integral, use_money2, addtime, pay_time, prize_num, use_coupon') + ->field('order_num,goods_id, goods_title, goods_price, id, order_total, order_zhe_total, price, use_money, use_integral, use_money2, addtime, pay_time, prize_num, use_coupon') ->where([ 'status' => 1, 'order_num' => $orderNum diff --git a/app/common/service/RankService.php b/app/common/service/RankService.php index bdf521b..7a11174 100644 --- a/app/common/service/RankService.php +++ b/app/common/service/RankService.php @@ -318,19 +318,18 @@ class RankService * @param int $endTime 结束时间戳 * @param int $page 页码 * @param int $limit 每页数量 - * @param string $sortField 排序字段:loss_money(亏损金额)或loss_rate(亏损率) * @return array 排行榜数据 */ public function getLossRank($startTime, $endTime, $page, $limit, $sortField = 'loss_money') { - // 构建订单查询条件 + // 构建订单条件 $orderWhere = [ ['status', '=', 1], [ 'user_id', 'not in', function ($query) { - $query->name('user')->where('istest', '>', 0)->where('status', '=', 1)->field('id'); + $query->name('user')->where('istest', '>', 0)->field('id'); } ] ]; @@ -343,104 +342,98 @@ class RankService $orderWhere[] = ['pay_time', '<=', $endTime]; } - // 构建订单详情查询条件 - $orderListWhere = []; - if ($startTime > 0) { - $orderListWhere[] = ['addtime', '>=', $startTime]; - } - if ($endTime > 0) { - $orderListWhere[] = ['addtime', '<=', $endTime]; - } - - // 查询用户订单总金额(消耗金额) - $orderSubQuery = Order::where($orderWhere) - ->field('user_id, SUM(price) + SUM(use_money) as money') + // 查询订单数据,分组计算每个用户的消费金额 + $orderData = Db::name('order') + ->where($orderWhere) + ->field('user_id, COALESCE(sum(price), 0) as money') ->group('user_id') - ->buildSql(); + ->select() + ->toArray(); - // 查询用户出货金额 - $usersWithOutputMoney = []; - $users = Order::where($orderWhere)->field('DISTINCT user_id')->select()->toArray(); + // 处理查询结果,计算每个用户的出货金额和达达卷金额 + $userLossData = []; + foreach ($orderData as $order) { + $userId = $order['user_id']; + $money = $order['money']; // 微信消费金额 - foreach ($users as $user) { - $userId = $user['user_id']; - - // 构建特定用户的查询条件 - $userOrderListWhere = $orderListWhere; - $userOrderListWhere[] = ['user_id', '=', $userId]; - - // 查询用户出货金额 - $outputMoney = \app\common\model\OrderList::where($userOrderListWhere) + // 查询出货金额 + $outputMoneyWhere = []; + if ($startTime > 0) { + $outputMoneyWhere[] = ['addtime', '>=', $startTime]; + } + if ($endTime > 0) { + $outputMoneyWhere[] = ['addtime', '<=', $endTime]; + } + $outputMoneyWhere[] = ['user_id', '=', $userId]; + + $outputMoney = Db::name('order_list') + ->where($outputMoneyWhere) ->sum('goodslist_money'); - if ($outputMoney > 0) { - $usersWithOutputMoney[$userId] = $outputMoney; + // 查询达达卷金额 + $dadaMoneyWhere = []; + if ($startTime > 0) { + $dadaMoneyWhere[] = ['addtime', '>=', $startTime]; + } + if ($endTime > 0) { + $dadaMoneyWhere[] = ['addtime', '<=', $endTime]; + } + $dadaMoneyWhere[] = ['user_id', '=', $userId]; + + $dadaMoney = Db::name('order_list_recovery') + ->where($dadaMoneyWhere) + ->sum('money'); + + // 如果dadaMoney为null,设置为0 + $dadaMoney = $dadaMoney ?: 0; + + // 计算亏损金额:(出货金额-(微信消费金额+达达卷金额)) + $lossMoney = $outputMoney - ($money + $dadaMoney); + + // 计算亏损率 + $totalConsume = $money + $dadaMoney; + $lossRate = $totalConsume > 0 ? round(($lossMoney / $totalConsume) * 100, 2) : 0; + + // 只有亏损的用户才添加到排行榜 + if ($lossMoney < 0) { + $userLossData[] = [ + 'user_id' => $userId, + 'consume_money' => $money, // 微信消费金额 + 'output_money' => $outputMoney, // 出货金额 + 'dada_money' => $dadaMoney, // 达达卷金额 + 'loss_money' => $lossMoney, // 亏损金额 + 'loss_rate' => $lossRate // 亏损率(%) + ]; } } - // 计算亏损数据 - $rankList = []; - $index = 0; - - // 从订单总金额查询结果中获取数据 - $moneyResult = Db::table($orderSubQuery . ' as t')->where('money', '>', 0)->select()->toArray(); - - foreach ($moneyResult as $item) { - $userId = $item['user_id']; - $consumeMoney = $item['money']; // 消耗金额 - - // 如果有出货金额数据 - if (isset($usersWithOutputMoney[$userId])) { - $outputMoney = $usersWithOutputMoney[$userId]; // 出货金额 - - // 计算亏损金额和亏损率 - $lossMoney = $consumeMoney - $outputMoney; - $lossRate = $consumeMoney > 0 ? round(($lossMoney / $consumeMoney) * 100, 2) : 0; - - // 只有亏损的才纳入排行 - if ($lossMoney > 0) { - $rankList[] = [ - 'user_id' => $userId, - 'consume_money' => $consumeMoney, // 消耗金额 - 'output_money' => $outputMoney, // 出货金额 - 'loss_money' => $lossMoney, // 亏损金额 - 'loss_rate' => $lossRate // 亏损率(%) - ]; - } - } - } - - // 根据排序字段对结果进行排序 - if ($sortField == 'loss_rate') { - // 按亏损率降序排序 - usort($rankList, function ($a, $b) { - return $b['loss_rate'] <=> $a['loss_rate']; - }); - } else { - // 默认按亏损金额降序排序 - usort($rankList, function ($a, $b) { - return $b['loss_money'] <=> $a['loss_money']; - }); - } + // 按亏损金额从小到大排序(因为亏损是负数,所以越小表示亏损越多) + usort($userLossData, function ($a, $b) { + return $a['loss_money'] <=> $b['loss_money']; + }); // 分页处理 $offset = ($page - 1) * $limit; - $rankList = array_slice($rankList, $offset, $limit); + $userLossData = array_slice($userLossData, $offset, $limit); // 处理用户信息和排名 $result = []; - foreach ($rankList as $index => $item) { + foreach ($userLossData as $index => $item) { $userInfo = User::field('nickname, headimg, mobile')->where('id', $item['user_id'])->find(); if ($userInfo) { + // 取亏损金额的绝对值来显示 + $absoluteLossMoney = abs($item['loss_money']); + $result[] = [ 'rank' => $offset + $index + 1, 'user_id' => $item['user_id'], 'nickname' => $userInfo['nickname'], 'headimg' => imageUrl($userInfo['headimg']), - 'consume_money' => $item['consume_money'], - 'output_money' => $item['output_money'], - 'value' => $item['loss_money'], // 主要展示值为亏损金额 - 'loss_rate' => $item['loss_rate'], // 亏损率 + 'consume_money' => $item['consume_money'], // 微信消费金额 + 'dada_money' => $item['dada_money'], // 达达卷金额 + 'output_money' => $item['output_money'], // 出货金额 + 'value' => $absoluteLossMoney, // 主要展示值为亏损金额的绝对值 + 'loss_rate' => $item['loss_rate'], // 亏损率 'unit' => '元' ]; }
消耗金额达达卷金额 出货金额 亏损率{$vo.consume_money} 元{$vo.dada_money} 元 {$vo.output_money} 元 {$vo.loss_rate}%