--- 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: "pending" frontend_owner: "" frontend_ref: "" target_release: "" 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 中「出行前四态可配」的窗口描述。前端需:确认后隐藏或置灰上述写操作入口、按新文案提示、抢单池筛选下拉只保留资源准备中。" 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` #### 使用场景 团期人员名单里标主报账人 / 协助报账人,与保存口同窗口。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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` #### 使用场景 「物资」页签手工录入一行备品。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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` #### 使用场景 「物资」页签行内改数量。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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`(无请求体) #### 使用场景 「物资」页签删除一行备品。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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 ``` #### 响应示例 ```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` #### 使用场景 房务在团期订房页按日录入订房行(追加式)。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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<String> | 不变 | #### 请求示例 ```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<String> | 不变 | #### 请求示例 ```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<Long> | 不变 | | skippedPlanIds | List<Long> | 不变 | | 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 ``` #### 响应示例 ```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<String> | 不变 | | skippedDates | List<String> | 不变 | | 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 ``` #### 响应示例 ```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 ``` 无请求体。 #### 响应示例 ```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<Long> | 否 | ≤ 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 ``` 无请求体。 #### 响应示例 ```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<Long> | 不变 | | groupVehicleRequirementStatus | String | 不变 | #### 请求示例 ```http POST /v3/admin/order/group-batch/2097250563497385985/requirement/confirm HTTP/1.1 Host: api.test.1814.love:9443 Authorization: Bearer ``` #### 响应示例 ```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<Long> | ✅ | 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` #### 使用场景 逐户需求详情里单独打回住宿需求。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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` #### 使用场景 逐户需求详情里单独打回行程用车或接送机需求。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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<String> | ✅ | 1~20 个 | 不变 | | scopeDates | Body | List<LocalDate> | ✅ | 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` #### 使用场景 房务端整团抢单池(一团一条)。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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 ``` 无请求体。 #### 响应示例 ```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`(无请求体) #### 使用场景 房务在抢单池点「认领」整团。 #### 入参 | 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | |------|------|------|------|------|------| | 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 ``` #### 响应示例 ```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<String> | 不变 | #### 请求示例 ```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