fix(knowledge): gate policy answers by formal sources

This commit is contained in:
key
2026-07-31 00:28:41 +08:00
parent a3689591e7
commit bf703b7853
16 changed files with 470 additions and 20 deletions
@@ -0,0 +1,62 @@
-- 正式知识来源治理:附件级权威性、发布状态、版本、生效期和原文件哈希。
-- 只创建治理契约,不把任何既有附件自动认定为正式来源。
-- 可重复执行;生产请求只读校验,不允许在运行时补表。
CREATE TABLE IF NOT EXISTS `aihr_knowledge_source_governance` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
`source_id` varchar(80) NOT NULL COMMENT '稳定来源编号',
`attachment_id` bigint NOT NULL COMMENT '知识附件ID',
`source_doc_id` varchar(80) NOT NULL COMMENT '审批时附件文档ID快照',
`authority_type` varchar(30) NOT NULL COMMENT 'FORMAL_POLICY/TRAINING/EXPERIENCE/INTERVIEW/DRAFT',
`lifecycle_status` varchar(20) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/APPROVED/REJECTED/RETIRED',
`source_version` varchar(80) NOT NULL COMMENT '正式版本或发文号',
`effective_date` date NOT NULL COMMENT '生效日期',
`expires_date` date DEFAULT NULL COMMENT '失效日期',
`applicability_scope` varchar(500) NOT NULL COMMENT '适用范围',
`content_sha256` char(64) NOT NULL COMMENT '审批时原文件SHA-256',
`approval_basis` varchar(255) NOT NULL COMMENT '审批依据或受控试点决策',
`approved_by` varchar(100) DEFAULT NULL COMMENT '审批主体',
`approved_time` datetime DEFAULT NULL COMMENT '审批时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_aihr_knowledge_source_id` (`tenant_id`, `source_id`),
UNIQUE KEY `uk_aihr_knowledge_source_attachment` (`tenant_id`, `attachment_id`),
KEY `idx_aihr_knowledge_source_retrieval`
(`tenant_id`, `authority_type`, `lifecycle_status`, `effective_date`, `expires_date`),
KEY `idx_aihr_knowledge_source_doc` (`tenant_id`, `source_doc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COMMENT='AIHR知识附件来源治理';
-- 与租户事实表保持同一排序规则,兼容历史库和全新 MySQL 8 数据库。
SET @formal_source_target_collation := (
SELECT collation_name FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'aihr_knowledge_info'
AND column_name = 'tenant_id'
LIMIT 1
);
SET @formal_source_target_collation := COALESCE(@formal_source_target_collation, @@collation_database);
SET @formal_source_table_collation := (
SELECT table_collation FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = 'aihr_knowledge_source_governance'
LIMIT 1
);
SET @formal_source_ddl := IF(
@formal_source_table_collation = @formal_source_target_collation,
'SELECT 1',
CONCAT(
'ALTER TABLE aihr_knowledge_source_governance ',
'CONVERT TO CHARACTER SET utf8mb4 COLLATE ',
@formal_source_target_collation
)
);
PREPARE aihr_formal_source_stmt FROM @formal_source_ddl;
EXECUTE aihr_formal_source_stmt;
DEALLOCATE PREPARE aihr_formal_source_stmt;
SET @formal_source_target_collation := NULL;
SET @formal_source_table_collation := NULL;
SET @formal_source_ddl := NULL;