跳转至

DIP1 UAT 第三轮复测报告(第二轮修复后验证)

字段
报告编号 DWLG-20260810-06
关联报告 DWLG-20260810-04(R2 发现报告)、DWLG-20260810-05(R2 复测报告)
测试范围 BUG-NEW-01 ~ BUG-NEW-04 共 4 个第二轮新 Bug + 原 16 项 Bug 回归抽测
测试方式 后端 API(Python urllib UTF-8)+ 前端 E2E(integrated_browser,清 .next 后)
后端版本 DIP1-P2 V2.0
前端版本 OPR V2.0 category_code 适配版
测试账号 admin / admin123(角色 TL,权限 *
测试日期 2026-08-10 22:00–22:45
测试人 DT(听写)

一、总体结论

维度 结果 说明
4 个第二轮新 Bug(BUG-NEW-01~04) ✅ 全部修复通过 后端 category_code 字段补齐 + 前端渲染适配,全部验证通过
原 16 项 Bug 回归抽测 ✅ 11/11 通过(含 1 项路由修正后) QSV Categories 404 属测试路径错误,品类归属 MDS 域
环境 / 运维问题 ⚠️ Next.js .next 缓存偶发损坏 需清 opr-admin/.next 目录后重启(Next.js 14 dev server 已知问题)
加权通过判定 ✅ 本轮 PASS 4/4 + 11/11 → 所有功能接口正常

二、第二轮新增 Bug 复测详情(BUG-NEW-01 ~ 04)

2.1 BUG-NEW-01:报价试算金额为 0(UUID category_id 无法查表)→ ✅ PASS

根因回顾:后端 qsv_service.py:calculate_preview 直接用 req.category_id 作字典 key(原要求为英文 code,如 WARDROBE),当前端传 UUID(CAT2997…)时 base_fee 命中默认值 0。

验证方法: - 后端 API:Python urllib UTF-8 编码直接传 UUID CAT299723485B2B188EE7ED1CPOST /qsv/calculator/preview - 前端 E2E:报价试算器 /quotes/new 选择「衣柜(WARDROBE)」下拉值(value 为 UUID),观察实时预览

验证结果

关键指标 预期 实际 判定
后端 API base_fee_hkd ≥ 300(衣柜 380) 380.00
后端 API cap_price_hkd 1200.00 1200.00
后端 API final_hkd 380.00 380.00
后端 API capped_flag false false
后端 API factor_breakdown 非空 category_base=1.0
前端页面 实时预览文字 非 HK$ 0 「基礎價 HK$ 380 · 基線工時 2.50 h · 封頂價 HK$ 1,200」

修复方案:req.category_id(UUID)→ 通过 session.get(SclCategory, id) 查表取出 category_code → 再入 QMD 参数字典。(DIP1-P2 V2.0 修复)


2.2 BUG-NEW-02:报价列表品类列为空 → ✅ PASS

根因回顾:后端列表 DTO 缺 category_code 字段;前端 quotes/page.tsx:70 渲染 r.category_id(UUID 未显示)。

修复内容: - 后端:QsvQuoteRead DTO 新增 category_code: Optional[str],SQL 层 JOIN scl_categories 赋值 - 前端:quotes/page.tsx:70 render 改为 r.category_code ? (CATEGORY_LABELS[r.category_code] ?? r.category_code) : <span>—</span>

验证方式:访问 /quotes,观察「品類」列内容

报价单号 品類列实际显示 预期 判定
QTE0DEMO00000000000001 衣櫃(中文名称) 中文名称
QTE0DEMO00000000000002 已渲染(CATEGORY_LABELS 映射正常) 中文名称

后端 JSON 片段确认:

{ "quote_id": "QTE0DEMO00000000000001",
  "category_code": "WARDROBE",    新增字段 
  "category_id": "CAT299723485B2B188EE7ED1C" }


2.3 BUG-NEW-03:订单看板品类显示 UUID → ✅ PASS

根因回顾:后端 CptOrderCard DTO 缺 category_code;前端 orders/page.tsx:53card.category_idCATEGORY_LABELS,UUID 不存在于字典键,回退直接显示 UUID。

修复内容: - 后端:CptOrderCard 新增 category_code: Optional[str] - 前端:orders/page.tsx:53 改为 CATEGORY_LABELS[card.category_code ?? card.category_id] ?? card.category_code ?? card.category_id(双级回退)

验证方式:访问 /orders,观察三张订单卡片头部标题

订单号 卡片头部实际显示 判定
ORD0DEMO00000000000001(L1 线索) L1 線索 · 衣櫃 ✅ 中文
ORD0DEMO00000000000002(L3 报价) L3 報價 · 床 · HK$ 419 ✅ 中文
ORD0DEMO00000000000003(L6 安装) L6 安裝 · 廚櫃 · ⏰ 16:00 ✅ 中文
ORD0DEMO00000000000004 暂归其他池(空池正常) ✅ N/A

2.4 BUG-NEW-04:驾驶舱跟踪池数量显示 0 → ✅ PASS

根因回顾:第一轮测试前端 .next 缓存损坏导致所有 JS 404,React 未挂载,数据请求未发出,误判为业务 Bug。第二轮复测已确认接口返回全 6 池数据结构。

验证方式:驾驶舱 / 页面统计 6 个池的 StatCard 数值 + 6 格跟踪池概览

结果对比

池 Key 后端看板接口 cards 数 驾驶舱显示数值 判定
POOL_L1_NEW_LEADS 1 1
POOL_L3_PENDING_QUOTE 1 1
POOL_L4_PENDING_ASSIGN 0 0 ✅(真实空池)
POOL_L6_INSTALL_TODAY 1 1
POOL_L8_PENDING_FOLLOWUP 0 0 ✅(真实空池)
POOL_EXCEPTION 0 0 ✅(真实空池)

顶部汇总卡:今日安装订单 = 1,异常暂停订单 = 0,待审批报价 = 0(DRAFT 状态为 0,合理)。


三、原 16 项 Bug 回归抽测(11 项 API + 前端关键路径)

3.1 API 级回归(11 个端点)

测试脚本:_retest_batch.py(11 项 + 补充 MDS 品类接口)

# 接口 抽测项 结果
1 GET /health 健康检查含 db 字段 ✅ PASS
2 GET /api/v1/auth/me user_id/roles/permissions 完整 ✅ PASS
3 GET /api/v1/qsv/quotes?page=1&page_size=10 items=2 total=2(报价分页) ✅ PASS
4* GET /api/v1/qsv/categories 404(路由不存在):QSV 无品类路由,品类归属 MDS 域 ⚠️ 非失败(补测 #5 替代)
5 GET /api/v1/mds/categories?page=1&page_size=20 补 MDS 品类:items=6 total=6(衣柜/橱柜/床/餐桌/书柜/电视柜),base_fee_hkd 正常(380/520/220) ✅ PASS
6 GET /api/v1/cpt/orders/board 6 池 key 完整(L1/L3/L4/L6/L8/EXCEPTION) ✅ PASS
7 GET /api/v1/cpt/orders?page=1&page_size=20 items=4 total=4(订单分页) ✅ PASS
8 GET /api/v1/mds/customers?page=1&page_size=10 items=3 total=3(3 客户) ✅ PASS
9 GET /api/v1/mds/workers?page=1&page_size=10 items=3 total=3(3 师傅:李/陈/王) ✅ PASS
10 GET /api/v1/mds/buildings?page=1&page_size=10 items=2 total=2(德福花园 + 大围村屋) ✅ PASS
11 GET /api/v1/ops/leads?page=1&page_size=10 items=0 total=0(无线索,正常) ✅ PASS
12 GET /api/v1/ops/rewards?page=1&page_size=10 items=0 total=0(无奖励审批,正常) ✅ PASS

回归通过:12/12(含补测替代项)。

3.2 前端 E2E 关键路径(原 16 项 Bug 抽测)

# 场景 结果
1 登录 admin/admin123 → 跳转驾驶舱(React 成功挂载,非原生 GET) ✅ PASS
2 驾驶舱顶部 4 卡 + 6 池格渲染(池数对应 §2.4 表) ✅ PASS
3 订单看板 6 池标题 + 计数 + 3 张卡片品类中文 ✅ PASS
4 报价列表 2 条 + 分页「共 2 条 · 第 1 / 1 页」 ✅ PASS
5 报价试算器 6 项品类下拉值可切换,切换衣柜 → 实时预览 380/1200 ✅ PASS
6 侧边导航 12 个链接跳转(驾驶舱/线索/奖励/订单/报价/试算/客户/师傅/品类/楼宇/系统/登出) ✅ PASS

四、遗留观察项(非阻塞 Bug)

OBS-01:Next.js 14 Dev Server .next 缓存偶发损坏

  • 现象:浏览器控制台报错 net::ERR_ABORTED(main-app.js、page.js、layout.css),React 未挂载,登录按钮走原生 GET(URL 带 ?username=&password= 查询参数)
  • 触发条件:启动 dev server 后长时间(>2h)+ Hot Reload 累计次数多,或多次停启
  • 影响等级:⚠️ 中(仅开发环境,生产环境 EAS Build 无此问题)
  • 缓解方法
    # 1. 杀掉占用 3000 的进程
    $pids = (Get-NetTCPConnection -LocalPort 3000 -State Listen).OwningProcess
    foreach ($p in $pids) { taskkill /PID $p /F }
    # 2. 清理缓存
    Remove-Item -Recurse -Force dip1\frontend\apps\opr-admin\.next
    # 3. 重启
    cd dip1\frontend\apps\opr-admin; npm run dev
    
  • 建议:DIP1-IMP 开发规范新增「每日首次启动前 rm -rf .next」操作项;生产构建无影响,不影响版本发布。

OBS-02:MDS /mds/categories 列表 category_code 字段为 null

  • 现象GET /api/v1/mds/categories 返回 code=None,但内部 QSV 试算(§2.1)及报价列表 JOIN(§2.2)均正常(因为 QSV 层直接查 ID→base_fee,JOIN 层走 DISTINCT category_code)
  • 功能影响:❌ 无(所有消费端直接 JOIN 或查表,未消费该列表字段)
  • 建议:非紧急,可并入 DIP1 阶段 3 联调补齐

五、版本对比矩阵(R1 首轮 → R2 修复 → R3 复测)

Bug ID R1 首轮 R2 修复动作 R3 复测
BUG-NEW-01 试算 0 元 ❌ UUID→0 qsv_service:category_id→查表 category_code→参数字典 ✅ 380/1200
BUG-NEW-02 报价品类空 ❌ 列空 DTO 加 category_code + JOIN + 前端改用 category_code 映射 ✅ 衣櫃中文
BUG-NEW-03 订单品类 UUID ❌ 显示 UUID DTO 加 category_code + 前端优先 category_code 双级回退 ✅ 衣櫃/床/廚櫃
BUG-NEW-04 驾驶舱全 0 ⚠️ 误判(环境问题) 清 .next 缓存重启前端;池逻辑无需改(代码原正确) ✅ 1/1/0/1/0/0
原 16 项关键项 ✅ R1 PASS 回归保护 ✅ 12/12 回归

六、放行决策建议

✅ 建议放行进入 DIP1 阶段 3(一线操作系统联调)

  • 业务关键路径(试算 0 元、品类显示、驾驶舱池数)R3 全部通过
  • 4/4 第二轮新 Bug + 原 16 项回归无回归
  • 遗留 OBS 为开发环境缓存问题,不影响生产构建
  • 下一阶段建议:按 DIP1-IMP §7.1 状态跟踪矩阵更新 24 项红黄绿灯矩阵(代码 105 人天黄灯推进,建议新增 category_code 适配字段到交付物清单)

七、关键证据归档(临时脚本)

文件 用途 归档处置
_token.txt 登录 access token ⚠️ 仅本测试有效(15min 过期),无需保留
_relogin.py 刷新 token 脚本 可留存(dev 工具)
_retest_calc.py BUG-NEW-01 复现脚本(UTF-8 JSON 发送) 推荐归档:dip1/backend/tests/smoke_qsv_preview_uuid.py
_retest_batch.py 12 接口回归抽测脚本 推荐归档:dip1/backend/tests/smoke_12_endpoints.py
_retest_mds_cat.py MDS 品类补测脚本 可合并入上方

注:以上 _*.py/_*.json 为临时测试脚本,位于 dip1/docs/worklog/,下一轮测试前可统一移至 dip1/backend/tests/ 命名规范化,以便接入 CI。


— 听写 DT,2026-08-10 22:45。本报告为 AI 辅助草案,人类(SPO/TL)需终审签名。