Files
group_xinghuo_jinrong/docs/项目框架设计/表设计/01-mysql-共用底座.sql
T

216 lines
12 KiB
SQL
Raw Normal View History

-- =============================================================================
-- 多 Agent 共用底座 MySQL(11 张)
-- 执行时机:四个 Agent 并行开发之前,平台统一建好
-- 不含单 Agent 专用表 → 见 02-mysql-agent专用.sql
-- =============================================================================
CREATE DATABASE IF NOT EXISTS jinrong_agent DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE jinrong_agent;
-- =============================================================================
-- 🔴 第一批:全员共用(6 张)
-- =============================================================================
CREATE TABLE agent_session (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
session_id VARCHAR(64) NOT NULL COMMENT '对外会话 UUID',
trace_id VARCHAR(64) NOT NULL COMMENT '全链路追踪 ID',
agent_type ENUM('customer','advisor','analyst','risk') NOT NULL,
actor_id VARCHAR(64) NOT NULL COMMENT '操作者:customer_id / staff_id / SYSTEM',
actor_role VARCHAR(32) NOT NULL COMMENT 'customer/advisor/analyst/risk_officer/compliance',
customer_id VARCHAR(64) NULL COMMENT '会话关联客户',
advisor_id VARCHAR(64) NULL COMMENT '代理人归属校验用',
title VARCHAR(256) NULL,
status ENUM('active','closed','blocked') NOT NULL DEFAULT 'active',
metadata JSON NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
closed_at DATETIME(3) NULL,
UNIQUE KEY uk_session_id (session_id),
KEY idx_trace (trace_id),
KEY idx_actor (agent_type, actor_id, created_at),
KEY idx_customer (customer_id, created_at),
KEY idx_advisor_customer (advisor_id, customer_id)
) ENGINE=InnoDB COMMENT='【共用】Agent 会话主表';
CREATE TABLE agent_message (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
trace_id VARCHAR(64) NOT NULL,
seq_no INT UNSIGNED NOT NULL,
role ENUM('user','assistant','system','tool') NOT NULL,
content MEDIUMTEXT NOT NULL,
content_hash CHAR(64) NULL,
token_est INT UNSIGNED NULL,
has_disclaimer TINYINT(1) NOT NULL DEFAULT 0,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_session_seq (session_id, seq_no),
KEY idx_trace (trace_id),
KEY idx_created (created_at),
UNIQUE KEY uk_agent_message_session_seq (session_id, seq_no)
) ENGINE=InnoDB COMMENT='【共用】消息明细';
CREATE TABLE agent_tool_call (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
trace_id VARCHAR(64) NOT NULL,
message_id BIGINT UNSIGNED NULL,
tool_name VARCHAR(128) NOT NULL,
tool_input JSON NOT NULL,
tool_output JSON NULL,
status ENUM('success','error','blocked','timeout') NOT NULL,
error_code VARCHAR(64) NULL,
latency_ms INT UNSIGNED NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_session (session_id, created_at),
KEY idx_trace (trace_id),
KEY idx_tool (tool_name, created_at)
) ENGINE=InnoDB COMMENT='【共用】Tool 调用审计';
CREATE TABLE audit_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
trace_id VARCHAR(64) NOT NULL,
event_type VARCHAR(64) NOT NULL,
agent_type ENUM('customer','advisor','analyst','risk','platform') NOT NULL,
actor_id VARCHAR(64) NOT NULL,
customer_id VARCHAR(64) NULL,
rule_id VARCHAR(64) NULL,
input_summary JSON NULL,
decision VARCHAR(64) NULL,
risk_score SMALLINT UNSIGNED NULL,
handler_id VARCHAR(64) NULL,
handler_result VARCHAR(64) NULL,
handler_comment VARCHAR(512) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_trace (trace_id),
KEY idx_event_time (event_type, created_at),
KEY idx_customer (customer_id, created_at),
KEY idx_actor (actor_id, created_at)
) ENGINE=InnoDB COMMENT='【共用】审计总账(只 INSERT)';
CREATE TABLE input_guard_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
trace_id VARCHAR(64) NOT NULL,
session_id VARCHAR(64) NULL,
agent_type ENUM('customer','advisor','analyst','risk') NOT NULL,
actor_id VARCHAR(64) NOT NULL,
guard_type ENUM('prompt_injection','oversize','illegal_param','rate_limit') NOT NULL,
raw_excerpt VARCHAR(1024) NULL,
action ENUM('blocked','sanitized','passed') NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_session (session_id),
KEY idx_time (created_at)
) ENGINE=InnoDB COMMENT='【共用】输入安全防护';
CREATE TABLE customer_advisor_rel (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id VARCHAR(64) NOT NULL,
advisor_id VARCHAR(64) NOT NULL,
rel_status ENUM('active','transferred','closed') NOT NULL DEFAULT 'active',
effective_from DATE NOT NULL,
effective_to DATE NULL,
synced_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE KEY uk_customer_advisor (customer_id, advisor_id, effective_from),
KEY idx_advisor (advisor_id, rel_status)
) ENGINE=InnoDB COMMENT='【共用】客户-代理人归属(Core 同步)';
-- =============================================================================
-- 🟡 第二批:跨 Agent 交换(5 张)
-- =============================================================================
CREATE TABLE customer_profile_l1 (
customer_id VARCHAR(64) NOT NULL PRIMARY KEY,
style_tags JSON NULL,
style_questionnaire JSON NULL,
allocation_plan JSON NULL,
behavior_tags JSON NULL,
attribution_pref VARCHAR(32) NULL,
version INT UNSIGNED NOT NULL DEFAULT 1,
updated_by ENUM('customer_agent','system') NOT NULL DEFAULT 'customer_agent',
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB COMMENT='【交换】L1 客户画像 · 客户 Agent 写';
CREATE TABLE customer_profile_l2 (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id VARCHAR(64) NOT NULL,
advisor_id VARCHAR(64) NOT NULL,
asset_snapshot JSON NULL,
demands JSON NULL,
follow_up_todos JSON NULL,
service_tags JSON NULL,
source_session_id VARCHAR(64) NULL,
version INT UNSIGNED NOT NULL DEFAULT 1,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
UNIQUE KEY uk_customer_advisor (customer_id, advisor_id),
KEY idx_advisor (advisor_id)
) ENGINE=InnoDB COMMENT='【交换】L2 服务画像 · 代理人 Agent 写';
CREATE TABLE customer_profile_l3 (
customer_id VARCHAR(64) NOT NULL PRIMARY KEY,
monitor_tier ENUM('normal','watch','high') NOT NULL DEFAULT 'normal',
risk_score SMALLINT UNSIGNED NULL,
score_dimensions JSON NULL,
monitor_tags JSON NULL,
last_alert_id VARCHAR(64) NULL,
computed_at DATETIME(3) NOT NULL,
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB COMMENT='【交换】L3 监测画像 · 风控 Agent 写';
CREATE TABLE risk_alert (
alert_id VARCHAR(64) NOT NULL PRIMARY KEY,
trace_id VARCHAR(64) NOT NULL,
customer_id VARCHAR(64) NOT NULL,
trade_id VARCHAR(64) NULL,
alert_type ENUM('large_amount','freq_trade','suitability','aml','pattern') NOT NULL,
triggered_rules JSON NOT NULL,
risk_score SMALLINT UNSIGNED NULL,
status ENUM('pending_review','confirmed_normal','confirmed_suspicious','reported') NOT NULL DEFAULT 'pending_review',
payload JSON NOT NULL,
handler_id VARCHAR(64) NULL,
handler_result VARCHAR(64) NULL,
handler_comment VARCHAR(512) NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
handled_at DATETIME(3) NULL,
KEY idx_status_time (status, created_at),
KEY idx_customer (customer_id, created_at),
KEY idx_type (alert_type, created_at)
) ENGINE=InnoDB COMMENT='【交换】预警单 · 风控写 / 分析读';
CREATE TABLE risk_suitability_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
trace_id VARCHAR(64) NOT NULL,
customer_id VARCHAR(64) NOT NULL,
product_id VARCHAR(64) NOT NULL,
product_name VARCHAR(128) NULL COMMENT '判定时产品名快照',
customer_risk_level CHAR(2) NOT NULL COMMENT 'L0 C1~C5',
product_risk_level CHAR(2) NOT NULL COMMENT '产品最低 R1~R5',
investor_category ENUM('ordinary','professional','professional_pending') NOT NULL DEFAULT 'ordinary',
match_result ENUM(
'allowed','allowed_with_disclosure','forbidden',
'risk_expired','professional_exempt'
) NOT NULL COMMENT '与 Core check_suitability 输出一致',
mismatch_type ENUM(
'none','risk_level','risk_expired','age_branch_confirm',
'min_subscribe','not_found','professional_exempt'
) NOT NULL DEFAULT 'none' COMMENT '阻断/特殊处理原因分类',
is_matched TINYINT(1) NOT NULL,
is_blocked TINYINT(1) NOT NULL DEFAULT 0,
requires_disclosure TINYINT(1) NOT NULL DEFAULT 0,
needs_branch_confirm TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'FM-01 年龄≥70 买 R3+',
risk_was_expired TINYINT(1) NOT NULL DEFAULT 0 COMMENT '判定时风评是否已过期',
block_reason VARCHAR(512) NULL COMMENT '对人可读原因',
block_response_code VARCHAR(32) NULL COMMENT 'API 机器码,如 SUIT_RISK_MISMATCH',
check_source ENUM('r02_trade','r02_chat','c11_inquiry','manual','platform') NOT NULL DEFAULT 'r02_trade',
actor_id VARCHAR(64) NOT NULL COMMENT '发起者 customer_id / staff_id / svc-trade-suitability',
request_ref VARCHAR(64) NULL COMMENT '交易单号 / session_id',
profile_l1_version INT UNSIGNED NULL,
rule_refs JSON NULL COMMENT '依据规则,如 ["JR-AST-012","FM-03"]',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
KEY idx_trace (trace_id),
KEY idx_customer (customer_id, created_at),
KEY idx_product (product_id, created_at),
KEY idx_blocked (is_blocked, created_at),
KEY idx_match (match_result, created_at),
KEY idx_mismatch (mismatch_type, created_at)
) ENGINE=InnoDB COMMENT='【交换】适当性记录 · 风控写 / 客户+代理人读 · 字段契约见 07-risk_suitability_log说明.md';