From 65203d466d5e2589911dd066771b0a8bfd7845ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Sat, 16 May 2026 12:10:10 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#401:=20=E9=97=A8=E8=AF=8A=E5=AE=8C?= =?UTF-8?q?=E8=AF=8A=E5=AE=A1=E8=AE=A1=E6=97=A5=E5=BF=97=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=9Adiv=5Flog=20=E8=A1=A8=E4=B8=AD=20pool=5Fid=20=E4=B8=8E?= =?UTF-8?q?=20slot=5Fid=20=E5=AD=98=E5=80=BC=E4=B8=8E=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E4=B8=8D=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:queueWasAlreadyCompleted 条件限制导致队列已由分诊台完诊时, 医生站完诊不写 div_log 审计日志,造成审计记录缺失。 数据库12条COMPLETE记录中6条pool_id/slot_id为NULL(50%)。 修复:移除 queueWasAlreadyCompleted 条件限制,确保每次完诊操作 都生成审计日志;保留 queueWasAlreadyCompleted 日志用于排查。 Co-Authored-By: Claude Opus 4.7 --- .../impl/DoctorStationMainAppServiceImpl.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 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 b27f2f0bb..583cf34eb 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 @@ -345,23 +345,25 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer encounterId, tenantId); } - // 写入 div_log 审计日志(独立于队列项,确保每次完诊都生成记录) - // Bug #401:使用更新前记录的原始状态判断,避免自身更新后将状态改为 COMPLETED 导致误判为"已完成" - if (!queueWasAlreadyCompleted) { - try { - LoginUser loginUser = SecurityUtils.getLoginUser(); - DivLog divLog = new DivLog() - .setPoolId(divPoolId) - .setSlotId(divSlotId) - .setOpUserId(loginUser != null ? loginUser.getUserId() : null) - .setAction("COMPLETE") - .setCreateTime(LocalDateTime.now()) - .setUpdateAt(LocalDateTime.now()) - .setCreatedAt(LocalDateTime.now()); - divLogService.save(divLog); - } catch (Exception e) { - log.error("写入div_log审计日志失败", e); + // 写入 div_log 审计日志(每次完诊都生成记录,确保审计链路完整) + // Bug #401:移除 queueWasAlreadyCompleted 条件限制,避免队列已由分诊台完诊时 + // 医生站完诊不写日志导致审计记录缺失;同时保留 queueWasAlreadyCompleted 日志用于排查 + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + DivLog divLog = new DivLog() + .setPoolId(divPoolId) + .setSlotId(divSlotId) + .setOpUserId(loginUser != null ? loginUser.getUserId() : null) + .setAction("COMPLETE") + .setCreateTime(LocalDateTime.now()) + .setUpdateAt(LocalDateTime.now()) + .setCreatedAt(LocalDateTime.now()); + divLogService.save(divLog); + if (queueWasAlreadyCompleted) { + log.info("完诊:队列项已由分诊台完诊,医生站补充写入审计日志 encounterId={}", encounterId); } + } catch (Exception e) { + log.error("写入div_log审计日志失败", e); } // 4. 更新状态、完成时间以及初复诊标识