From a4a10653acb8a7f86aa8c671c4b4b75e8d961b6c Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 15:21:48 +0800
Subject: [PATCH] 修复考勤汇总生成与新增节假日报错

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java |   48 ++++++++++++++++++++++++++++--------------------
 1 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java
index 6e96e27..def4bd1 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java
@@ -21,7 +21,7 @@
 /**
  * 鑰冨嫟鑺傚亣鏃ラ厤缃� Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
@@ -32,12 +32,11 @@
 
     @Override
     public Long createAttendanceHoliday(HrmAttendanceHolidaySaveReqVO createReqVO) {
-        // 鏍¢獙鏃ユ湡鏄惁宸插瓨鍦ㄩ厤缃�
-        validateAttendanceHolidayDateExists(createReqVO.getDate());
+        validateDateRange(createReqVO);
+        validateDateRangeNoOverlap(createReqVO.getStartDate(), createReqVO.getEndDate(), null);
         HrmAttendanceHolidayDO attendanceHoliday = BeanUtils.toBean(createReqVO, HrmAttendanceHolidayDO.class);
-        if (attendanceHoliday.getIsLegal() == null) {
-            attendanceHoliday.setIsLegal(0);
-        }
+        attendanceHoliday.setDate(createReqVO.getStartDate());
+        attendanceHoliday.setIsLegal(Boolean.TRUE.equals(createReqVO.getIsLegal()) ? 1 : 0);
         attendanceHolidayMapper.insert(attendanceHoliday);
         return attendanceHoliday.getId();
     }
@@ -45,12 +44,11 @@
     @Override
     public void updateAttendanceHoliday(HrmAttendanceHolidaySaveReqVO updateReqVO) {
         validateAttendanceHolidayExists(updateReqVO.getId());
-        // 濡傛灉鏃ユ湡鍙樻洿锛屾牎楠屾柊鏃ユ湡鏄惁宸插瓨鍦ㄩ厤缃�
-        HrmAttendanceHolidayDO oldHoliday = attendanceHolidayMapper.selectById(updateReqVO.getId());
-        if (!oldHoliday.getDate().equals(updateReqVO.getDate())) {
-            validateAttendanceHolidayDateExists(updateReqVO.getDate());
-        }
+        validateDateRange(updateReqVO);
+        validateDateRangeNoOverlap(updateReqVO.getStartDate(), updateReqVO.getEndDate(), updateReqVO.getId());
         HrmAttendanceHolidayDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceHolidayDO.class);
+        updateObj.setDate(updateReqVO.getStartDate());
+        updateObj.setIsLegal(Boolean.TRUE.equals(updateReqVO.getIsLegal()) ? 1 : 0);
         attendanceHolidayMapper.updateById(updateObj);
     }
 
@@ -62,13 +60,23 @@
 
     private void validateAttendanceHolidayExists(Long id) {
         if (attendanceHolidayMapper.selectById(id) == null) {
-            throw exception(ATTENDANCE_HOLIDAY_NOT_EXISTS);
+            throw exception(ATTENDANCE_HOLIDAY_NOT_EXISTS, id);
         }
     }
 
-    private void validateAttendanceHolidayDateExists(LocalDate date) {
-        if (attendanceHolidayMapper.selectByDate(date) != null) {
-            throw exception(ATTENDANCE_HOLIDAY_DATE_EXISTS);
+    private void validateDateRange(HrmAttendanceHolidaySaveReqVO reqVO) {
+        if (reqVO.getEndDate().isBefore(reqVO.getStartDate())) {
+            throw exception(ATTENDANCE_HOLIDAY_DATE_RANGE_INVALID, reqVO.getEndDate(), reqVO.getStartDate());
+        }
+    }
+
+    private void validateDateRangeNoOverlap(LocalDate startDate, LocalDate endDate, Long excludeId) {
+        for (HrmAttendanceHolidayDO exist : attendanceHolidayMapper.selectListByDateRange(startDate, endDate)) {
+            if (excludeId != null && excludeId.equals(exist.getId())) {
+                continue;
+            }
+            throw exception(ATTENDANCE_HOLIDAY_RANGE_OVERLAP, startDate, endDate,
+                    exist.getName(), exist.getStartDate(), exist.getEndDate());
         }
     }
 
@@ -84,16 +92,16 @@
 
     @Override
     public List<HrmAttendanceHolidayDO> getAttendanceHolidayListByDateRange(LocalDate startDate, LocalDate endDate) {
-        return attendanceHolidayMapper.selectListByDateBetween(startDate, endDate);
+        return attendanceHolidayMapper.selectListByDateRange(startDate, endDate);
     }
 
     @Override
     public boolean isWorkDay(LocalDate date) {
-        // 1. 鏌ヨ鑺傚亣鏃ラ厤缃�
-        HrmAttendanceHolidayDO holiday = attendanceHolidayMapper.selectByDate(date);
-        if (holiday != null) {
+        // 1. 鏌ヨ瑕嗙洊璇ユ棩鏈熺殑鑺傚亣鏃ラ厤缃紙閰嶇疆鏃堕棿娈典笉鍏佽閲嶅彔锛岃嚦澶氬懡涓竴鏉★級
+        List<HrmAttendanceHolidayDO> holidays = attendanceHolidayMapper.selectListByDateRange(date, date);
+        if (!holidays.isEmpty()) {
             // 鏈夐厤缃椂锛屾寜閰嶇疆鍒ゆ柇
-            return HrmAttendanceHolidayTypeEnum.WORK_DAY.getType().equals(holiday.getType());
+            return HrmAttendanceHolidayTypeEnum.WORK_DAY.getType().equals(holidays.get(0).getType());
         }
         // 2. 鏃犻厤缃椂锛屾寜鍛ㄦ湯鍒ゆ柇
         DayOfWeek dayOfWeek = date.getDayOfWeek();

--
Gitblit v1.9.3