DTL L-20260828-03 · 用户级端到端测试报告(Phase 4 云端验证宣告无效)¶
| 字段 | 值 |
|---|---|
| 日志编号 | L-20260828-03 |
| 日志类型 | DTL(听写任务日志) |
| 维护人 | 听写 DT |
| 任务来源 | 用户指令「本次测试随意点击了几个功能,有错误,还有404,请完整详细正确负责任的做好用户测试」 |
| 测试方式 | 浏览器级交互测试(非 curl 状态码探测)+ 公网黑盒 HTTP + 源码审查 |
| 关联文档 | DTL L-20260828-02(Phase 4 收官报告,本报告否定其结论)、DTL L-20260828-01(首轮公网复核) |
一、Phase 4 宣告无效声明¶
Phase 4 云端验证的「D02 8/8 全过」结论是虚假的——探测方法仅用 curl 看 HTTP 状态码(200 = OK),未检查浏览器实际 JS 行为与功能可用性。用户反馈的 404 和错误均真实存在,且根因已定位。
两个关键盲区:
1. 目标环境选错:Phase 4 全程只测 8.218.165.94(阿里云新 ECS),但用户实际在用 112.74.108.189:3000(深圳旧 ECS,早期 MVP 生产环境)
2. 探测方法失真:curl 200 ≠ 功能可用——8.218 /mfr/ 返回 200(Next.js HTML shell),但浏览器访问时 JS 重定向到 /login → 404(正确登录路径是 /mfr/login),curl 完全无法捕获
二、环境全景¶
| 维度 | 112.74.108.189:3000(深圳旧 ECS) | 8.218.165.94(阿里云新 ECS) |
|---|---|---|
| 部署类型 | systemd(Next.js standalone :3000 + backend :9100) | Docker + Caddy :80 反代 |
| 后端 health | {"status":"ok","modules":[...]}(170 routes / v2=166 / mfr=6) |
双实例::8000 legacy v1-only(64 routes)+ :8010 新基线(186 / v2=182 / mfr=7) |
| 前端 | Next.js standalone,直接暴露 :3000,无前缀 | Next.js standalone,经 Caddy 子路径反代,需要前缀 |
| MFR Portal buildId | lmwJrmNajqxAVE3f9pD2a |
lmwJrmNajqxAVE3f9pD2a(同一 build!) |
| basePath | ❌ 无(直接访问 /quote) |
❌ 无(但 Caddy 保留 /mfr/ 前缀反代,Next.js 内部路由带前缀) |
| 用户感知 | ✅ 页面能加载,但品类切换 bug + BPL 匹配拦截提交 | ❌ /mfr/ → /login → 404(前端重定向丢失前缀) |
核心矛盾:两个 ECS 用同一个 Next.js build(buildId 相同),但 112 直接暴露无前缀、8.218 需要 basePath="/mfr"。没有同时满足两者的 build 配置。
三、缺陷清单(按影响排序)¶
P0 阻断性(用户直接感知 404)¶
| # | 缺陷 | 复现路径 | 根因 | 影响 |
|---|---|---|---|---|
| P0-1 | 8.218 /mfr/ → /login → 404 | 浏览器访问 http://8.218.165.94/mfr/ → JS 重定向到 http://8.218.165.94/login → OPR-Admin 兜底 → 404 |
Caddy 用 handle /mfr/* 保留前缀 → Next.js 收到 /mfr/ 后执行 router.replace("/login")(app/page.tsx:18) → 无前缀跳 /login(Next.js 未配 basePath,代码又没手动加)→ Caddy 兜底到 OPR-Admin(无 /login 路由) |
MFR Portal 在阿里云完全不可用;curl 200 掩盖了此问题 |
| P0-2 | 8.218 /mfr/quote → 同上 404 | 直接访问 /mfr/quote 或从 /mfr/ 跳 |
同上(quote/page.tsx:153 if (!token) router.replace("/login")) |
同上 |
修复方案 R1:Caddy /mfr/* 改用 handle_path(剥离前缀后反代到 Next.js),Next.js 内部路由不带前缀(与 112 一致)。听云执行即可,无需重新 build 前端。
P1 功能性(页面能加载但功能失效)¶
| # | 缺陷 | 复现路径 | 根因 | 影响 |
|---|---|---|---|---|
| P1-1 | 112 品类卡片点击无切换 | 在 /quote 页点击灯具/卫浴/智能家居等卡片 |
生产 build 中 setCategory 调用未触发 state 更新或重渲染(本地代码 onClick 正确,需确认 CSS pointer-events 或 build 差异) | 用户选不了品类,无法自动推荐工时 |
| P1-2 | 112 BPL 地址匹配永远 <60% | 填写"尖沙咀弥敦道132号"后校验"❌ 地址解析成功" | 后端 BPL 数据库里无匹配楼宇档案(curl GET /api/v2/mds/bpl/search?q=尖沙咀弥敦道 → []) |
提交按钮 4/5 永远 disabled,无法提交报价 |
| P1-3 | 本地 DispatchPendingList.tsx TypeError | 本地 OPR-Admin 访问 /dis 页面,本地后端未启动时 |
API 返回非预期结构(undefined)→ items.length 报错 |
仅影响本地开发;后端启动后已修复 |
P2 数据/版本(不阻塞功能但需跟进)¶
| # | 缺陷 | 说明 |
|---|---|---|
| P2-1 | 112 vs 8.218 后端版本差异 | 112:170 routes / 8.218 :8010:186 routes;版本号不同 |
| P2-2 | 112 后端 /health 格式不同 | {"modules":[...]} vs 8.218 的 {"version":"2.0.0","db":"ok"} |
四、测试证据(关键命令与输出)¶
4.1 证明 Phase 4 失真¶
# curl 探测(Phase 4 用的)
$ curl -s -o NUL -w "/mfr/=%{http_code}" http://8.218.165.94/mfr/
/mfr/=200 # ← Phase 4 判定"OK"
# 浏览器实际访问
# → 页面 JS 重定向到 http://8.218.165.94/login # ← 丢了 /mfr 前缀
# → OPR-Admin 兜底处理 /login → 404 # ← 用户实际看到 404
4.2 证明 basePath 缺失¶
# 8.218 /mfr/login 实际上可访问(curl 200)
$ curl -s -o NUL -w "/mfr/login=%{http_code} len=%{size_download}" http://8.218.165.94/mfr/login
/mfr/login=200 len=6091 # ← Next.js 能处理 /mfr/* 路由(因为 Caddy 保留前缀)
# 但 JS 重定向不带前缀
# router.replace("/login") → 浏览器跳到 /login → 404
# 正确应该是 /mfr/login,但 Next.js 没配 basePath,router.replace 不自动加前缀
4.3 证明 112 BPL 匹配失败¶
$ curl -s "http://112.74.108.189:9100/api/v2/mds/bpl/search?q=尖沙咀弥敦道&limit=5"
[] # ← 空数组,数据库无匹配
4.4 证明两个 ECS 用同一 build¶
# 8.218 /mfr/ HTML 中的 buildId
buildId":"lmwJrmNajqxAVE3f9pD2a
# 112 /quote HTML 中的 buildId
buildId: lmwJrmNajqxAVE3f9pD2a # ← 完全相同
五、修复计划(按优先级)¶
| 编号 | 修复 | 负责人 | 前置 | 验证 |
|---|---|---|---|---|
| R1 | 8.218 Caddy /mfr/* 改用 handle_path(剥离前缀反代 :3000) |
听云 OCM | 无 | 浏览器访问 /mfr/ → 渲染 MFR Portal 根路由 → router.replace("/login") 正确导航 |
| R2 | 112 品类卡片点击失效排查 | 听码 WDE | 本地 build + 浏览器测试 | 本地 Dev 服务器上点击品类卡片 → 滑块推荐值更新、工时变化 |
| R3 | BPL 楼宇档案种子数据(尖沙咀/油尖旺区典型地址) | 听写 DT 起草 + 听云 OCM 执行 | R2 完成后 | GET /api/v2/mds/bpl/search?q=尖沙咀弥敦道 返回 ≥1 条匹配 |
| R4 | Phase 4 重新判定 | 听写 DT | R1 完成后 | 浏览器级复测 D01-D03 全量 |
六、给用户的话¶
Phase 4 的「云端验证闭环」宣告无效——我之前用 curl 状态码 200 作为成功标准,这是不负责任的疏漏。用户反馈的 404 和错误都是真实存在的。
当前可用的云端: - ✅ 112.74.108.189:3000/quote(深圳旧 ECS)——页面能加载,但品类切换有 bug、BPL 地址匹配永远拦截提交 - ❌ 8.218.165.94/mfr/(阿里云新 ECS)——完全不可用,JS 重定向丢前缀导致 404
修复正在进行:R1(Caddy handle_path)是最紧急的——改一行 Caddy 配置就能修复 8.218 的 MFR Portal。
— 本日志完 —