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

215 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 多 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)
) 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') 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';