# 配房「先询房选候选 → 单日确认定一家」流程 — 详情逐日补询房中态/候选清单 + 单日确认同步协议价

> 变更类型：✨ 新增字段 + 接口接线说明（后端已就绪，**房务管家前端需按此接线**）
> 端类型：管理后台（房务管家·配房工作台）
> 日期：2026-06-26 ｜ 工单：#4427 ｜ PR：#4433 ｜ 服务：hl-order-service-v3（双实例已部署 health UP，**测试服 API+DB 实测通过**）

---

## 背景：房务配房两阶段流程
1. **第一次选酒店/房型 = 选「询房候选」（可多家）** → 当天进入「询房中」 → 复制话术问酒店。
2. **「单日确认」= 从候选挑一家定下来** → 当天配房完成（一天一家）。

后端能力本就齐：候选落 `house_inquiry_message`（一家一行）；确认走询房回填转配房。本次补齐**详情把「询房中」显示出来 + 当天候选清单**，并让单日确认支持改结算价/同步协议价。

---

## 一、配房详情新增字段（`GET /admin/house/orders/{orderId}` → `itinerary[]`）

### 1. 逐日状态 `arrange` 新增「询房中」
`itinerary[].arrange` 取值由原 `pending`/`confirmed` 扩为三态，`arrangeLabel` 为中文：
- `pending` / **待配房**：当天无询房、无配房。
- `waiting` / **询房中**（新）：当天有进行中的询房（PENDING 待回复 / REPLIED 已回复）且尚未定稿配房。
- `confirmed` / **已确认**：当天已有配房行（**优先级最高**——即便还有遗留询房，也显已确认）。

### 2. 逐日新增 `inquiries[]` 当天询房候选清单
`itinerary[].inquiries`（数组，无询房则空数组）——供「单日确认」弹窗列候选选保留哪家。每项字段：

| 字段 | 类型 | 说明 |
|------|------|------|
| `inquiryId` | String(雪花) | 询房记录 ID（回填/确认时用） |
| `hotelId` | String(雪花) | 酒店 ID |
| `hotelName` | String | 酒店名 |
| `roomCategory` | String | 房型类别字典 code（询房只到类别粒度；**具体房型 ID 由前端单日确认时从该酒店房型列表现选**，故候选不带 roomTypeId） |
| `roomCount` | Integer | 询问间数 |
| `status` | String | 询房状态：PENDING/REPLIED/CONFIRMED/REJECTED/TIMEOUT |
| `statusLabel` | String | 中文：待回复/已回复/已确认/已拒单/已超时 |
| `replyPrice` | String(金额) | 酒店回复报价（未回则空） |
| `replyAvailable` | Integer | 酒店回复可用房数（未回则空） |
| `priority` | String | NORMAL/URGENT |
| `timeoutAt` | DateTime | 询房超时刻（create + 4h） |

> 已取消（CANCELLED）的询房不进清单。

---

## 二、前端接线（房务管家，mmg 需改）

### 1. 第一次选房 → 走「发询房」（多候选），不要走「配房」
- **第一次给某天选候选酒店/房型 → 逐个调 `POST /v3/admin/order/inquiry/send`**（一家一调，body 见下），不要调配房保存 `…/assignments`。
  - 原因：配房保存是「一天一家**定稿**」模型（按天归集，多家只留一家）——这就是「选多个酒店只存一个」的根因。多候选必须落询房表。
  - `send` body：`{requirementId, hotelId, dayNumber, stayDate, nights, roomCount, roomCategory, messageBody?}`；返回 `wechatTemplate`（话术，供复制）。
- 复制话术：`POST /v3/admin/order/inquiry/preview`（所见即所发，不落库），或直接用 send 返回的 `wechatTemplate`。
- 发起后该天 `arrange` 自动变 `waiting`/**询房中**，前端据此显示徽章。

### 2. 「单日确认」→ 弹窗列候选选一家 → 回填转配房
- 弹窗数据源：详情 `itinerary[].inquiries`（或 `GET /v3/admin/order/inquiry?requirementId=&...` 历史）。
- 选定一家 → `POST /v3/admin/order/inquiry/{inquiryId}/reply`，`convertToAssignment=true` → 落配房，该天变「已确认」。
- **可在确认时改价**：
  - 改结算价：传 `replyPrice`（→ 落配房成交售价 sellPrice）。
  - **同步到协议价（新）**：传 `syncProtocolPrice=true` —— 把本次结算价(replyPrice)同步写回 resource 协议价（**与配房 `syncProtocolPrice` 同口径**，无需另填值）。需同时传 `roomTypeId`（前端从该酒店房型列表带入，写回价格日历定位用）。
  - 也可走原显式路径：`syncToCalendar=true` + `newProtocolPrice`/`newStock`（显式另填协议价/库存）。

---

## 接口速查
| 操作 | 接口 |
|------|------|
| 发起询房（一家一调，多候选） | `POST /v3/admin/order/inquiry/send` |
| 话术预览 | `POST /v3/admin/order/inquiry/preview` |
| 询房历史/候选 | `GET /v3/admin/order/inquiry?requirementId=` |
| 单日确认（选一家定稿，可改结算价/同步协议价） | `POST /v3/admin/order/inquiry/{inquiryId}/reply`（convertToAssignment=true，可带 replyPrice / syncProtocolPrice / roomTypeId） |
| 详情逐日态+候选清单 | `GET /admin/house/orders/{orderId}` → `itinerary[].arrange`(+waiting/询房中) / `itinerary[].inquiries[]` |

## 测试服实测（已通过）
- 详情逐日 `inquiries[]` 正确归集当天候选：发一条询房 → DAY 候选清单回 `status=PENDING/待回复`、中文 statusLabel、报价/可用房/优先级齐全；该天有配房时 `arrange` 保持 `confirmed`（已确认优先）。
- 全量单测 4668 通过（含三态 + 候选归集 + 同步协议价写回 replyPrice 当协议价 UT）。
