This commit is contained in:
Your Name
2026-11-12 09:07:07 +08:00
parent 06afe2c453
commit c737960d4f
1399 changed files with 19163 additions and 3089 deletions
@@ -0,0 +1,99 @@
-- 医助服务模块:仅新增独立表,不修改既有诊单、处方和提醒状态语义。
-- 幂等建表;执行前核实实际前缀。依赖现有 zyt_tcm_diagnosis_todo。
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_record` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`diagnosis_id` int unsigned NOT NULL,
`patient_id` int unsigned NOT NULL DEFAULT 0,
`actor_id` int unsigned NOT NULL,
`content` text NOT NULL,
`record_type` varchar(32) NOT NULL,
`speaker_confirmed` tinyint unsigned NOT NULL DEFAULT 0,
`occurred_at` int unsigned NOT NULL,
`created_at` int unsigned NOT NULL,
`delete_time` int unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_diagnosis_occurred` (`diagnosis_id`,`occurred_at`),
KEY `idx_actor` (`actor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='医助人工服务记录与核对转写';
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_job` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`diagnosis_id` int unsigned NOT NULL,
`patient_id` int unsigned NOT NULL DEFAULT 0,
`actor_id` int unsigned NOT NULL,
`type` varchar(16) NOT NULL,
`scenario` varchar(16) NOT NULL,
`days` int unsigned NOT NULL DEFAULT 30,
`status` varchar(32) NOT NULL DEFAULT 'queued',
`version` int unsigned NOT NULL DEFAULT 1,
`dedupe_key` char(64) NOT NULL,
`source_hash` char(64) NOT NULL,
`scope_hash` char(64) NOT NULL,
`payload_json` mediumtext NOT NULL,
`result_json` mediumtext DEFAULT NULL,
`claim_token` varchar(64) NOT NULL DEFAULT '',
`lease_until` int unsigned NOT NULL DEFAULT 0,
`error_code` varchar(64) NOT NULL DEFAULT '',
`error_message` varchar(255) NOT NULL DEFAULT '',
`upstream_id` varchar(191) NOT NULL DEFAULT '',
`created_at` int unsigned NOT NULL,
`updated_at` int unsigned NOT NULL,
`finished_at` int unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dedupe` (`dedupe_key`),
KEY `idx_queue` (`status`,`created_at`,`id`),
KEY `idx_lease` (`status`,`lease_until`),
KEY `idx_diagnosis` (`diagnosis_id`,`created_at`),
KEY `idx_actor_day` (`actor_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='医助AI持久任务与版本化结果';
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_review` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`job_id` bigint unsigned NOT NULL,
`item_key` varchar(64) NOT NULL,
`reviewer_id` int unsigned NOT NULL,
`decision` varchar(32) NOT NULL,
`note` varchar(1000) NOT NULL DEFAULT '',
`created_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_job_item` (`job_id`,`item_key`,`id`),
KEY `idx_reviewer` (`reviewer_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='医助服务质检人工复核历史';
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_action` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`diagnosis_id` int unsigned NOT NULL,
`job_id` bigint unsigned NOT NULL,
`action_key` varchar(64) NOT NULL,
`todo_id` bigint unsigned NOT NULL,
`assignee_id` int unsigned NOT NULL,
`content` varchar(1000) NOT NULL,
`due_at` int unsigned NOT NULL,
`business_state` varchar(20) NOT NULL DEFAULT 'pending',
`completion_note` varchar(1000) NOT NULL DEFAULT '',
`completed_at` int unsigned NOT NULL DEFAULT 0,
`created_at` int unsigned NOT NULL,
`updated_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_job_action` (`job_id`,`action_key`),
UNIQUE KEY `uk_todo` (`todo_id`),
KEY `idx_assignee_state_due` (`assignee_id`,`business_state`,`due_at`),
KEY `idx_diagnosis` (`diagnosis_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服务动作执行状态,独立于提醒发送状态';
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_knowledge` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`question` varchar(300) NOT NULL,
`answer` text NOT NULL,
`category` varchar(64) NOT NULL,
`source_note` varchar(1000) NOT NULL DEFAULT '',
`status` varchar(16) NOT NULL DEFAULT 'draft',
`version` int unsigned NOT NULL DEFAULT 1,
`created_by` int unsigned NOT NULL,
`published_by` int unsigned NOT NULL DEFAULT 0,
`created_at` int unsigned NOT NULL,
`updated_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`,`id`),
KEY `idx_category` (`category`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审核后发布的医助服务知识';
@@ -0,0 +1,42 @@
-- 独立医助服务菜单与权限;可重复执行,不覆盖已有自定义授权。
START TRANSACTION;
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 0,'M','医助服务','el-icon-Service',790,'','assistant_service','','','',0,1,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `pid`=0 AND `paths`='assistant_service');
SET @as_root=(SELECT id FROM `zyt_system_menu` WHERE pid=0 AND paths='assistant_service' ORDER BY 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 @as_root,'C','服务工作台','el-icon-List',20,'tcm.assistantService/view','workbench','assistant_service/workbench/index','','',0,1,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_root IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/view');
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 @as_root,'C','服务知识','el-icon-Reading',10,'tcm.assistantService/manageKnowledge','knowledge','assistant_service/knowledge/index','','',0,1,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_root IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/manageKnowledge');
SET @as_workbench=(SELECT id FROM `zyt_system_menu` WHERE perms='tcm.assistantService/view' ORDER BY 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 @as_workbench,'A','生成服务分析','',0,'tcm.assistantService/analyze','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/analyze');
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 @as_workbench,'A','生成回复草稿','',0,'tcm.assistantService/draftReply','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/draftReply');
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 @as_workbench,'A','登记服务记录','',0,'tcm.assistantService/record','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/record');
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 @as_workbench,'A','采纳跟进动作','',0,'tcm.assistantService/adoptAction','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/adoptAction');
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 @as_workbench,'A','处理服务待办','',0,'tcm.assistantService/completeAction','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/completeAction');
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 @as_workbench,'A','复核服务质检','',0,'tcm.assistantService/reviewQuality','','','','',0,0,0,UNIX_TIMESTAMP(),UNIX_TIMESTAMP()
FROM DUAL WHERE @as_workbench IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms`='tcm.assistantService/reviewQuality');
-- 一线及管理角色的工作台权限;root 由服务端显式识别。
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `zyt_system_role` r JOIN `zyt_system_menu` m
ON (m.id=@as_root OR m.perms IN ('tcm.assistantService/view','tcm.assistantService/analyze','tcm.assistantService/draftReply','tcm.assistantService/record','tcm.assistantService/adoptAction','tcm.assistantService/completeAction'))
WHERE r.delete_time IS NULL AND r.name IN ('医助','经理','诊室组长','管理员');
-- 质检与知识发布仅授权管理角色。
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`,`menu_id`)
SELECT r.id,m.id FROM `zyt_system_role` r JOIN `zyt_system_menu` m
ON m.perms IN ('tcm.assistantService/reviewQuality','tcm.assistantService/manageKnowledge')
WHERE r.delete_time IS NULL AND r.name IN ('经理','诊室组长','管理员');
COMMIT;
Binary file not shown.
@@ -0,0 +1,49 @@
-- 今日联系计划:仅记录真实来源的当日责任,不重建启用前历史,不改变提醒发送状态。
-- MySQL 5.7 兼容;先执行 1.9.20261109 医助服务模块表迁移。核实实际表前缀后执行。
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_daily_contact` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`business_date` date NOT NULL COMMENT 'Asia/Shanghai 自然日',
`assistant_id` int unsigned NOT NULL,
`diagnosis_id` int unsigned NOT NULL,
`patient_id` int unsigned NOT NULL DEFAULT 0,
`source_type` varchar(16) NOT NULL COMMENT 'revisit/action',
`source_id` bigint unsigned NOT NULL,
`source_order_id` int unsigned NOT NULL DEFAULT 0 COMMENT '复诊原订单周期,动作固定0',
`reason` varchar(200) NOT NULL DEFAULT '',
`due_at` int unsigned NOT NULL DEFAULT 0,
`state` varchar(16) NOT NULL DEFAULT 'active' COMMENT 'active/exempt,豁免不算完成',
`exempt_reason` varchar(200) NOT NULL DEFAULT '',
`created_at` int unsigned NOT NULL,
`updated_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_day_source` (`business_date`,`assistant_id`,`source_type`,`source_id`,`source_order_id`),
KEY `idx_day_staff_patient` (`business_date`,`assistant_id`,`patient_id`),
KEY `idx_diagnosis_day` (`diagnosis_id`,`business_date`),
KEY `idx_day_cursor` (`business_date`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='医助今日联系固化计划与来源豁免';
-- 旧泛化动作不能自动成为联系任务。已存在列时不重写既有取值。
SET @daily_contact_column = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'zyt_assistant_service_action' AND COLUMN_NAME = 'contact_required'
);
SET @daily_contact_sql = IF(@daily_contact_column = 0,
'ALTER TABLE `zyt_assistant_service_action` ADD COLUMN `contact_required` tinyint unsigned NOT NULL DEFAULT 0 COMMENT ''人工采纳时明确要求联系患者''',
'SELECT 1'
);
PREPARE daily_contact_stmt FROM @daily_contact_sql;
EXECUTE daily_contact_stmt;
DEALLOCATE PREPARE daily_contact_stmt;
-- 实际完成/取消操作者只记录今后的真实操作,0表示旧数据未知,禁止按负责人回填。
SET @daily_contact_column = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'zyt_assistant_service_action' AND COLUMN_NAME = 'completed_by'
);
SET @daily_contact_sql = IF(@daily_contact_column = 0,
'ALTER TABLE `zyt_assistant_service_action` ADD COLUMN `completed_by` int unsigned NOT NULL DEFAULT 0 COMMENT ''实际完成或取消操作者,旧数据0未知''',
'SELECT 1'
);
PREPARE daily_contact_stmt FROM @daily_contact_sql;
EXECUTE daily_contact_stmt;
DEALLOCATE PREPARE daily_contact_stmt;
@@ -0,0 +1,26 @@
-- 行为预警。只保存规则命中和摘录。channel 为 im 或 call。
-- MySQL 5.7 兼容;可重复执行。核实实际表前缀后执行。
CREATE TABLE IF NOT EXISTS `zyt_assistant_service_alert` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`staff_admin_id` int unsigned NOT NULL COMMENT '发消息时的员工账号,不按患者当前归属回填',
`patient_id` int unsigned NOT NULL,
`diagnosis_id` int unsigned NOT NULL DEFAULT 0 COMMENT '消息上的诊单,0表示当时没有可靠诊单',
`channel` varchar(16) NOT NULL COMMENT 'im',
`source_id` bigint unsigned NOT NULL COMMENT '来源表主键,企微文字为 0',
`source_key` varchar(80) NOT NULL DEFAULT '' COMMENT '企微消息和患者组成的来源键',
`rule_code` varchar(32) NOT NULL,
`rule_version` smallint unsigned NOT NULL,
`severity` varchar(16) NOT NULL COMMENT 'high/medium/low',
`snippet` varchar(120) NOT NULL COMMENT '命中位置附近的摘录',
`status` varchar(16) NOT NULL DEFAULT 'open' COMMENT 'open/confirmed/false_positive/followed',
`reviewer_id` int unsigned NOT NULL DEFAULT 0,
`review_note` varchar(200) NOT NULL DEFAULT '',
`reviewed_at` int unsigned NOT NULL DEFAULT 0,
`occurred_at` int unsigned NOT NULL,
`created_at` int unsigned NOT NULL,
`updated_at` int unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_channel_source_rule` (`channel`,`source_id`,`source_key`,`rule_code`),
KEY `idx_status_time` (`status`,`occurred_at`,`id`),
KEY `idx_staff_time` (`staff_admin_id`,`occurred_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='医助行为预警';
@@ -0,0 +1,6 @@
-- 行为预警接入企微聊天归档。已有库执行一次;新库用 02 建表即可。
ALTER TABLE `zyt_assistant_service_alert`
ADD COLUMN `source_key` varchar(80) NOT NULL DEFAULT '' COMMENT '企微消息和患者组成的来源键' AFTER `source_id`;
ALTER TABLE `zyt_assistant_service_alert` DROP INDEX `uk_channel_source_rule`;
ALTER TABLE `zyt_assistant_service_alert`
ADD UNIQUE KEY `uk_channel_source_rule` (`channel`,`source_id`,`source_key`,`rule_code`);
@@ -0,0 +1,4 @@
-- 本地企微归档对不上患者或员工时,保留会话名和账号名。已有库执行一次。
ALTER TABLE `zyt_assistant_service_alert`
ADD COLUMN `external_staff` varchar(64) NOT NULL DEFAULT '' COMMENT '归档账号名,员工账号对不上时使用' AFTER `source_key`,
ADD COLUMN `external_patient` varchar(64) NOT NULL DEFAULT '' COMMENT '归档会话名,患者对不上时使用' AFTER `external_staff`;