diff --git a/sql/bug_318_repair_historical_data.sql b/sql/bug_318_repair_historical_data.sql new file mode 100644 index 00000000..86f69fe2 --- /dev/null +++ b/sql/bug_318_repair_historical_data.sql @@ -0,0 +1,254 @@ +-- ======================================================== +-- Bug #318 历史数据修复脚本 +-- 为已存在但未生成手术医嘱的手术申请单补齐数据 +-- ======================================================== + +-- 1. 查询所有未生成手术医嘱的手术申请单 +SELECT + rf.id as request_form_id, + rf.prescription_no, + rf.encounter_id, + rf.patient_id, + rf.requester_id, + rf.create_time, + rf.desc_json +FROM doc_request_form rf +LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no + AND sr.delete_flag = '0' +WHERE rf.type_code = 'PROCEDURE' -- 手术申请单 + AND rf.delete_flag = '0' + AND sr.id IS NULL -- 没有对应的手术医嘱 +ORDER BY rf.create_time DESC; + +-- ======================================================== +-- 2. 修复脚本:为缺失的手术申请单生成手术医嘱 +-- ======================================================== + +-- 创建临时表存储需要修复的数据 +CREATE TEMPORARY TABLE IF NOT EXISTS temp_surgery_repair AS +SELECT + rf.id as request_form_id, + rf.prescription_no, + rf.encounter_id, + rf.patient_id, + rf.requester_id, + rf.create_time, + rf.desc_json, + rf.org_id +FROM doc_request_form rf +LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no + AND sr.delete_flag = '0' +WHERE rf.type_code = 'PROCEDURE' + AND rf.delete_flag = '0' + AND sr.id IS NULL; + +-- 查看需要修复的记录数 +SELECT COUNT(*) as need_repair_count FROM temp_surgery_repair; + +-- ======================================================== +-- 3. 插入手术医嘱(ServiceRequest) +-- ======================================================== + +INSERT INTO wor_service_request ( + id, + bus_no, + prescription_no, + status_enum, + generate_source_enum, + therapy_enum, + quantity, + unit_code, + category_enum, + patient_id, + requester_id, + encounter_id, + authored_time, + org_id, + content_json, + delete_flag, + create_time, + create_by +) +SELECT + nextval('wor_service_request_id_seq'), -- 使用序列生成ID + LPAD(FLOOR(RANDOM() * 10000)::TEXT, 4, '0'), -- 生成4位随机bus_no + prescription_no, + 1, -- status_enum: 1-待签发(DRAFT) + 1, -- generate_source_enum: 1-医生处方 + 2, -- therapy_enum: 2-临时医嘱(TEMPORARY) + 1, -- quantity: 1 + '次', -- unit_code + 4, -- category_enum: 4-手术 + patient_id, + requester_id, + encounter_id, + create_time, + org_id, + CASE + WHEN desc_json IS NOT NULL AND desc_json != '' THEN desc_json + ELSE NULL + END, -- content_json: 存储手术详情 + '0', -- delete_flag + create_time, + requester_id +FROM temp_surgery_repair; + +-- ======================================================== +-- 4. 插入手术收费项目(ChargeItem) +-- ======================================================== + +-- 首先创建临时表关联新生成的ServiceRequest +CREATE TEMPORARY TABLE IF NOT EXISTS temp_new_service_request AS +SELECT + sr.id as service_request_id, + sr.prescription_no, + sr.patient_id, + sr.encounter_id, + sr.requester_id, + sr.create_time, + sr.org_id, + sr.bus_no, + t.desc_json +FROM wor_service_request sr +JOIN temp_surgery_repair t ON t.prescription_no = sr.prescription_no +WHERE sr.category_enum = 4 + AND sr.delete_flag = '0' + AND sr.create_time > NOW() - INTERVAL '1 hour'; -- 只取最近1小时新增的 + +-- 插入手术费用收费项目 +INSERT INTO adm_charge_item ( + id, + bus_no, + status_enum, + generate_source_enum, + patient_id, + context_enum, + encounter_id, + enterer_id, + entered_date, + service_table, + service_id, + product_table, + requesting_org_id, + quantity_value, + quantity_unit, + unit_price, + total_price, + delete_flag, + create_time, + create_by +) +SELECT + nextval('adm_charge_item_id_seq'), + 'CI' || bus_no, + 1, -- status_enum: 1-草稿(DRAFT) + 1, -- generate_source_enum: 1-医生处方 + patient_id, + 3, -- context_enum: 3-诊疗 + encounter_id, + requester_id, + create_time, + 'wor_service_request', -- service_table + service_request_id, -- service_id + 'wor_activity_definition', -- product_table + org_id, + 1, -- quantity_value + '次', -- quantity_unit + COALESCE( + (desc_json::jsonb->>'surgeryFee')::numeric, + 0 + ), -- unit_price: 从desc_json解析手术费用 + COALESCE( + (desc_json::jsonb->>'surgeryFee')::numeric, + 0 + ), -- total_price + '0', + create_time, + requester_id +FROM temp_new_service_request; + +-- 插入麻醉费用收费项目(如果有麻醉费用) +INSERT INTO adm_charge_item ( + id, + bus_no, + status_enum, + generate_source_enum, + patient_id, + context_enum, + encounter_id, + enterer_id, + entered_date, + service_table, + service_id, + product_table, + requesting_org_id, + quantity_value, + quantity_unit, + unit_price, + total_price, + delete_flag, + create_time, + create_by +) +SELECT + nextval('adm_charge_item_id_seq'), + 'CI' || bus_no || '_A', + 1, + 1, + patient_id, + 3, + encounter_id, + requester_id, + create_time, + 'wor_service_request', + service_request_id, + 'wor_activity_definition', + org_id, + 1, + '次', + (desc_json::jsonb->>'anesthesiaFee')::numeric, + (desc_json::jsonb->>'anesthesiaFee')::numeric, + '0', + create_time, + requester_id +FROM temp_new_service_request +WHERE desc_json::jsonb->>'anesthesiaFee' IS NOT NULL + AND (desc_json::jsonb->>'anesthesiaFee')::numeric > 0; + +-- ======================================================== +-- 5. 验证修复结果 +-- ======================================================== + +-- 查看修复后的手术医嘱数量 +SELECT + '修复后的手术医嘱数量' as check_item, + COUNT(*) as count +FROM wor_service_request sr +WHERE sr.category_enum = 4 + AND sr.delete_flag = '0' + AND EXISTS ( + SELECT 1 FROM doc_request_form rf + WHERE rf.prescription_no = sr.prescription_no + AND rf.type_code = 'PROCEDURE' + ); + +-- 查看修复后的收费项目数量 +SELECT + '修复后的手术收费项目数量' as check_item, + COUNT(*) as count +FROM adm_charge_item ci +WHERE ci.service_table = 'wor_service_request' + AND ci.delete_flag = '0' + AND EXISTS ( + SELECT 1 FROM wor_service_request sr + WHERE sr.id = ci.service_id + AND sr.category_enum = 4 + ); + +-- 清理临时表 +DROP TABLE IF EXISTS temp_surgery_repair; +DROP TABLE IF EXISTS temp_new_service_request; + +-- ======================================================== +-- 完成! +-- ======================================================== diff --git a/sql/bug_318_step1_check.sql b/sql/bug_318_step1_check.sql new file mode 100644 index 00000000..9c8307a9 --- /dev/null +++ b/sql/bug_318_step1_check.sql @@ -0,0 +1,17 @@ +-- Bug #318 历史数据修复 - 步骤1:查询需要修复的手术申请单 +-- 执行此SQL查看有多少手术申请单需要修复 + +SELECT + rf.id as request_form_id, + rf.prescription_no as 手术单号, + rf.encounter_id as 就诊ID, + rf.patient_id as 患者ID, + rf.create_time as 申请时间, + SUBSTRING(rf.desc_json::text, 1, 100) as 手术信息预览 +FROM doc_request_form rf +LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no + AND sr.delete_flag = '0' +WHERE rf.type_code = 'PROCEDURE' -- 手术申请单 + AND rf.delete_flag = '0' + AND sr.id IS NULL -- 没有对应的手术医嘱 +ORDER BY rf.create_time DESC; diff --git a/sql/bug_318_step2_repair.sql b/sql/bug_318_step2_repair.sql new file mode 100644 index 00000000..ef720b55 --- /dev/null +++ b/sql/bug_318_step2_repair.sql @@ -0,0 +1,159 @@ +-- Bug #318 历史数据修复 - 步骤2:执行修复 +-- ⚠️ 请在执行前备份数据库! + +-- ===================================================== +-- 步骤 2.1: 创建临时表存储需要修复的手术申请单 +-- ===================================================== + +CREATE TEMPORARY TABLE temp_repair_list AS +SELECT + rf.id as request_form_id, + rf.prescription_no, + rf.encounter_id, + rf.patient_id, + rf.requester_id, + rf.create_time, + rf.org_id, + rf.desc_json +FROM doc_request_form rf +LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no + AND sr.delete_flag = '0' +WHERE rf.type_code = 'PROCEDURE' + AND rf.delete_flag = '0' + AND sr.id IS NULL; + +-- 查看需要修复的记录数 +SELECT COUNT(*) as 需要修复的记录数 FROM temp_repair_list; + +-- ===================================================== +-- 步骤 2.2: 生成手术医嘱(ServiceRequest) +-- ===================================================== + +INSERT INTO wor_service_request ( + bus_no, + prescription_no, + status_enum, + generate_source_enum, + therapy_enum, + quantity, + unit_code, + category_enum, + patient_id, + requester_id, + encounter_id, + authored_time, + org_id, + content_json, + delete_flag, + create_time, + create_by, + tenant_id +) +SELECT + LPAD(FLOOR(RANDOM() * 10000)::TEXT, 4, '0'), + prescription_no, + 1, -- 待签发 + 1, -- 医生处方 + 2, -- 临时医嘱 + 1, + '次', + 4, -- 手术 + patient_id, + requester_id, + encounter_id, + create_time, + org_id, + desc_json, + '0', + create_time, + requester_id, + 1 -- tenant_id +FROM temp_repair_list; + +-- 查看生成的手术医嘱数量 +SELECT '生成的手术医嘱数量' as 检查项, COUNT(*) as 数量 +FROM wor_service_request +WHERE prescription_no IN (SELECT prescription_no FROM temp_repair_list); + +-- ===================================================== +-- 步骤 2.3: 生成手术收费项目(ChargeItem) +-- ===================================================== + +-- 获取刚生成的ServiceRequest +CREATE TEMPORARY TABLE temp_new_requests AS +SELECT + sr.id as service_request_id, + sr.prescription_no, + sr.patient_id, + sr.encounter_id, + sr.requester_id, + sr.create_time, + sr.org_id, + sr.bus_no, + t.desc_json +FROM wor_service_request sr +JOIN temp_repair_list t ON t.prescription_no = sr.prescription_no +WHERE sr.category_enum = 4 + AND sr.delete_flag = '0'; + +-- 插入手术费用 +INSERT INTO adm_charge_item ( + bus_no, + status_enum, + generate_source_enum, + patient_id, + context_enum, + encounter_id, + enterer_id, + entered_date, + service_table, + service_id, + product_table, + requesting_org_id, + quantity_value, + quantity_unit, + unit_price, + total_price, + delete_flag, + create_time, + create_by, + tenant_id +) +SELECT + 'CI' || bus_no, + 1, -- 草稿 + 1, -- 医生处方 + patient_id, + 3, -- 诊疗 + encounter_id, + requester_id, + create_time, + 'wor_service_request', + service_request_id, + 'wor_activity_definition', + org_id, + 1, + '次', + COALESCE((desc_json::jsonb->>'surgeryFee')::numeric, 0), + COALESCE((desc_json::jsonb->>'surgeryFee')::numeric, 0), + '0', + create_time, + requester_id, + 1 +FROM temp_new_requests; + +-- 查看生成的收费项目数量 +SELECT '生成的手术收费项目数量' as 检查项, COUNT(*) as 数量 +FROM adm_charge_item +WHERE service_id IN (SELECT service_request_id FROM temp_new_requests); + +-- ===================================================== +-- 步骤 2.4: 清理临时表 +-- ===================================================== + +DROP TABLE IF EXISTS temp_repair_list; +DROP TABLE IF EXISTS temp_new_requests; + +-- ===================================================== +-- 完成! +-- =====================================================