更新
This commit is contained in:
@@ -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'
|
||||
);
|
||||
Reference in New Issue
Block a user