yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
@@ -164,7 +164,9 @@
        LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
        if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期
            query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
                    .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
                    // notifyDays 可能为 null(历史配置未填),为 null 时按 0 天处理,避免拆箱 NPE
                .between(CrmContractDO::getEndTime, beginOfToday,
                        endOfToday.plusDays(config.getNotifyDays() != null ? config.getNotifyDays() : 0));
        } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期
            query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
                    .lt(CrmContractDO::getEndTime, endOfToday);
@@ -199,7 +201,9 @@
        LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
        LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
        query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) // 必须审批通过!
                .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays()));
                // notifyDays 可能为 null(历史配置未填),为 null 时按 0 天处理,避免拆箱 NPE
                .between(CrmContractDO::getEndTime, beginOfToday,
                        endOfToday.plusDays(config.getNotifyDays() != null ? config.getNotifyDays() : 0));
        return selectCount(query);
    }