feat(admin-dashboard): clarify plan share top5 meta with total and coverage

This commit is contained in:
萝卜
2026-03-16 13:49:56 +08:00
parent 0f07fe7c8b
commit a9f1185f84
3 changed files with 61 additions and 4 deletions

View File

@@ -197,6 +197,14 @@ class DashboardController extends Controller
->get(); ->get();
// 占比卡(最小可用):近 7 天按套餐统计平台订单数量 TopN // 占比卡(最小可用):近 7 天按套餐统计平台订单数量 TopN
// 说明:
// - Top5 数据用于“对比/聚焦”(减少噪音)
// - total 用于计算“占比/覆盖率”,避免将 Top5 误当全量
$planOrderShareTotal = PlatformOrder::query()
->whereBetween('created_at', [$trendStart, $trendEnd])
->whereNotNull('plan_id')
->count();
$planOrderShare = PlatformOrder::query() $planOrderShare = PlatformOrder::query()
->selectRaw('plan_id, COUNT(*) as cnt') ->selectRaw('plan_id, COUNT(*) as cnt')
->whereBetween('created_at', [$trendStart, $trendEnd]) ->whereBetween('created_at', [$trendStart, $trendEnd])
@@ -243,6 +251,7 @@ class DashboardController extends Controller
'platformOrderTrend7d' => $platformOrderTrend7d, 'platformOrderTrend7d' => $platformOrderTrend7d,
'recentPlatformOrders' => $recentPlatformOrders, 'recentPlatformOrders' => $recentPlatformOrders,
'planOrderShare' => $planOrderShare, 'planOrderShare' => $planOrderShare,
'planOrderShareTotal' => (int) $planOrderShareTotal,
'planIdToName' => $planIdToName, 'planIdToName' => $planIdToName,
'merchantRevenueRank7d' => $merchantRevenueRank7d, 'merchantRevenueRank7d' => $merchantRevenueRank7d,
'merchantIdToName' => $merchantIdToName, 'merchantIdToName' => $merchantIdToName,

View File

@@ -374,9 +374,14 @@
@php @php
$shareRows = (array) ($planOrderShare ?? []); $shareRows = (array) ($planOrderShare ?? []);
$totalOrders = 0; $top5Orders = 0;
foreach ($shareRows as $r) { foreach ($shareRows as $r) {
$totalOrders += (int) ($r['count'] ?? 0); $top5Orders += (int) ($r['count'] ?? 0);
}
$totalOrders = (int) ($planOrderShareTotal ?? 0);
if ($totalOrders <= 0) {
// 兜底:兼容旧数据(未传 total 时,至少不影响渲染)
$totalOrders = (int) $top5Orders;
} }
@endphp @endphp
@@ -401,9 +406,14 @@
$shareTop1Count = max($shareTop1Count, (int) ($r['count'] ?? 0)); $shareTop1Count = max($shareTop1Count, (int) ($r['count'] ?? 0));
} }
$shareTop1Pct = $totalOrders > 0 ? round(($shareTop1Count / $totalOrders) * 100, 1) : 0; $shareTop1Pct = $totalOrders > 0 ? round(($shareTop1Count / $totalOrders) * 100, 1) : 0;
$shareCoveragePct = $totalOrders > 0 ? round(($top5Orders / $totalOrders) * 100, 1) : 0;
@endphp @endphp
<div class="adm-mini-meta" data-role="plan-order-share-top5-meta"> <div class="adm-mini-meta" data-role="plan-order-share-top5-meta">
<span class="adm-mini-meta-item">Top5合计订单:<strong>{{ (int) $totalOrders }}</strong></span> <span class="adm-mini-meta-item">全量订单:<strong>{{ (int) $totalOrders }}</strong></span>
<span class="adm-mini-meta-sep"></span>
<span class="adm-mini-meta-item">Top5合计<strong>{{ (int) $top5Orders }}</strong></span>
<span class="adm-mini-meta-sep"></span>
<span class="adm-mini-meta-item">覆盖率:<strong>{{ $shareCoveragePct }}%</strong></span>
<span class="adm-mini-meta-sep"></span> <span class="adm-mini-meta-sep"></span>
<span class="adm-mini-meta-item">Top1占比<strong>{{ $shareTop1Pct }}%</strong></span> <span class="adm-mini-meta-item">Top1占比<strong>{{ $shareTop1Pct }}%</strong></span>
</div> </div>
@@ -426,7 +436,11 @@
@endphp @endphp
@php @php
$planOrdersUrl = \App\Support\BackUrl::withBack( $planOrdersUrl = \App\Support\BackUrl::withBack(
'/admin/platform-orders?' . \Illuminate\Support\Arr::query(['plan_id' => $planId]), '/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'plan_id' => $planId,
'created_from' => now()->subDays(6)->format('Y-m-d'),
'created_to' => now()->format('Y-m-d'),
]),
$selfWithoutBack $selfWithoutBack
); );
@endphp @endphp

View File

@@ -0,0 +1,34 @@
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminDashboardPlanOrderShareTop5MetaShouldIncludeCoverageTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_dashboard_plan_order_share_top5_meta_should_include_total_and_coverage(): void
{
$this->loginAsPlatformAdmin();
$res = $this->get('/admin');
$res->assertOk();
// 护栏Top5 摘要行应同时声明“全量口径”和“覆盖率”,避免运营误解 Top5=全部
$res->assertSee('data-role="plan-order-share-top5-meta"', false);
$res->assertSee('全量订单', false);
$res->assertSee('覆盖率', false);
}
}