Files
shaguabijia-app-server/docs/database/ad_pangle_daily_revenue.md
T
zhuzihao b622f76a02 feat(ad-revenue): 接入穿山甲 GroMore 数据 API 拉取后台收益(预估+收益API) (#92)
- 新增穿山甲 GroMore「聚合数据报告 API」对接,按天 T+1 拉取后台 revenue(预估)与
  api_revenue(收益API,更接近结算),在广告收益报表大盘 + 按天趋势级展示,与客户端自报
  eCPM 折算的预估并列对照;逐条广告事件行不动(仍是客户端预估)。
- 链路:integrations/pangle_report.py(MD5 签名,与官方文档两个测试向量逐字节一致)→
  scripts/sync_pangle_revenue.py(拉昨天/--days 回补)→ 新表 ad_pangle_daily_revenue
  (repositories/ad_pangle_revenue.py:upsert + 按日聚合)→ admin/repositories/ad_revenue.py
  汇总,新增 total_pangle_revenue_yuan / total_pangle_api_revenue_yuan / daily[].pangle_*。
- 穿山甲无用户/类型/场景维度:仅全量视图(未按 user/ad_type/feed_scene 过滤)给值,否则置
  None;join key 用 ad_unit_id(=客户端配的 104xxx),非 code_id。
- 新增配置 PANGLE_REPORT_USER_ID/ROLE_ID/SECURITY_KEY(≠发奖 m-key)+ site_id→应用映射;
  含单测(签名向量+分页解析);已真连穿山甲验证。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: zzhyyyyy <2685922758@qq.com>
Reviewed-on: #92
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai>
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
2026-06-29 09:54:13 +08:00

3.4 KiB
Raw Blame History

ad_pangle_daily_revenue — 穿山甲 GroMore 天级收益

模型:app/models/ad_pangle_revenue.py | 读写:app/repositories/ad_pangle_revenue.py | 拉取:app/integrations/pangle_report.py + scripts/sync_pangle_revenue.py

存放从穿山甲 GroMore 数据 API(聚合数据报告 API,天级、T+1)按天拉取的收益,供 admin 广告收益报表 的「穿山甲后台收益」做汇总/趋势级展示, 与客户端自报 eCPM 折算的预估互为对照(看 gap)。

粒度 = 日期 × 应用(app_env) × 代码位(our_code_id) × 广告源(adn)。穿山甲不提供分用户/设备维度 (官方明确),故本表无 user_id,也无法挂到逐条广告事件;报表逐条行仍用客户端预估。

数据流

  • :scripts/sync_pangle_revenue(线上每天 ~10:30 由 systemd timer 跑)调 pangle_report.fetch_daily_report 拉昨天(可 --days N 回补),维度 date,site_id,ad_unit_id, 映射 site_id→app_envad_unit_id→our_code_idupsert_daily_rows 落库。按唯一键幂等,T+1 订正可重跑。 ⚠️ad_unit_id(广告位ID=104xxx)而非 code_id:实测 code_id 返回底层各 ADN 代码位(如 983674557),对不上我们的口径。
  • :ad_pangle_revenue.aggregate_by_date 按日期汇总 → admin 报表 total_pangle_revenue_yuan / total_pangle_api_revenue_yuan / daily[].pangle_*

字段

类型 说明
id int PK
report_date str(10) idx 北京时间 YYYY-MM-DD(拉取 time_zone=8),与 ad_ecpm_record.report_date 同口径可 join
app_env str(16) prod(傻瓜比价正式)/ test(测试);由 site_idsettings.pangle_report_site_id_to_env 映射;未映射记 site:<id>
site_id str(32) | null 原始 GroMore AppId(留痕)
our_code_id str(64) idx 广告位 ID(= 接口 ad_unit_id = 客户端配的 104xxx = ad_ecpm_record.our_code_id),join key。⚠️ code_id(那是底层各 ADN 代码位,对不上);-1 为 GroMore 未归因桶
adn str(16) 广告源(接口 network);当前默认口径不分广告源(按 ad_unit_id 汇总),统一 ""
revenue_yuan float 预估收益(元)← 接口 revenue(排序价×展示/1000,所有 ADN)
api_revenue_yuan float | null 收益Api(元)← 接口 api_revenue(各 ADN 经 Reporting 回传、更接近结算);未配 / 当天为 null
ecpm str(32) | null 预估 eCPM 原值(接口 ecpm,单位元/千次,与客户端 getEcpm 的「分」不同)
impressions int 展示次数 ← 接口 imp_cnt
currency str(8) 货币(接口 currency,正常 cny)
synced_at datetime 最近同步写入时间(可被回补覆盖)

唯一约束 uq_ad_pangle_daily (report_date, app_env, our_code_id, adn);adn"" 而非 NULL,避免 NULL 在唯一约束里互不相同导致 upsert 重复。

局限

  • T+1:当天数据穿山甲不出 api_revenue,revenue 也次日才稳;报表「今天」此两列多为空。
  • revenue vs api_revenue:前者所有 ADN 都有(预估口径);后者需后台为该 ADN 配置 Reporting 才回传,部分 ADN 可能长期为空。结算仍以各 ADN 结算单 / 穿山甲后台为准。