From fd913357457a0af8f90947c490ed7879ea4e0455 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:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E7=9B=98=E9=A2=86=E5=88=B8=E5=92=8C?= =?UTF-8?q?=E6=AF=94=E4=BB=B7=E5=B9=BF=E5=91=8A=E6=94=B6=E7=9B=8A=E5=8D=A1?= =?UTF-8?q?=E6=94=B9=E8=AF=BB=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=85=A8=E9=87=8F?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=B0=8F=E8=AE=A1,=E6=BF=80=E5=8A=B1?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=8D=A1=E6=94=B9=E8=AF=BB=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=B0=8F=E8=AE=A1?= 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 | 10 +++++++--- src/lib/types.ts | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx index 725f4d5..f0ab98c 100644 --- a/src/app/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -131,19 +131,23 @@ function avgEcpm(report: AdRevenueReport | null) { function adTypeSummary(report: AdRevenueReport | null, adType: string) { if (!report) return null; if (report.by_ad_type?.[adType]) return report.by_ad_type[adType]; + // 优先用后端全量小计 type_stats(items 受 limit 分页截断,>1000 行的区间按 items 现算会漏旧数据) + const stat = report.type_stats?.[adType]; + if (stat) return { impressions: stat.impressions, revenue_yuan: stat.revenue_yuan }; const matched = report.items.filter((it) => it.ad_type === adType); if (matched.length === 0) return null; return { - ad_type: adType, impressions: matched.reduce((sum, it) => sum + it.impressions, 0), revenue_yuan: matched.reduce((sum, it) => sum + it.revenue_yuan, 0), - expected_coin: matched.reduce((sum, it) => sum + it.expected_coin, 0), - actual_coin: matched.reduce((sum, it) => sum + it.actual_coin, 0), }; } function adSceneSummary(report: AdRevenueReport | null, feedScene: 'coupon' | 'comparison') { if (!report) return null; + // 优先用后端全量小计 scene_stats:2026-07-02 起 items 不再含信息流逐条展示行(唯一带收益+场景的行), + // 按 items 现算恒为 0;scene_stats 在全量 events 上聚合且不受分页截断。旧后端无此字段时回退 items 现算。 + const stat = report.scene_stats?.[feedScene]; + if (stat) return { impressions: stat.impressions, revenue_yuan: stat.revenue_yuan }; const matched = report.items.filter((it) => it.feed_scene === feedScene); if (matched.length === 0) return null; return { diff --git a/src/lib/types.ts b/src/lib/types.ts index 781b829..c0e6a80 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -474,6 +474,10 @@ export interface AdRevenueReport { daily: AdRevenueDaily[]; // 按日期汇总序列(全量,供按天趋势图) hourly: AdRevenueHourly[]; // 按小时汇总序列(全量,供按小时趋势图;按天查询时为空) type_stats: Record; // 按广告类型小计;前端取 draw / reward_video + // 按信息流场景小计(comparison/coupon/welfare;全量,不受分页截断)。数据大盘「领券广告/比价广告」卡 + // 优先读它:2026-07-02 后端起 items 不再含信息流逐条展示行(唯一带收益+场景的行),按 items 现算恒 0。 + // 可选(`?.` 探测)以兼容未升级后端,缺失时回退 items 现算。 + scene_stats?: Record; // 可选:后端预聚合的「按广告类型」富小计(含发放金币明细)。当前后端未下发 → 数据大盘页 // (dashboard adTypeSummary)用 `?.` 探测、缺失时按 items 现算兜底;后端补上即自动启用。 by_ad_type?: Record<