2026-08-10 9fceeaad9af96bc58ba714560814c6e94f8af406
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
@@ -75,6 +75,27 @@
                .in(CrmReceivableDO::getAuditStatus, auditStatuses));
    }
    default List<CrmReceivableDO> selectListByInvoiceIdAndStatus(Long invoiceId, Collection<Integer> auditStatuses) {
        return selectList(new LambdaQueryWrapperX<CrmReceivableDO>()
                .eq(CrmReceivableDO::getInvoiceId, invoiceId)
                .in(CrmReceivableDO::getAuditStatus, auditStatuses));
    }
    default Map<Long, BigDecimal> selectReceivablePriceMapByInvoiceId(Collection<Long> invoiceIds) {
        if (CollUtil.isEmpty(invoiceIds)) {
            return Collections.emptyMap();
        }
        // SQL sum 查询
        List<Map<String, Object>> result = selectMaps(new QueryWrapper<CrmReceivableDO>()
                .select("invoice_id, SUM(price) AS total_price")
                .in("audit_status", CrmAuditStatusEnum.DRAFT.getStatus(), // 草稿 + 审批中 + 审批通过
                        CrmAuditStatusEnum.PROCESS.getStatus(), CrmAuditStatusEnum.APPROVE.getStatus())
                .groupBy("invoice_id")
                .in("invoice_id", invoiceIds));
        // 获得金额
        return convertMap(result, obj -> (Long) obj.get("invoice_id"), obj -> (BigDecimal) obj.get("total_price"));
    }
    default Map<Long, BigDecimal> selectReceivablePriceMapByContractId(Collection<Long> contractIds) {
        if (CollUtil.isEmpty(contractIds)) {
            return Collections.emptyMap();
@@ -94,4 +115,35 @@
        return selectCount(CrmReceivableDO::getContractId, contractId);
    }
    // ========== 统计方法 ==========
    default BigDecimal selectReceivablePriceSum() {
        LambdaQueryWrapperX<CrmReceivableDO> query = new LambdaQueryWrapperX<>();
        query.in(CrmReceivableDO::getAuditStatus,
                CrmAuditStatusEnum.DRAFT.getStatus(),
                CrmAuditStatusEnum.PROCESS.getStatus(),
                CrmAuditStatusEnum.APPROVE.getStatus())
                .select(CrmReceivableDO::getPrice);
        List<CrmReceivableDO> list = selectList(query);
        return list.stream()
                .map(CrmReceivableDO::getPrice)
                .filter(p -> p != null)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    default BigDecimal selectReceivablePriceSumByOwnerUserId(Long ownerUserId) {
        LambdaQueryWrapperX<CrmReceivableDO> query = new LambdaQueryWrapperX<>();
        query.eq(CrmReceivableDO::getOwnerUserId, ownerUserId)
                .in(CrmReceivableDO::getAuditStatus,
                        CrmAuditStatusEnum.DRAFT.getStatus(),
                        CrmAuditStatusEnum.PROCESS.getStatus(),
                        CrmAuditStatusEnum.APPROVE.getStatus())
                .select(CrmReceivableDO::getPrice);
        List<CrmReceivableDO> list = selectList(query);
        return list.stream()
                .map(CrmReceivableDO::getPrice)
                .filter(p -> p != null)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}