跳转至

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。

— 本日志完 —