manghe/app/admin/controller/Statistics.php
2025-04-19 16:17:04 +08:00

712 lines
34 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\controller;
use app\common\model\Order as OrderModel;
use app\common\model\OrderList;
use app\common\model\OrderListRecovery;
use app\common\model\UserStatistics;
use app\common\model\User;
use app\admin\controller\Base;
use app\common\model\Category;
use app\common\model\Yushou;
use \think\Request;
use think\facade\View;
use app\common\model\Goods as GoodsModel;
use app\common\model\GoodsList;
use think\facade\Db;
use app\common\model\Shang;
use app\common\model\ProfitExpenses;
use app\common\model\ProfitRvenue;
class Statistics extends Base
{
public function profit(Request $request)
{
$goodId = trim(input('get.goodId'));
$title = trim(input('get.title'));
$status = trim(input('get.status'));
$type = trim(input('get.type'));
$addtime = trim(input('get.addtime'));
// 构建查询条件
$where = [['delete_time', '=', null]];
if ($goodId) {
$where[] = ['id', '=', $goodId];
}
if ($title) {
$where[] = ['title', 'like', '%' . $title . '%'];
}
if ($status) {
$where[] = ['status', '=', $status];
}
if ($type) {
$where[] = ['type', '=', $type];
}
return View::fetch("Statistics/profit");
}
/**
* 盒子利润统计数据接口(用于前端分离模式)
* @param Request $request
* @return \think\response\Json
*/
public function profitData(Request $request)
{
$goodId = trim(input('get.goodId'));
$title = trim(input('get.title'));
$status = trim(input('get.status'));
$type = trim(input('get.type'));
$addtime = trim(input('get.addtime'));
$page = intval(input('page', 1));
$limit = intval(input('limit', 20));
// 构建查询条件
$where = [['delete_time', '=', null]];
if ($goodId) {
$where[] = ['id', '=', $goodId];
}
if ($title) {
$where[] = ['title', 'like', '%' . $title . '%'];
}
if ($status) {
$where[] = ['status', '=', $status];
}
if ($type) {
$where[] = ['type', '=', $type];
}
// 构建SQL查询只返回基本信息
$query = Db::name('goods')->alias('goods')
->field([
'goods.id',
'goods.title',
'goods.imgurl',
'goods.price',
'goods.stock',
'goods.status',
'goods.type'
])
->where($where)
->order(['goods.id' => 'desc']);
// 获取总数量
$total = $query->count();
// 分页
$list = $query->page($page, $limit)->select()->toArray();
// 获取盒子类型名称
$typesList = $this->getGoodsTypes();
$typesMap = [];
foreach ($typesList as $item) {
$typesMap[$item['value']] = $item['fl_name'];
}
// 初始化统计数据为0
foreach ($list as &$item) {
// 添加类型名称
$item['type_name'] = isset($typesMap[$item['type']]) ? $typesMap[$item['type']] : '未知类型';
// 初始化统计字段为0后续会异步加载
$item['use_money'] = 0;
$item['sc_money'] = 0;
$item['re_money'] = 0;
$item['fh_money'] = 0;
$item['cj_count'] = 0;
$item['profit'] = 0;
$item['profit_rate'] = 0;
$item['is_negative'] = false;
$item['loaded'] = false; // 标记是否已加载统计数据
}
// 返回JSON数据
return json([
'code' => 0,
'msg' => '获取数据成功',
'count' => $total,
'data' => $list,
'summary' => [
'totalIncome' => 0,
'totalCost' => 0,
'totalProfit' => 0,
'totalReMoney' => 0,
'totalFhMoney' => 0,
]
]);
}
/**
* 获取盒子类型列表用于API调用
*/
private function getGoodsTypes()
{
$types = Db::name('goods_type')
->field('value, fl_name, remark')
->where('is_fenlei', 1)
->order('sort_order asc')
->select()
->toArray();
return $types;
}
/**
* 解析时间范围
*/
private function parseTimeRange($addtime)
{
$time = explode(' - ', $addtime);
$start_time = strtotime($time[0]);
$end_time = strtotime($time[1]) - 1;
if ($start_time > $end_time) {
throw new \Exception('开始时间不能大于结束时间');
}
return [$start_time, $end_time];
}
/**
* 计算商品的订单详情
*/
private function calculateOrderDetails($goodsId, $userList, $addtime)
{
$whe1 = [['goods_id', '=', $goodsId], ['status', '=', 1], ['user_id', 'not in', $userList]];
$whe2 = [['user_id', 'not in', $userList], ['goods_id', '=', $goodsId]];
if ($addtime) {
[$start_time, $end_time] = $this->parseTimeRange($addtime);
$whe1[] = ['addtime', 'BETWEEN', [$start_time, $end_time]];
$whe2[] = ['addtime', 'BETWEEN', [$start_time, $end_time]];
}
// 订单统计
$orderStats = OrderModel::where($whe1)
->field('COUNT(*) as count,
SUM(order_total) as order_total,
SUM(price) as count_price,
SUM(use_money) as count_yue,
SUM(use_integral) / 100 as use_integral,
SUM(use_score) as use_score,
SUM(use_coupon) as use_coupon,
SUM(order_zhe_total) as order_zhe_total')
->find();
if (!$orderStats) {
$orderStats = (object) [
'count' => 0,
'order_total' => 0,
'count_price' => 0,
'count_yue' => 0,
'use_integral' => 0,
'use_score' => 0,
'use_coupon' => 0,
'order_zhe_total' => 0
];
}
$goodslistMoney = OrderList::where($whe2)->sum('goodslist_money');
// 计算利润
$lirun = round($orderStats->order_zhe_total - $goodslistMoney, 2);
$liruns = round(($orderStats->count_price + $orderStats->count_yue + $orderStats->use_integral + $orderStats->use_score + $orderStats->use_coupon) - $goodslistMoney, 2);
$order_zhe_total = $orderStats->order_zhe_total;
// $order_zhe_total 转int
$order_zhe_total = intval($order_zhe_total);
if ($order_zhe_total <= 0) {
$order_zhe_total = 1;
}
$order_total = ($orderStats->count_price + $orderStats->count_yue + $orderStats->use_integral + $orderStats->use_score + $orderStats->use_coupon);
if ($order_total <= 0) {
$order_total = 1;
}
return [
'order_count' => round($orderStats->count, 2),
'count_price' => round($orderStats->count_price, 2),
'order_total' => round($orderStats->order_total, 2),
'count_yue' => round($orderStats->count_yue, 2),
'count_use_integral' => round($orderStats->use_integral, 2),
'count_use_score' => round($orderStats->use_score, 2),
'count_use_coupon' => round($orderStats->use_coupon, 2),
'count_heji' => round($orderStats->count_price + $orderStats->count_yue + $orderStats->use_integral + $orderStats->use_score + $orderStats->use_coupon, 2),
'order_zhe_total' => round($orderStats->order_zhe_total, 2),
'count_OrderList' => OrderList::where($whe2)->count(), // ✅ 添加这一行
'goodslist_price' => round($goodslistMoney, 2),
'lirun' => $lirun,
'liruns' => $liruns,
'lirulv' => $goodslistMoney == 0 ? 0 : round(($order_zhe_total - $goodslistMoney) / $order_zhe_total * 100, 2),
'lirulvs' => $goodslistMoney == 0 ? 0 : round(($order_total - $goodslistMoney) / $order_total * 100, 2),
];
}
/**
* 数据统计
* @param \think\Request $request
* @return string
*/
public function DataStand(Request $request)
{
$userCount = User::count("id");
$userList = User::where('istest', '>', 0)->field('id')->select();
$userArray = array_column($userList->toArray(), 'id');
// 本日充值金额
// $order_today = OrderModel::whereNotIn('user_id', $userArray)->where('status', '=', 1)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->sum('price');
// 今日时间
$ranges['today_start'] = strtotime('today');
$ranges['today_end'] = strtotime('tomorrow') - 1;
// 昨日时间
$ranges['yesterday_start'] = strtotime('yesterday');
$ranges['yesterday_end'] = strtotime('today') - 1;
// 本周时间(周一到周日)
$ranges['this_week_start'] = strtotime('monday this week');
$ranges['this_week_end'] = strtotime('sunday this week') + 86399;
// 上周时间(上周一到上周日)
$ranges['last_week_start'] = strtotime('monday last week');
$ranges['last_week_end'] = strtotime('sunday last week') + 86399;
// 本月时间1号到月末
$ranges['this_month_start'] = strtotime(date('Y-m-01'));
$ranges['this_month_end'] = strtotime(date('Y-m-t')) + 86399;
// 上月时间上个月1号到月末
$ranges['last_month_start'] = strtotime(date('Y-m-01', strtotime('-1 month')));
$ranges['last_month_end'] = strtotime(date('Y-m-t', strtotime('-1 month'))) + 86399;
// 今日注册人数
$user_today = User::whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->count('id');
// 昨日注册人数
$user_yesterday = User::whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->count('id');
// 本周注册人数
$user_this_week = User::whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->count('id');
// 上周注册人数
$user_last_week = User::whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->count('id');
// 本月注册人数
$user_this_month = User::whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->count('id');
// 上月注册人数
$user_last_month = User::whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->count('id');
// 本日充值金额
$order_today = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->sum('price');
// 昨日充值金额
$order_yesterday = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->sum('price');
// 本周充值金额
$order_this_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->sum('price');
// 上周充值金额
$order_last_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->sum('price');
// 本月充值金额
$order_this_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->sum('price');
// 上月充值金额
$order_last_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->sum('price');
// 消费人数统计
$consume_today = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->field('user_id')->group('user_id')->count('user_id');
$consume_yesterday = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->field('user_id')->group('user_id')->count('user_id');
$consume_this_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->field('user_id')->group('user_id')->count('user_id');
$consume_last_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->field('user_id')->group('user_id')->count('user_id');
$consume_this_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->field('user_id')->group('user_id')->count('user_id');
$consume_last_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->field('user_id')->group('user_id')->count('user_id');
// RMB消费人数统计
$rmb_consume_today = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->field('user_id')->group('user_id')->count('user_id');
$rmb_consume_yesterday = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->field('user_id')->group('user_id')->count('user_id');
$rmb_consume_this_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->field('user_id')->group('user_id')->count('user_id');
$rmb_consume_last_week = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->field('user_id')->group('user_id')->count('user_id');
$rmb_consume_this_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->field('user_id')->group('user_id')->count('user_id');
$rmb_consume_last_month = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->where('price', '>', 0)->whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->field('user_id')->group('user_id')->count('user_id');
//今日余额消费
$money_today = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->sum('use_money');
$money_yesterday = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->sum('use_money');
//今日积分抵扣
$score_yesterday = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->sum('use_score');
$score_today = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->sum('use_score');
//今日余额发放
$money_recovery_today = OrderListRecovery::whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->whereNotIn('user_id', $userArray)->sum('money');
$money_recovery_yesterday = OrderListRecovery::whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->whereNotIn('user_id', $userArray)->sum('money');
//今日优惠卷消费
$coupon_today = OrderModel::where('status', '=', 1)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->whereNotIn('user_id', $userArray)->sum('use_coupon');
//今日收入
$order_zhe_total = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->sum('order_zhe_total');
$order_goodslist_money = OrderList::whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money');
$order_goodslist_count = OrderList::whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->whereNotIn('user_id', $userArray)->count();
$order_count = OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['today_start'], $ranges['today_end'])->count();
$order_zhe_total_yester = round(OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->sum('order_zhe_total'), 2);
$order_goodslist_money_yester = round(OrderList::whereBetweenTime('addtime', $ranges['yesterday_start'], $ranges['yesterday_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money'), 2);
$order_zhe_total_week = round(OrderModel::where('status', '=', 1)->whereNotIn('user_id', $userArray)->whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->sum('order_zhe_total'), 2);
$order_goodslist_money_week = round(OrderList::whereBetweenTime('addtime', $ranges['this_week_start'], $ranges['this_week_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money'), 2);
$order_zhe_total_last_week = round(OrderModel::where('status', '=', 1)->whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->whereNotIn('user_id', $userArray)->sum('order_zhe_total'), 2);
$order_goodslist_money__last_week = round(OrderList::whereBetweenTime('addtime', $ranges['last_week_start'], $ranges['last_week_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money'), 2);
$order_zhe_total_month = round(OrderModel::where('status', '=', 1)->whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->whereNotIn('user_id', $userArray)->sum('order_zhe_total'), 2);
$order_goodslist_money_month = round(OrderList::whereBetweenTime('addtime', $ranges['this_month_start'], $ranges['this_month_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money'), 2);
$order_zhe_total_last_month = round(OrderModel::where('status', '=', 1)->whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->whereNotIn('user_id', $userArray)->sum('order_zhe_total'), 2);
$order_goodslist_money__last_month = round(OrderList::whereBetweenTime('addtime', $ranges['last_month_start'], $ranges['last_month_end'])->whereNotIn('user_id', $userArray)->sum('goodslist_money'), 2);
$profit_expenses = ProfitExpenses::getTotalAmountByDate(date('Y-m-d'));
$profit_expenses_yester = ProfitExpenses::getTotalAmountByDate(date('Y-m-d', strtotime('-1 day')));
$profit_expenses_week = ProfitExpenses::getTotalAmountByDates(date('Y-m-d', $ranges['this_week_start']), date('Y-m-d', $ranges['this_week_end']));
$profit_expenses_last_week = ProfitExpenses::getTotalAmountByDates(date('Y-m-d', $ranges['last_week_start']), date('Y-m-d', $ranges['last_week_end']));
$profit_expenses_money = ProfitExpenses::getTotalAmountByDates(date('Y-m-d', $ranges['this_month_start']), date('Y-m-d', $ranges['this_month_end']));
$profit_expenses_last_money = ProfitExpenses::getTotalAmountByDates(date('Y-m-d', $ranges['last_month_start']), date('Y-m-d', $ranges['last_month_end']));
$profit_rvenue = ProfitRvenue::getTotalAmountByDate(date('Y-m-d'));
$profit_rvenue_yester = ProfitRvenue::getTotalAmountByDate(date('Y-m-d', strtotime('-1 day')));
$profit_rvenue_week = ProfitRvenue::getTotalAmountByDates(date('Y-m-d', $ranges['this_week_start']), date('Y-m-d', $ranges['this_week_end']));
$profit_rvenue_last_week = ProfitRvenue::getTotalAmountByDates(date('Y-m-d', $ranges['last_week_start']), date('Y-m-d', $ranges['last_week_end']));
$profit_rvenue_money = ProfitRvenue::getTotalAmountByDates(date('Y-m-d', $ranges['this_month_start']), date('Y-m-d', $ranges['this_month_end']));
$profit_rvenue_last_money = ProfitRvenue::getTotalAmountByDates(date('Y-m-d', $ranges['last_month_start']), date('Y-m-d', $ranges['last_month_end']));
View::assign('profit_expenses', $profit_expenses);
View::assign('money_today', $money_today);
View::assign('money_yesterday', $money_yesterday);
View::assign('coupon_today', $coupon_today);
View::assign('profit_rvenue', $profit_rvenue);
View::assign('score_today', $score_today);
View::assign('score_yesterday', $score_yesterday);
View::assign('money_recovery_today', $money_recovery_today);
View::assign('money_recovery_yesterday', $money_recovery_yesterday);
View::assign('order_zhe_total', $order_zhe_total);
View::assign('order_goodslist_money', $order_goodslist_money);
View::assign('order_goodslist_count', $order_goodslist_count);
View::assign('order_count', $order_count);
View::assign('order_lirun', round($order_zhe_total + $profit_rvenue - $order_goodslist_money - $profit_expenses, 2));
View::assign('order_lirun_yester', round($order_zhe_total_yester + $profit_rvenue_yester - $order_goodslist_money_yester - $profit_expenses_yester, 2) . " ($order_zhe_total_yester + $profit_rvenue_yester - $order_goodslist_money_yester - $profit_expenses_yester)");
View::assign('order_lirun_week', round($order_zhe_total_week + $profit_rvenue_week - $order_goodslist_money_week - $profit_expenses_week, 2) . " ({$order_zhe_total_week} + $profit_rvenue_week - $order_goodslist_money_week - $profit_expenses_week)");
View::assign('order_lirun_last_week', round($order_zhe_total_last_week + $profit_rvenue_last_week - $order_goodslist_money__last_week - $profit_expenses_last_week, 2) . " ($order_zhe_total_last_week +$profit_rvenue_last_week - $order_goodslist_money__last_week - $profit_expenses_last_week)");
View::assign('order_zhe_total_month', round($order_zhe_total_month + $profit_rvenue_money - $order_goodslist_money_month - $profit_expenses_money, 2) . " ($order_zhe_total_month + $profit_rvenue_money - $order_goodslist_money_month - $profit_expenses_money)");
View::assign('order_lirun_last_month', round($order_zhe_total_last_month + $profit_rvenue_last_money - $order_goodslist_money__last_month - $profit_expenses_last_money, 2) . " ($order_zhe_total_last_month + $profit_rvenue_last_money - $order_goodslist_money__last_month- $profit_expenses_last_money)");
// 赋值给模板
View::assign('userCount', $userCount);
View::assign('user_today', $user_today);
View::assign('user_yesterday', $user_yesterday);
View::assign('user_this_week', $user_this_week);
View::assign('user_last_week', $user_last_week);
View::assign('user_this_month', $user_this_month);
View::assign('user_last_month', $user_last_month);
// 充值订单数据
View::assign('order_today', $order_today);
View::assign('order_yesterday', $order_yesterday);
View::assign('order_this_week', $order_this_week);
View::assign('order_last_week', $order_last_week);
View::assign('order_this_month', $order_this_month);
View::assign('order_last_month', $order_last_month);
View::assign('consume_today', $consume_today);
View::assign('consume_yesterday', $consume_yesterday);
View::assign('consume_this_week', $consume_this_week);
View::assign('consume_last_week', $consume_last_week);
View::assign('consume_this_month', $consume_this_month);
View::assign('consume_last_month', $consume_last_month);
View::assign('rmb_consume_today', $rmb_consume_today);
View::assign('rmb_consume_yesterday', $rmb_consume_yesterday);
View::assign('rmb_consume_this_week', $rmb_consume_this_week);
View::assign('rmb_consume_last_week', $rmb_consume_last_week);
View::assign('rmb_consume_this_month', $rmb_consume_this_month);
View::assign('rmb_consume_last_month', $rmb_consume_last_month);
View::assign('ranges', $ranges);
return View::fetch("Statistics/dataStand");
}
public function UserStatistics()
{
$list = UserStatistics::order('id desc')->limit(30)->select();
View::assign('list', $list);
return View::fetch('Statistics/userstatistics');
}
/**
* 订单列表
*/
public function orderList(Request $request)
{
$goodsId = $request->param('goods_id', 0, 'intval');
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
// 查询条件
$where = [
['status', '=', 1],
['goods_id', '=', $goodsId]
];
if (!empty($testUsers)) {
$where[] = ['user_id', 'not in', $testUsers];
}
// 获取订单列表
$list = OrderModel::where($where)
->append(['user_info'])
->order('id', 'desc')
->paginate(['list_rows' => 50, 'query' => request()->param()]);
// 传递数据给视图
View::assign([
'list' => $list,
'page' => $list->render(),
'goods_id' => $goodsId
]);
return View::fetch("Statistics/orderList");
}
/**
* 出货列表
*/
public function goodsList(Request $request)
{
$goodsId = $request->param('goods_id', 0, 'intval');
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
// 查询条件
$where = [
['goods_id', '=', $goodsId]
];
if (!empty($testUsers)) {
$where[] = ['user_id', 'not in', $testUsers];
}
// 获取出货列表
$list = OrderList::where($where)
->order('id', 'desc')
->paginate(['list_rows' => 50, 'query' => request()->param()]);
// 传递数据给视图
View::assign([
'list' => $list,
'page' => $list->render(),
'goods_id' => $goodsId
]);
return View::fetch("Statistics/goodsList");
}
/**
* 兑换列表
*/
public function exchangeList(Request $request)
{
$goodsId = $request->param('goods_id', 0, 'intval');
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
// 查询条件
$where = [
['goods_id', '=', $goodsId]
];
$where[] = ['recovery_num', '!=', ''];
// $where[] = ['recovery_num', '!=', null];
if (!empty($testUsers)) {
$where[] = ['user_id', 'not in', $testUsers];
}
// 获取兑换列表
$list = OrderList::where($where)
->order('id', 'desc')
->paginate(['list_rows' => 50, 'query' => request()->param()]);
// 传递数据给视图
View::assign([
'list' => $list,
'page' => $list->render(),
'goods_id' => $goodsId
]);
return View::fetch("Statistics/exchangeList");
}
/**
* 发货列表
*/
public function shipmentList(Request $request)
{
$goodsId = $request->param('goods_id', 0, 'intval');
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
// 查询条件
$where = [
['goods_id', '=', $goodsId]
];
$where[] = ['send_num', '<>', ''];
// $where[] = ['send_num', '<>', null];
if (!empty($testUsers)) {
$where[] = ['user_id', 'not in', $testUsers];
}
// 获取发货列表
$list = OrderList::where($where)
->order('id', 'desc')
->paginate(['list_rows' => 50, 'query' => request()->param()]);
// 传递数据给视图
View::assign([
'list' => $list,
'page' => $list->render(),
'goods_id' => $goodsId
]);
return View::fetch("Statistics/shipmentList");
}
/**
* 出货概览
*/
public function productsOverview(Request $request)
{
$goodsId = $request->param('goods_id', 0, 'intval');
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
// 查询条件
$where = [
['goods_id', '=', $goodsId]
];
if (!empty($testUsers)) {
$where[] = ['user_id', 'not in', $testUsers];
}
// 第一个SQL按奖品ID分组统计出货数量
$productStats = OrderList::where($where)
->field('goodslist_id, COUNT(1) as goods_count')
->group('goodslist_id')
->select()
->toArray();
// 获取所有涉及的奖品ID
$goodslistIds = array_column($productStats, 'goodslist_id');
// 第二个SQL查询奖品详细信息
$productInfos = [];
if (!empty($goodslistIds)) {
$productInfos = GoodsList::where('id', 'in', $goodslistIds)
->field('id, title, imgurl, price, money, sc_money, real_pro')
->select()
->toArray();
}
// 将两个查询结果合并以奖品ID为键
$productInfoMap = [];
foreach ($productInfos as $info) {
$productInfoMap[$info['id']] = $info;
}
// 合并结果
$result = [];
foreach ($productStats as $stat) {
$goodslistId = $stat['goodslist_id'];
if (array_key_exists($goodslistId, $productInfoMap)) {
$result[] = array_merge($stat, $productInfoMap[$goodslistId]);
}
}
// 获取盒子信息
$boxInfo = GoodsModel::where('id', $goodsId)->find();
// 传递数据给视图
View::assign([
'list' => $result,
'goods_id' => $goodsId,
'boxInfo' => $boxInfo
]);
return View::fetch('Statistics/productsOverview');
}
/**
* 获取单个盒子的统计数据
* @param Request $request
* @return \think\response\Json
*/
public function getBoxStatistics(Request $request)
{
$goodId = intval(input('get.goods_id', 0));
$addtime = trim(input('get.addtime', ''));
if ($goodId <= 0) {
return json(['code' => 1, 'msg' => '参数错误']);
}
// 解析时间范围
$startTime = 0;
$endTime = time();
if ($addtime) {
$times = explode(' - ', $addtime);
$startTime = strtotime($times[0]);
$endTime = strtotime($times[1]);
}
// 获取测试用户ID
$testUsers = User::where('istest', '>', 0)->column('id');
$testUserIds = empty($testUsers) ? [0] : $testUsers;
$testUserIdsStr = implode(',', $testUserIds);
// 查询单个盒子的统计数据
$data = Db::name('goods')->alias('goods')
->field([
'goods.id',
'(SELECT COALESCE(sum(use_money), 0) + COALESCE(sum(price), 0) FROM `order` WHERE status=1 AND (price>0 OR use_money>0) AND pay_time > ' . $startTime . ' and pay_time < ' . $endTime . ' AND goods_id=goods.id AND status=1 AND user_id NOT IN (' . $testUserIdsStr . ')) AS use_money',
'(SELECT COALESCE(sum(goodslist_money), 0) FROM `order_list` WHERE goods_id=goods.id AND user_id NOT IN (' . $testUserIdsStr . ') AND addtime > ' . $startTime . ' and addtime < ' . $endTime . ') AS sc_money',
'(SELECT COALESCE(sum(goodslist_money), 0) FROM `order_list` WHERE goods_id=goods.id AND LENGTH(recovery_num)>0 AND user_id NOT IN (' . $testUserIdsStr . ') AND addtime > ' . $startTime . ' and addtime < ' . $endTime . ') AS re_money',
'(SELECT COALESCE(sum(goodslist_money), 0) FROM `order_list` WHERE goods_id=goods.id AND LENGTH(send_num)>0 AND user_id NOT IN (' . $testUserIdsStr . ') AND addtime > ' . $startTime . ' and addtime < ' . $endTime . ') AS fh_money',
'(SELECT count(1) FROM `order_list` WHERE goods_id=goods.id AND user_id NOT IN (' . $testUserIdsStr . ') AND addtime > ' . $startTime . ' and addtime < ' . $endTime . ' and parent_goods_list_id=0 ) AS cj_count'
])
->where('goods.id', '=', $goodId)
->find();
if (!$data) {
return json(['code' => 1, 'msg' => '盒子不存在']);
}
// 处理数值,确保为浮点型
$data['use_money'] = floatval($data['use_money']);
$data['sc_money'] = floatval($data['sc_money']);
$data['re_money'] = floatval($data['re_money']);
$data['fh_money'] = floatval($data['fh_money']);
// 计算利润和利润率
$data['profit'] = $data['use_money'] - $data['sc_money'];
$data['profit_rate'] = $data['use_money'] > 0 ? round(($data['profit'] / $data['use_money']) * 100, 2) : 0;
$data['is_negative'] = $data['profit'] < 0;
return json(['code' => 0, 'msg' => '获取成功', 'data' => $data]);
}
}