Files
Mutual_Fund/sql/schema.sql
T
2026-09-14 19:00:48 +08:00

759 lines
47 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.
-- =====================================================================
-- 智能公募基金系统 · MySQL 建表脚本(36 张,见开发计划 §3.1,与 model/ 目录 ORM 对齐)
-- 执行:mysql --default-character-set=utf8mb4 -u<user> -p <database> < sql/schema.sql
-- 约定:InnoDB / utf8mb4;采用"逻辑外键"(不建物理 FK,便于 Mock 数据灌入),
-- 注释即文档,NL2SQL 以 COMMENT 注入 Schema。
-- 维护:新增/调整 ORM 模型时同步更新本脚本(01-24 基础业务域,25-36 扩展域)。
-- =====================================================================
SET NAMES utf8mb4;
-- =====================================================================
-- 重建模式:执行本脚本前清理已有表
-- 注意:以下语句会删除当前数据库中的业务数据,仅用于本地/测试环境重建。
-- =====================================================================
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS portfolio_benchmark;
DROP TABLE IF EXISTS fund_performance;
DROP TABLE IF EXISTS memory_unit;
DROP TABLE IF EXISTS sys_config;
DROP TABLE IF EXISTS sys_message;
DROP TABLE IF EXISTS sys_announcement;
DROP TABLE IF EXISTS audit_log;
DROP TABLE IF EXISTS customer_profile_change_log;
DROP TABLE IF EXISTS customer_relation;
DROP TABLE IF EXISTS fin_knowledge_meta;
DROP TABLE IF EXISTS conversation_archive;
DROP TABLE IF EXISTS biz_work_order;
DROP TABLE IF EXISTS risk_rule;
DROP TABLE IF EXISTS fin_risk_alert;
DROP TABLE IF EXISTS ops_question;
DROP TABLE IF EXISTS ops_questionnaire;
DROP TABLE IF EXISTS fin_risk_assessment;
DROP TABLE IF EXISTS fin_holdings;
DROP TABLE IF EXISTS fin_transaction;
DROP TABLE IF EXISTS trade_order;
DROP TABLE IF EXISTS fund_nav_history;
DROP TABLE IF EXISTS fin_product;
DROP TABLE IF EXISTS fin_customer_profile;
DROP TABLE IF EXISTS sys_user;
DROP TABLE IF EXISTS nl2sql_query_history;
DROP TABLE IF EXISTS nl2sql_sensitive_field;
DROP TABLE IF EXISTS nl2sql_role_column_permission;
DROP TABLE IF EXISTS nl2sql_role_table_permission;
DROP TABLE IF EXISTS nl2sql_query_role;
DROP TABLE IF EXISTS event_log;
DROP TABLE IF EXISTS advisor_visit_record;
DROP TABLE IF EXISTS advisor_report;
DROP TABLE IF EXISTS advisor_draft;
DROP TABLE IF EXISTS advisor_todo;
DROP TABLE IF EXISTS sensitive_word;
DROP TABLE IF EXISTS fin_account;
SET FOREIGN_KEY_CHECKS = 1;
-- ---------------------------------------------------------------------
-- 01 统一用户表(客户 + 员工共用)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sys_user (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(64) NOT NULL COMMENT '登录账号,唯一',
password_hash VARCHAR(255) NOT NULL COMMENT 'bcrypt 哈希,不存明文',
salt VARCHAR(32) NULL COMMENT '口令盐',
real_name VARCHAR(32) NULL COMMENT '真实姓名',
phone VARCHAR(20) NOT NULL COMMENT '手机号(脱敏展示用)',
user_type VARCHAR(16) NOT NULL DEFAULT 'CUSTOMER' COMMENT 'CUSTOMER=客户 / EMPLOYEE=员工 / ADMIN=管理员',
employee_role VARCHAR(32) NULL COMMENT '员工角色:投顾/风控专员/客户经理/管理员',
customer_level VARCHAR(16) NULL COMMENT '客户等级:普通/金卡/白金/钻石/私行',
status VARCHAR(16) NOT NULL DEFAULT '正常' COMMENT '账号状态:正常/禁用/冻结',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_username (username),
KEY idx_phone (phone),
KEY idx_user_type (user_type)
) COMMENT='统一用户表(客户与员工共用账号体系)';
-- ---------------------------------------------------------------------
-- 02 客户画像主表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_customer_profile (
customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID,一对一关联 sys_user.id',
risk_level VARCHAR(16) NULL COMMENT '风险等级:R1-R5(R1 最保守,R5 最激进,与产品 risk_level 对齐)',
risk_score INT NULL COMMENT '风险评分 0-100,越高越激进',
investment_experience VARCHAR(16) NULL COMMENT '投资经验:0-1/1-3/3-5/5-10/10年以上',
annual_income_range VARCHAR(32) NULL COMMENT '年收入区间',
total_assets DECIMAL(18,2) NULL COMMENT '总资产(元)',
asset_allocation JSON NULL COMMENT '资产配置偏好 {股票:30,债券:40,...}',
product_preference JSON NULL COMMENT '产品偏好 {基金:[混合型,债券型]}',
customer_level VARCHAR(16) NULL COMMENT '客户等级(运营可调整)',
confidence_score DECIMAL(5,2) NOT NULL DEFAULT 0.50 COMMENT '画像置信度 0-1,用于推荐权重',
profile_version INT NOT NULL DEFAULT 1 COMMENT '画像版本号(重建时递增)',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (customer_id),
KEY idx_risk_level (risk_level),
KEY idx_total_assets (total_assets)
) COMMENT='客户画像主表(RAG/GraphRAG 个性化推荐核心上下文)';
-- ---------------------------------------------------------------------
-- 03 公募基金产品表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_product (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
product_code VARCHAR(32) NOT NULL COMMENT '基金代码,唯一,如 F000001',
product_name VARCHAR(128) NOT NULL COMMENT '基金名称',
product_type VARCHAR(32) NOT NULL COMMENT '类型:货币型/债券型/混合型/股票型/指数型/QDII',
risk_level VARCHAR(8) NOT NULL COMMENT '风险等级 R1-R5',
expected_return DECIMAL(7,4) NULL COMMENT '预期年化收益率(%)',
nav DECIMAL(12,6) NULL COMMENT '最新单位净值',
nav_date DATE NULL COMMENT '净值日期',
fee_rate DECIMAL(6,4) NOT NULL DEFAULT 0.0000 COMMENT '申购费率(%)',
term_days INT NOT NULL DEFAULT 0 COMMENT '产品期限天数,0=活期(开放申赎)',
fund_manager VARCHAR(64) NULL COMMENT '基金经理',
status VARCHAR(16) NOT NULL DEFAULT '在售' COMMENT '在售/暂停/到期/清盘',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_product_code (product_code),
KEY idx_type_status (product_type, status),
KEY idx_risk (risk_level)
) COMMENT='公募基金产品表';
-- ---------------------------------------------------------------------
-- 04 基金净值历史
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fund_nav_history (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT UNSIGNED NOT NULL COMMENT '产品ID',
nav_date DATE NOT NULL COMMENT '净值日期',
unit_nav DECIMAL(12,6) NOT NULL COMMENT '单位净值',
accumulated_nav DECIMAL(12,6) NULL COMMENT '累计净值',
daily_growth DECIMAL(8,4) NULL COMMENT '日增长率(%)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_product_date (product_id, nav_date)
) COMMENT='基金净值历史(业绩指标/走势图数据源)';
-- ---------------------------------------------------------------------
-- 05 交易申请单(申购/赎回主表:风控挂起→处置→回写的状态机载体)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS trade_order (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_no VARCHAR(32) NOT NULL COMMENT '申请单号,全局唯一',
customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID',
product_id BIGINT UNSIGNED NOT NULL COMMENT '产品ID',
advisor_id BIGINT UNSIGNED NULL COMMENT '经办投顾(代下/调仓)',
order_type VARCHAR(16) NOT NULL COMMENT '申购/赎回',
amount DECIMAL(18,2) NULL COMMENT '申请金额(元)',
shares DECIMAL(18,4) NULL COMMENT '申请/成交份额',
nav DECIMAL(12,6) NULL COMMENT '确认净值(确认时回填)',
fee DECIMAL(12,2) NULL COMMENT '手续费(确认时回填)',
status VARCHAR(16) NOT NULL DEFAULT '待确认' COMMENT '待确认/风控挂起/已确认/已撤单/失败',
risk_alert_id BIGINT UNSIGNED NULL COMMENT '命中风控预警ID(挂起时关联)',
cancel_reason VARCHAR(255) NULL COMMENT '撤单/失败原因',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
confirm_time DATETIME NULL COMMENT '确认时间',
KEY idx_customer (customer_id, status),
KEY idx_status (status),
UNIQUE KEY uk_order_no (order_no)
) COMMENT='交易申请单(风控阻断闭环主表,状态机单一来源)';
-- ---------------------------------------------------------------------
-- 06 成交流水
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_transaction (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
transaction_no VARCHAR(32) NOT NULL COMMENT '流水号,全局唯一',
order_id BIGINT UNSIGNED NULL COMMENT '关联申请单 ID',
customer_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
operator_id BIGINT UNSIGNED NULL COMMENT '经办投顾',
transaction_type VARCHAR(16) NOT NULL COMMENT '申购/赎回/分红/定投',
amount DECIMAL(18,2) NOT NULL COMMENT '交易金额(元)',
shares DECIMAL(18,4) NULL COMMENT '成交份额',
nav DECIMAL(12,6) NULL COMMENT '成交净值',
fee DECIMAL(12,2) NOT NULL DEFAULT 0 COMMENT '手续费(元)',
status VARCHAR(16) NOT NULL DEFAULT '已确认' COMMENT '待确认/已确认/已撤单/失败',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_transaction_no (transaction_no),
KEY idx_customer_time (customer_id, create_time),
KEY idx_product (product_id)
) COMMENT='成交流水表(成交后落库)';
-- ---------------------------------------------------------------------
-- 07 持仓表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_holdings (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '持仓客户',
product_id BIGINT UNSIGNED NOT NULL COMMENT '持有产品',
shares DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '持有份额',
cost_amount DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '成本金额(元)',
current_value DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '当前市值(元,持仓重估任务更新)',
profit_loss DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '盈亏金额(元)',
profit_ratio DECIMAL(8,4) NOT NULL DEFAULT 0 COMMENT '盈亏比例(%)',
status VARCHAR(16) NOT NULL DEFAULT '持有中' COMMENT '持有中/已清仓',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_customer_product (customer_id, product_id),
KEY idx_status (status)
) COMMENT='持仓表(当前/历史持仓快照)';
-- ---------------------------------------------------------------------
-- 08 风险评估记录
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_risk_assessment (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '被评估客户',
assessment_date DATE NOT NULL COMMENT '评估日期',
question_version VARCHAR(16) NULL COMMENT '问卷版本(题目变更后按版本追溯)',
total_score INT NOT NULL COMMENT '总分 0-100',
risk_level VARCHAR(16) NOT NULL COMMENT '评定:R1-R5(R1 最保守,R5 最激进)',
answers JSON NULL COMMENT '答题详情 [{q:1,a:B,score:10}]',
assessor_type VARCHAR(16) NOT NULL DEFAULT 'AI评估' COMMENT 'AI评估/人工评估',
valid_until DATE NOT NULL COMMENT '有效期至(默认 +1年,监管一年一评)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_customer_date (customer_id, assessment_date)
) COMMENT='风险评估记录表(购买前问卷确认客户等级)';
-- ---------------------------------------------------------------------
-- 09 问卷模板
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ops_questionnaire (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL COMMENT '问卷名称,如 风险测评问卷',
q_type VARCHAR(16) NOT NULL COMMENT '风险测评/投资者分类',
version VARCHAR(16) NOT NULL DEFAULT 'v1' COMMENT '版本号',
status VARCHAR(16) NOT NULL DEFAULT '启用' COMMENT '启用/停用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) COMMENT='问卷模板表';
-- ---------------------------------------------------------------------
-- 10 题目表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS ops_question (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
questionnaire_id BIGINT UNSIGNED NOT NULL COMMENT '所属问卷',
question_no INT NOT NULL COMMENT '题号',
content VARCHAR(512) NOT NULL COMMENT '题干',
option_json JSON NULL COMMENT '选项配置 [{label:A,text:...}]',
score_json JSON NULL COMMENT '选项分值 {A:10,B:8,...}',
sort INT NOT NULL DEFAULT 0,
UNIQUE KEY uk_q_no (questionnaire_id, question_no)
) COMMENT='问卷题目表(题目/选项/分值可运营配置)';
-- ---------------------------------------------------------------------
-- 11 风控预警表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_risk_alert (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '被预警客户',
order_id BIGINT UNSIGNED NULL COMMENT '关联交易申请单(挂起时必填)',
alert_type VARCHAR(32) NOT NULL COMMENT '大额交易/频繁交易/快进快出/疑洗钱/适当性异常等',
alert_level VARCHAR(8) NOT NULL COMMENT '低(蓝)/中(黄)/高(红)',
trigger_detail TEXT NULL COMMENT '触发详情(命中规则、AI 推理过程)',
transaction_ids JSON NULL COMMENT '关联交易 ID 列表',
confidence DECIMAL(5,2) NOT NULL DEFAULT 0.50 COMMENT '预警置信度',
status VARCHAR(16) NOT NULL DEFAULT '未处理' COMMENT '未处理/处理中/已确认/已排除',
handler_id BIGINT UNSIGNED NULL COMMENT '处理人(风控专员)',
handle_result TEXT NULL COMMENT '处置结论留痕',
handle_time DATETIME NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_status_level (status, alert_level),
KEY idx_customer (customer_id),
KEY idx_order (order_id)
) COMMENT='风控预警表(阻断后由风控专员在控制台处置)';
-- ---------------------------------------------------------------------
-- 12 风控规则表(规则引擎表驱动)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS risk_rule (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
rule_id VARCHAR(16) NOT NULL COMMENT '规则编号,如 R001',
rule_name VARCHAR(64) NOT NULL COMMENT '规则名称',
trigger_condition VARCHAR(512) NULL COMMENT '触发条件描述',
threshold JSON NULL COMMENT '阈值配置 {amount:50000,...}',
risk_level VARCHAR(8) NOT NULL DEFAULT '低' COMMENT '低/中/高',
weight DECIMAL(4,2) NOT NULL DEFAULT 1.00 COMMENT '规则权重(预警分级用)',
status VARCHAR(8) NOT NULL DEFAULT '启用' COMMENT '启用/停用(运营可调)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_rule_id (rule_id)
) COMMENT='风控规则表(20 条反洗钱/异常交易规则,驱动风控Agent)';
-- ---------------------------------------------------------------------
-- 13 通用业务工单表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS biz_work_order (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
work_order_no VARCHAR(32) NOT NULL COMMENT '工单编号,如 WO20260908xxxx',
order_type VARCHAR(32) NOT NULL COMMENT '产品申购/产品赎回/投顾签约/信息变更/投诉建议/风评重做/可疑交易上报',
sub_type VARCHAR(32) NULL COMMENT '子类型',
customer_id BIGINT UNSIGNED NULL COMMENT '关联客户',
submitter_id BIGINT UNSIGNED NULL COMMENT '提交人(客户或员工代办)',
handler_id BIGINT UNSIGNED NULL COMMENT '当前处理人(投顾/风控专员)',
current_node VARCHAR(32) NOT NULL DEFAULT '初审' COMMENT '初审/复核/完成',
priority VARCHAR(8) NOT NULL DEFAULT '普通' COMMENT '普通/紧急/特急',
status VARCHAR(16) NOT NULL DEFAULT '待处理' COMMENT '待处理/处理中/待审核/已完成/已驳回',
biz_content JSON NULL COMMENT '业务内容(按 order_type 结构各异)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_work_order_no (work_order_no),
KEY idx_handler_status (handler_id, status),
KEY idx_customer (customer_id)
) COMMENT='通用业务工单表(投标顾签约、可疑交易上报等流程载体)';
-- ---------------------------------------------------------------------
-- 14 会话归档表
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS conversation_archive (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
session_id VARCHAR(64) NOT NULL COMMENT '会话ID,同轮共用',
customer_id BIGINT UNSIGNED NULL COMMENT '关联客户ID',
user_id BIGINT UNSIGNED NOT NULL COMMENT '对话用户',
agent_type VARCHAR(32) NOT NULL COMMENT 'customer/advisor/risk/analyst',
role VARCHAR(16) NOT NULL COMMENT 'user/assistant/system',
content MEDIUMTEXT NULL COMMENT '对话内容',
tool_calls JSON NULL COMMENT '工具调用记录 [{"tool":"nl2sql",...}]',
message_id VARCHAR(64) NOT NULL COMMENT '消息唯一ID,用于归档幂等',
agent_run_id VARCHAR(64) NULL COMMENT 'Agent运行ID,用于调用链路追踪',
trace_id VARCHAR(64) NULL COMMENT '请求链路追踪ID',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_session (session_id),
KEY idx_user_time (user_id, create_time),
KEY idx_agent (agent_type),
UNIQUE KEY uk_session_message (session_id, message_id),
KEY idx_agent_run (agent_run_id)
) COMMENT='会话归档表(审计回溯 + Agent 持续学习素材)';
-- ---------------------------------------------------------------------
-- 15 知识元数据表(原文存 MySQL,替代 MinIO)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_knowledge_meta (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
knowledge_type VARCHAR(32) NOT NULL COMMENT '产品说明/政策法规/FAQ/操作指南/市场研报',
title VARCHAR(255) NOT NULL COMMENT '知识条目标题',
source_file VARCHAR(255) NULL COMMENT '来源文件名',
raw_content LONGTEXT NULL COMMENT '文档原文/切片(MinIO 替代方案)',
file_path VARCHAR(512) NULL COMMENT '本地上传原文件路径(若保留)',
milvus_collection VARCHAR(128) NULL COMMENT 'Milvus 向量集合名',
version VARCHAR(32) NOT NULL DEFAULT 'v1',
status VARCHAR(16) NOT NULL DEFAULT '有效' COMMENT '有效/过期/草稿',
expire_at DATETIME NULL COMMENT '过期时间(政策 1 年/产品说明半年)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY idx_type (knowledge_type),
KEY idx_status (status)
) COMMENT='金融知识元数据表(RAG 知识库目录 + 正文载体,Milvus source_id 关联本表)';
-- ---------------------------------------------------------------------
-- 16 客户-投顾关系表(签约状态驱动客服引导与投顾服务范围)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS customer_relation (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID',
advisor_id BIGINT UNSIGNED NOT NULL COMMENT '投顾ID',
assign_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间(注册自动分配)',
signed_time DATETIME NULL COMMENT '签约时间',
end_time DATETIME NULL COMMENT '关系结束时间',
status VARCHAR(16) NOT NULL DEFAULT '已分配' COMMENT '已分配/已签约/已结束',
CONSTRAINT ck_customer_relation_status CHECK (status IN ('已分配', '已签约', '已结束')),
reason VARCHAR(128) NULL COMMENT '结束/变更原因',
KEY idx_advisor (advisor_id, status),
KEY idx_customer (customer_id)
) COMMENT='客户-投顾关系表(状态驱动:签约后投顾Agent方案正式触达客户)';
-- ---------------------------------------------------------------------
-- 17 画像变更日志(冲突策略审计)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS customer_profile_change_log (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL,
tag VARCHAR(64) NULL COMMENT '标签名',
old_value VARCHAR(255) NULL COMMENT '旧值',
new_value VARCHAR(255) NULL COMMENT '新值',
source VARCHAR(32) NULL COMMENT '来源:风评问卷/行为推断/AI对话提取/用户自述/人工',
confidence DECIMAL(5,2) NULL COMMENT '新值置信度',
reason VARCHAR(255) NULL COMMENT '变更原因(冲突策略/人工修正)',
operator_id BIGINT UNSIGNED NULL COMMENT '操作人(人工修正时)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_customer (customer_id)
) COMMENT='画像变更审计(保留冲突记录与人工修正痕迹)';
-- ---------------------------------------------------------------------
-- 18 操作审计日志(企业级:谁在何时做了什么)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS audit_log (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NULL COMMENT '操作人',
username VARCHAR(64) NULL,
module VARCHAR(32) NOT NULL COMMENT 'auth/product/trade/risk/...',
action VARCHAR(64) NOT NULL COMMENT '操作动作',
target VARCHAR(128) NULL COMMENT '操作对象(单号/ID)',
detail TEXT NULL COMMENT '详情(JSON 字符串)',
ip VARCHAR(64) NULL,
trace_id VARCHAR(32) NULL COMMENT '链路号',
status VARCHAR(8) NOT NULL DEFAULT '成功' COMMENT '成功/失败',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user (user_id),
KEY idx_module_time (module, create_time)
) COMMENT='操作审计日志表(企业级合规留痕)';
-- ---------------------------------------------------------------------
-- 19 官网公告
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sys_announcement (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(128) NOT NULL,
content TEXT NULL,
status VARCHAR(16) NOT NULL DEFAULT '草稿' COMMENT '草稿/已发布',
publish_time DATETIME NULL,
expire_at DATETIME NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_status (status, publish_time)
) COMMENT='官网公告表';
-- ---------------------------------------------------------------------
-- 20 站内信/消息中心
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sys_message (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL COMMENT '收件人',
msg_type VARCHAR(32) NOT NULL COMMENT '推荐/调仓/风控/签约/系统',
title VARCHAR(128) NOT NULL,
content VARCHAR(512) NULL,
biz_id VARCHAR(64) NULL COMMENT '关联业务单号(订单/工单/预警)',
is_read TINYINT NOT NULL DEFAULT 0,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user_read (user_id, is_read)
) COMMENT='站内信/消息中心表(投顾触达客户通道)';
-- ---------------------------------------------------------------------
-- 21 运营参数表(免发版调整)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sys_config (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(64) NOT NULL COMMENT '键,如 high_net_worth_threshold',
config_value VARCHAR(255) NOT NULL COMMENT '值',
description VARCHAR(255) NULL COMMENT '说明',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_config_key (config_key)
) COMMENT='运营参数 KV 表(高净值门槛/偏离度阈值/风控开关等)';
-- ---------------------------------------------------------------------
-- 22 记忆单元表(记忆架构主体,见开发计划 §4.2)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS memory_unit (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '归属客户',
session_id VARCHAR(64) NULL COMMENT '产生该记忆的会话ID',
agent_run_id VARCHAR(64) NULL COMMENT '产生该记忆的Agent运行ID',
memory_type VARCHAR(32) NOT NULL COMMENT '记忆类型:PROFILE_FACT/PROFILE_CANDIDATE/CUSTOMER_PREFERENCE/INVESTMENT_GOAL/SERVICE_FACT/CUSTOMER_RELATION',
tag VARCHAR(64) NOT NULL COMMENT '标签名,如 risk_preference',
content VARCHAR(512) NOT NULL COMMENT '内容,如 偏好稳健型理财',
info_type VARCHAR(8) NOT NULL COMMENT 'FACT 客观事实 / OPINION 主观观点',
source VARCHAR(32) NOT NULL COMMENT 'user_confirmed/user_stated/ai_inferred/behavior_inference',
evidence_ref JSON NULL COMMENT '证据引用列表,如消息ID、交易ID或人工记录ID',
source_confidence DECIMAL(5,2) NOT NULL DEFAULT 0.20 COMMENT '来源初始置信度',
confidence DECIMAL(5,2) NOT NULL DEFAULT 0.20 COMMENT '当前置信度(动态)',
historical_accuracy DECIMAL(5,2) NOT NULL DEFAULT 0.50 COMMENT '历史准确性评分',
confidence_version VARCHAR(32) NULL COMMENT '置信度计算版本',
confidence_reason VARCHAR(255) NULL COMMENT '本次置信度评估原因',
confidence_update_time DATETIME NULL COMMENT '置信度最近计算时间',
evidence_count INT NOT NULL DEFAULT 0 COMMENT '证据数',
recall_count INT NOT NULL DEFAULT 0 COMMENT '召回数',
memory_version INT NOT NULL DEFAULT 1 COMMENT '记忆版本号',
update_time DATETIME NULL,
last_recall_time DATETIME NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(16) NOT NULL DEFAULT 'candidate' COMMENT 'candidate/confirmed/expired/rejected/archived',
valid_from DATETIME NULL COMMENT '记忆生效时间',
valid_until DATETIME NULL COMMENT '有效期',
last_verified_at DATETIME NULL COMMENT '最近确认或验证时间',
milvus_id VARCHAR(128) NULL COMMENT 'Milvus 向量记录ID',
graph_node_id VARCHAR(128) NULL COMMENT 'Neo4j 节点或关系ID',
milvus_sync_status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'Milvus同步状态:pending/success/failed',
neo4j_sync_status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'Neo4j同步状态:pending/success/failed',
sync_retry_count INT NOT NULL DEFAULT 0 COMMENT '三库同步重试次数',
last_sync_error VARCHAR(500) NULL COMMENT '最近一次同步错误',
next_retry_at DATETIME NULL COMMENT '下次同步重试时间',
last_synced_at DATETIME NULL COMMENT '最近一次同步成功时间',
KEY idx_customer_status (customer_id, status),
KEY idx_customer_type_status (customer_id, memory_type, status),
KEY idx_customer_tag_status (customer_id, tag, status),
KEY idx_session (session_id),
KEY idx_customer_session (customer_id, session_id),
KEY idx_milvus (milvus_id),
KEY idx_graph (graph_node_id)
) COMMENT='客户长期记忆主体表,向量镜像在 Milvus customer_memory,关系镜像在 Neo4j';
-- ---------------------------------------------------------------------
-- 23 基金业绩指标缓存(定时任务从净值计算)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fund_performance (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT UNSIGNED NOT NULL,
period VARCHAR(16) NOT NULL COMMENT '近1月/近3月/近6月/近1年/成立以来',
return_rate DECIMAL(10,4) NULL COMMENT '区间收益率(%)',
annual_volatility DECIMAL(10,4) NULL COMMENT '年化波动率(%)',
max_drawdown DECIMAL(10,4) NULL COMMENT '最大回撤(%)',
sharpe DECIMAL(10,4) NULL COMMENT '夏普比率',
calc_date DATE NOT NULL COMMENT '计算日期',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_product_period (product_id, period)
) COMMENT='基金业绩指标缓存(深度分析/多维对比数据源)';
-- ---------------------------------------------------------------------
-- 24 组合基准配置(再平衡参照系)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS portfolio_benchmark (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
risk_level VARCHAR(16) NOT NULL COMMENT '客户风险等级:R1-R5(R1 最保守,R5 最激进)',
target_allocation JSON NOT NULL COMMENT '目标配置 {货币:50,债券:40,股票:10}',
drift_threshold DECIMAL(5,2) NOT NULL DEFAULT 5.00 COMMENT '偏离阈值(%),超阈值触发调仓建议',
status VARCHAR(8) NOT NULL DEFAULT '启用' COMMENT '启用/停用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_risk_level (risk_level)
) COMMENT='组合基准配置表(投顾Agent 再平衡参照,运营可调整)';
-- =====================================================================
-- 以下为扩展域建表(25-36),与 model/ 目录 ORM 一一对齐
-- =====================================================================
-- ---------------------------------------------------------------------
-- 25 客户资金账户表(现金余额,一人一户)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fin_account (
customer_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID,一人一户,关联 sys_user.id',
balance DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '账户总余额(含冻结部分)',
frozen_amount DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '冻结金额,可用余额=balance-frozen_amount(不落库)',
currency VARCHAR(8) NOT NULL DEFAULT 'CNY' COMMENT '币种',
status VARCHAR(16) NOT NULL DEFAULT '正常' COMMENT '账户状态,默认正常',
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号(并发扣款校验)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (customer_id)
) COMMENT='客户资金账户表(现金余额,申购扣款/赎回入账的账务载体)';
-- ---------------------------------------------------------------------
-- 26 敏感词库表(合规拦截唯一来源)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS sensitive_word (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
word VARCHAR(128) NOT NULL COMMENT '敏感词',
category VARCHAR(32) NOT NULL COMMENT '敏感词分类(工作台可配置)',
level VARCHAR(8) NOT NULL DEFAULT '高' COMMENT '级别,默认高',
status VARCHAR(8) NOT NULL DEFAULT '启用' COMMENT '启用/停用',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_word (word)
) COMMENT='敏感词库表(工作台与Agent同源,合规拦截唯一来源)';
-- ---------------------------------------------------------------------
-- 27 投顾待办表(事件/定时/计算三类来源统一承载)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS advisor_todo (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
todo_type VARCHAR(32) NOT NULL COMMENT '待办类型(事件/定时/计算来源的细分类型)',
customer_id BIGINT UNSIGNED NULL COMMENT '关联客户(可为空)',
advisor_id BIGINT UNSIGNED NOT NULL COMMENT '所属投顾',
source VARCHAR(32) NOT NULL COMMENT '来源:事件/定时/计算',
biz_id VARCHAR(64) NULL COMMENT '关联业务ID(与 todo_type 组合定位业务)',
priority VARCHAR(8) NOT NULL DEFAULT '普通' COMMENT '普通/紧急/特急',
status VARCHAR(16) NOT NULL DEFAULT '待处理' COMMENT '待办状态,默认待处理',
due_at DATETIME NULL COMMENT '截止时间',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
handle_time DATETIME NULL COMMENT '处理时间',
UNIQUE KEY uk_todo (todo_type, customer_id, biz_id),
KEY idx_advisor_status (advisor_id, status)
) COMMENT='投顾待办表(事件/定时/计算三类来源统一承载,uk_todo 幂等防重复建待办)';
-- ---------------------------------------------------------------------
-- 28 投顾 Agent 草稿表(不存 sent,不生成交易指令)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS advisor_draft (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
draft_id VARCHAR(64) NOT NULL COMMENT '草稿ID,全局唯一',
customer_id BIGINT UNSIGNED NOT NULL COMMENT '目标客户',
advisor_id BIGINT UNSIGNED NOT NULL COMMENT '所属投顾',
intent VARCHAR(32) NOT NULL COMMENT '报告意图,如 调仓建议',
title VARCHAR(128) NOT NULL COMMENT '草稿标题',
content TEXT NOT NULL COMMENT '报告正文',
structured_data JSON NULL COMMENT '结构化数据(调仓明细等)',
status VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT '草稿状态,默认draft',
deviation DECIMAL(10,4) NULL COMMENT '组合偏离度(%)',
disclaimer_ok TINYINT(1) NOT NULL DEFAULT 0 COMMENT '免责声明确认',
warning VARCHAR(512) NULL COMMENT '合规提示/警告信息',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_draft_id (draft_id),
CONSTRAINT ck_advisor_draft_status CHECK (status IN ('draft', 'discarded')),
KEY idx_customer (customer_id),
KEY idx_advisor (advisor_id),
KEY idx_intent (intent),
KEY idx_status (status),
KEY idx_create_time (create_time)
) COMMENT='投顾 Agent 草稿(不存 sent,不生成交易指令)';
-- ---------------------------------------------------------------------
-- 29 建议报告表(工作台本地镜像:sent 状态 + 编辑/发送留痕)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS advisor_report (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
report_id VARCHAR(64) NOT NULL COMMENT '报告ID,全局唯一',
draft_id VARCHAR(64) NOT NULL COMMENT '来源草稿ID(advisor_draft.draft_id)',
customer_id BIGINT UNSIGNED NOT NULL COMMENT '目标客户',
advisor_id BIGINT UNSIGNED NOT NULL COMMENT '发送投顾',
intent VARCHAR(32) NOT NULL COMMENT '报告意图(继承草稿)',
title VARCHAR(128) NULL COMMENT '报告标题',
content TEXT NULL COMMENT '报告正文',
edit_history JSON NULL COMMENT '编辑留痕(JSON数组)',
send_status VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT 'draft/sent/discarded,sent 为工作台本地状态不回写投顾Agent',
send_time DATETIME NULL COMMENT '发送时间',
send_by BIGINT UNSIGNED NULL COMMENT '发送人',
msg_id BIGINT UNSIGNED NULL COMMENT '发送后落 sys_message 的站内信ID',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_report_id (report_id),
KEY idx_customer (customer_id),
KEY idx_advisor (advisor_id),
KEY idx_send_status (send_status)
) COMMENT='建议报告表(工作台本地镜像,承载 sent 状态与发送/编辑留痕)';
-- ---------------------------------------------------------------------
-- 30 投顾回访记录表(人工留痕归档)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS advisor_visit_record (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id BIGINT UNSIGNED NOT NULL COMMENT '回访客户',
advisor_id BIGINT UNSIGNED NOT NULL COMMENT '回访投顾',
visit_type VARCHAR(32) NOT NULL COMMENT '回访类型',
visit_time DATETIME NOT NULL COMMENT '回访时间',
summary TEXT NULL COMMENT '回访纪要',
audio_url VARCHAR(512) NULL COMMENT '录音文件地址',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_customer (customer_id),
KEY idx_advisor (advisor_id)
) COMMENT='投顾回访记录表(人工留痕归档,不触发Agent记忆抽取)';
-- ---------------------------------------------------------------------
-- 31 事件日志表(事件双写落库,消费以 event_id 幂等)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS event_log (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
event_id VARCHAR(64) NOT NULL COMMENT '事件ID,全局唯一,消费幂等键',
event_name VARCHAR(64) NOT NULL COMMENT '事件名',
payload JSON NULL COMMENT '事件负载',
trace_id VARCHAR(64) NULL COMMENT '请求链路追踪ID',
status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '消费状态,默认pending',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
consume_time DATETIME NULL COMMENT '消费完成时间',
UNIQUE KEY uk_event_id (event_id),
KEY idx_event_name (event_name),
KEY idx_status (status)
) COMMENT='事件日志表(事件双写落库,Pub/Sub 仅作实时通知,消费幂等)';
-- ---------------------------------------------------------------------
-- 32 NL2SQL 查询角色(按 sys_user.employee_role 映射)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nl2sql_query_role (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
role_code VARCHAR(64) NOT NULL COMMENT '角色编码,全局唯一',
role_name VARCHAR(128) NOT NULL COMMENT '角色名称',
employee_role VARCHAR(32) NOT NULL COMMENT '对应 sys_user.employee_role,一对一映射',
can_query TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否允许 NL2SQL 查询:0/1',
max_rows BIGINT NOT NULL DEFAULT 1000 COMMENT '单次查询最大返回行数',
daily_quota BIGINT NOT NULL DEFAULT 0 COMMENT '每日查询配额',
status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/inactive',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_role_code (role_code),
UNIQUE KEY uk_employee_role (employee_role),
CONSTRAINT ck_nl2sql_role_can_query CHECK (can_query IN (0, 1)),
CONSTRAINT ck_nl2sql_role_status CHECK (status IN ('active', 'inactive')),
KEY idx_status (status)
) COMMENT='NL2SQL 查询角色,按 sys_user.employee_role 映射';
-- ---------------------------------------------------------------------
-- 33 NL2SQL 角色的表级 + 行级权限
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nl2sql_role_table_permission (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(nl2sql_query_role.id)',
table_name VARCHAR(128) NOT NULL COMMENT '授权表名',
permission VARCHAR(16) NOT NULL DEFAULT 'SELECT' COMMENT '授权动作,仅 SELECT',
row_scope_type VARCHAR(32) NOT NULL DEFAULT 'none' COMMENT '行级范围:none/customer_ids/product_ids',
row_scope_column VARCHAR(128) NULL COMMENT '行级过滤列(如 customer_id)',
status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/inactive',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT ck_nl2sql_table_permission CHECK (permission = 'SELECT'),
CONSTRAINT ck_nl2sql_row_scope_type CHECK (row_scope_type IN ('none', 'customer_ids', 'product_ids')),
CONSTRAINT ck_nl2sql_table_status CHECK (status IN ('active', 'inactive')),
KEY idx_role (role_id),
KEY idx_status (status)
) COMMENT='NL2SQL 查询角色的表和行级权限';
-- ---------------------------------------------------------------------
-- 34 NL2SQL 角色的字段权限
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nl2sql_role_column_permission (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(nl2sql_query_role.id)',
table_name VARCHAR(128) NOT NULL COMMENT '表名',
column_name VARCHAR(128) NOT NULL COMMENT '列名',
access_mode VARCHAR(16) NOT NULL DEFAULT 'allow' COMMENT 'allow/deny/mask',
mask_type VARCHAR(32) NULL COMMENT '脱敏类型(access_mode=mask 时生效)',
status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/inactive',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT ck_nl2sql_column_access_mode CHECK (access_mode IN ('allow', 'deny', 'mask')),
CONSTRAINT ck_nl2sql_column_status CHECK (status IN ('active', 'inactive')),
KEY idx_role (role_id),
KEY idx_status (status)
) COMMENT='NL2SQL 查询角色的字段权限';
-- ---------------------------------------------------------------------
-- 35 NL2SQL 全局敏感字段规则
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nl2sql_sensitive_field (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(128) NOT NULL COMMENT '表名',
column_name VARCHAR(128) NOT NULL COMMENT '列名',
mask_type VARCHAR(32) NOT NULL DEFAULT 'partial' COMMENT '脱敏方式,如 partial',
status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/inactive',
description VARCHAR(255) NULL COMMENT '规则说明',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT ck_nl2sql_sensitive_status CHECK (status IN ('active', 'inactive')),
KEY idx_table_col (table_name, column_name),
KEY idx_status (status)
) COMMENT='NL2SQL 全局敏感字段规则';
-- ---------------------------------------------------------------------
-- 36 NL2SQL 查询归档(不保存完整结果行)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS nl2sql_query_history (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
query_id VARCHAR(64) NOT NULL COMMENT '查询ID,全局唯一',
user_id BIGINT UNSIGNED NOT NULL COMMENT '发起用户',
session_id VARCHAR(64) NULL COMMENT '会话ID',
caller_agent VARCHAR(64) NULL COMMENT '调用方Agent标识',
question TEXT NOT NULL COMMENT '自然语言问题',
generated_sql TEXT NULL COMMENT '生成的SQL(未执行则为空)',
access_tables JSON NULL COMMENT '实际访问的表列表',
status VARCHAR(16) NOT NULL COMMENT 'success/failed/blocked/timeout',
error_code VARCHAR(64) NULL COMMENT '错误码',
error_message VARCHAR(512) NULL COMMENT '错误信息',
row_count BIGINT NOT NULL DEFAULT 0 COMMENT '返回行数',
truncated TINYINT(1) NOT NULL DEFAULT 0 COMMENT '结果是否被截断',
elapsed_ms FLOAT NULL COMMENT '耗时(毫秒)',
trace_id VARCHAR(64) NULL COMMENT '请求链路追踪ID',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_query_id (query_id),
CONSTRAINT ck_nl2sql_history_status CHECK (status IN ('success', 'failed', 'blocked', 'timeout')),
KEY idx_user (user_id),
KEY idx_session (session_id),
KEY idx_caller_agent (caller_agent),
KEY idx_status (status),
KEY idx_trace (trace_id),
KEY idx_create_time (create_time)
) COMMENT='NL2SQL 查询归档,不保存完整结果行';