guke
930eff822c
feat(ad-revenue): 领券/比价看板逐次广告收益(ad_ecpm.trace_id + 逐页聚合) (#131)
## 背景
admin「领券数据」「比价记录」两个看板此前只能看到场景级(所有领券/比价)的广告收益,
无法定位「这一次领券/比价具体赚了多少」。根因:收益表 `ad_ecpm_record` 缺 `trace_id`,
无法与领券会话 / 比价记录按 trace 关联。
## 改动
- **模型/迁移**:`ad_ecpm_record` 新增 `trace_id`(String(64), index, nullable);
迁移 `ad_ecpm_trace_id` 加列 + 索引 `ix_ad_ecpm_record_trace_id`,并**收敛当前两个
alembic head**(`11c44afbea58` selfstat + `merge_pages_override_coupon_slot`)为单 head。
- **上报链路**:`EcpmReportIn` 增 `trace_id` 字段;`/api/v1/ad/ecpm-report` 透传;
`create_ecpm_record` 落库。
- **收益聚合**:新增 `revenue_yuan_by_trace(db, trace_ids)`——按 trace_id 聚合展示收益,
单条 = `min(eCPM元, ¥500钳顶)/1000`,与广告收益报表 `ad_revenue.py` **同口径**;
只吃当前页的 trace_id(逐页批量,索引命中,无 N+1)。
- **两个看板**:`CouponDataRow` / `AdminComparisonListItem` 增 `ad_revenue_yuan`;
`coupon_data_report`(主表 + 用户抽屉)与 `list_comparison_records` 分页后逐页补该字段。
- **测试**:`tests/test_ad_ecpm_trace_revenue.py`(聚合/钳顶/落库)、
`tests/test_board_ad_revenue.py`(两看板 + 抽屉)。
---------
Co-authored-by: guke <guke@autohome.com.cn>
Reviewed-on: #131
2026-07-10 22:14:00 +08:00
..
2026-05-23 17:37:18 +08:00
2026-06-08 05:54:55 +08:00
2026-06-23 17:58:30 +08:00
2026-06-27 03:06:53 +08:00
2026-06-02 09:53:25 +08:00
2026-06-10 22:49:33 +08:00
2026-06-08 00:16:25 +08:00
2026-07-09 17:31:24 +08:00
2026-07-01 20:21:34 +08:00
2026-06-26 23:33:31 +08:00
2026-06-06 00:42:39 +08:00
2026-06-16 01:39:05 +08:00
2026-06-10 02:28:56 +08:00
2026-06-01 22:23:15 +08:00
2026-07-10 22:14:00 +08:00
2026-06-09 01:56:47 +08:00
2026-06-23 17:33:38 +08:00
2026-06-29 09:54:13 +08:00
2026-06-15 23:13:14 +08:00
2026-05-27 21:04:03 +08:00
2026-06-21 00:16:40 +08:00
2026-07-05 09:46:19 +08:00
2026-06-04 03:02:41 +08:00
2026-07-09 01:09:03 +08:00
2026-07-05 09:46:19 +08:00
2026-06-06 04:13:08 +08:00
2026-06-17 10:00:29 +08:00
2026-06-06 00:42:39 +08:00
2026-06-24 20:50:21 +08:00
2026-06-26 23:56:29 +08:00
2026-05-27 21:04:03 +08:00
2026-06-21 00:16:40 +08:00
2026-06-07 23:17:27 +08:00
2026-06-09 01:56:47 +08:00
2026-06-13 03:53:43 +08:00
2026-06-17 22:33:33 +08:00
2026-06-01 22:23:15 +08:00
2026-07-05 09:46:19 +08:00
2026-06-01 22:23:15 +08:00
2026-06-01 22:23:15 +08:00
2026-07-04 02:39:12 +08:00
2026-06-10 22:26:51 +08:00
2026-06-23 17:24:54 +08:00
2026-07-09 17:31:48 +08:00
2026-06-10 16:07:33 +08:00
2026-06-14 23:41:54 +08:00
2026-06-30 22:59:36 +08:00
2026-07-09 17:31:48 +08:00
2026-06-30 22:59:36 +08:00
2026-06-30 22:59:36 +08:00
2026-06-08 03:20:51 +08:00
2026-06-17 21:32:10 +08:00
2026-06-17 10:00:29 +08:00
2026-06-17 10:00:29 +08:00
2026-06-25 17:47:30 +08:00
2026-06-19 11:44:11 +08:00
2026-06-10 22:26:51 +08:00
2026-06-15 23:13:14 +08:00
2026-06-26 15:28:16 +08:00
2026-06-23 17:33:38 +08:00
2026-06-23 17:33:38 +08:00
2026-06-12 00:51:47 +08:00
2026-06-06 04:13:08 +08:00
2026-05-29 15:20:22 +08:00
2026-06-10 15:43:54 +08:00
2026-05-30 18:13:11 +08:00
2026-06-22 23:18:42 +08:00
2026-06-29 23:11:30 +08:00
2026-05-28 22:27:36 +08:00
2026-07-02 19:50:14 +08:00
2026-05-27 21:04:03 +08:00
2026-06-27 02:58:29 +08:00
2026-06-08 04:57:55 +08:00
2026-06-09 21:48:48 +08:00
2026-06-30 21:56:58 +08:00
2026-06-20 13:39:45 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-23 21:09:10 +08:00
2026-06-08 00:16:25 +08:00
2026-06-09 18:10:58 +08:00
2026-07-09 17:31:48 +08:00
2026-07-10 19:23:12 +08:00
2026-06-10 18:32:51 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 03:31:35 +08:00
2026-05-27 21:04:03 +08:00
2026-06-01 21:29:52 +08:00
2026-05-27 21:04:03 +08:00
2026-06-14 01:24:29 +08:00
2026-06-16 01:25:57 +08:00
2026-06-14 01:24:29 +08:00
2026-06-14 01:24:29 +08:00
2026-06-15 18:07:32 +08:00
2026-05-27 21:04:03 +08:00
2026-06-10 22:27:06 +08:00
2026-05-27 21:04:03 +08:00
2026-06-06 18:52:42 +08:00
2026-05-27 21:04:03 +08:00
2026-05-27 21:04:03 +08:00
2026-06-06 04:51:50 +08:00
2026-06-09 01:56:37 +08:00