From dd84d771f9185a18ccbd1abe3f2a2c2c3eb78f62 Mon Sep 17 00:00:00 2001 From: zhuzihao Date: Mon, 6 Jul 2026 00:23:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(ad-revenue):=20=E6=94=B6=E7=9B=8A=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=20DAU/ARPU=20=E9=9A=8F=E6=89=80=E9=80=89=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E6=98=BE=E7=A4=BA(=E4=BB=8A=E6=97=A5/=E8=BF=917?= =?UTF-8?q?=E5=A4=A9/=E8=BF=9130=E5=A4=A9)=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DAU/ARPU 不再写死「今日」:随查询区间显示——今日仍为「今日活跃 DAU / ARPU(今日)」, 多天为「活跃用户 / ARPU」;tooltip 标出统计区间与口径(同数据大盘:登录 + 开始比价 + 开始领券,全局去重、不随筛选变化)。 - 「核心指标」分隔线追加「· 统计区间 X」;更新 dau 类型注释与 ARPU 派生注释。 - 依赖后端把 dau 改为按区间统计(见 app-server 对应 PR):原多天返回 null 显示「-」, 现在近 7 天 / 近 30 天有值。 Co-Authored-By: Claude Opus 4.8 --------- Co-authored-by: zzhyyyyy <2685922758@qq.com> Reviewed-on: https://gitea.shaguabijia.com/WonderableAI/shaguabijia-admin-web/pulls/38 Co-authored-by: zhuzihao Co-committed-by: zhuzihao --- src/app/(main)/ad-revenue-report/page.tsx | 30 +++++++++++++++++------ src/lib/types.ts | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/app/(main)/ad-revenue-report/page.tsx b/src/app/(main)/ad-revenue-report/page.tsx index ad69746..5288f92 100644 --- a/src/app/(main)/ad-revenue-report/page.tsx +++ b/src/app/(main)/ad-revenue-report/page.tsx @@ -490,7 +490,7 @@ export default function AdRevenueReportPage() { // 派生指标(全部基于全量 total_* 字段,不受分页影响,准): // 发奖成本(元)= 实发金币÷汇率;预估毛利 = 收益−发奖成本;发奖占收益比 = 发奖成本÷收益; - // 应发实发差额(金币)= 应发−实发(正=少发/负=多发);ARPU = 预估收益÷今日DAU(仅今日)。 + // 应发实发差额(金币)= 应发−实发(正=少发/负=多发);ARPU = 区间预估收益÷区间活跃用户(见 dau)。 const derived = data ? { payoutYuan: data.total_actual_coin / COIN_PER_YUAN, @@ -500,11 +500,23 @@ export default function AdRevenueReportPage() { ? (data.total_actual_coin / COIN_PER_YUAN / data.total_revenue_yuan) * 100 : null, coinGap: data.total_expected_coin - data.total_actual_coin, - // ARPU(今日)= 预估广告收益 ÷ 今日 DAU;dau 为 null(历史/多天)或 0 时不可算 → null,前端显示「-」。 + // ARPU = 区间预估广告收益 ÷ 区间去重活跃用户(dau,口径同数据大盘);dau 为 0 时不可算 → null,显示「-」。 arpu: data.dau && data.dau > 0 ? data.total_revenue_yuan / data.dau : null, } : null; + // DAU / ARPU 的统计区间 = 本次查询的 date_from~date_to(后端 period_active_dau 同口径按此区间算); + // 今日单天特殊标注「今日」,便于「今日 / 近 7 天 / 近 30 天」三个时段分别看 ARPU。 + const dauRangeIsToday = + !!data && data.date_from === data.date_to && data.date_to === dayjs().format('YYYY-MM-DD'); + const dauRangeLabel = !data + ? '' + : data.date_from === data.date_to + ? dauRangeIsToday + ? '今日' + : data.date_from + : `${data.date_from} ~ ${data.date_to}`; + // 第二行大盘「分广告类型」:draw / 激励视频 各自 收益 / eCPM / 展示条数;eCPM = 收益÷展示×1000。 const drawStat = data?.type_stats?.draw; const rvStat = data?.type_stats?.reward_video; @@ -657,7 +669,7 @@ export default function AdRevenueReportPage() { - 核心指标 + 核心指标{dauRangeLabel ? ` · 统计区间 ${dauRangeLabel}` : ''} @@ -667,9 +679,11 @@ export default function AdRevenueReportPage() { + - ARPU(今日) + {dauRangeIsToday ? 'ARPU(今日)' : 'ARPU'} @@ -681,9 +695,11 @@ export default function AdRevenueReportPage() { + - 今日活跃 DAU + {dauRangeIsToday ? '今日活跃 DAU' : '活跃用户'} diff --git a/src/lib/types.ts b/src/lib/types.ts index 781b829..4a8e52a 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -480,7 +480,7 @@ export interface AdRevenueReport { string, { ad_type: string; impressions: number; revenue_yuan: number; expected_coin: number; actual_coin: number } >; - dau: number | null; // 今日活跃(复用大盘 last_login_at);仅查询=今日时有值,否则 null + dau: number | null; // 区间去重活跃用户(口径同数据大盘 period.users.active:登录+开始比价+开始领券);按查询区间统计、含今日,全局口径不随筛选变化 total: number; // 当前筛选下的分页总条数(全量,不受分页影响) truncated: boolean; // 当前页之后是否还有更多事件(分页后前端不再据此报警) total_impressions: number;