@@ -58,9 +58,9 @@
| `GET /api/reservation/order-tasks` | 查询 V4 业务订单任务列表 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ;只返回 V4 业务订单任务,不包含 S10/S99 来源通知;支持 `hotel_id` 、`order_id` 、`order_task_status` 、`card_status` 、`keyword` 、`page_num` 、`page_size` ; `order_task_status` 非 `OPEN` / `COMPLETED` 返回 400, `card_status` 非 V4 卡状态返回 400; `card_status` 只筛业务 / 可处理卡,固定来源邮件展示卡不参与筛选。 |
| `GET /api/reservation/order-tasks/{orderTaskId}` | 查询 V4 订单任务详情 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,后端按订单任务实际酒店校验访问权;返回 `order_task` 、`source_message_summary` 、`source_message_card` 、`basic_information_card` 、`business_cards[]` 、`card_counts` 、`adapter_contract_errors[]` 和 `availability` ;来源摘要按酒店过滤,邮件正文和附件仍走 SourceMessage 会话接口。CP8 起每张 V4 任务卡返回 `fields[]` ,前端应以该字段白名单渲染可编辑控件。 |
| `GET /api/reservation/source-notifications/{notificationId}` | 查询 V4 S10/S99 来源通知详情 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,后端按来源通知实际酒店校验访问权;只返回通知摘要、来源邮件通知卡、会话摘要和 `availability` ;不返回订单任务、业务卡、邮件正文、附件 URL 或原始 AI payload。 |
| `GET /api/reservation/lookups/accounts` | 查询 V4 Account 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;返回统一 wrapper: `hotel_id` 、`catalog_type=ACCOUNT` 、`catalog_source` 、`catalog_version` 、`stale` 、`items[]` 、`page` 、`warnings[]` 。前端在 `options_source=reservation_v4_account_catalog` 时调用,只提交 `items[].code` , Market / Source 以后端确认派生结果为准。 |
| `GET /api/reservation/lookups/room-types` | 查询 V4 Room Type 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;第一版只返回当前酒店 `ACTIVE` 房型目录,不接日期过滤,不代表 PMS 全量房型。前端在 `options_source=reservation_v4_room_type_catalog` 时调用。 |
| `GET /api/reservation/lookups/rate-codes` | 查询 V4 Rate Code 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;第一版只返回当前酒店 `ACTIVE` Rate Code, `pricing_available=false` 表示后端未接真实价格,不要据此展示价格。前端在 `options_source=reservation_v4_rate_code_catalog` 时调用。 |
| `GET /api/reservation/lookups/accounts` | 查询 V4 Account 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;返回统一 wrapper: `hotel_id` 、`catalog_type=ACCOUNT` 、`catalog_source` 、`catalog_version` 、`stale` 、`items[]` 、`page` 、`warnings[]` 。`keyword` 无匹配时 `items=[]` / `page.total=0` ,但只要酒店未过滤目录存在,`catalog_source/catalog_version` 仍保持真实目录元数据,不代表目录未初始化。 前端在 `options_source=reservation_v4_account_catalog` 时调用,只提交 `items[].code` , Market / Source 以后端确认派生结果为准。 |
| `GET /api/reservation/lookups/room-types` | 查询 V4 Room Type 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;第一版只返回当前酒店 `ACTIVE` 房型目录,不接日期过滤,不代表 PMS 全量房型。`keyword` 无匹配时按空选项处理,不要当作目录不可用。 前端在 `options_source=reservation_v4_room_type_catalog` 时调用。 |
| `GET /api/reservation/lookups/rate-codes` | 查询 V4 Rate Code 目录 | 必须带 Bearer token, 需要 `RESERVATION_TASK_READ` ,支持 `hotel_id` 、`keyword` 、`page_num` 、`page_size` ;第一版只返回当前酒店 `ACTIVE` Rate Code, `pricing_available=false` 表示后端未接真实价格,不要据此展示价格。`keyword` 无匹配时按空选项处理,不要当作目录不可用。 前端在 `options_source=reservation_v4_rate_code_catalog` 时调用。 |
| `POST /api/reservation/order-tasks/{orderTaskId}/cards/{cardId}/confirm` | 确认 V4 订单任务卡 | 必须带 Bearer token, 需要 `RESERVATION_TASK_CONFIRM` ,请求 JSON 带 `version` ,可选 `confirmed_payload` ; Basic Information 必须先确认,业务卡第一版不强制逐张顺序确认;前端只提交当前卡 `fields[]` 中可编辑字段,后端以展示快照为基准合并,未开放字段会被忽略;确认前会按当前酒店数据库目录校验 Account / Room Type / Rate Code, 嵌套字段错误会返回如 `business_fields.after.room_items.0.room_type_code` 的路径,失败返回 `V4_FIELD_VALIDATION_FAILED` ;确认后卡片 `CONFIRMED` 、写 `confirmed_payload_json/confirmed_at/confirmed_by` 并锁定,重复确认返回错误;成功返回刷新后的订单任务详情。 |
| `POST /api/reservation/order-tasks/{orderTaskId}/cards/{cardId}/review-resolution` | V4 复核解阻并确认卡片 | 必须带 Bearer token, 需要 `RESERVATION_MANUAL_REVIEW_RESOLVE` ,仅用于 `card_status=REVIEW_REQUIRED` ;请求 JSON 带 `version` ,可选 `field_overrides[]` 和 `reason` ;订单任务归属未解决时 `confirmed_order_id` 必填,且必须是当前酒店下真实可见订单;目录错误字段可按 `validation_errors_json` / `fields[].validation_errors` 指向的 pointer 修正;成功后卡片 `CONFIRMED` 、`review_status=RESOLVED` ,写 `review_resolution_json/confirmed_payload_json/confirmed_at/confirmed_by` 并返回刷新后的订单任务详情。 |
| `POST /api/reservation/source-notifications/{notificationId}/ack` | 确认 V4 S10/S99 来源通知已读 / 已处理 | 必须带 Bearer token, 需要 `RESERVATION_TASK_CONFIRM` ,请求 JSON 带 `version` ;仅允许 `route_code=S10/S99` ;确认后 `notification_status=ACKED` ,写 `ack_by/ack_at` ,成功返回刷新后的来源通知详情;重复 ack 返回当前已确认状态且不新增审计;该动作不创建订单、不参与订单阻塞。 |
@@ -508,7 +508,7 @@ RESERVATION_ROOMING_LIST_GENERATE
- 业务卡目录校验会递归检查 `business_fields` 下的嵌套结构。例如 `UPDATE_BOOKING` 的房型可能位于 `/business_fields/after/room_items/0/room_type_code` ,错误详情会使用 `business_fields.after.room_items.0.room_type_code` ;前端展示错误时优先用 `fields[].validation_errors` ,接口 400 时可直接展示 `details[]` 。
- `review-resolution` 请求示例:`{"version":0,"reason":"确认房型映射","confirmed_order_id":"123456","field_overrides":[{"field_pointer":"/business_fields/room_items/0/pms_room_type_code","value":"RM2"}]}` 。`confirmed_order_id` 在订单任务归属未解决时必填;如果订单任务已经绑定订单且 `target_resolution_status=RESOLVED` ,只能不传或传当前同一个订单 ID, 不能借该接口切换到其它订单。`field_pointer` 必须来自当前卡允许编辑的 `basic_information.*` 或 `business_fields.*` 叶子字段;展示 payload 有 `missing_fields[]` 时只提交清单里的 pointer, 没有显式清单时只提交当前值为 `null` / 空字符串的未解决叶子字段;如果是目录校验错误,也可以提交后端 `fields[].validation_errors` 对应的字段 pointer。前端不要提交来源邮件、路由、`target_order` 、`order_ref` 、缺失字段清单、`manual_review` 、raw evidence、校验诊断字段, 也不能替换整个对象 / 数组。
- V4 `fields[]` 第一版字段说明: Basic Information 固定返回 `/basic_information/account_code` 、`/basic_information/market_code` 、`/basic_information/source_code` ;其中 Account `control_type=select` 、`options_source=reservation_v4_account_catalog` , Market / Source 为只读派生字段。业务卡会按展示 payload 里的业务叶子字段返回字段白名单,例如 `/room_items/0/room_type_code` 或 `/business_fields/room_items/0/pms_room_type_code` ;前端不要自行补未返回字段。
- V4 CP11 已开放独立目录 lookup API。前端应使用 `GET /api/reservation/lookups/accounts` 、`GET /api/reservation/lookups/room-types` 、`GET /api/reservation/lookups/rate-codes` 渲染 Account / Room Type / Rate Code 选项;用户提交确认或复核时只提交稳定 `code` ,不要提交显示名、派生 Market / Source 或目录完整对象;后端确认前仍会重新校验目录。
- V4 CP11 已开放独立目录 lookup API。前端应使用 `GET /api/reservation/lookups/accounts` 、`GET /api/reservation/lookups/room-types` 、`GET /api/reservation/lookups/rate-codes` 渲染 Account / Room Type / Rate Code 选项;用户提交确认或复核时只提交稳定 `code` ,不要提交显示名、派生 Market / Source 或目录完整对象;后端确认前仍会重新校验目录。`keyword` 查不到只表示当前筛选无结果,不能仅凭 `items=[]` 判断目录未初始化,应结合 `catalog_source` 、`catalog_version` 和 `warnings[]` 。
- V4 新模型确认口径是不保存后端草稿、卡片最终确认后锁定、技术异常不进入用户可处理卡、当前不生成 OPERA 模拟操作。Basic Information 必须先确认;其它业务卡第一版不强制逐张顺序确认。现有 V3 `draft` 、`confirm` 、`manual-review-resolutions` 和 OPERA 模拟接口仍只代表旧链路能力,不能直接等同 V4 多卡最终接口。
- V4 S10/S99 已采用来源通知模型入库:新 V4 `route_code=S10/S99` 不再挂隐藏技术订单,也不再创建旧 `SOURCE_MESSAGE_ONLY` 任务;对应工作台 / 来源通知详情查询接口和 ack 写接口已开放。旧 `SOURCE_MESSAGE_ONLY` 只读任务仅代表 V3 S10/S99 和旧 S000/S999 兼容数据。
- M002 V3 的结构化 `S10/S99` 入站、40 条 P0.1 路由枚举 / 稳定配置、`UNHANDLED_CURRENT_INTENT` 、`adapter_contract_error` transition 最小落库、任务列表 / 订单时间线 / 任务详情 V3 路由字段和只读诊断块透出、type-known manual review 同卡解阻第一版、typed infrastructure error、P0 fixtures 回归基线和 Parent Group / Cancel Allotment 路由修订均已完成。