29 KiB
M002 Order Task Workflow 订单任务主流程 V2
文档信息
| 项目 | 内容 |
|---|---|
| 文档版本 | 0.2 |
| 日期 | 2026-07-07 |
| 状态 | 第二版需求与后端阶段实现记录 |
| 适用范围 | SourceMessage 之后的 AI 过渡层、订单挂靠、任务卡、人工确认、OPERA 模拟操作主流程 |
| 主要读者 | 产品、后端、前端、测试、后续协作 agent |
1. 文档定位
本文是 M002-order-task-workflow-v1.md 的第二版修正,目标是把本项目已经讨论确认的订单任务主流程,与 2026-07-06 导入的 AI 任务卡契约对齐。
本文定义业务边界、数据语义和后续实现约束。当前后端已经按拆分 checkpoint 实现了 AI 结果接收、订单任务基础流转、任务草稿保存、最终确认、审计列表、OPERA 模拟骨架、SuperAgent 查询上下文接口 1、2 的最小字段版,以及前端 P0 任务列表 / 订单详情查询接口;前端页面、真实 OPERA、普通任务切换订单、查询接口 3 和查询接口 4 仍未实现。
2. 本版核心修正
相对 V1,本版有以下修正:
- 增加
AI 过渡层:系统必须先保存 AI 原始输出,再生成订单、任务和任务卡。 - 不再使用
EXCEPTION作为底层结果类型,AI 第一版结果类型统一以normal_task、manual_review、informational_message为准。 - 系统主任务类型收敛为
NEW_BOOKING、UPDATE_BOOKING、CANCEL_BOOKING、MANUAL_REVIEW,另保留INFORMATIONAL_MESSAGE作为不参与执行队列的只读提醒任务。 - 除
New Booking、Cancel Booking、Fallback/manual_review外,其他业务处理类卡片原则上都归到UPDATE_BOOKING下的不同任务卡。 Message Notification也挂到临时订单下面,便于归档和详情查看,但不参与订单任务执行队列,不阻塞其他任务,也不被其他任务阻塞。- 任务卡后端完整规则以
任务卡展示编辑矩阵.xlsx为权威来源,不在代码里随意扩展或重命名字段路径。 - 前端展示 / 编辑白名单以最新导入的
任务卡前端展示字段表 3.0.xlsx为准;该文件只约束前端展示和可编辑范围,不替代后端完整校验、确认写入和 OPERA 映射规则。 - 系统必须同时保存 AI 原始
task_type、系统主任务类型、任务卡类型和业务动作 subtype。 ai_payload_json与confirmed_payload_json必须分离。OPERA 模拟只能读取用户确认后的confirmed_payload_json。- 订单业务号候选字段和 OPERA 模拟回填边界需要明确记录,但 OPERA 返回 JSON 字段名目前未知,不能写死。
3. 权威输入资料
本版需求参考以下资料:
| 资料 | 作用 |
|---|---|
docs/project/requirements/M001-source-message-inbox-prd.md |
上游 SourceMessage Inbox 边界 |
docs/project/requirements/M002-order-task-workflow-v1.md |
第一版整体业务流程 |
docs/import/20260706/开发AI先读_工作顺序.md |
AI 过渡表、任务卡、确认 payload 和 OPERA 写入工作顺序 |
docs/import/20260706/AI输出参数并集字典.xlsx |
AI 输出字段路径、字段含义、建议存储方式和索引建议 |
docs/import/20260706/任务卡展示编辑矩阵.xlsx |
后端任务卡完整规则来源,包括校验、确认写入、OPERA 映射和展示条件 |
docs/import/20260708/任务卡前端展示字段表 3.0.xlsx |
前端任务卡展示 / 编辑白名单,不替代后端完整规则矩阵 |
docs/import/20260706/0630AI_副本 2/01_main_agent_prompt.md |
Main Agent 输出职责和聚合 JSON 结构 |
docs/import/20260706/0630AI_副本 2/02_agent_workflow.md |
AI 侧事件拆分、Skill 调用和结果聚合流程 |
docs/import/20260706/0630AI_副本 2/03_skill_catalog.md |
Skill 目录、结果类型、任务类型和统一输出字段 |
docs/import/20260706/0630AI_副本 2/skill/S01-S08*.md |
各业务任务卡的抽取规则和边界 |
docs/import/20260706/0630AI_副本 2/references/qbd_liantai_email_table_rules.md |
QBD / LianTai 表格邮件拆分和证据规则 |
docs/import/20260706/0630AI_副本 2/skill/*/references/rate_code_rules.md |
Rate Code 判断规则 |
docs/import/20260706/0630AI_副本 2/skill/*/references/room_type_mapping_rules.md |
房型映射规则 |
说明:开发AI先读_工作顺序.md 中提到的 AI过渡表开发契约_README.md 和 AI过渡表开发契约_两张样例表.xlsx 在当前导入目录下未找到同名文件。当前以后端完整规则矩阵、AI 输出参数字典和前端 3.0 白名单共同作为字段来源;三者职责不同,不能互相覆盖。
4. 总体流程
AgentBus / 未来其他入口
→ SourceMessage Inbox 记录原始来源事实
→ SuperAgent / Main Agent 读取 SourceMessage 并拆分 current 事件
→ 对每个事件调用对应 Skill
→ 聚合输出 source_message_id + ai_task_results[] + extraction_warnings[]
→ 本系统接收 AI 结果并写入 AI 过渡层
→ 本系统根据 result_type + task_type + task_subtype 生成订单、任务和任务卡
→ 用户在任务详情页查看、修改字段、确认订单归属
→ 系统生成 confirmed_payload_json
→ 用户触发 OPERA 模拟操作
→ 系统保存每条模拟操作结果、失败原因和重试记录
中文说明:
SourceMessage Inbox是来源事实层,不表达订单、任务或业务结论。- AI 只输出 JSON,不直接写数据库、不直接创建真实任务卡、不直接写 OPERA。
- 本系统负责保存 AI 原始 JSON、创建任务卡、接收用户修改、生成确认后的 payload、执行 OPERA 模拟并记录结果。
- SuperAgent 不直连本系统数据库,只能通过本系统后端接口查询已有订单和任务上下文。
5. AI 输出接收边界
导入文档已经定义了 SuperAgent / Main Agent 应输出的核心业务结构,但还没有定义完整 HTTP 接口契约。
AI 聚合输出的顶层结构应包含:
| 字段 | 中文说明 |
|---|---|
source_message_id |
SuperAgent / Main Agent 原样带回的外部来源消息 ID,对应 AgentBus source.external_message_id,不是本系统内部 SourceMessage Inbox 主键 |
ai_task_results[] |
AI 拆分出的一个或多个任务结果,顺序必须保留 |
extraction_warnings[] |
抽取警告,不直接等同于业务任务 |
ai_task_results[] 中关键字段包括:
| 字段 | 中文说明 |
|---|---|
source_event_index |
AI 拆分出的 current 事件序号,同一次来源消息内用于排序 |
catalog_code |
Skill 目录代码,例如 S01、S02 |
skill_id |
具体 Skill 标识 |
result_type |
AI 结果类型,第一版只使用 normal_task、manual_review、informational_message |
task_type |
AI 原始任务类型,例如 New Booking、Voucher Received |
task_subtype / 业务动作 |
更细的业务动作,用于任务卡字段路由 |
current_or_history |
当前事件还是历史证据 |
case_keys |
订单关联候选键,例如 group_code、confirmation_number |
visible_reason |
给用户看的生成原因 |
relevant_message_excerpt |
相关邮件片段 |
attachments / file_references |
附件和文件引用 |
context_used |
AI 使用的上下文摘要 |
extracted_fields |
业务字段主体 |
manual_review |
人工复核结构化原因和证据 |
informational_message |
信息提醒内容 |
additional_operations |
AI 建议的附加动作 |
idempotency_key |
幂等键,最终来源和生成规则待确认 |
HTTP 契约已在 docs/project/requirements/M002-superagent-task-result-api-contract.md 和 docs/project/integrations/superagent-api-contract.md 中补充。正式契约要求任务结果通知携带 hotel_id + source_message_id,其中 source_message_id 是外部来源消息 ID;后端会反查内部 SourceMessage Inbox ID 后再写入 workflow_* 表。
6. AI 过渡层数据要求
系统接收 AI 输出后,应先写入 AI 过渡层,再创建任务卡。过渡层用于追溯、幂等、筛选、人工确认和 OPERA 参数组装。
推荐保存完整 JSON:
| JSON 字段 | 中文说明 |
|---|---|
ai_payload_json |
AI 原始结果,禁止被用户编辑覆盖 |
case_keys_json |
AI 给出的订单关联候选键 |
extracted_fields_json |
AI 抽取的业务字段 |
manual_review_json |
人工复核信息 |
informational_message_json |
信息提醒内容 |
attachments_json |
附件和文件引用 |
context_used_json |
AI 使用的上下文 |
confirmed_payload_json |
用户修改并确认后的最终参数 |
推荐冗余物理列:
| 物理列 | 中文说明 |
|---|---|
source_message_id |
内部 SourceMessage Inbox ID,来自外部 source_message_id 反查后的 platform_source_message_inbox.id |
source_event_index |
AI 事件序号 |
catalog_code |
Skill 目录代码 |
skill_id |
Skill 标识 |
result_type |
AI 结果类型 |
ai_task_type |
AI 原始任务类型 |
system_task_type |
系统主任务类型 |
task_card_type |
任务卡类型 |
task_subtype |
业务动作 subtype |
current_or_history |
当前或历史标识 |
group_code |
冗余的 Group Code 候选 |
confirmation_number |
冗余的 Confirmation Number 候选 |
idempotency_key |
幂等键 |
manual_reason_code |
人工复核原因码 |
parent_source_event_index |
父任务事件序号 |
linked_task_group_id |
联动任务组 ID |
blocked_until_parent_completed |
是否等待父任务完成 |
execution_order |
同订单下执行顺序 |
created_at / updated_at |
创建和更新时间 |
不要把所有嵌套字段都建成物理列。只有高频查询、筛选、幂等、排序、队列控制和状态机需要的字段才冗余。
7. 任务分类模型
7.1 AI 结果类型
AI 第一版结果类型只接受:
result_type |
中文说明 | 是否可直接 OPERA 模拟 |
|---|---|---|
normal_task |
可生成业务任务卡的正常任务 | 需用户确认后才允许 |
manual_review |
需要人工复核的结构化任务 | 不允许直接写 OPERA |
informational_message |
只读信息提醒 | 不允许写 OPERA |
不使用 exception_task 和 no_action。原来讨论中的异常任务,在本版统一落为 manual_review;没有业务动作的信息提醒,统一落为 informational_message。
7.2 系统主任务类型
系统内部主任务类型建议为:
| 系统主任务类型 | 中文说明 |
|---|---|
NEW_BOOKING |
新建订单任务 |
UPDATE_BOOKING |
更新订单任务,下面承载多个不同任务卡 |
CANCEL_BOOKING |
取消订单任务 |
MANUAL_REVIEW |
人工复核或 Fallback 任务 |
INFORMATIONAL_MESSAGE |
信息提醒任务,只归档展示,不参与执行队列 |
7.3 AI 任务类型到系统任务和卡片的映射
AI task_type |
系统主任务类型 | 任务卡类型 | 说明 |
|---|---|---|---|
New Booking |
NEW_BOOKING |
NEW_BOOKING |
新建 FIT、Group Block、Allotment / Control Block |
Update Booking |
UPDATE_BOOKING |
UPDATE_BOOKING |
通用订单修改卡 |
Voucher Received |
UPDATE_BOOKING |
VOUCHER_RECEIVED |
凭证类更新卡 |
Rooming List |
UPDATE_BOOKING |
ROOMING_LIST |
名单/分房表处理卡 |
Amend Group Code |
UPDATE_BOOKING |
AMEND_GROUP_CODE |
修改 Group Code 卡 |
Trace / Reservation Notes |
UPDATE_BOOKING |
TRACE_RESERVATION_NOTES |
Trace 或备注卡,可作为联动任务 |
TA Recorder |
UPDATE_BOOKING |
TA_RECORDER |
TA Recorder 维护卡,通常由 Rooming List 派生 |
Cancel Booking |
CANCEL_BOOKING |
CANCEL_BOOKING |
取消 FIT、Group Block、Allotment / Control Block |
Message Notification |
INFORMATIONAL_MESSAGE |
MESSAGE_NOTIFICATION |
挂临时订单,只读展示,不参与执行队列 |
Fallback |
MANUAL_REVIEW |
FALLBACK_REVIEW |
人工复核任务 |
系统不得丢弃 AI 原始 task_type。任务落库时应同时保存 AI 原始任务类型、系统主任务类型、任务卡类型和业务动作 subtype。
8. Message Notification 处理规则
Message Notification 用于感谢、知会、已收到、转发说明、信息同步等没有明确业务执行动作的消息。
本系统处理规则:
- 创建临时订单作为归档容器。
- 创建只读信息提醒任务卡。
- 不参与订单任务执行队列。
- 不阻塞同订单其他可执行任务。
- 不被同订单其他可执行任务阻塞。
- 不允许编辑业务字段。
- 不允许确认后执行 OPERA 模拟。
- 可在详情页展示
visible_reason、relevant_message_excerpt、attachments和informational_message。
9. 任务卡字段约束
任务卡字段来源按职责拆分:
- 后端校验、确认写入、OPERA 映射和展示条件以
docs/import/20260706/任务卡展示编辑矩阵.xlsx为权威来源。 - 前端展示 / 编辑白名单以
docs/import/20260708/任务卡前端展示字段表 3.0.xlsx为准。 - 系统不得直接把整个
ai_task_results[]渲染成表单,也不得绕过矩阵自行扩展字段含义。 - 如果后端完整规则与前端白名单出现冲突,例如旧矩阵要求必填但 3.0 白名单未开放展示或编辑,应先记录为前后端契约待确认问题,不由前端或后端单方面放宽规则。
字段矩阵通过以下列控制任务详情页行为:
| 列 | 中文说明 |
|---|---|
任务卡名称 |
前端任务卡名称 |
result_type |
适用的 AI 结果类型 |
task_type |
适用的 AI 原始任务类型 |
task_subtype/业务动作 |
适用的业务动作 |
字段路径 |
从 AI JSON 或确认 JSON 中取值的路径 |
展示名 |
前端展示名称 |
是否展示 |
是否在任务卡展示 |
是否可编辑 |
用户是否可编辑 |
是否为输入方式编辑 |
是否普通输入 |
是否为下拉框方式编辑 |
是否下拉选择 |
是否日期选择 |
是否日期控件 |
是否数字输入 |
是否数字输入 |
是否文件展示 |
是否文件或附件展示 |
是否表格编辑 |
是否表格型编辑 |
下拉选项/枚举值 |
可选值,系统不得自行扩展 |
是否必填 |
用户确认前是否必填 |
展示条件 |
字段显示条件 |
校验规则 |
用户确认前校验规则 |
确认后写入位置 |
写入 confirmed_payload_json 的位置 |
是否参与Opera写入 |
是否允许进入 OPERA 参数 |
Opera API参数映射 |
OPERA 参数映射意图 |
9.1 关键卡片字段摘要
本节只摘录核心字段,完整字段以 Excel 矩阵为准。
| 任务卡 | 关键字段 |
|---|---|
| New Booking | case_keys.group_code、case_keys.confirmation_number、入住/离店日期、房量、房型原文、Opera 房型代码、Rate Code、结算价、Fix Charge、子团房量、表格行证据 |
| Update Booking | case_keys.group_code、case_keys.confirmation_number、修改类型、修改前/后、Rate / 结算价结果、Fix Charge、表格行证据 |
| Cancel Booking | case_keys.group_code、case_keys.confirmation_number、取消对象类型、取消范围、取消生效日期、取消备注 |
| Voucher Received | 原始凭证、凭证类型、case_keys.group_code、确认后动作、凭证展示字段、部门流转、关联 Group Code |
| Rooming List | 名单文件、名单类型、目标 Key、文件类型判断、附件 / Sheet 绑定、后续动作意图、派生任务候选 |
| Amend Group Code | 旧 Group Code、新 Group Code |
| Trace / Reservation Notes | case_keys.group_code、case_keys.confirmation_number、Trace 类型、通知部门、Trace Text、入住人数更新、改价公式、父任务事件序号 |
| TA Recorder | Group Code、名单 / 分房附件、TA Recorder 状态、Rooming List 父任务 |
| Message Notification | 生成原因、邮件片段、附件、信息提醒内容 |
| Fallback / manual_review | 复核原因码、复核说明、复核记录类型、阻断点、缺失字段、冲突点、建议核对证据、建议人工动作、候选 Group Code、候选 Confirmation No. |
10. AI 原始值和人工确认值
AI 原始输出和用户确认值必须分离。
| 概念 | 中文说明 |
|---|---|
ai_payload_json |
AI 原始输出,作为证据和审计,不被用户编辑覆盖 |
confirmed_payload_json |
用户修改并确认后的最终业务参数 |
系统规则:
- 任务详情首次展示可从
ai_payload_json按矩阵字段路径取值。 - 用户编辑后必须写入
confirmed_payload_json。 - 用户确认前必须按矩阵和后端硬校验检查必填、类型、枚举和执行条件。
- OPERA 模拟只能从
confirmed_payload_json取值。 - 不允许直接从
ai_payload_json组装 OPERA 参数。 - 不允许因为用户修改而覆盖 AI 原始输出。
11. 订单业务号和临时订单
系统不应只用一个含义模糊的“订单号”。建议至少区分:
| 字段 | 中文说明 |
|---|---|
order_id |
系统内部订单 ID,永远存在 |
order_key_type |
业务号类型,例如 GROUP_CODE、CONFIRMATION_NUMBER、TEMPORARY |
order_business_key |
真实业务号,例如 Group Code 或 Confirmation Number |
temporary_order_code |
临时订单展示编号 |
11.1 可作为订单业务号候选的字段
订单业务号候选字段包括:
| 字段路径 | 适用场景 | 中文说明 |
|---|---|---|
case_keys.group_code |
Group / Block / Allotment 类任务 | 主要 Group Code 候选 |
case_keys.confirmation_number |
FIT Reservation 类任务 | 主要 Confirmation Number 候选 |
extracted_fields.old_group_code |
Amend Group Code | 定位原订单 |
extracted_fields.new_group_code |
Amend Group Code | 修改成功后的新业务号候选 |
extracted_fields.group_code |
TA Recorder 等卡片 | 任务卡内 Group Code 候选 |
extracted_fields.target_key |
Rooming List | 目标 Key,需要判断实际是 Group Code 还是 Confirmation Number |
related_group_codes[] |
Voucher 等场景 | 关联展示或候选,不应自动作为唯一主订单号 |
系统匹配订单时应优先使用用户确认后的 confirmed_payload_json;如果尚未确认,只能把 AI 字段作为候选和展示依据。
11.2 New Booking 的订单号处理
NEW_BOOKING 不一定都需要等待 OPERA 模拟创建后才有真实业务号。
规则:
- 如果用户确认后的 payload 已有可用业务号,优先使用该业务号。
- FIT Reservation 优先看
confirmation_number。 - Group / Block / Allotment 优先看
group_code。 - 如果确认后的 payload 没有可用业务号,先创建临时订单并使用
temporary_order_code展示和追踪。 - OPERA 模拟创建成功后,如果结果中返回真实业务号,再回填订单业务号。
- 第一版尚未实现确认 payload 时,Fallback 转
NEW_BOOKING可先读取 AI 原始case_keys.group_code/case_keys.confirmation_number作为AI_CANDIDATE,用于把原临时订单激活为 ACTIVE;后续用户确认字段时再把来源升级为USER_CONFIRMED。
11.3 什么时候从 OPERA 模拟结果回填订单号
只有在 NEW_BOOKING 且确认后的 payload 没有可用业务号时,才需要从 OPERA 模拟结果回填订单号。
| 任务场景 | 回填业务含义 |
|---|---|
| New FIT Reservation | 从 OPERA 模拟结果中的 Confirmation No. / Reservation Confirmation Number 含义字段回填 |
| New Group Block | 从 OPERA 模拟结果中的 Group Code / Block Code 含义字段回填 |
| New Allotment / Control Block | 从 OPERA 模拟结果中的 Group Code / Block Code / Allotment Code 含义字段回填 |
当前导入文档没有定义 OPERA 模拟结果的 JSON 字段名,因此不能在需求中写死 result.confirmationNumber、result.groupCode 等具体路径。该字段名需要在 OPERA 模拟模块设计时另行确认。
11.4 非 New Booking 的订单号规则
UPDATE_BOOKING、CANCEL_BOOKING、Voucher Received、Rooming List、Trace / Reservation Notes、TA Recorder 等任务,原则上不应依赖 OPERA 模拟结果生成订单号。
这些任务应先通过 case_keys 或对应卡片字段挂靠已有订单;如果无法自动归属,则创建或使用临时订单,并等待人工确认订单关系。
12. 订单挂靠和临时订单
任务必须挂靠到订单下,便于详情查看、队列控制和审计。
| 场景 | 挂靠规则 |
|---|---|
| New Booking 有业务号 | 按确认后的业务号创建或匹配订单 |
| New Booking 无业务号 | 创建临时订单 |
| Update Booking 可匹配已有订单 | 挂靠已有订单 |
| Update Booking 无法匹配订单 | 挂靠临时订单,等待人工确认 |
| Cancel Booking 可匹配已有订单 | 挂靠已有订单 |
| Cancel Booking 无法匹配订单 | 挂靠临时订单,等待人工确认 |
| Fallback / manual_review | 先挂靠临时订单,人工处理时可转换类型和订单归属 |
| Message Notification | 挂靠临时订单,只读归档 |
任务从临时订单迁移到已有订单时,必须记录审计。若原临时订单已无有效任务,应逻辑删除,并记录删除原因。
13. 任务顺序和可处理状态
同一个订单下,任务必须按顺序处理。
排序依据:
order_id + execution_order
同一次 AI 返回多个任务时:
- 必须保留
ai_task_results[]列表顺序。 - 可使用
source_event_index、execution_order或批次内 item index 保存顺序。 - 不得只依赖创建时间,因为同批次任务创建时间可能完全一致。
处理规则:
- 前置任务未完成时,后续任务只能查看。
FAILED视为当前前置任务已经结束,不阻塞后续任务;用户不能跳过失败的 OPERA 操作,但失败任务本身不再卡住后续任务查看和处理顺序。- 后续任务不能编辑字段。
- 后续任务不能确认订单关系。
- 后续任务不能执行 OPERA 模拟。
- 后续任务不能重试 OPERA 模拟。
Message Notification不参与执行队列,不阻塞其他任务,也不被其他任务阻塞。- 联动任务可通过
parent_source_event_index、linked_task_group_id、blocked_until_parent_completed表达依赖。
14. 人工复核和 Fallback
manual_review 是结构化人工复核,不是空结果,也不是系统失败。
人工复核卡至少应展示:
manual_review.reason_codemanual_review.visible_reasonmanual_review.review_record_typemanual_review.blocking_points[]manual_review.missing_fields[]manual_review.conflicting_points[]manual_review.evidence_to_check[]manual_review.suggested_human_actions[]
Fallback 处理规则:
- 创建
MANUAL_REVIEW任务。 - 默认挂靠临时订单。
- 用户处理时可以选择转为
NEW_BOOKING、UPDATE_BOOKING或CANCEL_BOOKING。 - 转换时必须记录审计;原因字段第一版允许为空。
- 转为
NEW_BOOKING时,临时订单可以继续保留;如果已有确认 payload 则优先使用确认业务号,第一版尚未实现确认 payload 时可先使用 AI 原始case_keys中的业务号候选。 - 转为
UPDATE_BOOKING或CANCEL_BOOKING时,用户必须选择目标订单;任务迁移后原临时订单无有效任务时可逻辑删除。 - 类型转换、订单迁移和临时订单逻辑删除都必须记录审计。
15. OPERA 模拟操作
当前阶段没有真实 OHIP / OPERA 接口,只做 OPERA 模拟操作。
允许进入 OPERA 模拟的前置条件:
result_type = normal_task。- 当前任务是订单执行队列中可处理的任务。
- 用户已确认订单归属。
- 用户已确认字段,且系统已生成
confirmed_payload_json。 - 字段矩阵中
是否参与Opera写入为是或满足条件参与。 - 后端硬校验通过。
不允许进入 OPERA 模拟的场景:
manual_review。informational_message。- 未确认的 AI 原始值。
- 证据字段、只读字段、历史字段、uncertain 字段。
- S04 的
voucher_display_fields等展示字段。 - 字段矩阵明确
是否参与Opera写入=否的字段。
一个任务可能产生多条 OPERA 模拟操作。任务详情页应展示每条模拟操作的结果、状态、失败原因、重试次数和最近执行时间。重试必须保留历史记录,不能覆盖原始失败记录。
第一版后端实现中,任务最终确认后固定生成两条 OPERA 模拟操作:
| 顺序 | 操作代码 | 中文说明 |
|---|---|---|
| 1 | SIMULATE_PRECHECK |
OPERA 模拟预检查 |
| 2 | SIMULATE_WRITE |
OPERA 模拟写入 |
当前模拟操作只保存请求/响应摘要和 attempt 记录,不接真实 OPERA,也不从模拟结果回填订单业务号。失败时只把对应操作标记为 FAILED,任务保持未完成,避免用户绕过失败操作。
16. 审计要求
以下行为必须记录审计:
- AI 结果接收批次。
ai_task_results[]中每个 item 的创建顺序。- AI 原始 JSON 保存。
- 订单自动挂靠或临时订单创建。
- 用户修改任务字段。
- 用户确认订单关系。
confirmed_payload_json生成。- 任务类型转换。
- 任务切换订单。
- 临时订单逻辑删除。
- OPERA 模拟操作执行。
- OPERA 模拟操作重试。
- 从 OPERA 模拟结果回填订单业务号。
审计至少包含:
| 字段 | 中文说明 |
|---|---|
actor |
操作人或系统调用方 |
action |
操作类型 |
reason |
用户填写或系统记录的原因 |
before_snapshot |
变更前摘要 |
after_snapshot |
变更后摘要 |
occurred_at |
发生时间 |
审计中不得记录 Secret、Token、完整邮件正文、真实附件 URL 或不必要的个人敏感信息。
17. 暂不包含范围
本版暂不定义:
- SuperAgent 查询上下文接口 3、4;接口 1、2 的第一版最小字段已单独定义并落地在
M002-ai-query-minimal-fields.md。 - OPERA 模拟结果 JSON 字段名。
- 真实 OHIP / OPERA 接口地址、鉴权和返回结构。
- 前端具体页面布局和交互细节。
- 全量 158 条任务卡字段配置复制版。
- Rate Code 和房型规则的代码实现。
- 普通任务切换订单接口和前端交互。
- 用户身份、权限和真实 actor 注入。
18. 待确认问题
- SuperAgent 创建任务接口的 URL、Method、Header、鉴权和错误响应格式。
- SuperAgent 查询上下文接口 1、2 已实现最小字段版,并已启用与任务结果接收接口一致的 HMAC;接口 3 文件解析和接口 4 订单及任务查询仍需后续确认与实现,后续梳理未完成事项时必须持续提醒。
- SuperAgent 任务结果通知中的
source_message_id已确认是外部来源消息 ID,对应 AgentBussource.external_message_id;查询接口中的source_message_id和source_event_index第一版接收但忽略。 source_event_index、批次 item index、execution_order的最终编号规则是否都从 1 开始。- SuperAgent 查询上下文接口 3、4 的 URL、入参、返回字段和鉴权方式。
Message Notification是否需要在前端订单列表上单独标识为只读提醒。- OPERA 模拟结果中 Confirmation No.、Group Code、Block Code、Allotment Code 的具体字段路径。
- 临时订单在无任务后是否立即逻辑删除,还是保留一段时间便于追溯。
- 普通任务切换订单接口何时纳入实现。
- 用户身份和权限体系何时接入,审计
actor如何从登录态获取。
19. 后续建议 checkpoint
建议后续按以下顺序拆分:
- 定义 SuperAgent 调本系统的任务结果接收接口契约。
- 定义 AI 过渡层、订单、任务、任务卡、审计、OPERA 模拟结果的最小数据模型。
- 定义系统主任务类型、任务卡类型、
result_type、任务状态和订单状态枚举。 - 实现 AI 结果接收、幂等、顺序保存和任务卡创建。
- 实现订单自动挂靠、临时订单创建和人工订单切换。
- 实现任务详情字段展示、编辑、确认和
confirmed_payload_json。当前后端已实现保存草稿和最终确认接口,前端页面待定。 - 实现任务队列阻塞规则和
Message Notification只读归档规则。当前后端已实现阻塞规则和只读提醒归档的基础能力,前端页面待定。 - 实现 OPERA 模拟操作结果底表、重试和订单业务号回填。当前后端已实现固定两条模拟操作、attempt、执行、重试和审计列表;订单业务号回填待真实 OPERA 返回结构确认后再做。
- 根据前端页面范围实现列表、详情和只读/可处理状态展示。当前后端已实现
GET /api/reservation/tasks和GET /api/reservation/orders/{orderId}第一版;前端页面和订单列表、Message Notification 独立列表 / 详情、任务卡字段白名单元数据接口仍待后续确认。