package cn.iocoder.yudao.module.archive.dal.mysql.borrow; 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.archive.controller.admin.borrow.vo.ArchiveBorrowPageReqVO; import cn.iocoder.yudao.module.archive.dal.dataobject.borrow.ArchiveBorrowDO; import cn.iocoder.yudao.module.archive.enums.ArchiveBorrowStatusEnum; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDate; import java.util.Collection; import java.util.List; @Mapper public interface ArchiveBorrowMapper extends BaseMapperX { /** 借阅单分页查询 */ default PageResult selectPage(ArchiveBorrowPageReqVO reqVO) { return selectPage(reqVO, buildQuery(reqVO, false)); } /** 逾期借阅单分页查询:借出中 且 归还期限已过 */ default PageResult selectOverduePage(ArchiveBorrowPageReqVO reqVO) { return selectPage(reqVO, buildQuery(reqVO, true)); } /** 逾期借阅单列表(不分页,统计与导出用) */ default List selectOverdueList() { return selectList(new LambdaQueryWrapperX() .eq(ArchiveBorrowDO::getStatus, ArchiveBorrowStatusEnum.BORROWED.getStatus()) .lt(ArchiveBorrowDO::getReturnDeadline, LocalDate.now())); } /** * 构建借阅单查询条件 * * @param overdueOnly true=仅查询逾期(借出中 且 归还期限 < 今天) */ default LambdaQueryWrapperX buildQuery(ArchiveBorrowPageReqVO reqVO, boolean overdueOnly) { LambdaQueryWrapperX query = new LambdaQueryWrapperX() .likeIfPresent(ArchiveBorrowDO::getNo, reqVO.getNo()) .likeIfPresent(ArchiveBorrowDO::getDocumentNo, reqVO.getDocumentNo()) .likeIfPresent(ArchiveBorrowDO::getDocumentTitle, reqVO.getDocumentTitle()) .likeIfPresent(ArchiveBorrowDO::getBorrowerName, reqVO.getBorrowerName()) .eqIfPresent(ArchiveBorrowDO::getStatus, reqVO.getStatus()) .betweenIfPresent(ArchiveBorrowDO::getBorrowDate, reqVO.getBorrowDate()) .betweenIfPresent(ArchiveBorrowDO::getReturnDeadline, reqVO.getReturnDeadline()) .orderByDesc(ArchiveBorrowDO::getId); if (overdueOnly) { query.eq(ArchiveBorrowDO::getStatus, ArchiveBorrowStatusEnum.BORROWED.getStatus()) .lt(ArchiveBorrowDO::getReturnDeadline, LocalDate.now()); } return query; } /** * 查询指定档案处于未归还(审批中 / 借出中)状态的借阅单 * 用于「同一档案同一时间只能有一条未归还借阅单」的唯一性校验 */ default List selectListByDocumentIdAndStatusIn(Long documentId, Collection statuses) { return selectList(new LambdaQueryWrapperX() .eq(ArchiveBorrowDO::getDocumentId, documentId) .inIfPresent(ArchiveBorrowDO::getStatus, statuses)); } /** 按状态统计借阅单数量 */ default Long selectCountByStatus(Integer status) { return selectCount(ArchiveBorrowDO::getStatus, status); } /** 借出中借阅单数量 */ default Long selectBorrowingCount() { return selectCountByStatus(ArchiveBorrowStatusEnum.BORROWED.getStatus()); } /** 逾期借阅单数量 */ default Long selectOverdueCount() { return selectCount(new LambdaQueryWrapperX() .eq(ArchiveBorrowDO::getStatus, ArchiveBorrowStatusEnum.BORROWED.getStatus()) .lt(ArchiveBorrowDO::getReturnDeadline, LocalDate.now())); } }