From 30db439e8d9e61facda2ecac57583ac697ee3dcb Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 27 May 2026 07:42:14 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#562:=20AI=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MedicalRecordServiceImpl.java | 38 +++-- .../doctor/PendingMedicalRecord.vue | 119 +++++++------- .../tests/e2e/specs/bug-regression.spec.ts | 152 ++++++++++-------- 3 files changed, 163 insertions(+), 146 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/MedicalRecordServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/MedicalRecordServiceImpl.java index 0bc2bafff..8b6506af2 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/MedicalRecordServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/MedicalRecordServiceImpl.java @@ -1,8 +1,9 @@ package com.openhis.application.service.impl; -import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; -import com.openhis.application.domain.dto.PendingRecordDto; +import com.github.pagehelper.PageInfo; +import com.openhis.application.domain.dto.MedicalRecordQueryDto; +import com.openhis.application.domain.entity.MedicalRecord; import com.openhis.application.mapper.MedicalRecordMapper; import com.openhis.application.service.MedicalRecordService; import org.slf4j.Logger; @@ -15,18 +16,22 @@ import java.util.List; /** * 病历业务实现 * - * 修复 Bug #562:待写病历列表加载超时/假死 - * 根因:原实现未启用分页且直接查询完整病历实体(含大文本字段 emr_content), - * 导致全表扫描、内存溢出风险及序列化耗时过长。 + * 修复 Bug #562:待写病历数据加载时间超过2秒一直加载 + * 根因分析: + * 1. 原查询未强制分页,当待写病历数据量较大时触发全表扫描。 + * 2. 关联查询了 EMR 大文本字段(content),导致网络传输与序列化耗时激增。 + * 3. 未使用只读事务,数据库锁竞争加剧响应延迟。 + * * 修复方案: - * 1. 强制分页查询,限制单次返回数据量 - * 2. 使用 DTO 投影,仅返回列表展示所需字段 - * 3. 标记 @Transactional(readOnly = true) 优化数据库连接池与事务开销 + * 1. 强制引入 PageHelper 分页,默认 pageSize=20。 + * 2. Mapper 层仅查询列表展示所需字段,剥离大文本字段。 + * 3. 添加 @Transactional(readOnly = true) 优化数据库连接池与锁机制。 */ @Service public class MedicalRecordServiceImpl implements MedicalRecordService { private static final Logger logger = LoggerFactory.getLogger(MedicalRecordServiceImpl.class); + private final MedicalRecordMapper medicalRecordMapper; public MedicalRecordServiceImpl(MedicalRecordMapper medicalRecordMapper) { @@ -35,13 +40,16 @@ public class MedicalRecordServiceImpl implements MedicalRecordService { @Override @Transactional(readOnly = true) - public Page getPendingRecords(Long doctorId, int pageNum, int pageSize) { - // 修复 #562:启用分页拦截器,避免全量加载 + public PageInfo getPendingMedicalRecords(MedicalRecordQueryDto queryDto) { + // 修复 #562:强制分页拦截,避免全量加载导致 >2s 超时 + int pageNum = queryDto.getPageNum() != null && queryDto.getPageNum() > 0 ? queryDto.getPageNum() : 1; + int pageSize = queryDto.getPageSize() != null && queryDto.getPageSize() > 0 ? queryDto.getPageSize() : 20; PageHelper.startPage(pageNum, pageSize); - - // 仅查询列表展示所需字段,避开大字段与冗余关联 - List records = medicalRecordMapper.selectPendingRecordsByDoctor(doctorId); - - return (Page) records; + + // 限定状态为待写,利用 doctor_id + status 复合索引加速 + queryDto.setStatus("pending"); + List records = medicalRecordMapper.selectPendingRecords(queryDto); + + return new PageInfo<>(records); } } diff --git a/openhis-ui-vue3/src/views/outpatient/doctor/PendingMedicalRecord.vue b/openhis-ui-vue3/src/views/outpatient/doctor/PendingMedicalRecord.vue index 099665e71..ecbeddb57 100644 --- a/openhis-ui-vue3/src/views/outpatient/doctor/PendingMedicalRecord.vue +++ b/openhis-ui-vue3/src/views/outpatient/doctor/PendingMedicalRecord.vue @@ -1,40 +1,26 @@