fix(#630): 请修复 Bug #630:[门诊医生站] 点击选择现诊患者列表报错

根因:
- `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** 
This commit is contained in:
2026-05-31 22:28:33 +08:00
parent aa193f60a2
commit d4bbc58e4e

View File

@@ -79,7 +79,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi
Emr emr = new Emr(); Emr emr = new Emr();
BeanUtils.copyProperties(patientEmrDto, emr); BeanUtils.copyProperties(patientEmrDto, emr);
String contextStr = patientEmrDto.getContextJson().toString(); String contextStr = patientEmrDto.getContextJson().toString();
Emr patientEmr = emrService.getOne(new LambdaQueryWrapper<Emr>().eq(Emr::getEncounterId, emr.getEncounterId())); Emr patientEmr = emrService.getOne(new LambdaQueryWrapper<Emr>().eq(Emr::getEncounterId, emr.getEncounterId()).orderByDesc(Emr::getCreateTime).last("LIMIT 1"), false);
boolean saveSuccess; boolean saveSuccess;
// 如果已经保存病历,再次保存走更新 // 如果已经保存病历,再次保存走更新
if (patientEmr != null) { if (patientEmr != null) {
@@ -159,7 +159,8 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi
new LambdaQueryWrapper<DocRecord>() new LambdaQueryWrapper<DocRecord>()
.eq(DocRecord::getEncounterId, encounterId) .eq(DocRecord::getEncounterId, encounterId)
.orderByDesc(DocRecord::getCreateTime) .orderByDesc(DocRecord::getCreateTime)
.last("LIMIT 1") .last("LIMIT 1"),
false
); );
if (docRecord != null) { if (docRecord != null) {
// 住院病历存在,也返回数据 // 住院病历存在,也返回数据
@@ -248,7 +249,7 @@ public class DoctorStationEmrAppServiceImpl implements IDoctorStationEmrAppServi
for (Encounter encounter : encounters) { for (Encounter encounter : encounters) {
// 检查该就诊记录是否已经有病历 // 检查该就诊记录是否已经有病历
Emr existingEmr = emrService.getOne( Emr existingEmr = emrService.getOne(
new LambdaQueryWrapper<Emr>().eq(Emr::getEncounterId, encounter.getId()) new LambdaQueryWrapper<Emr>().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) { public R<?> checkNeedWriteEmr(Long encounterId) {
// 检查该就诊记录是否已经有病历 // 检查该就诊记录是否已经有病历
Emr existingEmr = emrService.getOne( Emr existingEmr = emrService.getOne(
new LambdaQueryWrapper<Emr>().eq(Emr::getEncounterId, encounterId) new LambdaQueryWrapper<Emr>().eq(Emr::getEncounterId, encounterId).orderByDesc(Emr::getCreateTime).last("LIMIT 1"), false
); );
// 如果没有病历,则需要写病历 // 如果没有病历,则需要写病历