fix(mapper): 修复患者主信息查询的重复数据问题
- 在 getRegPatientMainInfo 查询中添加 DISTINCT ON 子句按 patient_id 去重
- 为分页功能添加 getRegPatientMainInfoCount 计数查询
- 修复 SQL 拼接条件的语法错误,将 ${ew.customSqlSegment} 替换为标准的动态 SQL 标签
- 调整字典标签查询逻辑,先查询指定表再回退到默认字典缓存
- 优化查询性能,避免不必要的数据重复和错误的 SQL 语法
- 添加缺失的 ORDER BY 子句确保查询结果的一致性
This commit is contained in:
@@ -5,7 +5,8 @@
|
|||||||
<mapper namespace="com.openhis.web.regdoctorstation.mapper.AdviceManageAppMapper">
|
<mapper namespace="com.openhis.web.regdoctorstation.mapper.AdviceManageAppMapper">
|
||||||
|
|
||||||
<select id="getRegPatientMainInfo" resultType="com.openhis.web.regdoctorstation.dto.RegPatientMainInfoDto">
|
<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.encounter_id,
|
||||||
rpmi.status_enum,
|
rpmi.status_enum,
|
||||||
rpmi.bus_no,
|
rpmi.bus_no,
|
||||||
@@ -26,7 +27,7 @@
|
|||||||
rpmi.contract_name,
|
rpmi.contract_name,
|
||||||
rpmi.reg_diagnosis_name,
|
rpmi.reg_diagnosis_name,
|
||||||
rpmi.account_id
|
rpmi.account_id
|
||||||
from (SELECT ae.tenant_id,
|
FROM (SELECT ae.tenant_id,
|
||||||
ae.ID AS encounter_id,
|
ae.ID AS encounter_id,
|
||||||
ae.status_enum AS status_enum,
|
ae.status_enum AS status_enum,
|
||||||
ae.bus_no AS bus_no,
|
ae.bus_no AS bus_no,
|
||||||
@@ -94,7 +95,90 @@
|
|||||||
AND practitioner_id = #{practitionerId}
|
AND practitioner_id = #{practitionerId}
|
||||||
AND org_id = ae.organization_id
|
AND org_id = ae.organization_id
|
||||||
)) AS rpmi
|
)) 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>
|
||||||
|
|
||||||
<select id="getRegRequestBaseInfo" resultType="com.openhis.web.regdoctorstation.dto.RegRequestBaseDto">
|
<select id="getRegRequestBaseInfo" resultType="com.openhis.web.regdoctorstation.dto.RegRequestBaseDto">
|
||||||
@@ -275,7 +359,9 @@
|
|||||||
WHERE aa.type_code = #{personalCashAccount}
|
WHERE aa.type_code = #{personalCashAccount}
|
||||||
AND aa.delete_flag = '0'
|
AND aa.delete_flag = '0'
|
||||||
GROUP BY aa.tenant_id, aa.id, aa.insutype, aa.encounter_id, aa.balance_amount) AS final_res
|
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>
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
@@ -117,10 +117,7 @@ public class DictAspect {
|
|||||||
|
|
||||||
private String queryDictLabel(String dictTable, String dictCode, String dictText, String dictValue) {
|
private String queryDictLabel(String dictTable, String dictCode, String dictText, String dictValue) {
|
||||||
if (StringUtils.hasText(dictTable)) {
|
if (StringUtils.hasText(dictTable)) {
|
||||||
// 场景 1:默认字典走DictUtils缓存
|
// 场景 1:查询指定表
|
||||||
return DictUtils.getDictLabel(dictCode, dictValue);
|
|
||||||
} else {
|
|
||||||
// 场景 2:查询指定表
|
|
||||||
String sql = String.format("SELECT %s FROM %s WHERE %s::varchar = ? LIMIT 1", dictText, dictTable, dictCode);
|
String sql = String.format("SELECT %s FROM %s WHERE %s::varchar = ? LIMIT 1", dictText, dictTable, dictCode);
|
||||||
try {
|
try {
|
||||||
return jdbcTemplate.queryForObject(sql, String.class, dictValue);
|
return jdbcTemplate.queryForObject(sql, String.class, dictValue);
|
||||||
@@ -128,6 +125,9 @@ public class DictAspect {
|
|||||||
// 如果查询结果为空,返回 空字符串
|
// 如果查询结果为空,返回 空字符串
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// 场景 2:默认字典走DictUtils缓存
|
||||||
|
return DictUtils.getDictLabel(dictCode, dictValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user