From dd36dc49eac97881a98249f3de95d5b3f23db058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Wed, 13 May 2026 09:38:13 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#400:=20=E9=97=A8=E8=AF=8A=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E7=AB=99=E7=82=B9=E5=87=BB=E3=80=90=E5=AE=8C=E8=AF=8A?= =?UTF-8?q?=E3=80=91=E5=90=8E=EF=BC=8Ctriage=5Fqueue=5Fitem=20=E8=A1=A8=20?= =?UTF-8?q?status=20=E5=AD=97=E6=AE=B5=E6=9C=AA=E6=8C=89=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BA=2030?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:完诊时使用 triageQueueItemService.updateById(entity) 更新队列状态, 实体序列化过程中 status 字段为 Integer 类型但数据库列为 VARCHAR(50), 可能导致 MyBatis-Plus 的 UPDATE SQL 未正确包含 status 字段。 修复方案:改用 LambdaUpdateWrapper 直接构造 UPDATE SQL,确保 status 字段被正确更新为 30。 同时增加成功/失败日志,便于后续排查。 Co-Authored-By: Claude Opus 4.7 --- .../impl/DoctorStationMainAppServiceImpl.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java index 844daa74..b1dface1 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationMainAppServiceImpl.java @@ -319,15 +319,30 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer } } - // 如果队列项存在且未完成,更新队列状态为已完成 - // 使用排除法而非白名单:只要不是"已完成"就可以完诊,覆盖跳过、等待等非标准流转状态 - if (queueItem != null && - !TriageQueueStatus.COMPLETED.getValue().equals(queueItem.getStatus())) { - java.time.LocalDateTime nowLocal = java.time.LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); - queueItem.setStatus(TriageQueueStatus.COMPLETED.getValue()); - queueItem.setUpdateTime(nowLocal); - triageQueueItemService.updateById(queueItem); - } else if (queueItem == null) { + // 如果队列项存在,更新队列状态为已完成 + // 使用 LambdaUpdateWrapper 直接更新数据库,避免 updateById 实体序列化导致的类型映射问题 + if (queueItem != null) { + Integer targetStatus = TriageQueueStatus.COMPLETED.getValue(); + // 排除法:只要不是"已完成"就执行更新,覆盖等待、叫号中、诊中、跳过等状态 + if (!targetStatus.equals(queueItem.getStatus())) { + java.time.LocalDateTime nowLocal = java.time.LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + boolean updated = triageQueueItemService.update( + new LambdaUpdateWrapper() + .eq(TriageQueueItem::getId, queueItem.getId()) + .set(TriageQueueItem::getStatus, targetStatus) + .set(TriageQueueItem::getUpdateTime, nowLocal) + ); + if (updated) { + log.info("完诊:更新队列状态为 COMPLETED(30) 成功,queueItemId={}, encounterId={}", + queueItem.getId(), encounterId); + } else { + log.error("完诊:更新队列状态为 COMPLETED(30) 失败,queueItemId={}, encounterId={}", + queueItem.getId(), encounterId); + } + } else { + log.info("完诊:队列状态已为 COMPLETED(30),无需重复更新,queueItemId={}", queueItem.getId()); + } + } else { log.error("完诊:未找到任何 triage_queue_item 记录,encounterId={}, tenantId={}", encounterId, tenantId); }