fix(surgical): 修复手术安排冲突检测逻辑

- 添加了对重复手术安排校验的注释说明,确保执行顺序正确
- 修复了手术室占用检测的时间范围判断条件
- 增加了对空值的安全检查避免潜在异常
- 在SQL查询中添加了删除标记过滤条件
- 统一了变量命名提高代码可读性
This commit is contained in:
2026-03-25 16:27:58 +08:00
parent c2fa13de82
commit 979dc0a34c
2 changed files with 15 additions and 11 deletions

View File

@@ -95,7 +95,7 @@ public class SurgicalScheduleAppServiceImpl implements ISurgicalScheduleAppServi
}
}
// 校验是否重复手术安排
// 校验是否重复手术安排(必须在校验手术间占用之前执行,确保能正确返回重复错误)
// 同一患者 + 同一手术单号 + 同一手术名称 只能有一条有效安排记录
if (opCreateScheduleDto.getPatientId() != null
&& opCreateScheduleDto.getOperCode() != null && !opCreateScheduleDto.getOperCode().isEmpty()
@@ -105,19 +105,21 @@ public class SurgicalScheduleAppServiceImpl implements ISurgicalScheduleAppServi
opCreateScheduleDto.getOperCode(),
opCreateScheduleDto.getOperName()
);
if (existsDuplicate) {
if (existsDuplicate != null && existsDuplicate) {
return R.fail("该患者此手术单号已存在手术安排,请勿重复提交");
}
}
//校验该时段内手术间是否被占用
LocalDateTime scheduleDate = opCreateScheduleDto.getEntryTime();//入室时间
String roomCode = opCreateScheduleDto.getRoomCode();//手术室编号
// 校验该时段内手术间是否被占用
LocalDateTime startTime = opCreateScheduleDto.getEntryTime();//入室时间
LocalDateTime endTime = opCreateScheduleDto.getEndTime();//手术结束时间
Boolean scheduleConflict = surgicalScheduleAppMapper.isScheduleConflict(scheduleDate, endTime, roomCode);
if (scheduleConflict) {
String roomCode = opCreateScheduleDto.getRoomCode();//手术室编号
if (startTime != null && endTime != null && roomCode != null && !roomCode.isEmpty()) {
Boolean scheduleConflict = surgicalScheduleAppMapper.isScheduleConflict(startTime, endTime, roomCode);
if (scheduleConflict != null && scheduleConflict) {
return R.fail("该时段内手术间被占用");
}
}
LoginUser loginUser = new LoginUser();
//获取当前登录用户信息

View File

@@ -140,9 +140,11 @@
</select>
<!-- 查询时间段内该手术室是否被占用-->
<select id="isScheduleConflict" resultType="java.lang.Boolean">
SELECT COUNT(*) > 0 FROM op_schedule WHERE room_code = #{surgeryRoomId}
AND entry_time >= #{startTime}
AND end_time &lt; #{endTime}
SELECT COUNT(*) > 0 FROM op_schedule
WHERE room_code = #{surgeryRoomId}
AND entry_time &lt;= #{endTime}
AND end_time >= #{startTime}
AND delete_flag = '0'
</select>
<!-- 检查是否存在重复的手术安排 -->