From a41222286f642d1aebe2355ab2f8cdc36dddc3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=8E=E4=BD=97?= Date: Fri, 12 Jun 2026 17:47:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(#763):=20=E8=AF=B7=E4=BF=AE=E5=A4=8D=20Bug?= =?UTF-8?q?=20#763?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: - ### 逐项评估 - 设计质量: 4/5** - 将 NULL 视为"无截止时间"的语义正确:临时医嘱无 deadline 限制,不应被 deadline 过滤排除 - 唯一扣分:可考虑加一行注释说明"NULL end_time 表示临时医嘱无截止时间"以辅助后续维护 - 工艺性: 4/5** - NULL 安全写法在 MyBatis-Plus 中生成 `(end_time <= ? OR end_time IS NULL)`,SQL 语义正确 - 边界条件:`deadline != null && !deadline.isEmpty()` 的前置守卫已存在,不会 NPE - 异常处理:`DateTimeParseException` 被 catch 并忽略,符合原有设计意图 - 与同文件第 216 行 `therapyEnum` 的 NULL 安全处理完全一致,模式复用 - 功能性: 5/5** - `end_time IS NULL` 的临时医嘱不再被排除 - 不影响长期医嘱:`end_time <= deadline` 的筛选仍然生效 - 无副作用:仅影响 `selectInpatientAdvicePage` 这一个查询路径 - 风格一致性: 5/5** - 与第 216 行 `queryWrapper.and(w -> w.eq("therapy_enum", therapyEnum).or().isNull("therapy_enum"))` 完全一致 - 缩进、变量命名、Lambda 风格均与周围代码匹配 - 未修改任何方法签名、未引入新依赖 - ### 评分 - | 维度 | 分数 | - |------|------| - | 设计质量 | 4 | - | 工艺性 | 4 | - | 功能性 | 5 | - | 风格一致性 | 5 | - | **总分** | **18/20** | - ### 改进建议(非阻塞) - 1. 考虑在 `le(...).or().isNull(...)` 上方加一行注释,说明 NULL end_time 的业务语义,方便后续维护者理解 - 2. 建议补充集成测试用例覆盖"临时医嘱(end_time=NULL)+ deadline 过滤"场景,防止回归 - ### 风险评估 - 变更范围**:仅 1 行,1 个查询方法,风险极低 - 回归影响**:不影响长期医嘱的 deadline 筛选逻辑 - 编译验证**:BUILD SUCCESS ✅ - Bug #665 引入的 `deadline` 过滤条件 `end_time <= deadline` 在 PostgreSQL 中对 `NULL` 值返回 `FALSE`,导致住院临时医嘱(`effective_dose_end` 未设置 = NULL)被排除在查询结果之外。 修复: - 将 `le` 改为 NULL 安全写法,确保 `end_time IS NULL` 的记录也能返回: - ```java - queryWrapper.le("end_time", deadlineTime); - queryWrapper.and(w -> w.le("end_time", deadlineTime).or().isNull("end_time")); - 修改文件**:`AdviceProcessAppServiceImpl.java:222` — 1 行修改 - 原理**:`end_time <= deadline OR end_time IS NULL`,临时医嘱(`effectiveDoseEnd` 为 NULL)不会被排除,同时长期医嘱的 deadline 筛选仍然生效。该模式与同文件第 216 行的 `therapyEnum` NULL 安全处理一致。 - Review --- - Build confirmed: **BUILD SUCCESS**. Now I have full context to provide the review. - Bug #763 Fix - ### Change Summary - | 项目 | 详情 | - |------|------| - | 文件 | `AdviceProcessAppServiceImpl.java:222` | - | 变更行数 | 1 行 | - | 变更前 | `queryWrapper.le("end_time", deadlineTime)` | - | 变更后 | `queryWrapper.and(w -> w.le("end_time", deadlineTime).or().isNull("end_time"))` | - PASS** — 修复精准、风格一致、编译通过,总分 18/20 且功能性 5/3。 - Test --- - ## Bug #763 测试报告 - 文件**: `AdviceProcessAppServiceImpl.java:221` — 1 行改动 - ```diff - queryWrapper.le("end_time", deadlineTime); - + queryWrapper.and(w -> w.le("end_time", deadlineTime).or().isNull("end_time")); - `(end_time <= ? OR end_time IS NULL)` — 既保留 deadline 筛选功能(Bug #665),又兼容 NULL 值。 - ### 验证结果 - | 检查项 | 结果 | - |--------|------| - | `mvn compile -pl healthlink-his-application -am -q` | ✅ 通过 (exit 0) | - | `mvn compile -DskipTests` (全量) | ✅ BUILD SUCCESS | - | 改动范围 | 1 文件 1 行,严格限定 | - | 回归检查 | `le` 条件保留,deadline 筛选仍生效 | - | Mapper XML `end_time` 别名 | ✅ `T1.effective_dose_end AS end_time` 确认 | - | 单元测试 | 无独立单元测试(集成测试需运行环境) | - VERDICT: PASS - Verify --- - Let me try compiling just the changed module to speed things up. --- .../appservice/impl/AdviceProcessAppServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java index c76b12cd0..8ba2757cd 100755 --- a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/inhospitalnursestation/appservice/impl/AdviceProcessAppServiceImpl.java @@ -219,7 +219,7 @@ public class AdviceProcessAppServiceImpl implements IAdviceProcessAppService { try { LocalDateTime deadlineTime = LocalDateTime.parse(deadline, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - queryWrapper.le("end_time", deadlineTime); + queryWrapper.and(w -> w.le("end_time", deadlineTime).or().isNull("end_time")); } catch (DateTimeParseException e) { // 忽略无效的日期格式 }