数据大盘新增领券核心数据区块

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
陈世睿
2026-07-05 15:03:30 +08:00
parent 2994b75dab
commit f9ed7d2558
2 changed files with 73 additions and 0 deletions
+62
View File
@@ -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() {
</div>
</section>
<section className="section">
<div className="section-head">
<span className="bar" />
<h3></h3>
<span></span>
</div>
<div className="grid g4">
<StatCard
title="领券发起数"
value={fmtInt(couponPeriod?.started)}
unit="次"
delta={couponStartedDelta.value}
deltaTone={couponStartedDelta.tone}
/>
<StatCard
title="领券成功率"
value={couponSuccessRateValue}
unit="%"
delta={couponSuccessRateDelta.value}
deltaTone={couponSuccessRateDelta.tone}
hint={`全部点位领成功的次数 / 领券发起数;本期 ${fmtInt(couponPeriod?.all_success)} / ${fmtInt(
couponPeriod?.started,
)} 次。点位成功口径含「今日已领过」。`}
/>
<StatCard
title="点位成功率"
value={couponPointRateValue}
unit="%"
delta={couponPointRateDelta.value}
deltaTone={couponPointRateDelta.tone}
hint={`成功点位数 / (领券发起数 × 每次应领点位数);中途退出未跑到的点位计入分母视为失败。本期成功点位 ${fmtInt(
couponPeriod?.point_success,
)} 个,每次应领 ${fmtInt(couponPeriod?.points_per_session)} 个(按本期完成场自动校准)。`}
/>
<StatCard
title="耗时中位数"
value={fmtMsAsSeconds(couponPeriod?.median_elapsed_ms)}
unit="秒"
delta={couponMedianDelta.value}
deltaTone={couponMedianDelta.tone}
hint="仅统计「完成」的领券(同领券数据页口径),中位数比均值更抗中途暂停等待的长尾。"
/>
</div>
</section>
<section className="section">
<div className="section-head">
<span className="bar" />
+11
View File
@@ -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;