| | |
| | | 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.math.BigDecimal; |
| | | 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) { |
| | | // 1. 先查找部门专属规则 |
| | | List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .eq(HrmAttendanceRuleDO::getDeptId, deptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, 0)); |
| | | if (!deptRules.isEmpty()) { |
| | | return deptRules.get(0); |
| | | // 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 deptRules.get(0); |
| | | } |
| | | DeptRespDTO dept = deptApi.getDept(currentDeptId); |
| | | if (dept == null) { |
| | | break; |
| | | } |
| | | currentDeptId = dept.getParentId(); |
| | | } |
| | | // 2. 查找全局规则(deptId 为 null) |
| | | List<HrmAttendanceRuleDO> globalRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .isNull(HrmAttendanceRuleDO::getDeptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, 0)); |
| | | .eq(HrmAttendanceRuleDO::getStatus, 0) |
| | | .orderByDesc(HrmAttendanceRuleDO::getId)); |
| | | if (!globalRules.isEmpty()) { |
| | | return globalRules.get(0); |
| | | } |