fix(database): 修复患者首页查询重复数据和关联查询问题
- 在ATDManageAppMapper.xml中添加DISTINCT关键字解决入院患者信息重复问题 - 重构PatientHomeAppMapper.xml中的复杂查询逻辑,使用子查询替代多层JOIN提高性能 - 修复vital signs查询中的字段关联错误,将base_service_req_id改为request_id - 优化前端implementDepartment组件的数据加载逻辑,添加异步处理和错误捕获 - 为诊疗项目下拉框添加数据加载状态检查,防止空数据导致的界面异常 - 实现防抖机制和数据量限制,提升大数据量下的响应性能 - 添加并行数据加载,减少页面初始化时间
This commit is contained in:
@@ -224,7 +224,7 @@
|
||||
</select>
|
||||
<select id="selectAdmissionPatientInfo"
|
||||
resultType="com.openhis.web.inhospitalnursestation.dto.AdmissionPatientInfoDto">
|
||||
SELECT ae.id AS encounter_id,
|
||||
SELECT DISTINCT ae.id AS encounter_id,
|
||||
ae.bus_no,
|
||||
ae.priority_enum,
|
||||
ae.organization_id,
|
||||
|
||||
@@ -2,189 +2,250 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.openhis.web.inpatientmanage.mapper.PatientHomeAppMapper">
|
||||
|
||||
<!-- 患者首页信息分页查询-->
|
||||
<!-- 患者首页信息分页查询 -->
|
||||
<select id="getPage" parameterType="java.util.Map"
|
||||
resultType="com.openhis.web.inpatientmanage.dto.PatientHomeDto">
|
||||
SELECT
|
||||
T1.id,
|
||||
T1.active_flag,
|
||||
T1.temp_flag,
|
||||
T1."name" AS patientName, -- 患者姓名
|
||||
T1.name_json,
|
||||
T1.bus_no AS patientNo, -- 病历号
|
||||
T1.gender_enum, -- 患者性别
|
||||
T1.birth_date,
|
||||
T1.deceased_date,
|
||||
T1.marital_status_enum,
|
||||
T1.prfs_enum,
|
||||
T1.phone, -- 患者手机号
|
||||
COALESCE(NULLIF(T1.address, ''), '') AS address, -- 处理空地址
|
||||
T1.address_province,
|
||||
T1.address_city,
|
||||
T1.address_district,
|
||||
T1.address_street,
|
||||
T1.address_json,
|
||||
T1.nationality_code,
|
||||
T1.id_card,
|
||||
T1.py_str,
|
||||
T1.wb_str,
|
||||
T1.blood_abo,
|
||||
T1.blood_rh,
|
||||
T1.work_company,
|
||||
T1.native_place,
|
||||
T1.country_code,
|
||||
T1.link_name,
|
||||
T1.link_relation_code,
|
||||
T1.link_telcom,
|
||||
T1.link_jsons,
|
||||
T1.tenant_id,
|
||||
T2.bus_no AS hospitalNo, -- 住院号
|
||||
T2.id AS encounterId, -- 就诊ID
|
||||
T2.priority_enum, -- 护理级别
|
||||
T2.status_enum, -- 患者状态
|
||||
T2.organization_id,-- 入院科室
|
||||
T2.start_time AS admissionDate, -- 入院日期
|
||||
T2.end_time AS dischargeDate, -- 出院日期
|
||||
T2.class_enum, -- 就诊类别
|
||||
Doctor.name AS responsibleDoctor, -- 责任医生
|
||||
Nurse.name AS responsibleNurse, -- 责任护士
|
||||
T6.type_code, -- 费别
|
||||
T7.status_enum AS surgeryStatusEnum, -- 手术状态
|
||||
T8.start_time AS surgeryStartTime, -- 手术开始时间
|
||||
T8.end_time AS surgeryEndTime, -- 手术结束时间
|
||||
T9.id AS encounterLocationId, -- 就诊位置ID
|
||||
T9.location_id, -- 床位号
|
||||
T11."name" AS caty, -- 入院科室
|
||||
T12."name" AS mainDiagnosis -- 主要诊断
|
||||
FROM adm_patient AS T1
|
||||
LEFT JOIN adm_encounter T2
|
||||
ON T1.id = T2.patient_id -- 患者ID
|
||||
AND T2.delete_flag = '0'
|
||||
AND T2.class_enum = '1' -- 仅选择住院患者
|
||||
-- 获取责任医生
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
encounter_id,
|
||||
practitioner_id,
|
||||
"name",
|
||||
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY practitioner_id) as rn
|
||||
FROM (
|
||||
SELECT
|
||||
T3.encounter_id,
|
||||
T4."name",
|
||||
T3.practitioner_id
|
||||
FROM adm_encounter_participant T3
|
||||
LEFT JOIN adm_practitioner T4
|
||||
ON T3.practitioner_id = T4.id
|
||||
AND T4.delete_flag = '0'
|
||||
WHERE T3.type_code = '9' -- 责任医生类型
|
||||
AND T3.delete_flag = '0'
|
||||
) sub
|
||||
) Doctor ON T2.id = Doctor.encounter_id AND Doctor.rn = 1
|
||||
-- 获取责任护士
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
encounter_id,
|
||||
practitioner_id,
|
||||
"name",
|
||||
ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY practitioner_id) as rn
|
||||
FROM (
|
||||
SELECT
|
||||
T3.encounter_id,
|
||||
T4."name",
|
||||
T3.practitioner_id
|
||||
FROM adm_encounter_participant T3
|
||||
LEFT JOIN adm_practitioner T4
|
||||
ON T3.practitioner_id = T4.id
|
||||
AND T4.delete_flag = '0'
|
||||
WHERE T3.type_code = '2' -- 责任护士类型
|
||||
AND T3.delete_flag = '0'
|
||||
) sub
|
||||
) Nurse ON T2.id = Nurse.encounter_id AND Nurse.rn = 1
|
||||
LEFT JOIN adm_encounter_diagnosis T5
|
||||
ON T2.id = T5.encounter_id -- 就诊ID
|
||||
AND T5.maindise_flag = 1
|
||||
AND T5.delete_flag = '0'
|
||||
LEFT JOIN adm_account T6
|
||||
ON T2.id = T6.encounter_id -- 就诊ID
|
||||
AND T6.delete_flag = '0'
|
||||
LEFT JOIN cli_procedure T7
|
||||
ON T1.id = T7.patient_id -- 患者ID
|
||||
AND T7.delete_flag = '0'
|
||||
LEFT JOIN cli_procedure_performer T8
|
||||
ON T7.id = T8.procedure_id -- 手术ID
|
||||
AND T8.delete_flag = '0'
|
||||
LEFT JOIN adm_encounter_location T9
|
||||
ON T2.id = T9.encounter_id -- 就诊ID
|
||||
AND T9.form_enum = 8
|
||||
AND T9.delete_flag = '0'
|
||||
LEFT JOIN adm_organization T11
|
||||
ON T2.organization_id = T11.id
|
||||
AND T11.type_enum = 2
|
||||
AND T11.delete_flag = '0'
|
||||
LEFT JOIN cli_condition_definition T12
|
||||
ON T5.condition_id = T12.id
|
||||
AND T12.delete_flag = '0'
|
||||
LEFT JOIN wor_service_request T13
|
||||
ON T2.id = T13.encounter_id
|
||||
AND T7.base_service_req_id = T13.id
|
||||
AND T13.delete_flag = '0'
|
||||
LEFT JOIN wor_service_request_detail T14
|
||||
ON T13.id = T14.service_req_id
|
||||
AND T14.type_code = '3'
|
||||
AND T14.delete_flag = '0'
|
||||
<where>
|
||||
T1.delete_flag = '0'
|
||||
-- 患者ID
|
||||
<if test="patientId != null">
|
||||
AND T1.id = #{patientId}
|
||||
</if>
|
||||
id,
|
||||
active_flag,
|
||||
temp_flag,
|
||||
patientName,
|
||||
name_json,
|
||||
patientNo,
|
||||
gender_enum,
|
||||
birth_date,
|
||||
deceased_date,
|
||||
marital_status_enum,
|
||||
prfs_enum,
|
||||
phone,
|
||||
address,
|
||||
address_province,
|
||||
address_city,
|
||||
address_district,
|
||||
address_street,
|
||||
address_json,
|
||||
nationality_code,
|
||||
id_card,
|
||||
py_str,
|
||||
wb_str,
|
||||
blood_abo,
|
||||
blood_rh,
|
||||
work_company,
|
||||
native_place,
|
||||
country_code,
|
||||
link_name,
|
||||
link_relation_code,
|
||||
link_telcom,
|
||||
link_jsons,
|
||||
tenant_id,
|
||||
hospitalNo,
|
||||
encounterId,
|
||||
priority_enum,
|
||||
status_enum,
|
||||
organization_id,
|
||||
admissionDate,
|
||||
dischargeDate,
|
||||
class_enum,
|
||||
responsibleDoctor,
|
||||
responsibleNurse,
|
||||
type_code,
|
||||
surgeryStatusEnum,
|
||||
surgeryStartTime,
|
||||
surgeryEndTime,
|
||||
encounterLocationId,
|
||||
location_id,
|
||||
caty,
|
||||
mainDiagnosis
|
||||
FROM (
|
||||
SELECT
|
||||
patient_base.*,
|
||||
ROW_NUMBER() OVER (PARTITION BY patient_base.id ORDER BY patient_base.encounterId) as rn
|
||||
FROM (
|
||||
SELECT DISTINCT
|
||||
T1.id,
|
||||
T1.active_flag,
|
||||
T1.temp_flag,
|
||||
T1."name" AS patientName, -- 患者姓名
|
||||
T1.name_json,
|
||||
T1.bus_no AS patientNo, -- 病历号
|
||||
T1.gender_enum, -- 患者性别
|
||||
T1.birth_date,
|
||||
T1.deceased_date,
|
||||
T1.marital_status_enum,
|
||||
T1.prfs_enum,
|
||||
T1.phone, -- 患者手机号
|
||||
COALESCE(NULLIF(T1.address, ''), '') AS address, -- 处理空地址
|
||||
T1.address_province,
|
||||
T1.address_city,
|
||||
T1.address_district,
|
||||
T1.address_street,
|
||||
T1.address_json,
|
||||
T1.nationality_code,
|
||||
T1.id_card,
|
||||
T1.py_str,
|
||||
T1.wb_str,
|
||||
T1.blood_abo,
|
||||
T1.blood_rh,
|
||||
T1.work_company,
|
||||
T1.native_place,
|
||||
T1.country_code,
|
||||
T1.link_name,
|
||||
T1.link_relation_code,
|
||||
T1.link_telcom,
|
||||
T1.link_jsons,
|
||||
T1.tenant_id,
|
||||
T2.bus_no AS hospitalNo, -- 住院号
|
||||
T2.id AS encounterId, -- 就诊ID
|
||||
T2.priority_enum, -- 护理级别
|
||||
T2.status_enum, -- 患者状态
|
||||
T2.organization_id,-- 入院科室
|
||||
T2.start_time AS admissionDate, -- 入院日期
|
||||
T2.end_time AS dischargeDate, -- 出院日期
|
||||
T2.class_enum, -- 就诊类别
|
||||
-- 获取责任医生(使用子查询确保只返回一个值)
|
||||
(SELECT p."name"
|
||||
FROM adm_encounter_participant ep
|
||||
LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0'
|
||||
WHERE ep.encounter_id = T2.id
|
||||
AND ep.type_code = '9'
|
||||
AND ep.delete_flag = '0'
|
||||
ORDER BY ep.practitioner_id
|
||||
LIMIT 1) AS responsibleDoctor,
|
||||
-- 获取责任护士(使用子查询确保只返回一个值)
|
||||
(SELECT p."name"
|
||||
FROM adm_encounter_participant ep
|
||||
LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0'
|
||||
WHERE ep.encounter_id = T2.id
|
||||
AND ep.type_code = '2'
|
||||
AND ep.delete_flag = '0'
|
||||
ORDER BY ep.practitioner_id
|
||||
LIMIT 1) AS responsibleNurse,
|
||||
T6.type_code, -- 费别
|
||||
T7.status_enum AS surgeryStatusEnum, -- 手术状态
|
||||
T8.start_time AS surgeryStartTime, -- 手术开始时间
|
||||
T8.end_time AS surgeryEndTime, -- 手术结束时间
|
||||
T9.id AS encounterLocationId, -- 就诊位置ID
|
||||
T9.location_id, -- 床位号
|
||||
T11."name" AS caty, -- 入院科室
|
||||
T12."name" AS mainDiagnosis -- 主要诊断
|
||||
FROM adm_patient AS T1
|
||||
INNER JOIN adm_encounter T2 -- 改为INNER JOIN确保患者有就诊记录
|
||||
ON T1.id = T2.patient_id -- 患者ID
|
||||
AND T2.delete_flag = '0'
|
||||
AND T2.class_enum = '1' -- 仅选择住院患者
|
||||
LEFT JOIN adm_encounter_diagnosis T5
|
||||
ON T2.id = T5.encounter_id -- 就诊ID
|
||||
AND T5.maindise_flag = 1
|
||||
AND T5.delete_flag = '0'
|
||||
LEFT JOIN adm_account T6
|
||||
ON T2.id = T6.encounter_id -- 就诊ID
|
||||
AND T6.delete_flag = '0'
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
patient_id,
|
||||
status_enum,
|
||||
id,
|
||||
request_id,
|
||||
ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY id DESC) as rn
|
||||
FROM cli_procedure
|
||||
WHERE delete_flag = '0'
|
||||
) T7 ON T1.id = T7.patient_id AND T7.rn = 1
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
procedure_id,
|
||||
start_time,
|
||||
end_time,
|
||||
ROW_NUMBER() OVER (PARTITION BY procedure_id ORDER BY id DESC) as rn
|
||||
FROM cli_procedure_performer
|
||||
WHERE delete_flag = '0'
|
||||
) T8 ON T7.id = T8.procedure_id AND T8.rn = 1
|
||||
LEFT JOIN adm_encounter_location T9
|
||||
ON T2.id = T9.encounter_id -- 就诊ID
|
||||
AND T9.form_enum = 8
|
||||
AND T9.delete_flag = '0'
|
||||
LEFT JOIN adm_organization T11
|
||||
ON T2.organization_id = T11.id
|
||||
AND T11.type_enum = 2
|
||||
AND T11.delete_flag = '0'
|
||||
LEFT JOIN cli_condition_definition T12
|
||||
ON T5.condition_id = T12.id
|
||||
AND T12.delete_flag = '0'
|
||||
WHERE T1.delete_flag = '0'
|
||||
-- 患者ID
|
||||
<if test="patientId != null">
|
||||
AND T1.id = #{patientId}
|
||||
</if>
|
||||
|
||||
-- 在科
|
||||
<if test="statusEnum == 1">
|
||||
AND T9.status_enum = 2
|
||||
</if>
|
||||
-- 在科
|
||||
<if test="statusEnum == 1">
|
||||
AND T9.status_enum = 2
|
||||
</if>
|
||||
|
||||
-- 待出院
|
||||
<if test="statusEnum == 3">
|
||||
AND T2.status_enum = 4
|
||||
</if>
|
||||
-- 待出院
|
||||
<if test="statusEnum == 3">
|
||||
AND T2.status_enum = 4
|
||||
</if>
|
||||
|
||||
-- 危重
|
||||
<if test="statusEnum == 4">
|
||||
AND T2.priority_enum = 1
|
||||
</if>
|
||||
-- 危重
|
||||
<if test="statusEnum == 4">
|
||||
AND T2.priority_enum = 1
|
||||
</if>
|
||||
|
||||
-- 手术
|
||||
<if test="statusEnum == 5">
|
||||
AND T14.type_code = '3'
|
||||
</if>
|
||||
|
||||
-- 欠费
|
||||
<if test="statusEnum == 6">
|
||||
AND T6.balance_amount < 0
|
||||
</if>
|
||||
|
||||
-- 已出院
|
||||
<if test="statusEnum == 7">
|
||||
AND T2.status_enum = 5
|
||||
</if>
|
||||
|
||||
<if test="searchKey != null and searchKey != ''">
|
||||
AND (
|
||||
-- 住院号
|
||||
T2.bus_no = #{searchKey}
|
||||
-- 患者姓名
|
||||
OR T1.name like concat('%', #{searchKey}, '%')
|
||||
-- 责任医生
|
||||
OR Doctor.name like concat('%', #{searchKey}, '%')
|
||||
-- 责任护士
|
||||
OR Nurse.name like concat('%', #{searchKey}, '%')
|
||||
-- 手术
|
||||
<if test="statusEnum == 5">
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM wor_service_request_detail wsrd
|
||||
INNER JOIN wor_service_request wsr ON wsrd.service_req_id = wsr.id
|
||||
WHERE wsr.encounter_id = T2.id
|
||||
AND wsrd.type_code = '3'
|
||||
AND wsr.delete_flag = '0'
|
||||
AND wsrd.delete_flag = '0'
|
||||
)
|
||||
</if>
|
||||
</where>
|
||||
</if>
|
||||
|
||||
ORDER BY T9.location_id ASC
|
||||
-- 欠费
|
||||
<if test="statusEnum == 6">
|
||||
AND T6.balance_amount < 0
|
||||
</if>
|
||||
|
||||
-- 已出院
|
||||
<if test="statusEnum == 7">
|
||||
AND T2.status_enum = 5
|
||||
</if>
|
||||
|
||||
<if test="searchKey != null and searchKey != ''">
|
||||
AND (
|
||||
-- 住院号
|
||||
T2.bus_no = #{searchKey}
|
||||
-- 患者姓名
|
||||
OR T1.name like concat('%', #{searchKey}, '%')
|
||||
-- 责任医生(在子查询中处理)
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM adm_encounter_participant ep
|
||||
LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0'
|
||||
WHERE ep.encounter_id = T2.id
|
||||
AND ep.type_code = '9'
|
||||
AND ep.delete_flag = '0'
|
||||
AND p."name" like concat('%', #{searchKey}, '%')
|
||||
)
|
||||
-- 责任护士(在子查询中处理)
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM adm_encounter_participant ep
|
||||
LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0'
|
||||
WHERE ep.encounter_id = T2.id
|
||||
AND ep.type_code = '2'
|
||||
AND ep.delete_flag = '0'
|
||||
AND p."name" like concat('%', #{searchKey}, '%')
|
||||
)
|
||||
)
|
||||
</if>
|
||||
) patient_base
|
||||
) ranked_result
|
||||
WHERE rn = 1
|
||||
ORDER BY location_id ASC
|
||||
</select>
|
||||
|
||||
<!-- 科室空床查询-->
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
AND T6.delete_flag = '0'
|
||||
LEFT JOIN wor_service_request T7
|
||||
ON T1.encounter_id = T7.encounter_id
|
||||
AND T5.base_service_req_id = T7.id
|
||||
AND T5.request_id = T7.id
|
||||
AND T7.delete_flag = '0'
|
||||
LEFT JOIN wor_service_request_detail T8
|
||||
ON T7.id = T8.service_req_id
|
||||
|
||||
Reference in New Issue
Block a user