package cn.iocoder.yudao.module.hrm.dal.mysql.approval; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; import java.util.List; /** * 请假申请 Mapper * * @author 超级管理员 */ @Mapper public interface HrmLeaveApplicationMapper extends BaseMapperX { default PageResult selectPage(HrmLeaveApplicationPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(HrmLeaveApplicationDO::getNo, reqVO.getNo()) .eqIfPresent(HrmLeaveApplicationDO::getUserId, reqVO.getUserId()) .eqIfPresent(HrmLeaveApplicationDO::getDeptId, reqVO.getDeptId()) .eqIfPresent(HrmLeaveApplicationDO::getLeaveType, reqVO.getLeaveType()) .eqIfPresent(HrmLeaveApplicationDO::getStatus, reqVO.getStatus()) .betweenIfPresent(HrmLeaveApplicationDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(HrmLeaveApplicationDO::getId)); } default HrmLeaveApplicationDO selectByNo(String no) { return selectOne(HrmLeaveApplicationDO::getNo, no); } default HrmLeaveApplicationDO selectByProcessInstanceId(String processInstanceId) { return selectOne(HrmLeaveApplicationDO::getProcessInstanceId, processInstanceId); } /** * 查询员工在指定时间范围内已审批通过的请假记录 * * @param userId 员工ID(系统用户ID) * @param startTime 开始时间 * @param endTime 结束时间 * @return 请假记录列表 */ /** * 查询与指定时间区间【有交集】的请假单 * *

语义与 selectApprovedListByUserIdAndTimeRange 不同:那边要求请假单完整落在区间内, * 这里只要有重叠就算命中。考勤判断「某天是否请假」必须用这个: * 跨天的请假单(如 9/24 18:00 ~ 9/25 18:00)在 9/25 这天也算请假。

* *

交集条件:start_time < rangeEnd 且 end_time >= rangeStart

* * @param userId 员工ID(hrm_leave_application.user_id) * @param status 审批状态,传 null 不过滤 * @param rangeStart 区间开始(含) * @param rangeEnd 区间结束(不含) * @return 与区间有交集的请假单 */ default List selectListByUserIdAndOverlapDate( Long userId, Integer status, LocalDateTime rangeStart, LocalDateTime rangeEnd) { return selectList(new LambdaQueryWrapperX() .eq(HrmLeaveApplicationDO::getUserId, userId) .eqIfPresent(HrmLeaveApplicationDO::getStatus, status) .lt(HrmLeaveApplicationDO::getStartTime, rangeEnd) .ge(HrmLeaveApplicationDO::getEndTime, rangeStart) .orderByAsc(HrmLeaveApplicationDO::getStartTime)); } default List selectApprovedListByUserIdAndTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime) { return selectList(new LambdaQueryWrapperX() .eq(HrmLeaveApplicationDO::getUserId, userId) .eq(HrmLeaveApplicationDO::getStatus, HrmAuditStatusEnum.APPROVE.getStatus()) .ge(HrmLeaveApplicationDO::getStartTime, startTime) .le(HrmLeaveApplicationDO::getEndTime, endTime)); } }