fix(mapper): 修复患者主信息查询的重复数据问题

- 在 getRegPatientMainInfo 查询中添加 DISTINCT ON 子句按 patient_id 去重
- 为分页功能添加 getRegPatientMainInfoCount 计数查询
- 修复 SQL 拼接条件的语法错误,将 ${ew.customSqlSegment} 替换为标准的动态 SQL 标签
- 调整字典标签查询逻辑,先查询指定表再回退到默认字典缓存
- 优化查询性能,避免不必要的数据重复和错误的 SQL 语法
- 添加缺失的 ORDER BY 子句确保查询结果的一致性
This commit is contained in:
2026-01-21 16:22:05 +08:00
parent fc9ce6241e
commit a0b546266d
2 changed files with 94 additions and 8 deletions

View File

@@ -5,7 +5,8 @@
<mapper namespace="com.openhis.web.regdoctorstation.mapper.AdviceManageAppMapper">
<select id="getRegPatientMainInfo" resultType="com.openhis.web.regdoctorstation.dto.RegPatientMainInfoDto">
SELECT rpmi.tenant_id,
SELECT DISTINCT ON (rpmi.patient_id)
rpmi.tenant_id,
rpmi.encounter_id,
rpmi.status_enum,
rpmi.bus_no,
@@ -26,7 +27,7 @@
rpmi.contract_name,
rpmi.reg_diagnosis_name,
rpmi.account_id
from (SELECT ae.tenant_id,
FROM (SELECT ae.tenant_id,
ae.ID AS encounter_id,
ae.status_enum AS status_enum,
ae.bus_no AS bus_no,
@@ -94,7 +95,90 @@
AND practitioner_id = #{practitionerId}
AND org_id = ae.organization_id
)) AS rpmi
${ew.customSqlSegment}
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
WHERE ${ew.sqlSegment}
</if>
ORDER BY rpmi.patient_id, rpmi.encounter_id DESC
</select>
<!-- 用于分页的COUNT查询与主查询保持一致的去重逻辑 -->
<select id="getRegPatientMainInfoCount" resultType="java.lang.Long">
SELECT COUNT(*) FROM (
SELECT DISTINCT ON (rpmi.patient_id)
rpmi.patient_id
FROM (SELECT ae.tenant_id,
ae.ID AS encounter_id,
ae.status_enum AS status_enum,
ae.bus_no AS bus_no,
ae.start_time AS in_hospital_time,
(EXTRACT(DAY FROM (CURRENT_DATE - ae.start_time)) :: INTEGER + 1) AS in_hospital_days,
ae.end_time AS out_hospital_time,
ap.ID AS patient_id,
ap.NAME AS patient_name,
ap.gender_enum AS gender_enum,
ap.birth_date AS birth_date,
alw.NAME AS ward_name,
alh.NAME AS house_name,
alb.NAME AS bed_name,
aelb.start_time AS in_org_time,
ao.id AS in_hospital_org_id,
ao.NAME AS in_hospital_org_name,
aa.id AS account_id,
aa.contract_no AS contract_no,
fc.contract_name AS contract_name,
ccd.NAME AS reg_diagnosis_name
FROM adm_encounter AS ae
LEFT JOIN adm_patient AS ap ON ap.ID = ae.patient_id
AND ap.delete_flag = '0'
LEFT JOIN adm_organization AS ao ON ao.ID = ae.organization_id
AND ao.delete_flag = '0'
LEFT JOIN adm_encounter_location AS aelw ON aelw.encounter_id = ae.ID
AND aelw.delete_flag = '0'
AND aelw.form_enum = #{wardEnum}
AND aelw.status_enum = #{encounterActivityStatus}
LEFT JOIN adm_location AS alw ON alw.ID = aelw.location_id
AND alw.delete_flag = '0'
LEFT JOIN adm_encounter_location AS aelh ON aelh.encounter_id = ae.ID
AND aelh.delete_flag = '0'
AND aelh.form_enum = #{houseEnum}
AND aelh.status_enum = #{encounterActivityStatus}
LEFT JOIN adm_location AS alh ON alh.ID = aelh.location_id
AND alh.delete_flag = '0'
LEFT JOIN adm_encounter_location AS aelb ON aelb.encounter_id = ae.ID
AND aelb.delete_flag = '0'
AND aelb.form_enum = #{bedEnum}
AND aelb.status_enum = #{encounterActivityStatus}
LEFT JOIN adm_location AS alb ON alb.ID = aelb.location_id
AND alb.delete_flag = '0'
INNER JOIN adm_account AS aa ON aa.encounter_id = ae.ID
AND aa.delete_flag = '0'
AND aa.encounter_flag = 1
LEFT JOIN fin_contract AS fc ON fc.bus_no = aa.contract_no
AND fc.delete_flag = '0'
LEFT JOIN adm_encounter_diagnosis AS aed ON aed.encounter_id = ae.ID
AND aed.delete_flag = '0'
AND aed.maindise_flag = #{maindiseFlag}
LEFT JOIN cli_condition AS cc ON cc.ID = aed.condition_id
AND cc.delete_flag = '0'
LEFT JOIN cli_condition_definition AS ccd ON ccd.ID = cc.definition_id
AND ccd.delete_flag = '0'
WHERE ae.delete_flag = '0'
AND ae.class_enum = #{classEnum}
AND ae.status_enum != #{toBeRegistered}
AND ae.status_enum != #{alreadySettled}
AND ae.status_enum != #{registered}
AND EXISTS(
SELECT 1
FROM adm_practitioner_role
WHERE delete_flag = '0'
AND practitioner_id = #{practitionerId}
AND org_id = ae.organization_id
)) AS rpmi
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
WHERE ${ew.sqlSegment}
</if>
ORDER BY rpmi.patient_id, rpmi.encounter_id DESC
) AS distinct_patients
</select>
<select id="getRegRequestBaseInfo" resultType="com.openhis.web.regdoctorstation.dto.RegRequestBaseDto">
@@ -275,7 +359,9 @@
WHERE aa.type_code = #{personalCashAccount}
AND aa.delete_flag = '0'
GROUP BY aa.tenant_id, aa.id, aa.insutype, aa.encounter_id, aa.balance_amount) AS final_res
${ew.customSqlSegment}
<if test="ew != null and ew.sqlSegment != null and ew.sqlSegment != ''">
WHERE ${ew.sqlSegment}
</if>
</select>
</mapper>

View File

@@ -117,10 +117,7 @@ public class DictAspect {
private String queryDictLabel(String dictTable, String dictCode, String dictText, String dictValue) {
if (StringUtils.hasText(dictTable)) {
// 场景 1默认字典走DictUtils缓存
return DictUtils.getDictLabel(dictCode, dictValue);
} else {
// 场景 2查询指定表
// 场景 1查询指定表
String sql = String.format("SELECT %s FROM %s WHERE %s::varchar = ? LIMIT 1", dictText, dictTable, dictCode);
try {
return jdbcTemplate.queryForObject(sql, String.class, dictValue);
@@ -128,6 +125,9 @@ public class DictAspect {
// 如果查询结果为空,返回 空字符串
return "";
}
} else {
// 场景 2默认字典走DictUtils缓存
return DictUtils.getDictLabel(dictCode, dictValue);
}
}
}