2026-07-24 06:05:35 +00:00
|
|
|
begin;
|
|
|
|
|
|
|
|
|
|
set search_path to public;
|
|
|
|
|
|
2026-07-24 09:47:15 +00:00
|
|
|
create table if not exists speech_recognition_service (
|
|
|
|
|
id bigint generated by default as identity primary key,
|
|
|
|
|
service_type varchar(64) not null,
|
|
|
|
|
service_name varchar(128) not null,
|
|
|
|
|
built_in boolean not null default true,
|
|
|
|
|
enabled boolean not null default true,
|
|
|
|
|
base_url varchar(512),
|
|
|
|
|
transcribe_path varchar(255) not null default '/v1/audio/transcriptions',
|
|
|
|
|
task_status_path varchar(255) not null default '/v1/tasks/{task_id}',
|
|
|
|
|
file_field_name varchar(64) not null default 'file',
|
|
|
|
|
language varchar(32),
|
|
|
|
|
response_format varchar(32) not null default 'json',
|
|
|
|
|
model varchar(128),
|
|
|
|
|
prompt text,
|
|
|
|
|
hotwords text,
|
|
|
|
|
timestamp_granularities varchar(128),
|
|
|
|
|
enable_speaker_diarization boolean,
|
|
|
|
|
enable_speaker_identification boolean,
|
|
|
|
|
enable_text_cleanup boolean,
|
|
|
|
|
temperature double precision,
|
|
|
|
|
api_key varchar(512),
|
|
|
|
|
api_key_header varchar(128) not null default 'X-API-Key',
|
|
|
|
|
connect_timeout_seconds integer not null default 10,
|
|
|
|
|
read_timeout_seconds integer not null default 300,
|
|
|
|
|
task_timeout_seconds integer not null default 300,
|
|
|
|
|
task_poll_interval_millis integer not null default 1500,
|
|
|
|
|
sort_order integer not null default 100,
|
|
|
|
|
created_at timestamptz not null default now(),
|
|
|
|
|
updated_at timestamptz not null default now(),
|
|
|
|
|
constraint uk_speech_recognition_service_type unique (service_type)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
alter table if exists speech_recognition_service add column if not exists built_in boolean not null default true;
|
|
|
|
|
|
2026-07-24 06:05:35 +00:00
|
|
|
create table if not exists speech_recognition_config (
|
|
|
|
|
id bigint generated by default as identity primary key,
|
|
|
|
|
tenant_id bigint not null,
|
2026-07-24 09:47:15 +00:00
|
|
|
service_type varchar(64) not null default 'CUSTOM',
|
2026-07-24 06:05:35 +00:00
|
|
|
enabled boolean not null default true,
|
|
|
|
|
base_url varchar(512),
|
|
|
|
|
transcribe_path varchar(255) not null default '/v1/audio/transcriptions',
|
|
|
|
|
task_status_path varchar(255) not null default '/v1/tasks/{task_id}',
|
|
|
|
|
file_field_name varchar(64) not null default 'file',
|
|
|
|
|
language varchar(32),
|
|
|
|
|
response_format varchar(32) not null default 'json',
|
|
|
|
|
model varchar(128),
|
|
|
|
|
prompt text,
|
|
|
|
|
hotwords text,
|
|
|
|
|
timestamp_granularities varchar(128),
|
|
|
|
|
enable_speaker_diarization boolean,
|
|
|
|
|
enable_speaker_identification boolean,
|
|
|
|
|
enable_text_cleanup boolean,
|
|
|
|
|
temperature double precision,
|
|
|
|
|
api_key varchar(512),
|
|
|
|
|
api_key_header varchar(128) not null default 'X-API-Key',
|
|
|
|
|
connect_timeout_seconds integer not null default 10,
|
|
|
|
|
read_timeout_seconds integer not null default 300,
|
|
|
|
|
task_timeout_seconds integer not null default 300,
|
|
|
|
|
task_poll_interval_millis integer not null default 1500,
|
|
|
|
|
created_at timestamptz not null default now(),
|
|
|
|
|
updated_at timestamptz not null default now(),
|
|
|
|
|
constraint uk_speech_recognition_config_tenant unique (tenant_id)
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-24 09:47:15 +00:00
|
|
|
alter table if exists speech_recognition_config add column if not exists service_type varchar(64) not null default 'CUSTOM';
|
2026-07-24 06:05:35 +00:00
|
|
|
alter table if exists speech_recognition_config add column if not exists response_format varchar(32) not null default 'json';
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists model varchar(128);
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists prompt text;
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists hotwords text;
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists timestamp_granularities varchar(128);
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists enable_speaker_diarization boolean;
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists enable_speaker_identification boolean;
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists enable_text_cleanup boolean;
|
|
|
|
|
alter table if exists speech_recognition_config add column if not exists temperature double precision;
|
|
|
|
|
|
2026-07-24 09:47:15 +00:00
|
|
|
insert into speech_recognition_service (
|
|
|
|
|
service_type,
|
|
|
|
|
service_name,
|
|
|
|
|
built_in,
|
|
|
|
|
enabled,
|
|
|
|
|
base_url,
|
|
|
|
|
transcribe_path,
|
|
|
|
|
task_status_path,
|
|
|
|
|
file_field_name,
|
|
|
|
|
language,
|
|
|
|
|
response_format,
|
|
|
|
|
api_key,
|
|
|
|
|
api_key_header,
|
|
|
|
|
connect_timeout_seconds,
|
|
|
|
|
read_timeout_seconds,
|
|
|
|
|
task_timeout_seconds,
|
|
|
|
|
task_poll_interval_millis,
|
|
|
|
|
sort_order,
|
|
|
|
|
created_at,
|
|
|
|
|
updated_at
|
|
|
|
|
) values
|
|
|
|
|
(
|
|
|
|
|
'ASR_10_100_53_199_8000',
|
|
|
|
|
'语音转写服务 10.100.53.199:8000',
|
|
|
|
|
true,
|
|
|
|
|
true,
|
|
|
|
|
'http://10.100.53.199:8000/',
|
|
|
|
|
'/v1/audio/transcriptions',
|
|
|
|
|
'/v1/tasks/{task_id}',
|
|
|
|
|
'file',
|
|
|
|
|
'',
|
|
|
|
|
'json',
|
|
|
|
|
null,
|
|
|
|
|
'X-API-Key',
|
|
|
|
|
10,
|
|
|
|
|
300,
|
|
|
|
|
300,
|
|
|
|
|
1500,
|
|
|
|
|
10,
|
|
|
|
|
now(),
|
|
|
|
|
now()
|
|
|
|
|
),
|
|
|
|
|
(
|
|
|
|
|
'ASR_10_100_51_199_17003',
|
|
|
|
|
'语音转写服务 10.100.51.199:17003',
|
|
|
|
|
true,
|
|
|
|
|
true,
|
|
|
|
|
'http://10.100.51.199:17003/',
|
|
|
|
|
'/v1/audio/transcriptions',
|
|
|
|
|
'/v1/tasks/{task_id}',
|
|
|
|
|
'file',
|
|
|
|
|
'',
|
|
|
|
|
'json',
|
|
|
|
|
null,
|
|
|
|
|
'X-API-Key',
|
|
|
|
|
10,
|
|
|
|
|
300,
|
|
|
|
|
300,
|
|
|
|
|
1500,
|
|
|
|
|
20,
|
|
|
|
|
now(),
|
|
|
|
|
now()
|
|
|
|
|
)
|
|
|
|
|
on conflict (service_type) do update
|
|
|
|
|
set service_name = excluded.service_name,
|
|
|
|
|
built_in = true,
|
|
|
|
|
enabled = true,
|
|
|
|
|
base_url = excluded.base_url,
|
|
|
|
|
transcribe_path = excluded.transcribe_path,
|
|
|
|
|
task_status_path = excluded.task_status_path,
|
|
|
|
|
file_field_name = excluded.file_field_name,
|
|
|
|
|
language = excluded.language,
|
|
|
|
|
response_format = excluded.response_format,
|
|
|
|
|
api_key = excluded.api_key,
|
|
|
|
|
api_key_header = excluded.api_key_header,
|
|
|
|
|
connect_timeout_seconds = excluded.connect_timeout_seconds,
|
|
|
|
|
read_timeout_seconds = excluded.read_timeout_seconds,
|
|
|
|
|
task_timeout_seconds = excluded.task_timeout_seconds,
|
|
|
|
|
task_poll_interval_millis = excluded.task_poll_interval_millis,
|
|
|
|
|
sort_order = excluded.sort_order,
|
|
|
|
|
updated_at = now();
|
|
|
|
|
|
2026-07-24 06:05:35 +00:00
|
|
|
do $$
|
|
|
|
|
declare
|
|
|
|
|
v_system_parent_id bigint;
|
|
|
|
|
v_menu_perm_id bigint;
|
|
|
|
|
v_view_perm_id bigint;
|
|
|
|
|
v_update_perm_id bigint;
|
|
|
|
|
begin
|
|
|
|
|
perform setval('sys_permission_perm_id_seq', coalesce((select max(perm_id) from sys_permission), 0) + 1, false);
|
|
|
|
|
perform setval('sys_role_permission_id_seq', coalesce((select max(id) from sys_role_permission), 0) + 1, false);
|
|
|
|
|
|
|
|
|
|
select perm_id
|
|
|
|
|
into v_system_parent_id
|
|
|
|
|
from sys_permission
|
|
|
|
|
where code = 'system'
|
|
|
|
|
and coalesce(is_deleted, 0) = 0
|
|
|
|
|
order by perm_id
|
|
|
|
|
limit 1;
|
|
|
|
|
|
|
|
|
|
if v_system_parent_id is null then
|
|
|
|
|
insert into sys_permission (
|
|
|
|
|
parent_id, name, code, perm_type, level, path, component, icon,
|
|
|
|
|
sort_order, is_visible, status, description, meta, is_deleted, created_at, updated_at
|
|
|
|
|
) values (
|
|
|
|
|
null, '系统管理', 'system', 'directory', 1, null, null, 'SettingOutlined',
|
|
|
|
|
110, 1, 1, '系统管理目录', '{}'::jsonb, 0, now(), now()
|
|
|
|
|
)
|
|
|
|
|
returning perm_id into v_system_parent_id;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
select perm_id
|
|
|
|
|
into v_menu_perm_id
|
|
|
|
|
from sys_permission
|
|
|
|
|
where code = 'menu:speech-recognition-settings'
|
|
|
|
|
order by perm_id
|
|
|
|
|
limit 1;
|
|
|
|
|
|
|
|
|
|
if v_menu_perm_id is null then
|
|
|
|
|
insert into sys_permission (
|
|
|
|
|
parent_id, name, code, perm_type, level, path, component, icon,
|
|
|
|
|
sort_order, is_visible, status, description, meta, is_deleted, created_at, updated_at
|
|
|
|
|
) values (
|
|
|
|
|
v_system_parent_id, '语音识别配置', 'menu:speech-recognition-settings', 'menu', 2,
|
|
|
|
|
'/speech-recognition-settings', null, 'AudioOutlined', 8, 1, 1,
|
|
|
|
|
'日报语音转文字服务配置页面', jsonb_build_object('tenantScoped', true), 0, now(), now()
|
|
|
|
|
)
|
|
|
|
|
returning perm_id into v_menu_perm_id;
|
|
|
|
|
else
|
|
|
|
|
update sys_permission
|
|
|
|
|
set parent_id = v_system_parent_id,
|
|
|
|
|
name = '语音识别配置',
|
|
|
|
|
perm_type = 'menu',
|
|
|
|
|
level = 2,
|
|
|
|
|
path = '/speech-recognition-settings',
|
|
|
|
|
component = null,
|
|
|
|
|
icon = 'AudioOutlined',
|
|
|
|
|
sort_order = 8,
|
|
|
|
|
is_visible = 1,
|
|
|
|
|
status = 1,
|
|
|
|
|
description = '日报语音转文字服务配置页面',
|
|
|
|
|
meta = jsonb_build_object('tenantScoped', true),
|
|
|
|
|
is_deleted = 0,
|
|
|
|
|
updated_at = now()
|
|
|
|
|
where perm_id = v_menu_perm_id;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
select perm_id
|
|
|
|
|
into v_view_perm_id
|
|
|
|
|
from sys_permission
|
|
|
|
|
where code = 'speech_recognition_config:view'
|
|
|
|
|
order by perm_id
|
|
|
|
|
limit 1;
|
|
|
|
|
|
|
|
|
|
if v_view_perm_id is null then
|
|
|
|
|
insert into sys_permission (
|
|
|
|
|
parent_id, name, code, perm_type, level, path, component, icon,
|
|
|
|
|
sort_order, is_visible, status, description, meta, is_deleted, created_at, updated_at
|
|
|
|
|
) values (
|
|
|
|
|
v_menu_perm_id, '查看语音识别配置', 'speech_recognition_config:view', 'button', 3,
|
|
|
|
|
null, null, null, 1, 1, 1, '查看日报语音转文字服务配置', '{}'::jsonb, 0, now(), now()
|
|
|
|
|
)
|
|
|
|
|
returning perm_id into v_view_perm_id;
|
|
|
|
|
else
|
|
|
|
|
update sys_permission
|
|
|
|
|
set parent_id = v_menu_perm_id,
|
|
|
|
|
name = '查看语音识别配置',
|
|
|
|
|
perm_type = 'button',
|
|
|
|
|
level = 3,
|
|
|
|
|
sort_order = 1,
|
|
|
|
|
is_visible = 1,
|
|
|
|
|
status = 1,
|
|
|
|
|
description = '查看日报语音转文字服务配置',
|
|
|
|
|
meta = '{}'::jsonb,
|
|
|
|
|
is_deleted = 0,
|
|
|
|
|
updated_at = now()
|
|
|
|
|
where perm_id = v_view_perm_id;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
select perm_id
|
|
|
|
|
into v_update_perm_id
|
|
|
|
|
from sys_permission
|
|
|
|
|
where code = 'speech_recognition_config:update'
|
|
|
|
|
order by perm_id
|
|
|
|
|
limit 1;
|
|
|
|
|
|
|
|
|
|
if v_update_perm_id is null then
|
|
|
|
|
insert into sys_permission (
|
|
|
|
|
parent_id, name, code, perm_type, level, path, component, icon,
|
|
|
|
|
sort_order, is_visible, status, description, meta, is_deleted, created_at, updated_at
|
|
|
|
|
) values (
|
|
|
|
|
v_menu_perm_id, '修改语音识别配置', 'speech_recognition_config:update', 'button', 3,
|
|
|
|
|
null, null, null, 2, 1, 1, '保存日报语音转文字服务配置', '{}'::jsonb, 0, now(), now()
|
|
|
|
|
)
|
|
|
|
|
returning perm_id into v_update_perm_id;
|
|
|
|
|
else
|
|
|
|
|
update sys_permission
|
|
|
|
|
set parent_id = v_menu_perm_id,
|
|
|
|
|
name = '修改语音识别配置',
|
|
|
|
|
perm_type = 'button',
|
|
|
|
|
level = 3,
|
|
|
|
|
sort_order = 2,
|
|
|
|
|
is_visible = 1,
|
|
|
|
|
status = 1,
|
|
|
|
|
description = '保存日报语音转文字服务配置',
|
|
|
|
|
meta = '{}'::jsonb,
|
|
|
|
|
is_deleted = 0,
|
|
|
|
|
updated_at = now()
|
|
|
|
|
where perm_id = v_update_perm_id;
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
insert into sys_role_permission (role_id, perm_id, is_deleted, created_at, updated_at)
|
|
|
|
|
select r.role_id, p.perm_id, 0, now(), now()
|
|
|
|
|
from sys_role r
|
|
|
|
|
cross join (
|
|
|
|
|
select unnest(array[v_menu_perm_id, v_view_perm_id, v_update_perm_id]) as perm_id
|
|
|
|
|
) p
|
|
|
|
|
where coalesce(r.is_deleted, 0) = 0
|
|
|
|
|
and (
|
|
|
|
|
r.role_code in ('TENANT_ADMIN', 'ADMIN', 'SYS_ADMIN', 'PLATFORM_ADMIN', 'SUPER_ADMIN')
|
|
|
|
|
or r.role_name ilike '%管理员%'
|
|
|
|
|
or r.role_name ilike '%admin%'
|
|
|
|
|
)
|
|
|
|
|
and p.perm_id is not null
|
|
|
|
|
and not exists (
|
|
|
|
|
select 1
|
|
|
|
|
from sys_role_permission rp
|
|
|
|
|
where rp.role_id = r.role_id
|
|
|
|
|
and rp.perm_id = p.perm_id
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
update sys_role_permission
|
|
|
|
|
set is_deleted = 0,
|
|
|
|
|
updated_at = now()
|
|
|
|
|
where perm_id in (v_menu_perm_id, v_view_perm_id, v_update_perm_id)
|
|
|
|
|
and role_id in (
|
|
|
|
|
select r.role_id
|
|
|
|
|
from sys_role r
|
|
|
|
|
where coalesce(r.is_deleted, 0) = 0
|
|
|
|
|
and (
|
|
|
|
|
r.role_code in ('TENANT_ADMIN', 'ADMIN', 'SYS_ADMIN', 'PLATFORM_ADMIN', 'SUPER_ADMIN')
|
|
|
|
|
or r.role_name ilike '%管理员%'
|
|
|
|
|
or r.role_name ilike '%admin%'
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
end $$;
|
|
|
|
|
|
|
|
|
|
commit;
|