- 创建10个微服务目录结构和Maven多模块配置 - 完成15张MySQL 5.7表设计和初始化数据(40意图+8话术分类+管理员) - 实现common模块:Result、PageResult、异常处理、MyBatisPlus/Redis/RabbitMQ/跨域配置 - 实现BaseEntity、AutoFillHandler、JsonUtils、JsonTypeHandler - 配置API Gateway路由和全部服务的application.yml - 添加docker-compose.yml(MySQL+Redis+RabbitMQ)
460 lines
36 KiB
SQL
460 lines
36 KiB
SQL
-- ============================================================
|
||
-- 第九联盟AI坐席辅助系统 - 数据库初始化脚本
|
||
-- MySQL 5.7适配版
|
||
-- ============================================================
|
||
|
||
-- 创建数据库
|
||
CREATE DATABASE IF NOT EXISTS `ai_assistant` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
USE `ai_assistant`;
|
||
|
||
-- ============================================================
|
||
-- 企微会话存档消息表 (archive_messages)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `archive_messages` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`msgid` VARCHAR(255) NOT NULL COMMENT '企微消息唯一ID',
|
||
`seq` BIGINT(20) NOT NULL COMMENT '存档序列号,用于增量拉取',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`action` VARCHAR(32) DEFAULT 'send' COMMENT 'send/recall/agree/disagree',
|
||
`from_user` VARCHAR(128) NOT NULL COMMENT '发送者userid',
|
||
`from_role` VARCHAR(32) NOT NULL COMMENT '发送者角色: INTERNAL-企业内部成员 EXTERNAL-外部联系人 SYSTEM-系统',
|
||
`to_user` VARCHAR(128) COMMENT '接收者userid(单聊)',
|
||
`tolist` TEXT COMMENT '接收者列表(群聊),JSON数组字符串',
|
||
`roomid` VARCHAR(255) COMMENT '群聊ID(群聊时有值)',
|
||
`msgtype` VARCHAR(64) NOT NULL COMMENT 'text/image/voice/video/file/link/location/weapp/chatrecord/voip',
|
||
`msgtime` BIGINT(20) NOT NULL COMMENT '消息发送时间,UTC毫秒时间戳',
|
||
`content` LONGTEXT COMMENT '文本消息内容(长文本使用LONGTEXT)',
|
||
`media_data` TEXT COMMENT '媒体消息元数据(sdkfileid/文件大小/时长等),JSON字符串',
|
||
`session_id` VARCHAR(128) COMMENT '关联的会话ID(业务生成)',
|
||
`decrypt_status` TINYINT DEFAULT 1 COMMENT '解密状态: 1成功 2失败',
|
||
`decrypt_error` VARCHAR(512) COMMENT '解密失败原因',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_msgid_corp` (`msgid`, `corp_id`) COMMENT '消息ID+企业ID唯一',
|
||
INDEX `idx_seq` (`seq`) COMMENT '序列号索引,用于增量拉取',
|
||
INDEX `idx_session_id` (`session_id`) COMMENT '会话ID索引',
|
||
INDEX `idx_from_user_msgtime` (`from_user`, `msgtime`) COMMENT '发送者+时间索引',
|
||
INDEX `idx_to_user_msgtime` (`to_user`, `msgtime`) COMMENT '接收者+时间索引',
|
||
INDEX `idx_roomid_msgtime` (`roomid`, `msgtime`) COMMENT '群聊ID+时间索引',
|
||
INDEX `idx_msgtime` (`msgtime`) COMMENT '消息时间索引',
|
||
INDEX `idx_corp_msgtype` (`corp_id`, `msgtype`, `msgtime`) COMMENT '企业+消息类型+时间'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企微会话存档消息表';
|
||
|
||
-- ============================================================
|
||
-- 会话表 (conversations)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `conversations` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`session_id` VARCHAR(128) NOT NULL COMMENT '会话唯一ID(业务生成)',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`customer_id` VARCHAR(128) NOT NULL COMMENT '学员(外部联系人)userid',
|
||
`customer_name` VARCHAR(64) COMMENT '学员昵称',
|
||
`staff_id` VARCHAR(128) NOT NULL COMMENT '坐席(企业成员)userid',
|
||
`staff_name` VARCHAR(64) COMMENT '坐席姓名',
|
||
`room_id` VARCHAR(128) COMMENT '群聊ID(群聊时有值)',
|
||
`status` VARCHAR(32) DEFAULT 'ACTIVE' COMMENT '会话状态: ACTIVE-活跃 IDLE-空闲 CLOSED-关闭 ARCHIVED-归档',
|
||
`current_stage` VARCHAR(32) DEFAULT '开场白' COMMENT '当前对话阶段',
|
||
`stage_confidence` DECIMAL(4,3) DEFAULT 0.000 COMMENT '阶段判断置信度',
|
||
`round_count` INT(11) DEFAULT 0 COMMENT '对话轮次',
|
||
`intent_count` INT(11) DEFAULT 0 COMMENT '意图识别次数',
|
||
`last_msg_id` VARCHAR(255) COMMENT '最后一条消息ID',
|
||
`last_msg_time` TIMESTAMP NULL COMMENT '最后消息时间',
|
||
`last_msg_content` VARCHAR(512) COMMENT '最后消息内容摘要',
|
||
`start_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '会话开始时间',
|
||
`end_time` TIMESTAMP NULL COMMENT '会话结束时间',
|
||
`idle_duration` INT(11) DEFAULT 0 COMMENT '空闲时长(分钟)',
|
||
`context_summary` TEXT COMMENT '对话摘要(LLM生成)',
|
||
`key_events` TEXT COMMENT '关键事件列表,JSON字符串',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_session_id` (`session_id`) COMMENT '会话ID唯一',
|
||
INDEX `idx_corp_staff` (`corp_id`, `staff_id`, `status`) COMMENT '企业+坐席+状态',
|
||
INDEX `idx_corp_customer` (`corp_id`, `customer_id`, `status`) COMMENT '企业+学员+状态',
|
||
INDEX `idx_status_time` (`status`, `last_msg_time`) COMMENT '状态+时间',
|
||
INDEX `idx_created_at` (`created_at`) COMMENT '创建时间索引'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话表';
|
||
|
||
-- ============================================================
|
||
-- 对话轮次表 (conversation_turns)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `conversation_turns` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`turn_id` VARCHAR(128) NOT NULL COMMENT '轮次ID',
|
||
`session_id` VARCHAR(128) NOT NULL COMMENT '会话ID',
|
||
`turn_number` INT(11) NOT NULL COMMENT '轮次序号',
|
||
`student_msg_id` VARCHAR(255) COMMENT '学员消息ID',
|
||
`student_content` TEXT COMMENT '学员消息内容',
|
||
`seat_msg_id` VARCHAR(255) COMMENT '坐席回复消息ID',
|
||
`seat_content` TEXT COMMENT '坐席回复内容',
|
||
`turn_type` VARCHAR(32) DEFAULT 'QUERY' COMMENT '轮次类型: OPEN-开场 QUERY-咨询 OBJECTION-异议 INTEREST-意向 SILENCE-沉默 FOLLOWUP-跟进 CLOSE-收尾',
|
||
`primary_intent` VARCHAR(32) COMMENT '主意图编码',
|
||
`intent_confidence` DECIMAL(4,3) COMMENT '意图置信度',
|
||
`student_emotion` VARCHAR(32) DEFAULT 'NEUTRAL' COMMENT '学员情绪: POSITIVE-积极 NEUTRAL-中性 NEGATIVE-消极 ANXIOUS-焦虑 EXCITED-兴奋',
|
||
`key_topics` TEXT COMMENT '涉及主题列表,JSON字符串',
|
||
`slot_changes` TEXT COMMENT '槽位变化,JSON字符串',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
UNIQUE KEY `uk_turn_id` (`turn_id`) COMMENT '轮次ID唯一',
|
||
INDEX `idx_session_turn` (`session_id`, `turn_number`) COMMENT '会话+轮次号',
|
||
INDEX `idx_session_time` (`session_id`, `created_at`) COMMENT '会话+时间'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话轮次表';
|
||
|
||
-- ============================================================
|
||
-- 意图分类表 (intent_categories)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `intent_categories` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`code` VARCHAR(32) NOT NULL COMMENT '意图编码,如INT-COURSE-01',
|
||
`name` VARCHAR(64) NOT NULL COMMENT '意图名称',
|
||
`domain` VARCHAR(32) NOT NULL COMMENT '所属领域',
|
||
`description` VARCHAR(256) COMMENT '意图说明',
|
||
`priority` VARCHAR(8) DEFAULT 'P2' COMMENT '优先级: P1-高 P2-中 P3-低',
|
||
`trigger_keywords` TEXT COMMENT '触发关键词列表,JSON数组字符串',
|
||
`sample_expressions` TEXT COMMENT '典型表达示例,JSON数组字符串',
|
||
`status` TINYINT DEFAULT 1 COMMENT '状态: 1启用 0停用',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_code` (`code`) COMMENT '意图编码唯一',
|
||
INDEX `idx_domain_priority` (`domain`, `priority`) COMMENT '领域+优先级'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='意图分类表';
|
||
|
||
-- ============================================================
|
||
-- 意图识别记录表 (intent_recognitions)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `intent_recognitions` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`session_id` VARCHAR(128) NOT NULL COMMENT '会话ID',
|
||
`turn_id` VARCHAR(128) COMMENT '轮次ID',
|
||
`msg_id` VARCHAR(255) NOT NULL COMMENT '消息ID',
|
||
`customer_id` VARCHAR(128) NOT NULL COMMENT '学员ID',
|
||
`staff_id` VARCHAR(128) NOT NULL COMMENT '坐席ID',
|
||
`message_content` TEXT COMMENT '消息内容摘要',
|
||
`primary_intent_code` VARCHAR(32) NOT NULL COMMENT '主意图编码',
|
||
`primary_intent_confidence` DECIMAL(4,3) COMMENT '主意图置信度',
|
||
`secondary_intents` TEXT COMMENT '辅意图列表,JSON字符串',
|
||
`sentiment` VARCHAR(32) DEFAULT 'NEUTRAL' COMMENT '情感: POSITIVE-积极 NEUTRAL-中性 NEGATIVE-消极',
|
||
`sentiment_confidence` DECIMAL(4,3) COMMENT '情感置信度',
|
||
`recognition_method` VARCHAR(32) DEFAULT 'HYBRID' COMMENT '识别方法: RULE-规则 LLM-大模型 HYBRID-混合',
|
||
`llm_model` VARCHAR(64) COMMENT '使用的LLM模型',
|
||
`prompt_tokens` INT(11) COMMENT 'Prompt Token数',
|
||
`completion_tokens` INT(11) COMMENT 'Completion Token数',
|
||
`elapsed_ms` INT(11) COMMENT '识别耗时(毫秒)',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
INDEX `idx_session_msg` (`session_id`, `msg_id`) COMMENT '会话+消息',
|
||
INDEX `idx_customer_time` (`customer_id`, `created_at`) COMMENT '学员+时间',
|
||
INDEX `idx_intent_code` (`primary_intent_code`, `created_at`) COMMENT '意图编码+时间'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='意图识别记录表';
|
||
|
||
-- ============================================================
|
||
-- 学员画像表 (customer_profiles)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `customer_profiles` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`customer_id` VARCHAR(128) NOT NULL COMMENT '学员userid',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`student_type` VARCHAR(32) COMMENT '学员类型: 在校大学生/转行人员/在职提升/高中毕业生/家长代询',
|
||
`student_type_confidence` DECIMAL(4,3) COMMENT '学员类型置信度',
|
||
`skill_level` VARCHAR(32) COMMENT '基础水平: 零基础/有美术基础/相关专业/有从业经验',
|
||
`skill_level_confidence` DECIMAL(4,3) COMMENT '基础水平置信度',
|
||
`intent_level` VARCHAR(16) DEFAULT '低' COMMENT '意向度等级: 高/中/低/无意向',
|
||
`intent_score` DECIMAL(6,2) DEFAULT 0.00 COMMENT '意向度分数',
|
||
`concern_focus` VARCHAR(32) COMMENT '关注重点: 价格敏感型/就业导向型/师资看重型/时间灵活型/品牌信任型',
|
||
`concern_focus_confidence` DECIMAL(4,3) COMMENT '关注重点置信度',
|
||
`decision_stage` VARCHAR(32) DEFAULT '信息了解' COMMENT '决策阶段: 信息了解/方案比较/购买决策/报名成交',
|
||
`decision_stage_confidence` DECIMAL(4,3) COMMENT '决策阶段置信度',
|
||
`interested_courses` TEXT COMMENT '意向课程列表,JSON字符串',
|
||
`budget_hint` VARCHAR(64) COMMENT '预算暗示',
|
||
`preferred_city` VARCHAR(32) COMMENT '意向城市',
|
||
`age` INT(11) COMMENT '年龄',
|
||
`education` VARCHAR(32) COMMENT '学历',
|
||
`current_occupation` VARCHAR(64) COMMENT '当前职业',
|
||
`slot_data` TEXT COMMENT '完整槽位数据,JSON字符串',
|
||
`conversation_count` INT(11) DEFAULT 0 COMMENT '对话次数',
|
||
`last_conversation_time` TIMESTAMP NULL COMMENT '上次对话时间',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_customer_corp` (`customer_id`, `corp_id`) COMMENT '学员+企业唯一',
|
||
INDEX `idx_intent_score` (`intent_score`) COMMENT '意向度分数索引',
|
||
INDEX `idx_decision_stage` (`decision_stage`) COMMENT '决策阶段索引'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员画像表';
|
||
|
||
-- ============================================================
|
||
-- 话术库表 (utterances)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `utterances` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`utterance_id` VARCHAR(64) NOT NULL COMMENT '话术唯一ID(业务编码)',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`title` VARCHAR(128) NOT NULL COMMENT '话术标题',
|
||
`content` TEXT NOT NULL COMMENT '话术内容(富文本)',
|
||
`content_text` TEXT COMMENT '纯文本内容(用于全文检索)',
|
||
`version` INT(11) DEFAULT 1 COMMENT '版本号',
|
||
`status` VARCHAR(32) DEFAULT 'DRAFT' COMMENT '状态: DRAFT-草稿 ACTIVE-启用 INACTIVE-停用 DEPRECATED-废弃',
|
||
`priority` INT(11) DEFAULT 5 COMMENT '优先级(1-10,越小越优先)',
|
||
`stage_tags` TEXT COMMENT '适用阶段标签,JSON数组字符串',
|
||
`intent_tags` TEXT COMMENT '匹配意图标签,JSON数组字符串',
|
||
`profile_tags` TEXT COMMENT '适用画像标签,JSON数组字符串',
|
||
`course_type_tags` TEXT COMMENT '适用课程标签,JSON数组字符串',
|
||
`emotion_tags` TEXT COMMENT '情感标签,JSON数组字符串',
|
||
`topic_tags` TEXT COMMENT '主题标签,JSON数组字符串',
|
||
`used_count` INT(11) DEFAULT 0 COMMENT '使用次数',
|
||
`selected_count` INT(11) DEFAULT 0 COMMENT '选中次数',
|
||
`positive_feedback` INT(11) DEFAULT 0 COMMENT '正面反馈数',
|
||
`negative_feedback` INT(11) DEFAULT 0 COMMENT '负面反馈数',
|
||
`conversion_count` INT(11) DEFAULT 0 COMMENT '转化次数',
|
||
`success_rate` DECIMAL(5,4) DEFAULT 0.0000 COMMENT '成功率(0-1)',
|
||
`avg_response_time_ms` INT(11) COMMENT '平均响应时间(毫秒)',
|
||
`has_vector` TINYINT DEFAULT 0 COMMENT '是否已生成向量: 0否 1是',
|
||
`vector_updated_at` TIMESTAMP NULL COMMENT '向量更新时间',
|
||
`trigger_keywords` TEXT COMMENT '触发关键词,JSON字符串',
|
||
`variables` TEXT COMMENT '变量定义,JSON字符串',
|
||
`created_by` VARCHAR(64) COMMENT '创建人',
|
||
`reviewed_by` VARCHAR(64) COMMENT '审核人',
|
||
`source` VARCHAR(32) DEFAULT 'MANUAL' COMMENT '来源: MANUAL-人工录入 IMPORTED-导入 LLM_GENERATED-AI生成',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_utterance_id` (`utterance_id`) COMMENT '话术ID唯一',
|
||
INDEX `idx_corp_status` (`corp_id`, `status`) COMMENT '企业+状态',
|
||
INDEX `idx_success_rate` (`success_rate`) COMMENT '成功率索引',
|
||
INDEX `idx_used_count` (`used_count`) COMMENT '使用次数索引',
|
||
FULLTEXT KEY `ft_content` (`content_text`) COMMENT '全文检索索引'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='话术库表';
|
||
|
||
-- ============================================================
|
||
-- 话术分类表 (utterance_categories)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `utterance_categories` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`code` VARCHAR(32) NOT NULL COMMENT '分类编码',
|
||
`name` VARCHAR(64) NOT NULL COMMENT '分类名称',
|
||
`parent_code` VARCHAR(32) DEFAULT 'ROOT' COMMENT '父级编码',
|
||
`sort_order` INT(11) DEFAULT 0 COMMENT '排序号',
|
||
`color` VARCHAR(16) DEFAULT '#1890ff' COMMENT '显示颜色',
|
||
`description` VARCHAR(256) COMMENT '分类说明',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
UNIQUE KEY `uk_code` (`code`) COMMENT '分类编码唯一'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='话术分类表';
|
||
|
||
-- ============================================================
|
||
-- 话术效果表 (utterance_performance)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `utterance_performance` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`utterance_id` VARCHAR(64) NOT NULL COMMENT '话术ID',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`hour_window` VARCHAR(13) NOT NULL COMMENT '时间窗口,格式: 2025-01-15-14',
|
||
`show_count` INT(11) DEFAULT 0 COMMENT '展示次数',
|
||
`click_count` INT(11) DEFAULT 0 COMMENT '点击次数',
|
||
`send_count` INT(11) DEFAULT 0 COMMENT '发送次数',
|
||
`positive_count` INT(11) DEFAULT 0 COMMENT '正面反馈数',
|
||
`negative_count` INT(11) DEFAULT 0 COMMENT '负面反馈数',
|
||
`ignore_count` INT(11) DEFAULT 0 COMMENT '忽略次数',
|
||
`conversion_count` INT(11) DEFAULT 0 COMMENT '转化次数',
|
||
`ctr` DECIMAL(5,4) COMMENT '点击率',
|
||
`conversion_rate` DECIMAL(5,4) COMMENT '转化率',
|
||
`score` DECIMAL(6,4) COMMENT '综合评分(EWA算法)',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
UNIQUE KEY `uk_utterance_hour` (`utterance_id`, `hour_window`) COMMENT '话术+时间窗口唯一',
|
||
INDEX `idx_corp_hour` (`corp_id`, `hour_window`) COMMENT '企业+时间窗口'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='话术效果表';
|
||
|
||
-- ============================================================
|
||
-- 推荐记录表 (recommendations)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `recommendations` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`recommendation_id` VARCHAR(128) NOT NULL COMMENT '推荐记录ID',
|
||
`session_id` VARCHAR(128) NOT NULL COMMENT '会话ID',
|
||
`turn_id` VARCHAR(128) COMMENT '轮次ID',
|
||
`customer_id` VARCHAR(128) NOT NULL COMMENT '学员ID',
|
||
`staff_id` VARCHAR(128) NOT NULL COMMENT '坐席ID',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`primary_intent` VARCHAR(32) COMMENT '主意图编码',
|
||
`secondary_intents` TEXT COMMENT '辅意图列表,JSON字符串',
|
||
`student_type` VARCHAR(32) COMMENT '学员类型',
|
||
`current_stage` VARCHAR(32) COMMENT '当前阶段',
|
||
`student_message` VARCHAR(512) COMMENT '学员消息',
|
||
`recommended_count` INT(11) DEFAULT 0 COMMENT '推荐条数',
|
||
`recall_sources` TEXT COMMENT '召回来源统计,JSON字符串',
|
||
`generation_mode` VARCHAR(32) DEFAULT 'KB_ONLY' COMMENT '生成模式: KB_ONLY-话术库 KB_LLM_MIX-混合 LLM_ONLY-纯AI',
|
||
`elapsed_ms` INT(11) COMMENT '推荐耗时(毫秒)',
|
||
`staff_action` VARCHAR(32) DEFAULT 'NOT_SEEN' COMMENT '坐席操作: SENT-发送 EDITED-编辑后发送 IGNORED-忽略 NOT_SEEN-未查看',
|
||
`feedback` VARCHAR(32) DEFAULT 'NONE' COMMENT '反馈: POSITIVE-正面 NEGATIVE-负面 NONE-无',
|
||
`feedback_reason` VARCHAR(128) COMMENT '反馈原因',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`action_time` TIMESTAMP NULL COMMENT '操作时间',
|
||
UNIQUE KEY `uk_rec_id` (`recommendation_id`) COMMENT '推荐ID唯一',
|
||
INDEX `idx_session` (`session_id`, `created_at`) COMMENT '会话+时间',
|
||
INDEX `idx_staff` (`staff_id`, `created_at`) COMMENT '坐席+时间',
|
||
INDEX `idx_intent` (`primary_intent`, `created_at`) COMMENT '意图+时间'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='推荐记录表';
|
||
|
||
-- ============================================================
|
||
-- 知识库文档表 (knowledge_documents)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `knowledge_documents` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`doc_id` VARCHAR(64) NOT NULL COMMENT '文档唯一ID',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`title` VARCHAR(256) NOT NULL COMMENT '文档标题',
|
||
`content` LONGTEXT COMMENT '文档内容',
|
||
`content_text` LONGTEXT COMMENT '纯文本内容(用于全文检索)',
|
||
`doc_type` VARCHAR(32) DEFAULT 'KNOWLEDGE' COMMENT '文档类型: KNOWLEDGE-知识 UTTERANCE-话术 FAQ-常见问题',
|
||
`category` VARCHAR(64) COMMENT '分类',
|
||
`tags` TEXT COMMENT '标签,JSON数组字符串',
|
||
`status` VARCHAR(32) DEFAULT 'ACTIVE' COMMENT '状态: ACTIVE-启用 INACTIVE-停用',
|
||
`has_vector` TINYINT DEFAULT 0 COMMENT '是否已生成向量',
|
||
`vector_updated_at` TIMESTAMP NULL COMMENT '向量更新时间',
|
||
`created_by` VARCHAR(64) COMMENT '创建人',
|
||
`updated_by` VARCHAR(64) COMMENT '更新人',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_doc_id` (`doc_id`) COMMENT '文档ID唯一',
|
||
INDEX `idx_corp_type` (`corp_id`, `doc_type`, `status`) COMMENT '企业+类型+状态',
|
||
FULLTEXT KEY `ft_content` (`content_text`) COMMENT '全文检索'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库文档表';
|
||
|
||
-- ============================================================
|
||
-- 员工表 (staffs)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `staffs` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`staff_id` VARCHAR(128) NOT NULL COMMENT '企微用户ID',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`name` VARCHAR(64) COMMENT '姓名',
|
||
`avatar` VARCHAR(512) COMMENT '头像URL',
|
||
`department` VARCHAR(128) COMMENT '部门',
|
||
`role` VARCHAR(32) DEFAULT 'ADVISOR' COMMENT '角色: ADMIN-管理员 SUPERVISOR-主管 ADVISOR-顾问',
|
||
`status` VARCHAR(32) DEFAULT 'ACTIVE' COMMENT '状态: ACTIVE-在职 INACTIVE-离职',
|
||
`push_settings` TEXT COMMENT '推送设置,JSON字符串',
|
||
`last_login_time` TIMESTAMP NULL COMMENT '最后登录时间',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_staff_corp` (`staff_id`, `corp_id`) COMMENT '员工+企业唯一',
|
||
INDEX `idx_corp_role` (`corp_id`, `role`) COMMENT '企业+角色'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';
|
||
|
||
-- ============================================================
|
||
-- 客户表 (customers)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `customers` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`customer_id` VARCHAR(128) NOT NULL COMMENT '外部联系人userid',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`name` VARCHAR(64) COMMENT '姓名/昵称',
|
||
`avatar` VARCHAR(512) COMMENT '头像URL',
|
||
`type` VARCHAR(32) DEFAULT 'UNKNOWN' COMMENT '客户类型: UNKNOWN-未知 INDIVIDUAL-个人 PARENT-家长 ENTERPRISE-企业',
|
||
`gender` VARCHAR(8) COMMENT '性别: MALE-男 FEMALE-女',
|
||
`phone` VARCHAR(32) COMMENT '手机号',
|
||
`unionid` VARCHAR(128) COMMENT '微信unionid',
|
||
`add_time` TIMESTAMP NULL COMMENT '添加时间',
|
||
`status` VARCHAR(32) DEFAULT 'ACTIVE' COMMENT '状态: ACTIVE-正常 BLOCKED-拉黑 DELETED-删除',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_customer_corp` (`customer_id`, `corp_id`) COMMENT '客户+企业唯一',
|
||
INDEX `idx_corp_status` (`corp_id`, `status`) COMMENT '企业+状态'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';
|
||
|
||
-- ============================================================
|
||
-- 管理员表 (admins)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `admins` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`username` VARCHAR(64) NOT NULL COMMENT '用户名',
|
||
`password` VARCHAR(256) NOT NULL COMMENT '密码(BCrypt加密)',
|
||
`name` VARCHAR(64) COMMENT '姓名',
|
||
`email` VARCHAR(128) COMMENT '邮箱',
|
||
`phone` VARCHAR(32) COMMENT '手机号',
|
||
`role` VARCHAR(32) DEFAULT 'ADMIN' COMMENT '角色: SUPER_ADMIN-超级管理员 ADMIN-管理员 OPERATOR-运营',
|
||
`status` VARCHAR(32) DEFAULT 'ACTIVE' COMMENT '状态: ACTIVE-启用 DISABLED-停用',
|
||
`last_login_time` TIMESTAMP NULL COMMENT '最后登录时间',
|
||
`last_login_ip` VARCHAR(64) COMMENT '最后登录IP',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
UNIQUE KEY `uk_username` (`username`) COMMENT '用户名唯一'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';
|
||
|
||
-- ============================================================
|
||
-- 操作日志表 (operation_logs)
|
||
-- ============================================================
|
||
CREATE TABLE IF NOT EXISTS `operation_logs` (
|
||
`id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`operator_id` VARCHAR(64) NOT NULL COMMENT '操作人ID',
|
||
`operator_name` VARCHAR(64) COMMENT '操作人姓名',
|
||
`operator_type` VARCHAR(32) DEFAULT 'STAFF' COMMENT '操作人类型: STAFF-员工 ADMIN-管理员',
|
||
`module` VARCHAR(64) COMMENT '操作模块',
|
||
`action` VARCHAR(64) COMMENT '操作动作',
|
||
`description` TEXT COMMENT '操作描述',
|
||
`request_params` TEXT COMMENT '请求参数',
|
||
`response_result` TEXT COMMENT '响应结果',
|
||
`ip` VARCHAR(64) COMMENT '操作IP',
|
||
`user_agent` VARCHAR(512) COMMENT 'User-Agent',
|
||
`status` TINYINT DEFAULT 1 COMMENT '状态: 1成功 0失败',
|
||
`elapsed_ms` INT(11) COMMENT '耗时(毫秒)',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
INDEX `idx_operator` (`operator_id`, `created_at`) COMMENT '操作人+时间',
|
||
INDEX `idx_module` (`module`, `action`, `created_at`) COMMENT '模块+动作+时间',
|
||
INDEX `idx_created_at` (`created_at`) COMMENT '创建时间索引'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
|
||
|
||
-- ============================================================
|
||
-- 初始化数据
|
||
-- ============================================================
|
||
|
||
-- 40个意图分类
|
||
INSERT INTO `intent_categories` (`code`, `name`, `domain`, `description`, `priority`, `trigger_keywords`, `sample_expressions`, `status`) VALUES
|
||
('INT-COURSE-01', '课程内容咨询', '课程相关', '询问具体学什么内容', 'P1', '["学什么","课程","内容","教什么","学什么软件"]', '["你们的课程具体学什么内容?","课程都教哪些软件?","能说一下课程体系吗?"]', 1),
|
||
('INT-COURSE-02', '课程选择建议', '课程相关', '不知道该选哪个方向', 'P1', '["选哪个","推荐","适合我","怎么选","方向"]', '["我应该学3D建模还是原画?","哪个方向好就业?","您能帮我推荐一下吗?"]', 1),
|
||
('INT-COURSE-03', '课程大纲索要', '课程相关', '想看详细课程安排', 'P1', '["大纲","课程表","安排","详细","阶段"]', '["能发一下课程大纲吗?","具体是怎么安排的?","每个阶段学什么?"]', 1),
|
||
('INT-COURSE-04', '试听预约咨询', '课程相关', '想试听或体验课程', 'P1', '["试听","体验","免费","公开课","试学"]', '["有免费试听吗?","怎么预约试听课?","可以体验一下吗?"]', 1),
|
||
('INT-COURSE-05', '课程更新迭代', '课程相关', '担心课程内容过时', 'P2', '["更新","过时","新版","跟上","行业"]', '["课程内容会更新吗?","跟得上行业吗?","用的是最新技术吗?"]', 1),
|
||
('INT-COURSE-06', '线上vs线下选择', '课程相关', '不知道选哪种学习方式', 'P1', '["线上","线下","面授","直播","网课","区别"]', '["线上和线下有什么区别?","线上课程效果好吗?","可以线上学习吗?"]', 1),
|
||
('INT-COURSE-07', '课程难度询问', '课程相关', '担心零基础能否学会', 'P1', '["零基础","能学会吗","难吗","没有基础","小白","能不能学会"]', '["零基础能学会吗?","我没有美术基础可以学吗?","课程难度大不大?"]', 1),
|
||
('INT-COURSE-08', '学习周期询问', '课程相关', '想知道学多久', 'P2', '["多久","多长时间","几个月","学多久","周期"]', '["课程要学多久?","多长时间能学会?","几个月可以学完?"]', 1),
|
||
('INT-PRICE-01', '学费价格询问', '价格相关', '直接问学费多少', 'P1', '["多少钱","学费","价格","费用","收费","怎么收费"]', '["学费多少钱?","课程怎么收费?","一共多少钱?"]', 1),
|
||
('INT-PRICE-02', '优惠活动询问', '价格相关', '想知道有没有优惠', 'P1', '["优惠","活动","打折","减免","便宜","特价"]', '["现在有优惠活动吗?","能便宜点吗?","有没有折扣?"]', 1),
|
||
('INT-PRICE-03', '分期付款咨询', '价格相关', '关心付款方式', 'P2', '["分期","贷款","月付","首付","月供","花呗"]', '["可以分期付款吗?","有贷款方案吗?","月供多少?"]', 1),
|
||
('INT-PRICE-04', '退费政策询问', '价格相关', '关心退费保障', 'P2', '["退费","退款","退钱","学不好退","保障"]', '["学不好可以退费吗?","退费流程是怎样的?","有保障吗?"]', 1),
|
||
('INT-PRICE-05', '性价比比较', '价格相关', '和别家比较', 'P2', '["对比","比较","别家","其他机构","性价比","划算"]', '["你们的课程和XX比怎么样?","为什么价格比别人高?","性价比高吗?"]', 1),
|
||
('INT-JOB-01', '就业方向咨询', '就业相关', '学完能做什么', 'P1', '["就业","工作","岗位","方向","做什么"]', '["学完能去哪些公司工作?","就业方向有哪些?","能做什么岗位?"]', 1),
|
||
('INT-JOB-02', '薪资水平询问', '就业相关', '关心工资待遇', 'P1', '["工资","薪资","月薪","收入","待遇","多少钱一个月"]', '["毕业后工资能拿多少?","行业薪资水平怎么样?","能挣多少?"]', 1),
|
||
('INT-JOB-03', '就业率询问', '就业相关', '关心能否找到工作', 'P1', '["就业率","找到工作","保证","推荐","找工作"]', '["就业率高吗?","能保证就业吗?","好找工作吗?"]', 1),
|
||
('INT-JOB-04', '就业服务了解', '就业相关', '了解就业推荐服务', 'P2', '["就业服务","推荐","怎么找工作","帮找工作"]', '["你们怎么帮学员找工作?","有就业推荐吗?","就业服务包含什么?"]', 1),
|
||
('INT-JOB-05', '合作企业询问', '就业相关', '想知道合作企业', 'P2', '["合作企业","大厂","腾讯","米哈游","网易","公司"]', '["合作企业有哪些?","有米哈游/腾讯这样的公司吗?","就业单位有哪些?"]', 1),
|
||
('INT-JOB-06', '作品集指导', '就业相关', '关心作品质量', 'P2', '["作品集","作品","项目","Demo","案例"]', '["学完能做出作品集吗?","作品质量怎么样?","能参与项目吗?"]', 1),
|
||
('INT-JOB-07', '实习机会咨询', '就业相关', '想参与真实项目', 'P3', '["实习","真实项目","实训","参与项目","实战"]', '["有实习机会吗?","可以参与真实项目吗?","有企业实训吗?"]', 1),
|
||
('INT-TEACH-01', '师资背景询问', '师资相关', '想知道老师是谁', 'P2', '["老师","师资","讲师","谁教的","教学经验"]', '["老师是什么背景?","老师有项目经验吗?","谁来讲课?"]', 1),
|
||
('INT-TEACH-02', '教学模式了解', '师资相关', '想知道怎么上课', 'P2', '["怎么上课","教学方式","班型","一对一","多少人"]', '["是怎么上课的?","一个班多少人?","教学模式是怎样的?"]', 1),
|
||
('INT-TEACH-03', '课后答疑服务', '师资相关', '关心课后辅导', 'P2', '["答疑","辅导","课后","问问题","指导"]', '["课后有问题可以问老师吗?","答疑及时吗?","有课后辅导吗?"]', 1),
|
||
('INT-TEACH-04', '师生比例询问', '师资相关', '关心教学质量', 'P3', '["一个老师","带多少学生","比例","师生"]', '["一个老师带多少学生?","能照顾到每个人吗?","班级多大?"]', 1),
|
||
('INT-TEACH-05', '学习效果保障', '师资相关', '担心学不会怎么办', 'P2', '["学不会","怎么办","重修","保障","跟不上"]', '["学不会怎么办?","怎么保证学习效果?","跟不上怎么办?"]', 1),
|
||
('INT-BASIC-01', '学历要求咨询', '基础条件', '学历是否够', 'P2', '["学历","要求","高中","大专","本科"]', '["需要什么学历?","高中生可以学吗?","学历要求高吗?"]', 1),
|
||
('INT-BASIC-02', '年龄限制询问', '基础条件', '年龄是否合适', 'P2', '["年龄","多大","几岁","限制","30岁"]', '["有没有年龄限制?","30岁了还能学吗?","年龄大能学会吗?"]', 1),
|
||
('INT-BASIC-03', '零基础入学', '基础条件', '零基础可行性', 'P1', '["零基础","没有基础","小白","完全不会","从来没"]', '["我没有美术基础可以学吗?","零基础能学会吗?","完全没接触过可以学吗?"]', 1),
|
||
('INT-BASIC-04', '证书颁发询问', '基础条件', '学完发什么证书', 'P3', '["证书","毕业证","结业证","证明","认证"]', '["学完发证书吗?","证书有用吗?","有毕业证吗?"]', 1),
|
||
('INT-LOC-01', '校区地址询问', '校区相关', '想知道校区在哪', 'P2', '["校区","地址","在哪","位置","交通"]', '["校区在哪里?","附近有地铁吗?","具体地址是什么?"]', 1),
|
||
('INT-LOC-02', '校区参观预约', '校区相关', '想去参观', 'P2', '["参观","看看","实地考察","走访","预约"]', '["可以参观校区吗?","怎么预约参观?","能去看看吗?"]', 1),
|
||
('INT-LOC-03', '教学设备了解', '校区相关', '关心硬件条件', 'P3', '["设备","电脑","配置","硬件","机房"]', '["需要自备电脑吗?","校区提供设备吗?","电脑配置怎么样?"]', 1),
|
||
('INT-LOC-04', '住宿安排咨询', '校区相关', '外地学员住宿', 'P3', '["住宿","宿舍","外地","住哪","租房"]', '["外地学员有住宿吗?","住宿怎么安排?","有宿舍吗?"]', 1),
|
||
('INT-QUAL-01', '机构正规性', '机构资质', '是否正规机构', 'P2', '["正规","资质","办学","合法","备案"]', '["你们是正规机构吗?","有办学资质吗?","是国家认可的吗?"]', 1),
|
||
('INT-QUAL-02', '口碑评价询问', '机构资质', '想看学员评价', 'P3', '["评价","口碑","反馈","怎么样","好吗"]', '["学员评价怎么样?","有老学员反馈吗?","口碑如何?"]', 1),
|
||
('INT-QUAL-03', '媒体报道了解', '机构资质', '想看权威背书', 'P3', '["报道","媒体","电视","新闻","央视"]', '["有上过电视报道吗?","媒体报道过吗?","央视那个是真的吗?"]', 1),
|
||
('INT-OTHER-01', '大师课咨询', '其他', '进阶课程', 'P3', '["大师课","研修班","进阶","艺术家","高级"]', '["大师课和普通课什么区别?","研修班怎么报名?","大师课学费多少?"]', 1),
|
||
('INT-OTHER-02', '企业培训定制', '其他', 'B端需求', 'P3', '["企业培训","定制","公司","团队","B端"]', '["有企业定制培训吗?","公司团队能报名吗?","企业内训怎么合作?"]', 1),
|
||
('INT-OTHER-03', '比赛活动咨询', '其他', 'GGAC等赛事', 'P3', '["比赛","GGAC","大赛","活动","赛事"]', '["GGAC比赛怎么参加?","有比赛推荐吗?","学员能参加大赛吗?"]', 1),
|
||
('INT-OTHER-04', '转班转学咨询', '其他', '变更需求', 'P3', '["转班","换方向","转学","调整","换校区"]', '["可以换课程方向吗?","可以换校区吗?","转班怎么办理?"]', 1);
|
||
|
||
-- 8个话术分类(销售阶段)
|
||
INSERT INTO `utterance_categories` (`code`, `name`, `parent_code`, `sort_order`, `color`, `description`) VALUES
|
||
('STAGE-01', '开场白', 'ROOT', 1, '#52c41a', '首次接待学员/家长,建立信任,收集基础信息'),
|
||
('STAGE-02', '需求探询', 'ROOT', 2, '#1890ff', '了解学员背景和目标,精准画像,挖掘需求'),
|
||
('STAGE-03', '课程推荐', 'ROOT', 3, '#fa8c16', '匹配适合的课程方向,精准推荐1-2个方向'),
|
||
('STAGE-04', '价值塑造', 'ROOT', 4, '#722ed1', '强调优势和差异化,建立价值认同'),
|
||
('STAGE-05', '报价沟通', 'ROOT', 5, '#eb2f96', '价格说明和方案,化解价格顾虑'),
|
||
('STAGE-06', '异议处理', 'ROOT', 6, '#f5222d', '应对各类顾虑,消除障碍,建立信心'),
|
||
('STAGE-07', '促成报名', 'ROOT', 7, '#faad14', '推动转化成交,促成立即行动'),
|
||
('STAGE-08', '跟进维护', 'ROOT', 8, '#13c2c2', '未成交学员跟进,保持联系,等待时机');
|
||
|
||
-- 系统管理员(密码: admin123)
|
||
INSERT INTO `admins` (`username`, `password`, `name`, `email`, `role`, `status`, `created_at`) VALUES
|
||
('admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iOE1Qh6G', '系统管理员', 'admin@9artedu.com', 'SUPER_ADMIN', 'ACTIVE', NOW());
|