Merge develop into test - sync latest code
This commit is contained in:
16
sql/20260311_add_diagnosis_date_fields.sql
Normal file
16
sql/20260311_add_diagnosis_date_fields.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
-- 为 adm_encounter_diagnosis 表添加发病日期和诊断日期字段
|
||||
-- 执行日期: 2026-03-11
|
||||
-- 问题: 诊断保存后发病日期和诊断日期不显示
|
||||
-- 原因: 数据库表缺少这两个字段
|
||||
|
||||
-- 添加发病日期字段
|
||||
ALTER TABLE public.adm_encounter_diagnosis
|
||||
ADD COLUMN IF NOT EXISTS onset_date date;
|
||||
|
||||
COMMENT ON COLUMN public.adm_encounter_diagnosis.onset_date IS '发病日期';
|
||||
|
||||
-- 添加诊断日期字段
|
||||
ALTER TABLE public.adm_encounter_diagnosis
|
||||
ADD COLUMN IF NOT EXISTS diagnosis_time date;
|
||||
|
||||
COMMENT ON COLUMN public.adm_encounter_diagnosis.diagnosis_time IS '诊断日期';
|
||||
240
sql/bug_318_repair_execute.sql
Normal file
240
sql/bug_318_repair_execute.sql
Normal file
@@ -0,0 +1,240 @@
|
||||
-- ============================================================
|
||||
-- Bug #318 历史数据修复 - 简化版SQL脚本
|
||||
-- 为已存在但未生成手术医嘱的手术申请单补齐数据
|
||||
-- ============================================================
|
||||
-- 执行说明:
|
||||
-- 1. 在数据库管理工具中执行(如 DBeaver、pgAdmin)
|
||||
-- 2. 建议先执行查询部分确认数据
|
||||
-- 3. 备份数据库后再执行修复
|
||||
-- ============================================================
|
||||
|
||||
-- 步骤1: 查看需要修复的记录数
|
||||
-- ============================================================
|
||||
SELECT
|
||||
'需要修复的手术申请单数量' as 检查项,
|
||||
COUNT(*) 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;
|
||||
|
||||
-- 步骤2: 查看详细列表(可选)
|
||||
-- ============================================================
|
||||
/*
|
||||
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 申请时间
|
||||
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
|
||||
LIMIT 10;
|
||||
*/
|
||||
|
||||
-- 步骤3: 执行修复 - 生成手术医嘱(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') as bus_no, -- 生成4位随机数
|
||||
rf.prescription_no,
|
||||
1 as status_enum, -- 1-待签发
|
||||
1 as generate_source_enum, -- 1-医生处方
|
||||
2 as therapy_enum, -- 2-临时医嘱
|
||||
1 as quantity,
|
||||
'次' as unit_code,
|
||||
4 as category_enum, -- 4-手术
|
||||
rf.patient_id,
|
||||
rf.requester_id,
|
||||
rf.encounter_id,
|
||||
rf.create_time as authored_time,
|
||||
rf.org_id,
|
||||
rf.desc_json as content_json, -- 存储手术详情
|
||||
'0' as delete_flag,
|
||||
rf.create_time,
|
||||
rf.requester_id as create_by,
|
||||
1 as tenant_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;
|
||||
|
||||
-- 步骤4: 查看生成的手术医嘱数量
|
||||
-- ============================================================
|
||||
SELECT
|
||||
'生成的手术医嘱数量' as 检查项,
|
||||
COUNT(*) as 数量
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND create_time > CURRENT_TIMESTAMP - INTERVAL '1 hour'; -- 最近1小时生成的
|
||||
|
||||
-- 步骤5: 生成手术收费项目(ChargeItem)
|
||||
-- ============================================================
|
||||
-- 先创建临时表存储新生成的ServiceRequest
|
||||
CREATE TEMPORARY TABLE temp_new_service_requests AS
|
||||
SELECT
|
||||
sr.id as service_request_id,
|
||||
sr.bus_no,
|
||||
sr.prescription_no,
|
||||
sr.patient_id,
|
||||
sr.encounter_id,
|
||||
sr.requester_id,
|
||||
sr.create_time,
|
||||
sr.org_id,
|
||||
sr.content_json
|
||||
FROM wor_service_request sr
|
||||
WHERE sr.category_enum = 4
|
||||
AND sr.delete_flag = '0'
|
||||
AND sr.create_time > CURRENT_TIMESTAMP - INTERVAL '1 hour'; -- 最近1小时生成的
|
||||
|
||||
-- 插入手术费用收费项目
|
||||
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' || t.bus_no as bus_no,
|
||||
1 as status_enum, -- 1-草稿
|
||||
1 as generate_source_enum, -- 1-医生处方
|
||||
t.patient_id,
|
||||
3 as context_enum, -- 3-诊疗
|
||||
t.encounter_id,
|
||||
t.requester_id as enterer_id,
|
||||
t.create_time as entered_date,
|
||||
'wor_service_request' as service_table,
|
||||
t.service_request_id as service_id,
|
||||
'wor_activity_definition' as product_table,
|
||||
t.org_id as requesting_org_id,
|
||||
1 as quantity_value,
|
||||
'次' as quantity_unit,
|
||||
COALESCE((t.content_json::jsonb->>'surgeryFee')::numeric, 0) as unit_price,
|
||||
COALESCE((t.content_json::jsonb->>'surgeryFee')::numeric, 0) as total_price,
|
||||
'0' as delete_flag,
|
||||
t.create_time,
|
||||
t.requester_id as create_by,
|
||||
1 as tenant_id
|
||||
FROM temp_new_service_requests t
|
||||
WHERE COALESCE((t.content_json::jsonb->>'surgeryFee')::numeric, 0) >= 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' || t.bus_no || '_A' as bus_no,
|
||||
1 as status_enum,
|
||||
1 as generate_source_enum,
|
||||
t.patient_id,
|
||||
3 as context_enum,
|
||||
t.encounter_id,
|
||||
t.requester_id as enterer_id,
|
||||
t.create_time as entered_date,
|
||||
'wor_service_request' as service_table,
|
||||
t.service_request_id as service_id,
|
||||
'wor_activity_definition' as product_table,
|
||||
t.org_id as requesting_org_id,
|
||||
1 as quantity_value,
|
||||
'次' as quantity_unit,
|
||||
(t.content_json::jsonb->>'anesthesiaFee')::numeric as unit_price,
|
||||
(t.content_json::jsonb->>'anesthesiaFee')::numeric as total_price,
|
||||
'0' as delete_flag,
|
||||
t.create_time,
|
||||
t.requester_id as create_by,
|
||||
1 as tenant_id
|
||||
FROM temp_new_service_requests t
|
||||
WHERE t.content_json::jsonb->>'anesthesiaFee' IS NOT NULL
|
||||
AND (t.content_json::jsonb->>'anesthesiaFee')::numeric > 0;
|
||||
|
||||
-- 步骤6: 验证修复结果
|
||||
-- ============================================================
|
||||
SELECT
|
||||
'手术医嘱总数' as 检查项,
|
||||
COUNT(*) as 数量
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0';
|
||||
|
||||
SELECT
|
||||
'手术收费项目总数' as 检查项,
|
||||
COUNT(*) as 数量
|
||||
FROM adm_charge_item ci
|
||||
WHERE ci.service_table = 'wor_service_request'
|
||||
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_new_service_requests;
|
||||
|
||||
-- ============================================================
|
||||
-- ✓ 修复完成!
|
||||
-- ============================================================
|
||||
254
sql/bug_318_repair_historical_data.sql
Normal file
254
sql/bug_318_repair_historical_data.sql
Normal file
@@ -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;
|
||||
|
||||
-- ========================================================
|
||||
-- 完成!
|
||||
-- ========================================================
|
||||
17
sql/bug_318_step1_check.sql
Normal file
17
sql/bug_318_step1_check.sql
Normal file
@@ -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;
|
||||
159
sql/bug_318_step2_repair.sql
Normal file
159
sql/bug_318_step2_repair.sql
Normal file
@@ -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;
|
||||
|
||||
-- =====================================================
|
||||
-- 完成!
|
||||
-- =====================================================
|
||||
62
sql/create_lab_observation_table.sql
Normal file
62
sql/create_lab_observation_table.sql
Normal file
@@ -0,0 +1,62 @@
|
||||
-- =============================================
|
||||
-- 创建 lab_observation 表
|
||||
-- 用途: 实验室观察记录表
|
||||
-- 创建时间: 2026-03-09
|
||||
-- =============================================
|
||||
|
||||
-- 删除已存在的表(如果存在)
|
||||
DROP TABLE IF EXISTS lab_observation;
|
||||
|
||||
-- 创建序列(如果不存在)
|
||||
DROP SEQUENCE IF EXISTS lab_observation_id_seq;
|
||||
CREATE SEQUENCE lab_observation_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
-- 创建表
|
||||
CREATE TABLE lab_observation (
|
||||
id BIGINT PRIMARY KEY DEFAULT nextval('lab_observation_id_seq'),
|
||||
patient_id BIGINT,
|
||||
encounter_id BIGINT,
|
||||
specimen_id BIGINT,
|
||||
observation_definition_id BIGINT,
|
||||
observation_result TEXT,
|
||||
observation_date TIMESTAMP,
|
||||
technician_id BIGINT,
|
||||
delete_flag VARCHAR(1) DEFAULT '0',
|
||||
create_by VARCHAR(64) DEFAULT '',
|
||||
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
update_by VARCHAR(64) DEFAULT '',
|
||||
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
remark VARCHAR(500)
|
||||
);
|
||||
|
||||
-- 添加表注释
|
||||
COMMENT ON TABLE lab_observation IS '实验室观察记录表';
|
||||
|
||||
-- 添加字段注释
|
||||
COMMENT ON COLUMN lab_observation.id IS '观察记录的唯一标识符';
|
||||
COMMENT ON COLUMN lab_observation.patient_id IS '患者ID';
|
||||
COMMENT ON COLUMN lab_observation.encounter_id IS '就诊ID';
|
||||
COMMENT ON COLUMN lab_observation.specimen_id IS '关联的样本ID';
|
||||
COMMENT ON COLUMN lab_observation.observation_definition_id IS '观察定义ID';
|
||||
COMMENT ON COLUMN lab_observation.observation_result IS '观察结果,可能是文本描述或数值';
|
||||
COMMENT ON COLUMN lab_observation.observation_date IS '观察的日期和时间';
|
||||
COMMENT ON COLUMN lab_observation.technician_id IS '执行观察的技术员ID';
|
||||
COMMENT ON COLUMN lab_observation.delete_flag IS '删除状态,0-未删除,1-已删除';
|
||||
COMMENT ON COLUMN lab_observation.create_by IS '创建者';
|
||||
COMMENT ON COLUMN lab_observation.create_time IS '创建时间';
|
||||
COMMENT ON COLUMN lab_observation.update_by IS '更新者';
|
||||
COMMENT ON COLUMN lab_observation.update_time IS '更新时间';
|
||||
COMMENT ON COLUMN lab_observation.remark IS '备注';
|
||||
|
||||
-- 创建索引
|
||||
CREATE INDEX idx_lab_observation_patient_id ON lab_observation(patient_id);
|
||||
CREATE INDEX idx_lab_observation_specimen_id ON lab_observation(specimen_id);
|
||||
CREATE INDEX idx_lab_observation_observation_date ON lab_observation(observation_date);
|
||||
|
||||
-- 打印完成信息
|
||||
SELECT 'lab_observation 表创建成功!' AS message;
|
||||
86
sql/create_lab_specimen_tables.sql
Normal file
86
sql/create_lab_specimen_tables.sql
Normal file
@@ -0,0 +1,86 @@
|
||||
-- 创建 lab_specimen 检验标本表
|
||||
CREATE TABLE hisdev.lab_specimen (
|
||||
id BIGINT NOT NULL,
|
||||
service_id BIGINT,
|
||||
tenant_id BIGINT,
|
||||
specimen_definition_id BIGINT,
|
||||
collection_status_enum INTEGER,
|
||||
collection_date TIMESTAMP WITHOUT TIME ZONE,
|
||||
received_date TIMESTAMP WITHOUT TIME ZONE,
|
||||
specimen_volume VARCHAR(50),
|
||||
specimen_unit VARCHAR(20),
|
||||
create_by VARCHAR(50),
|
||||
create_time TIMESTAMP WITHOUT TIME ZONE,
|
||||
update_by VARCHAR(50),
|
||||
update_time TIMESTAMP WITH TIME ZONE,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE hisdev.lab_specimen IS '检验标本表';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.id IS '主键ID';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.service_id IS '服务请求ID(关联wor_service_request)';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.tenant_id IS '租户ID';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.specimen_definition_id IS '标本定义ID(关联adm_specimen_definition)';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.collection_status_enum IS '采集状态(1:待采集 2:已采集 3:已接收)';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.collection_date IS '采集时间';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.received_date IS '接收时间';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.specimen_volume IS '标本量';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.specimen_unit IS '标本单位';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.create_by IS '创建人';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.create_time IS '创建时间';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.update_by IS '更新人';
|
||||
COMMENT ON COLUMN hisdev.lab_specimen.update_time IS '更新时间';
|
||||
|
||||
-- 创建 adm_specimen_definition 标本定义表
|
||||
CREATE TABLE hisdev.adm_specimen_definition (
|
||||
id BIGINT NOT NULL,
|
||||
code VARCHAR(50),
|
||||
name VARCHAR(100),
|
||||
specimen_name VARCHAR(100),
|
||||
delete_flag CHAR(1) DEFAULT '0',
|
||||
create_by VARCHAR(50),
|
||||
create_time TIMESTAMP WITHOUT TIME ZONE,
|
||||
update_by VARCHAR(50),
|
||||
update_time TIMESTAMP WITH TIME ZONE,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE hisdev.adm_specimen_definition IS '标本定义表';
|
||||
COMMENT ON COLUMN hisdev.adm_specimen_definition.id IS '主键ID';
|
||||
COMMENT ON COLUMN hisdev.adm_specimen_definition.code IS '标本编码';
|
||||
COMMENT ON COLUMN hisdev.adm_specimen_definition.name IS '标本名称';
|
||||
COMMENT ON COLUMN hisdev.adm_specimen_definition.specimen_name IS '标本显示名称';
|
||||
COMMENT ON COLUMN hisdev.adm_specimen_definition.delete_flag IS '删除标志(0:正常 1:删除)';
|
||||
|
||||
-- 创建 adm_observation_definition 检验项目定义表
|
||||
CREATE TABLE hisdev.adm_observation_definition (
|
||||
id BIGINT NOT NULL,
|
||||
code VARCHAR(50),
|
||||
name VARCHAR(100),
|
||||
category VARCHAR(50),
|
||||
unit VARCHAR(20),
|
||||
reference_range VARCHAR(200),
|
||||
normal_range VARCHAR(200),
|
||||
delete_flag CHAR(1) DEFAULT '0',
|
||||
create_by VARCHAR(50),
|
||||
create_time TIMESTAMP WITHOUT TIME ZONE,
|
||||
update_by VARCHAR(50),
|
||||
update_time TIMESTAMP WITH TIME ZONE,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE hisdev.adm_observation_definition IS '检验项目定义表';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.id IS '主键ID';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.code IS '项目编码';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.name IS '项目名称';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.category IS '项目类别';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.unit IS '单位';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.reference_range IS '参考范围';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.normal_range IS '正常范围';
|
||||
COMMENT ON COLUMN hisdev.adm_observation_definition.delete_flag IS '删除标志(0:正常 1:删除)';
|
||||
|
||||
-- 创建索引
|
||||
CREATE INDEX idx_lab_specimen_service_id ON hisdev.lab_specimen(service_id);
|
||||
CREATE INDEX idx_lab_specimen_specimen_def ON hisdev.lab_specimen(specimen_definition_id);
|
||||
CREATE INDEX idx_adm_specimen_definition_code ON hisdev.adm_specimen_definition(code);
|
||||
CREATE INDEX idx_adm_observation_definition_code ON hisdev.adm_observation_definition(code);
|
||||
45
sql/fix_apply_dept_name_null.sql
Normal file
45
sql/fix_apply_dept_name_null.sql
Normal file
@@ -0,0 +1,45 @@
|
||||
-- 修复手术安排中申请科室名称为空的数据
|
||||
-- 执行时间:2026-03-31
|
||||
-- 说明:填充 cli_surgery 表中 apply_dept_name 为空的记录
|
||||
|
||||
-- 1. 查看当前申请科室名称的填充情况
|
||||
SELECT
|
||||
COUNT(*) as total_count,
|
||||
COUNT(apply_dept_id) as has_apply_dept_id_count,
|
||||
COUNT(apply_dept_name) as has_apply_dept_name_count,
|
||||
COUNT(*) - COUNT(apply_dept_name) as null_count
|
||||
FROM public.cli_surgery
|
||||
WHERE delete_flag = '0';
|
||||
|
||||
-- 2. 修复申请科室名称(关联 adm_organization 表)
|
||||
UPDATE public.cli_surgery s
|
||||
SET apply_dept_name = o.name
|
||||
FROM public.adm_organization o
|
||||
WHERE s.apply_dept_id = o.id
|
||||
AND s.apply_dept_name IS NULL
|
||||
AND s.delete_flag = '0';
|
||||
|
||||
-- 3. 对于 apply_dept_id 为空的记录,尝试从其他来源获取
|
||||
-- 例如从就诊记录中查找科室信息
|
||||
UPDATE public.cli_surgery s
|
||||
SET apply_dept_name = d.dept_name
|
||||
FROM public.adm_encounter e
|
||||
JOIN public.adm_department d ON e.dept_id = d.id
|
||||
WHERE s.encounter_id = e.id
|
||||
AND s.apply_dept_name IS NULL
|
||||
AND s.apply_dept_id IS NULL
|
||||
AND s.delete_flag = '0';
|
||||
|
||||
-- 4. 再次查询,验证修复结果
|
||||
SELECT
|
||||
id,
|
||||
surgery_no,
|
||||
patient_name,
|
||||
apply_dept_id,
|
||||
apply_dept_name,
|
||||
create_time
|
||||
FROM public.cli_surgery
|
||||
WHERE delete_flag = '0'
|
||||
AND (apply_dept_name IS NULL OR apply_dept_name = '')
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 20;
|
||||
85
sql/fix_audit_fields.sql
Normal file
85
sql/fix_audit_fields.sql
Normal file
@@ -0,0 +1,85 @@
|
||||
-- 数据库审计字段修复脚本
|
||||
-- 用于确保所有表都能正确处理 create_by 和 create_time 字段
|
||||
|
||||
-- 步骤 1: 检查哪些表有审计字段但没有正确设置
|
||||
-- 查询所有包含审计字段的表及其约束状态
|
||||
SELECT
|
||||
table_name,
|
||||
column_name,
|
||||
is_nullable,
|
||||
column_default
|
||||
FROM
|
||||
information_schema.columns
|
||||
WHERE
|
||||
table_schema = 'public'
|
||||
AND column_name IN ('create_by', 'create_time', 'update_by', 'update_time')
|
||||
AND is_nullable = 'NO' -- 表示有NOT NULL约束
|
||||
ORDER BY
|
||||
table_name, column_name;
|
||||
|
||||
-- 步骤 2: 为所有审计字段设置合理的默认值(可选)
|
||||
-- 这样即使自动填充失败,也不会违反约束
|
||||
ALTER TABLE "public"."adm_practitioner" ALTER COLUMN "create_by" SET DEFAULT 'system';
|
||||
ALTER TABLE "public"."adm_practitioner" ALTER COLUMN "update_by" SET DEFAULT 'system';
|
||||
|
||||
-- 步骤 3: 检查并更新现有数据,确保没有NULL值
|
||||
-- 对于create_by字段
|
||||
UPDATE "public"."adm_practitioner"
|
||||
SET "create_by" = 'system'
|
||||
WHERE "create_by" IS NULL OR "create_by" = '';
|
||||
|
||||
-- 对于update_by字段
|
||||
UPDATE "public"."adm_practitioner"
|
||||
SET "update_by" = 'system'
|
||||
WHERE "update_by" IS NULL;
|
||||
|
||||
-- 步骤 4: 为其他可能存在相同问题的表执行类似操作
|
||||
-- 以下是根据数据库结构推测的一些表名,您可能需要根据实际情况调整
|
||||
DO $$
|
||||
DECLARE
|
||||
table_name text;
|
||||
tables_with_audit_fields CURSOR FOR
|
||||
SELECT DISTINCT t.table_name
|
||||
FROM information_schema.tables t
|
||||
JOIN information_schema.columns c ON t.table_name = c.table_name
|
||||
WHERE t.table_schema = 'public'
|
||||
AND c.column_name IN ('create_by', 'create_time', 'update_by', 'update_time')
|
||||
AND c.is_nullable = 'NO';
|
||||
BEGIN
|
||||
FOR rec IN tables_with_audit_fields LOOP
|
||||
BEGIN
|
||||
-- 为每个表设置审计字段的默认值
|
||||
EXECUTE format('ALTER TABLE "public"."%I" ALTER COLUMN "create_by" SET DEFAULT ''system''', rec.table_name);
|
||||
EXECUTE format('ALTER TABLE "public"."%I" ALTER COLUMN "update_by" SET DEFAULT ''system''', rec.table_name);
|
||||
|
||||
-- 更新现有的NULL值
|
||||
EXECUTE format('UPDATE "public"."%I" SET "create_by" = ''system'' WHERE "create_by" IS NULL OR "create_by" = ''''', rec.table_name);
|
||||
EXECUTE format('UPDATE "public"."%I" SET "update_by" = ''system'' WHERE "update_by" IS NULL', rec.table_name);
|
||||
|
||||
RAISE NOTICE 'Processed table: %', rec.table_name;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'Could not process table: %, Error: %', rec.table_name, SQLERRM;
|
||||
END;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- 步骤 5: 验证修复结果
|
||||
-- 检查是否还有表存在审计字段的NULL值
|
||||
SELECT
|
||||
table_name,
|
||||
column_name,
|
||||
COUNT(*) as null_count
|
||||
FROM (
|
||||
SELECT 'adm_practitioner' as table_name, 'create_by' as column_name, create_by FROM "public"."adm_practitioner" WHERE create_by IS NULL
|
||||
UNION ALL
|
||||
SELECT 'adm_practitioner' as table_name, 'update_by' as column_name, update_by FROM "public"."adm_practitioner" WHERE update_by IS NULL
|
||||
-- 在这里添加其他表的检查
|
||||
) t
|
||||
GROUP BY table_name, column_name;
|
||||
|
||||
-- 注意事项:
|
||||
-- 1. 在生产环境执行前务必备份数据库
|
||||
-- 2. 根据实际业务需求调整默认值(例如使用实际的用户名而非'system')
|
||||
-- 3. 确保应用程序层面的自动填充机制正常工作
|
||||
-- 4. 考虑在应用程序启动时进行审计字段的完整性检查
|
||||
48
sql/fix_remaining_surgery.sql
Normal file
48
sql/fix_remaining_surgery.sql
Normal file
@@ -0,0 +1,48 @@
|
||||
-- ============================================
|
||||
-- 修复遗漏的手术医嘱数据
|
||||
-- ============================================
|
||||
|
||||
-- 查看需要修复的记录
|
||||
SELECT
|
||||
wsr.id,
|
||||
wsr.activity_id,
|
||||
cs.surgery_name,
|
||||
cs.surgery_code,
|
||||
wsr.create_time
|
||||
FROM wor_service_request wsr
|
||||
LEFT JOIN cli_surgery cs ON cs.id = wsr.activity_id
|
||||
WHERE wsr.category_enum = 4
|
||||
AND wsr.delete_flag = '0'
|
||||
AND (wsr.content_json::jsonb->>'surgeryName' IS NULL OR wsr.content_json::jsonb->>'surgeryName' = '')
|
||||
AND cs.surgery_name IS NOT NULL
|
||||
ORDER BY wsr.create_time DESC;
|
||||
|
||||
-- 执行修复
|
||||
UPDATE wor_service_request wsr
|
||||
SET content_json =
|
||||
COALESCE(
|
||||
(wsr.content_json::jsonb || jsonb_build_object(
|
||||
'surgeryName', cs.surgery_name,
|
||||
'surgeryCode', COALESCE(cs.surgery_code, '')
|
||||
))::text,
|
||||
jsonb_build_object(
|
||||
'surgeryName', cs.surgery_name,
|
||||
'surgeryCode', COALESCE(cs.surgery_code, '')
|
||||
)::text
|
||||
)
|
||||
FROM cli_surgery cs
|
||||
WHERE wsr.category_enum = 4
|
||||
AND wsr.delete_flag = '0'
|
||||
AND (wsr.content_json::jsonb->>'surgeryName' IS NULL OR wsr.content_json::jsonb->>'surgeryName' = '')
|
||||
AND cs.id = wsr.activity_id
|
||||
AND cs.surgery_name IS NOT NULL
|
||||
AND cs.delete_flag = '0';
|
||||
|
||||
-- 验证修复结果
|
||||
SELECT
|
||||
'Remaining empty records' as status,
|
||||
COUNT(*) as count
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
56
sql/fix_surgery_missing_names.sql
Normal file
56
sql/fix_surgery_missing_names.sql
Normal file
@@ -0,0 +1,56 @@
|
||||
-- 修复手术申请表中申请科室和主刀医生姓名为空的问题
|
||||
-- 执行时间:2026-03-31
|
||||
-- 说明:填充 cli_surgery 表中 apply_dept_name 和 main_surgeon_name 为空的记录
|
||||
|
||||
-- 1. 查看当前字段的填充情况
|
||||
SELECT
|
||||
COUNT(*) as total_count,
|
||||
COUNT(apply_dept_id) as has_apply_dept_id_count,
|
||||
COUNT(apply_dept_name) as has_apply_dept_name_count,
|
||||
COUNT(*) - COUNT(apply_dept_name) as apply_dept_name_null_count,
|
||||
COUNT(main_surgeon_id) as has_main_surgeon_id_count,
|
||||
COUNT(main_surgeon_name) as has_main_surgeon_name_count,
|
||||
COUNT(*) - COUNT(main_surgeon_name) as main_surgeon_name_null_count
|
||||
FROM public.cli_surgery
|
||||
WHERE delete_flag = '0';
|
||||
|
||||
-- 2. 修复申请科室名称(根据 apply_dept_id 关联 adm_organization 表)
|
||||
UPDATE public.cli_surgery s
|
||||
SET apply_dept_name = o.name
|
||||
FROM public.adm_organization o
|
||||
WHERE s.apply_dept_id = o.id
|
||||
AND (s.apply_dept_name IS NULL OR s.apply_dept_name = '')
|
||||
AND s.delete_flag = '0';
|
||||
|
||||
-- 3. 修复主刀医生姓名(根据 main_surgeon_id 关联 sys_user 表)
|
||||
UPDATE public.cli_surgery s
|
||||
SET main_surgeon_name = u.nick_name
|
||||
FROM public.sys_user u
|
||||
WHERE s.main_surgeon_id = u.user_id
|
||||
AND (s.main_surgeon_name IS NULL OR s.main_surgeon_name = '')
|
||||
AND s.delete_flag = '0';
|
||||
|
||||
-- 4. 对于 apply_dept_id 为空但有 org_id 的记录,使用 org_name 作为申请科室
|
||||
UPDATE public.cli_surgery s
|
||||
SET apply_dept_name = o.name,
|
||||
apply_dept_id = s.org_id
|
||||
FROM public.adm_organization o
|
||||
WHERE s.org_id = o.id
|
||||
AND (s.apply_dept_name IS NULL OR s.apply_dept_name = '')
|
||||
AND s.delete_flag = '0';
|
||||
|
||||
-- 5. 验证修复结果 - 查看仍有空值的记录
|
||||
SELECT
|
||||
id,
|
||||
surgery_no,
|
||||
patient_name,
|
||||
apply_dept_id,
|
||||
apply_dept_name,
|
||||
main_surgeon_id,
|
||||
main_surgeon_name,
|
||||
create_time
|
||||
FROM public.cli_surgery
|
||||
WHERE delete_flag = '0'
|
||||
AND (apply_dept_name IS NULL OR apply_dept_name = '' OR main_surgeon_name IS NULL OR main_surgeon_name = '')
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 20;
|
||||
224
sql/query_today_outpatient_patients.sql
Normal file
224
sql/query_today_outpatient_patients.sql
Normal file
@@ -0,0 +1,224 @@
|
||||
-- ============================================
|
||||
-- 查询今日门诊患者数据(用于调试分诊排队页面)
|
||||
-- 简化版:直接查询,不考虑登录和租户
|
||||
-- ============================================
|
||||
|
||||
-- 1. 最简单查询:查看今天所有的挂号记录(不关联患者表)
|
||||
SELECT
|
||||
enc.id AS encounterId,
|
||||
enc.patient_id AS patientId,
|
||||
enc.start_time AS registerTime,
|
||||
enc.status_enum AS statusEnum,
|
||||
enc.organization_id AS departmentId,
|
||||
enc.tenant_id AS tenantId,
|
||||
enc.delete_flag AS deleteFlag,
|
||||
enc.bus_no AS encounterBusNo
|
||||
FROM adm_encounter enc
|
||||
WHERE enc.delete_flag = '0'
|
||||
AND enc.start_time::DATE = CURRENT_DATE
|
||||
ORDER BY enc.start_time DESC
|
||||
LIMIT 100;
|
||||
|
||||
-- ============================================
|
||||
-- 2. 完整查询:直接查询患者信息(简化版,不考虑租户)
|
||||
-- ============================================
|
||||
SELECT
|
||||
enc.id AS encounterId,
|
||||
enc.patient_id AS patientId,
|
||||
pt.name AS patientName,
|
||||
pt.gender_enum AS genderEnum,
|
||||
pt.birth_date AS birthDate,
|
||||
pt.id_card AS idCard,
|
||||
pt.phone AS phone,
|
||||
enc.bus_no AS encounterBusNo,
|
||||
enc.start_time AS registerTime,
|
||||
enc.reception_time AS receptionTime,
|
||||
enc.status_enum AS statusEnum,
|
||||
enc.subject_status_enum AS subjectStatusEnum,
|
||||
CASE
|
||||
WHEN enc.reception_time IS NOT NULL
|
||||
THEN EXTRACT(EPOCH FROM (enc.reception_time - enc.start_time)) / 60
|
||||
ELSE EXTRACT(EPOCH FROM (NOW() - enc.start_time)) / 60
|
||||
END AS waitingDuration,
|
||||
CASE
|
||||
WHEN enc.end_time IS NOT NULL AND enc.reception_time IS NOT NULL
|
||||
THEN EXTRACT(EPOCH FROM (enc.end_time - enc.reception_time)) / 60
|
||||
ELSE NULL
|
||||
END AS visitDuration,
|
||||
pt.type_code AS typeCode,
|
||||
enc.important_flag AS importantFlag,
|
||||
-- 医生信息(左关联)
|
||||
ep.practitioner_id AS doctorId
|
||||
FROM adm_encounter enc
|
||||
INNER JOIN adm_patient pt
|
||||
ON enc.patient_id = pt.id
|
||||
AND pt.delete_flag = '0'
|
||||
LEFT JOIN adm_encounter_participant ep
|
||||
ON enc.id = ep.encounter_id
|
||||
AND ep.type_code = 'admitter'
|
||||
AND ep.delete_flag = '0'
|
||||
WHERE enc.delete_flag = '0'
|
||||
AND enc.start_time::DATE = CURRENT_DATE
|
||||
ORDER BY enc.start_time DESC
|
||||
LIMIT 10000;
|
||||
|
||||
-- ============================================
|
||||
-- 3. 检查数据条件:查看可能影响查询结果的数据
|
||||
-- ============================================
|
||||
|
||||
-- 3.1 检查今天的挂号记录总数
|
||||
SELECT
|
||||
COUNT(*) AS total_count,
|
||||
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count,
|
||||
COUNT(CASE WHEN delete_flag = '1' THEN 1 END) AS deleted_count
|
||||
FROM adm_encounter
|
||||
WHERE start_time::DATE = CURRENT_DATE;
|
||||
|
||||
-- 3.2 检查不同租户的数据分布
|
||||
SELECT
|
||||
tenant_id,
|
||||
COUNT(*) AS count,
|
||||
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
|
||||
FROM adm_encounter
|
||||
WHERE start_time::DATE = CURRENT_DATE
|
||||
GROUP BY tenant_id
|
||||
ORDER BY tenant_id;
|
||||
|
||||
-- 3.3 检查不同状态的数据分布
|
||||
SELECT
|
||||
status_enum,
|
||||
COUNT(*) AS count,
|
||||
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
|
||||
FROM adm_encounter
|
||||
WHERE start_time::DATE = CURRENT_DATE
|
||||
AND delete_flag = '0'
|
||||
GROUP BY status_enum
|
||||
ORDER BY status_enum;
|
||||
|
||||
-- 3.4 检查是否有患者数据关联
|
||||
SELECT
|
||||
COUNT(DISTINCT enc.id) AS encounter_count,
|
||||
COUNT(DISTINCT pt.id) AS patient_count,
|
||||
COUNT(DISTINCT CASE WHEN pt.delete_flag = '0' THEN pt.id END) AS patient_not_deleted_count
|
||||
FROM adm_encounter enc
|
||||
LEFT JOIN adm_patient pt ON enc.patient_id = pt.id
|
||||
WHERE enc.start_time::DATE = CURRENT_DATE
|
||||
AND enc.delete_flag = '0';
|
||||
|
||||
-- 3.5 检查医生参与信息
|
||||
SELECT
|
||||
COUNT(DISTINCT enc.id) AS encounter_count,
|
||||
COUNT(DISTINCT ep.encounter_id) AS has_doctor_count,
|
||||
COUNT(DISTINCT ep.practitioner_id) AS doctor_count
|
||||
FROM adm_encounter enc
|
||||
LEFT JOIN adm_encounter_participant ep
|
||||
ON enc.id = ep.encounter_id
|
||||
AND ep.type_code = 'admitter'
|
||||
AND ep.delete_flag = '0'
|
||||
WHERE enc.start_time::DATE = CURRENT_DATE
|
||||
AND enc.delete_flag = '0';
|
||||
|
||||
-- ============================================
|
||||
-- 4. 快速查询:直接查看患者姓名和挂号信息(最简单)
|
||||
-- ============================================
|
||||
SELECT
|
||||
enc.id AS 就诊记录ID,
|
||||
pt.name AS 患者姓名,
|
||||
pt.id_card AS 身份证号,
|
||||
pt.phone AS 联系电话,
|
||||
enc.start_time AS 挂号时间,
|
||||
enc.create_time AS 创建时间,
|
||||
enc.status_enum AS 状态,
|
||||
enc.bus_no AS 就诊流水号
|
||||
FROM adm_encounter enc
|
||||
INNER JOIN adm_patient pt ON enc.patient_id = pt.id
|
||||
WHERE enc.delete_flag = '0'
|
||||
AND pt.delete_flag = '0'
|
||||
AND enc.start_time::DATE = CURRENT_DATE
|
||||
ORDER BY enc.start_time DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 4.1 使用 create_time 查询(和门诊挂号页面一致)
|
||||
-- ============================================
|
||||
SELECT
|
||||
enc.id AS 就诊记录ID,
|
||||
pt.name AS 患者姓名,
|
||||
pt.id_card AS 身份证号,
|
||||
pt.phone AS 联系电话,
|
||||
enc.create_time AS 创建时间,
|
||||
enc.start_time AS 开始时间,
|
||||
enc.status_enum AS 状态,
|
||||
enc.bus_no AS 就诊流水号
|
||||
FROM adm_encounter enc
|
||||
INNER JOIN adm_patient pt ON enc.patient_id = pt.id
|
||||
WHERE enc.delete_flag = '0'
|
||||
AND pt.delete_flag = '0'
|
||||
AND enc.create_time::DATE = CURRENT_DATE
|
||||
ORDER BY enc.create_time DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 4.2 完全模拟门诊挂号页面的查询(包含支付状态)
|
||||
-- ============================================
|
||||
SELECT
|
||||
enc.id AS 就诊记录ID,
|
||||
pt.name AS 患者姓名,
|
||||
pt.id_card AS 身份证号,
|
||||
pt.phone AS 联系电话,
|
||||
enc.create_time AS 挂号时间,
|
||||
enc.status_enum AS 状态,
|
||||
enc.bus_no AS 就诊流水号,
|
||||
ci.total_price AS 挂号金额,
|
||||
pr.status_enum AS 支付状态
|
||||
FROM adm_encounter enc
|
||||
INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0'
|
||||
LEFT JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1
|
||||
LEFT JOIN fin_payment_reconciliation pr ON ci.id::TEXT = ANY(string_to_array(pr.charge_item_ids,','))
|
||||
AND pr.delete_flag = '0'
|
||||
AND pr.status_enum = 1
|
||||
WHERE enc.delete_flag = '0'
|
||||
AND enc.class_enum = 1 -- 门诊
|
||||
AND enc.create_time::DATE = CURRENT_DATE
|
||||
ORDER BY enc.create_time DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 5. 快速检查:查看最近7天的挂号记录数量(使用 start_time)
|
||||
-- ============================================
|
||||
SELECT
|
||||
start_time::DATE AS register_date,
|
||||
COUNT(*) AS total_count,
|
||||
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
|
||||
FROM adm_encounter
|
||||
WHERE start_time::DATE >= CURRENT_DATE - INTERVAL '7 days'
|
||||
GROUP BY start_time::DATE
|
||||
ORDER BY start_time::DATE DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 5.1 快速检查:查看最近7天的挂号记录数量(使用 create_time)
|
||||
-- ============================================
|
||||
SELECT
|
||||
create_time::DATE AS register_date,
|
||||
COUNT(*) AS total_count,
|
||||
COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count
|
||||
FROM adm_encounter
|
||||
WHERE create_time::DATE >= CURRENT_DATE - INTERVAL '7 days'
|
||||
AND class_enum = 1 -- 门诊
|
||||
GROUP BY create_time::DATE
|
||||
ORDER BY create_time::DATE DESC;
|
||||
|
||||
-- ============================================
|
||||
-- 6. 对比 start_time 和 create_time 的差异
|
||||
-- ============================================
|
||||
SELECT
|
||||
id AS 就诊记录ID,
|
||||
start_time AS 开始时间,
|
||||
create_time AS 创建时间,
|
||||
(start_time::DATE) AS 开始日期,
|
||||
(create_time::DATE) AS 创建日期,
|
||||
status_enum AS 状态,
|
||||
delete_flag AS 是否删除
|
||||
FROM adm_encounter
|
||||
WHERE (start_time::DATE = CURRENT_DATE OR create_time::DATE = CURRENT_DATE)
|
||||
AND delete_flag = '0'
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 20;
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
-- 移除 adm_practitioner 表中 create_by 列的 NOT NULL 约束
|
||||
-- 用于解决 org.postgresql.util.PSQLException: ERROR: null value in column "create_by" of relation "adm_practitioner" violates not-null constraint
|
||||
|
||||
-- 在PostgreSQL中,NOT NULL约束实际上是列的一个属性,而不是命名约束
|
||||
-- 因此我们使用 ALTER COLUMN ... DROP NOT NULL 来移除它
|
||||
|
||||
-- 可选:先查看当前表结构及约束信息
|
||||
-- 注意:\d 命令仅在 psql 中有效,在脚本中不能使用
|
||||
/*
|
||||
SELECT
|
||||
c.column_name,
|
||||
c.is_nullable,
|
||||
c.data_type,
|
||||
tc.constraint_type
|
||||
FROM
|
||||
information_schema.columns c
|
||||
LEFT JOIN
|
||||
information_schema.constraint_column_usage ccu ON c.column_name = ccu.column_name AND c.table_name = ccu.table_name
|
||||
LEFT JOIN
|
||||
information_schema.table_constraints tc ON ccu.constraint_name = tc.constraint_name
|
||||
WHERE
|
||||
c.table_name = 'adm_practitioner'
|
||||
AND c.column_name = 'create_by';
|
||||
*/
|
||||
|
||||
-- 移除 create_by 列的 NOT NULL 约束
|
||||
ALTER TABLE "public"."adm_practitioner"
|
||||
ALTER COLUMN "create_by" DROP NOT NULL;
|
||||
|
||||
-- 可选:如果需要,可以同时移除默认值
|
||||
-- ALTER TABLE "public"."adm_practitioner"
|
||||
-- ALTER COLUMN "create_by" DROP DEFAULT;
|
||||
|
||||
-- 提示:执行此脚本后,create_by 列将允许 NULL 值
|
||||
-- 这将解决插入数据时因缺少 create_by 值而导致的违反非空约束错误
|
||||
@@ -0,0 +1,58 @@
|
||||
-- 安全移除 adm_practitioner 表中 create_by 列的 NOT NULL 约束
|
||||
-- 用于解决 org.postgresql.util.PSQLException: ERROR: null value in column "create_by" of relation "adm_practitioner" violates not-null constraint
|
||||
|
||||
-- 步骤 1: 检查当前表结构
|
||||
-- 查看 create_by 列的当前约束情况
|
||||
SELECT
|
||||
column_name,
|
||||
is_nullable,
|
||||
data_type,
|
||||
column_default
|
||||
FROM
|
||||
information_schema.columns
|
||||
WHERE
|
||||
table_schema = 'public'
|
||||
AND table_name = 'adm_practitioner'
|
||||
AND column_name = 'create_by';
|
||||
|
||||
-- 步骤 2: 备份重要数据(可选但推荐)
|
||||
-- 创建一个临时表来保存当前数据概览
|
||||
CREATE TEMPORARY TABLE adm_practitioner_backup_check AS
|
||||
SELECT id, name, create_by, create_time
|
||||
FROM public.adm_practitioner
|
||||
LIMIT 10; -- 只取前10条记录作为样本检查
|
||||
|
||||
-- 显示备份样本以供参考
|
||||
SELECT * FROM adm_practitioner_backup_check;
|
||||
|
||||
-- 步骤 3: 执行约束移除操作
|
||||
-- 在PostgreSQL中,NOT NULL约束实际上是列的一个属性,而不是命名约束
|
||||
-- 使用 ALTER COLUMN ... DROP NOT NULL 来移除它
|
||||
ALTER TABLE "public"."adm_practitioner"
|
||||
ALTER COLUMN "create_by" DROP NOT NULL;
|
||||
|
||||
-- 步骤 4: 验证更改
|
||||
-- 再次检查列属性,确认NOT NULL约束已被移除
|
||||
SELECT
|
||||
column_name,
|
||||
is_nullable,
|
||||
data_type,
|
||||
column_default
|
||||
FROM
|
||||
information_schema.columns
|
||||
WHERE
|
||||
table_schema = 'public'
|
||||
AND table_name = 'adm_practitioner'
|
||||
AND column_name = 'create_by';
|
||||
|
||||
-- 步骤 5: 测试插入操作(可选)
|
||||
-- 尝试插入一条不带create_by值的数据来验证约束是否已移除
|
||||
-- 注意:实际执行时请根据需要调整其他必需字段
|
||||
-- INSERT INTO "public"."adm_practitioner" (name, user_id, tenant_id, delete_flag, create_time)
|
||||
-- VALUES ('Test Practitioner', 0, 1, '0', NOW());
|
||||
|
||||
-- 提示:
|
||||
-- 1. 执行此脚本前建议先备份整个表或数据库
|
||||
-- 2. 执行后 create_by 列将允许 NULL 值
|
||||
-- 3. 这将解决插入数据时因缺少 create_by 值而导致的违反非空约束错误
|
||||
-- 4. 考虑在应用程序层面处理可能的 NULL 值
|
||||
90
sql/修复历史手术医嘱数据.sql
Normal file
90
sql/修复历史手术医嘱数据.sql
Normal file
@@ -0,0 +1,90 @@
|
||||
-- ============================================
|
||||
-- Bug #318 历史手术医嘱数据修复脚本
|
||||
-- 修复 content_json 中缺失的 surgeryName
|
||||
-- ============================================
|
||||
|
||||
-- 1. 查看需要修复的数据
|
||||
SELECT
|
||||
'Before Fix - Count' as status,
|
||||
COUNT(*) as total_count
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
|
||||
-- 2. 查看需要修复的详细记录
|
||||
SELECT
|
||||
id,
|
||||
activity_id,
|
||||
content_json::jsonb->>'surgeryName' as current_surgery_name,
|
||||
content_json as full_content_json,
|
||||
create_time
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '')
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 3. 【执行修复】从 cli_surgery 表获取手术名称并更新
|
||||
-- 注意:此操作会修改历史数据,请先备份
|
||||
UPDATE wor_service_request wsr
|
||||
SET content_json =
|
||||
CASE
|
||||
WHEN wsr.content_json IS NULL OR wsr.content_json = '' THEN
|
||||
jsonb_build_object(
|
||||
'surgeryName', cs.surgery_name,
|
||||
'surgeryCode', cs.surgery_code
|
||||
)::text
|
||||
ELSE
|
||||
(wsr.content_json::jsonb || jsonb_build_object(
|
||||
'surgeryName', cs.surgery_name,
|
||||
'surgeryCode', cs.surgery_code
|
||||
))::text
|
||||
END
|
||||
FROM cli_surgery cs
|
||||
WHERE wsr.category_enum = 4
|
||||
AND wsr.delete_flag = '0'
|
||||
AND (wsr.content_json::jsonb->>'surgeryName' IS NULL OR wsr.content_json::jsonb->>'surgeryName' = '')
|
||||
AND cs.id = wsr.activity_id;
|
||||
|
||||
-- 4. 【备选修复】如果没有关联的 cli_surgery 记录,尝试从 activity_id 获取名称
|
||||
UPDATE wor_service_request wsr
|
||||
SET content_json =
|
||||
CASE
|
||||
WHEN wsr.content_json IS NULL OR wsr.content_json = '' THEN
|
||||
jsonb_build_object(
|
||||
'surgeryName', '手术项目-' || wsr.activity_id,
|
||||
'surgeryCode', ''
|
||||
)::text
|
||||
ELSE
|
||||
(wsr.content_json::jsonb || jsonb_build_object(
|
||||
'surgeryName', '手术项目-' || wsr.activity_id,
|
||||
'surgeryCode', ''
|
||||
))::text
|
||||
END
|
||||
WHERE wsr.category_enum = 4
|
||||
AND wsr.delete_flag = '0'
|
||||
AND (wsr.content_json::jsonb->>'surgeryName' IS NULL OR wsr.content_json::jsonb->>'surgeryName' = '')
|
||||
AND wsr.activity_id IS NOT NULL;
|
||||
|
||||
-- 5. 查看修复后的结果
|
||||
SELECT
|
||||
'After Fix - Count' as status,
|
||||
COUNT(*) as remaining_count
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
|
||||
-- 6. 验证修复成功
|
||||
SELECT
|
||||
id,
|
||||
content_json::jsonb->>'surgeryName' as surgery_name,
|
||||
content_json::jsonb->>'surgeryCode' as surgery_code,
|
||||
create_time
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 5;
|
||||
84
sql/修复历史手术医嘱数据_执行.sql
Normal file
84
sql/修复历史手术医嘱数据_执行.sql
Normal file
@@ -0,0 +1,84 @@
|
||||
-- ============================================
|
||||
-- Bug #318 历史手术医嘱数据修复(执行版本)
|
||||
-- ============================================
|
||||
|
||||
-- 步骤1:先查看有多少条记录需要修复
|
||||
SELECT
|
||||
'需要修复的记录数' as description,
|
||||
COUNT(*) as count
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
|
||||
-- 步骤2:【执行此语句进行修复】
|
||||
-- 从 cli_surgery 表关联获取手术名称
|
||||
UPDATE wor_service_request wsr
|
||||
SET content_json = COALESCE(
|
||||
(wsr.content_json::jsonb || jsonb_build_object(
|
||||
'surgeryName', cs.surgery_name,
|
||||
'surgeryCode', cs.surgery_code
|
||||
))::text,
|
||||
jsonb_build_object(
|
||||
'surgeryName', COALESCE(cs.surgery_name, '手术项目'),
|
||||
'surgeryCode', COALESCE(cs.surgery_code, '')
|
||||
)::text
|
||||
)
|
||||
FROM cli_surgery cs
|
||||
WHERE wsr.category_enum = 4
|
||||
AND wsr.delete_flag = '0'
|
||||
AND (wsr.content_json::jsonb->>'surgeryName' IS NULL OR wsr.content_json::jsonb->>'surgeryName' = '')
|
||||
AND cs.id = wsr.activity_id
|
||||
AND cs.delete_flag = '0';
|
||||
|
||||
-- 步骤3:【备选修复】对于没有关联 cli_surgery 的记录,使用默认值
|
||||
UPDATE wor_service_request
|
||||
SET content_json = COALESCE(
|
||||
(content_json::jsonb || jsonb_build_object(
|
||||
'surgeryName', '手术项目',
|
||||
'surgeryCode', ''
|
||||
))::text,
|
||||
jsonb_build_object(
|
||||
'surgeryName', '手术项目',
|
||||
'surgeryCode', ''
|
||||
)::text
|
||||
)
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
|
||||
-- 步骤4:验证修复结果
|
||||
SELECT
|
||||
'修复后剩余空记录数' as description,
|
||||
COUNT(*) as count
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND (content_json::jsonb->>'surgeryName' IS NULL OR content_json::jsonb->>'surgeryName' = '');
|
||||
|
||||
-- 步骤5:查看修复后的示例数据
|
||||
SELECT
|
||||
id,
|
||||
activity_id,
|
||||
content_json::jsonb->>'surgeryName' as surgery_name,
|
||||
content_json::jsonb->>'surgeryCode' as surgery_code,
|
||||
create_time
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 5;
|
||||
|
||||
|
||||
-- 查看今天新插入的手术医嘱
|
||||
SELECT
|
||||
id,
|
||||
content_json::jsonb->>'surgeryName' as surgery_name,
|
||||
content_json::jsonb->>'surgeryCode' as surgery_code,
|
||||
create_time
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
AND create_time >= CURRENT_DATE
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 3;
|
||||
327
sql/迁移记录-DB变更记录/202603051000_card_management_menu.sql
Normal file
327
sql/迁移记录-DB变更记录/202603051000_card_management_menu.sql
Normal file
@@ -0,0 +1,327 @@
|
||||
-- ============================================
|
||||
-- STORY #104: 增加报卡管理界面
|
||||
-- 创建时间: 2026-03-05
|
||||
-- 功能说明: 在疾病报告管理目录下增加报卡管理界面菜单
|
||||
-- ============================================
|
||||
|
||||
-- 1. 创建疾病报告管理目录(如果不存在)
|
||||
-- 注意:需要根据实际情况调整parent_id,这里假设是一级菜单
|
||||
INSERT INTO "sys_menu" (
|
||||
"menu_name",
|
||||
"parent_id",
|
||||
"order_num",
|
||||
"path",
|
||||
"component",
|
||||
"query",
|
||||
"route_name",
|
||||
"is_frame",
|
||||
"is_cache",
|
||||
"menu_type",
|
||||
"visible",
|
||||
"status",
|
||||
"perms",
|
||||
"icon",
|
||||
"create_by",
|
||||
"create_time",
|
||||
"update_by",
|
||||
"update_time",
|
||||
"remark"
|
||||
)
|
||||
SELECT
|
||||
'疾病报告管理',
|
||||
0, -- 一级菜单,根据实际情况调整
|
||||
100,
|
||||
'diseaseReport',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
'1',
|
||||
'0',
|
||||
'M', -- M=目录
|
||||
'0',
|
||||
'0',
|
||||
NULL,
|
||||
'documentation',
|
||||
'admin',
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
'疾病报告管理目录'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM "sys_menu" WHERE "menu_name" = '疾病报告管理'
|
||||
);
|
||||
|
||||
-- 2. 创建报卡管理菜单
|
||||
-- 获取疾病报告管理目录的ID
|
||||
INSERT INTO "sys_menu" (
|
||||
"menu_name",
|
||||
"parent_id",
|
||||
"order_num",
|
||||
"path",
|
||||
"component",
|
||||
"query",
|
||||
"route_name",
|
||||
"is_frame",
|
||||
"is_cache",
|
||||
"menu_type",
|
||||
"visible",
|
||||
"status",
|
||||
"perms",
|
||||
"icon",
|
||||
"create_by",
|
||||
"create_time",
|
||||
"update_by",
|
||||
"update_time",
|
||||
"remark"
|
||||
)
|
||||
SELECT
|
||||
'报卡管理',
|
||||
(SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '疾病报告管理' LIMIT 1),
|
||||
1,
|
||||
'cardManagement',
|
||||
'cardmanagement/index',
|
||||
NULL,
|
||||
'CardManagement',
|
||||
'1',
|
||||
'0',
|
||||
'C', -- C=菜单
|
||||
'0',
|
||||
'0',
|
||||
'card:management:list',
|
||||
'form',
|
||||
'admin',
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
'报卡管理界面'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM "sys_menu" WHERE "menu_name" = '报卡管理'
|
||||
);
|
||||
|
||||
-- 3. 创建报卡管理相关按钮权限
|
||||
-- 获取报卡管理菜单的ID
|
||||
INSERT INTO "sys_menu" (
|
||||
"menu_name",
|
||||
"parent_id",
|
||||
"order_num",
|
||||
"path",
|
||||
"component",
|
||||
"query",
|
||||
"route_name",
|
||||
"is_frame",
|
||||
"is_cache",
|
||||
"menu_type",
|
||||
"visible",
|
||||
"status",
|
||||
"perms",
|
||||
"icon",
|
||||
"create_by",
|
||||
"create_time",
|
||||
"update_by",
|
||||
"update_time",
|
||||
"remark"
|
||||
)
|
||||
SELECT
|
||||
'报卡查询',
|
||||
(SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1),
|
||||
1,
|
||||
'',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
'1',
|
||||
'0',
|
||||
'F', -- F=按钮
|
||||
'0',
|
||||
'0',
|
||||
'card:management:query',
|
||||
'#',
|
||||
'admin',
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
''
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:query'
|
||||
);
|
||||
|
||||
INSERT INTO "sys_menu" (
|
||||
"menu_name",
|
||||
"parent_id",
|
||||
"order_num",
|
||||
"path",
|
||||
"component",
|
||||
"query",
|
||||
"route_name",
|
||||
"is_frame",
|
||||
"is_cache",
|
||||
"menu_type",
|
||||
"visible",
|
||||
"status",
|
||||
"perms",
|
||||
"icon",
|
||||
"create_by",
|
||||
"create_time",
|
||||
"update_by",
|
||||
"update_time",
|
||||
"remark"
|
||||
)
|
||||
SELECT
|
||||
'报卡审核',
|
||||
(SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1),
|
||||
2,
|
||||
'',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
'1',
|
||||
'0',
|
||||
'F',
|
||||
'0',
|
||||
'0',
|
||||
'card:management:audit',
|
||||
'#',
|
||||
'admin',
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
''
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:audit'
|
||||
);
|
||||
|
||||
INSERT INTO "sys_menu" (
|
||||
"menu_name",
|
||||
"parent_id",
|
||||
"order_num",
|
||||
"path",
|
||||
"component",
|
||||
"query",
|
||||
"route_name",
|
||||
"is_frame",
|
||||
"is_cache",
|
||||
"menu_type",
|
||||
"visible",
|
||||
"status",
|
||||
"perms",
|
||||
"icon",
|
||||
"create_by",
|
||||
"create_time",
|
||||
"update_by",
|
||||
"update_time",
|
||||
"remark"
|
||||
)
|
||||
SELECT
|
||||
'报卡导出',
|
||||
(SELECT "menu_id" FROM "sys_menu" WHERE "menu_name" = '报卡管理' LIMIT 1),
|
||||
3,
|
||||
'',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
'1',
|
||||
'0',
|
||||
'F',
|
||||
'0',
|
||||
'0',
|
||||
'card:management:export',
|
||||
'#',
|
||||
'admin',
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
''
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM "sys_menu" WHERE "perms" = 'card:management:export'
|
||||
);
|
||||
|
||||
-- 4. 创建数据库表(如果不存在)
|
||||
-- 传染病报卡表
|
||||
CREATE TABLE IF NOT EXISTS "infectious_card" (
|
||||
"id" BIGINT PRIMARY KEY,
|
||||
"card_no" VARCHAR(20) UNIQUE,
|
||||
"visit_id" BIGINT,
|
||||
"diag_id" BIGINT,
|
||||
"pat_id" BIGINT,
|
||||
"id_type" INTEGER,
|
||||
"id_no" VARCHAR(30),
|
||||
"pat_name" VARCHAR(50),
|
||||
"parent_name" VARCHAR(50),
|
||||
"sex" CHAR(1),
|
||||
"birthday" DATE,
|
||||
"age" INTEGER,
|
||||
"age_unit" CHAR(1),
|
||||
"workplace" VARCHAR(100),
|
||||
"phone" VARCHAR(20),
|
||||
"contact_phone" VARCHAR(20),
|
||||
"address_prov" VARCHAR(50),
|
||||
"address_city" VARCHAR(50),
|
||||
"address_county" VARCHAR(50),
|
||||
"address_town" VARCHAR(50),
|
||||
"address_village" VARCHAR(80),
|
||||
"address_house" VARCHAR(40),
|
||||
"patientbelong" VARCHAR(20),
|
||||
"occupation" VARCHAR(20),
|
||||
"disease_code" VARCHAR(10),
|
||||
"disease_name" VARCHAR(100),
|
||||
"disease_subtype" VARCHAR(50),
|
||||
"other_disease" VARCHAR(100),
|
||||
"disease_type" CHAR(1),
|
||||
"onset_date" DATE,
|
||||
"diag_date" TIMESTAMP,
|
||||
"death_date" DATE,
|
||||
"revised_disease_name" VARCHAR(100),
|
||||
"return_reason" VARCHAR(200),
|
||||
"report_org" VARCHAR(100),
|
||||
"report_org_phone" VARCHAR(20),
|
||||
"report_doc" VARCHAR(50),
|
||||
"report_date" DATE,
|
||||
"status" CHAR(1) DEFAULT '0',
|
||||
"fail_msg" VARCHAR(500),
|
||||
"xml_content" TEXT,
|
||||
"card_name_code" INTEGER,
|
||||
"registration_source" INTEGER,
|
||||
"dept_id" BIGINT,
|
||||
"dept_name" VARCHAR(100),
|
||||
"doctor_id" BIGINT,
|
||||
"create_by" VARCHAR(64),
|
||||
"create_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
"update_by" VARCHAR(64),
|
||||
"update_time" TIMESTAMP,
|
||||
"remark" VARCHAR(500)
|
||||
);
|
||||
|
||||
-- 审核记录表
|
||||
CREATE TABLE IF NOT EXISTS "infectious_audit" (
|
||||
"audit_id" BIGINT PRIMARY KEY,
|
||||
"card_id" BIGINT NOT NULL,
|
||||
"audit_seq" INTEGER NOT NULL,
|
||||
"audit_type" CHAR(1) NOT NULL,
|
||||
"audit_status_from" CHAR(1) NOT NULL,
|
||||
"audit_status_to" CHAR(1) NOT NULL,
|
||||
"audit_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"auditor_id" VARCHAR(20) NOT NULL,
|
||||
"auditor_name" VARCHAR(50) NOT NULL,
|
||||
"audit_opinion" TEXT,
|
||||
"reason_for_return" TEXT,
|
||||
"fail_reason_code" VARCHAR(20),
|
||||
"fail_reason_desc" TEXT,
|
||||
"is_batch" BOOLEAN DEFAULT FALSE,
|
||||
"batch_size" INTEGER DEFAULT 1,
|
||||
"create_by" VARCHAR(64),
|
||||
"create_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
"update_by" VARCHAR(64),
|
||||
"update_time" TIMESTAMP,
|
||||
"remark" VARCHAR(500)
|
||||
);
|
||||
|
||||
-- 创建索引
|
||||
CREATE INDEX IF NOT EXISTS idx_infectious_card_no ON "infectious_card"("card_no");
|
||||
CREATE INDEX IF NOT EXISTS idx_infectious_card_status ON "infectious_card"("status");
|
||||
CREATE INDEX IF NOT EXISTS idx_infectious_card_create_time ON "infectious_card"("create_time");
|
||||
CREATE INDEX IF NOT EXISTS idx_infectious_audit_card_id ON "infectious_audit"("card_id");
|
||||
|
||||
-- 添加迁移记录
|
||||
INSERT INTO __MigrationsHistory (MigrationId, ProductVersion)
|
||||
VALUES ('202603051000_card_management_menu', '1.0.0')
|
||||
ON CONFLICT DO NOTHING;
|
||||
44
sql/迁移记录-DB变更记录/20260401_update_surgery_advice_type.sql
Normal file
44
sql/迁移记录-DB变更记录/20260401_update_surgery_advice_type.sql
Normal file
@@ -0,0 +1,44 @@
|
||||
-- ============================================
|
||||
-- Bug #318 数据迁移脚本
|
||||
-- 更新历史手术医嘱的 advice_type 从 4 改为 6
|
||||
-- 避免与耗材类型冲突
|
||||
-- ============================================
|
||||
|
||||
-- 1. 查看当前手术医嘱数据(category_enum=4)
|
||||
SELECT
|
||||
'更新前统计' as step,
|
||||
COUNT(*) as total_count,
|
||||
COUNT(CASE WHEN category_enum = 4 THEN 1 END) as surgery_count
|
||||
FROM wor_service_request
|
||||
WHERE delete_flag = '0'
|
||||
AND generate_source_enum = 1;
|
||||
|
||||
-- 2. 查看手术医嘱详情(用于验证)
|
||||
SELECT
|
||||
id,
|
||||
bus_no,
|
||||
category_enum,
|
||||
content_json::jsonb->>'surgeryName' as surgery_name,
|
||||
create_time
|
||||
FROM wor_service_request
|
||||
WHERE category_enum = 4
|
||||
AND delete_flag = '0'
|
||||
ORDER BY create_time DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 3. 【执行更新】将手术医嘱的 category_enum 从 4 改为 6
|
||||
-- 注意:此操作不可逆,请先备份数据
|
||||
-- UPDATE wor_service_request
|
||||
-- SET category_enum = 6
|
||||
-- WHERE category_enum = 4
|
||||
-- AND delete_flag = '0';
|
||||
|
||||
-- 4. 验证更新结果
|
||||
-- SELECT
|
||||
-- '更新后统计' as step,
|
||||
-- COUNT(*) as total_count,
|
||||
-- COUNT(CASE WHEN category_enum = 4 THEN 1 END) as category_4_count,
|
||||
-- COUNT(CASE WHEN category_enum = 6 THEN 1 END) as category_6_count
|
||||
-- FROM wor_service_request
|
||||
-- WHERE delete_flag = '0'
|
||||
-- AND generate_source_enum = 1;
|
||||
Reference in New Issue
Block a user