文件
fenleixinxi/application/admin/controller/fc/Dashboard.php
MiAn cb12bf5fc8 feat: 新增地址选择插件及订阅消息等多项功能优化
- 新增地址选择插件,支持地图位置选择并返回地址和经纬度
- 新增微信订阅消息发送功能,支持审核结果、提现通知等场景
- 新增订单支付状态查询、提现收款人姓名保存等接口
- 新增服务区域管理,支持按省市区划分并同步到信息发布
- 新增资金流水和营收报表导出功能
- 新增可用优惠券查询、订单退款拆分处理等功能
- 优化后台角标显示、首页数据统计、UI配置下发等
- 修复订单支付并发问题、地区管理逻辑等
2026-10-22 17:14:56 +08:00

131 行
5.4 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?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();
}
}