From f9ed7d25588e64226afe43f9736eeb97221681ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B8=96=E7=9D=BF?= <2839904623@qq.com> Date: Sun, 5 Jul 2026 15:03:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=A7=E7=9B=98=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=A2=86=E5=88=B8=E6=A0=B8=E5=BF=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8C=BA=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app/(main)/dashboard/page.tsx | 62 +++++++++++++++++++++++++++++++ src/lib/types.ts | 11 ++++++ 2 files changed, 73 insertions(+) diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx index af8fc5f..0046929 100644 --- a/src/app/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -526,6 +526,23 @@ export default function DashboardPage() { periodData?.comparison.average_duration_ms, previousPeriodData?.comparison.average_duration_ms, ); + // 领券核心数据(period.coupon;旧后端无此字段时整节显示 '--') + const couponPeriod = periodData?.coupon ?? null; + const previousCouponPeriod = previousPeriodData?.coupon ?? null; + const couponStartedDelta = percentDelta(couponPeriod?.started, previousCouponPeriod?.started); + const couponSuccessRateValue = + couponPeriod?.success_rate == null ? '--' : (couponPeriod.success_rate * 100).toFixed(1); + const couponSuccessRateDelta = pointDelta(couponPeriod?.success_rate, previousCouponPeriod?.success_rate); + const couponPointRateValue = + couponPeriod?.point_success_rate == null ? '--' : (couponPeriod.point_success_rate * 100).toFixed(1); + const couponPointRateDelta = pointDelta( + couponPeriod?.point_success_rate, + previousCouponPeriod?.point_success_rate, + ); + const couponMedianDelta = durationDelta( + couponPeriod?.median_elapsed_ms, + previousCouponPeriod?.median_elapsed_ms, + ); const averageSavedDelta = moneyDeltaCents( periodData?.comparison.average_saved_cents, previousPeriodData?.comparison.average_saved_cents, @@ -766,6 +783,51 @@ export default function DashboardPage() { +
+
+ +

领券核心数据

+ 发起、整场成功、点位成功与效率 +
+
+ + + + +
+
+
diff --git a/src/lib/types.ts b/src/lib/types.ts index 11b8806..209c482 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -546,6 +546,17 @@ export interface DashboardOverview { average_duration_ms: number | null; average_saved_cents: number | null; }; + // 领券核心数据(2026-07-05 新增;旧后端无此字段,前端 `?.` 探测)。 + // 点位=一张券;成功口径 success+already_claimed;点位成功率分母=发起数×应领点位数(未跑到视为失败)。 + coupon?: { + started: number; + all_success: number; // 全部点位领成功的完成场次数 + success_rate: number | null; + point_success: number; + points_per_session: number | null; // 应领点位数(本期完成场点位数众数) + point_success_rate: number | null; + median_elapsed_ms: number | null; // 仅 completed,同「领券数据」页口径 + }; coins: { granted_total: number; reward_video_coin_total: number;