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