feat(emr): 添加数据库迁移脚本同步老病历数据

- 自动清空假数据
- 从doc_emr同步修订历史(每条病历创建初始修订记录)
- 从doc_emr同步搜索索引(提取患者、诊断、医生等信息)
- 应用启动时自动执行
This commit is contained in:
2026-06-21 09:23:02 +08:00
parent 2f0baaa837
commit c285c1ba5e

View File

@@ -0,0 +1,78 @@
-- V100__sync_existing_emr_data.sql
-- 同步已有的门诊/住院病历到修订历史和搜索索引
-- 1. 清空假数据
TRUNCATE TABLE emr_revision CASCADE;
TRUNCATE TABLE emr_search_index CASCADE;
-- 2. 从doc_emr同步修订历史为每条病历创建初始修订记录
INSERT INTO emr_revision (
id, emr_id, encounter_id, revision_number,
operator_id, operator_name, operation_type,
diff_content, snapshot_content, create_time
)
SELECT
nextval('emr_revision_id_seq'),
e.id,
e.encounter_id,
1,
COALESCE(e.record_id, 1),
'系统同步',
'CREATE',
'初始创建 - 从历史病历同步',
e.context_json,
COALESCE(e.create_time, NOW())
FROM doc_emr e
WHERE e.id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM emr_revision r WHERE r.emr_id = e.id
);
-- 3. 从doc_emr同步搜索索引
INSERT INTO emr_search_index (
id, emr_id, encounter_id, patient_id, patient_name,
emr_type, emr_title, diagnosis_text,
doctor_name, department_name, create_time, update_time
)
SELECT
nextval('emr_search_index_id_seq'),
e.id,
e.encounter_id,
e.patient_id,
COALESCE(p.name, '患者' || e.patient_id),
CASE
WHEN e.class_enum = 1 THEN 'OUTPATIENT'
WHEN e.class_enum = 2 THEN 'INPATIENT'
ELSE 'OTHER'
END,
COALESCE(
NULLIF(TRIM(BOTH '"' FROM
SPLIT_PART(
SPLIT_PART(e.context_json, '"chiefComplaint"', 2),
':', 2
)
), ''),
'未命名病历'
),
COALESCE(
NULLIF(TRIM(BOTH '"' FROM
SPLIT_PART(
SPLIT_PART(e.context_json, '"diagnosis"', 2),
':', 2
)
), ''),
''
),
COALESCE(u.name, '医生' || e.record_id),
COALESCE(o.name, '未知科室'),
COALESCE(e.create_time, NOW()),
COALESCE(e.update_time, NOW())
FROM doc_emr e
LEFT JOIN patient p ON e.patient_id = p.id
LEFT JOIN sys_user u ON e.record_id = u.user_id
LEFT JOIN adm_encounter enc ON e.encounter_id = enc.id
LEFT JOIN sys_organization o ON enc.organization_id = o.id
WHERE e.id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM emr_search_index si WHERE si.emr_id = e.id
);