完整修复计划 · 8.218 + 112 用户级缺陷(DTL L-20260828-03 衍生)¶
| 编号 | 修复 | 负责人 | 类型 | 状态 |
|---|---|---|---|---|
| R1 | 8.218 Caddy /mfr/* 从 handle 改 handle_path |
听云 OCM | 运维配置 | 🟡 已签发 |
| R2 | 112 品类卡片点击无切换(生产 build vs dev build 差异) | 听码 WDE | 代码修复 | 🟠 待签发 |
| R3 | BPL 楼宇档案种子数据(尖沙咀/油尖旺区) | 听写 DT 起草 + 听云 OCM 执行 | 数据层 | 🟠 待签发 |
| R4 | 本地后端启动修复(已完成) | 听写 DT | 环境 | ✅ |
| R5 | DispatchPendingList.tsx TypeError(后端未启动时) | 听码 WDE | 空值防御 | 🟠 待签发 |
R2 · 112 品类卡片点击无切换¶
根因假设¶
本地 dev server(:3001)点击 ✅,112 生产 build(:3000)点击 ❌。两者用相同源代码(next.config.mjs、quote/page.tsx onClick 正确),但 build 环境不同。
排查方向(听码 WDE):
- 对比本地
next build+next startvs dev server——如果 build 版也有 bug,就是生产优化问题;如果 build 版 OK,就是 112 上跑的 .next 产物是旧的 - 检查 React StrictMode——生产 build 是否启用了 StrictMode 导致某些 useEffect 行为差异(next.config.mjs 的 reactStrictMode: true)
- 检查 112 上 mfr-portal 的 .next 产物时间戳——确认是不是近期 basePath 改动后没有重新 build
WDE 任务单要点¶
- 在本地
cd dip1/frontend/apps/mfr-portal && pnpm build && pnpm start跑生产模式,浏览器测品类卡片 - 对比 dev vs start 的行为差异
- 如果生产 build OK → 112 需要重新 build + 部署
- 如果生产 build 也有 bug → 代码层面排查(StrictMode / memo / useCallback 依赖)
R3 · BPL 楼宇档案种子数据¶
现状¶
GET /api/v2/mds/bpl/search?q=尖沙咀弥敦道 → [](空)。用户填的地址匹配不到,前端"地址解析成功"校验项永远 ❌,提交按钮 4/5 永远 disabled。
方案¶
听写起草香港主要区域的楼宇种子数据(尖沙咀、油尖旺、铜锣湾、中环、观塘等核心区典型街道 + 高频楼宇),听云通过 pg restore 或 API 批量注入。
种子数据格式示例(BPL 表)¶
| bpl_id | district | street | building_name | floors | has_elevator | parking | stair_width_ok |
|---|---|---|---|---|---|---|---|
| BPL-0001 | 油尖旺区 | 弥敦道 | 海运大厦 | 5 | true | true | true |
| BPL-0002 | 油尖旺区 | 弥敦道 | 香港半岛酒店 | 8 | true | true | true |
| BPL-0003 | 尖沙咀 | 弥敦道 | 崇光百货尖沙咀店 | 5 | true | true | true |
| BPL-0004 | 尖沙咀 | 梳士巴利道 | 香港文化中心 | 3 | true | true | true |
| BPL-0005 | 铜锣湾 | 轩尼诗道 | 铜锣湾时代广场 | 9 | true | true | true |
| BPL-0006 | 中环 | 德辅道中 | 中环中心 | 18 | true | true | true |
| ... | ... | ... | ... | ... | ... | ... | ... |
覆盖 5 大区 × 每区 10-20 条 = 50-100 条种子数据即可让 BPL 匹配通过率从 0% 提升到 ≥80%。
R5 · DispatchPendingList.tsx 空值防御¶
现状¶
本地后端未启动时,disPendingList() API 返回非预期结构(undefined)→ items.length 报 TypeError 白屏。
修复¶
在组件中加空值防御:
setItems(res.items ?? []); // 而非 setItems(res.items)
setTotal(res.total ?? 0); // 而非 setTotal(res.total)
同时检查 api.ts 的 HTTP client——非 2xx 响应是否会抛异常还是返回 undefined。
执行优先级¶
R1 (P0 听云) → 立即执行,30min
R5 (P1 听码) → 独立小修,与 R2 并行
R2 (P1 听码) → build 排查,1h
R3 (P1 听写→听云) → 种子数据起草 2h + 执行 10min
全部完成后重新执行 Phase 4 浏览器级闭环复测(D01-D03 全量 + 四端功能点击 + 提交报价完整流程)。