-- 物业 AI HR 知识库最小表结构。 -- ponytail: adapted from ruoyi-ai knowledge_* tables; keep only fields needed by SOP RAG first. CREATE TABLE IF NOT EXISTS `aihr_knowledge_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `name` varchar(100) NOT NULL COMMENT '知识库名称', `code` varchar(100) DEFAULT NULL COMMENT '租户内稳定空间编码;平台迁移会回填 legacy 编码并改为必填', `space_type` varchar(30) NOT NULL DEFAULT 'BUSINESS' COMMENT 'PUBLIC/BUSINESS/MANAGEMENT/EXTERNAL', `sensitivity_level` varchar(30) NOT NULL DEFAULT 'INTERNAL' COMMENT 'PUBLIC/INTERNAL/CONFIDENTIAL', `status` varchar(20) NOT NULL DEFAULT 'ACTIVE' COMMENT 'DRAFT/ACTIVE/DISABLED', `description` varchar(1000) DEFAULT NULL COMMENT '知识库描述', `separator` varchar(255) DEFAULT NULL COMMENT '知识分隔符', `overlap_char` int DEFAULT 120 COMMENT '重叠字符数', `retrieve_limit` int DEFAULT 5 COMMENT '检索条数', `similarity_threshold` double DEFAULT 0.5 COMMENT '相似度阈值', `text_block_size` int DEFAULT 800 COMMENT '文本块大小', `vector_model` varchar(50) DEFAULT NULL COMMENT '向量库', `embedding_model` varchar(100) DEFAULT NULL COMMENT '向量模型', `enable_hybrid` tinyint(1) DEFAULT 1 COMMENT '是否启用混合检索', `hybrid_alpha` double DEFAULT 0.5 COMMENT '混合检索权重比例', `system_prompt` text COMMENT '系统提示词', `create_dept` bigint DEFAULT NULL COMMENT '创建部门', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_knowledge_info_code` (`tenant_id`, `code`), KEY `idx_aihr_knowledge_info_tenant` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识库'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_attach` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `knowledge_id` bigint NOT NULL COMMENT '知识库ID', `oss_id` bigint DEFAULT NULL COMMENT '对象存储ID', `doc_id` varchar(32) DEFAULT NULL COMMENT '文档ID', `name` varchar(500) DEFAULT NULL COMMENT '附件名称', `type` varchar(50) NOT NULL COMMENT '附件类型', `status` tinyint DEFAULT 0 COMMENT '解析状态: 0待解析, 1解析中, 2已解析, 3解析失败', `create_dept` bigint DEFAULT NULL COMMENT '创建部门', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_knowledge_attach_name` (`knowledge_id`, `name`), KEY `idx_aihr_knowledge_attach_doc` (`doc_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识库附件'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_fragment` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `knowledge_id` bigint NOT NULL COMMENT '知识库ID', `idx` int NOT NULL COMMENT '片段序号', `doc_id` varchar(32) DEFAULT NULL COMMENT '文档ID', `content` text NOT NULL COMMENT '文档内容', `embedding_json` longtext DEFAULT NULL COMMENT '向量 JSON', `embedding_model` varchar(100) DEFAULT NULL COMMENT '向量模型', `embedding_time` datetime DEFAULT NULL COMMENT '向量生成时间', `create_dept` bigint DEFAULT NULL COMMENT '创建部门', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `idx_aihr_knowledge_fragment_doc` (`doc_id`), KEY `idx_aihr_knowledge_fragment_kid` (`knowledge_id`), FULLTEXT KEY `ft_aihr_knowledge_fragment_content` (`content`) WITH PARSER ngram ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识片段'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_import_task` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `directory` varchar(500) NOT NULL COMMENT '导入相对目录', `category` varchar(100) NOT NULL COMMENT '知识库分类', `status` tinyint DEFAULT 0 COMMENT '任务状态: 0等待, 1运行中, 2完成, 3失败, 4取消', `total_files` int DEFAULT 0 COMMENT '发现文件数', `imported_files` int DEFAULT 0 COMMENT '已导入文件数', `failed_files` int DEFAULT 0 COMMENT '失败文件数', `current_file` varchar(500) DEFAULT NULL COMMENT '当前文件', `started_time` datetime DEFAULT NULL COMMENT '开始时间', `finished_time` datetime DEFAULT NULL COMMENT '完成时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `idx_aihr_knowledge_import_task_tenant` (`tenant_id`, `update_time`), KEY `idx_aihr_knowledge_import_task_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识库导入任务'; INSERT INTO `aihr_knowledge_info` (`id`, `tenant_id`, `name`, `code`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`) VALUES (1001, '000000', '投诉处理 SOP', 'legacy_1001', '业主投诉的接待、记录、派单、反馈和闭环确认。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须引用投诉处理 SOP 片段,不得编造未命中的金额、责任和时限。', NOW(), NOW(), 'seed:sop'), (1002, '000000', '催缴沟通 SOP', 'legacy_1002', '缴费提醒、费用争议回应、服务问题承接。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须区分服务整改与费用义务。', NOW(), NOW(), 'seed:sop'), (1003, '000000', '报修跟进 SOP', 'legacy_1003', '报修接单、派工、现场反馈、复核关闭。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '回答必须给出明确节点和责任人。', NOW(), NOW(), 'seed:sop'), (1201, '000000', '增值服务需求识别 SOP', 'legacy_1201', '基于业主真实需求介绍增值服务,明确适用范围、价格和取消规则。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '只能基于已确认的服务目录和价目口径回答,不得编造优惠或效果承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'), (1202, '000000', '日常服务回访 SOP', 'legacy_1202', '服务完成后的满意度确认、遗留问题记录、责任人和回访节点。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '已完成不等于已闭环,回答必须包含满意度确认、责任人和下一次回访节点。', NOW(), NOW(), 'seed:sop:brd-supplement') ON DUPLICATE KEY UPDATE `description` = VALUES(`description`), `system_prompt` = VALUES(`system_prompt`), `update_time` = NOW(); INSERT INTO `aihr_knowledge_attach` (`id`, `tenant_id`, `knowledge_id`, `doc_id`, `name`, `type`, `status`, `create_time`, `update_time`, `remark`) VALUES (1001, '000000', 1001, 'sop_complaint_v1', '投诉处理 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:品质组'), (1002, '000000', 1002, 'sop_payment_v1', '催缴沟通 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:财务组'), (1003, '000000', 1003, 'sop_repair_v1', '报修跟进 SOP v1.0', 'sop', 2, NOW(), NOW(), 'owner:工程组'), (1201, '000000', 1201, 'sop_service_promotion_v1', '增值服务需求识别 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement'), (1202, '000000', 1202, 'sop_daily_service_v1', '日常服务回访 SOP v1.0', 'sop', 2, NOW(), NOW(), 'seed:sop:brd-supplement') ON DUPLICATE KEY UPDATE `status` = VALUES(`status`), `update_time` = NOW(); INSERT INTO `aihr_knowledge_fragment` (`id`, `tenant_id`, `knowledge_id`, `idx`, `doc_id`, `content`, `create_time`, `update_time`, `remark`) VALUES (100101, '000000', 1001, 1, 'sop_complaint_v1', '接到业主投诉后,管家第一步应先安抚业主情绪,表达理解,避免立即争辩责任归属。', NOW(), NOW(), 'seed:sop'), (100102, '000000', 1001, 2, 'sop_complaint_v1', '投诉记录必须包含房号、联系人、发生时间、现场照片、影响范围和业主核心诉求。', NOW(), NOW(), 'seed:sop'), (100103, '000000', 1001, 3, 'sop_complaint_v1', '创建投诉工单后,应告知首次反馈时限、责任人和下一次同步节点。', NOW(), NOW(), 'seed:sop'), (100201, '000000', 1002, 1, 'sop_payment_v1', '业主因服务不满拒缴时,客服应先记录具体服务问题,不以欠费事实压过诉求。', NOW(), NOW(), 'seed:sop'), (100202, '000000', 1002, 2, 'sop_payment_v1', '催缴沟通需说明费用构成、账期和缴费渠道,避免承诺超出权限的减免。', NOW(), NOW(), 'seed:sop'), (100203, '000000', 1002, 3, 'sop_payment_v1', '对服务整改事项设置跟进责任人,并在约定时间内反馈处理进度。', NOW(), NOW(), 'seed:sop'), (100301, '000000', 1003, 1, 'sop_repair_v1', '报修超时跟进前,必须确认工单编号、责任班组、当前状态和超时原因。', NOW(), NOW(), 'seed:sop'), (100302, '000000', 1003, 2, 'sop_repair_v1', '向业主同步下一次反馈或到场时间,避免只说尽快处理。', NOW(), NOW(), 'seed:sop'), (100303, '000000', 1003, 3, 'sop_repair_v1', '维修完成后需向业主确认处理效果,再补充关闭证据并关闭工单。', NOW(), NOW(), 'seed:sop'), (120101, '000000', 1201, 1, 'sop_service_promotion_v1', '介绍增值服务前,先确认业主的家庭场景、实际需求、预算和期望结果,不直接罗列产品。', NOW(), NOW(), 'seed:sop:brd-supplement'), (120102, '000000', 1201, 2, 'sop_service_promotion_v1', '服务介绍必须说明适用范围、正式价目、办理路径和取消规则;未确认的信息不得口头承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'), (120103, '000000', 1201, 3, 'sop_service_promotion_v1', '业主暂不需要时应记录需求和后续咨询方式,不以夸大效果、强行推销或虚构优惠促成转化。', NOW(), NOW(), 'seed:sop:brd-supplement'), (120201, '000000', 1202, 1, 'sop_daily_service_v1', '服务完成后要确认业主是否满意、是否还有遗留问题,并记录新的服务需求。', NOW(), NOW(), 'seed:sop:brd-supplement'), (120202, '000000', 1202, 2, 'sop_daily_service_v1', '对未解决事项明确责任人、下一次反馈时间和记录方式,不能只说已经处理。', NOW(), NOW(), 'seed:sop:brd-supplement'), (120203, '000000', 1202, 3, 'sop_daily_service_v1', '回访结束后更新服务记录;业主再次反馈时,应能沿用既有记录继续处理,避免重复询问。', NOW(), NOW(), 'seed:sop:brd-supplement') ON DUPLICATE KEY UPDATE `content` = VALUES(`content`), `update_time` = NOW(); -- 知识库批量上传队列:上传秒回后由后台 worker 加工,支持单文件重试 CREATE TABLE IF NOT EXISTS `aihr_knowledge_upload_item` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `batch_id` varchar(64) NOT NULL COMMENT '上传批次', `file_name` varchar(255) NOT NULL COMMENT '文件名', `category` varchar(100) DEFAULT '' COMMENT '目标分类', `space_codes_json` json DEFAULT NULL COMMENT '目标知识空间编码数组', `staging_path` varchar(500) NOT NULL COMMENT '暂存文件路径', `status` tinyint NOT NULL DEFAULT 0 COMMENT '0待处理 1处理中 2完成 3失败', `error` varchar(500) DEFAULT NULL COMMENT '失败原因', `doc_id` varchar(80) DEFAULT NULL COMMENT '入库文档ID', `fragment_count` int DEFAULT NULL COMMENT '片段数', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_aihr_upload_item_batch` (`tenant_id`, `batch_id`, `id`), KEY `idx_aihr_upload_item_status` (`tenant_id`, `status`, `update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识库批量上传队列'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_space_grant` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', `knowledge_id` bigint NOT NULL COMMENT '知识空间ID', `principal_type` varchar(20) NOT NULL COMMENT 'ROLE/USER', `principal_value` varchar(100) NOT NULL COMMENT '角色编码或用户ID', `permission` varchar(20) NOT NULL COMMENT 'READ/MANAGE', `status` varchar(20) NOT NULL DEFAULT 'ACTIVE' COMMENT 'ACTIVE/DISABLED', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_space_grant` (`tenant_id`, `knowledge_id`, `principal_type`, `principal_value`, `permission`), KEY `idx_aihr_space_grant_principal` (`tenant_id`, `principal_type`, `principal_value`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识空间主体授权'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_app` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', `app_code` varchar(64) NOT NULL COMMENT '调用应用稳定编码', `app_name` varchar(100) NOT NULL COMMENT '调用应用名称', `auth_type` varchar(20) NOT NULL COMMENT 'SESSION/API_TOKEN', `internal_client_key` varchar(64) DEFAULT NULL COMMENT '内部登录客户端key', `token_hash` varchar(64) DEFAULT NULL COMMENT '外部令牌SHA-256', `status` varchar(20) NOT NULL DEFAULT 'ACTIVE' COMMENT 'ACTIVE/DISABLED', `rate_limit_per_minute` int NOT NULL DEFAULT 60 COMMENT '每分钟请求上限', `expires_time` datetime DEFAULT NULL COMMENT '令牌到期时间', `last_used_time` datetime DEFAULT NULL COMMENT '最后调用时间', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_knowledge_app_code` (`app_code`), UNIQUE KEY `uk_aihr_knowledge_app_client` (`tenant_id`, `auth_type`, `internal_client_key`), KEY `idx_aihr_knowledge_app_tenant_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识问答调用应用'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_app_space` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', `app_id` bigint NOT NULL COMMENT '调用应用ID', `knowledge_id` bigint NOT NULL COMMENT '知识空间ID', `create_by` bigint DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_app_space` (`tenant_id`, `app_id`, `knowledge_id`), KEY `idx_aihr_app_space_knowledge` (`tenant_id`, `knowledge_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='调用应用与知识空间授权'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_query_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `request_id` varchar(64) NOT NULL COMMENT '请求追踪ID', `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', `app_id` bigint NOT NULL COMMENT '调用应用ID', `user_id` bigint DEFAULT NULL COMMENT '内部用户ID', `question_hash` varchar(64) NOT NULL COMMENT '问题SHA-256', `used_space_codes_json` json DEFAULT NULL COMMENT '实际使用空间编码', `source_types_json` json DEFAULT NULL COMMENT '来源类型', `status` varchar(30) NOT NULL COMMENT 'SUCCESS/NO_EVIDENCE/REJECTED/FAILED', `latency_ms` bigint NOT NULL DEFAULT 0 COMMENT '处理耗时毫秒', `model_name` varchar(100) DEFAULT NULL COMMENT '生成模型', `prompt_version` varchar(100) DEFAULT NULL COMMENT '提示词版本', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_query_request` (`request_id`), KEY `idx_aihr_query_tenant_app` (`tenant_id`, `app_id`, `create_time`), KEY `idx_aihr_query_status` (`tenant_id`, `status`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识问答最小化审计日志'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_admin_audit` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', `operator_id` bigint DEFAULT NULL COMMENT '操作人', `action` varchar(50) NOT NULL COMMENT '操作动作', `object_type` varchar(30) NOT NULL COMMENT 'SPACE/GRANT/APP/APP_SPACE/TOKEN', `object_id` bigint DEFAULT NULL COMMENT '对象ID', `before_summary` varchar(1000) DEFAULT NULL COMMENT '变更前摘要', `after_summary` varchar(1000) DEFAULT NULL COMMENT '变更后摘要', `create_time` datetime NOT NULL COMMENT '操作时间', PRIMARY KEY (`id`), KEY `idx_aihr_admin_audit_tenant` (`tenant_id`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识平台管理变更审计';