跳转至

L-20260824-01 MFR 开放报价 V2 前端落地验证 + BPL Mock 样本补齐

任务编号:L-20260824-01 / 执行人:听码 WDE / 日期:2026-08-24 任务来源:用户指令「你是听码,请了解项目要求和进展,执行之」 上游设计:DTL L-20260824-03(MFR 开放报价 V2 前端全面优化设计,MSC-FE 原则 #4) 上游验证:DTL L-20260824-04(typecheck 修复与 MkDocs 构建验证) 范围dip1/ 本地代码(前端 mfr-portal + 后端回归验证) 约束:只改 dip1/;不 git push/pull;不接触生产环境;最小化原则


1. 任务起止与输入产物

  • 开始/完成:2026-08-24
  • 输入产物
  • DTL L-20260824-03 §四 6 组件交互设计规格 + §五 代码结构建议
  • 既有代码:apps/mfr-portal/app/quote/page.tsx V2(1115 行,DT 同步产出初稿 + DTL L-20260824-04 修复 5 个 TS strict 错误)+ globals.css V2 增量 265 行
  • 后端工作区未提交热修复:ppl_id Header 可选化 + CORS 中间件(DTL L-20260823-05 对应代码)
  • 输出产物
  • page.tsx BPL_SAMPLES 8 → 30 条补齐(唯一代码改动)
  • 全量验证结果(后端 pytest / 前端 typecheck+build)
  • 本日志

2. 执行内容

2.1 设计规格符合性核查(只读)

对照 DTL L-20260824-03 §四逐项核查 6 组件落地情况:

组件 规格要点 落地核查 结论
① 8 品类卡片 emoji + SCL 编码 + 默认选中家具 + 选中态样式 CATEGORIES_8 8 品类 emoji/μ/σ 与规格 §4.2 完全一致
② 参数结构化引导 3 尺寸滑动条 + G1-G4 徽章 + 重量滑块 + 易碎品 SV3 横幅 + 工时柱状图 calcGauge 阈值 60/120/200 对齐 LQM;generateGaussBars 50 柱三色(μ±1σ 绿 / μ±2σ 黄 / 其余红);LaborChartComp 微调按钮 0.5h 步进
③ 地址智能解析 500ms debounce + BPL 匹配 + 4 问题自检兜底 + 修改二次确认 bplSearch 关键词遍历、候选下拉含区域/类型/电梯徽章;自检 Q1-Q4 完整;修改弹 confirm 重置档案
④ 品牌档位 + 徽章 路径 A(ppl_id 绑定 → 哈希徽章 Mock)/ 路径 B(3 档卡片横排) hashPplCent 0-33 铜/34-66 银/67-100 金;BRAND_TIERS 3 档卡片 PREMIUM 默认选中
⑤ 5 项绿勾校验 缺项 disabled + tooltip + 点击跳闪 checklist useMemo 5 项;黄色闪烁 flash-yellow 3×0.5s;按钮文案实时显示 N/5 绿勾
⑥ 结果页 6 区块 金额大卡 + 9 步明细树 + QSV-09 灵活部分 + 3 按钮 + SV 档位 + 微调返回 ResultV2Comp 6 区块齐全;STEP_FORMULA_DESC 9 步公式说明;PDF 复用 V1;L1 写 localStorage;分享模态含 5×5 点阵 QR 示意 + 复制链接
V1 高级模式 右上角切换,V1 表单原封保留 advancedMode useState 双分支渲染,V1 提交逻辑独立保留
API 契约(约束 C3) buildPayloadV2 → P0~P8 与 V1 一致;ppl_id 非空才传 Header buildPayloadV2() 翻译映射正确;if (pplId) headers["ppl_id"] = pplId 与热修复行为对齐
零新增依赖(约束 C1) 纯 SVG 柱状图 / CSS 点阵 QR / emoji 图标 package.json 无变化

发现缺口 1 项:BPL_SAMPLES 仅 8 条,规格 §4.3 要求「30 条,公屋/村屋/唐楼各覆盖至少 3 条」(当时 公屋 1 / 村屋 2 / 唐楼 1,未达标)。

2.2 BPL Mock 样本补齐(8 → 30 条)

  • 改动文件apps/mfr-portal/app/quote/page.tsx(仅此 1 处,纯数据追加)
  • 新增 22 条,分类覆盖:
  • 公屋 +4(黄大仙下邨/石硖尾邨/柴湾兴华邨/沙田禾輋邨)→ 共 5 条
  • 村屋 +3(大埔林村/西贡蚝涌村/屯门蓝地)→ 共 5 条
  • 唐楼 +3(深水埗大南街/湾仔太原街/佐敦吴松街)→ 共 4 条
  • 私人屋苑 +6(太古城/黄埔花园/日出康城/愉景新城/半山干德道/愉景湾)
  • 办公楼 +4(观塘创纪之城/湾仔中环广场/九龙湾企业广场/葵涌写字楼)
  • 字段规范:全部含 bpl_id(HKI/KLN/NT/I-L 区域前缀)/ keywords(中英文别名)/ 合理 GPS / 电梯·楼层·停车·楼梯宽度特征
  • 性质声明:全部为 MVP-Lite Mock 示范数据(名称标注「示范」),对接真实 /api/v2/mds/bpl/search 后整体删除(代码内已有 TODO 标注)

2.3 本地环境修复(非代码问题)

  • 现象:后端全量 pytest 首跑 10 个 QSV 测试 404(test_qsv_quote.py 全部)
  • 根因:本地 .venv 未安装 reportlab(L-20260823-02 新增的 PDF 依赖)→ qsv_router import 时 ModuleNotFoundError → 被 interfaces/api/__init__.py L25 的宽 except 静默跳过 → qsv 路由整体未挂载
  • 处置.venvpip install -e .(reportlab 5.0.0 装入)→ 复跑全绿
  • 风险提示build_api_router() 的裸 except Exception: continue 会把「依赖缺失」这类部署级错误降级为 404,排障成本高。建议后续改为「开发模式重抛异常 / 生产模式记日志告警」(见 §5 遗留项 #1)

3. 验证结果

3.1 后端(Python 3.12 + pytest 9.1.1 + reportlab 5.0.0)

命令 结果
ruff ruff check app tests ✅ All checks passed
pytest 全量 pytest tests -q 272 passed / 0 failed(73s),含 MFR 报价 + PDF + dev token + ppl_id 可选化回归
已知警告 HMAC key 25 字节 < 32(开发模式默认密钥) 沿用既有声明,生产 DIP1_JWT_SECRET ≥32 字节消除

注:后端 4 文件工作区改动(ppl_id 可选化 + CORS)为 DTL L-20260823-05 热修复的本地代码,本日志完成其全量回归验证,行为与测试断言一致。

3.2 前端(pnpm + tsc + next 14.2.5)

命令 结果
typecheck pnpm --filter @dip1/mfr-portal run typecheck ✅ 0 TS 错误(BPL 扩充后复跑仍 0 错误)
build pnpm --filter @dip1/mfr-portal build ✅ 4 页面静态生成;/quote 14.4 kB(First Load 111 kB,BPL +22 条后 +1.3 kB)

4. MSC-L4 合规复核

空白字段占比 = 1(型号 text)/ 8 = 12.5% ≤ 30% 红线 ✅(与 DTL L-20260824-03 §5.3 结论一致,本次 BPL 扩充不引入空白字段)。


5. 遗留问题与移交

# 移交方 说明
1 build_api_router() 裸 except 静默跳过模块导入错误 听码(下一迭代) 依赖缺失 → 全路由 404 难排障;建议开发模式重抛 + 启动日志显式打印跳过原因
2 MFR V2 生产部署(112.74.108.189:3000) 听云 OCM 前端 page.tsx + globals.css 已就绪;参考 DTL L-20260823-05 热修复部署流程
3 人工交互层端到端冒烟(浏览器 8 项检查) 听写 DT + 人工 DTL L-20260824-04 §五未勾选项
4 B1-B4 后端接口阻塞(BPL search / L1 from-quote / PPL badge / 短链) 听码(按 DTL L-20260824-03 §6.1 排期) 前端 Mock 均已预留 TODO 切换点
5 git 提交与 hk2026 主仓同步 听写 DT 听码不执行 git push;本日志完成后由听写打包提交(关联 DTL L-20260824-03/-04)

6. 修订记录

版本 修订内容
V1.0 2026-08-24 听码 WDE 初稿:V2 前端规格核查 + BPL 样本 8→30 补齐 + 后端 reportlab 依赖修复回归 272 全过

本日志登记 MFR 开放报价 V2 前端编码收尾验证;上游设计 DTL L-20260824-03,类型修复验证 DTL L-20260824-04。