吴羡
5 小时以前 a797b5801af481990e40c029221c55229291eae8
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceHolidayServiceImpl.java
@@ -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);
    }
@@ -66,9 +65,19 @@
        }
    }
    private void validateAttendanceHolidayDateExists(LocalDate date) {
        if (attendanceHolidayMapper.selectByDate(date) != null) {
            throw exception(ATTENDANCE_HOLIDAY_DATE_EXISTS, date);
    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();