This commit is contained in:
Your Name
2026-08-12 17:18:56 +08:00
parent 28cd110dae
commit f48a66b611
24 changed files with 3095 additions and 233 deletions
@@ -0,0 +1,27 @@
-- 医生工作站视频接通后的实时录音转写。
-- 转写摘要固化到每条通话记录,分段表用唯一键保证 WebChannel 重试幂等。
ALTER TABLE `zyt_tcm_call_record`
ADD COLUMN `transcription_session_id` varchar(128) NOT NULL DEFAULT '' COMMENT '实时转写会话ID',
ADD COLUMN `transcription_language` varchar(32) NOT NULL DEFAULT '' COMMENT '转写源语言',
ADD COLUMN `transcription_status` varchar(16) NOT NULL DEFAULT '' COMMENT 'running/completed/partial/failed',
ADD COLUMN `transcription_segment_count` int unsigned NOT NULL DEFAULT 0 COMMENT '已持久化完成分段数',
ADD COLUMN `transcript_text` longtext NULL COMMENT '按时间和说话人生成的面诊对话文字',
ADD COLUMN `transcription_started_at` int unsigned NOT NULL DEFAULT 0 COMMENT '转写开始Unix时间',
ADD COLUMN `transcription_finished_at` int unsigned NOT NULL DEFAULT 0 COMMENT '转写完成Unix时间';
CREATE TABLE IF NOT EXISTS `zyt_tcm_call_transcript_segment` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '分段ID',
`call_record_id` int unsigned NOT NULL COMMENT '通话记录ID',
`transcription_session_id` varchar(128) NOT NULL COMMENT '实时转写会话ID',
`segment_id` varchar(160) NOT NULL COMMENT '腾讯云完成分段ID',
`speaker_user_id` varchar(160) NOT NULL DEFAULT '' COMMENT '说话人TRTC用户ID',
`speaker_role` varchar(20) NOT NULL DEFAULT 'unknown' COMMENT 'doctor/patient/unknown',
`timestamp_ms` bigint unsigned NOT NULL DEFAULT 0 COMMENT '分段时间戳(毫秒)',
`text` text NOT NULL COMMENT '完成分段文字,最多4000字符',
`create_time` int unsigned NOT NULL DEFAULT 0,
`update_time` int unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_call_session_segment` (`call_record_id`, `transcription_session_id`, `segment_id`),
KEY `idx_call_session_time` (`call_record_id`, `transcription_session_id`, `timestamp_ms`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='视频面诊实时转写完成分段';
@@ -0,0 +1,89 @@
-- 实时转写接口继承现有“1v1通话”权限,避免未注册 action 被默认放行。
START TRANSACTION;
SET @video_call_menu_id := (
SELECT `id`
FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/video-call'
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 @video_call_menu_id, 'A', '启动通话转写', '', 1,
'tcm.diagnosis/startCallTranscription', '', '', '', '', 0, 1, 0,
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @video_call_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/startCallTranscription'
);
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 @video_call_menu_id, 'A', '保存通话转写分段', '', 2,
'tcm.diagnosis/upsertCallTranscriptSegments', '', '', '', '', 0, 1, 0,
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @video_call_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/upsertCallTranscriptSegments'
);
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 @video_call_menu_id, 'A', '完成通话转写', '', 3,
'tcm.diagnosis/finishCallTranscription', '', '', '', '', 0, 1, 0,
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @video_call_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/finishCallTranscription'
);
SET @transcription_start_menu_id := (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/startCallTranscription'
ORDER BY `id` LIMIT 1
);
SET @transcription_segment_menu_id := (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/upsertCallTranscriptSegments'
ORDER BY `id` LIMIT 1
);
SET @transcription_finish_menu_id := (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'tcm.diagnosis/finishCallTranscription'
ORDER BY `id` LIMIT 1
);
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`)
SELECT `role_id`, @transcription_start_menu_id
FROM `zyt_system_role_menu`
WHERE `menu_id` = @video_call_menu_id
AND @transcription_start_menu_id IS NOT NULL;
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`)
SELECT `role_id`, @transcription_segment_menu_id
FROM `zyt_system_role_menu`
WHERE `menu_id` = @video_call_menu_id
AND @transcription_segment_menu_id IS NOT NULL;
INSERT IGNORE INTO `zyt_system_role_menu` (`role_id`, `menu_id`)
SELECT `role_id`, @transcription_finish_menu_id
FROM `zyt_system_role_menu`
WHERE `menu_id` = @video_call_menu_id
AND @transcription_finish_menu_id IS NOT NULL;
COMMIT;