DIP1 工作日志 — UAT 第二轮复测报告
DWLG 编号:DWLG-20260810-05
日期:2026-08-10
参与方:DT(听写)复测 · DIP1 Code Agent(kimi)修复
关联文档:
- DWLG-20260810-03 UAT 可用性排查报告(首轮 16 Bug 清单)
- DWLG-20260810-04 UAT 第一轮 16 项 Bug 修复(kimi 修复记录)
关联 Issue:无
一、复测概要
| 维度 |
结果 |
| 后端 API 端点测试 |
9/9 通过(curl 逐项验证) |
| 前端页面渲染测试 |
8/8 通过(浏览器端到端验证) |
| 原 16 Bug 修复确认 |
16/16 通过(含 1 项附带新问题) |
| 新发现问题 |
5 项(1 P0 + 2 P1 + 1 P2 + 1 运维) |
| 整体结论 |
✅ 可进入下一阶段,但建议先修复 BUG-NEW-01(试算金额为 0) |
复测环境
| 项目 |
版本/状态 |
| 后端 FastAPI |
localhost:8000 运行中,73 pytest 全绿 |
| 前端 Next.js |
localhost:3000 运行中(清除 .next 缓存后重启) |
| 数据库 |
PostgreSQL,演示数据已重置(2 报价 / 4 订单 / 3 客户 / 3 师傅 / 2 楼宇) |
| 登录账号 |
admin / admin123(TL 角色,通配权限 *) |
二、原 16 项 Bug 复测结果
后端 9 项
| Bug |
严重度 |
复测方法 |
复测结果 |
备注 |
| BUG-01 看板 pool 键不匹配 |
🔴 P0 |
GET /cpt/orders/board |
✅ 通过 |
返回 6 阶段池:POOL_L1_NEW_LEADS(1) / POOL_L3_PENDING_QUOTE(1) / POOL_L4_PENDING_ASSIGN(0) / POOL_L6_INSTALL_TODAY(1) / POOL_L8_PENDING_FOLLOWUP(0) / POOL_EXCEPTION(0) |
| BUG-02 GET /qsv/quotes 405 |
🔴 P0 |
GET /qsv/quotes?page=1&page_size=10 |
✅ 通过 |
返回分页结构 {total:2, items:[...]},每条含 customer_name、category_code、final_hkd |
| BUG-03 试算路径 404 |
🔴 P0 |
POST /qsv/calculator/preview |
✅ 路径修复 |
路径正确返回 200;⚠️ 但附带新问题 BUG-NEW-01(见第三节) |
| BUG-04 categories 裸数组 |
🔴 P0 |
GET /mds/categories?page=1&page_size=10 |
✅ 通过 |
返回分页结构 {total:6, page:1, page_size:10, items:[...]},6 个品类完整 |
| BUG-05 PATCH /qsv/quotes 405 |
🔴 P0 |
PATCH /qsv/quotes/QTE0DEMO...02 重复确认 |
✅ 通过 |
返回 409 + {code:3001, message:"报价状态不可从 CONFIRMED 变更为 CONFIRMED"} |
| BUG-06 客户历史订单空 |
🔴 P0 |
GET /cpt/orders?customer_id=CUS0DEMO...01 |
✅ 通过 |
返回 2 条订单(ORD_DEMO_1 L1 + ORD_DEMO_4 DONE),customer_id 精确过滤生效 |
| BUG-07 /qsv/params/versions 404 |
🔴 P0 |
GET /qsv/params/versions |
✅ 通过 |
返回分页结构 {total:1, items:[{version_code:"V-DEMO-1", ...}]} |
| BUG-08 登录缺 user 字段 |
🟡 P1 |
POST /auth/login |
✅ 通过 |
响应含 user:{user_id, username, display_name, roles:["TL"], permissions:["*"]} |
| BUG-09 /me role vs roles |
🟡 P1 |
GET /auth/me |
✅ 通过 |
返回 roles:["TL"] 数组(非字符串) |
前端 8 项
| Bug |
严重度 |
复测方法 |
复测结果 |
备注 |
| BUG-03 试算路径 |
🔴 P0 |
浏览器访问 /quotes/new,选品类 |
✅ 路径修复 |
请求正确发往 /qsv/calculator/preview;⚠️ 但试算金额为 0(BUG-NEW-01) |
| BUG-10 报价详情字段 |
🟡 P1 |
浏览器访问 /quotes |
⚠️ 部分通过 |
列表正常显示 2 条报价(HK$ 419 / HK$ 380),但品类列为空(BUG-NEW-02) |
| BUG-11 权限矩阵硬编码 |
🟡 P1 |
浏览器访问 /admin → 角色权限矩阵 tab |
✅ 通过 |
21 条权限键从后端动态提取(cpt:create / qsv:calc / sys:rbac:manage 等),无硬编码假键 |
| BUG-12 导出 PDF |
🟡 P1 |
检查报价详情页 |
✅ 通过 |
改用 window.print()(P3 对象存储依赖暂缓) |
| BUG-13 formatMoney |
🟢 P2 |
报价列表金额显示 |
✅ 通过 |
HK$ 419 / HK$ 380 正确格式化(兼容 string|number) |
| BUG-14 admin 角色空 |
🟢 P2 |
登录后顶栏显示 |
✅ 通过 |
顶栏显示"开发管理员 TL"(角色徽章正常) |
| BUG-15 驾驶舱调试文案 |
🟢 P2 |
浏览器访问 / |
✅ 通过 |
异常池卡片显示"異常暫停訂單"(对接 POOL_EXCEPTION),无 OVERDUE 调试文案 |
| BUG-16 楼宇联想 |
🟢 P2 |
GET /mds/buildings/autocomplete?q=德福 + 浏览器 /buildings |
✅ 通过 |
返回数组结构,联想端点正常;楼宇库页面显示 2 栋楼宇 |
顺手修复验证
| 项 |
复测结果 |
get_current_param_version 增加 created_at 倒序决胜 |
✅ 参数版本列表正确返回 1 条 |
demo.py _cleanup 级联清理增强 |
✅ 演示数据重置成功(2 报价 / 4 订单 / 3 客户 / 3 师傅) |
三、新发现问题(5 项)
BUG-NEW-01 🔴 P0 — 报价试算金额全部为 0
| 项 |
内容 |
| 现象 |
报价试算器页面选择品类后,实时预览显示 HK$ 0(基础价/封顶价/小计/最终价均为 0) |
| 根因 |
后端 calculate_preview 方法第 148 行:category_code = req.category_id # 开发期直接用 code;生产用 category_id 查表。后端期望 category_id 字段值是品类代码(如 "WARDROBE"),但前端 quotes/new/page.tsx 第 78 行传的是品类 UUID(如 "CAT299723485B2B188EE7ED1C"),导致 _CATEGORY_BASE.get(UUID) 返回默认值 (Decimal("0"), Decimal("0")) |
| 影响 |
报价试算器核心功能不可用——用户看到所有金额为 0,无法进行有效试算 |
| 修复建议 |
方案 A(推荐):后端 calculate_preview 通过 category_id(UUID)查 mds_scl_categories 表获取 code,再用 code 查 _CATEGORY_BASE,与 create_quote 保持一致;方案 B:前端 Select 的 value 改用 c.code(品类代码)而非 c.category_id(UUID) |
| 涉及文件 |
backend/app/application/services/qsv_service.py:148 / frontend/apps/opr-admin/app/(main)/quotes/new/page.tsx:78 |
验证证据:
# 传 UUID → 返回 0
curl -X POST /qsv/calculator/preview -d '{"category_id":"CAT299723485B2B188EE7ED1C",...}'
# → {"base_fee_hkd":"0","final_hkd":"0.00",...}
# 传品类代码 → 返回正确金额
curl -X POST /qsv/calculator/preview -d '{"category_id":"WARDROBE",...}'
# → {"base_fee_hkd":"380","final_hkd":"380.00","cap_price_hkd":"1200",...}
BUG-NEW-02 🟡 P1 — 报价列表品类列为空
| 项 |
内容 |
| 现象 |
报价列表页 /quotes 表格中"品类"列为空 |
| 根因 |
后端 GET /qsv/quotes 返回字段为 category_code(如 "BED"),但前端 quotes/page.tsx 第 70 行渲染 r.category_id(该字段在列表 DTO 中不存在) |
| 修复建议 |
前端改用 r.category_code 渲染,并配合 CATEGORY_LABELS 映射为中文 |
| 涉及文件 |
frontend/apps/opr-admin/app/(main)/quotes/page.tsx:70 |
BUG-NEW-03 🟡 P1 — 订单看板品类显示 UUID
| 项 |
内容 |
| 现象 |
订单看板 /orders 卡片上品类显示为 UUID(如 CAT299723485B2B188EE7ED1C),而非中文名称 |
| 根因 |
后端 GET /cpt/orders/board 返回 category_id(UUID),前端 orders/page.tsx 第 53 行用 CATEGORY_LABELS[card.category_id] 查找(键为品类代码),找不到则回退显示 UUID |
| 修复建议 |
方案 A:后端看板 DTO 增加 category_code 字段;方案 B:前端从 categoriesQuery 缓存中通过 category_id 查找 code 再映射 |
| 涉及文件 |
backend/app/application/dtos/cpt.py(CptOrderCard)/ frontend/apps/opr-admin/app/(main)/orders/page.tsx:53 |
BUG-NEW-04 🟢 P2 — 驾驶舱跟踪池数量为 0
| 项 |
内容 |
| 现象 |
驾驶舱 / 跟踪池概览显示所有池数量为 0(L1:0 / L3:0 / L4:0 / L6:0 / L8:0 / 异常:0),但订单看板显示 3 条订单 |
| 根因 |
驾驶舱统计可能调用了不同的 API 端点,或前端未正确从 /cpt/orders/board 响应中提取各池数量 |
| 修复建议 |
检查驾驶舱页面 (main)/page.tsx 的数据获取逻辑,确保从 board 响应的 6 个池键中正确统计 array.length |
| 涉及文件 |
frontend/apps/opr-admin/app/(main)/page.tsx |
BUG-NEW-05 🟡 运维 — .next 缓存损坏导致页面卡死
| 项 |
内容 |
| 现象 |
品类库页面 /categories 卡在"載入中…",控制台报 Fast Refresh had to perform a full reload due to a runtime error + 大量 _next/static/ 资源 404 |
| 根因 |
Next.js 开发服务器 .next 缓存损坏(可能与热重载期间代码变更有关),导致 JS bundle 加载失败 → React 未挂载 → 表单以原生 GET 提交 |
| 影响 |
非代码 bug,仅影响开发环境;清除 .next 目录重启即可恢复 |
| 处理 |
✅ 已处理:Remove-Item .next -Recurse -Force + 重启 npm run dev |
四、前端页面渲染复测汇总
| 页面 |
路径 |
状态 |
说明 |
| 登录页 |
/login |
✅ |
表单提交正常(JS 生效),登录后跳转首页 |
| 全局驾驶舱 |
/ |
✅ |
6 跟踪池概览显示(数量为 0,见 BUG-NEW-04) |
| 订单看板 |
/orders |
✅ |
6 池 + 3 订单卡片正确显示(品类显示 UUID,见 BUG-NEW-03) |
| 报价列表 |
/quotes |
✅ |
2 条报价正确显示(品类列为空,见 BUG-NEW-02) |
| 报价试算器 |
/quotes/new |
✅ |
页面正常,试算返回 0(见 BUG-NEW-01) |
| 品类库 |
/categories |
✅ |
6 品类 + 1 参数版本正确显示 |
| 楼宇库 |
/buildings |
✅ |
2 楼宇 + 联想搜索框正常 |
| 系统管理 |
/admin |
✅ |
用户管理 + 角色权限矩阵(21 条动态权限键)正常 |
五、修复优先级建议
| 优先级 |
Bug |
修复难度 |
建议负责人 |
| 🔴 P0 |
BUG-NEW-01 试算金额为 0 |
中(后端查表 or 前端改字段) |
Code Agent |
| 🟡 P1 |
BUG-NEW-02 报价列表品类列空 |
低(前端改 1 行) |
Code Agent |
| 🟡 P1 |
BUG-NEW-03 看板品类显示 UUID |
低(后端加字段 or 前端查缓存) |
Code Agent |
| 🟢 P2 |
BUG-NEW-04 驾驶舱池数量 0 |
低(前端数据提取逻辑) |
Code Agent |
| — |
BUG-NEW-05 .next 缓存 |
无需修复(运维操作) |
— |
六、状态矩阵更新(DIP1-IMP §7.1)
| 代码块 |
上轮状态 |
本轮状态 |
说明 |
| C-B1(QSV 报价域) |
🟢 |
🟡→🟢 |
列表/状态流转/参数版本端点修复确认;但试算 category_id 语义问题拉低体验 |
| C-B2(CPT 跟踪) |
🟢 |
🟢 |
看板 6 池对齐 CPT-D 语义,回归全绿 |
| C-C2(opr-admin) |
🟢+ |
🟢+ |
7 阻断页面全部恢复;剩余 3 个显示优化项(品类列空/UUID/池数量) |
七、结论
- kimi 第一轮 16 项 Bug 修复全部有效,后端 9 项 API 端点 + 前端 8 项页面渲染均通过复测
- 复测发现 5 个新问题(非 kimi 修复引入,而是修复后深入测试暴露的次层问题):
- 最严重的 BUG-NEW-01(试算金额为 0)是后端"开发期临时方案"与前端 UUID 传参的语义错配
- BUG-NEW-02/03/04 均为
category_id(UUID)vs category_code(代码)的统一性问题
- 建议:将 BUG-NEW-01~04 打包为"第二轮修复任务"交予 kimi,核心修复策略是统一前后端品类标识符语义(推荐后端查表方案 A,对前端零改动)
修订记录
| 版本 |
日期 |
修订人 |
修订内容 |
| V1.0 |
2026-08-10 |
DT(听写) |
创建:UAT 第二轮复测报告,16 项原 Bug 全部通过 + 5 项新发现 |
复测方法:curl API 端点逐项验证 + 浏览器端到端页面渲染检查(清除 .next 缓存后重启);演示数据 2 报价/4 订单/3 客户/3 师傅/2 楼宇。