feat: 比价记录状态列按 admin 口径显示,外部缺失标「成功 ⚠」 #104

Merged
guke merged 6 commits from feat/admin-comparison-outcome-display into main 2026-08-04 18:45:30 +08:00
Member

背景
配套后端 shaguabijia-app-server#feat/admin-comparison-outcome-display(admin 比价记录技术成功/失败口径改造)。后端新下发 admin_status + outcome_hint 两字段。

改动
src/lib/types.ts:ComparisonRecordListItem 加 admin_status / outcome_hint。
src/app/(main)/comparison-records/page.tsx:
列表状态列 + 详情改用 admin_status 出标签;outcome_hint 非空时在标签后加金色 ⚠(ExclamationCircleOutlined + Tooltip,hover 显示「未找到店」等)。
STATUS_LABEL / STATUS_COLOR 精简到 success/failed/cancelled/running 4 个生命周期值。
效果
外部缺失记录 = 绿「成功 ⚠」(hover 看原因),纯技术故障 = 红「失败」;概览/大盘成功率随后端口径统一。

背景 配套后端 shaguabijia-app-server#feat/admin-comparison-outcome-display(admin 比价记录技术成功/失败口径改造)。后端新下发 admin_status + outcome_hint 两字段。 改动 src/lib/types.ts:ComparisonRecordListItem 加 admin_status / outcome_hint。 src/app/(main)/comparison-records/page.tsx: 列表状态列 + 详情改用 admin_status 出标签;outcome_hint 非空时在标签后加金色 ⚠(ExclamationCircleOutlined + Tooltip,hover 显示「未找到店」等)。 STATUS_LABEL / STATUS_COLOR 精简到 success/failed/cancelled/running 4 个生命周期值。 效果 外部缺失记录 = 绿「成功 ⚠」(hover 看原因),纯技术故障 = 红「失败」;概览/大盘成功率随后端口径统一。
guke added 6 commits 2026-08-04 17:38:40 +08:00
比价记录页把「跑完流程、外部原因致结果缺失」的 6 类(未找到店/菜、
打烊、单点不配送、不支持、未满起送)从「失败」改判为「成功 ⚠」(hover
看缺失原因),让「失败」红标签只剩技术故障,便于管理员排查。
方案 A:纯 admin 层派生(读 raw_payload.record_status),不碰 DB 存储/
#209 落库/C 端;admin 后台统一口径(列表+概览成功率+大盘)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 两页成功率分母其实都是 total-cancelled(概览 queries.py:532、大盘 stats.py:290),
  一致、本次不动;真正的既有差异在分子(概览含 below_minimum、大盘不含),
  本次统一为 original∈S,顺带对齐两页口径
- 派生逻辑落为独立模块 comparison_outcome.py,供 queries/stats 共用避免循环 import

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
方案A:共享模块 comparison_outcome.py(派生+SQL判定)→ 列表/详情下发
admin_status+outcome_hint → 概览/大盘成功率改按 admin 口径 → 前端状态列
成功+感叹号。含完整测试断言与验算。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
筛选器与新显示口径一并对齐:筛成功含6类、筛失败仅纯技术故障;
顺带清理 Task3 后无引用的 #209 死常量。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author
Member

🤖 review-pr 深审结论

🟢 可合并 — 前端状态列/详情按 admin 口径展示,与后端配套 PR #217 契约精确对齐;全量 tsc --noEmit 通过。置信度 0.9。

跨仓契约核对(配套 shaguabijia-app-server#217)

  • types.tsComparisonRecordListItemadmin_status: string(success/failed/cancelled/running) + outcome_hint: string|null——与后端 schema 字段/值域一致。
  • ComparisonRecordDetail extends ComparisonRecordListItem,故详情抽屉的 detail.admin_status/detail.outcome_hint 类型合法(继承而来,非遗漏)。
  • page.tsx 状态列 dataIndexstatus 改为 admin_status<Tag> 用 admin 口径颜色/文案,outcome_hint 非空则挂 ExclamationCircleOutlined Tooltip(外部缺失标「成功 ⚠」+ hover 缺失原因);详情抽屉同步。
  • STATUS_COLOR/STATUS_LABEL 从含 below_minimum/store_closed/... 细分值简化为 admin_status 的 4 个生命周期值,与后端 derive_admin_outcome 返回值域吻合,外部缺失改由 outcome_hint 感叹号承载。

构建/测试(已实跑)

合并最新 main(Already up-to-date)后,复用主克隆 node_modulestsc --noEmit(tsconfig strict:true)→ exit 0,全量类型检查零错误——detail.admin_statusr.outcome_hint 等契约字段类型全部合法。
(说明:用 tsc --noEmit 做全量类型检查而非 dev server;未额外跑 next build 打包,类型契约已由 tsc 完整覆盖。)

正面

这是「比价额度/口径」四联 PR 的收尾(#216 quota 接口 + #385 前端拦截 + #217 后端口径 + 本 #104 前端展示),前后端契约严丝合缝;类型继承复用得当(Detail extends ListItem);外部缺失用感叹号 Tooltip 承载而非硬塞 status 映射,展示清晰;附 plan/design 文档。

🤖 自动深审 · 结论仅供参考,请以人工判断为准

## 🤖 review-pr 深审结论 🟢 **可合并** — 前端状态列/详情按 admin 口径展示,与后端配套 PR #217 契约精确对齐;全量 `tsc --noEmit` 通过。置信度 0.9。 ### 跨仓契约核对(配套 shaguabijia-app-server#217) - `types.ts`:`ComparisonRecordListItem` 加 `admin_status: string`(success/failed/cancelled/running) + `outcome_hint: string|null`——与后端 schema 字段/值域一致。✅ - `ComparisonRecordDetail extends ComparisonRecordListItem`,故详情抽屉的 `detail.admin_status`/`detail.outcome_hint` 类型合法(继承而来,非遗漏)。✅ - `page.tsx` 状态列 `dataIndex` 由 `status` 改为 `admin_status`:`<Tag>` 用 admin 口径颜色/文案,`outcome_hint` 非空则挂 `ExclamationCircleOutlined` Tooltip(外部缺失标「成功 ⚠」+ hover 缺失原因);详情抽屉同步。✅ - `STATUS_COLOR`/`STATUS_LABEL` 从含 below_minimum/store_closed/... 细分值**简化为 admin_status 的 4 个生命周期值**,与后端 `derive_admin_outcome` 返回值域吻合,外部缺失改由 outcome_hint 感叹号承载。✅ ### 构建/测试(已实跑) 合并最新 `main`(Already up-to-date)后,复用主克隆 `node_modules` 跑 **`tsc --noEmit`(tsconfig `strict:true`)→ exit 0**,全量类型检查零错误——`detail.admin_status`、`r.outcome_hint` 等契约字段类型全部合法。 (说明:用 `tsc --noEmit` 做全量类型检查而非 dev server;未额外跑 `next build` 打包,类型契约已由 tsc 完整覆盖。) ### 正面 这是「比价额度/口径」四联 PR 的收尾(#216 quota 接口 + #385 前端拦截 + #217 后端口径 + 本 #104 前端展示),前后端契约严丝合缝;类型继承复用得当(Detail extends ListItem);外部缺失用感叹号 Tooltip 承载而非硬塞 status 映射,展示清晰;附 plan/design 文档。 <sub>🤖 自动深审 · 结论仅供参考,请以人工判断为准</sub>
guke merged commit b776475a21 into main 2026-08-04 18:45:30 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WonderableAI/shaguabijia-admin-web#104