# 配房「更换 / 移除」酒店的接口接线说明（接 #4407 换酒店并入配房）

> 变更类型：📌 接口接线说明（无后端代码改动，**前端房务管家需按此接线「移除」**）
> 端类型：管理后台（房务管家·配房弹窗「选择酒店」）
> 日期：2026-06-26 ｜ 关联：#4407（换酒店并入配房唯一写口）｜ 服务：hl-order-service-v3（端点均已在测试服实测）

---

## 背景
#4407 后「换酒店」并入「配房」：点某天「配房」→「选择酒店」弹窗 →「已选配房」回显当前已配酒店（`isCurrentlyAssigned`）。本说明明确弹窗里**「更换」和「移除」分别该调哪个后端接口**——后端能力齐全，关键是前端「移除」要接对端点。

---

## 1. 更换酒店 ✅ 走「确认配房」（§2.2 submit）
- 在「已选配房」把当前酒店改成另一家（移除当前项 + 加入新酒店）→「确认配房」。
- 调 `POST /v3/admin/order/hotel-requirements/{requirementId}/assignments`，body `items` = **该天最终想要的配房集合**。
- 后端按 (hotelId, roomTypeId) **整天对账**：同酒店同房型同间数=不动；换成另一家=自动「释放旧店库存 + 扣新店 + 替换那行」。前端无需关心换/没换，把最终状态提交即可。

## 2. 移除某天已配酒店 ⚠️ 必须走 §2.4 DELETE，**不能靠空提交**
- **关键**：`POST …/assignments` 的 `items` 是 `@NotEmpty`，**空数组会被后端拒**（返 `items 不能为空`，测试服实测）。所以「已选配房」移除到 0 条再点「确认配房(0条)」**删不掉**（界面没了、刷新又回来）。
- 真正移除某天已保存的配房，调 **`DELETE /v3/admin/order/assignments/{id}`**（`{id}` = 该天配房行 assignmentId）。后端：软删该行 + 级联删房间分配 + **释放库存**（测试服实测：删后该天 0 active 行、扣减 log `rollback_status=DONE` 库存已退）。
- **前端「移除」链接的正确接线**：
  - 移除的是**已保存的配房行**（有 assignmentId，即回显出来的当前已配）→ 调 `DELETE /v3/admin/order/assignments/{id}`。
  - 移除的是**本次新加、尚未保存的项**（还没 assignmentId）→ 纯前端本地删即可，不调接口。

## 3. 业务提醒
- 纯移除（该天清空、不换新酒店）会让该天无住宿 → **「最终确认」的「全晚配齐」校验过不了**。常规操作是「移除旧 + 加入新 = 更换」；纯移除仅用于「这天本不该配酒店」的纠错。

---

## 接口速查
| 操作 | 接口 |
|------|------|
| 配房 / 更换酒店 / 加多房型 | `POST /v3/admin/order/hotel-requirements/{requirementId}/assignments`（items=该天最终集合，非空） |
| 改协议价/结算价/备注（不换酒店） | `PUT /v3/admin/order/assignments/{id}` |
| **移除某天已配酒店** | **`DELETE /v3/admin/order/assignments/{id}`** |
| 回显当前已配 | 候选 `GET /v3/admin/hotel-candidates` 的 `isCurrentlyAssigned`/`assignedRoomTypeId`；详情 `currentAssignment.roomTypeId` |
