文件
hl-api-changelog/changelogs-v2/2026-09/24_8269_团期确认后锁定配置各写口收紧到配置阶段-修改接口-管理后台.md
T
2026-09-24 18:40:08 +08:00

1733 行
54 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
---
schema: "hl-changelog/v2"
ticket: "8269"
title: "团期确认后锁定配置:导游 / 摄影 / 物资、订房计划与分房、需求整体确认 / 打回、正式用车需求保存 / 受控重开 / 免车、房务整团抢单的阶段门收紧到确认之前;抢单池 batchStatus 只接受 RESOURCE_PREPARING"
consumer: "admin"
author: "jw(GIT)"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "verified"
frontend_owner: "mmg"
frontend_ref: "bb160fa9bc1455a690eea0d75aea4bae9aa5c50e"
target_release: "v2.1"
verified_at: "2026-09-24"
status_note: "六节点定案(SRS §0.27.3 / §0.27.5 #6~#9):团期人工「确认」(进入 MATERIAL_PREPARING,见 #8268)之后四项配置与物资一律不可修改,没有撤销确认。本单把各写口的允许阶段收紧:导游 / 摄影 / 物资由出行前四态(#8231)收回到招募、配置两态,拒绝码仍为 589598,文案改为「团期已确认,配置不可修改」;订房计划新增 / 修改 / 删除 / 按日确认 / 整团确认与分房微调 / 重算只在 RESOURCE_PREPARING 可用(删除另放行已流团),拒绝码 808600 文案补「订房计划仅在配置阶段可改,团期已确认,配置不可修改」;需求整体确认与整团打回、逐单打回两边同步收紧到 RESOURCE_PREPARING(589501);正式用车需求保存收紧到 RESOURCE_PREPARING(589501),受控重开只在 RESOURCE_PREPARING 可用(809111,文案补同一句),免车在 RESOURCE_PREPARING 及出行完毕 / 核单中可用;房务整团抢单池只收 RESOURCE_PREPARING 的团,分页参数 batchStatus 只接受 RESOURCE_PREPARING,其它值 400,整团认领与超管团级接管对确认后的团返 808651。码值、路径、入参出参结构均不变。子订单退单 / 转团 / 加人、满团名额调整、流团不受本单影响。本条取代 23_8231 中「出行前四态可配」的窗口描述。前端需:确认后隐藏或置灰上述写操作入口、按新文案提示、抢单池筛选下拉只保留资源准备中。 前端已交付(bb160fa9):导/摄/物资三写口收回招募/配置两态+配置按钮置灰 tooltip;订房写口仅配置/删除另放行流团(canPlanWrite/canPlanDelete 拆分);需求打回(整团+逐单)置灰阶段门;用车保存/重开仅配置、免车三态;抢单池下拉只留资源准备中;8 spec 新增 22 例全绿。"
updated_at: "2026-09-24"
base: "dev-v3"
---
# 团期资源配置: 团期确认后配置锁定,各写口收紧到确认之前(管理后台)
> **服务**: hl-order-service-v3(端口 8086/8186)
> **PR**: #8280
> **Issue**: #8269
> **日期**: 2026-09-24
> **影响范围**: 管理后台团期详情页的配导游 / 配摄影、物资、订房计划与分房、查看需求(整体确认 / 打回)、正式用车需求(保存 / 受控重开 / 免车);房务端整团抢单池
---
## ⚠️ 关键变化
1. **团期「确认」之后,下面所有写口一律拒绝**(没有撤销确认)。确认之前(招募 / 配置)可反复改。
2. **#8231 刚放开的「出行前四态都能配导摄物资」被收回**:现在只有招募、配置两态能配,`MATERIAL_PREPARING` / `PENDING_DEPARTURE` 也被拒。589598 码值不变,**文案由「出行后不可再配置导游 / 摄影 / 物资」改为「团期已确认,配置不可修改」**,按原文案做过匹配的要改。
3. **订房计划不再允许返团后按实际入住修正**:改前可写到核单中,现在只剩配置阶段;差异改在核单按成本 / 冲正处理。
4. **需求打回也收紧了**:改前整团打回除已流团外全程可用、逐单打回不看团期阶段;现在两者都只在配置阶段可用。
5. **房务抢单池分页参数 `batchStatus` 只接受 `RESOURCE_PREPARING`**,传 `MATERIAL_PREPARING` / `PENDING_DEPARTURE` / `TRAVELLING` 返 400。
---
## 一、背景
| 节点 | 持久态 | 本单后可写 |
|---|---|---|
| 招募 | `RECRUITING` | 仅导游 / 摄影 / 物资(提前配) |
| 配置 | `RESOURCE_PREPARING` | 本条全部写口 |
| 确认及之后 | `MATERIAL_PREPARING` / `PENDING_DEPARTURE` / `TRAVELLING` / `TRIP_FINISHED` / `REVIEWING` / `SETTLED` | 一律拒绝(免车在出行完毕 / 核单中例外,见接口 21) |
| 已流团 | `CANCELLED` | 一律拒绝(订房计划删除例外,用于释放库存) |
不受本单影响:子订单退单 / 转团 / 加人、满团名额调整、流团、订房计划整团批量释放(仅已流团可用,不变)。
---
## 二、变更接口清单
| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---|------|------|------|----------|------|
| 1 | 保存团期人员配置 | PUT | `/v3/admin/group-batch/{productBatchId}/staff` | 阶段门收紧 + 文案 | 四态 → 招募 / 配置;589598 文案改 |
| 2 | 设置报账人等级 | PUT | `/v3/admin/group-batch/{productBatchId}/staff/{staffId}/reporter-rank` | 阶段门收紧 + 文案 | 同上 |
| 3 | 新增团期备品行 | POST | `/v3/admin/order/group-batch/{groupBatchId}/supplies` | 阶段门收紧 + 文案 | 同上 |
| 4 | 调整团期备品数量 | PUT | `/v3/admin/order/group-batch/supplies/{batchSuppliesId}/quantity` | 阶段门收紧 + 文案 | 同上 |
| 5 | 软删团期备品行 | DELETE | `/v3/admin/order/group-batch/supplies/{batchSuppliesId}` | 阶段门收紧 + 文案 | 同上 |
| 6 | 整团按日提交订房计划 | POST | `/v3/admin/house/group-batches/{groupBatchId}/room-plans` | 阶段门收紧 + 文案 | 六态 → 仅配置;808600 文案改 |
| 7 | 修改单条订房计划 | PUT | `/v3/admin/house/group-batches/{groupBatchId}/room-plans/{planId}` | 阶段门收紧 + 文案 | 同上 |
| 8 | 删除单条订房计划 | DELETE | `/v3/admin/house/group-batches/{groupBatchId}/room-plans/{planId}` | 阶段门收紧 + 文案 | 仅配置 + 已流团 |
| 9 | 按日确认订房 | POST | `/v3/admin/house/group-batches/{groupBatchId}/room-plans/days/{stayDate}/confirm` | 阶段门收紧 + 文案 | 仅配置 |
| 10 | 整团确认订房 | POST | `/v3/admin/house/group-batches/{groupBatchId}/room-plans/confirm` | 阶段门收紧 + 文案 | 仅配置 |
| 11 | 订房确认预检 | GET | `/v3/admin/house/group-batches/{groupBatchId}/room-plans/confirm-check` | 出参取值变化 | `stageAllowed` 仅配置为 true |
| 12 | 人工微调分房 | POST | `/v3/admin/house/group-batches/{groupBatchId}/allocations` | 阶段门收紧 + 文案 | 仅配置 |
| 13 | 重算分房 | POST | `/v3/admin/house/group-batches/{groupBatchId}/allocations/rebuild` | 阶段门收紧 + 文案 | 仅配置 |
| 14 | 整体确认需求缺失预检 | GET | `/v3/admin/order/group-batch/{groupBatchId}/requirement/confirm-check` | 出参取值变化 | `ready` 仅配置可能为 true |
| 15 | 整体确认需求 | POST | `/v3/admin/order/group-batch/{groupBatchId}/requirement/confirm` | 阶段门收紧 | 四态 → 仅配置(589501) |
| 16 | 按户打回需求(整团入口) | POST | `/v3/admin/order/group-batch/{groupBatchId}/requirement/reject` | 阶段门收紧 | 除已流团外全程 → 仅配置(589501) |
| 17 | 团期管理员打回住宿需求(逐单) | POST | `/v3/admin/order/{id}/hotel-requirement/reject` | 新增阶段门 | 仅配置(589501) |
| 18 | 团期管理员打回用车需求(逐单) | POST | `/v3/admin/order/{id}/vehicle-requirement/reject` | 新增阶段门 | 仅配置(589501) |
| 19 | 保存团期正式用车需求 | PUT | `/v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement` | 阶段门收紧 | 四态 → 仅配置(589501) |
| 20 | 受控重开正式用车需求 | POST | `/v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement/reopen` | 阶段门收紧 + 文案 | 三态 → 仅配置;809111 文案改 |
| 21 | 声明整团无需用车 | POST | `/v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement/waive` | 阶段门收紧 | 去掉物料准备中 / 待出发 / 出行中 |
| 22 | 团期抢单池列表 | GET | `/v3/admin/order/grab-pool/group-batches` | 入参取值收窄 + 出参行集合变化 | `batchStatus` 只接受 `RESOURCE_PREPARING`;池内只剩配置阶段的团 |
| 23 | 整团认领 | POST | `/v3/admin/order/grab-pool/group-batches/{groupBatchId}/claim` | 阶段门收紧 | 确认后的团 808651 |
| 24 | 团级接管(超管) | POST | `/v3/admin/order/grab-pool/group-batches/{groupBatchId}/takeover` | 阶段门收紧 | 确认后的团 808651 |
路径、HTTP 方法、权限码、入参结构、成功响应结构均不变;网关无改动。
---
## 三、接口详情
### 1. 保存团期人员配置 `PUT /v3/admin/group-batch/{productBatchId}/staff`
**VO**: `BatchStaffConfigReqVO` → `BatchStaffConfigRespVO`
#### 使用场景
团期详情页「配导游 / 配摄影」弹窗保存(整期全量覆盖,可按 `scopeRoles` 限定角色范围)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| productBatchId | Path | Long | ✅ | 产品侧排期 ID | 未建团返 589553(不变) |
| scopeRoles | Body | List<String> | 否 | 元素非空 | 限定覆盖的角色范围(不变) |
| staffList | Body | List | 否 | null 按空列表 | 传空列表 = 清空覆盖范围内配置(不变) |
| staffList[].staffId | Body | Long | ✅ | 须命中候选人员 | 不变 |
| staffList[].staffRole | Body | String | ✅ | 须与人员类型相符 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| productBatchId | Long | 不变 |
| groupBatchId | Long | 不变 |
| staffList | List | 保存后的整期最终状态(不变) |
| affectedOrderCount | Integer | 不变 |
#### 请求示例
```json
{ "staffList": [ { "staffId": 1002, "staffRole": "GUIDE", "sortOrder": 0 } ] }
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"data": { "productBatchId": "2097250420299530242", "groupBatchId": "2097250563497385985", "affectedOrderCount": 0, "staffList": [ { "staffId": 1002, "staffRole": "GUIDE" } ] },
"success": true
}
```
#### 空数据 / 降级响应
`staffList` 传空列表即清空,返回 200、`staffList` 为空数组(不变)。
```json
{ "code": 200, "data": { "staffList": [], "affectedOrderCount": 0 }, "success": true }
```
#### 错误响应
```json
{
"code": 589598,
"message": "团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 允许:`RECRUITING`、`RESOURCE_PREPARING`;其余(含 `MATERIAL_PREPARING`、`PENDING_DEPARTURE`、`CANCELLED`)589598,被拒时零写入。
- 未建团仍返 589553,与 589598 不可合并。
---
### 2. 设置报账人等级 `PUT /v3/admin/group-batch/{productBatchId}/staff/{staffId}/reporter-rank`
**VO**: `ReporterRank`(枚举入参)→ `Result<Void>`
#### 使用场景
团期人员名单里标主报账人 / 协助报账人,与保存口同窗口。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| productBatchId | Path | Long | ✅ | - | 不变 |
| staffId | Path | Long | ✅ | 须命中已配人员 | 不变 |
| rank | Body | String | ✅ | `PRIMARY` / `ASSIST` / `NONE` | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```json
{ "rank": "PRIMARY" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
无列表出参,无空数据形态。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
```json
{
"code": 589598,
"message": "团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 窗口与保存口完全一致:招募、配置两态。
- 被拒时零写入。
---
### 3. 新增团期备品行 `POST /v3/admin/order/group-batch/{groupBatchId}/supplies`
**VO**: `AddSuppliesReqVO` → `Result<Long>`
#### 使用场景
「物资」页签手工录入一行备品。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | 团期主键 | 不变 |
| suppliesName | Body | String | 否 | 纯手填时必填 | 不变 |
| suppliesResourceId | Body | Long | 否 | - | 不变 |
| quantity | Body | Integer | ✅ | ≥ 1 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Long | 新建备品行 ID(不变) |
#### 请求示例
```json
{ "suppliesName": "雨衣", "quantity": 1, "sortOrder": 999 }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": "2102611411027066881", "success": true }
```
#### 空数据 / 降级响应
写接口,无空数据形态;创单时系统固化产品备品的路径不过本门(不变)。
```json
{ "code": 200, "data": "2102611411027066881", "success": true }
```
#### 错误响应
```json
{
"code": 589598,
"message": "团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 允许:`RECRUITING`、`RESOURCE_PREPARING`;其余 589598,不落库。
- 确认物资之后、团期确认之前仍可增删改(确认物资不锁物资清单,团期确认才锁)。
---
### 4. 调整团期备品数量 `PUT /v3/admin/order/group-batch/supplies/{batchSuppliesId}/quantity`
**VO**: `AdjustSuppliesQuantityReqVO` → `Result<Void>`
#### 使用场景
「物资」页签行内改数量。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| batchSuppliesId | Path | Long | ✅ | 须命中活跃备品行 | 不变 |
| quantity | Body | Integer | ✅ | ≥ 1 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```json
{ "quantity": 5 }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
无列表出参;备品行已软删返 589521(不变)。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
```json
{
"code": 589598,
"message": "团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 阶段门按备品行所属团期判定,窗口同新增口。
- 被拒时数量不变。
---
### 5. 软删团期备品行 `DELETE /v3/admin/order/group-batch/supplies/{batchSuppliesId}`
**VO**: `Result<Void>`(无请求体)
#### 使用场景
「物资」页签删除一行备品。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| batchSuppliesId | Path | Long | ✅ | 须命中活跃备品行 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```http
DELETE /v3/admin/order/group-batch/supplies/2102611411027066881 HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
对已软删的行再调返 589521(不变)。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
```json
{
"code": 589598,
"message": "团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 窗口同新增口;被拒时该行不被软删。
---
### 6. 整团按日提交订房计划 `POST /v3/admin/house/group-batches/{groupBatchId}/room-plans`
**VO**: `GroupBatchRoomPlanSaveReqVO` → `List<GroupBatchRoomPlanRespVO>`
#### 使用场景
房务在团期订房页按日录入订房行(追加式)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | 团期主键 | 不变 |
| items | Body | List | ✅ | 1~200 行 | 订房行(不变) |
| items[].stayDate | Body | LocalDate | ✅ | 落在团期区间内 | 不变 |
| items[].hotelId | Body | Long | ✅ | - | 不变 |
| items[].roomTypeId | Body | Long | ✅ | - | 不变 |
| items[].roomCount | Body | Integer | ✅ | ≥ 1 | 不变 |
其余行字段(`roomCategory` / `protoPrice` / `settlementPrice` / `settleType` / `deductInventory` / `remark`)不变。
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| [].planId | Long | 计划行 ID(不变) |
| [].planStatus | String | `PENDING` / `CONFIRMED`(不变) |
| [].version | Integer | 乐观锁版本(不变) |
其余字段不变。
#### 请求示例
```json
{ "items": [ { "stayDate": "2026-10-01", "hotelId": 200001, "roomTypeId": 300001, "roomCount": 3 } ] }
```
#### 响应示例
```json
{
"code": 200,
"message": "成功",
"data": [ { "planId": "2103000000000000001", "stayDate": "2026-10-01", "roomCount": 3, "planStatus": "PENDING", "version": 0 } ],
"success": true
}
```
#### 空数据 / 降级响应
`items` 不能为空(400,不变);成功时返回本次新建的行。
```json
{ "code": 200, "data": [], "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 允许:仅 `RESOURCE_PREPARING`。改前 `RESOURCE_PREPARING` ~ `REVIEWING` 六态可写。
- 808600 的 `{0}` 是团期当前状态码。
---
### 7. 修改单条订房计划 `PUT /v3/admin/house/group-batches/{groupBatchId}/room-plans/{planId}`
**VO**: `GroupBatchRoomPlanItemReqVO` → `GroupBatchRoomPlanRespVO`
#### 使用场景
房务修改一条订房行(关键字段变化即删旧建新)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| planId | Path | Long | ✅ | - | 不变 |
| version | Body | Integer | ✅ | 乐观锁 | 不变 |
| roomCount | Body | Integer | 否 | ≥ 1 | 不变 |
| replaceReason | Body | String | 否 | ≤ 256 | 原「核单中团期必填」,本次起核单中已不可改,该约束不再触发 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| planId | Long | 不变 |
| planStatus | String | 不变 |
| version | Integer | 不变 |
| warnings | List&lt;String&gt; | 不变 |
#### 请求示例
```json
{ "version": 0, "roomCount": 4 }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "planId": "2103000000000000001", "roomCount": 4, "planStatus": "PENDING", "version": 1, "warnings": [] }, "success": true }
```
#### 空数据 / 降级响应
无列表出参;`warnings` 无告警时为空数组(不变)。
```json
{ "code": 200, "data": { "warnings": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(PENDING_DEPARTURE)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;返团后按实际入住修正计划不再允许,差异走核单成本 / 冲正。
- 「已发生的间夜冻结」808690 在修改路径上已不可达(出行后阶段门先拦)。
---
### 8. 删除单条订房计划 `DELETE /v3/admin/house/group-batches/{groupBatchId}/room-plans/{planId}`
**VO**: `GroupBatchRoomPlanDeleteReqVO` → `GroupBatchRoomPlanDeleteRespVO`
#### 使用场景
房务删除一条订房行(软删,归还库存);已流团的团也用它释放库存。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| planId | Path | Long | ✅ | - | 不变 |
| reason | Body | String | 否 | ≤ 256 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| planId | Long | 不变 |
| releasedLogId | Long | 不变 |
| warnings | List&lt;String&gt; | 不变 |
#### 请求示例
```json
{ "reason": "客人退团,该晚不再需要" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "planId": "2103000000000000001", "releasedLogId": null, "warnings": [] }, "success": true }
```
#### 空数据 / 降级响应
从未扣过库存的行 `releasedLogId` 为 null(不变)。
```json
{ "code": 200, "data": { "releasedLogId": null, "warnings": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 允许:`RESOURCE_PREPARING` 与 `CANCELLED`(已流团释放库存,不变);确认后到核单中均被拒。
---
### 9. 按日确认订房 `POST /v3/admin/house/group-batches/{groupBatchId}/room-plans/days/{stayDate}/confirm`
**VO**: `GroupBatchRoomDayConfirmRespVO`
#### 使用场景
房务逐日确认订房(扣库存、分房、回填配房完成标志)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| stayDate | Path | String | ✅ | `yyyy-MM-dd` | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| confirmedPlanIds | List&lt;Long&gt; | 不变 |
| skippedPlanIds | List&lt;Long&gt; | 不变 |
| hotelReady | Boolean | 不变 |
| warnings | List | 不变 |
#### 请求示例
```http
POST /v3/admin/house/group-batches/2097250563497385985/room-plans/days/2026-10-01/confirm HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "stayDate": "2026-10-01", "confirmedPlanIds": ["2103000000000000001"], "skippedPlanIds": [], "hotelReady": false, "warnings": [] }, "success": true }
```
#### 空数据 / 降级响应
该日已全部确认时幂等返回,`confirmedPlanIds` 为空、`skippedPlanIds` 列出已确认行(不变)。
```json
{ "code": 200, "data": { "confirmedPlanIds": [], "skippedPlanIds": ["2103000000000000001"] }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;与「可写」同一集合,不会出现「能改却确认不了」。
---
### 10. 整团确认订房 `POST /v3/admin/house/group-batches/{groupBatchId}/room-plans/confirm`
**VO**: `GroupBatchRoomConfirmAllRespVO`
#### 使用场景
房务一键整团确认订房(先整团预检,再逐日确认)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| confirmedDates | List&lt;String&gt; | 不变 |
| skippedDates | List&lt;String&gt; | 不变 |
| emptyDemand | Boolean | 不变 |
| hotelReady | Boolean | 不变 |
#### 请求示例
```http
POST /v3/admin/house/group-batches/2097250563497385985/room-plans/confirm HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "confirmedDates": ["2026-10-01", "2026-10-02"], "skippedDates": [], "emptyDemand": false, "hotelReady": true, "warnings": [] }, "success": true }
```
#### 空数据 / 降级响应
全团无需订房时直接置配房完成并返回 `emptyDemand=true`(不变)。
```json
{ "code": 200, "data": { "confirmedDates": [], "emptyDemand": true, "hotelReady": true }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;阶段门在整团预检第一步,被拒时零写入。
---
### 11. 订房确认预检 `GET /v3/admin/house/group-batches/{groupBatchId}/room-plans/confirm-check`
**VO**: `GroupBatchRoomConfirmCheckReqVO` → `GroupBatchRoomConfirmCheckRespVO`
#### 使用场景
订房页「确认」按钮前的只读预检。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| stayDate | Query | LocalDate | 否 | - | 不传返回全部相关日(不变) |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| stageAllowed | Boolean | **取值改变**:仅 `RESOURCE_PREPARING` 为 true(改前资源准备中 ~ 核单中为 true) |
| ready | Boolean | 整团是否可确认(含 `stageAllowed`,随之变化) |
| batchStatus | String | 不变 |
| days | List | 不变 |
#### 请求示例
```http
GET /v3/admin/house/group-batches/2097250563497385985/room-plans/confirm-check HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
无请求体。
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "batchStatus": "MATERIAL_PREPARING", "stageAllowed": false, "ready": false, "days": [] }, "success": true }
```
#### 空数据 / 降级响应
无计划行时 `days` 为空数组(不变)。
```json
{ "code": 200, "data": { "stageAllowed": true, "ready": false, "days": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 589500,
"message": "团期不存在",
"success": false,
"data": null
}
```
#### 业务边界
- 只读零副作用;确认后打开订房页,`stageAllowed=false` 可直接用来置灰确认按钮。
---
### 12. 人工微调分房 `POST /v3/admin/house/group-batches/{groupBatchId}/allocations`
**VO**: `GroupBatchRoomAllocationSaveReqVO` → `GroupBatchRoomAllocationRebuildRespVO`
#### 使用场景
房务在分房页手工调整某户落在哪条计划行。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| items | Body | List | 否 | ≤ 500 行;与 `clearPlanIds` 至少一个非空 | 不变 |
| clearPlanIds | Body | List&lt;Long&gt; | 否 | ≤ 200 条 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| balanced | Boolean | 不变 |
| hotelReady | Boolean | 不变 |
| days | List | 不变 |
| warnings | List | 不变 |
#### 请求示例
```json
{ "items": [], "clearPlanIds": ["2103000000000000001"] }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "force": false, "balanced": true, "hotelReady": true, "days": [], "warnings": [] }, "success": true }
```
#### 空数据 / 降级响应
`days` / `warnings` 无内容时为空数组(不变)。
```json
{ "code": 200, "data": { "days": [], "warnings": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;改前资源准备中 ~ 核单中可用。
---
### 13. 重算分房 `POST /v3/admin/house/group-batches/{groupBatchId}/allocations/rebuild`
**VO**: `GroupBatchRoomAllocationRebuildReqVO` → `GroupBatchRoomAllocationRebuildRespVO`
#### 使用场景
房务按当前需求基线重算分房。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| force | Body | Boolean | 否 | 默认 false | 不变 |
| stayDate | Body | LocalDate | 否 | - | 不传 = 全部已确认日(不变) |
| reason | Body | String | 否 | `force=true` 时必填 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| balanced | Boolean | 不变 |
| hotelReady | Boolean | 不变 |
| days / skippedDays | List | 不变 |
#### 请求示例
```json
{ "force": false, "stayDate": "2026-10-01" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "force": false, "balanced": true, "hotelReady": true, "days": [], "skippedDays": [] }, "success": true }
```
#### 空数据 / 降级响应
未确认的日进 `skippedDays`(不变)。
```json
{ "code": 200, "data": { "days": [], "skippedDays": [ { "stayDate": "2026-10-02", "reason": "PLAN_NOT_CONFIRMED" } ] }, "success": true }
```
#### 错误响应
```json
{
"code": 808600,
"message": "团期当前阶段(MATERIAL_PREPARING)不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`。
---
### 14. 整体确认需求缺失预检 `GET /v3/admin/order/group-batch/{groupBatchId}/requirement/confirm-check`
**VO**: `GroupBatchRequirementCheckRespVO`
#### 使用场景
「查看需求」页整体确认按钮前的只读预检。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| ready | Boolean | **取值改变**:阶段条件由「资源准备中 / 物料准备中 / 待出发 / 出行中」收紧为仅 `RESOURCE_PREPARING` |
| batchStatus / batchStatusName | String | 不变 |
| missing / vehicleMissing | List | 不变 |
#### 请求示例
```http
GET /v3/admin/order/group-batch/2097250563497385985/requirement/confirm-check HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
无请求体。
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "batchStatus": "MATERIAL_PREPARING", "batchStatusName": "物料准备中", "ready": false, "missing": [], "vehicleMissing": [] }, "success": true }
```
#### 空数据 / 降级响应
无缺失时两个缺失清单为空数组(不变)。
```json
{ "code": 200, "data": { "ready": true, "missing": [], "vehicleMissing": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 589500,
"message": "团期不存在",
"success": false,
"data": null
}
```
#### 业务边界
- 缺失清单为空但 `ready=false`,说明卡在团期阶段;确认后打开该页恒为 false。
---
### 15. 整体确认需求 `POST /v3/admin/order/group-batch/{groupBatchId}/requirement/confirm`
**VO**: `GroupBatchRequirementConfirmRespVO`
#### 使用场景
团期管理员整体确认需求、放行房务 / 车务。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| requirementConfirmed | Boolean | 不变 |
| dispatchedOrderIds / skippedOrderIds | List&lt;Long&gt; | 不变 |
| groupVehicleRequirementStatus | String | 不变 |
#### 请求示例
```http
POST /v3/admin/order/group-batch/2097250563497385985/requirement/confirm HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "requirementConfirmed": true, "dispatchedOrderIds": ["60123456789001"], "skippedOrderIds": [], "dispatchedCount": 1 }, "success": true }
```
#### 空数据 / 降级响应
无可放行户时 `dispatchedOrderIds` 为空数组(不变)。
```json
{ "code": 200, "data": { "requirementConfirmed": true, "dispatchedOrderIds": [], "dispatchedCount": 0 }, "success": true }
```
#### 错误响应
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;改前物料准备中 / 待出发 / 出行中也可重新确认,现在一律 589501。
- 与打回(接口 16~18)同步收紧,不会出现「能打回却确认不了」。
---
### 16. 按户打回需求(整团入口) `POST /v3/admin/order/group-batch/{groupBatchId}/requirement/reject`
**VO**: `RejectRequirementReqVO` → `GroupBatchRequirementRejectRespVO`
#### 使用场景
「查看需求」页勾选多户打回给定制师重提。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| orderIds | Body | List&lt;Long&gt; | ✅ | 1~200 户 | 不变 |
| reason | Body | String | ✅ | ≤ 500 字 | 不变 |
| resourceType | Body | String | 否 | `HOTEL` / `VEHICLE` / `ALL`,默认 `ALL` | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| requirementConfirmed | Boolean | 成功后恒 false(不变) |
| rejected[] | List | 每户每资源类型一条(不变) |
#### 请求示例
```json
{ "orderIds": ["60123456789001"], "reason": "房型数量与人数不符,请重报", "resourceType": "HOTEL" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "requirementConfirmed": false, "rejected": [ { "orderId": "60123456789001", "resourceType": "HOTEL", "requirementId": "90011223344", "sourceStatus": "PENDING_REVIEW" } ] }, "success": true }
```
#### 空数据 / 降级响应
所选户均无可打回的需求时 `rejected` 为空数组(不变)。
```json
{ "code": 200, "data": { "requirementConfirmed": false, "rejected": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`。改前除已流团外全程可用(含招募中),**招募中现在也被拒**。
---
### 17. 团期管理员打回住宿需求(逐单) `POST /v3/admin/order/{id}/hotel-requirement/reject`
**VO**: `RejectReqVO` → `Result<Void>`
#### 使用场景
逐户需求详情里单独打回住宿需求。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| id | Path | Long | ✅ | 子订单 ID | 不变 |
| returnRemark | Body | String | ✅ | ≤ 500 字 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```json
{ "returnRemark": "第二晚缺房型,请补充" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
无列表出参。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
所属团期不在 `RESOURCE_PREPARING`:
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- **新增阶段门**:改前逐单打回不看团期阶段;现在仅 `RESOURCE_PREPARING`。
- 非团期订单仍返 582083(不变)。
---
### 18. 团期管理员打回用车需求(逐单) `POST /v3/admin/order/{id}/vehicle-requirement/reject`
**VO**: `RejectReqVO` → `Result<Void>`
#### 使用场景
逐户需求详情里单独打回行程用车或接送机需求。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| id | Path | Long | ✅ | 子订单 ID | 不变 |
| kind | Query | String | 否 | `TRAVEL` / `TRANSFER`,默认 `TRAVEL` | 不变 |
| returnRemark | Body | String | ✅ | ≤ 500 字 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```json
{ "returnRemark": "用车人数与报名人数不符" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
无列表出参。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- **新增阶段门**:仅 `RESOURCE_PREPARING`;非团期订单仍返 582083。
---
### 19. 保存团期正式用车需求 `PUT /v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement`
**VO**: `GroupVehicleRequirementSaveReqVO` → `GroupVehicleRequirementRespVO`
#### 使用场景
团期管理员编辑整团乘车分组(全量替换)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| version | Body | Integer | 否 | 首次保存传 null | 不变 |
| remark | Body | String | 否 | ≤ 500 字 | 不变 |
| groups | Body | List | ✅ | 不能为 null | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| requirementId | Long | 不变 |
| status | String | 不变 |
| version | Integer | 不变 |
| groups | List | 不变 |
#### 请求示例
```json
{ "version": 3, "groups": [ { "groupCode": "BUS", "vehicleType": "BUS", "serviceStartDate": "2026-10-01", "serviceEndDate": "2026-10-03", "seats": 35, "count": 1, "days": [ { "tripDate": "2026-10-01", "headcount": 30, "memberOrderIds": ["60123456789001"] } ] } ] }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "requirementId": "1867000000101", "groupBatchId": "2097250563497385985", "status": "DRAFT", "version": 4, "groups": [] }, "success": true }
```
#### 空数据 / 降级响应
整团免车请走 `waive`,本接口 `groups` 为 null 返 400(不变)。
```json
{ "code": 200, "data": { "status": "DRAFT", "groups": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;改前资源准备中 / 物料准备中 / 待出发 / 出行中可用。
---
### 20. 受控重开正式用车需求 `POST /v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement/reopen`
**VO**: `GroupVehicleRequirementReopenReqVO` → `GroupVehicleReopenRespVO`
#### 使用场景
把已被车务执行的正式用车需求退回可改(带令牌、范围、有效期的窗口)。本次起只在配置阶段可用,是配置阶段内把已完成的用车需求改回的唯一出口。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| reason | Body | String | ✅ | ≤ 200 | 不变 |
| scopeGroupCodes | Body | List&lt;String&gt; | ✅ | 1~20 个 | 不变 |
| scopeDates | Body | List&lt;LocalDate&gt; | ✅ | 1~60 天 | 不变 |
| windowMinutes | Body | Integer | 否 | 10~1440,默认 120 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| requirementId | Long | 不变 |
| requirementStatus | String | 不变 |
| windowToken | String | 不变 |
| expiresAt | LocalDateTime | 不变 |
| blockedStage | String | 本次起恒为 `RESOURCE_PREPARING` |
#### 请求示例
```json
{ "reason": "客户临时增加 2 人,需要加一辆车", "scopeGroupCodes": ["BUS"], "scopeDates": ["2026-10-01"], "windowMinutes": 120 }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "requirementId": "1934567890123456789", "requirementVersion": 3, "requirementStatus": "PENDING_RECONFIRM", "windowToken": "窗口令牌示例", "expiresAt": "2026-09-24 12:00:00", "blockedStage": "RESOURCE_PREPARING", "batchStatus": "RESOURCE_PREPARING" }, "success": true }
```
#### 空数据 / 降级响应
同一操作人重复开窗幂等返回既有令牌(不变)。
```json
{ "code": 200, "data": { "requirementStatus": "PENDING_RECONFIRM", "windowToken": "窗口令牌示例" }, "success": true }
```
#### 错误响应
```json
{
"code": 809111,
"message": "团期当前状态 MATERIAL_PREPARING 不允许编辑、确认或重开正式用车需求:仅配置阶段可改,团期已确认,配置不可修改",
"success": false,
"data": null
}
```
#### 业务边界
- 仅 `RESOURCE_PREPARING`;改前物料准备中 / 待出发也可重开(#7442 窗口),本次起下线。
- 809101 / 809203 / 809209 等其余拒绝条件不变。
---
### 21. 声明整团无需用车 `POST /v3/admin/order/group-batch/{groupBatchId}/vehicle-requirement/waive`
**VO**: `GroupVehicleRequirementWaiveReqVO` → `GroupVehicleRequirementRespVO`
#### 使用场景
纯自驾等整团不用车的团声明免车。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | - | 不变 |
| reason | Body | String | ✅ | ≤ 200 字 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| status | String | 不变 |
| groups | List | 免车态为空数组(不变) |
#### 请求示例
```json
{ "reason": "纯自驾团,客户自理交通" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "requirementId": "1867000000101", "status": "CONFIRMED", "groups": [] }, "success": true }
```
#### 空数据 / 降级响应
已是免车态时幂等返回(不变)。
```json
{ "code": 200, "data": { "status": "CONFIRMED", "groups": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 589501,
"message": "团期状态不允许当前操作",
"success": false,
"data": null
}
```
#### 业务边界
- 允许:`RESOURCE_PREPARING`、`TRIP_FINISHED`、`REVIEWING`。改前另含 `MATERIAL_PREPARING` / `PENDING_DEPARTURE` / `TRAVELLING`,本次去掉。
- 出行完毕 / 核单中仍可补点免车(结算闸需要),不属于「确认后改配置」。
- 809114 等其余拒绝条件不变。
---
### 22. 团期抢单池列表 `GET /v3/admin/order/grab-pool/group-batches`
**VO**: `HouseGroupGrabPoolPageReqVO` → `PageResult<HouseGroupGrabPoolItemRespVO>`
#### 使用场景
房务端整团抢单池(一团一条)。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| batchStatus | Query | String | 否 | **只接受 `RESOURCE_PREPARING`** | **本次收窄**:改前接受 `RESOURCE_PREPARING` / `MATERIAL_PREPARING` / `PENDING_DEPARTURE` / `TRAVELLING` |
| keyword | Query | String | 否 | ≤ 32 字 | 不变 |
| productId | Query | Long | 否 | - | 不变 |
| departDateFrom / departDateTo | Query | LocalDate | 否 | - | 不变 |
| page | Query | Integer | 否 | ≥ 1,默认 1 | 不变 |
| pageSize | Query | Integer | 否 | 1~100,默认 20 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| records[].groupBatchId | Long | 不变 |
| records[].batchStatus | String | **行集合改变**:本次起恒为 `RESOURCE_PREPARING` |
| records[].batchStatusLabel | String | 恒为「资源准备中」 |
| records[].hotelReady | Boolean | 不变 |
| total | Long | 不变 |
#### 请求示例
```http
GET /v3/admin/order/grab-pool/group-batches?batchStatus=RESOURCE_PREPARING&page=1&pageSize=20 HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
无请求体。
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "total": 1, "records": [ { "groupBatchId": "2097250563497385985", "batchNo": "GB26100101", "batchStatus": "RESOURCE_PREPARING", "batchStatusLabel": "资源准备中", "hotelReady": false, "urgencyLevel": "NORMAL" } ] }, "success": true }
```
#### 空数据 / 降级响应
无可认领团期时空页(不变)。
```json
{ "code": 200, "data": { "total": 0, "records": [] }, "success": true }
```
#### 错误响应
```json
{ "code": 400, "message": "batchStatus 只接受 RESOURCE_PREPARING", "success": false, "data": null }
```
#### 业务边界
- 入池条件:未被认领 + 需求已整体确认 + 团期在 `RESOURCE_PREPARING`;确认后的团不再出现在池里。
- 不传 `batchStatus` 即可,前端筛选下拉若保留其它三个值会得到 400。
---
### 23. 整团认领 `POST /v3/admin/order/grab-pool/group-batches/{groupBatchId}/claim`
**VO**: `Result<Void>`(无请求体)
#### 使用场景
房务在抢单池点「认领」整团。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | 团期主键 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| data | Void | 成功返回 null |
#### 请求示例
```http
POST /v3/admin/order/grab-pool/group-batches/2097250563497385985/claim HTTP/1.1
Host: api.test.1814.love:9443
Authorization: Bearer <admin token>
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": null, "success": true }
```
#### 空数据 / 降级响应
无列表出参。
```json
{ "code": 200, "data": null, "success": true }
```
#### 错误响应
```json
{
"code": 808651,
"message": "该团期当前不可认领(需求未整体确认或团期阶段不允许)",
"success": false,
"data": null
}
```
#### 业务边界
- 团期阶段须为 `RESOURCE_PREPARING`;改前物料准备中 / 待出发 / 出行中也可认领。
- 已被他人认领 / 自己已认领的码不变。
---
### 24. 团级接管(超管) `POST /v3/admin/order/grab-pool/group-batches/{groupBatchId}/takeover`
**VO**: `HouseGroupTakeoverReqVO` → `HouseGroupTakeoverRespVO`
#### 使用场景
超管把某团的房务认领人改派给另一位房务(如原认领人离职)。与整团认领共用同一阶段集合。
#### 入参
| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 |
|------|------|------|------|------|------|
| groupBatchId | Path | Long | ✅ | 团期主键 | 不变 |
| toUserId | Body | Long | ✅ | 须为在职房务 | 不变 |
| reason | Body | String | ✅ | trim 后 10~200 字 | 不变 |
#### 出参
| 字段 | 类型 | 说明 |
|------|------|------|
| groupBatchId | Long | 不变 |
| fromClaimerId / toClaimerId | Long | 不变 |
| toClaimerName | String | 不变 |
| clearedOrderIds / legacyFinalizedOrderIds / skippedOrderIds | List&lt;String&gt; | 不变 |
#### 请求示例
```json
{ "toUserId": 30002, "reason": "原认领房务离职,指派新房务接管该团" }
```
#### 响应示例
```json
{ "code": 200, "message": "成功", "data": { "groupBatchId": "2097250563497385985", "fromClaimerId": "30001", "toClaimerId": "30002", "toClaimerName": "李四", "clearedOrderIds": [], "legacyFinalizedOrderIds": [], "skippedOrderIds": [] }, "success": true }
```
#### 空数据 / 降级响应
没有需要清理的户级归属时三个列表为空数组(不变)。
```json
{ "code": 200, "data": { "clearedOrderIds": [], "legacyFinalizedOrderIds": [], "skippedOrderIds": [] }, "success": true }
```
#### 错误响应
```json
{
"code": 808651,
"message": "该团期当前不可认领(需求未整体确认或团期阶段不允许)",
"success": false,
"data": null
}
```
#### 业务边界
- 团期阶段须为 `RESOURCE_PREPARING`;改前物料准备中 / 待出发 / 出行中也可接管。确认后的团要换房务负责人,本接口不再可用。
- 非超管、原因过短等其余拒绝码不变。
---
## 四、契约约束与正确调用方式
### ✅ 正确 / ❌ 错误调用对照
| 场景 | 结果 |
|------|------|
| ✅ 招募中配导游 / 摄影 / 物资 | 200 |
| ✅ 配置中改订房、改用车、打回需求、重开用车 | 200 |
| ❌ 确认后(`MATERIAL_PREPARING`)保存导摄或改物资 | 589598「团期已确认,配置不可修改」 |
| ❌ 确认后改订房 / 确认订房 / 分房 | 808600 |
| ❌ 确认后整体确认需求、打回需求、保存用车需求 | 589501 |
| ❌ 确认后受控重开用车 | 809111 |
| ❌ 抢单池 `batchStatus=MATERIAL_PREPARING` | 400 |
### 文案变化(码值不变)
| code | 改前 message | 改后 message |
|---|---|---|
| 589598 | 出行后不可再配置导游 / 摄影 / 物资 | 团期已确认,配置不可修改 |
| 808600 | 团期当前阶段({0})不允许修改订房计划 | 团期当前阶段({0})不允许修改订房计划:订房计划仅在配置阶段可改,团期已确认,配置不可修改 |
| 809111 | 团期当前状态 {0} 不允许编辑、确认或重开正式用车需求 | 团期当前状态 {0} 不允许编辑、确认或重开正式用车需求:仅配置阶段可改,团期已确认,配置不可修改 |
前端按码值分支即可;按原文案做过匹配的需改。
---
## 五、数据库行为
- 所有接口在阶段门被拒时**零写入**:阶段门位于任何写库动作之前。
- 放行时的写入行为与改前完全一致(本单只改允许的阶段集合与拒绝文案),不新增、不删除任何写入。
- 抢单池与两个预检接口只读。
---
## 六、边界行为
- 未登录 → 401(网关拦截)。
- 团期不存在 → 589500 / 各域既有「不存在」码(不变)。
- 已流团:导摄物资 589598、订房计划只允许删除 / 整团释放、需求与用车一律 589501 / 809111。
- 子订单退单、转团、加人不受本单影响(只锁团期配置,不锁子订单)。
- 满团名额调整(招募、配置)、流团(招募 ~ 待出发)窗口不变。
- 核单中订房修改的 808617、出行中的 808690 两道守卫在修改路径上已不可达。
---
## 六.6、修改前后对比
### 字段级对比
| 字段 | 改前 | 改后 |
|------|------|------|
| 抢单池入参 `batchStatus` 可选值 | `RESOURCE_PREPARING` / `MATERIAL_PREPARING` / `PENDING_DEPARTURE` / `TRAVELLING` | 仅 `RESOURCE_PREPARING` |
| 订房预检 `stageAllowed` | 资源准备中 ~ 核单中为 true | 仅资源准备中为 true |
| 需求预检 `ready` 的阶段条件 | 资源准备中 / 物料准备中 / 待出发 / 出行中 | 仅资源准备中 |
| 589598 / 808600 / 809111 message | 见「四」改前列 | 见「四」改后列 |
### 行为级对比
| 写口 | 改前允许 | 改后允许 |
|------|----------|----------|
| 导游 / 摄影 / 物资(接口 1~5) | 招募 / 配置 / 物料准备中 / 待出发 | 招募 / 配置 |
| 订房计划新增 / 修改 / 按日确认 / 整团确认 / 分房微调 / 重算(接口 6、7、9、10、12、13) | 资源准备中 ~ 核单中 | 资源准备中 |
| 订房计划删除(接口 8) | 资源准备中 ~ 核单中 + 已流团 | 资源准备中 + 已流团 |
| 需求整体确认(接口 15) | 资源准备中 / 物料准备中 / 待出发 / 出行中 | 资源准备中 |
| 整团打回(接口 16) | 除已流团外全程 | 资源准备中 |
| 逐单打回(接口 17、18) | 不看团期阶段 | 资源准备中 |
| 保存正式用车需求(接口 19) | 资源准备中 / 物料准备中 / 待出发 / 出行中 | 资源准备中 |
| 受控重开(接口 20) | 资源准备中 / 物料准备中 / 待出发 | 资源准备中 |
| 免车(接口 21) | 资源准备中 / 物料准备中 / 待出发 / 出行中 / 出行完毕 / 核单中 | 资源准备中 / 出行完毕 / 核单中 |
| 整团认领 / 团级接管(接口 23、24) | 资源准备中 / 物料准备中 / 待出发 / 出行中 | 资源准备中 |
## 六.7、影响评估
- **是否破坏向后兼容**: 是。确认后的写操作全部被拒;抢单池 `batchStatus` 旧可选值返 400;589598 文案变化。
- **前端是否必须同步上线**: 否(后端拒绝即安全),但建议同步:确认后隐藏或置灰上述入口,否则用户点了才看到报错;抢单池筛选下拉若保留旧选项会触发 400。
- **前端 workaround 清理点**: #8231 交接时物资页签「出行前四态放行」的显隐判据需收回到招募 / 配置两态;按 589598 原文案做匹配的地方改为按码值。
---
## 七、不影响范围
- **仅影响**: 上述 24 个接口的允许阶段与 3 个错误码的文案。
- **零影响**:
- 子订单退单 / 转团 / 加人
- 满团名额调整、流团、取消成团
- 订房计划整团批量释放(仅已流团,不变)
- 各接口的路径、权限码、入参结构、成功响应结构
- 小程序端
---
## 八、测试环境已验证
部署:hl-order-service-v3 = dev-v3 @ d9fdd7fe0 / ade8ac292,经网关 `https://api.test.1814.love` 真实鉴权实测(2026-09-24 09:28–09:58);工单 #8269 已验收关单。
| # | 场景 | 结果 |
|---|---|---|
| 1 | 招募 / 配置阶段 staff 保存、物资增改删 | 均 200 |
| 2 | 确认后 staff 修改 / 清空、物资增改删 | 589598「团期已确认,配置不可修改」,数据回读不变;待出发抽查同样拒绝 |
| 3 | 确认后车务受控重开 / 改正式用车需求 / 免车 | 809111 / 589501 / 589501,需求读回不变 |
| 4 | 订房计划:配置阶段增改删、整团确认 | 可用;确认后新增 / 修改 / 删除 / 按日确认 / 整团确认 / 微调均 808600;流团后 release-all 过阶段门 |
| 5 | 需求整体确认 / 批量打回 / 逐单打回 | 配置阶段可用;确认后均 589501 |
| 6 | 房务抢单池 `batchStatus` | `MATERIAL_PREPARING` → 400;`RESOURCE_PREPARING` → 200 |
| 7 | 确认后子订单取消、同班期新下子订单 | 均 200,团期状态不变 |
---
## 九、相关历史 PR
| PR | Issue | 说明 | 是否仍有效 |
|----|-------|------|------------|
| #8234 / #8237 | #8231 | 导游 / 摄影 / 物资放开到出行前四态 | ❌ 窗口被本单收回到招募 / 配置 |
| — | #7442 | 车务受控重开(物料准备中 / 待出发窗口) | ❌ 窗口被本单收回到配置 |
| — | #7210 | 需求整体确认与打回 | ⚠️ 阶段集合被本单收紧 |
| — | #7324 | 订房计划可写到核单中(返团后修正) | ❌ 本单收回 |
| **本 PR #8280** | **#8269** | 确认后锁定配置 | ✅ 最新 |
---
## 十、相关文档
- 关联 Issue: [wx/HL#8269](https://git.1814.love/wx/HL/issues/8269)
- 关联 PR: [wx/HL#8280](https://git.1814.love/wx/HL/pulls/8280)
- 被本条取代的窗口描述:`changelogs-v2/2026-09/23_8231_配导游配摄影物资放开到出行前四态-修改接口-管理后台.md`
- 同批六节点条目:团期人工确认(#8268)、六节点展示与看板七桶(#8271)
## 关联 / 联系人
### 链接
- **Issue**: [#8269](https://git.1814.love/wx/HL/issues/8269)
- **PR**: [#8280](https://git.1814.love/wx/HL/pulls/8280)
- **Merge commit**: [7111a8cae](https://git.1814.love/wx/HL/commit/7111a8caef4aedda7ec73d4bb94972ae31dbc4b9)
### 联系人
- **后端负责人**: @jw