From 1f5fdca1ab73461fb930f64c26dcb4038a9d4bf7 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 25 五月 2026 10:10:06 +0800
Subject: [PATCH] 11

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  109 +++++++++++++++++++++++-------------------------------
 1 files changed, 47 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index d3c21a2..87a2358 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1019,7 +1019,7 @@
     public List<Map<String, Object>> productInOutAnalysis(Integer type) {
         String targetName;
         if (type == 1) {
-            targetName = "鍘熸潗鏂�";
+            targetName = "鍘熸枡";
         } else if (type == 2) {
             targetName = "鎴愬搧";
         } else if (type == 3) {
@@ -1478,95 +1478,80 @@
         String endStr = endDate.atTime(LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
 
         List<ProductionTaskStatisticsDto> startList = productionOperationTaskMapper.selectTaskStartStats(startStr, endStr);
-
-        List<ProductionProductOutputDto> outputList = productionProductOutputMapper
-                .selectOutputStats(startStr, endStr);
+        List<ProductionProductOutputDto> outputList = productionProductOutputMapper.selectOutputStats(startStr, endStr);
 
         Map<String, WorkOrderEfficiencyDto> dateMap = new HashMap<>();
 
+        // 1. 澶勭悊寮�宸ユ暟閲忥紙缁熶竴灏嗘椂闂磋浆涓� LocalDate 瀛楃涓诧紝鍘婚櫎鏃跺垎绉掞級
         if (!CollectionUtils.isEmpty(startList)) {
             for (ProductionTaskStatisticsDto item : startList) {
                 if (item.getActualStartTime() != null) {
-                    String date = item.getActualStartTime().toString();
-                    WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
-                    dto.setDate(date);
+                    // 馃挕 鍏抽敭淇敼锛氬鏋滄槸 LocalDateTime锛屽繀椤诲厛 toLocalDate() 鍐� toString()
+                    String dateStr = item.getActualStartTime().toString();
+                    WorkOrderEfficiencyDto dto = dateMap.computeIfAbsent(dateStr, k -> {
+                        WorkOrderEfficiencyDto newDto = new WorkOrderEfficiencyDto();
+                        newDto.setDate(k);
+                        newDto.setStartQuantity(BigDecimal.ZERO);
+                        newDto.setFinishQuantity(BigDecimal.ZERO);
+                        newDto.setYieldRate("0.00");
+                        return newDto;
+                    });
+
                     BigDecimal qty = item.getPlanQuantity() != null ? item.getPlanQuantity() : BigDecimal.ZERO;
-                    dto.setStartQuantity(dto.getStartQuantity() != null ? dto.getStartQuantity().add(qty) : qty);
-                    dateMap.put(date, dto);
+                    dto.setStartQuantity(dto.getStartQuantity().add(qty));
                 }
             }
         }
 
-        // 瀹屽伐鏁伴噺鍜岃壇鍝佺巼
+        // 2. 澶勭悊瀹屽伐鏁伴噺鍜屾姤搴熸暟閲忥紙浠呴�氳繃 1 娆″惊鐜悶瀹氾紝澶у箙鎻愬崌鎬ц兘锛�
         if (!CollectionUtils.isEmpty(outputList)) {
+            // 瀹氫箟涓�涓复鏃剁殑鎶ュ簾鏁拌鏁板櫒锛屾柟渚垮悗闈㈢畻鑹搧鐜�
+            Map<String, BigDecimal> scrapMap = new HashMap<>();
+
             for (ProductionProductOutputDto item : outputList) {
                 if (item.getCreateTime() != null) {
-                    String date = item.getCreateTime().toLocalDate().toString();
-                    WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
-                    dto.setDate(date);
+                    String dateStr = item.getCreateTime().toLocalDate().toString();
 
-                    BigDecimal finishQty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
-                    BigDecimal scrapQty = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
+                    WorkOrderEfficiencyDto dto = dateMap.computeIfAbsent(dateStr, k -> {
+                        WorkOrderEfficiencyDto newDto = new WorkOrderEfficiencyDto();
+                        newDto.setDate(k);
+                        newDto.setStartQuantity(BigDecimal.ZERO);
+                        newDto.setFinishQuantity(BigDecimal.ZERO);
+                        newDto.setYieldRate("0.00");
+                        return newDto;
+                    });
 
-                    dto.setFinishQuantity(
-                            dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
+                    BigDecimal qty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
+                    BigDecimal scrap = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
+
+                    // 鑹搧鏁� = 鎬绘姇鍏ユ暟 - 鎶ュ簾鏁� (瀵瑰簲浣犲師浠g爜涓� finishMap 鐨勯�昏緫)
+                    BigDecimal goodQty = qty.subtract(scrap);
+                    dto.setFinishQuantity(dto.getFinishQuantity().add(goodQty));
+
+                    // 绱姞鎶ュ簾鏁�
+                    scrapMap.put(dateStr, scrapMap.getOrDefault(dateStr, BigDecimal.ZERO).add(scrap));
                 }
             }
 
-            Map<String, BigDecimal> scrapMap = outputList.stream()
-                    .filter(i -> i.getCreateTime() != null)
-                    .collect(Collectors.groupingBy(
-                            i -> i.getCreateTime().toLocalDate().toString(),
-                            Collectors.reducing(BigDecimal.ZERO,
-                                    i -> i.getScrapQty() != null ? i.getScrapQty() : BigDecimal.ZERO,
-                                    BigDecimal::add)));
-
-            Map<String, BigDecimal> finishMap = outputList.stream()
-                    .filter(i -> i.getCreateTime() != null)
-                    .collect(Collectors.groupingBy(
-                            i -> i.getCreateTime().toLocalDate().toString(),
-                            Collectors.reducing(BigDecimal.ZERO, i -> {
-                                BigDecimal qty = (i.getQuantity() != null) ? i.getQuantity() : BigDecimal.ZERO;
-                                BigDecimal scrap = (i.getScrapQty() != null) ? i.getScrapQty() : BigDecimal.ZERO;
-                                return qty.subtract(scrap);
-                            }, BigDecimal::add)));
-
-            finishMap.forEach((date, qty) -> {
-                WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
-                dto.setDate(date);
-                dto.setFinishQuantity(qty);
-                dateMap.put(date, dto);
-            });
-
-            dateMap.forEach((date, dto) -> {
-                BigDecimal finish = dto.getFinishQuantity() != null ? dto.getFinishQuantity() : BigDecimal.ZERO;
-                BigDecimal scrap = scrapMap.getOrDefault(date, BigDecimal.ZERO);
+            // 3. 璁$畻鑹搧鐜�
+            dateMap.forEach((dateStr, dto) -> {
+                BigDecimal finish = dto.getFinishQuantity();
+                BigDecimal scrap = scrapMap.getOrDefault(dateStr, BigDecimal.ZERO);
                 BigDecimal total = finish.add(scrap);
 
                 if (total.compareTo(BigDecimal.ZERO) > 0) {
-                    BigDecimal rate = finish.divide(total, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
-                            .setScale(2, RoundingMode.HALF_UP);
+                    // 馃挕 寤剁画浣犱箣鍓嶇殑閫昏緫锛氫娇鐢� RoundingMode.DOWN 鎴柇锛岄槻姝� 99.999% 鍥涜垗浜斿叆鍙樻垚 100.00
+                    BigDecimal rate = finish.divide(total, 4, RoundingMode.DOWN)
+                            .multiply(new BigDecimal("100"))
+                            .setScale(2, RoundingMode.DOWN);
                     dto.setYieldRate(rate.toString());
                 } else {
                     dto.setYieldRate("0.00");
                 }
-
-                if (dto.getStartQuantity() == null)
-                    dto.setStartQuantity(BigDecimal.ZERO);
-                if (dto.getFinishQuantity() == null)
-                    dto.setFinishQuantity(BigDecimal.ZERO);
             });
         }
 
-        dateMap.values().forEach(dto -> {
-            if (dto.getStartQuantity() == null)
-                dto.setStartQuantity(BigDecimal.ZERO);
-            if (dto.getFinishQuantity() == null)
-                dto.setFinishQuantity(BigDecimal.ZERO);
-            if (dto.getYieldRate() == null)
-                dto.setYieldRate("0.00");
-        });
-
+        // 4. 鎺掑簭骞惰緭鍑�
         return dateMap.values().stream()
                 .sorted(Comparator.comparing(WorkOrderEfficiencyDto::getDate))
                 .collect(Collectors.toList());
@@ -1915,7 +1900,7 @@
             }
 
             switch (parent.getProductName()) {
-                case "鍘熸潗鏂�":
+                case "鍘熸枡":
                     rawMaterialCount = rawMaterialCount.add(quantity);
                     break;
                 case "鍗婃垚鍝�":

--
Gitblit v1.9.3