200 lines
8.8 KiB
PHP
200 lines
8.8 KiB
PHP
@extends('admin.layouts.app')
|
||
|
||
@section('title', '总台管理仪表盘')
|
||
@section('page_title', '总台管理仪表盘')
|
||
|
||
@section('content')
|
||
@php
|
||
$incomingBack = (string) request()->query('back', '');
|
||
$safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack);
|
||
|
||
$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">
|
||
<div class="card">
|
||
<div class="stat-card-title">站点</div>
|
||
<div class="stat-card-value">{{ $stats['merchants'] }}</div>
|
||
<div class="stat-card-footnote">全站点数量(总台视角)</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="stat-card-title">管理员</div>
|
||
<div class="stat-card-value">{{ $stats['admins'] }}</div>
|
||
<div class="stat-card-footnote">平台/站点后台账号</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="stat-card-title">用户</div>
|
||
<div class="stat-card-value">{{ $stats['users'] }}</div>
|
||
<div class="stat-card-footnote">买家端用户累计</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="stat-card-title">订单</div>
|
||
<div class="stat-card-value">{{ $stats['orders'] }}</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'] !!}">可同步</a>
|
||
<a class="btn btn-secondary btn-sm" href="{!! $platformOrdersQuickLinks['sync_failed'] !!}">同步失败({{ (int) ($stats['platform_orders_sync_failed'] ?? 0) }})</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="muted muted-xs mt-10">说明:这里先落“入口与布局骨架”,后续会把 KPI/趋势/排行 接入真实聚合指标。</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>
|
||
<a class="muted" href="/admin/platform-orders">查看全部</a>
|
||
</div>
|
||
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>订单号</th>
|
||
<th>类型</th>
|
||
<th>金额</th>
|
||
<th>支付</th>
|
||
<th>状态</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
@forelse(($recentPlatformOrders ?? []) as $po)
|
||
@php
|
||
$poShowUrl = '/admin/platform-orders/' . $po->id;
|
||
@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
|
||
<tr>
|
||
<td>{{ $planName }}</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
|