Files
th-hotel-simple/docs/project/requirements/M002-ai-query-minimal-fields.md
2026-07-10 23:49:49 +08:00

485 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# M002 SuperAgent 查询上下文接口最小字段定义
> 文档状态:阶段记录。本文记录 SuperAgent 查询上下文接口 1、2 的最小字段落地过程。
> 当前对外接口总契约以 `../integrations/superagent-api-contract.md` 为准;
> 如字段、错误码、鉴权或请求范围出现重复描述,以总契约和当前代码实现为准。
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.3 |
| 日期 | 2026-07-08 |
| 状态 | 第一版后端实现依据与落地记录 |
| 适用范围 | SuperAgent / Main Agent 调用本系统查询订单和任务上下文 |
| 主要读者 | 后端、SuperAgent 对接方、测试、后续协作 agent |
## 1. 文档定位
本文用于把导入文档中的查询接口契约,收敛为本项目当前可开发的第一版最小字段范围,并记录当前后端已落地的接口 1、接口 2 范围。
导入契约中定义了四个只读查询接口:
| 逻辑接口 | 原始定位 | 本项目第一版处理 |
| --- | --- | --- |
| `query_case_context` | 根据业务 key 查询订单、任务和终止上下文 | 已实现 |
| `query_object_detail` | 根据对象 ID 查询更完整对象快照 | 已实现最小可用版 |
| `query_file_parse_context` | 查询附件、OCR、Excel、voucher、rooming list 解析结果 | 当前系统没有附件解析能力,暂不实现 |
| `query_parent_task_context` | 查询 linked task 的父任务上下文 | 后续改为“订单及其下面任务查询”后再定义 |
本文只定义接口 1、接口 2 的最小请求字段、最小响应字段、字段用途和当前系统数据来源。
## 2. 总原则
- 两个接口都是只读接口,不创建任务、不写 OPERA、不修改订单、不确认字段。
- 查询结果只作为 `routing_context` 或对象事实传给 Skill不等同于最终业务结论。
- `body_current` 才能触发业务动作;`body_thread` 只能作为目标绑定证据。
- 如果查询 key 来自历史线程,调用方必须传 `target_key_source=body_thread_evidence``body_thread_used_only_as_evidence=true`
- 第一版不伪造 OPERA 字段。当前系统没有可靠来源的字段返回 `null`,并在 `warnings``hard_validation_warnings` 中说明。
- SuperAgent 允许作为全局上下文查询方按任意业务 key 查询;`source_message_id``source_event_index` 在查询阶段对本系统没有业务作用,第一版接收但忽略,不做格式校验,也不作为查询边界。
- 导入契约没有显式要求 `hotel_id`,本系统订单、任务和 AI 过渡表仍按 `hotel_id` 隔离。M005 后 SuperAgent 默认不传 `hotel_id`,后端按平台酒店表唯一 `ACTIVE` 酒店解析;兼容旧调用传入时必须与系统酒店一致。
## 3. Skill 对接口 1、2 的实际需要
| Skill | 接口 1case-context 最小需要 | 接口 2object-detail 最小需要 |
| --- | --- | --- |
| S01 New Booking | 判断同 key 是否已有 ACTIVE 订单、pending/open task、终止记录判断是否允许继续生成 New Booking | 通常不需要。若同 key 已有对象,需要展示冲突对象摘要时可查 |
| S02 Update Booking | 根据 `group_code` / `confirmation_number` 绑定既有对象;判断是否有前置未完成任务、终止记录或冲突对象 | 需要既有对象快照,支撑 before/after、状态是否可更新、日期/房型/房量/价格等事实 |
| S03 Cancel Booking | 根据 key 定位待取消对象;判断对象是否存在、是否已终止、是否有前置未完成任务 | 需要对象状态、取消状态、是否可取消,以及对象展示摘要 |
| S04 Voucher Received | 校验凭证能否绑定有效订单;如果无有效订单,是否存在可承接的待完善 New Booking 任务 | 可选,用于目标展示和硬校验,不负责解析凭证文件 |
| S05 Rooming List | 校验名单目标 key 是否能绑定有效订单或待完善 New Booking 任务 | 可选,用于目标展示和硬校验;文件读取和名单解析不在接口 2 内 |
| S06 Amend Group Code | 用旧 `group_code` 定位既有对象;判断改团号任务是否有明显阻断 | 可选,用于展示旧对象状态;新旧 group code 关系主要来自 Skill 输出 |
| S07 Trace / Reservation Notes | 绑定目标对象;如果目标 key 只来自 history需要保留 key 来源;如果是 linked task父任务关系后续由接口 4 新定义 | extra bed 场景需要 `rate_code_price` 事实;当前拿不到时返回 `null` 和 warning |
| S08 TA Recorder | 绑定 S05 已确认的目标 `group_code`;父任务关系后续由接口 4 新定义 | 可选,用于目标展示和附件绑定后的硬校验 |
结论:
- 接口 1 是 S01-S08 都可能使用的路由级上下文接口。
- 接口 2 不是所有 Skill 都必须调用,主要服务 S02、S03、S07S04/S05/S08 只在目标展示或硬校验时需要。
- 接口 3 的文件解析能力当前不具备,不应为了满足导入契约而返回假解析结果。
- 接口 4 的原始 parent task 语义和本系统后续需要不完全一致,先不实现,后续改成订单及任务查询。
## 4. 通用请求与响应
### 4.1 通用请求头
查询接口 1、2 已复用 SuperAgent 任务结果接收接口的 HMAC-SHA256 鉴权规则。签名规则、secret、timestamp 窗口、nonce 防重放和请求体大小配置与任务结果接收接口保持一致。
| Header | 是否必填 | 中文说明 |
| --- | --- | --- |
| `Content-Type` | 是 | 固定 `application/json` |
| `X-TH-Hotel-SuperAgent-Client-Id` | 是 | SuperAgent 调用方客户端 ID |
| `X-TH-Hotel-SuperAgent-Timestamp` | 是 | UTC ISO-8601 时间 |
| `X-TH-Hotel-SuperAgent-Nonce` | 是 | 每次请求唯一随机值,用于防重放 |
| `X-TH-Hotel-SuperAgent-Signature` | 是 | HMAC 签名,格式 `sha256=<lowercase-hex>` |
| `X-TH-Hotel-Request-Id` | 否 | 调用方生成的请求 ID用于日志串联 |
| `X-TH-Hotel-AI-Trace-Id` | 否 | AI 运行链路 ID |
时间约定:
- 请求 Header `X-TH-Hotel-SuperAgent-Timestamp` 必须是带时区的 UTC ISO-8601 时间,例如 `2026-07-08T03:00:00Z`
- 响应中的 `created_at``last_updated_at``occurred_at` 等时间点统一返回带 `Z` 的 ISO-8601 UTC 时间。
- `source_message_id``source_event_index` 第一版仅兼容接收,不参与查询范围过滤;时间统一不依赖这两个字段是否已在本系统落库。
规范签名串:
```text
POST
<request_path>
<X-TH-Hotel-SuperAgent-Timestamp>
<X-TH-Hotel-SuperAgent-Nonce>
<X-TH-Hotel-SuperAgent-Client-Id>
<lowercase-hex-sha256-of-raw-body>
```
### 4.2 通用响应包
成功响应:
```json
{
"success": true,
"request_id": "req-001",
"trace_id": "trace-001",
"data": {},
"warnings": [],
"error": null
}
```
失败响应:
```json
{
"success": false,
"request_id": "req-001",
"trace_id": "trace-001",
"data": null,
"warnings": [],
"error": {
"code": "BAD_REQUEST",
"message": "请求参数不合法",
"details": {}
}
}
```
### 4.3 ID 序列化口径
本系统数据库主键是 `BIGINT`。查询接口面向 SuperAgent / Main Agent 等外部运行环境,第一版建议对外 JSON 中的内部长整型 ID 使用字符串返回,避免 JavaScript 或其他运行时出现整数精度问题。
适用字段包括:
- `source_message_id`,响应中的内部 SourceMessage Inbox ID查询请求中若出现同名字段则视为 SuperAgent 透传字段,后端忽略
- `order_id`
- `task_id`
- `record_id`
- `created_from_task_id`
如果后端实现决定沿用 Spring 默认数字序列化,接口 1、接口 2 必须保持一致,并在实现前更新本文档示例。
## 5. 接口 1query_case_context
### 5.1 路径
```text
POST /api/ai-query/v1/case-context
```
### 5.2 请求字段
| 字段 | 是否必填 | 中文说明 | 当前系统来源或用途 |
| --- | --- | --- | --- |
| `hotel_id` | 否 | 酒店或业务上下文 ID | SuperAgent 默认不传;后端解析系统酒店后用于隔离 `workflow_reservation_*` 表 |
| `source_message_id` | 否 | SuperAgent 透传的外部来源消息 ID | 全局上下文查询可不传;传入时后端接收但忽略,不做格式校验 |
| `source_event_index` | 否 | SuperAgent 透传的 current 事件序号 | 全局上下文查询可不传;传入时后端接收但忽略,不做正整数校验 |
| `group_code` | 条件必填 | Group / Allotment 优先业务 key | 查询 `GROUP_CODE` 类型订单和 AI 过渡记录 |
| `confirmation_number` | 条件必填 | FIT 优先业务 key | 查询 `CONFIRMATION_NUMBER` 类型订单和 AI 过渡记录 |
| `reservation_no` | 否 | OPERA reservation no | 当前无可靠表源,第一版不作为主查询条件 |
| `object_type_hint` | 否 | 调用方推测的对象类型 | 只作为查询提示,不作为事实 |
| `target_key_source` | 否 | key 来源:`body_current``body_thread_evidence``upstream_task_context``system_context` | 用于记录 current/history 边界 |
| `body_thread_used_only_as_evidence` | 否 | key 是否只来自历史线程证据 | 为 true 时,后端仍只返回事实,不触发任何业务动作 |
`group_code``confirmation_number``reservation_no` 至少应有一个非空。第一版实际可查询能力优先支持 `group_code``confirmation_number`
如果第一版请求只提供 `reservation_no`,后端不会把“查不到”解释为“可以创建新任务”,而是返回空事实列表,并在 `target_object_validation.needs_manual_review_reason` 中返回 `UNSUPPORTED_RESERVATION_NO_QUERY`,提示调用方转人工或等待后续 OPERA 投影表接入。
### 5.3 响应字段
#### `matched_order_records[]`
返回当前系统中能通过 key 匹配到的订单摘要。
| 字段 | 是否必返 | 中文说明 | 当前系统来源 |
| --- | --- | --- | --- |
| `object_id` | 是 | 查询对象 ID第一版建议格式 `ORDER:{order_id}` | `workflow_reservation_order.id` |
| `object_type` | 是 | 对象类型,第一版按 key 粗略映射 | `GROUP_CODE` 暂映射 `group_block``CONFIRMATION_NUMBER` 映射 `fit_reservation``TEMPORARY` 映射 `temporary_order` |
| `order_id` | 是 | 本系统订单 ID | `workflow_reservation_order.id` |
| `order_key_type` | 是 | 业务号类型 | `workflow_reservation_order.order_key_type` |
| `group_code` | 否 | Group Code | 当 `order_key_type=GROUP_CODE` 时来自 `active_business_key``order_business_key` |
| `confirmation_number` | 否 | Confirmation Number | 当 `order_key_type=CONFIRMATION_NUMBER` 时来自 `active_business_key``order_business_key` |
| `temporary_order_code` | 是 | 临时订单编号 | `workflow_reservation_order.temporary_order_code` |
| `display_name` | 是 | 用户可读展示名 | `workflow_reservation_order.display_name` |
| `status` | 是 | 订单状态 | `workflow_reservation_order.order_status` |
| `business_key_source` | 否 | 业务号来源 | `workflow_reservation_order.business_key_source` |
| `source_table` | 是 | 来源表名 | 固定 `workflow_reservation_order` |
| `last_updated_at` | 是 | 最近更新时间 | `workflow_reservation_order.updated_at` |
第一版不在 `matched_order_records[]` 中强行返回 `block_id``reservation_no``room_items``rate_code_price`。这些字段如果后续有 OPERA 同步表或订单投影表,再进入接口 2。
#### `pending_or_open_tasks[]`
返回同 key 或同订单下尚未完成、需要 Skill 识别阻断关系的任务摘要。
| 字段 | 是否必返 | 中文说明 | 当前系统来源 |
| --- | --- | --- | --- |
| `task_id` | 是 | 本系统任务 ID | `workflow_reservation_task.id` |
| `order_id` | 是 | 任务当前挂靠订单 | `workflow_reservation_task.order_id` |
| `source_message_id` | 是 | 任务来源内部 SourceMessage Inbox ID | `workflow_reservation_task.source_message_id` |
| `source_event_index` | 是 | AI current 事件序号 | `workflow_reservation_ai_transition.source_event_index` |
| `catalog_code` | 否 | Skill 目录代码 | `workflow_reservation_ai_transition.catalog_code` |
| `skill_id` | 否 | Skill 标识 | `workflow_reservation_ai_transition.skill_id` |
| `result_type` | 是 | AI 结果类型 | `workflow_reservation_task.result_type` |
| `task_type` | 是 | AI 原始任务类型 | `workflow_reservation_task.ai_task_type` |
| `system_task_type` | 是 | 系统主任务类型 | `workflow_reservation_task.system_task_type` |
| `task_card_type` | 是 | 任务卡类型 | `workflow_reservation_task.task_card_type` |
| `task_subtype` | 否 | 业务动作 subtype | `workflow_reservation_task.task_subtype` |
| `task_status` | 是 | 任务状态 | `workflow_reservation_task.task_status` |
| `queue_participation` | 是 | 是否参与订单执行队列 | `workflow_reservation_task.queue_participation` |
| `execution_order` | 是 | 同订单执行顺序 | `workflow_reservation_task.execution_order` |
| `parent_task_id` | 否 | 父任务 ID | `workflow_reservation_task.parent_task_id` |
| `parent_source_event_index` | 否 | 父事件序号 | `workflow_reservation_task.parent_source_event_index` |
| `linked_task_group_id` | 否 | 联动任务组 ID | `workflow_reservation_task.linked_task_group_id` |
| `blocked_until_parent_completed` | 是 | 是否等待父任务完成 | `workflow_reservation_task.blocked_until_parent_completed` |
| `last_updated_at` | 是 | 最近更新时间 | `workflow_reservation_task.updated_at` |
说明:响应字段中的 `source_message_id` 来自 `workflow_reservation_task.source_message_id`,表示本系统内部 SourceMessage Inbox ID它不同于查询请求和任务结果通知请求中 SuperAgent 透传的外部来源消息 ID。
第一版 `pending_or_open_tasks[]` 至少包含状态为 `PENDING_CONFIRM``READY``EXECUTING` 的任务。`FAILED` 在本系统第一版视为结束状态,不阻塞后续任务。
#### `active_workflows[]`
导入契约要求路由上下文覆盖 active workflow。当前本系统没有独立 workflow 表,订单任务流转事实保存在订单、任务和 OPERA 模拟操作表中。
第一版接口保留该字段,但默认返回空数组;如果实现方希望表达“正在处理的工作流”,应优先通过 `pending_or_open_tasks[]` 返回,不额外编造 workflow 记录。
| 字段 | 是否必返 | 中文说明 | 当前系统来源 |
| --- | --- | --- | --- |
| `active_workflows[]` | 是 | 活跃工作流摘要 | 第一版固定空数组 |
#### `terminated_records[]`
返回能影响 Skill 判断的终止记录摘要。
| 字段 | 是否必返 | 中文说明 | 当前系统来源 |
| --- | --- | --- | --- |
| `record_type` | 是 | `order``task` | 系统派生 |
| `record_id` | 是 | 订单 ID 或任务 ID | 对应表主键 |
| `status` | 是 | 终止状态 | 订单 `ENDED` / `LOGIC_DELETED`,任务 `FAILED` / `COMPLETED` |
| `reason` | 否 | 终止原因 | 订单 `logic_deleted_reason` 或任务 `last_failure_reason` |
| `occurred_at` | 否 | 终止时间 | 订单 `ended_at` / `logic_deleted_at`,任务 `completed_at` |
| `last_updated_at` | 是 | 最近更新时间 | 对应表 `updated_at` |
#### `target_object_validation`
返回后端可基于事实给出的目标对象校验摘要,但不返回“应该创建哪个任务”的最终结论。
| 字段 | 是否必返 | 中文说明 |
| --- | --- | --- |
| `status` | 是 | `none``single``multiple``conflict` |
| `matched_object_id` | 否 | 唯一匹配对象 ID |
| `matched_object_type` | 否 | 唯一匹配对象类型 |
| `can_create_new_booking_task` | 是 | 是否未发现明显阻断 New Booking 的对象或任务 |
| `can_create_update_task` | 是 | 是否存在可更新目标且无明显阻断 |
| `can_create_cancel_task` | 是 | 是否存在可取消目标且无明显阻断 |
| `can_attach_voucher` | 是 | 是否存在有效目标或可承接的待完善 New Booking 任务 |
| `can_attach_rooming_list` | 是 | 是否存在有效目标或可承接的待完善 New Booking 任务 |
| `needs_manual_review_reason` | 否 | 后端发现多对象、冲突、终止等事实时的原因码 |
#### `key_relationships`
| 字段 | 是否必返 | 中文说明 |
| --- | --- | --- |
| `group_code_and_confirmation_same_object` | 否 | 同时传入两个 key 时,是否能证明属于同一对象 |
| `relationship_evidence` | 否 | 证明关系的简短说明 |
当前系统没有 Group Code 与 Confirmation Number 的关系表,大多数情况下该字段返回 `null`
### 5.4 最小响应示例
```json
{
"success": true,
"request_id": "req-001",
"trace_id": "trace-001",
"data": {
"matched_order_records": [
{
"object_id": "ORDER:1900000000000000100",
"object_type": "group_block",
"order_id": "1900000000000000100",
"order_key_type": "GROUP_CODE",
"group_code": "LT260417VIPA",
"confirmation_number": null,
"temporary_order_code": "TMP-20260707-0001",
"display_name": "LT260417VIPA",
"status": "ACTIVE",
"business_key_source": "AI_CANDIDATE",
"source_table": "workflow_reservation_order",
"last_updated_at": "2026-07-07T08:30:00Z"
}
],
"pending_or_open_tasks": [],
"active_workflows": [],
"terminated_records": [],
"target_object_validation": {
"status": "single",
"matched_object_id": "ORDER:1900000000000000100",
"matched_object_type": "group_block",
"can_create_new_booking_task": false,
"can_create_update_task": true,
"can_create_cancel_task": true,
"can_attach_voucher": true,
"can_attach_rooming_list": true,
"needs_manual_review_reason": null
},
"key_relationships": {
"group_code_and_confirmation_same_object": null,
"relationship_evidence": ""
}
},
"warnings": [],
"error": null
}
```
## 6. 接口 2query_object_detail
### 6.1 路径
```text
POST /api/ai-query/v1/object-detail
```
### 6.2 请求字段
| 字段 | 是否必填 | 中文说明 | 当前系统来源或用途 |
| --- | --- | --- | --- |
| `hotel_id` | 否 | 酒店或业务上下文 ID | SuperAgent 默认不传;后端解析系统酒店后用于隔离订单和任务 |
| `object_id` | 是 | 接口 1 返回的对象 ID | 第一版支持 `ORDER:{order_id}` |
| `object_type` | 否 | 对象类型提示 | 用于校验调用方预期和实际对象类型 |
### 6.3 响应字段
接口 2 返回的是对象详情快照。第一版先以本系统订单表为主OPERA 同步类字段先作为 nullable 业务快照字段。
#### 基础对象字段
| 字段 | 是否必返 | 中文说明 | 当前系统来源 |
| --- | --- | --- | --- |
| `object_id` | 是 | 查询对象 ID | `ORDER:{workflow_reservation_order.id}` |
| `object_type` | 是 | 对象类型 | 根据 `order_key_type` 派生 |
| `order_id` | 是 | 本系统订单 ID | `workflow_reservation_order.id` |
| `order_key_type` | 是 | 业务号类型 | `workflow_reservation_order.order_key_type` |
| `group_code` | 否 | Group Code | `GROUP_CODE` 订单的 `active_business_key``order_business_key` |
| `confirmation_number` | 否 | Confirmation Number | `CONFIRMATION_NUMBER` 订单的 `active_business_key``order_business_key` |
| `reservation_no` | 否 | OPERA reservation no | 当前无可靠表源,返回 `null` |
| `block_id` | 否 | OPERA block ID | 当前无可靠表源,返回 `null` |
| `temporary_order_code` | 是 | 临时订单编号 | `workflow_reservation_order.temporary_order_code` |
| `display_name` | 是 | 用户可读展示名 | `workflow_reservation_order.display_name` |
| `status` | 是 | 订单状态 | `workflow_reservation_order.order_status` |
| `source_message_id` | 是 | 首次创建订单的内部 SourceMessage Inbox ID | `workflow_reservation_order.source_message_id` |
| `created_from_task_id` | 否 | 首次创建订单的任务 ID | `workflow_reservation_order.created_from_task_id` |
| `created_at` | 是 | 创建时间 | `workflow_reservation_order.created_at` |
| `last_updated_at` | 是 | 最近更新时间 | `workflow_reservation_order.updated_at` |
#### 业务快照字段
这些字段是 S02、S03、S07 后续会用到的最小业务事实,但当前系统没有完整 OPERA 投影表。第一版可以返回字段名和 `null` 值,同时在 `hard_validation_warnings[]` 中说明缺失原因。
| 字段 | 是否必返 | Skill 用途 | 当前第一版 |
| --- | --- | --- | --- |
| `arrival_date` | 否 | S02 before/after、S04/S05 目标展示 | 当前无结构化订单投影,返回 `null` |
| `departure_date` | 否 | S02 before/after、S04/S05 目标展示 | 当前无结构化订单投影,返回 `null` |
| `nights` | 否 | S02 晚数修改判断 | 当前无结构化订单投影,返回 `null` |
| `guest_count` | 否 | S02 人数修改判断 | 当前无结构化订单投影,返回 `null` |
| `room_items[]` | 是 | S02 房型/房量 before/after展示目标房型摘要 | 当前返回空数组 |
| `room_items[].room_type` | 否 | 原始房型或系统房型 | 当前无可靠表源 |
| `room_items[].pms_room_type_code` | 否 | PMS 房型代码 | 当前无可靠表源 |
| `room_items[].room_quantity` | 否 | 房量 | 当前无可靠表源 |
| `room_items[].rate_code` | 否 | Rate Code | 当前无可靠表源 |
| `room_items[].rate_code_price` | 否 | S07 extra bed 改价事实来源 | 当前无可靠表源 |
| `rate_code` | 否 | 对象级 Rate Code 摘要 | 当前无可靠表源 |
| `rate_code_price` | 否 | S07 extra bed 使用Skill 不自行猜 | 当前无可靠表源,返回 `null` |
| `reservation_type` | 否 | S04 voucher 后续动作、S08 TA Recorder 展示 | 当前无可靠表源 |
| `cancel_status` | 否 | S03 判断是否已取消 | 当前可根据订单状态粗略派生,真实 OPERA 取消状态后续补充 |
| `can_update` | 是 | S02 是否存在明显更新阻断 | 根据订单状态和队列阻断粗略派生 |
| `can_cancel` | 是 | S03 是否存在明显取消阻断 | 根据订单状态和队列阻断粗略派生 |
| `hard_validation_warnings[]` | 是 | 告知 Skill 哪些事实当前无法确认 | 系统派生 |
### 6.4 最小响应示例
```json
{
"success": true,
"request_id": "req-002",
"trace_id": "trace-001",
"data": {
"object_id": "ORDER:1900000000000000100",
"object_type": "group_block",
"order_id": "1900000000000000100",
"order_key_type": "GROUP_CODE",
"group_code": "LT260417VIPA",
"confirmation_number": null,
"reservation_no": null,
"block_id": null,
"temporary_order_code": "TMP-20260707-0001",
"display_name": "LT260417VIPA",
"status": "ACTIVE",
"source_message_id": "1900000000000000001",
"created_from_task_id": null,
"created_at": "2026-07-07T08:00:00Z",
"last_updated_at": "2026-07-07T08:30:00Z",
"arrival_date": null,
"departure_date": null,
"nights": null,
"guest_count": null,
"room_items": [],
"rate_code": null,
"rate_code_price": null,
"reservation_type": null,
"cancel_status": "not_cancelled",
"can_update": true,
"can_cancel": true,
"hard_validation_warnings": [
{
"code": "OPERA_PROJECTION_UNAVAILABLE",
"message": "当前系统尚未接入 OPERA 对象投影,日期、房型、房价等字段无法确认。"
}
]
},
"warnings": [],
"error": null
}
```
## 7. 第一版字段来源与缺口
### 7.1 当前可稳定提供
| 能力 | 当前来源 |
| --- | --- |
| 按“后端解析出的酒店 ID + GROUP_CODE”查询 ACTIVE 订单 | `workflow_reservation_order.order_key_type``active_business_key` |
| 按“后端解析出的酒店 ID + CONFIRMATION_NUMBER”查询 ACTIVE 订单 | `workflow_reservation_order.order_key_type``active_business_key` |
| 查询临时订单、终止订单、逻辑删除订单 | `workflow_reservation_order.order_status` |
| 查询同订单任务队列 | `workflow_reservation_task.order_id``queue_participation``execution_order` |
| 查询 pending/open task | `workflow_reservation_task.task_status` |
| 查询 `source_event_index`、Skill、AI 原始任务类型 | `workflow_reservation_ai_transition` |
| 判断 Message Notification 是否不阻塞 | `queue_participation=false` |
### 7.2 当前不能稳定提供
| 字段或能力 | 原因 | 第一版处理 |
| --- | --- | --- |
| `reservation_no` | 未接入 OPERA reservation 投影 | 返回 `null` |
| `block_id` | 未接入 OPERA group block 投影 | 返回 `null` |
| `arrival_date` / `departure_date` / `nights` | 订单表未保存结构化入住信息 | 返回 `null` |
| `room_items[]` | 订单表未保存结构化房型/房量明细 | 返回空数组 |
| `rate_code` / `rate_code_price` | 未接入 OPERA 或价格投影 | 返回 `null` 并 warning |
| 凭证、OCR、Excel、rooming list 解析结果 | 当前无文件解析能力 | 接口 3 暂不实现 |
| linked task 的父任务专用查询 | 后续改成订单及任务查询 | 接口 4 暂不实现 |
## 8. 后续实现提醒
- 实现接口 1、2 前,应先复用当前后端分层规范:`control``service``service.impl``domain``mapper``repository``common.request``common.result``common.dto``common.enums`
- Controller、Service、ServiceImpl 方法必须有中文注释Entity 字段必须有中文注释。
- 不要新增 `api``application``persistence` 包。
- 不要为了导入契约中的 `block_id``reservation_no``rate_code_price` 等字段编造数据。
- SuperAgent 查询上下文接口是之前排期靠后的事项,现在已有导入契约,后续梳理未完成事项时需要持续提醒。
- 普通任务切换订单、用户身份/权限、前端页面、真实 OPERA/OHIP 仍不在本接口第一版范围内。
## 9. 当前后端落地状态
已落地接口:
- `POST /api/ai-query/v1/case-context`
- `POST /api/ai-query/v1/object-detail`
已落地能力:
- 接口 1 可按“后端解析出的酒店 ID + group_code”或“后端解析出的酒店 ID + confirmation_number”查询订单上下文允许不传 `source_message_id``source_event_index` 的全局上下文查询;即使传入这两个字段,后端也不把它们作为查询或校验条件。
- 接口 1 返回 `matched_order_records``pending_or_open_tasks``active_workflows``terminated_records``target_object_validation``key_relationships`
- `active_workflows` 当前无独立表源,固定返回空数组。
- 接口 2 支持 `ORDER:{order_id}` 查询本系统订单快照。
- 查询接口 1、2 已启用与任务结果接收接口一致的 HMAC-SHA256 鉴权。
- 查询接口错误响应统一返回 `success=false` 包装,非法 JSON、非法 `Content-Type` 和鉴权错误不会暴露 Secret、签名原文或完整请求体。
- 对外 JSON 中内部长整型 ID 按字符串返回。
- `reservation_no``block_id``room_items``rate_code_price` 等当前无可靠来源字段按本文约定返回 `null`、空数组或 warning。
仍未落地能力:
- 接口 3 `query_file_parse_context`
- 接口 4 `query_parent_task_context`,后续改为订单及其下面任务查询后再定义。
- 附件解析、OCR、Excel、voucher、rooming list 解析。
- 真实 OPERA / OHIP 对象投影。