feat(guide-video): 支持领券和比价独立视频奖励配置 #196

Merged
guke merged 3 commits from fix-guideVideoFix into main 2026-07-29 16:12:05 +08:00
Member
No description provided.
zuochenyong added 1 commit 2026-07-29 15:19:54 +08:00
Member

🤖 review-pr 深审结论

🔴 必须改(迁移多-head,部署会炸) · 置信度 0.92

#96 的后端配套(同分支 fix-guideVideoFix)。功能实现扎实:per-scene 配置(_KEY_BY_SCENE)、admin 各端点加 scene 查询参数、按 scene 计次、发币金额在 start 锁进 play 行。pytest 6/6 通过、ruff 全过、与前端 #96 契约精确匹配。

但有一个部署级阻断:

  • high(阻断) alembic/versions/guide_video_scene_unique.pydown_revision = ("d8dd2106e438", "risk_monitor_generic")。实跑 alembic headsorigin/main 本是单 head 6d2309208549,合并本 PR 后变两个 head6d2309208549 + guide_video_scene_unique)→ 部署 alembic upgrade headMultiple heads 失败。根因:迁移挂在已被 6d2309208549 吸收的旧修订上、没接当前 main head。修法:把 down_revision 收敛到 6d2309208549(含它一起 merge,或直接挂其后),本地 alembic upgrade head 跑通再合。⚠️ 测试走 create_all 不走 alembic,6/6 绿灯掩盖了这个问题
  • low(确认) app/repositories/guide_video.pyreward_coin 默认 120→100:对从未持久化过 reward_coin、一直吃默认值的既有 coupon 配置,会静默从 120 变 100;若刻意对齐产品新值则 OK。

正面:与前端 #96 契约精确匹配(scene 查询参数 + 响应含 scene + 字段齐),二者须同发或后端先发;发币金额在 start_play 锁进 play 行、grant_playplay.coin——admin 中途改币不影响在飞的播放,是正确性改进;既有 coupon 配置零迁移保留(同 key),comparison 新起默认;迁移只改播放唯一索引、无需数据回填。

建议:改 down_revision 收敛到 6d2309208549 + 本地 alembic upgrade head 验证;与 #96 一起上。

🔒 只读深审 · worktree 旁路隔离 · 已核验零残留 · 实跑 alembic heads / pytest 6·6 / ruff

## 🤖 review-pr 深审结论 🔴 **必须改(迁移多-head,部署会炸)** · 置信度 0.92 #96 的后端配套(同分支 `fix-guideVideoFix`)。功能实现扎实:per-scene 配置(`_KEY_BY_SCENE`)、admin 各端点加 `scene` 查询参数、按 scene 计次、发币金额在 start 锁进 play 行。**pytest 6/6 通过、ruff 全过、与前端 #96 契约精确匹配。** 但有一个部署级阻断: - **high(阻断)** `alembic/versions/guide_video_scene_unique.py` — `down_revision = ("d8dd2106e438", "risk_monitor_generic")`。实跑 `alembic heads`:`origin/main` 本是**单 head `6d2309208549`**,合并本 PR 后变**两个 head**(`6d2309208549` + `guide_video_scene_unique`)→ 部署 `alembic upgrade head` 报 **Multiple heads** 失败。根因:迁移挂在已被 `6d2309208549` 吸收的旧修订上、没接当前 main head。**修法**:把 `down_revision` 收敛到 `6d2309208549`(含它一起 merge,或直接挂其后),本地 `alembic upgrade head` 跑通再合。⚠️ 测试走 `create_all` 不走 alembic,**6/6 绿灯掩盖了这个问题**。 - **low(确认)** `app/repositories/guide_video.py` — `reward_coin` 默认 `120→100`:对**从未持久化过 reward_coin**、一直吃默认值的既有 coupon 配置,会静默从 120 变 100;若刻意对齐产品新值则 OK。 **正面**:与前端 #96 契约精确匹配(`scene` 查询参数 + 响应含 `scene` + 字段齐),二者须**同发或后端先发**;发币金额在 `start_play` 锁进 play 行、`grant_play` 读 `play.coin`——admin 中途改币不影响在飞的播放,是正确性改进;既有 coupon 配置零迁移保留(同 key),comparison 新起默认;迁移只改播放唯一索引、无需数据回填。 **建议**:改 `down_revision` 收敛到 `6d2309208549` + 本地 `alembic upgrade head` 验证;与 #96 一起上。 <sub>🔒 只读深审 · worktree 旁路隔离 · 已核验零残留 · 实跑 alembic heads / pytest 6·6 / ruff</sub>
zuochenyong added 2 commits 2026-07-29 15:38:31 +08:00
guke merged commit 53c3b7f60f into main 2026-07-29 16:12:05 +08:00
Member

🤖 review-pr 深审结论

🟢 看着没问题(置信度 0.9)——多场景隔离设计正确、迁移安全、并发发币逻辑保持正确;实跑 pytest tests/test_guide_video.py 6 项通过、alembic heads 单一 head 可解析(链完整无孤儿、无分叉)。

核心改动:新手引导视频奖励从单一 coupon 场景扩展为 coupon(领券)+ comparison(比价)两个独立场景——唯一索引 (user_id, seq)(user_id, scene, seq)、配置 key 拆成 coupon_guide_video / comparison_guide_video、计次/统计/发币按 scene 过滤。

做得好的地方

  • grant_play 金币来源由 get_config(db) 改读 play.coin,一箭双雕:既修了多场景下会用默认(coupon)配置给 comparison 发错金额的隐患,又锁定了开播时承诺的金额(防播放期间运营改配置导致实发≠承诺)。
  • 迁移安全:scene 列建表即有(默认 coupon),新唯一索引对存量数据等价旧索引、无冲突;drop 的旧索引 uq_guide_video_play_user_seq 在祖先链内必已存在;并有专门 commit 对齐 main 最新 head。
  • client / admin schema 用 Literal 收窄 scene,API 层挡非法值;repository 层 _config_key 再兜底。

建议(均 low,不阻塞合并)

  1. app/models/guide_video.py:4 顶部 docstring 仍写「每次固定 120 金币」,但 _DEFAULTS 已改 100,请同步文档。
  2. app/repositories/guide_video.py:192_config_key(scene) 裸调用返回值未用,下一行 get_config 内部已会校验,冗余可删。
  3. reward_coin 默认 120 → 100 属语义变更(仅在 DB 无该 scene 配置行时生效),确认是否有意。
  4. 测试全部走 coupon 场景,未覆盖 comparison、也未验证「两场景计次独立」这一核心新行为,建议补一条。
  5. 提醒:comparison 端到端生效还需 admin-web 配置页接入 + 客户端比价浮层传 comparison 场景(跨端,本 PR 只做后端)。

🤖 review-pr 完整仓 worktree 深审(已合并最新 main)· 实跑 pytest + alembic heads

## 🤖 review-pr 深审结论 🟢 **看着没问题**(置信度 0.9)——多场景隔离设计正确、迁移安全、并发发币逻辑保持正确;实跑 `pytest tests/test_guide_video.py` 6 项通过、`alembic heads` 单一 head 可解析(链完整无孤儿、无分叉)。 **核心改动**:新手引导视频奖励从单一 coupon 场景扩展为 coupon(领券)+ comparison(比价)两个独立场景——唯一索引 `(user_id, seq)` → `(user_id, scene, seq)`、配置 key 拆成 `coupon_guide_video` / `comparison_guide_video`、计次/统计/发币按 `scene` 过滤。 **做得好的地方** - `grant_play` 金币来源由 `get_config(db)` 改读 `play.coin`,一箭双雕:既修了多场景下会用默认(coupon)配置**给 comparison 发错金额**的隐患,又锁定了开播时承诺的金额(防播放期间运营改配置导致实发≠承诺)。 - 迁移安全:`scene` 列建表即有(默认 coupon),新唯一索引对存量数据等价旧索引、无冲突;drop 的旧索引 `uq_guide_video_play_user_seq` 在祖先链内必已存在;并有专门 commit 对齐 main 最新 head。 - client / admin schema 用 `Literal` 收窄 scene,API 层挡非法值;repository 层 `_config_key` 再兜底。 **建议(均 low,不阻塞合并)** 1. `app/models/guide_video.py:4` 顶部 docstring 仍写「每次固定 120 金币」,但 `_DEFAULTS` 已改 **100**,请同步文档。 2. `app/repositories/guide_video.py:192` 的 `_config_key(scene)` 裸调用返回值未用,下一行 `get_config` 内部已会校验,冗余可删。 3. `reward_coin` 默认 **120 → 100** 属语义变更(仅在 DB 无该 scene 配置行时生效),确认是否有意。 4. 测试全部走 coupon 场景,未覆盖 comparison、也未验证「两场景计次独立」这一核心新行为,建议补一条。 5. 提醒:comparison 端到端生效还需 admin-web 配置页接入 + 客户端比价浮层传 comparison 场景(跨端,本 PR 只做后端)。 <sub>🤖 review-pr 完整仓 worktree 深审(已合并最新 main)· 实跑 pytest + alembic heads</sub>
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WonderableAI/shaguabijia-app-server#196