From 9fceeaad9af96bc58ba714560814c6e94f8af406 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 10 八月 2026 17:13:01 +0800
Subject: [PATCH] feat(crm): 增强合同开票与回款功能

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
index 904357e..496afea 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
+++ b/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);
+    }
+
 }

--
Gitblit v1.9.3