From a797b5801af481990e40c029221c55229291eae8 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期三, 30 九月 2026 19:31:06 +0800
Subject: [PATCH] feat: 考勤节假日配置改为时间段、物料列表排序优化

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java |   43 ++++++++++++++++++++++++++-----------------
 1 files changed, 26 insertions(+), 17 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..d894d4c 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,9 +32,10 @@
 
     @Override
     public Long createAttendanceHoliday(HrmAttendanceHolidaySaveReqVO createReqVO) {
-        // 鏍¢獙鏃ユ湡鏄惁宸插瓨鍦ㄩ厤缃�
-        validateAttendanceHolidayDateExists(createReqVO.getDate());
+        validateDateRange(createReqVO);
+        validateDateRangeNoOverlap(createReqVO.getStartDate(), createReqVO.getEndDate(), null);
         HrmAttendanceHolidayDO attendanceHoliday = BeanUtils.toBean(createReqVO, HrmAttendanceHolidayDO.class);
+        attendanceHoliday.setDate(createReqVO.getStartDate());
         if (attendanceHoliday.getIsLegal() == null) {
             attendanceHoliday.setIsLegal(0);
         }
@@ -45,12 +46,10 @@
     @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());
         attendanceHolidayMapper.updateById(updateObj);
     }
 
@@ -62,13 +61,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 +93,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