From b75da39a305c3271d5786265185ef7d47d859b23 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 20 六月 2026 16:47:25 +0800
Subject: [PATCH] fix: 发货率修改

---
 src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java |   66 +++++++++++++++++++++++---------
 1 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
index 22b9b66..942e089 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -2,7 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.sales.dto.SalesTrendDto;
 import com.ruoyi.sales.dto.StatisticsTableDto;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
@@ -32,28 +32,56 @@
     private final SalesLedgerProductMapper salesLedgerProductMapper;
     private final ShippingInfoMapper shippingInfoMapper;
 
-    public R<?> total() {
+    public AjaxResult total() {
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null);
-        if(CollectionUtils.isEmpty(salesLedgers)) return R.ok(salesLedgers);
+        if (CollectionUtils.isEmpty(salesLedgers)) {
+            return AjaxResult.success(salesLedgers);
+        }
+
         Map<String, Object> map = new HashMap<>();
-        // 閿�鍞
-        map.put("contractAmountTotal", salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
-        // 璁㈠崟鏁伴噺
-        map.put("total", new BigDecimal(salesLedgers.size()));
-        // 鍙戣揣鐜�
-        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+        //  閿�鍞
+        BigDecimal contractAmountTotal = salesLedgers.stream()
+                .map(SalesLedger::getContractAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        map.put("contractAmountTotal", contractAmountTotal);
+
+        //  璁㈠崟鏁伴噺
+        int totalOrders = salesLedgers.size();
+        map.put("total", new BigDecimal(totalOrders));
+        map.put("shipRate", "0.00%");
+
+        //  鍙戣揣鐜�
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                 .eq(SalesLedgerProduct::getType, 1));
-        map.put("shipRate", "0%");
-        if(CollectionUtils.isEmpty(salesLedgerProducts)) return R.ok(map);
-        // 鍙戣揣鏁伴噺
-        long count = shippingInfoMapper.selectCount(new LambdaQueryWrapper<ShippingInfo>()
-                .in(ShippingInfo::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()))
-                .eq(ShippingInfo::getStatus,"宸插彂璐�"));
-        map.put("shipRate", String.format("%.2f", count * 100.0 / salesLedgerProducts.size()) + "%");
-        return R.ok(map);
+        if (CollectionUtils.isEmpty(products)) {
+            return AjaxResult.success(map);
+        }
+
+        Map<Long, Long> productIdToLedgerIdMap = products.stream()
+                .filter(p -> p.getId() != null && p.getSalesLedgerId() != null)
+                .collect(Collectors.toMap(SalesLedgerProduct::getId, SalesLedgerProduct::getSalesLedgerId, (k1, k2) -> k1));
+
+        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
+                .eq(ShippingInfo::getStatus, "瀹℃牳閫氳繃"));
+
+        long shippedOrderCount = shippingInfos.stream()
+                .filter(info -> productIdToLedgerIdMap.containsKey(info.getSalesLedgerProductId()))
+                .map(info -> {
+                    if (info.getSalesLedgerId() != null) {
+                        return info.getSalesLedgerId();
+                    }
+                    return productIdToLedgerIdMap.get(info.getSalesLedgerProductId());
+                })
+                .filter(Objects::nonNull)
+                .distinct()
+                .count();
+
+        map.put("shipRate", String.format("%.2f", shippedOrderCount * 100.0 / totalOrders) + "%");
+        return AjaxResult.success(map);
     }
 
-    public R<?> statisticsTable(StatisticsTableDto statisticsTableDto) {
+    public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) {
         Map<String, Object> map = new HashMap<>();
         Calendar calendar = Calendar.getInstance();
 
@@ -123,6 +151,6 @@
         map.put("orderCountList", orderCountList);
         map.put("salesAmountList", salesAmountList);
         map.put("shippingRateList", shippingRateList);
-        return R.ok(map);
+        return AjaxResult.success(map);
     }
 }

--
Gitblit v1.9.3