2026-09-05 17:09:21 +08:00
|
|
|
|
-- =============================================================================
|
|
|
|
|
|
-- 多 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),
|
2026-09-12 14:27:37 +08:00
|
|
|
|
KEY idx_created (created_at),
|
|
|
|
|
|
UNIQUE KEY uk_agent_message_session_seq (session_id, seq_no)
|
2026-09-05 17:09:21 +08:00
|
|
|
|
) 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,
|
2026-09-07 11:15:30 +08:00
|
|
|
|
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 '阻断/特殊处理原因分类',
|
2026-09-05 17:09:21 +08:00
|
|
|
|
is_matched TINYINT(1) NOT NULL,
|
|
|
|
|
|
is_blocked TINYINT(1) NOT NULL DEFAULT 0,
|
2026-09-07 11:15:30 +08:00
|
|
|
|
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',
|
2026-09-08 21:44:16 +08:00
|
|
|
|
check_source ENUM('r02_trade','r02_chat','c11_inquiry','manual','platform') NOT NULL DEFAULT 'r02_trade',
|
2026-09-07 11:15:30 +08:00
|
|
|
|
actor_id VARCHAR(64) NOT NULL COMMENT '发起者 customer_id / staff_id / svc-trade-suitability',
|
|
|
|
|
|
request_ref VARCHAR(64) NULL COMMENT '交易单号 / session_id',
|
2026-09-05 17:09:21 +08:00
|
|
|
|
profile_l1_version INT UNSIGNED NULL,
|
2026-09-07 11:15:30 +08:00
|
|
|
|
rule_refs JSON NULL COMMENT '依据规则,如 ["JR-AST-012","FM-03"]',
|
2026-09-05 17:09:21 +08:00
|
|
|
|
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
2026-09-07 11:15:30 +08:00
|
|
|
|
KEY idx_trace (trace_id),
|
2026-09-05 17:09:21 +08:00
|
|
|
|
KEY idx_customer (customer_id, created_at),
|
|
|
|
|
|
KEY idx_product (product_id, created_at),
|
2026-09-07 11:15:30 +08:00
|
|
|
|
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';
|