use school_news;
-- 智能体配置表
DROP TABLE IF EXISTS `tb_ai_agent_config`;
CREATE TABLE `tb_ai_agent_config` (
  `id` VARCHAR(50) NOT NULL COMMENT '配置ID',
  `name` VARCHAR(100) NOT NULL COMMENT '智能体名称',
  `avatar` VARCHAR(255) DEFAULT NULL COMMENT '智能体头像',
  `description` VARCHAR(500) DEFAULT NULL COMMENT '智能体描述',
  `connect_internet` INT(4) DEFAULT 0 COMMENT '是否连接互联网（0否 1是）',
  `dify_app_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify应用ID',
  `dify_api_key` VARCHAR(255) DEFAULT NULL COMMENT 'Dify应用API密钥',
  `status` INT(4) DEFAULT 1 COMMENT '状态（0禁用 1启用）',
  `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
  `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`, `deleted`),
  KEY `idx_dify_app` (`dify_app_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='智能体配置表';


-- 知识库表（支持资源权限控制）
DROP TABLE IF EXISTS `tb_ai_knowledge`;
CREATE TABLE `tb_ai_knowledge` (
  `id` VARCHAR(50) NOT NULL COMMENT '知识库ID',
  `title` VARCHAR(255) NOT NULL COMMENT '知识库标题',
  `avatar` VARCHAR(255) DEFAULT NULL COMMENT '知识库头像',
  `description` VARCHAR(500) DEFAULT NULL COMMENT '知识库描述',
  `content` LONGTEXT COMMENT '知识内容（手动添加时使用）',
  `source_type` INT(4) DEFAULT 1 COMMENT '来源类型（1手动添加 2文件导入 3资源同步）',
  `source_id` VARCHAR(50) DEFAULT NULL COMMENT '来源ID',
  `file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件名',
  `file_path` VARCHAR(500) DEFAULT NULL COMMENT '文件路径',
  `category` VARCHAR(100) DEFAULT NULL COMMENT '分类',
  `tags` VARCHAR(500) DEFAULT NULL COMMENT '标签（JSON数组）',
  `dify_dataset_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify知识库ID（Dataset ID）',
  `dify_indexing_technique` VARCHAR(50) DEFAULT 'high_quality' COMMENT 'Dify索引方式（high_quality/economy）',
  `embedding_model` VARCHAR(100) DEFAULT NULL COMMENT '向量模型名称',
  `embedding_model_provider` VARCHAR(100) DEFAULT NULL COMMENT '向量模型提供商',
  `rerank_model` VARCHAR(100) DEFAULT NULL COMMENT 'Rerank模型名称',
  `rerank_model_provider` VARCHAR(100) DEFAULT NULL COMMENT 'Rerank模型提供商',
  `retrieval_top_k` INT(11) DEFAULT 2 COMMENT '检索Top K（返回前K个结果）',
  `retrieval_score_threshold` DECIMAL(3,2) DEFAULT 0.00 COMMENT '检索分数阈值（0.00-1.00）',
  `vector_id` VARCHAR(100) DEFAULT NULL COMMENT '向量ID（用于向量检索）',
  `document_count` INT(11) DEFAULT 0 COMMENT '文档数量',
  `total_chunks` INT(11) DEFAULT 0 COMMENT '总分段数',
  `status` INT(4) DEFAULT 1 COMMENT '状态（0禁用 1启用 2处理中）',
  `creator` VARCHAR(50) NOT NULL COMMENT '创建者（用户ID）',
  `creator_dept` VARCHAR(50) DEFAULT NULL COMMENT '创建者部门ID',
  `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  KEY `idx_creator` (`creator`, `deleted`),
  KEY `idx_creator_dept` (`creator_dept`),
  KEY `idx_source` (`source_type`, `source_id`),
  KEY `idx_category` (`category`),
  KEY `idx_status` (`status`, `deleted`),
  KEY `idx_dify_dataset` (`dify_dataset_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='知识库表（resource_type=10，支持权限控制）';

-- 对话会话表
DROP TABLE IF EXISTS `tb_ai_conversation`;
CREATE TABLE `tb_ai_conversation` (
  `id` VARCHAR(50) NOT NULL COMMENT '会话ID',
  `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
  `agent_id` VARCHAR(50) DEFAULT NULL COMMENT '智能体ID',
  `title` VARCHAR(255) DEFAULT '新对话' COMMENT '会话标题',
  `summary` VARCHAR(500) DEFAULT NULL COMMENT '对话摘要（AI自动生成）',
  `dify_conversation_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify会话ID',
  `status` INT(4) DEFAULT 1 COMMENT '状态（0已结束 1进行中）',
  `is_favorite` TINYINT(1) DEFAULT 0 COMMENT '是否收藏（0否 1是）',
  `is_pinned` TINYINT(1) DEFAULT 0 COMMENT '是否置顶（0否 1是）',
  `message_count` INT(11) DEFAULT 0 COMMENT '消息数量',
  `total_tokens` INT(11) DEFAULT 0 COMMENT '总Token消耗',
  `last_message_time` TIMESTAMP NULL DEFAULT NULL COMMENT '最后消息时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_createtime` (`user_id`, `create_time` DESC),
  KEY `idx_user_favorite` (`user_id`, `is_favorite`),
  KEY `idx_user_pinned` (`user_id`, `is_pinned`),
  KEY `idx_agent` (`agent_id`),
  KEY `idx_dify_conversation` (`dify_conversation_id`),
  KEY `idx_last_message_time` (`last_message_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话会话表';

-- 对话消息表
DROP TABLE IF EXISTS `tb_ai_message`;
CREATE TABLE `tb_ai_message` (
  `id` VARCHAR(50) NOT NULL COMMENT '消息ID',
  `conversation_id` VARCHAR(50) NOT NULL COMMENT '会话ID',
  `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
  `agent_id` VARCHAR(50) DEFAULT NULL COMMENT '智能体ID',
  `role` VARCHAR(20) NOT NULL COMMENT '角色（user用户 assistant助手 system系统）',
  `content` LONGTEXT NOT NULL COMMENT '消息内容',
  `file_ids` VARCHAR(500) DEFAULT NULL COMMENT '关联文件ID（JSON数组）',
  `knowledge_ids` VARCHAR(500) DEFAULT NULL COMMENT '引用知识ID（JSON数组）',
  `knowledge_refs` TEXT DEFAULT NULL COMMENT '知识库引用详情（JSON数组，包含title/snippet/score）',
  `token_count` INT(11) DEFAULT 0 COMMENT 'Token数量',
  `dify_message_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify消息ID',
  `rating` INT(4) DEFAULT NULL COMMENT '评分（1好评 -1差评 0取消评价）',
  `feedback` VARCHAR(1000) DEFAULT NULL COMMENT '反馈内容',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  KEY `idx_conversation_createtime` (`conversation_id`, `create_time` ASC),
  KEY `idx_user` (`user_id`),
  KEY `idx_agent` (`agent_id`),
  KEY `idx_role` (`role`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_deleted` (`deleted`),
  FULLTEXT KEY `ft_content` (`content`) WITH PARSER ngram
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话消息表（支持全文检索）';

-- 上传文件表
DROP TABLE IF EXISTS `tb_ai_upload_file`;
CREATE TABLE `tb_ai_upload_file` (
  `id` VARCHAR(50) NOT NULL COMMENT 'ID',
  `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
  `knowledge_id` VARCHAR(50) DEFAULT NULL COMMENT '所属知识库ID',
  `conversation_id` VARCHAR(50) DEFAULT NULL COMMENT '关联会话ID（对话中上传）',
  `message_id` VARCHAR(50) DEFAULT NULL COMMENT '关联消息ID（绑定到具体的用户消息）',
  `sys_file_id` VARCHAR(32) DEFAULT NULL COMMENT '系统文件ID（关联tb_sys_file实现永久存储）',
  `file_name` VARCHAR(255) NOT NULL COMMENT '文件名',
  `file_path` VARCHAR(500) NOT NULL COMMENT '文件路径',
  `file_size` BIGINT(20) DEFAULT 0 COMMENT '文件大小（字节）',
  `file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型（pdf/txt/docx/md等）',
  `mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型',
  `extracted_text` LONGTEXT COMMENT '提取的文本内容',
  `dify_document_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify文档ID',
  `dify_batch_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify批次ID',
  `dify_upload_file_id` VARCHAR(100) DEFAULT NULL COMMENT 'Dify上传文件ID（对话中上传的文件）',
  `chunk_count` INT(11) DEFAULT 0 COMMENT '分段数量',
  `status` INT(4) DEFAULT 0 COMMENT '状态（0上传中 1处理中 2已完成 3失败）',
  `error_message` VARCHAR(500) DEFAULT NULL COMMENT '错误信息',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`),
  KEY `idx_user` (`user_id`),
  KEY `idx_knowledge` (`knowledge_id`),
  KEY `idx_conversation` (`conversation_id`),
  KEY `idx_message` (`message_id`),
  KEY `idx_sys_file` (`sys_file_id`),
  KEY `idx_dify_document` (`dify_document_id`),
  KEY `idx_dify_upload_file` (`dify_upload_file_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='上传文件表（关联系统文件表）';

-- AI使用统计表
DROP TABLE IF EXISTS `tb_ai_usage_statistics`;
CREATE TABLE `tb_ai_usage_statistics` (
  `id` VARCHAR(50) NOT NULL COMMENT '统计ID',
  `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID',
  `agent_id` VARCHAR(50) DEFAULT NULL COMMENT '智能体ID（为空表示全局统计）',
  `stat_date` DATE NOT NULL COMMENT '统计日期',
  `conversation_count` INT(11) DEFAULT 0 COMMENT '会话数量',
  `message_count` INT(11) DEFAULT 0 COMMENT '消息数量',
  `total_tokens` INT(11) DEFAULT 0 COMMENT '总Token数',
  `file_count` INT(11) DEFAULT 0 COMMENT '上传文件数',
  `knowledge_query_count` INT(11) DEFAULT 0 COMMENT '知识库查询次数',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_agent_date` (`user_id`, `agent_id`, `stat_date`),
  KEY `idx_user` (`user_id`),
  KEY `idx_agent` (`agent_id`),
  KEY `idx_date` (`stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI使用统计表';


-- ========================================
-- 知识库权限控制说明
-- ========================================
-- 知识库使用统一权限表 tb_resource_permission 进行权限控制
-- resource_type = 10 (AI_KNOWLEDGE)
--
-- 权限逻辑：
-- 1. 用户创建知识库时，自动创建权限记录：
--    - 为创建者所在部门创建全权限（can_read=1, can_write=1, can_execute=1）
--    - 为root_department的superadmin创建全权限
--
-- 2. 权限查询示例（Java Service层）：
--    SELECT k.* FROM tb_ai_knowledge k
--    INNER JOIN tb_resource_permission rp 
--      ON rp.resource_type = 10 
--      AND rp.resource_id = k.id
--      AND rp.deleted = 0
--    WHERE k.deleted = 0
--      AND (
--        (rp.dept_id IS NULL AND rp.role_id IS NULL)  -- 公开
--        OR (rp.dept_id = '用户部门' AND rp.role_id IS NULL)
--        OR (rp.dept_id IS NULL AND rp.role_id = '用户角色')
--        OR (rp.dept_id = '用户部门' AND rp.role_id = '用户角色')
--      )
--      AND rp.can_read = 1;
--
-- 3. 知识库分类权限示例：
--    - 公开知识库：dept_id=NULL, role_id=NULL（所有人可读）
--    - 部门知识库：dept_id='xxx', role_id=NULL（部门内可读写）
--    - 角色知识库：dept_id=NULL, role_id='teacher'（所有教师可读）
--    - 私有知识库：仅创建者部门+特定角色可访问
--
-- ========================================
-- 初始化示例数据
-- ========================================

-- 插入默认智能体配置
INSERT INTO `tb_ai_agent_config` 
  (`id`, `name`, `avatar`, `description`, `connect_internet`,`dify_api_key`, `status`, `creator`, `create_time`) 
VALUES 
  ('agent_default_001', '校园助手', NULL, '我是您的智能校园助手，可以帮助您解答校园相关问题', 
   0, 'app-fwOqGFLTsZtekCQYlOmj9f8x', 1, '1', NOW());

-- 插入示例知识库（需要配合权限表使用）
INSERT INTO `tb_ai_knowledge` 
  (`id`, `title`, `description`, `category`, `status`, `creator`, `creator_dept`, `create_time`) 
VALUES 
  ('knowledge_demo_001', '校园规章制度', '学校各项规章制度汇总', '规章制度', 1, '1', 'root_department', NOW()),
  ('knowledge_demo_002', '新生入学指南', '新生入学相关事项说明', '入学指导', 1, '1', 'root_department', NOW());

-- 为示例知识库创建权限（公开可读）
-- 注意：实际使用时应该在应用层通过权限服务自动创建
-- INSERT INTO `tb_resource_permission` 
--   (`id`, `resource_type`, `resource_id`, `dept_id`, `role_id`, `can_read`, `can_write`, `can_execute`, `creator`, `create_time`) 
-- VALUES 
--   ('perm_ai_kb_001', 10, 'knowledge_demo_001', NULL, NULL, 1, 0, 0, '1', NOW()),
--   ('perm_ai_kb_002', 10, 'knowledge_demo_002', NULL, NULL, 1, 0, 0, '1', NOW());

