-- 诊单/患者资料 AI:持久化表 + 报告读取/助手/智能分析/刷新/编辑五个独立 API 权限。 -- 五个 perms 必须与 DiagnosisController action 一一对应,否则 -- AuthMiddleware 会把未注册 URI 当作无需鉴权的普通接口直接放行。 CREATE TABLE IF NOT EXISTS `zyt_diagnosis_ai_report` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '报告ID', `diagnosis_id` int unsigned NOT 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_content` mediumtext NOT NULL COMMENT '报告原始内容', `message_id` varchar(191) NOT NULL DEFAULT '' COMMENT 'Dify message_id', `prompt_version` varchar(50) NOT NULL DEFAULT '' COMMENT '提示词版本', `case_fingerprint` char(64) NOT NULL DEFAULT '' COMMENT '生成时病例内容SHA-256', `generated_by` int unsigned NOT NULL DEFAULT 0 COMMENT '最近生成管理员ID', `generated_time` int unsigned NOT NULL DEFAULT 0 COMMENT '最近生成时间', `edited_by` int unsigned NOT NULL DEFAULT 0 COMMENT '最近人工编辑管理员ID', `edited_time` int unsigned NOT NULL DEFAULT 0 COMMENT '最近人工编辑时间', `create_time` int unsigned NOT NULL DEFAULT 0 COMMENT '创建时间', `update_time` int unsigned NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_diagnosis_model` (`diagnosis_id`, `model_key`), KEY `idx_generated_by_time` (`generated_by`, `generated_time`), KEY `idx_edited_by_time` (`edited_by`, `edited_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='诊单AI报告'; START TRANSACTION; SET @reception_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `type` = 'C' AND ( `perms` = 'doctor.appointment/lists' OR `component` = 'patient/reception/index' OR `component` LIKE '%patient/reception/index%' ) ORDER BY `id` LIMIT 1 ); SET @diagnosis_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `type` = 'C' AND `perms` = 'tcm.diagnosis/lists' ORDER BY `id` LIMIT 1 ); SET @ai_menu_pid := COALESCE(NULLIF(@reception_menu_id, 0), @diagnosis_menu_id, 0); 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 @ai_menu_pid, 'A', '查看AI报告', '', 61, 'tcm.diagnosis/aiReports', '', '', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiReports' ); 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 @ai_menu_pid, 'A', '使用AI助手', '', 62, 'tcm.diagnosis/aiAssistant', '', '', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiAssistant' ); 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 @ai_menu_pid, 'A', 'AI智能分析', '', 65, 'tcm.diagnosis/aiAnalysis', '', '', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiAnalysis' ); 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 @ai_menu_pid, 'A', '生成AI报告', '', 63, 'tcm.diagnosis/generateAiReports', '', '', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/generateAiReports' ); 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 @ai_menu_pid, 'A', '编辑AI报告', '', 64, 'tcm.diagnosis/editAiReport', '', '', '', '', 0, 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/editAiReport' ); SET @diagnosis_ai_read_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiReports' ORDER BY `id` LIMIT 1 ); SET @diagnosis_ai_refresh_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/generateAiReports' ORDER BY `id` LIMIT 1 ); SET @diagnosis_ai_assistant_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiAssistant' ORDER BY `id` LIMIT 1 ); SET @diagnosis_ai_analysis_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/aiAnalysis' ORDER BY `id` LIMIT 1 ); SET @diagnosis_ai_edit_menu_id := ( SELECT `id` FROM `zyt_system_menu` WHERE `perms` = 'tcm.diagnosis/editAiReport' ORDER BY `id` LIMIT 1 ); -- 能看接诊台/只读病例/诊单列表的角色继承读取已保存报告。 INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`) SELECT DISTINCT `role_menu`.`role_id`, @diagnosis_ai_read_menu_id FROM `zyt_system_role_menu` AS `role_menu` INNER JOIN `zyt_system_menu` AS `menu` ON `menu`.`id` = `role_menu`.`menu_id` WHERE @diagnosis_ai_read_menu_id IS NOT NULL AND ( `menu`.`perms` IN ( 'doctor.appointment/lists', 'doctor.appointment/reception', 'tcm.diagnosis/lists', 'tcm.diagnosis/readonlyDetail', 'tcm.diagnosis/detail' ) OR `menu`.`id` IN (@reception_menu_id, @diagnosis_menu_id) ); -- 已获准查看该诊单 AI 资料的角色可使用按病例范围受控的问诊助手。 INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`) SELECT `role_id`, @diagnosis_ai_assistant_menu_id FROM `zyt_system_role_menu` WHERE @diagnosis_ai_read_menu_id IS NOT NULL AND @diagnosis_ai_assistant_menu_id IS NOT NULL AND `menu_id` = @diagnosis_ai_read_menu_id; -- 接诊台结构化分析使用独立权限,默认授予已能读取诊单 AI 资料的角色,之后可独立撤销。 INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`) SELECT `role_id`, @diagnosis_ai_analysis_menu_id FROM `zyt_system_role_menu` WHERE @diagnosis_ai_read_menu_id IS NOT NULL AND @diagnosis_ai_analysis_menu_id IS NOT NULL AND `menu_id` = @diagnosis_ai_read_menu_id; -- 能读取报告的角色默认继承生成权限,之后可独立撤销。 INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`) SELECT `role_id`, @diagnosis_ai_refresh_menu_id FROM `zyt_system_role_menu` WHERE @diagnosis_ai_read_menu_id IS NOT NULL AND @diagnosis_ai_refresh_menu_id IS NOT NULL AND `menu_id` = @diagnosis_ai_read_menu_id; -- 编辑仅继承给已有诊单编辑能力的角色。 INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`) SELECT DISTINCT `role_menu`.`role_id`, @diagnosis_ai_edit_menu_id FROM `zyt_system_role_menu` AS `role_menu` INNER JOIN `zyt_system_menu` AS `menu` ON `menu`.`id` = `role_menu`.`menu_id` WHERE @diagnosis_ai_edit_menu_id IS NOT NULL AND `menu`.`perms` IN ('tcm.diagnosis/edit'); COMMIT;