From a2c8749f26688749253336fe8a27e7ff79f171ce Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期三, 26 八月 2026 13:32:01 +0800
Subject: [PATCH] fix(srm): 修正招标大屏统计接口的数据逻辑和时间错位问题

---
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmStatisticsServiceImpl.java |   49 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmStatisticsServiceImpl.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmStatisticsServiceImpl.java
index 47a2a67..cb26dc4 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmStatisticsServiceImpl.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/statistics/SrmStatisticsServiceImpl.java
@@ -52,20 +52,55 @@
         BigDecimal totalAwardAmount = awards.stream()
                 .map(a -> a.getAwardAmount() != null ? a.getAwardAmount() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        //鑺傜害閲戦(棰勭畻閲戦-涓爣閲戦)
-        BigDecimal savedAmount = totalTenderAmount.subtract(totalAwardAmount);
+
+        // 鑺傜害閲戦(浠呰绠楀綋骞村畾鏍囩殑椤圭洰鐨勶細棰勭畻閲戦 - 涓爣鎬婚噾棰�)
+        BigDecimal savedAmount = BigDecimal.ZERO;
+        if (!awards.isEmpty()) {
+            // 鎸夐」鐩垎缁勬眹鎬讳腑鏍囬噾棰濓紙澶勭悊涓�涓」鐩彲鑳芥湁澶氫釜瀹氭爣璁板綍鐨勬儏鍐碉級
+            java.util.Map<Long, BigDecimal> projectAwardSumMap = awards.stream()
+                    .collect(Collectors.groupingBy(
+                            SrmBidAwardDO::getTenderProjectId,
+                            Collectors.reducing(
+                                    BigDecimal.ZERO,
+                                    a -> a.getAwardAmount() != null ? a.getAwardAmount() : BigDecimal.ZERO,
+                                    BigDecimal::add
+                            )
+                    ));
+
+            List<Long> awardedProjectIds = new java.util.ArrayList<>(projectAwardSumMap.keySet());
+            if (!awardedProjectIds.isEmpty()) {
+                List<SrmTenderProjectDO> awardedProjects = tenderProjectMapper.selectBatchIds(awardedProjectIds);
+                for (SrmTenderProjectDO project : awardedProjects) {
+                    BigDecimal budget = project.getBudgetAmount() != null ? project.getBudgetAmount() : BigDecimal.ZERO;
+                    // 澶勭悊鏁版嵁寮傚父锛氬鏋滈」鐩绠椾负 0 鎴栫┖锛岀洿鎺ヨ烦杩囪椤圭洰鐨勮妭绾﹂噾棰濊绠楋紝閬垮厤鐢变簬缂哄け棰勭畻瀵艰嚧鍑虹幇涓嶅悎鐞嗙殑宸ㄥぇ璐熸暟鑺傜害閲戦
+                    if (budget.compareTo(BigDecimal.ZERO) > 0) {
+                        BigDecimal awardSum = projectAwardSumMap.getOrDefault(project.getId(), BigDecimal.ZERO);
+                        savedAmount = savedAmount.add(budget.subtract(awardSum));
+                    }
+                }
+            }
+        }
+
         long supplierCount = bids.stream()
                 .map(SrmTenderBidDO::getSupplierId)
                 .distinct()
                 .count();
 
+        // 瀹氭爣鐜� (褰撳勾鍒涘缓鐨勯」鐩腑锛岀洰鍓嶅凡缁忓畾鏍囩殑椤圭洰鏁� / 褰撳勾鍒涘缓鐨勯」鐩�绘暟)
         BigDecimal winRate = BigDecimal.ZERO;
         if (totalTenderCount > 0) {
-            long awardedProjectCount = awards.stream()
-                    .map(SrmBidAwardDO::getTenderProjectId)
-                    .distinct()
-                    .count();
-            winRate = BigDecimal.valueOf(awardedProjectCount)
+            List<Long> projectIds = projects.stream().map(SrmTenderProjectDO::getId).collect(Collectors.toList());
+            long awardedCount = 0;
+            if (!projectIds.isEmpty()) {
+                List<SrmBidAwardDO> matchedAwards = bidAwardMapper.selectList(new LambdaQueryWrapperX<SrmBidAwardDO>()
+                        .in(SrmBidAwardDO::getTenderProjectId, projectIds)
+                        .select(SrmBidAwardDO::getTenderProjectId));
+                awardedCount = matchedAwards.stream()
+                        .map(SrmBidAwardDO::getTenderProjectId)
+                        .distinct()
+                        .count();
+            }
+            winRate = BigDecimal.valueOf(awardedCount)
                     .multiply(BigDecimal.valueOf(100))
                     .divide(BigDecimal.valueOf(totalTenderCount), 1, RoundingMode.HALF_UP);
         }

--
Gitblit v1.9.3