From 7cac4701b9811262335cf0aef4d1257acac73c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Sun, 10 May 2026 16:04:04 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#489:=20=E3=80=90=E5=8C=BB=E5=98=B1?= =?UTF-8?q?=E9=97=AD=E7=8E=AF=E3=80=91=E5=8C=BB=E7=94=9F=E7=AB=99=E7=AD=BE?= =?UTF-8?q?=E5=8F=91=E5=8D=95=E6=9D=A1=E9=95=BF=E6=9C=9F=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E5=8C=BB=E5=98=B1=EF=BC=8C=E6=8A=A4=E5=A3=AB=E6=A0=A1=E5=AF=B9?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=94=9F=E6=88=90=E9=87=8D=E5=A4=8D=EF=BC=88?= =?UTF-8?q?=E4=B8=A4=E6=9D=A1=EF=BC=89=E5=BE=85=E6=A0=A1=E5=AF=B9=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:selectInpatientAdvicePage 查询中,med_medication (T3) 和 med_medication_dispense (mmd) 的 LEFT JOIN 在一对多关系下产生笛卡尔积,导致单条药品医嘱返回多行重复记录。 修复方案: 1. 将 T3.total_volume 改为关联子查询,避免同一药品定义多条库存记录导致行倍增 2. 将 mmd.dispense_status 改为关联子查询,避免同一医嘱请求多条发药记录导致行倍增 3. 移除对应的 LEFT JOIN Co-Authored-By: Claude Opus 4.7 --- .../inhospitalnursestation/AdviceProcessAppMapper.xml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml index 3aa27ecb..762f36fc 100755 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/AdviceProcessAppMapper.xml @@ -169,7 +169,7 @@ T1.performer_check_id, T2."name" AS advice_name, T2.id AS item_id, - T3.total_volume AS volume, + (SELECT mm.total_volume FROM med_medication mm WHERE mm.medication_def_id = T2.id AND mm.delete_flag = '0' LIMIT 1) AS volume, T1.lot_number AS lot_number, T1.quantity AS quantity, T1.unit_code AS unit_code, @@ -199,14 +199,11 @@ personal_account.balance_amount, personal_account.id AS account_id, T2.category_code, - mmd.status_enum AS dispense_status + (SELECT mmd.status_enum FROM med_medication_dispense mmd WHERE mmd.med_req_id = T1.id AND mmd.delete_flag = '0' LIMIT 1) AS dispense_status FROM med_medication_request AS T1 LEFT JOIN med_medication_definition AS T2 ON T2.id = T1.medication_id AND T2.delete_flag = '0' - LEFT JOIN med_medication AS T3 - ON T3.medication_def_id = T2.ID - AND T3.delete_flag = '0' LEFT JOIN adm_location AS al1 ON al1.id = T1.perform_location AND al1.delete_flag = '0' @@ -280,9 +277,6 @@ aa.balance_amount ) AS personal_account ON personal_account.encounter_id = ae.id - LEFT JOIN med_medication_dispense mmd - ON mmd.med_req_id = T1.id - AND mmd.delete_flag = '0' WHERE T1.delete_flag = '0' AND T1.refund_medicine_id IS NULL AND T1.generate_source_enum = #{doctorPrescription}