# 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<TransportPlanVO>`(大交通列表)
- `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))
