实现 M002 订单任务入站与队列规则
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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 快照';
|
||||
@@ -0,0 +1,44 @@
|
||||
-- M002 CP4:ACTIVE 业务订单唯一性和后续 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
Reference in New Issue
Block a user