feat(ad-revenue): 收益报表 DAU/ARPU 随所选区间显示(今日/近7天/近30天) (#38)
- DAU/ARPU 不再写死「今日」:随查询区间显示——今日仍为「今日活跃 DAU / ARPU(今日)」, 多天为「活跃用户 / ARPU」;tooltip 标出统计区间与口径(同数据大盘:登录 + 开始比价 + 开始领券,全局去重、不随筛选变化)。 - 「核心指标」分隔线追加「· 统计区间 X」;更新 dau 类型注释与 ARPU 派生注释。 - 依赖后端把 dau 改为按区间统计(见 app-server 对应 PR):原多天返回 null 显示「-」, 现在近 7 天 / 近 30 天有值。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: zzhyyyyy <2685922758@qq.com> Reviewed-on: #38 Co-authored-by: zhuzihao <zhuzihao@wonderable.ai> Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
This commit was merged in pull request #38.
This commit is contained in:
@@ -490,7 +490,7 @@ export default function AdRevenueReportPage() {
|
|||||||
|
|
||||||
// 派生指标(全部基于全量 total_* 字段,不受分页影响,准):
|
// 派生指标(全部基于全量 total_* 字段,不受分页影响,准):
|
||||||
// 发奖成本(元)= 实发金币÷汇率;预估毛利 = 收益−发奖成本;发奖占收益比 = 发奖成本÷收益;
|
// 发奖成本(元)= 实发金币÷汇率;预估毛利 = 收益−发奖成本;发奖占收益比 = 发奖成本÷收益;
|
||||||
// 应发实发差额(金币)= 应发−实发(正=少发/负=多发);ARPU = 预估收益÷今日DAU(仅今日)。
|
// 应发实发差额(金币)= 应发−实发(正=少发/负=多发);ARPU = 区间预估收益÷区间活跃用户(见 dau)。
|
||||||
const derived = data
|
const derived = data
|
||||||
? {
|
? {
|
||||||
payoutYuan: data.total_actual_coin / COIN_PER_YUAN,
|
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
|
? (data.total_actual_coin / COIN_PER_YUAN / data.total_revenue_yuan) * 100
|
||||||
: null,
|
: null,
|
||||||
coinGap: data.total_expected_coin - data.total_actual_coin,
|
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,
|
arpu: data.dau && data.dau > 0 ? data.total_revenue_yuan / data.dau : null,
|
||||||
}
|
}
|
||||||
: 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。
|
// 第二行大盘「分广告类型」:draw / 激励视频 各自 收益 / eCPM / 展示条数;eCPM = 收益÷展示×1000。
|
||||||
const drawStat = data?.type_stats?.draw;
|
const drawStat = data?.type_stats?.draw;
|
||||||
const rvStat = data?.type_stats?.reward_video;
|
const rvStat = data?.type_stats?.reward_video;
|
||||||
@@ -657,7 +669,7 @@ export default function AdRevenueReportPage() {
|
|||||||
<Card size="small" style={{ marginBottom: 16 }}>
|
<Card size="small" style={{ marginBottom: 16 }}>
|
||||||
<Divider orientation="left" plain style={{ marginTop: 0, marginBottom: 16 }}>
|
<Divider orientation="left" plain style={{ marginTop: 0, marginBottom: 16 }}>
|
||||||
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
||||||
核心指标
|
核心指标{dauRangeLabel ? ` · 统计区间 ${dauRangeLabel}` : ''}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</Divider>
|
</Divider>
|
||||||
<Row gutter={[16, 12]}>
|
<Row gutter={[16, 12]}>
|
||||||
@@ -667,9 +679,11 @@ export default function AdRevenueReportPage() {
|
|||||||
<Col flex="1 1 0">
|
<Col flex="1 1 0">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={
|
title={
|
||||||
<Tooltip title="每活跃用户广告预估收入 = 预估收益 ÷ 今日 DAU;DAU 仅今日口径,历史/多天显示 -">
|
<Tooltip
|
||||||
|
title={`每活跃用户广告预估收入 = 区间预估收益 ÷ 区间去重活跃用户(口径同数据大盘)。统计区间:${dauRangeLabel || '—'}`}
|
||||||
|
>
|
||||||
<span>
|
<span>
|
||||||
ARPU(今日)
|
{dauRangeIsToday ? 'ARPU(今日)' : 'ARPU'}
|
||||||
<InfoCircleOutlined style={{ marginLeft: 4 }} />
|
<InfoCircleOutlined style={{ marginLeft: 4 }} />
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
@@ -681,9 +695,11 @@ export default function AdRevenueReportPage() {
|
|||||||
<Col flex="1 1 0">
|
<Col flex="1 1 0">
|
||||||
<Statistic
|
<Statistic
|
||||||
title={
|
title={
|
||||||
<Tooltip title="今日活跃用户(复用大盘口径 last_login_at = 今日登录过);仅查询=今日时有值,历史/多天显示 -">
|
<Tooltip
|
||||||
|
title={`区间去重活跃用户,口径同数据大盘:登录 + 开始比价 + 开始领券,按用户去重。全局口径,不随用户/类型/场景/应用筛选变化。统计区间:${dauRangeLabel || '—'}`}
|
||||||
|
>
|
||||||
<span>
|
<span>
|
||||||
今日活跃 DAU
|
{dauRangeIsToday ? '今日活跃 DAU' : '活跃用户'}
|
||||||
<InfoCircleOutlined style={{ marginLeft: 4 }} />
|
<InfoCircleOutlined style={{ marginLeft: 4 }} />
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|||||||
+1
-1
@@ -480,7 +480,7 @@ export interface AdRevenueReport {
|
|||||||
string,
|
string,
|
||||||
{ ad_type: string; impressions: number; revenue_yuan: number; expected_coin: number; actual_coin: number }
|
{ 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; // 当前筛选下的分页总条数(全量,不受分页影响)
|
total: number; // 当前筛选下的分页总条数(全量,不受分页影响)
|
||||||
truncated: boolean; // 当前页之后是否还有更多事件(分页后前端不再据此报警)
|
truncated: boolean; // 当前页之后是否还有更多事件(分页后前端不再据此报警)
|
||||||
total_impressions: number;
|
total_impressions: number;
|
||||||
|
|||||||
Reference in New Issue
Block a user