fix(knowledge): gate policy answers by formal sources
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
-- 2026-08-01 受控内部试点正式来源白名单。
|
||||
-- 必须先独立核验原文件 SHA-256,再执行本文件;本文件只会命中精确的附件 ID + doc_id。
|
||||
-- 访谈、经验萃取、AI 生成内容和草稿不得加入此清单。
|
||||
|
||||
INSERT INTO aihr_knowledge_source_governance (
|
||||
tenant_id, source_id, attachment_id, source_doc_id, authority_type, lifecycle_status,
|
||||
source_version, effective_date, expires_date, applicability_scope, content_sha256,
|
||||
approval_basis, approved_by, approved_time
|
||||
)
|
||||
SELECT a.tenant_id, source_seed.source_id, a.id, a.doc_id, 'FORMAL_POLICY', 'APPROVED',
|
||||
source_seed.source_version, source_seed.effective_date, source_seed.expires_date,
|
||||
source_seed.applicability_scope, source_seed.content_sha256,
|
||||
'2026-08-01受控内部试点正式来源白名单', 'PROJECT_SPONSOR_DELEGATION', '2026-07-30 23:59:00'
|
||||
FROM aihr_knowledge_attach a
|
||||
JOIN (
|
||||
SELECT 1883 attachment_id, '017e4a5dfadd40279bbe5f947cfdf5e1' source_doc_id,
|
||||
'FORMAL-ZZKF01-20240919' source_id, '2024-09-19' source_version,
|
||||
DATE '2024-09-19' effective_date, NULL expires_date,
|
||||
'住宅物业/生活顾问网格化作业' applicability_scope,
|
||||
'f79a9a3f29f73d518761aa3e8707928a10b8a9ce6b56dd53f30ef73219c0c9db' content_sha256
|
||||
UNION ALL SELECT 1884, 'd544749eb13b456aaa06f0fd6c84dfc0',
|
||||
'FORMAL-ZZKF02-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/客户报事报修作业',
|
||||
'1cbecb71e28750a033c683928745ef0de3e2cf688ee8d838806f098b4a0e0182'
|
||||
UNION ALL SELECT 1885, '77a84c25c1c14b80b74c6211a76a3fa1',
|
||||
'FORMAL-ZZKF03-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/客户投诉处理作业',
|
||||
'eb6b7efa269cb46feba14d7aeb65f41bbb15352a05cdb8d092c781e9a4328ed9'
|
||||
UNION ALL SELECT 1886, '22a68eda3b6e476192224ad54a47d0a3',
|
||||
'FORMAL-ZZKF05-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/装修管理作业',
|
||||
'bf822957ba738ef5075e465ed5da4a279e1f37a0b141109425049a72b0c71550'
|
||||
UNION ALL SELECT 1922, '4e484a61c8ab473cadab75e61a672fe8',
|
||||
'FORMAL-ZZBJ06-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/垃圾收集和清运作业',
|
||||
'df3a35f6c6a624fc06c7807f6b8b7cf9e7e3c17bba974ae1c5850cf7c2483c2c'
|
||||
UNION ALL SELECT 1927, '954f717921ed43b5882ec8be7a9886ab',
|
||||
'FORMAL-ZZBJ12-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/突发事件应急作业',
|
||||
'739db239f623854b89c8a57a43484f86d244d2d126e0d623f2773b430d63b7b5'
|
||||
UNION ALL SELECT 1932, 'f448a336c14c4d6790e423abf7beb4fd',
|
||||
'FORMAL-ZZAQ04-20240919', '2024-09-19', DATE '2024-09-19', NULL,
|
||||
'住宅物业/车辆管理作业',
|
||||
'3d1e74a9abec8c2da43c95f42a877e41a93f22aa794ad75b65a1d5056a71b4f2'
|
||||
UNION ALL SELECT 1947, 'c3402e7a86504b188807f548277576ce',
|
||||
'FORMAL-YC-2026-33', '银城物业[2026]第33号', DATE '2026-05-26', NULL,
|
||||
'银城物业各事业部、公司/2026年汛期防台防汛',
|
||||
'824e6355f5506ab113919f4744a13a68c9356af0e946347bb159804e0e32feb8'
|
||||
UNION ALL SELECT 1984, 'f5bd66670ee345aa96e03c328e0753e8',
|
||||
'FORMAL-LIFE-ADVISOR-HANDBOOK-20220928', '2022-09-28', DATE '2022-09-28', NULL,
|
||||
'生活顾问岗位学习与作业参考',
|
||||
'362b9a2f01454a16eaf8fcd2cf76fe283f0dc2ced99533ade4a6ae8cc1f480fa'
|
||||
UNION ALL SELECT 1990, '31b7249eaa3c4b8d8ca59738edc1fc37',
|
||||
'FORMAL-NJ-HOUSING-CONTRACT-2025-134', '宁房办[2025]134号', DATE '2025-12-16', NULL,
|
||||
'南京市住宅小区物业服务合同示范文本适用事项',
|
||||
'9a61349811d292d7d2e75e66384e60a0e2e30f66b92d8a43557127e07b983534'
|
||||
) source_seed
|
||||
ON source_seed.attachment_id = a.id
|
||||
AND source_seed.source_doc_id = a.doc_id
|
||||
WHERE a.tenant_id = '000000'
|
||||
AND a.status = 2
|
||||
ON DUPLICATE KEY UPDATE
|
||||
source_doc_id = VALUES(source_doc_id),
|
||||
authority_type = VALUES(authority_type),
|
||||
lifecycle_status = VALUES(lifecycle_status),
|
||||
source_version = VALUES(source_version),
|
||||
effective_date = VALUES(effective_date),
|
||||
expires_date = VALUES(expires_date),
|
||||
applicability_scope = VALUES(applicability_scope),
|
||||
content_sha256 = VALUES(content_sha256),
|
||||
approval_basis = VALUES(approval_basis),
|
||||
approved_by = VALUES(approved_by),
|
||||
approved_time = VALUES(approved_time);
|
||||
|
||||
-- 失败关闭:10 个精确来源未全部注册时让 mysql 进程返回非零。
|
||||
DROP TEMPORARY TABLE IF EXISTS aihr_aug1_formal_source_assert;
|
||||
CREATE TEMPORARY TABLE aihr_aug1_formal_source_assert (
|
||||
assertion_value tinyint NOT NULL
|
||||
);
|
||||
INSERT INTO aihr_aug1_formal_source_assert (assertion_value)
|
||||
SELECT CASE WHEN COUNT(*) = 10 THEN 1 ELSE NULL END
|
||||
FROM aihr_knowledge_source_governance
|
||||
WHERE tenant_id = '000000'
|
||||
AND source_id IN (
|
||||
'FORMAL-ZZKF01-20240919', 'FORMAL-ZZKF02-20240919', 'FORMAL-ZZKF03-20240919',
|
||||
'FORMAL-ZZKF05-20240919', 'FORMAL-ZZBJ06-20240919', 'FORMAL-ZZBJ12-20240919',
|
||||
'FORMAL-ZZAQ04-20240919', 'FORMAL-YC-2026-33',
|
||||
'FORMAL-LIFE-ADVISOR-HANDBOOK-20220928', 'FORMAL-NJ-HOUSING-CONTRACT-2025-134'
|
||||
)
|
||||
AND authority_type = 'FORMAL_POLICY'
|
||||
AND lifecycle_status = 'APPROVED'
|
||||
AND effective_date <= current_date()
|
||||
AND (expires_date IS NULL OR expires_date >= current_date())
|
||||
AND CHAR_LENGTH(TRIM(source_version)) > 0
|
||||
AND content_sha256 REGEXP '^[0-9a-f]{64}$';
|
||||
DROP TEMPORARY TABLE aihr_aug1_formal_source_assert;
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user