| | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceRuleMapper; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.util.Comparator; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | |
| | | |
| | | @Resource |
| | | private HrmAttendanceRuleMapper attendanceRuleMapper; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @Override |
| | | public Long createAttendanceRule(HrmAttendanceRuleSaveReqVO createReqVO) { |
| | |
| | | |
| | | @Override |
| | | public HrmAttendanceRuleDO getAttendanceRuleByDeptId(Long deptId, LocalDateTime clockTime) { |
| | | // 1. 先查找部门专属规则(同一个部门可以配置多条,用于多班次) |
| | | List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectList(new LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .eq(HrmAttendanceRuleDO::getDeptId, deptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, ENABLED_STATUS)); |
| | | // 1. 从员工所在部门开始逐级向上查找:配置在上级部门的规则对其子部门生效 |
| | | Set<Long> visitedDeptIds = new HashSet<>(); |
| | | Long currentDeptId = deptId; |
| | | while (currentDeptId != null && currentDeptId != 0 && visitedDeptIds.add(currentDeptId)) { |
| | | List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectEnabledListByDeptId(currentDeptId); |
| | | if (!deptRules.isEmpty()) { |
| | | // 同一部门可配置多条规则(多班次),按打卡时间匹配班次 |
| | | return matchRuleByClockTime(deptRules, clockTime); |
| | | } |
| | | DeptRespDTO dept = deptApi.getDept(currentDeptId); |
| | | if (dept == null) { |
| | | break; |
| | | } |
| | | currentDeptId = dept.getParentId(); |
| | | } |
| | | // 2. 查找全局规则(deptId 为 null) |
| | | List<HrmAttendanceRuleDO> globalRules = attendanceRuleMapper.selectList(new LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .isNull(HrmAttendanceRuleDO::getDeptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, ENABLED_STATUS)); |
| | | .eq(HrmAttendanceRuleDO::getStatus, ENABLED_STATUS) |
| | | .orderByDesc(HrmAttendanceRuleDO::getId)); |
| | | if (!globalRules.isEmpty()) { |
| | | return matchRuleByClockTime(globalRules, clockTime); |
| | | } |