@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,并显式锁定 sync_status=unsynced(排除同步失败等异常单)
'paid_pending' => \App\Support\BackUrl::withBack('/admin/platform-orders?payment_status=paid&status=pending&sync_status=unsynced', $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
@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
趋势
近7天平台订单(按天)
@php
$trendRows = (array) ($platformOrderTrend7d ?? []);
// 用于前端渐进增强渲染迷你图表(JS 读取 data-points)
$trendPoints = [];
foreach ($trendRows as $r) {
$trendPoints[] = [
'date' => (string) ($r['date'] ?? ''),
'count' => (int) ($r['count'] ?? 0),
'paid_sum' => (float) ($r['paid_sum'] ?? 0),
];
}
@endphp
| 日期 |
订单数 |
已付金额 |
@forelse($trendRows as $row)
@php
$d = (string) ($row['date'] ?? '');
$dayOrdersUrl = \App\Support\BackUrl::withBack(
'/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'created_from' => $d,
'created_to' => $d,
]),
$selfWithoutBack
);
@endphp
| {{ $d }} |
{{ (int) ($row['count'] ?? 0) }} |
¥{{ number_format((float) ($row['paid_sum'] ?? 0), 2) }} |
@empty
| 暂无数据 |
@endforelse
说明:先接入最小可用趋势数据;后续再补时间范围切换、维度切换与可视化图表。
排行(近7天站点收入 Top5)
@php
$rankRows = (array) ($merchantRevenueRank7d ?? []);
$rankTotal = 0.0;
foreach ($rankRows as $r) {
$rankTotal += (float) ($r['paid_sum'] ?? 0);
}
@endphp
Top5 合计已付 ¥{{ number_format($rankTotal, 2) }}
| 站点 |
订单数 |
已付金额 |
@forelse($rankRows as $row)
@php
$mid = (int) ($row['merchant_id'] ?? 0);
$mname = (string) (($merchantIdToName[$mid] ?? '') ?: ('#' . $mid));
$merchantOrdersUrl = \App\Support\BackUrl::withBack(
'/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'merchant_id' => $mid,
'created_from' => now()->subDays(6)->format('Y-m-d'),
'created_to' => now()->format('Y-m-d'),
]),
$selfWithoutBack
);
@endphp
| {{ $mname }} |
{{ (int) ($row['count'] ?? 0) }} |
¥{{ number_format((float) ($row['paid_sum'] ?? 0), 2) }} |
@empty
| 暂无数据 |
@endforelse
说明:先落最小可用 Top5 排行;后续补时间范围切换、维度切换与异常排行。
收费工作台(快捷治理)
聚焦收费闭环的日常治理入口:订单 → 订阅 → 套餐。
说明:这里先把收费主链的高频治理入口收敛到仪表盘;后续再补趋势/排行的真实聚合。
平台定位
| 后台角色 | {{ $platformOverview['system_role'] }} |
| 当前视角 | {{ $platformOverview['current_scope'] }} |
| 商家模式 | {{ $platformOverview['merchant_mode'] }} |
| 渠道数 | {{ $platformOverview['channel_count'] }} |
| 活跃商家 | {{ $platformOverview['active_merchants'] }} |
| 待处理订单 | {{ $platformOverview['pending_orders'] }} |
最近平台订单
@php
$platformOrdersIndexUrl = \App\Support\BackUrl::withBack('/admin/platform-orders', $selfWithoutBack);
@endphp
查看全部
| 订单号 |
类型 |
金额 |
支付 |
状态 |
@forelse(($recentPlatformOrders ?? []) as $po)
@php
$poShowUrl = \App\Support\BackUrl::withBack('/admin/platform-orders/' . $po->id, $selfWithoutBack);
$hasReceiptEvidence = (data_get($po->meta, 'payment_summary.total_amount') !== null)
|| (data_get($po->meta, 'payment_receipts.0.amount') !== null);
$fixReceiptUrl = \App\Support\BackUrl::withBackAndFragment('/admin/platform-orders/' . $po->id, $selfWithoutBack, 'add-payment-receipt');
$syncErrMsg = (string) (data_get($po->meta, 'subscription_activation_error.message') ?? '');
$bmpaErrMsg = (string) (data_get($po->meta, 'batch_mark_paid_and_activate_error.message') ?? '');
$syncFailedListUrl = \App\Support\BackUrl::withBack('/admin/platform-orders?sync_status=failed', $selfWithoutBack);
$bmpaFailedListUrl = \App\Support\BackUrl::withBack('/admin/platform-orders?bmpa_failed_only=1', $selfWithoutBack);
@endphp
| {{ $po->order_no }} |
{{ $po->orderTypeLabel() }} |
¥{{ number_format((float) $po->payable_amount, 2) }} |
{{ $po->payment_status }}
@if((string) $po->payment_status === 'paid' && ! $hasReceiptEvidence)
@endif
|
{{ $po->status }}
@if($syncErrMsg !== '')
@endif
@if($bmpaErrMsg !== '')
@endif
|
@empty
| 暂无数据 |
@endforelse
说明:当前先接入最近订单列表;后续补“同步状态/站点/套餐/治理入口”。
套餐订单占比(Top5)
@php
$plansIndexUrl = \App\Support\BackUrl::withBack('/admin/plans', $selfWithoutBack);
@endphp
查看套餐
@php
$shareRows = (array) ($planOrderShare ?? []);
$totalOrders = 0;
foreach ($shareRows as $r) {
$totalOrders += (int) ($r['count'] ?? 0);
}
@endphp
| 套餐 |
订单数 |
占比 |
@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
| {{ $planName }} |
{{ $count }} |
{{ $pct }}% |
@empty
| 暂无数据 |
@endforelse
说明:当前口径为“平台订单按 plan_id 的数量占比(Top5)”;后续扩展到金额占比、渠道占比与时间范围切换。
@endsection