# 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 | 接口 1：case-context 最小需要 | 接口 2：object-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、S07，S04/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. 接口 1：query_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. 接口 2：query_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 对象投影。
