# R5 真测发现 + 修复:PII 应急脱敏 + 配房 BLOCKER + 6 P1 > **服务**: hl-order-service-v3 > **PR**: #2900 / #2901 / #2902 > **Issue**: #2894 / #2895 / #2896 > **日期**: 2026-05-22 > **影响**: **🔴 前端 breaking change(traveler 字段改名)** + 配房链路恢复 + 订单详情补字段 + 金额格式统一 --- ## ⚠️ 关键变化(前端 mmg 必读) ### 1. 🔴 traveler VO 字段改名(breaking change,**前端必同步改 hl-ui**) | 旧字段 | 新字段 | 值格式 | |--------|--------|--------| | `idNo` | **`idCardMasked`** | `220***********1234`(17 字符变长星) | | `phone` | **`phoneMasked`** | `138****2046`(11 字符固定星) | | `emergencyPhone` | **`emergencyPhoneMasked`** | `139****5678` | **适用接口**: - `GET /v3/admin/order/{id}/traveler/list` 列表 - `GET /v3/admin/order/{id}` 详情 `overview.travelers` - traveler 智能解析 dry-run 输出 **前端如有 `traveler.idNo` / `traveler.phone` 引用必须改为 `traveler.idCardMasked` / `traveler.phoneMasked`**。 ### 2. 🟢 订单详情新增 transportPlans + itinerary 字段(BUG-3 修) `GET /v3/admin/order/{id}` 顶层 data 新增: - `transportPlans: List`(大交通列表) - `itinerary: OrderItineraryRespVO`(行程) **前端可直接用**(原本就缺,现在补上)。 ### 3. 🟢 订单金额字段格式统一 2 位小数 之前 `totalAmount=3105.0`(1 位)/ `refundAmount=0.00`(2 位)不一致,**统一改为 2 位小数**: - `OrderListItemVO` / `OrderMainVO`:5 字段(totalAmount/paidAmount/balanceAmount/depositAmount/singleRoomSurcharge)走 `OrderAmountUtil.to2()` - Refund Converter 走 `MoneyUtil.formatYuan()` **前端如对 `3105.0` 字符串做精确匹配会出问题**,改用 `parseFloat` 或宽松匹配。 ### 4. 🟢 5 个原本经网关 503/500 的 v3 接口现在通了 - `POST /v3/admin/order/hotel-requirements/{rid}/assignments`(原 JSON 500)→ **200** - `GET /v3/admin/house/staff`(原 504)→ 3s 内返(Feign timeout 收紧 + fallback) - `GET /v3/admin/contract/{id}`(原 500 BadSqlGrammarException)→ **200** --- ## 一、3 PR 改动 ### PR #2900 PII 应急脱敏(Closes #2894) - traveler 3 字段改名(`*Masked` 后缀) + Converter 全 SensitiveDataUtil.maskXxx() 包装 - TravelerSmartParseService.buildDryRunVO 同步脱敏 - 6 新单测 + 红线 PII 不泄漏断言,128 traveler 测试 0 failure - **后续独立工单**:DB TypeHandler 加密(order_traveler+fleet_driver 明文存储)+ audit_log 接入 ### PR #2901 BLOCKER 修复(Closes #2895) - BLOCKER-1 配房 500:删 `@JsonDeserialize(using = LongDeserializer)` 错误用法 → 用原生 Long - BLOCKER-2 house/staff 504:houseStaffFeignClient 单独 connectTimeout=2s + readTimeout=3s,触发现有 fallback 返空 - 5 新单测 29/29 全绿 - **经验入 memory**:雪花 Long 字段禁 @JsonDeserialize(LongDeserializer) ### PR #2902 6 P1(Closes #2896) - P1-1 contract_status_log 缺 4 BaseDO 列 → V20260522_001.sql 补 - P1-2 OrderDetailVO 补 transportPlans + itinerary + Service 聚合 - P1-3 OrderAmountUtil.to2 统一 2 位小数 + RefundConverter 走 MoneyUtil - P1-4 inquiry_message.dayNumber → V20260522_002.sql + DO + Service 真实写入 - P1-5 INVENTORY_CHECK op_log operator_name → AdminContextUtil.getRealName 兜底 - P1-6 HouseGrabServiceImpl 双写 house_claim_history(opType/fromUserId/toUserId/reason) - 180 直接相关测试 0 failure --- ## 二、QA R5 真测全量发现(5 agent 累计 22 bug) | Agent | 方法 | 发现 | |-------|------|------| | **R5-F HOUSE 深度** | 5 业务链端到端 + 11 DB 反查 + 2 真并发 | 2 BLOCKER + 3 P1(已修)| | **R5-G 订单生命周期** | 5 业务链 + 12 DB 反查 + RateLimiter 实测 | 1 P0 + 3 P1 + 3 P2/P3(P0/P1 已修)| | **R5-H 通知字典** | 6 业务链 + 7 DB 反查 | 全 PASS,环境性 504 已处理 | | **R5-I fleet+tag+大交通** | 6 业务链 + 8 DB 反查 + 17 错误码命中 | 1 P0 + 1 mock(P0 应急已修)| --- ## 三、测试服验证 | 服务 | commit | 状态 | |------|--------|------| | hl-gateway | dev-v3 含 #2900-2902 | 已部署 | | hl-order-service-v3 | dev-v3 含 #2900-2902 + Flyway V20260522_001/002 | 已部署(双实例 8086+8186) | --- ## 四、留尾(独立工单 backlog) - DB TypeHandler 加密迁移(order_traveler + fleet_driver phone/id_card 明文存储) - audit_log 接入 admin path decrypt - HouseModuleBoundaryTest ArchUnit 违规独立 PR 治理 - TagLibraryIntegrationTest ApplicationContext 问题独立排查 - user-service `/internal/user/admin/house-staff` 真实实装(H07 占位) - `house_claim_history` 表 @Deprecated 标记,前端历史轨迹切 T9 op_log 后下线本期双写 --- ## 五、关联 - 工单:#2894 / #2895 / #2896(全部 closed) - PR:#2900 / #2901 / #2902(全部 squash merged) - QA 报告:`.tmp/qa-r5{f,g,h,i}-*-report.txt`(共 4 份) - memory 升级:`feedback_snowflake-long-no-jackson-deserializer.md`(雪花 Long 禁 @JsonDeserialize(LongDeserializer))