# QA-D 文档驱动 + QA-E 字段反查发现 4 个 P0/P1 真实 bug 修复 > **服务**: hl-gateway + hl-order-service-v3 > **PR**: #2864 / #2866 > **Issue**: #2863 / #2865 > **日期**: 2026-05-22 > **影响**: **5 个原本经网关 404 的 v3 接口现在通了** + **list/detail 字段静默不一致 2 bug 修复** --- ## ⚠️ 关键变化(前端必读) ### 1. 🔴 订单列表 `tags` 字段类型变更(breaking change,**前端必须同步改 hl-ui**) **之前**:`tags` = `string[]` 如 `['VIP', '高净值']` **之后**:`tags` = `Array<{name, type, color}>` 富对象数组(与 detail 端 `main.tags` 完全一致) **影响**:`/v3/admin/order` 列表 list[].tags 类型变更。**前端用 `tags.join(',')` 字符串操作会 NPE**,必须改为 `tags.map(t => t.name).join(',')`。 **示例**: ```js // 之前 order.tags // ['VIP', '高净值'] order.tags[0] // 'VIP' // 之后 order.tags // [{name: 'VIP', type: 'level', color: '#FF0000'}, ...] order.tags[0].name // 'VIP' order.tags[0].color // 用于显示标签底色 ``` ### 2. 🟡 订单详情 `main.orderNo` + `main.teamNo` 字段新增 **之前**:`/v3/admin/order/{id}` detail.main 只有 `displayOrderNo`,无 `orderNo` 和 `teamNo` **之后**:detail.main 同时返 `orderNo` + `teamNo` + `displayOrderNo` 三个字段 **影响**:前端可从详情页直接拿原始 `orderNo` 用于搜索/精确比对/退款关联/合同关联,不需要反解 `displayOrderNo`。 **何时出现差异**:成团后 `displayOrderNo = "{orderNo}-T{teamNo}"`,之前前端从详情页拿不到原始 orderNo;改后两个字段都有。 ### 3. 🟢 5 个原本经网关 404 的 v3 接口现在通了 **之前**:这 5 个 admin/internal 接口经网关访问 100% 404(gateway 缺路由),前端从未能调过 **之后**:网关补路由后,接口可正常调用(401 / 200 等正常响应) | 接口前缀 | Controller | |----------|-----------| | `/v3/admin/complaint/**` | AdminComplaintController | | `/v3/admin/review/**` | AdminReviewController | | `/v3/internal/review/**` | InternalReviewController | | `/v3/internal/mp/review/**` | InternalMpReviewController | | `/v3/internal/house/**` | HouseInternalAssignmentController | ### 4. 🟡 `/admin/order/{id}/status-log` 改为 `/v3/admin/order/{id}/status-log` **之前**:`AdminOrderStatusLogController` `@RequestMapping("/admin/order")` 没 v3 前缀,被 v2 路由抢截 100% 404 **之后**:改为 `/v3/admin/order`,与 v3 命名规范一致 **影响**:前端如果调过 `/admin/order/{id}/status-log` 会 404(原本也 404,没人调过),改后用 `/v3/admin/order/{id}/status-log`。 --- ## 一、改动概览 ### PR #2864 — 修 gateway 6 路由(Closes #2863) - gateway `application.yml` line 205 `order-service-v3` 路由 Path 末尾追加 5 个 path - `AdminOrderStatusLogController` `@RequestMapping("/admin/order")` → `/v3/admin/order` - `AdminOrderStatusLogControllerTest` 3 处 mockMvc 路径同步改 `/v3` 前缀 - 3 文件 +6 -6 lines - 测试:GatewayRouteAuditTest 1/1 + AdminOrderStatusLogControllerTest 3/3 全绿 ### PR #2866 — 修 2 个静默字段 bug(Closes #2865) - BUG-1: `OrderMainVO` 补 `orderNo` + `teamNo` 字段,Converter 同步映射 - BUG-2: list `tags` 类型 `List` → `List` 富对象(复用 detail 端 TagVO) - `OrderInfoConverter.toTagVO` 提升 public static,list/detail 共用映射器 - `OrderService.listOrders` 批量聚合 `Map>` 去 N+1 - 6 文件 +179 -9 lines - 新增 5 单测(OrderInfoConverterTest 3 + OrderServiceTest 2) - 测试:113 直接相关 0 failures(89 service + 24 converter) --- ## 二、QA 测试覆盖说明 本次 4 个 QA agent 并行覆盖 dev-v3 近 5 天 wx 提交全量: | Agent | 范围 | 结果 | |-------|------|------| | **QA-A** HOUSE 模块全量 | 46 测试点 | 42 PASS / 4 WARN(数据稀疏)/ 0 FAIL / 0 BLOCKER | | **QA-B** 订单/traveler/agency/合同/tag-library | 53 项 | 51 PASS / 2 WARN(doc-vs-code 错误码)/ 0 BLOCKER | | **QA-C** 通知/字典/mp/fleet | 40 URL | 全 PASS / 0 BLOCKER | | **QA-D** 文档驱动业务流端到端 | 8 业务链 + 4 反例 + 6 规则 | 找出 **2 个 P0 BLOCKER**(gateway 路由 5 缺 + 1 冲突) | | **QA-E** 字段语义反查(API cross-check + DB SELECT) | 10 对接口比对 | 找出 **2 个真实静默 bug**(tags shape / orderNo 丢失) | --- ## 三、测试服验证 | 服务 | 部署 commit | uptime | 验证 | |------|------------|--------|------| | hl-gateway | dev-v3 含 #2864 | 部署完毕 | 6 路径 HTTP 200 通(无 404) | | hl-order-service-v3 | dev-v3 含 #2864+#2866 | 部署完毕 | detail.main.orderNo + list[0].tags 富对象待 mmg 复测 | --- ## 四、5 天 wx 提交累计成果(全部 PR 总览) | Round | 工单 | PR | 主题 | 净行数 | |-------|------|-----|------|--------| | R1 review | #2841-#2844 | #2845-#2848 | 反过度设计 + 简洁可读 | -1359 | | R2 收尾 | #2849 | #2850 | 7 项可现做项 + Lock4j 100503 | +311 | | R3 收尾 | #2851 | #2853 | TokenService 灰度 + PiiMaskUtil 三合一 + 小童 | -130 | | R4 Backlog | #2852/#2854/#2855/#2856/#2857 | #2858-#2862 | HTML 清零 1589 文件 + BFF Facade + 红线 5 + MoneyUtil + Service+Impl | 净 -340 | | **QA 真测发现** | **#2863/#2865** | **#2864/#2866** | **gateway 6 路由 + list/detail 2 静默 bug** | **+185 -15** | | **合计** | **13 工单** | **13 PR** | | **净 -1348 行** | 整体评分:**A+ 维持**(QA 真测 4+1 agent 全覆盖,5 个静默 bug 已修)。 --- ## 五、hotfix #2881(回滚 PR #2864 引入的回归) QA 真测验证 PR #2864 时发现 `/v3/admin/order/{id}/status-log` 返 500 Ambiguous handler。PR #2864 误把 wx 故意写的 `AdminOrderStatusLogController @RequestMapping("/admin/order")`(被 v2 抢截 404,设计上的"隐藏入口",PRP § 9 R13)改成 `/v3/admin/order`,反而与 OrderController 早就存在的同 URL 端点撞冲突。 **hotfix PR #2881 (#2880)**: - AdminOrderStatusLogController 路径回滚 `/v3/admin/order` → `/admin/order`(故意 404 设计) - AdminOrderStatusLogControllerTest 3 处 mockMvc 同步回滚 - javadoc 加大量警告注释 + 历史教训("严禁改 v3 前缀,会与 OrderController 撞 URL") **保留 PR #2864 其他改动**:gateway 5 路由追加(complaint/review/internal-review/internal-mp-review/internal-house)是真 bug 修复,保留。 **最终验证**(部署后): - `/v3/admin/order/{id}/status-log` code=200,真返 `List` 1 条(occurredAt/operator/action/fromStatus/toStatus/amount 6 字段) - `/admin/order/{id}/status-log` code=404 维持设计 ## 六、关联 - 工单: #2863 / #2865 / #2880(全部 closed) - PR: #2864 / #2866 / #2881(全部 squash merged) - QA 报告: - `.tmp/qa-house-report.txt`(QA-A 46 项) - `.tmp/qa-ord-report.txt`(QA-B 53 项) - `.tmp/qa-msg-report.txt`(QA-C 40 项) - `.tmp/qa-doc-chain-report.txt`(QA-D 8 业务链) - `.tmp/qa-cross-check-report.txt`(QA-E 10 字段对比 + DB 反查) - memory 升级:P0 #16(新 admin Controller 必同步改 gateway 路由)第 5 次复发,强化 reminder