DDD 框架已就位 | 本期 = 口径修正 + BI 取数出口
2026-06-18 · 联盟 Offer 元属性接入(一期 Awin + Impact)
值得做,且高度可行——本期硬目标的 DDD 框架(独立表 blueaff_offer_declared_metrics + IDeclaredMetricsParser 注册表 + 严格镜像 persistence + 同步链路 + admin 透出)已全部落地。
本期实为「口径修正 + BI 取数出口」的小增量,而非从零构建。
⚠️ 这是初评,非最终方案。置信度封顶为「中」:因存在一处头号待核实矛盾 + 多个阻塞性范围澄清,且 BI 落点链路在本仓库未定位。
Impact avg_payment 是否需要 ContractStatus(LOCKED/INVOICED) 分支?
| 来源 | 结论 |
|---|---|
| 专家评估 R9 / scope_do | 「需改为按 ContractStatus 分支才补 Locking 段」(列为本期范围) |
| 反驳核验 + 代码/spec 复核 | PRD §2.3 原文是 LOCKED/INVOICED → 折算(Locking)+折算(PayoutScheduling)——两状态共用同一公式,并非两条分支;impact_offer.py:240-256 已无条件实现该公式;活跃 spec 亦无分支要求。 |
R9 所称的「待实现分支」很可能根本不存在。这一条推翻了上一轮"按 PRD 加 ContractStatus 分支"的决策——严禁据此直接动 get_average_payment_time。
5 分钟人工复核命令:
sed -n '88,96p' offer-basic-info/raw/prd-original.md # avg_payment 是否真要求按状态产出不同结果
sed -n '240,266p' commons/entities/offers/affiliates/impact_offer.py # 现实现是否已是 Locking+PayoutScheduling
sed -n '60,70p' openspec/specs/offer-declared-metrics/spec.md # 活跃 spec 是否要求分支
若复核确认无分支要求 → Impact avg_payment 本期零改动,口径修正收缩为「仅 Awin 拒单率量纲一处」。
明确
部分明确
待澄清
calculate_offer_metrics.py 保持原样阻塞 开工前必须锁定
非阻塞 需回写 / 确认
收敛到 callout 唯一硬目标:口径对齐 + 复用 admin 透出/直读表作 BI 出口 + 确认同步覆盖。
+ 侵入面最小,无 DB 迁移,当天可上线
- 仅覆盖 Awin+Impact;拒单率改归一属破坏式变更
四阶段受控,每阶段前置核验闸门:口径基线先冻结再扩面;联盟逐家迭代。
+ 规避数仓量纲不可逆,逐家验证不互污
- 接入速度慢;可能需停下对齐甚至回刷
用 A 的最小改动范围,给口径修正套上 B 的前置闸门。
闸门:①量纲书面对齐+落注释 ②锁定 callout 范围 ③Impact 分支先复核 ④联盟接入前确认鉴权/限流
框架已落地使「最小改动」真实可行;口径不可逆必须用闸门兜住 —— 两者结合最优。
本期硬目标的基础设施基本齐全(均带来源,本次已复核)
blueaff_offer_declared_metrics:5 字段(epc/cvr/rejection decimal、avg_payment/lock int),均 null=True,OneToOne→offer offer.py:342-371blueaff_offer(BigInteger),不在声明值表 offer.py:33blueaff_offer_metrics 与声明值表物理隔离,互不触发清理 offer.py:313-339_DECLARED_METRICS_PARSERS 仅 awin/impact,其余走 Default 全 None declared_metrics.py:162-174update_attributes 已纳入 declared_metrics 与 cookie_period network_offer_synchronizer.py:89-124DeclaredMetricsPersistence.save update_or_create 全字段(None→NULL 严格镜像)declared_metrics_persistence.py:19-127impact_event_payout / Admitad actions_detail 在工作树未找到,属未落地沿用既有单向链路,无新链路
列表接口(joined/active) → 逐 offer 字段接口(programmedetails / Contracts/Active)
→ affiliate_offer._declared_metrics_payload()
→ parse_declared_metrics() [按 network 取 Parser]
→ aggregate.load_declared_metrics()
→ save_offer_aggregate() [同事务]
→ DeclaredMetricsPersistence.save() [update_or_create 镜像]
→ blueaff_offer_declared_metrics
→ ba_admin View 透出 / BI 直读表 ⟶ OP 看数
本期复用现有表,不加列、不迁移(5 字段已覆盖,cookie 在主表)。
按闸门顺序(待量纲/矛盾拍板后再动):
AwinDeclaredMetricsParser,改前 grep network_rejection_rate 全项目消费方;若保持现状则零改动 + 回写 PRD 勘误| 风险 | 严重度 | 应对 |
|---|---|---|
| 一期范围自相矛盾,验收无基准 | 高 | 开工前书面锁定 callout vs §0.1/§3 边界(闸门②) |
| 量纲不可逆 / BI 历史不可比 | 中 | 修正前对齐唯一量纲、固化表注释,必要时回刷(闸门①) |
| save 严格镜像 None→NULL 抹除历史 | 中 | 区分「确不提供」与「响应异常」;核验证明 Cloudflare 拦截会 raise→跳过 offer,风险窗口比初判窄 |
| 18 联盟鉴权/限流各异、期望膨胀 | 中 | 逐家独立排期 + 限流/重试,本期不铺开 |
| Impact 折算线性近似 / INVOICED 地板值 | 低 | BI 标注该列为近似/下界估计,非对账权威 |
| Portal §1.2 价值本期不兑现 | 低 | 向业务方明确分期预期 |
12 条风险 → 反驳核验剔除 7 条伪高危,存活 5 条。事实多属实,但定性夸大或语境错配:
下一步:先与 PRD 方对齐 头号矛盾 + 4 个阻塞项,再走 prd-workflow 正式模式(人在环串行,产出 decision.md + technical.md 最终对齐文档)。
这是初评,非最终方案。技术设计在阻塞项锁定前不应固化。