Files
saasshop/resources/views/admin/dashboard.blade.php

230 lines
11 KiB
PHP
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.
@extends('admin.layouts.app')
@section('title', '总台管理仪表盘')
@section('page_title', '总台管理仪表盘')
@section('content')
@php
$incomingBack = (string) request()->query('back', '');
$safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack);
// 用于构建“从仪表盘跳到其它治理页后可返回仪表盘”的 back
$selfWithoutBack = \App\Support\BackUrl::selfWithoutBack();
$billingEntryLinks = [
'platform_orders' => \App\Support\BackUrl::withBack('/admin/platform-orders', $safeBackForLinks),
'site_subscriptions' => \App\Support\BackUrl::withBack('/admin/site-subscriptions', $safeBackForLinks),
'plans' => \App\Support\BackUrl::withBack('/admin/plans', $safeBackForLinks),
];
$platformOrdersQuickLinks = [
'unpaid_pending' => \App\Support\BackUrl::withBack('/admin/platform-orders?payment_status=unpaid&status=pending', $safeBackForLinks),
'paid_pending' => \App\Support\BackUrl::withBack('/admin/platform-orders?payment_status=paid&status=pending', $safeBackForLinks),
'syncable_only' => \App\Support\BackUrl::withBack('/admin/platform-orders?syncable_only=1', $safeBackForLinks),
'sync_failed' => \App\Support\BackUrl::withBack('/admin/platform-orders?sync_status=failed', $safeBackForLinks),
];
@endphp
<div class="page-header mb-20" data-page="admin.dashboard">
<div class="page-header-main">
<div>
<div class="page-header-title">总台管理仪表盘</div>
<div class="page-header-subtitle">欢迎回来,{{ $adminName }}。这里是平台运营方的全局总览入口(聚焦:收费闭环与治理动作可达)。</div>
</div>
<div class="page-header-actions">
<a class="btn" href="{!! $billingEntryLinks['platform_orders'] !!}">进入平台订单</a>
<a class="btn btn-secondary" href="{!! $billingEntryLinks['site_subscriptions'] !!}">进入订阅管理</a>
<a class="btn btn-secondary" href="{!! $billingEntryLinks['plans'] !!}">进入套餐管理</a>
</div>
</div>
<div class="page-header-meta">
<div>统计缓存:{{ $cacheMeta['store'] }} / TTL {{ $cacheMeta['ttl'] }}</div>
<div>当前视角:{{ $platformOverview['current_scope'] }}</div>
<div>活跃站点:{{ $platformOverview['active_merchants'] }}</div>
<div>待处理订单:{{ $platformOverview['pending_orders'] }}</div>
</div>
</div>
<div class="kpi-grid mb-20" data-role="kpi-grid">
@php
$kpiLinks = [
'merchants' => \App\Support\BackUrl::withBack('/admin/merchants', $selfWithoutBack),
'plans' => \App\Support\BackUrl::withBack('/admin/plans', $selfWithoutBack),
'site_subscriptions' => \App\Support\BackUrl::withBack('/admin/site-subscriptions', $selfWithoutBack),
'platform_orders' => \App\Support\BackUrl::withBack('/admin/platform-orders', $selfWithoutBack),
];
@endphp
<div class="card">
<div class="stat-card-title">站点</div>
<div class="stat-card-value"><a class="link" href="{!! $kpiLinks['merchants'] !!}">{{ $stats['merchants'] }}</a></div>
<div class="stat-card-footnote">全站点数量(总台视角)</div>
</div>
<div class="card">
<div class="stat-card-title">套餐</div>
<div class="stat-card-value"><a class="link" href="{!! $kpiLinks['plans'] !!}">{{ (int) ($stats['plans'] ?? 0) }}</a></div>
<div class="stat-card-footnote">可售套餐目录</div>
</div>
<div class="card">
<div class="stat-card-title">订阅</div>
<div class="stat-card-value"><a class="link" href="{!! $kpiLinks['site_subscriptions'] !!}">{{ (int) ($stats['site_subscriptions'] ?? 0) }}</a></div>
<div class="stat-card-footnote">站点订阅总量(收费主链)</div>
</div>
<div class="card">
<div class="stat-card-title">平台订单</div>
<div class="stat-card-value"><a class="link" href="{!! $kpiLinks['platform_orders'] !!}">{{ (int) ($stats['platform_orders'] ?? 0) }}</a></div>
<div class="stat-card-footnote">平台收费订单总量</div>
</div>
</div>
<div class="two-col mb-20" data-role="analysis-skeleton">
<div class="card">
<h3 class="mt-0">趋势</h3>
<div class="muted">(占位)后续接入:平台订单金额/笔数趋势、续费转化、同步成功率等。</div>
<div class="muted muted-xs mt-10">说明:当前阶段先对齐 Ant Design Pro Analysis 的版式骨架,聚合指标后续分步接入。</div>
</div>
<div class="card">
<h3 class="mt-0">排行</h3>
<div class="muted">(占位)后续接入:站点续费金额排行、套餐销量排行、异常订单排行等。</div>
<div class="muted muted-xs mt-10">说明:后续会补“时间范围切换 + 维度切换”的渐进增强交互。</div>
</div>
</div>
<div class="two-col mb-20">
<div class="card">
<h3 class="mt-0">收费工作台(快捷治理)</h3>
<div class="muted">聚焦收费闭环的日常治理入口:订单 订阅 套餐。</div>
<div class="mt-12">
<div class="muted">平台订单快捷筛选:</div>
<div class="actions mt-8">
<a class="btn btn-secondary btn-sm" href="{!! $platformOrdersQuickLinks['unpaid_pending'] !!}">待支付({{ (int) ($stats['platform_orders_unpaid_pending'] ?? 0) }}</a>
<a class="btn btn-secondary btn-sm" href="{!! $platformOrdersQuickLinks['paid_pending'] !!}">待生效({{ (int) ($stats['platform_orders_paid_pending'] ?? 0) }}</a>
<a class="btn btn-secondary btn-sm" href="{!! $platformOrdersQuickLinks['syncable_only'] !!}">可同步({{ (int) ($stats['platform_orders_syncable'] ?? 0) }}</a>
<a class="btn btn-secondary btn-sm" href="{!! $platformOrdersQuickLinks['sync_failed'] !!}">同步失败({{ (int) ($stats['platform_orders_sync_failed'] ?? 0) }}</a>
<a class="btn btn-secondary btn-sm" href="{!! \App\Support\BackUrl::withBack('/admin/platform-orders?renewal_missing_subscription=1', $selfWithoutBack) !!}">续费缺订阅({{ (int) ($stats['platform_orders_renewal_missing_subscription'] ?? 0) }}</a>
</div>
</div>
<div class="mt-12">
<div class="muted">订阅到期治理:</div>
<div class="actions mt-8">
<a class="btn btn-secondary btn-sm" href="{!! \App\Support\BackUrl::withBack('/admin/site-subscriptions?expiry=expiring_7d', $selfWithoutBack) !!}">7天内到期({{ (int) ($stats['site_subscriptions_expiring_7d'] ?? 0) }}</a>
<a class="btn btn-secondary btn-sm" href="{!! \App\Support\BackUrl::withBack('/admin/site-subscriptions?expiry=expired', $selfWithoutBack) !!}">已过期({{ (int) ($stats['site_subscriptions_expired'] ?? 0) }}</a>
</div>
</div>
<div class="muted muted-xs mt-10">说明:这里先把收费主链的高频治理入口收敛到仪表盘;后续再补趋势/排行的真实聚合。</div>
</div>
<div class="card">
<h3 class="mt-0">平台定位</h3>
<table>
<tr><th>后台角色</th><td>{{ $platformOverview['system_role'] }}</td></tr>
<tr><th>当前视角</th><td>{{ $platformOverview['current_scope'] }}</td></tr>
<tr><th>商家模式</th><td>{{ $platformOverview['merchant_mode'] }}</td></tr>
<tr><th>渠道数</th><td>{{ $platformOverview['channel_count'] }}</td></tr>
<tr><th>活跃商家</th><td>{{ $platformOverview['active_merchants'] }}</td></tr>
<tr><th>待处理订单</th><td>{{ $platformOverview['pending_orders'] }}</td></tr>
</table>
</div>
</div>
<div class="two-col mb-20" data-role="analysis-skeleton-row2">
<div class="card">
<div class="flex-between">
<h3 class="mt-0">最近平台订单</h3>
@php
$platformOrdersIndexUrl = \App\Support\BackUrl::withBack('/admin/platform-orders', $selfWithoutBack);
@endphp
<a class="muted" href="{!! $platformOrdersIndexUrl !!}">查看全部</a>
</div>
<table>
<thead>
<tr>
<th>订单号</th>
<th>类型</th>
<th>金额</th>
<th>支付</th>
<th>状态</th>
</tr>
</thead>
<tbody>
@forelse(($recentPlatformOrders ?? []) as $po)
@php
$poShowUrl = \App\Support\BackUrl::withBack('/admin/platform-orders/' . $po->id, $selfWithoutBack);
@endphp
<tr>
<td><a class="link" href="{!! $poShowUrl !!}">{{ $po->order_no }}</a></td>
<td>{{ $po->orderTypeLabel() }}</td>
<td>¥{{ number_format((float) $po->payable_amount, 2) }}</td>
<td>{{ $po->payment_status }}</td>
<td>{{ $po->status }}</td>
</tr>
@empty
<tr>
<td colspan="5" class="muted">暂无数据</td>
</tr>
@endforelse
</tbody>
</table>
<div class="muted muted-xs mt-10">说明:当前先接入最近订单列表;后续补“同步状态/站点/套餐/治理入口”。</div>
</div>
<div class="card">
<div class="flex-between">
<h3 class="mt-0">套餐订单占比Top5</h3>
<a class="muted" href="/admin/plans">查看套餐</a>
</div>
@php
$shareRows = (array) ($planOrderShare ?? []);
$totalOrders = 0;
foreach ($shareRows as $r) {
$totalOrders += (int) ($r['count'] ?? 0);
}
@endphp
<table>
<thead>
<tr>
<th>套餐</th>
<th>订单数</th>
<th>占比</th>
</tr>
</thead>
<tbody>
@forelse($shareRows as $row)
@php
$planId = (int) ($row['plan_id'] ?? 0);
$count = (int) ($row['count'] ?? 0);
$pct = $totalOrders > 0 ? round(($count / $totalOrders) * 100, 1) : 0;
$planName = (string) (($planIdToName[$planId] ?? '') ?: ('#' . $planId));
@endphp
@php
$planOrdersUrl = \App\Support\BackUrl::withBack(
'/admin/platform-orders?' . \Illuminate\Support\Arr::query(['plan_id' => $planId]),
$selfWithoutBack
);
@endphp
<tr>
<td><a class="link" href="{!! $planOrdersUrl !!}">{{ $planName }}</a></td>
<td>{{ $count }}</td>
<td>{{ $pct }}%</td>
</tr>
@empty
<tr>
<td colspan="3" class="muted">暂无数据</td>
</tr>
@endforelse
</tbody>
</table>
<div class="muted muted-xs mt-10">说明:当前口径为“平台订单按 plan_id 的数量占比Top5后续扩展到金额占比、渠道占比与时间范围切换。</div>
</div>
</div>
@endsection