@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 @empty @endforelse
日期 订单数 已付金额
{{ $d }} {{ (int) ($row['count'] ?? 0) }} ¥{{ number_format((float) ($row['paid_sum'] ?? 0), 2) }}
暂无数据
说明:先接入最小可用趋势数据;后续再补时间范围切换、维度切换与可视化图表。

排行(近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 @empty @endforelse
站点 订单数 已付金额
{{ $mname }} {{ (int) ($row['count'] ?? 0) }} ¥{{ number_format((float) ($row['paid_sum'] ?? 0), 2) }}
暂无数据
说明:先落最小可用 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 @empty @endforelse
订单号 类型 金额 支付 状态
{{ $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 !== '')
BMPA失败 进入集合
@endif
暂无数据
说明:当前先接入最近订单列表;后续补“同步状态/站点/套餐/治理入口”。

套餐订单占比(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 @empty @endforelse
套餐 订单数 占比
{{ $planName }} {{ $count }} {{ $pct }}%
暂无数据
说明:当前口径为“平台订单按 plan_id 的数量占比(Top5)”;后续扩展到金额占比、渠道占比与时间范围切换。
@endsection