云
2026-09-29 f87ce86307056f63f79312178037cc8714eb2b13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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<ArchiveBorrowDO> {
 
    /** 借阅单分页查询 */
    default PageResult<ArchiveBorrowDO> selectPage(ArchiveBorrowPageReqVO reqVO) {
        return selectPage(reqVO, buildQuery(reqVO, false));
    }
 
    /** 逾期借阅单分页查询:借出中 且 归还期限已过 */
    default PageResult<ArchiveBorrowDO> selectOverduePage(ArchiveBorrowPageReqVO reqVO) {
        return selectPage(reqVO, buildQuery(reqVO, true));
    }
 
    /** 逾期借阅单列表(不分页,统计与导出用) */
    default List<ArchiveBorrowDO> selectOverdueList() {
        return selectList(new LambdaQueryWrapperX<ArchiveBorrowDO>()
                .eq(ArchiveBorrowDO::getStatus, ArchiveBorrowStatusEnum.BORROWED.getStatus())
                .lt(ArchiveBorrowDO::getReturnDeadline, LocalDate.now()));
    }
 
    /**
     * 构建借阅单查询条件
     *
     * @param overdueOnly true=仅查询逾期(借出中 且 归还期限 < 今天)
     */
    default LambdaQueryWrapperX<ArchiveBorrowDO> buildQuery(ArchiveBorrowPageReqVO reqVO, boolean overdueOnly) {
        LambdaQueryWrapperX<ArchiveBorrowDO> query = new LambdaQueryWrapperX<ArchiveBorrowDO>()
                .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<ArchiveBorrowDO> selectListByDocumentIdAndStatusIn(Long documentId, Collection<Integer> statuses) {
        return selectList(new LambdaQueryWrapperX<ArchiveBorrowDO>()
                .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<ArchiveBorrowDO>()
                .eq(ArchiveBorrowDO::getStatus, ArchiveBorrowStatusEnum.BORROWED.getStatus())
                .lt(ArchiveBorrowDO::getReturnDeadline, LocalDate.now()));
    }
 
}