- 新增地址选择插件,支持地图位置选择并返回地址和经纬度 - 新增微信订阅消息发送功能,支持审核结果、提现通知等场景 - 新增订单支付状态查询、提现收款人姓名保存等接口 - 新增服务区域管理,支持按省市区划分并同步到信息发布 - 新增资金流水和营收报表导出功能 - 新增可用优惠券查询、订单退款拆分处理等功能 - 优化后台角标显示、首页数据统计、UI配置下发等 - 修复订单支付并发问题、地区管理逻辑等
131 行
5.4 KiB
PHP
131 行
5.4 KiB
PHP
<?php
|
||
|
||
namespace app\admin\controller\fc;
|
||
|
||
use app\common\controller\Backend;
|
||
use think\Db;
|
||
|
||
/**
|
||
* 同城-数据总览
|
||
*
|
||
* 后台核心看板:今日/累计发布量、待审核数、今日/累计订单额、会员数、商家数、
|
||
* 分销佣金(待结算/已结算)、提现待审数,以及近 14 天趋势(发布量 / 订单额 / 新增注册用户)。
|
||
* 数据一律由本控制器直接查库(fa_fc_* / fa_user),不在视图里写 SQL,也不走 /api/v1/admin/**。
|
||
*
|
||
* @icon fa fa-dashboard
|
||
*/
|
||
class Dashboard extends Backend
|
||
{
|
||
/** 趋势统计天数 */
|
||
const TREND_DAYS = 14;
|
||
|
||
/**
|
||
* 查看
|
||
*/
|
||
public function index()
|
||
{
|
||
$todayStart = strtotime('today');
|
||
$todayEnd = $todayStart + 86400 - 1;
|
||
|
||
/* ---------- 核心指标 ---------- */
|
||
$metrics = [
|
||
// 发布量
|
||
'todayPost' => (int)Db::name('fc_post')->where('createtime', 'between', [$todayStart, $todayEnd])->count(),
|
||
'totalPost' => (int)Db::name('fc_post')->count(),
|
||
'pendingPost' => (int)Db::name('fc_post')->where('audit_status', 0)->count(),
|
||
// 订单额(仅统计已支付订单;paytime 缺失时回落 createtime)
|
||
'todayOrderAmount' => round((float)Db::name('fc_order')->where('status', 'paid')
|
||
->whereTime('paytime|createtime', 'between', [$todayStart, $todayEnd])->sum('amount'), 2),
|
||
'totalOrderAmount' => round((float)Db::name('fc_order')->where('status', 'paid')->sum('amount'), 2),
|
||
// 用户 / 商家
|
||
'memberCount' => (int)Db::name('fc_user_ext')->where('is_member', 1)->count(),
|
||
'merchantCount' => (int)Db::name('fc_merchant')->count(),
|
||
'userCount' => (int)Db::name('user')->count(),
|
||
// 分销佣金
|
||
'commissionPending' => round((float)Db::name('fc_commission')->where('status', 0)->sum('amount'), 2),
|
||
'commissionSettled' => round((float)Db::name('fc_commission')->where('status', 1)->sum('amount'), 2),
|
||
// 提现待审核
|
||
'withdrawAuditing' => (int)Db::name('fc_withdraw')->where('status', 'auditing')->count(),
|
||
];
|
||
|
||
/* ---------- 近 14 天趋势 ---------- */
|
||
$dateStart = $todayStart - (self::TREND_DAYS - 1) * 86400;
|
||
$days = [];
|
||
for ($i = 0; $i < self::TREND_DAYS; $i++) {
|
||
$days[] = date('Y-m-d', $dateStart + $i * 86400);
|
||
}
|
||
|
||
// 每天发布量
|
||
$postsMap = [];
|
||
$posts = Db::name('fc_post')
|
||
->where('createtime', 'between time', [$dateStart, $todayEnd])
|
||
->fieldRaw("FROM_UNIXTIME(`createtime`,'%Y-%m-%d') AS day, COUNT(*) AS num")
|
||
->group('day')
|
||
->select();
|
||
foreach ($posts as $row) {
|
||
$postsMap[$row['day']] = (int)$row['num'];
|
||
}
|
||
|
||
// 每天订单额(已支付;paytime 为空时按 createtime 归属)
|
||
$ordersMap = [];
|
||
$orders = Db::name('fc_order')
|
||
->where('status', 'paid')
|
||
->whereTime('paytime|createtime', 'between', [$dateStart, $todayEnd])
|
||
->fieldRaw("FROM_UNIXTIME(IFNULL(`paytime`,`createtime`),'%Y-%m-%d') AS day, SUM(`amount`) AS num")
|
||
->group('day')
|
||
->select();
|
||
foreach ($orders as $row) {
|
||
$ordersMap[$row['day']] = round((float)$row['num'], 2);
|
||
}
|
||
|
||
// 每天新增注册用户(fa_user.createtime)
|
||
$membersMap = [];
|
||
$members = Db::name('user')
|
||
->where('createtime', 'between time', [$dateStart, $todayEnd])
|
||
->fieldRaw("FROM_UNIXTIME(`createtime`,'%Y-%m-%d') AS day, COUNT(*) AS num")
|
||
->group('day')
|
||
->select();
|
||
foreach ($members as $row) {
|
||
$membersMap[$row['day']] = (int)$row['num'];
|
||
}
|
||
|
||
/* ---------- 今日较昨日的变化(用于首页涨跌标识) ---------- */
|
||
$yesterday = date('Y-m-d', $todayStart - 86400);
|
||
$metrics['yesterdayPost'] = isset($postsMap[$yesterday]) ? $postsMap[$yesterday] : 0;
|
||
$metrics['yesterdayOrder'] = isset($ordersMap[$yesterday]) ? $ordersMap[$yesterday] : 0;
|
||
$metrics['postDelta'] = $metrics['todayPost'] - $metrics['yesterdayPost'];
|
||
$metrics['orderDelta'] = round($metrics['todayOrderAmount'] - $metrics['yesterdayOrder'], 2);
|
||
|
||
$trend = [
|
||
'dates' => $days,
|
||
'posts' => [],
|
||
'orders' => [],
|
||
'members' => [],
|
||
];
|
||
$trendRows = [];
|
||
foreach ($days as $day) {
|
||
$postNum = isset($postsMap[$day]) ? $postsMap[$day] : 0;
|
||
$orderNum = isset($ordersMap[$day]) ? $ordersMap[$day] : 0;
|
||
$memberNum = isset($membersMap[$day]) ? $membersMap[$day] : 0;
|
||
|
||
$trend['posts'][] = $postNum;
|
||
$trend['orders'][] = $orderNum;
|
||
$trend['members'][] = $memberNum;
|
||
|
||
$trendRows[] = [
|
||
'date' => $day,
|
||
'posts' => $postNum,
|
||
'orders' => $orderNum,
|
||
'members' => $memberNum,
|
||
];
|
||
}
|
||
|
||
$this->view->assign('metrics', $metrics);
|
||
$this->view->assign('trendRows', $trendRows);
|
||
$this->view->assign('updatedAt', date('Y-m-d H:i'));
|
||
$this->assignconfig('trend', $trend);
|
||
|
||
return $this->view->fetch();
|
||
}
|
||
}
|