修复:统一比价记录状态枚举口径 #209

Merged
guke merged 4 commits from codex/comparison-status-three-state into main 2026-08-01 23:09:22 +08:00
Member

变更说明

  • below_minimum 归入成功,保留原始业务结局
  • store_closed/store_not_found/items_not_found/no_delivery/unsupported 归入失败
  • running 保持进行中生命周期状态
  • 历史细分状态迁移为三态终态,迁移可逆
  • 后台成功/失败筛选及汇总兼容迁移前历史值

验证

  • 相关回归:48 passed
  • Ruff:通过
  • Alembic:单一 head
## 变更说明 - below_minimum 归入成功,保留原始业务结局 - store_closed/store_not_found/items_not_found/no_delivery/unsupported 归入失败 - running 保持进行中生命周期状态 - 历史细分状态迁移为三态终态,迁移可逆 - 后台成功/失败筛选及汇总兼容迁移前历史值 ## 验证 - 相关回归:48 passed - Ruff:通过 - Alembic:单一 head
linkeyu added 1 commit 2026-07-31 21:01:31 +08:00
Member

🤖 review-pr 深审结论

🟢 可合并 · 置信度 0.88 —— below_minimum 归 success 语义合理、迁移安全可逆、测试通过、迁移链单 head。

改动:below_minimum(未达起送) 记录级 status 归为 success,细分结局保留在 raw_payload/platform_results

正确性核对(合并后)

  • 逻辑:_normalize_record_status(status) = success if below_minimum else status。语义合理——below_minimum 是「走到结算、得出可信结论」的正常完成态,记录级计成功,细分原因(未满起送)保留供结果卡展示;向后兼容(旧无 record_status 回退二态派生)。
  • 迁移:upgrade 把历史 below_minimum→success(清 fail_reason);downgrade 精准可逆(只回滚 raw_outcome=below_minimum 的 success,不碰原生 success)。
  • 迁移链:down_revision=limit_policy_global_bundle(#207 head),合并态 alembic heads 单 head ✓ —— 上轮 #207/#208 双 head 在 main 已解决。
  • 铁律1:main 未改本 PR 文件。

构建/测试(实跑 .venv 合并后) test_compare_harvest + test_comparison_below_minimum_migration 18 passed

提示(info)

  • 语义/口径变化:below_minimum 从 failed 归 success,会让比价成功率统计跳变(历史数据也被迁移改写)。建议数据/产品侧知晓。
  • codex 生成,逻辑清晰 + 迁移可逆、风险可控;业务语义建议再确认。

风险 🟢

🤖 review-pr 自动深审 @linkeyu

## 🤖 review-pr 深审结论 🟢 **可合并** · 置信度 0.88 —— below_minimum 归 success 语义合理、迁移安全可逆、测试通过、迁移链单 head。 **改动**:below_minimum(未达起送) 记录级 status 归为 success,细分结局保留在 `raw_payload`/`platform_results`。 **正确性核对(合并后)** - 逻辑:`_normalize_record_status(status) = success if below_minimum else status`。语义合理——below_minimum 是「走到结算、得出可信结论」的正常完成态,记录级计成功,细分原因(未满起送)保留供结果卡展示;向后兼容(旧无 record_status 回退二态派生)。 - 迁移:`upgrade` 把历史 below_minimum→success(清 fail_reason);`downgrade` **精准可逆**(只回滚 `raw_outcome=below_minimum` 的 success,不碰原生 success)。 - 迁移链:`down_revision=limit_policy_global_bundle`(#207 head),合并态 `alembic heads` **单 head** ✓ —— 上轮 #207/#208 双 head 在 main 已解决。 - 铁律1:main 未改本 PR 文件。 **构建/测试(实跑 .venv 合并后)**:✅ `test_compare_harvest` + `test_comparison_below_minimum_migration` **18 passed**。 **提示(info)** - **语义/口径变化**:below_minimum 从 failed 归 success,会让**比价成功率统计跳变**(历史数据也被迁移改写)。建议数据/产品侧知晓。 - codex 生成,逻辑清晰 + 迁移可逆、风险可控;业务语义建议再确认。 风险 🟢。 — 🤖 review-pr 自动深审 @linkeyu
linkeyu added 1 commit 2026-08-01 09:55:52 +08:00
linkeyu changed title from 修复:将未达起送归为比价成功 to 修复:统一比价记录状态枚举口径 2026-08-01 09:56:11 +08:00
Member

🤖 review-pr 深审结论

🟡 需产品/作者确认 · 置信度 0.8 — 状态枚举归一化(写归一 + 读别名 + 可逆数据迁移)实现自洽、Alembic 单 head、相关测试全绿(PR 自身用例 31 项通过,无新增失败)。唯一需确认的是「未满起送计成功并触发完成奖励」这一业务后果。

需确认 / 关注

  • 🟡 业务语义below_minimum(购物车未达起送门槛)现归 success,且会让 harvest_donenewly_success=True → 触发邀请 / 里程碑「完成比价」奖励(app/repositories/comparison.py:684count_success:861)。PR 描述讲了状态分桶,但没点明它同时翻转了完成奖励口径——建议产品确认「未满起送也发成功奖励 / 计入战绩」符合预期。历史 below_minimum 行经迁移改为 success(downgrade 可逆)。
  • 🟢 low 一致性 nitcomparison_records_summaryapp/admin/repositories/queries.py)用别名集兼容旧细分值,但同类消费方 app/admin/repositories/stats.py(总览 comparison_success / success_rate / 时段统计)、ops_marquee.pyops_stat.pyqueries.py:1108/1249services/comparison_llm_backfill.py:138 仍用裸 status=="success" / .in_(("success","failed"))。对新写入行(已归一)与迁移后全部正确,只在「部署→执行迁移」窗口对旧细分行少计。迁移随本 PR 落地,暴露面很小;建议要么同样套别名保持跨面一致,要么注明这些依赖迁移后状态。

构建 / 测试(已实跑,诚实)

合并最新 main 后隔离 worktree 实跑(clone .venv / pytest 8.4):

  • 迁移用例 test_comparison_below_minimum_migration.py1 passed(up / down 双向)
  • test_compare_harvest.py + test_comparison_admin_summary.py30 passed
  • 扩展相关面(comparison / admin / stat / ops)→ 164 passed / 4 failed
  • 4 项失败均非本 PR 引入test_invite_compare_reward 3 项在 base main 无本 PR 时同样失败(origin/main 与纯 PR head 上复现一致,既有环境/配置问题);test_compare_record::test_records_ordered_flag 为既有用例顺序污染(单跑通过)。
  • Alembic:合并最新 main 后 ScriptDirectory.get_heads() = 单 headcomparison_below_min_success),无多头。

做得好

  • 写归一 + 读别名 + 可逆数据迁移 + 路由 pattern + 模型/schema 注释,四层改动口径一致。
  • 顺手补了 _derive_from_platformsrecord_status or status 回退(原 platforms 路径忽略客户端 status),并有 legacy upsert 用例覆盖。
  • 迁移 downgrade 用 raw_payload 只回滚被本次归一的行,不误伤普通 success。

建议

  1. 合并前找产品确认 below_minimum → success奖励 / 战绩口径后果。
  2. 可选(低优先):把 stats.py 等消费方也套 _COMPARISON_* 别名,跨统计面一致。

🤖 自动深审 · 全程只读 · 合并 base 后隔离 worktree 实跑

## 🤖 review-pr 深审结论 🟡 **需产品/作者确认** · 置信度 0.8 — 状态枚举归一化(写归一 + 读别名 + 可逆数据迁移)实现自洽、Alembic 单 head、相关测试全绿(PR 自身用例 31 项通过,无新增失败)。唯一需确认的是「未满起送计成功并触发完成奖励」这一业务后果。 ### 需确认 / 关注 - 🟡 **业务语义**:`below_minimum`(购物车未达起送门槛)现归 `success`,且会让 `harvest_done` 的 `newly_success=True` → 触发邀请 / 里程碑「完成比价」奖励(`app/repositories/comparison.py:684`、`count_success:861`)。PR 描述讲了状态分桶,但没点明它**同时翻转了完成奖励口径**——建议产品确认「未满起送也发成功奖励 / 计入战绩」符合预期。历史 below_minimum 行经迁移改为 success(downgrade 可逆)。 - 🟢 low **一致性 nit**:`comparison_records_summary`(`app/admin/repositories/queries.py`)用别名集兼容旧细分值,但同类消费方 `app/admin/repositories/stats.py`(总览 comparison_success / success_rate / 时段统计)、`ops_marquee.py`、`ops_stat.py`、`queries.py:1108/1249`、`services/comparison_llm_backfill.py:138` 仍用裸 `status=="success"` / `.in_(("success","failed"))`。对**新写入行**(已归一)与**迁移后**全部正确,只在「部署→执行迁移」窗口对旧细分行少计。迁移随本 PR 落地,暴露面很小;建议要么同样套别名保持跨面一致,要么注明这些依赖迁移后状态。 ### 构建 / 测试(已实跑,诚实) 合并最新 `main` 后隔离 worktree 实跑(clone `.venv` / pytest 8.4): - 迁移用例 `test_comparison_below_minimum_migration.py` → **1 passed**(up / down 双向) - `test_compare_harvest.py` + `test_comparison_admin_summary.py` → **30 passed** - 扩展相关面(comparison / admin / stat / ops)→ **164 passed / 4 failed** - 4 项失败**均非本 PR 引入**:`test_invite_compare_reward` 3 项在 **base main 无本 PR 时同样失败**(origin/main 与纯 PR head 上复现一致,既有环境/配置问题);`test_compare_record::test_records_ordered_flag` 为既有用例顺序污染(单跑通过)。 - Alembic:合并最新 main 后 `ScriptDirectory.get_heads()` = **单 head**(`comparison_below_min_success`),无多头。 ### 做得好 - 写归一 + 读别名 + 可逆数据迁移 + 路由 pattern + 模型/schema 注释,四层改动口径一致。 - 顺手补了 `_derive_from_platforms` 的 `record_status or status` 回退(原 platforms 路径忽略客户端 status),并有 legacy upsert 用例覆盖。 - 迁移 downgrade 用 `raw_payload` 只回滚被本次归一的行,不误伤普通 success。 ### 建议 1. 合并前找产品确认 `below_minimum → success` 的**奖励 / 战绩口径**后果。 2. 可选(低优先):把 `stats.py` 等消费方也套 `_COMPARISON_*` 别名,跨统计面一致。 <sub>🤖 自动深审 · 全程只读 · 合并 base 后隔离 worktree 实跑</sub>
linkeyu added 1 commit 2026-08-01 10:23:31 +08:00
Member

🤖 review-pr 深审结论(增量复审 @f1dd0f4a)

🟡 需产品确认 · 0.8(总体结论同上轮 #issuecomment-3300)——本次新提交「后台详情透传逐平台卡片数据」干净且有测试覆盖,未改变上轮判断。

本次增量(7dee829 → f1dd0f4a,仅 2 文件 +13 行)

  • app/admin/schemas/comparison.pyAdminComparisonDetail 新增 platforms: list = [],把 pricebot 渲染就绪的逐平台卡片模型透传给后台详情接口。可选字段带默认值、加性变更、向后兼容;ORM ComparisonRecord.platformsapp/models/comparison.py:119nullable=False default=list)确有该属性,Pydantic from_attributes 正常填充。配套 admin-web#100 前端展示。
  • tests/test_admin_read.py:+12 行覆盖 detail.json()["platforms"][0]status/is_best 透传。

构建 / 测试(已实跑,诚实)

  • 合并最新 main(Alembic 仍 单 head comparison_below_min_success)后隔离 worktree 实跑:test_admin_read + compare_harvest + comparison_admin_summary + migration55 passed

仍需确认(同上轮,未随本提交改变)

  • 🟡 below_minimum(未满起送)归 success 且触发 newly_success完成 / 邀请 / 里程碑奖励——请产品确认奖励口径。
  • 🟢 low 一致性 nit:stats.py / ops_marquee / ops_stat 等消费方仍用裸 status=="success",迁移后一致、仅「部署→执行迁移」窗口对旧细分行少计(详见上轮 3300)。

🤖 自动深审 · 增量复审 · 合并 base 后隔离 worktree 实跑

## 🤖 review-pr 深审结论(增量复审 @f1dd0f4a) 🟡 **需产品确认 · 0.8**(总体结论同上轮 [#issuecomment-3300](https://gitea.shaguabijia.com/WonderableAI/shaguabijia-app-server/pulls/209#issuecomment-3300))——本次新提交「后台详情透传逐平台卡片数据」干净且有测试覆盖,未改变上轮判断。 ### 本次增量(`7dee829 → f1dd0f4a`,仅 2 文件 +13 行) - `app/admin/schemas/comparison.py`:`AdminComparisonDetail` 新增 `platforms: list = []`,把 pricebot 渲染就绪的逐平台卡片模型透传给后台详情接口。**可选字段带默认值、加性变更、向后兼容**;ORM `ComparisonRecord.platforms`(`app/models/comparison.py:119`,`nullable=False default=list`)确有该属性,Pydantic `from_attributes` 正常填充。配套 admin-web#100 前端展示。 - `tests/test_admin_read.py`:+12 行覆盖 `detail.json()["platforms"][0]` 的 `status`/`is_best` 透传。 ### 构建 / 测试(已实跑,诚实) - 合并最新 `main`(Alembic 仍 **单 head** `comparison_below_min_success`)后隔离 worktree 实跑:`test_admin_read + compare_harvest + comparison_admin_summary + migration` → **55 passed**。 ### 仍需确认(同上轮,未随本提交改变) - 🟡 `below_minimum`(未满起送)归 `success` 且触发 `newly_success` → **完成 / 邀请 / 里程碑奖励**——请产品确认奖励口径。 - 🟢 low 一致性 nit:`stats.py` / `ops_marquee` / `ops_stat` 等消费方仍用裸 `status=="success"`,迁移后一致、仅「部署→执行迁移」窗口对旧细分行少计(详见上轮 3300)。 <sub>🤖 自动深审 · 增量复审 · 合并 base 后隔离 worktree 实跑</sub>
guke added 1 commit 2026-08-01 23:06:46 +08:00
guke merged commit ab2de6ec79 into main 2026-08-01 23:09:22 +08:00
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#209