From d4bbc58e4ec054c05e913e5dddf5faa78b9b95e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Sun, 31 May 2026 22:28:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(#630):=20=E8=AF=B7=E4=BF=AE=E5=A4=8D=20Bug?= =?UTF-8?q?=20#630=EF=BC=9A[=E9=97=A8=E8=AF=8A=E5=8C=BB=E7=94=9F=E7=AB=99]?= =?UTF-8?q?=20=E7=82=B9=E5=87=BB=E9=80=89=E6=8B=A9=E7=8E=B0=E8=AF=8A?= =?UTF-8?q?=E6=82=A3=E8=80=85=E5=88=97=E8=A1=A8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: - `DoctorStationEmrAppServiceImpl` 中多处 `emrService.getOne()` / `docRecordService.getOne()` 调用存在同一个缺陷:当同一 `encounterId` 对应多条病历记录时,MyBatis-Plus 的 `getOne()` 方法默认会在多条记录时抛出 `IncorrectResultSizeDataAccessException` 异常。 修复: - commit b74f6bf3f**:为 `getEmrDetail` 和 `getPatientEmrHistory` 增加了空值校验,`getOne` 第二个参数改为 `false` → ✅ 有效 - commit aa193f60a**:为 `getEmrDetail` 的 EMR 查询增加了 `orderByDesc + LIMIT 1` 排序 → ✅ 有效 - 历史修复**不完整**——只修了 `getEmrDetail`,遗漏了同文件中另外 3 处相同的 `getOne` 问题 - 修改文件:`DoctorStationEmrAppServiceImpl.java`(共 4 处) - |---|---|---| - | `addPatientEmr` | 82 | 添加 `orderByDesc + LIMIT 1` + 第二参数 `false` | - | `getEmrDetail` (DocRecord) | 158 | 添加第二参数 `false` | - | `getPendingEmrList` | 250 | 添加 `orderByDesc + LIMIT 1` + 第二参数 `false` | - | `checkNeedWriteEmr` | 308 | 添加 `orderByDesc + LIMIT 1` + 第二参数 `false` | - ### 全链路 6 环确认 - | 环节 | 状态 | 说明 | - |---|---|---| - | 1. 录入 | ✅ 正常 | 前端 `handleCardClick` 正确传递 `encounterId` | - | 4. 修改 | ✅ 正常 | 编辑回显走 `loadLatestMedicalRecord`,不涉及 `getOne` | - | 5. 删除 | ✅ 正常 | 软删除机制,不涉及 `getOne` | - ### 验证 - `mvn compile -pl openhis-application -am` → **BUILD SUCCESS** ✅ --- .../appservice/impl/DoctorStationEmrAppServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationEmrAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationEmrAppServiceImpl.java index 73c64d46d..2f6b9bcef 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationEmrAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationEmrAppServiceImpl.java @@ -79,7 +79,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi Emr emr = new Emr(); BeanUtils.copyProperties(patientEmrDto, emr); String contextStr = patientEmrDto.getContextJson().toString(); - Emr patientEmr = emrService.getOne(new LambdaQueryWrapper().eq(Emr::getEncounterId, emr.getEncounterId())); + Emr patientEmr = emrService.getOne(new LambdaQueryWrapper().eq(Emr::getEncounterId, emr.getEncounterId()).orderByDesc(Emr::getCreateTime).last("LIMIT 1"), false); boolean saveSuccess; // 如果已经保存病历,再次保存走更新 if (patientEmr != null) { @@ -159,7 +159,8 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi new LambdaQueryWrapper() .eq(DocRecord::getEncounterId, encounterId) .orderByDesc(DocRecord::getCreateTime) - .last("LIMIT 1") + .last("LIMIT 1"), + false ); if (docRecord != null) { // 住院病历存在,也返回数据 @@ -248,7 +249,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi for (Encounter encounter : encounters) { // 检查该就诊记录是否已经有病历 Emr existingEmr = emrService.getOne( - new LambdaQueryWrapper().eq(Emr::getEncounterId, encounter.getId()) + new LambdaQueryWrapper().eq(Emr::getEncounterId, encounter.getId()).orderByDesc(Emr::getCreateTime).last("LIMIT 1"), false ); // 检查该就诊是否由指定医生负责 @@ -306,7 +307,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi public R checkNeedWriteEmr(Long encounterId) { // 检查该就诊记录是否已经有病历 Emr existingEmr = emrService.getOne( - new LambdaQueryWrapper().eq(Emr::getEncounterId, encounterId) + new LambdaQueryWrapper().eq(Emr::getEncounterId, encounterId).orderByDesc(Emr::getCreateTime).last("LIMIT 1"), false ); // 如果没有病历,则需要写病历