package cn.iocoder.yudao.module.hrm.service.attendance; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; 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.HrmAttendanceHolidayImportExcelVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayImportReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayImportRespVO; 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.ArrayList; import java.util.LinkedHashMap; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 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) { // 校验日期是否已存在配置 validateAttendanceHolidayDateExists(createReqVO.getDate()); HrmAttendanceHolidayDO attendanceHoliday = BeanUtils.toBean(createReqVO, HrmAttendanceHolidayDO.class); if (attendanceHoliday.getIsLegal() == null) { attendanceHoliday.setIsLegal(0); } attendanceHolidayMapper.insert(attendanceHoliday); return attendanceHoliday.getId(); } @Override public void updateAttendanceHoliday(HrmAttendanceHolidaySaveReqVO updateReqVO) { validateAttendanceHolidayExists(updateReqVO.getId()); // 如果日期变更,校验新日期是否已存在配置 HrmAttendanceHolidayDO oldHoliday = attendanceHolidayMapper.selectById(updateReqVO.getId()); if (!oldHoliday.getDate().equals(updateReqVO.getDate())) { validateAttendanceHolidayDateExists(updateReqVO.getDate()); } HrmAttendanceHolidayDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceHolidayDO.class); 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); } } private void validateAttendanceHolidayDateExists(LocalDate date) { if (attendanceHolidayMapper.selectByDate(date) != null) { throw exception(ATTENDANCE_HOLIDAY_DATE_EXISTS); } } @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.selectListByDateBetween(startDate, endDate); } @Override public boolean isWorkDay(LocalDate date) { // 1. 查询节假日配置 HrmAttendanceHolidayDO holiday = attendanceHolidayMapper.selectByDate(date); if (holiday != null) { // 有配置时,按配置判断 return HrmAttendanceHolidayTypeEnum.WORK_DAY.getType().equals(holiday.getType()); } // 2. 无配置时,按周末判断 DayOfWeek dayOfWeek = date.getDayOfWeek(); return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY; } @Override public HrmAttendanceHolidayImportRespVO importAttendanceHolidayList( List importList, HrmAttendanceHolidayImportReqVO importReqVO) { // 1. 校验非空 importList = filterList(importList, item -> StrUtil.isNotBlank(item.getName())); if (CollUtil.isEmpty(importList)) { throw exception(ATTENDANCE_HOLIDAY_IMPORT_LIST_IS_EMPTY); } // 2. 逐条处理 HrmAttendanceHolidayImportRespVO respVO = HrmAttendanceHolidayImportRespVO.builder() .createNames(new ArrayList<>()) .updateNames(new ArrayList<>()) .failureNames(new LinkedHashMap<>()) .build(); importList.forEach(importHoliday -> { try { // 2.1 日期必填 if (importHoliday.getDate() == null) { respVO.getFailureNames().put(importHoliday.getName(), "日期不能为空"); return; } // 2.2 判断是否存在(按日期唯一) HrmAttendanceHolidayDO existHoliday = attendanceHolidayMapper.selectByDate(importHoliday.getDate()); if (existHoliday == null) { // 2.2.1 新增 HrmAttendanceHolidayDO holiday = BeanUtils.toBean(importHoliday, HrmAttendanceHolidayDO.class); if (holiday.getIsLegal() == null) { holiday.setIsLegal(0); } attendanceHolidayMapper.insert(holiday); respVO.getCreateNames().add(importHoliday.getName()); return; } // 2.2.2 已存在,判断是否允许更新 if (!importReqVO.getUpdateSupport()) { respVO.getFailureNames().put(importHoliday.getName(), StrUtil.format(ATTENDANCE_HOLIDAY_EXISTS.getMsg(), importHoliday.getName())); return; } HrmAttendanceHolidayDO updateHoliday = BeanUtils.toBean(importHoliday, HrmAttendanceHolidayDO.class) .setId(existHoliday.getId()); if (updateHoliday.getIsLegal() == null) { updateHoliday.setIsLegal(0); } attendanceHolidayMapper.updateById(updateHoliday); respVO.getUpdateNames().add(importHoliday.getName()); } catch (ServiceException ex) { respVO.getFailureNames().put(importHoliday.getName(), ex.getMessage()); } }); return respVO; } }