package cn.iocoder.yudao.module.hrm.service.attendance; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayPageReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidaySaveReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceHolidayDO; import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceHolidayMapper; import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceHolidayTypeEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.time.DayOfWeek; import java.time.LocalDate; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; /** * 考勤节假日配置 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class HrmAttendanceHolidayServiceImpl implements HrmAttendanceHolidayService { @Resource private HrmAttendanceHolidayMapper attendanceHolidayMapper; @Override public Long createAttendanceHoliday(HrmAttendanceHolidaySaveReqVO createReqVO) { 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); } attendanceHolidayMapper.insert(attendanceHoliday); return attendanceHoliday.getId(); } @Override public void updateAttendanceHoliday(HrmAttendanceHolidaySaveReqVO updateReqVO) { validateAttendanceHolidayExists(updateReqVO.getId()); validateDateRange(updateReqVO); validateDateRangeNoOverlap(updateReqVO.getStartDate(), updateReqVO.getEndDate(), updateReqVO.getId()); HrmAttendanceHolidayDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceHolidayDO.class); updateObj.setDate(updateReqVO.getStartDate()); attendanceHolidayMapper.updateById(updateObj); } @Override public void deleteAttendanceHoliday(Long id) { validateAttendanceHolidayExists(id); attendanceHolidayMapper.deleteById(id); } private void validateAttendanceHolidayExists(Long id) { if (attendanceHolidayMapper.selectById(id) == null) { throw exception(ATTENDANCE_HOLIDAY_NOT_EXISTS, id); } } 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()); } } @Override public HrmAttendanceHolidayDO getAttendanceHoliday(Long id) { return attendanceHolidayMapper.selectById(id); } @Override public PageResult getAttendanceHolidayPage(HrmAttendanceHolidayPageReqVO pageReqVO) { return attendanceHolidayMapper.selectPage(pageReqVO); } @Override public List getAttendanceHolidayListByDateRange(LocalDate startDate, LocalDate endDate) { return attendanceHolidayMapper.selectListByDateRange(startDate, endDate); } @Override public boolean isWorkDay(LocalDate date) { // 1. 查询覆盖该日期的节假日配置(配置时间段不允许重叠,至多命中一条) List holidays = attendanceHolidayMapper.selectListByDateRange(date, date); if (!holidays.isEmpty()) { // 有配置时,按配置判断 return HrmAttendanceHolidayTypeEnum.WORK_DAY.getType().equals(holidays.get(0).getType()); } // 2. 无配置时,按周末判断 DayOfWeek dayOfWeek = date.getDayOfWeek(); return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY; } }