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