feat(dashboard): 平台定位改为运营版北极星指标+治理Top3
This commit is contained in:
@@ -159,10 +159,13 @@ class DashboardController extends Controller
|
||||
]
|
||||
);
|
||||
|
||||
// 统一基准时间:避免本方法内多次 now() 调用在跨天瞬间造成口径漂移
|
||||
$baseNow = now();
|
||||
|
||||
// 趋势卡(最小可用):近 7 天平台订单按天统计(订单数 + 已付金额)
|
||||
$trendDays = 7;
|
||||
$trendStart = now()->startOfDay()->subDays($trendDays - 1);
|
||||
$trendEnd = now()->endOfDay();
|
||||
$trendStart = $baseNow->copy()->startOfDay()->subDays($trendDays - 1);
|
||||
$trendEnd = $baseNow->copy()->endOfDay();
|
||||
|
||||
// 统一提供给视图做“趋势/排行/占比”跳转的日期范围口径,避免 Blade 内重复 now() 计算导致漂移。
|
||||
$dashboardRangeFrom7d = (string) $trendStart->format('Y-m-d');
|
||||
@@ -264,6 +267,86 @@ class DashboardController extends Controller
|
||||
|
||||
$merchantIdToName = Merchant::query()->pluck('name', 'id')->all();
|
||||
|
||||
// 平台定位(运营版):北极星指标 + 明确治理入口(不暴露组合维度)
|
||||
$range30Start = $baseNow->copy()->subDays(29)->startOfDay();
|
||||
$range30End = $baseNow->copy()->endOfDay();
|
||||
$range30From = (string) $range30Start->format('Y-m-d');
|
||||
$range30To = (string) $range30End->format('Y-m-d');
|
||||
|
||||
$paidRevenue30d = (float) PlatformOrder::query()
|
||||
->where('payment_status', 'paid')
|
||||
->whereBetween('created_at', [$range30Start, $range30End])
|
||||
->sum('paid_amount');
|
||||
|
||||
$activePaidMerchants = (int) SiteSubscription::query()
|
||||
->whereNotNull('merchant_id')
|
||||
->where('status', 'activated')
|
||||
->whereNotNull('ends_at')
|
||||
->where('ends_at', '>=', $baseNow)
|
||||
->distinct()
|
||||
->count('merchant_id');
|
||||
|
||||
$renewalCreated30d = (int) PlatformOrder::query()
|
||||
->where('order_type', 'renewal')
|
||||
->whereBetween('created_at', [$range30Start, $range30End])
|
||||
->count();
|
||||
$renewalSuccess30d = (int) PlatformOrder::query()
|
||||
->where('order_type', 'renewal')
|
||||
->where('payment_status', 'paid')
|
||||
->where('status', 'activated')
|
||||
->whereBetween('created_at', [$range30Start, $range30End])
|
||||
->count();
|
||||
$renewalSuccessRate30d = $renewalCreated30d > 0
|
||||
? min(100, max(0, round(($renewalSuccess30d / $renewalCreated30d) * 100, 1)))
|
||||
: 0;
|
||||
|
||||
$funnelUnpaidPending7d = (int) PlatformOrder::query()
|
||||
->whereBetween('created_at', [$trendStart, $trendEnd])
|
||||
->where('payment_status', 'unpaid')
|
||||
->where('status', 'pending')
|
||||
->count();
|
||||
$funnelPaid7d = (int) PlatformOrder::query()
|
||||
->whereBetween('created_at', [$trendStart, $trendEnd])
|
||||
->where('payment_status', 'paid')
|
||||
->count();
|
||||
$funnelPaidActivated7d = (int) PlatformOrder::query()
|
||||
->whereBetween('created_at', [$trendStart, $trendEnd])
|
||||
->where('payment_status', 'paid')
|
||||
->where('status', 'activated')
|
||||
->count();
|
||||
|
||||
// 将平台定位的关键指标与“可执行动作入口”绑定(回到仪表盘自身)
|
||||
$opsLinks = [
|
||||
'revenue_30d_paid_orders' => \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
|
||||
'payment_status' => 'paid',
|
||||
'created_from' => $range30From,
|
||||
'created_to' => $range30To,
|
||||
]), \App\Support\BackUrl::selfWithoutBack()),
|
||||
'active_paid_merchants_subscriptions' => \App\Support\BackUrl::withBack('/admin/site-subscriptions?status=activated', \App\Support\BackUrl::selfWithoutBack()),
|
||||
'renewal_orders_30d' => \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
|
||||
'order_type' => 'renewal',
|
||||
'created_from' => $range30From,
|
||||
'created_to' => $range30To,
|
||||
]), \App\Support\BackUrl::selfWithoutBack()),
|
||||
'funnel_unpaid_pending_7d' => \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
|
||||
'payment_status' => 'unpaid',
|
||||
'status' => 'pending',
|
||||
'created_from' => $dashboardRangeFrom7d,
|
||||
'created_to' => $dashboardRangeTo7d,
|
||||
]), \App\Support\BackUrl::selfWithoutBack()),
|
||||
'funnel_paid_7d' => \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
|
||||
'payment_status' => 'paid',
|
||||
'created_from' => $dashboardRangeFrom7d,
|
||||
'created_to' => $dashboardRangeTo7d,
|
||||
]), \App\Support\BackUrl::selfWithoutBack()),
|
||||
'funnel_paid_activated_7d' => \App\Support\BackUrl::withBack('/admin/platform-orders?' . \Illuminate\Support\Arr::query([
|
||||
'payment_status' => 'paid',
|
||||
'status' => 'activated',
|
||||
'created_from' => $dashboardRangeFrom7d,
|
||||
'created_to' => $dashboardRangeTo7d,
|
||||
]), \App\Support\BackUrl::selfWithoutBack()),
|
||||
];
|
||||
|
||||
return view('admin.dashboard', [
|
||||
'adminName' => $admin->name,
|
||||
'stats' => $stats,
|
||||
@@ -283,6 +366,27 @@ class DashboardController extends Controller
|
||||
'store' => config('cache.default'),
|
||||
'ttl' => '10m',
|
||||
],
|
||||
'platformOpsOverview' => [
|
||||
// 北极星指标
|
||||
'paid_revenue_30d' => $paidRevenue30d,
|
||||
'active_paid_merchants' => $activePaidMerchants,
|
||||
'renewal_success_rate_30d' => $renewalSuccessRate30d,
|
||||
'renewal_success_30d' => $renewalSuccess30d,
|
||||
'renewal_created_30d' => $renewalCreated30d,
|
||||
|
||||
// 漏斗(近7天)
|
||||
'funnel_unpaid_pending_7d' => $funnelUnpaidPending7d,
|
||||
'funnel_paid_7d' => $funnelPaid7d,
|
||||
'funnel_paid_activated_7d' => $funnelPaidActivated7d,
|
||||
|
||||
// 待处理治理(积压口径,全量)
|
||||
'govern_bmpa_processable' => (int) ($stats['platform_orders_unpaid_pending'] ?? 0),
|
||||
'govern_syncable' => (int) ($stats['platform_orders_syncable'] ?? 0),
|
||||
'govern_sync_failed' => (int) ($stats['platform_orders_sync_failed'] ?? 0),
|
||||
|
||||
'links' => $opsLinks,
|
||||
],
|
||||
|
||||
'platformOverview' => [
|
||||
'system_role' => '总台管理',
|
||||
'current_scope' => '总台运营方视角',
|
||||
|
||||
Reference in New Issue
Block a user