根因:
- ### 逐项评估
- 设计质量: 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.
This commit is contained in:
@@ -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) {
|
||||
// 忽略无效的日期格式
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user