实现 M002 订单任务入站与队列规则

This commit is contained in:
andy
2026-07-07 14:29:43 +08:00
parent 7e276469ef
commit f7d77b45bd
78 changed files with 11703 additions and 1 deletions

View File

@@ -32,5 +32,12 @@ agentbus:
enabled: ${AGENTBUS_CAPTURE_ENABLED:true}
default-hotel-id: ${AGENTBUS_DEFAULT_HOTEL_ID:HOTEL-TEST}
superagent:
task-result:
hmac-secret: ${SUPERAGENT_TASK_RESULT_HMAC_SECRET:}
clock-skew-seconds: ${SUPERAGENT_TASK_RESULT_CLOCK_SKEW_SECONDS:300}
nonce-ttl-seconds: ${SUPERAGENT_TASK_RESULT_NONCE_TTL_SECONDS:600}
max-body-bytes: ${SUPERAGENT_TASK_RESULT_MAX_BODY_BYTES:1048576}
server:
port: ${SERVER_PORT:8080}

View File

@@ -0,0 +1,142 @@
-- M002 SuperAgent 入站防重放:记录已使用 nonce避免签名请求被重复提交。
CREATE TABLE integration_superagent_task_result_nonce (
id BIGINT NOT NULL COMMENT 'Nonce 记录 ID',
client_id VARCHAR(128) NOT NULL COMMENT 'SuperAgent 调用方客户端 ID',
nonce VARCHAR(256) NOT NULL COMMENT '单次请求随机值,用于防重放',
expires_at DATETIME(6) NOT NULL COMMENT 'Nonce 过期 UTC 时间',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_superagent_nonce_client_nonce (client_id, nonce),
KEY idx_superagent_nonce_expires_at (expires_at)
) COMMENT='SuperAgent 任务结果入站 nonce 表,用于 HMAC 请求防重放';
-- M002 AI 任务结果接收批次:保存一次 SuperAgent 提交的顶层请求和幂等信息。
CREATE TABLE workflow_reservation_ai_batch (
id BIGINT NOT NULL COMMENT 'AI 任务结果接收批次 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
source_message_id BIGINT NOT NULL COMMENT '关联 SourceMessage Inbox ID',
request_payload_sha256 CHAR(64) NOT NULL COMMENT '原始请求体 SHA-256用于幂等和排查',
batch_idempotency_key CHAR(64) NOT NULL COMMENT '系统生成批次幂等键',
client_id VARCHAR(128) NOT NULL COMMENT 'SuperAgent 调用方客户端 ID',
request_id VARCHAR(128) NULL COMMENT '调用方请求 ID用于日志串联',
received_at DATETIME(6) NOT NULL COMMENT '本系统接收 UTC 时间',
item_count INT NOT NULL COMMENT '本批次 AI task result 数量',
extraction_warnings_json LONGTEXT NULL COMMENT 'AI 抽取警告 JSON',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_reservation_ai_batch_idempotency (hotel_id, batch_idempotency_key),
UNIQUE KEY uk_reservation_ai_batch_source (hotel_id, source_message_id),
KEY idx_reservation_ai_batch_received_at (hotel_id, received_at)
) COMMENT='Reservation AI 任务结果接收批次表,保存 SuperAgent 入站请求的幂等和追溯信息';
-- M002 AI 过渡层:一条 ai_task_results item 对应一行,保留 AI 原始 JSON 和查询冗余列。
CREATE TABLE workflow_reservation_ai_transition (
id BIGINT NOT NULL COMMENT 'AI 过渡记录 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
batch_id BIGINT NOT NULL COMMENT 'AI 任务结果接收批次 ID',
source_message_id BIGINT NOT NULL COMMENT '关联 SourceMessage Inbox ID',
source_event_index INT NOT NULL COMMENT 'AI current 事件序号,按 AI 输出保存',
array_index INT NOT NULL COMMENT 'AI 返回列表中的顺序,从 1 开始',
execution_order INT NOT NULL COMMENT '映射到订单任务队列的初始顺序',
catalog_code VARCHAR(32) NOT NULL COMMENT 'Skill 目录代码,例如 S01、S02',
skill_id VARCHAR(128) NOT NULL COMMENT 'Skill 标识',
result_type VARCHAR(32) NOT NULL COMMENT 'AI 结果类型,例如 normal_task、manual_review、informational_message',
ai_task_type VARCHAR(64) NOT NULL COMMENT 'AI 原始任务类型,例如 New Booking、Voucher Received',
system_task_type VARCHAR(64) NOT NULL COMMENT '系统主任务类型,例如 NEW_BOOKING、UPDATE_BOOKING',
task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型,例如 NEW_BOOKING、MESSAGE_NOTIFICATION',
task_subtype VARCHAR(128) NULL COMMENT '业务动作 subtype',
current_or_history VARCHAR(32) NULL COMMENT '当前或历史标识',
group_code VARCHAR(128) NULL COMMENT 'Group Code 候选,来源于 case_keys 或卡片字段',
confirmation_number VARCHAR(128) NULL COMMENT 'Confirmation Number 候选,来源于 case_keys 或卡片字段',
item_payload_sha256 CHAR(64) NOT NULL COMMENT '单个 AI item JSON SHA-256',
item_idempotency_key CHAR(64) NOT NULL COMMENT '系统生成 item 幂等键',
manual_reason_code VARCHAR(128) NULL COMMENT 'manual_review 原因码',
parent_source_event_index INT NULL COMMENT '父任务事件序号,用于联动任务',
linked_task_group_id VARCHAR(128) NULL COMMENT '联动任务组 ID',
blocked_until_parent_completed TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否等待父任务完成',
ai_payload_json LONGTEXT NOT NULL COMMENT 'AI 原始 item JSON禁止被用户修改覆盖',
case_keys_json LONGTEXT NULL COMMENT '订单候选键 JSON',
extracted_fields_json LONGTEXT NULL COMMENT 'AI 抽取业务字段 JSON',
manual_review_json LONGTEXT NULL COMMENT '人工复核 JSON',
informational_message_json LONGTEXT NULL COMMENT '信息提醒 JSON',
attachments_json LONGTEXT NULL COMMENT '附件和文件引用 JSON',
context_used_json LONGTEXT NULL COMMENT 'AI 使用上下文 JSON',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_reservation_ai_transition_item (hotel_id, item_idempotency_key),
KEY idx_reservation_ai_transition_source_event (hotel_id, source_message_id, source_event_index),
KEY idx_reservation_ai_transition_type (hotel_id, result_type, ai_task_type),
KEY idx_reservation_ai_transition_group_code (hotel_id, group_code),
KEY idx_reservation_ai_transition_confirmation (hotel_id, confirmation_number)
) COMMENT='Reservation AI 过渡表,保存每条 AI 任务结果的原始 JSON、映射类型和查询冗余列';
-- M002 订单:承载任务队列和临时订单归档容器。
CREATE TABLE workflow_reservation_order (
id BIGINT NOT NULL COMMENT '系统内部订单 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
order_key_type VARCHAR(32) NOT NULL COMMENT '业务号类型GROUP_CODE、CONFIRMATION_NUMBER、TEMPORARY',
order_business_key VARCHAR(128) NULL COMMENT '真实业务号,例如 Group Code 或 Confirmation Number',
temporary_order_code VARCHAR(128) NOT NULL COMMENT '临时订单展示编号,即使有业务号也保留内部追踪编号',
order_status VARCHAR(32) NOT NULL COMMENT '订单状态TEMPORARY、ACTIVE、ENDED、LOGIC_DELETED',
display_name VARCHAR(256) NOT NULL COMMENT '前端展示名称',
source_message_id BIGINT NOT NULL COMMENT '首次创建该订单的来源消息 ID',
created_from_task_id BIGINT NULL COMMENT '首次创建该订单的任务 ID第一阶段允许为空',
ended_at DATETIME(6) NULL COMMENT '订单进入 ENDED 状态的 UTC 时间',
logic_deleted_at DATETIME(6) NULL COMMENT '逻辑删除 UTC 时间',
logic_deleted_reason VARCHAR(512) NULL COMMENT '逻辑删除原因',
version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_reservation_order_temp_code (hotel_id, temporary_order_code),
KEY idx_reservation_order_status_time (hotel_id, order_status, updated_at),
KEY idx_reservation_order_business_key (hotel_id, order_key_type, order_business_key)
) COMMENT='Reservation 订单表,承载业务订单号、临时订单和任务队列归属';
-- M002 任务:保存 AI 映射后的系统任务、队列顺序和处理状态。
CREATE TABLE workflow_reservation_task (
id BIGINT NOT NULL COMMENT '系统任务 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
order_id BIGINT NOT NULL COMMENT '当前挂靠订单 ID',
source_message_id BIGINT NOT NULL COMMENT '来源消息 ID',
ai_transition_id BIGINT NOT NULL COMMENT 'AI 过渡记录 ID',
result_type VARCHAR(32) NOT NULL COMMENT 'AI 结果类型',
ai_task_type VARCHAR(64) NOT NULL COMMENT 'AI 原始任务类型',
system_task_type VARCHAR(64) NOT NULL COMMENT '系统主任务类型',
task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型',
task_subtype VARCHAR(128) NULL COMMENT '业务动作 subtype',
task_status VARCHAR(32) NOT NULL COMMENT '任务状态PENDING_CONFIRM、READY、EXECUTING、FAILED、COMPLETED',
queue_participation TINYINT(1) NOT NULL COMMENT '是否参与订单执行队列Message Notification 为 0',
execution_order INT NOT NULL COMMENT '同订单执行顺序',
parent_task_id BIGINT NULL COMMENT '父任务 ID用于联动任务',
parent_source_event_index INT NULL COMMENT '父任务 source event index',
linked_task_group_id VARCHAR(128) NULL COMMENT '联动任务组 ID',
blocked_until_parent_completed TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否等待父任务完成',
last_failure_reason VARCHAR(512) NULL COMMENT '最近失败原因摘要',
completed_at DATETIME(6) NULL COMMENT '任务完成 UTC 时间',
version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
KEY idx_reservation_task_order_queue (hotel_id, order_id, queue_participation, execution_order),
KEY idx_reservation_task_status_time (hotel_id, task_status, updated_at),
KEY idx_reservation_task_source (hotel_id, source_message_id),
KEY idx_reservation_task_transition (hotel_id, ai_transition_id)
) COMMENT='Reservation 任务表,保存 AI 结果映射后的任务状态、任务卡类型和订单队列顺序';
-- M002 任务卡CP1-3 只保存任务卡使用的 AI 原始 JSON 快照。
CREATE TABLE workflow_reservation_task_card (
id BIGINT NOT NULL COMMENT '任务卡 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
task_id BIGINT NOT NULL COMMENT '所属任务 ID',
task_card_type VARCHAR(64) NOT NULL COMMENT '任务卡类型',
field_contract_version VARCHAR(64) NOT NULL COMMENT '字段契约版本,第一版使用 code-v1',
ai_payload_json LONGTEXT NOT NULL COMMENT '任务卡使用的 AI 原始 JSON 快照',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_reservation_task_card_task (hotel_id, task_id),
KEY idx_reservation_task_card_type (hotel_id, task_card_type)
) COMMENT='Reservation 任务卡表CP1-3 保存任务卡原始 AI 快照';

View File

@@ -0,0 +1,44 @@
-- M002 CP4ACTIVE 业务订单唯一性和后续 New Booking 真实业务号回填设计。
ALTER TABLE workflow_reservation_order
ADD COLUMN active_business_key VARCHAR(128) NULL COMMENT 'ACTIVE 订单唯一约束辅助键ACTIVE 业务订单时等于真实业务号,其他状态为空';
ALTER TABLE workflow_reservation_order
ADD COLUMN business_key_source VARCHAR(64) NULL COMMENT '业务号来源AI_CANDIDATE、USER_CONFIRMED、OPERA_SIMULATION_RESULT';
ALTER TABLE workflow_reservation_order
ADD COLUMN business_key_backfilled_at DATETIME(6) NULL COMMENT 'New Booking 成功后回填真实业务号的 UTC 时间';
UPDATE workflow_reservation_order
SET active_business_key = order_business_key,
business_key_source = 'AI_CANDIDATE'
WHERE order_status = 'ACTIVE'
AND order_key_type IN ('GROUP_CODE', 'CONFIRMATION_NUMBER')
AND order_business_key IS NOT NULL;
CREATE UNIQUE INDEX uk_reservation_order_active_business_key
ON workflow_reservation_order (hotel_id, order_key_type, active_business_key);
-- M002 CP4同一订单、同一队列参与类型下执行序号必须唯一避免并发创建任务绕过前置任务阻塞规则。
CREATE UNIQUE INDEX uk_reservation_task_queue_order
ON workflow_reservation_task (hotel_id, order_id, queue_participation, execution_order);
-- M002 CP4人工复核转换、订单迁移和临时订单逻辑删除审计。
CREATE TABLE workflow_reservation_audit_log (
id BIGINT NOT NULL COMMENT '审计 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店或业务上下文 ID',
order_id BIGINT NULL COMMENT '订单 ID可为空',
task_id BIGINT NULL COMMENT '任务 ID可为空',
operation_id BIGINT NULL COMMENT 'OPERA 模拟操作 ID当前阶段为空',
actor_type VARCHAR(32) NOT NULL COMMENT '操作人类型SYSTEM、USER、SUPERAGENT',
actor_id VARCHAR(128) NOT NULL COMMENT '操作人标识',
action VARCHAR(128) NOT NULL COMMENT '操作类型,例如 MANUAL_REVIEW_CONVERT',
reason VARCHAR(512) NULL COMMENT '操作原因,第一版允许为空',
before_snapshot_json LONGTEXT NULL COMMENT '变更前摘要 JSON不保存 Secret 或完整原文',
after_snapshot_json LONGTEXT NULL COMMENT '变更后摘要 JSON不保存 Secret 或完整原文',
occurred_at DATETIME(6) NOT NULL COMMENT '业务动作发生 UTC 时间',
created_at DATETIME(6) NOT NULL COMMENT '审计记录创建 UTC 时间',
PRIMARY KEY (id),
KEY idx_reservation_audit_order_time (hotel_id, order_id, occurred_at),
KEY idx_reservation_audit_task_time (hotel_id, task_id, occurred_at),
KEY idx_reservation_audit_action_time (hotel_id, action, occurred_at)
) COMMENT='Reservation 订单任务审计表,记录人工转换、迁移和后续 OPERA 模拟动作';

File diff suppressed because it is too large Load Diff