This commit is contained in:
Your Name
2026-08-14 14:37:30 +08:00
parent 21790e35f4
commit 18c15d1262
117 changed files with 28157 additions and 8080 deletions
@@ -0,0 +1,107 @@
-- 患者级 AI 诊断报告:不可变生成快照 + 两个独立接口权限。
-- 重要:本表故意不设置 (patient_id, model_key) 唯一键;每次生成必须 INSERT,历史绝不覆盖。
CREATE TABLE IF NOT EXISTS `zyt_patient_ai_report` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '患者AI报告快照ID',
`patient_id` int unsigned NOT NULL COMMENT '稳定患者ID(tcm_diagnosis.patient_id)',
`diagnosis_id` int unsigned DEFAULT NULL COMMENT '生成时数据域内最新诊单ID',
`model_key` varchar(32) NOT NULL COMMENT '服务端模型配置键(qwen/openai)',
`model_name` varchar(100) NOT NULL DEFAULT '' COMMENT '生成时实际模型名称快照',
`model_label` varchar(50) NOT NULL DEFAULT '' COMMENT '模型展示名快照',
`report_json` longtext NOT NULL COMMENT '结构化报告JSON',
`diagnosis` mediumtext NOT NULL COMMENT '结构化诊断分析',
`risk_assessment_json` text NOT NULL COMMENT '风险评估JSON数组',
`treatment_advice` mediumtext NOT NULL COMMENT '治疗与复核建议',
`disclaimer` varchar(255) NOT NULL DEFAULT '' COMMENT '固定医疗免责声明',
`source_snapshot` longtext NOT NULL COMMENT '生成时结构化来源快照JSON,仅服务端保存',
`source_summary_json` text NOT NULL COMMENT '用于历史列表的非原文来源计数摘要JSON',
`source_diagnosis_ids_json` text NOT NULL COMMENT '生成时全部来源诊单ID集合,用于历史行级权限复核',
`source_hash` char(64) NOT NULL COMMENT '规范化来源快照SHA-256',
`prompt_version` varchar(64) NOT NULL DEFAULT '' COMMENT '服务端提示词版本',
`message_id` varchar(191) NOT NULL DEFAULT '' COMMENT '上游消息ID,仅用于服务端审计',
`generated_at` int unsigned NOT NULL COMMENT '模型生成Unix时间',
`admin_id` int unsigned NOT NULL DEFAULT 0 COMMENT '发起生成的管理员ID',
`department_id` int unsigned NOT NULL DEFAULT 0 COMMENT '生成时首个所属部门ID快照',
`department_name` varchar(100) NOT NULL DEFAULT '' COMMENT '生成时首个所属部门名称快照',
`department_snapshot_json` text NOT NULL COMMENT '生成时全部所属部门JSON快照',
`created_at` int unsigned NOT NULL COMMENT '记录创建Unix时间',
PRIMARY KEY (`id`),
KEY `idx_patient_generated` (`patient_id`, `generated_at`, `id`),
KEY `idx_patient_model_generated` (`patient_id`, `model_key`, `generated_at`, `id`),
KEY `idx_diagnosis` (`diagnosis_id`),
KEY `idx_admin_generated` (`admin_id`, `generated_at`),
KEY `idx_department_generated` (`department_id`, `generated_at`),
KEY `idx_source_hash` (`source_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='患者级AI诊断报告不可变快照';
SET @patient_ai_parent_id := (
SELECT `id`
FROM `zyt_system_menu`
WHERE `type` = 'C'
AND `perms` IN ('tcm.diagnosis/lists', 'doctor.appointment/lists')
ORDER BY FIELD(`perms`, 'tcm.diagnosis/lists', 'doctor.appointment/lists'), `id`
LIMIT 1
);
INSERT INTO `zyt_system_menu` (
`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`,
`selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`
)
SELECT
COALESCE(@patient_ai_parent_id, 0), 'A', '查看患者AI诊断报告', '', 66,
'tcm.diagnosis/patientAiReports', '', '', '', '', 0, 1, 0,
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/patientAiReports'
);
INSERT INTO `zyt_system_menu` (
`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`,
`selected`, `params`, `is_cache`, `is_show`, `is_disable`, `create_time`, `update_time`
)
SELECT
COALESCE(@patient_ai_parent_id, 0), 'A', '生成患者AI诊断报告', '', 67,
'tcm.diagnosis/generatePatientAiReport', '', '', '', '', 0, 1, 0,
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/generatePatientAiReport'
);
SET @patient_ai_read_id := (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/patientAiReports'
ORDER BY `id` LIMIT 1
);
SET @patient_ai_generate_id := (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/generatePatientAiReport'
ORDER BY `id` LIMIT 1
);
-- 已能查看诊单/旧诊单AI报告的角色继承患者报告读取权限;之后仍可在角色菜单中单独撤销。
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`)
SELECT DISTINCT `rm`.`role_id`, @patient_ai_read_id
FROM `zyt_system_role_menu` AS `rm`
INNER JOIN `zyt_system_menu` AS `m` ON `m`.`id` = `rm`.`menu_id`
WHERE @patient_ai_read_id IS NOT NULL
AND `m`.`perms` IN (
'tcm.diagnosis/lists',
'tcm.diagnosis/detail',
'tcm.diagnosis/readonlyDetail',
'tcm.diagnosis/aiReports'
);
-- 生成是独立能力,只从原有AI生成/结构化分析能力继承,不因能查看诊单而自动开放。
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`)
SELECT DISTINCT `rm`.`role_id`, @patient_ai_generate_id
FROM `zyt_system_role_menu` AS `rm`
INNER JOIN `zyt_system_menu` AS `m` ON `m`.`id` = `rm`.`menu_id`
WHERE @patient_ai_generate_id IS NOT NULL
AND `m`.`perms` IN (
'tcm.diagnosis/generateAiReports',
'tcm.diagnosis/aiAnalysis'
);