# 房务订单详情：逐日城市改显区县（跨区县拆分）+ 配房需求候选酒店暴露真实房型 roomTypeId（已上线测试服·可对接）

> 变更类型：✅ 修改接口（字段语义变更 + 新增字段，已部署测试服并 API 验证，可对接）
> 端类型：管理后台（房务订单详情「配房行程 / 定制师需求」DAY 卡片）
> 日期：2026-06-23 ｜ 工单：#4297、#4204(P3) ｜ PR：#4300、#4305 ｜ 服务：hl-order-service-v3
> 接口：`GET /admin/house/orders/{orderId}` → `data.requirement.current.days[]`（及历史版本 `recentHistory[].snapshot.days[]`）

---

## 背景
1. 之前 DAY 卡片的「城市」显示**市级**（呼伦贝尔市）。wx 要求改显**区县**（海拉尔区），且**同一天多家候选酒店分属不同区县时，全部拆分展示**。
2. wx 要求配房需求**按酒店分类、一个酒店一个房型**——候选酒店应携带**自己的真实房型**（#4204 epic 的房控侧读取 P3）。

## 1. `days[].city` 语义变更：市级 → 区县（可多值）
`requirement.current.days[].city`（字段名**不变**）取值由市级改为**区县级**，取该天**全部候选酒店**的资源区县去重：
- 单区县：`"海拉尔区"`
- **多区县**（候选跨区县）：用顿号 `、` 拼接，如 `"满洲里市、海拉尔区"`、`"额尔古纳市、满洲里市"`
- 区县均解析不到时兜底市级，**绝不为空**。

**前端注意**：该字段现在**可能是多个区县拼接的字符串**，按整串原样展示即可，**勿假设单值/勿按固定宽度截断**。无需改数据结构，仅展示语义。

## 2. 候选/酒店新增真实房型字段（#4204 P3，additive）
`days[].hotels[]`（逐酒店平铺）与 `days[].segments[].candidates[]`（逐段候选）各**新增 3 字段**：

| 字段 | 类型 | 说明 |
|---|---|---|
| `roomTypeId` | String（雪花，可空） | 该候选酒店的**真实房型 ID**（指向 resource 域具体房型） |
| `roomTypeName` | String（可空） | 该候选酒店的**真实房型名称**（如「豪华大床房」），定制师提交时所选 |
| `protocolPrice` | 数值（可空） | 该候选的协议价快照 |

**前端「按酒店分类」渲染**：以 `hotels[]` 为主体逐家展示，每家显示**它自己的** `roomTypeName`（而非段级抽象 `roomCategory`）。段级 `roomCategory/roomCount/budget` 仍保留（兼容、分住分组用）。

**数据可见性**：`roomTypeId/roomTypeName` 仅当定制师提交需求时**录入了每家酒店的真实房型**才有值；历史/旧单缺数据时为 `null`（前端回退展示段级 `roomCategory` 即可）。

## 3. 待前端配合（#4204 P5，mmg）
要让候选酒店都带上真实房型，定制师**提交配房需求的面板**需改为「**先选候选酒店 → 再从该酒店真实房型里选**」，把所选 `roomTypeId` 随候选提交（后端写入侧 P1 已就绪）。本条后端读侧（P3）已备好，该面板改造完成后真实房型即贯穿展示。

---

## 附：聊天发送人名（#4309，纯后端，前端无需改）
内部留言/聊天发送人名解析（hl-user-service `resolveName`）改为「**绑企微 → 企微名，未绑 → 用户名**」三级口径（落地已登记 P2）。`senderName` 字段**不变**，为发送时快照（改名不影响历史），**对新发消息生效**，历史消息保持原快照。前端无需任何改动。

## 验证（测试服 order `2068234602970828802` 实测）
- `days[0].city = "满洲里市、海拉尔区"`、`days[1].city = "额尔古纳市、满洲里市"`（多区县拆分生效）。
- `days[].hotels[].roomTypeId/roomTypeName` 已暴露（如 `普通标间`/`俄式标准房` + 真实 roomTypeId）。
- order-v3 全量单测 + ArchTest 门禁全绿；双实例滚动部署健康。
