b622f76a02
- 新增穿山甲 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>
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
"""ad_pangle_daily_revenue: 穿山甲 GroMore 天级收益报表(后台结算口径)
|
||
|
||
新建表存放从 GroMore 数据 API 按天拉取的收益(revenue 预估 + api_revenue 收益Api),
|
||
粒度 = 日期 × 应用(app_env) × 代码位(our_code_id) × 广告源(adn)。供广告收益报表的
|
||
汇总/趋势级展示「穿山甲后台收益」,与客户端自报 eCPM 折算的预估互为对照。
|
||
|
||
Revision ID: ad_pangle_daily_revenue
|
||
Revises: 7db22acee504
|
||
Create Date: 2026-06-28
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from alembic import op
|
||
import sqlalchemy as sa
|
||
|
||
|
||
revision = "ad_pangle_daily_revenue"
|
||
down_revision = "7db22acee504"
|
||
branch_labels = None
|
||
depends_on = None
|
||
|
||
|
||
def upgrade() -> None:
|
||
op.create_table(
|
||
"ad_pangle_daily_revenue",
|
||
sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True),
|
||
sa.Column("report_date", sa.String(length=10), nullable=False),
|
||
sa.Column("app_env", sa.String(length=16), nullable=False),
|
||
sa.Column("site_id", sa.String(length=32), nullable=True),
|
||
sa.Column("our_code_id", sa.String(length=64), nullable=False),
|
||
sa.Column("adn", sa.String(length=16), nullable=False, server_default=""),
|
||
sa.Column("revenue_yuan", sa.Float(), nullable=False, server_default="0"),
|
||
sa.Column("api_revenue_yuan", sa.Float(), nullable=True),
|
||
sa.Column("ecpm", sa.String(length=32), nullable=True),
|
||
sa.Column("impressions", sa.Integer(), nullable=False, server_default="0"),
|
||
sa.Column("currency", sa.String(length=8), nullable=False, server_default="cny"),
|
||
sa.Column(
|
||
"synced_at",
|
||
sa.DateTime(timezone=True),
|
||
server_default=sa.func.now(),
|
||
nullable=False,
|
||
),
|
||
sa.UniqueConstraint(
|
||
"report_date", "app_env", "our_code_id", "adn", name="uq_ad_pangle_daily"
|
||
),
|
||
)
|
||
op.create_index(
|
||
"ix_ad_pangle_daily_revenue_report_date",
|
||
"ad_pangle_daily_revenue",
|
||
["report_date"],
|
||
)
|
||
op.create_index(
|
||
"ix_ad_pangle_daily_revenue_our_code_id",
|
||
"ad_pangle_daily_revenue",
|
||
["our_code_id"],
|
||
)
|
||
|
||
|
||
def downgrade() -> None:
|
||
op.drop_index("ix_ad_pangle_daily_revenue_our_code_id", table_name="ad_pangle_daily_revenue")
|
||
op.drop_index("ix_ad_pangle_daily_revenue_report_date", table_name="ad_pangle_daily_revenue")
|
||
op.drop_table("ad_pangle_daily_revenue")
|