gaoluyang
13 小时以前 d206afe19ea77303a1f3dc50aa80caaf09612693
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java
@@ -8,6 +8,8 @@
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;
@@ -17,7 +19,9 @@
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.*;
@@ -36,6 +40,8 @@
    @Resource
    private HrmAttendanceRuleMapper attendanceRuleMapper;
    @Resource
    private DeptApi deptApi;
    @Override
    public Long createAttendanceRule(HrmAttendanceRuleSaveReqVO createReqVO) {
@@ -117,17 +123,26 @@
    @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));
        if (!deptRules.isEmpty()) {
            return matchRuleByClockTime(deptRules, clockTime);
        // 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);
        }