199 lines
7.7 KiB
SQL
199 lines
7.7 KiB
SQL
-- 诊单/患者资料 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;
|