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 |  211 +++++++++++++++++++++++++++-------------------------
 1 files changed, 108 insertions(+), 103 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 5f4a7b3..87a2358 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -313,19 +313,35 @@
             queryWrapper.ge(QualityInspect::getCheckTime, monthStart.toString())
                     .le(QualityInspect::getCheckTime, monthEnd.toString());
             List<QualityInspect> monthInspects = qualityStatisticsMapper.selectList(queryWrapper);
+
+            // 缁熻鎬绘暟閲忥紙鍚堟牸鏁伴噺 + 涓嶅悎鏍兼暟閲忥級
             BigDecimal reduce = monthInspects.stream()
                     .filter(inspect -> inspect.getInspectType().equals(0))
-                    .map(QualityInspect::getQuantity)
+                    .map(inspect -> {
+                        BigDecimal qualified = inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO;
+                        BigDecimal unqualified = inspect.getUnqualifiedQuantity() != null ? inspect.getUnqualifiedQuantity() : BigDecimal.ZERO;
+                        return qualified.add(unqualified);
+                    })
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             supplierNum = supplierNum.add(reduce);
+
             BigDecimal reduce1 = monthInspects.stream()
                     .filter(inspect -> inspect.getInspectType().equals(1))
-                    .map(QualityInspect::getQuantity)
+                    .map(inspect -> {
+                        BigDecimal qualified = inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO;
+                        BigDecimal unqualified = inspect.getUnqualifiedQuantity() != null ? inspect.getUnqualifiedQuantity() : BigDecimal.ZERO;
+                        return qualified.add(unqualified);
+                    })
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             processNum = processNum.add(reduce1);
+
             BigDecimal reduce2 = monthInspects.stream()
                     .filter(inspect -> inspect.getInspectType().equals(2))
-                    .map(QualityInspect::getQuantity)
+                    .map(inspect -> {
+                        BigDecimal qualified = inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO;
+                        BigDecimal unqualified = inspect.getUnqualifiedQuantity() != null ? inspect.getUnqualifiedQuantity() : BigDecimal.ZERO;
+                        return qualified.add(unqualified);
+                    })
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             factoryNum = factoryNum.add(reduce2);
 
@@ -335,25 +351,22 @@
 
             // 1. 渚涘簲鍟嗘楠岋紙绫诲瀷0锛�- 鍚堟牸鏁伴噺
             BigDecimal supplierQualified = monthInspects.stream()
-                    .filter(inspect -> inspect.getInspectType().equals(0)
-                            && "鍚堟牸".equals(inspect.getCheckResult()))
-                    .map(QualityInspect::getQuantity)
+                    .filter(inspect -> inspect.getInspectType().equals(0))
+                    .map(inspect -> inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             item.setSupplierNum(supplierQualified);
 
             // 2. 宸ュ簭妫�楠岋紙绫诲瀷1锛�- 鍚堟牸鏁伴噺
             BigDecimal processQualified = monthInspects.stream()
-                    .filter(inspect -> inspect.getInspectType().equals(1)
-                            && "鍚堟牸".equals(inspect.getCheckResult()))
-                    .map(QualityInspect::getQuantity)
+                    .filter(inspect -> inspect.getInspectType().equals(1))
+                    .map(inspect -> inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             item.setProcessNum(processQualified);
 
             // 3. 宸ュ巶妫�楠岋紙绫诲瀷2锛�- 鍚堟牸鏁伴噺
             BigDecimal factoryQualified = monthInspects.stream()
-                    .filter(inspect -> inspect.getInspectType().equals(2)
-                            && "鍚堟牸".equals(inspect.getCheckResult()))
-                    .map(QualityInspect::getQuantity)
+                    .filter(inspect -> inspect.getInspectType().equals(2))
+                    .map(inspect -> inspect.getQualifiedQuantity() != null ? inspect.getQualifiedQuantity() : BigDecimal.ZERO)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             item.setFactoryNum(factoryQualified);
 
@@ -1006,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) {
@@ -1465,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());
@@ -1737,11 +1735,8 @@
         BigDecimal unqualifiedCount = BigDecimal.ZERO;
 
         for (QualityInspect item : list) {
-            if ("鍚堟牸".equals(item.getCheckResult())) {
-                qualifiedCount = qualifiedCount.add(item.getQuantity());
-            } else {
-                unqualifiedCount = unqualifiedCount.add(item.getQuantity());
-            }
+            qualifiedCount = qualifiedCount.add(item.getQualifiedQuantity() != null ? item.getQualifiedQuantity() : BigDecimal.ZERO);
+            unqualifiedCount = unqualifiedCount.add(item.getUnqualifiedQuantity() != null ? item.getUnqualifiedQuantity() : BigDecimal.ZERO);
         }
 
         BigDecimal totalCount = qualifiedCount.add(unqualifiedCount);
@@ -1905,7 +1900,7 @@
             }
 
             switch (parent.getProductName()) {
-                case "鍘熸潗鏂�":
+                case "鍘熸枡":
                     rawMaterialCount = rawMaterialCount.add(quantity);
                     break;
                 case "鍗婃垚鍝�":
@@ -2010,13 +2005,11 @@
                 continue;
             }
 
-            BigDecimal quantity = item.getQuantity();
+            BigDecimal qualifiedQty = item.getQualifiedQuantity() != null ? item.getQualifiedQuantity() : BigDecimal.ZERO;
+            BigDecimal unqualifiedQty = item.getUnqualifiedQuantity() != null ? item.getUnqualifiedQuantity() : BigDecimal.ZERO;
 
-            if ("鍚堟牸".equals(item.getCheckResult())) {
-                dto.setQualifiedCount(dto.getQualifiedCount().add(quantity));
-            } else {
-                dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(quantity));
-            }
+            dto.setQualifiedCount(dto.getQualifiedCount().add(qualifiedQty));
+            dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(unqualifiedQty));
         }
 
         // 璁$畻鍚堟牸鐜�
@@ -2057,14 +2050,12 @@
             BigDecimal unqualifiedCount = BigDecimal.ZERO;
 
             for (QualityInspect item : items) {
-                BigDecimal qty = item.getQuantity();
-                totalCount = totalCount.add(qty);
+                BigDecimal qualifiedQty = item.getQualifiedQuantity() != null ? item.getQualifiedQuantity() : BigDecimal.ZERO;
+                BigDecimal unqualifiedQty = item.getUnqualifiedQuantity() != null ? item.getUnqualifiedQuantity() : BigDecimal.ZERO;
 
-                if ("鍚堟牸".equals(item.getCheckResult())) {
-                    qualifiedCount = qualifiedCount.add(qty);
-                } else {
-                    unqualifiedCount = unqualifiedCount.add(qty);
-                }
+                totalCount = totalCount.add(qualifiedQty.add(unqualifiedQty));
+                qualifiedCount = qualifiedCount.add(qualifiedQty);
+                unqualifiedCount = unqualifiedCount.add(unqualifiedQty);
             }
 
             if (totalCount.compareTo(BigDecimal.ZERO) == 0) {
@@ -2193,13 +2184,17 @@
         dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // 杩囩▼
         dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // 鍑哄巶
 
-        // 鍋囪 qualityInspectList 鏄竴涓� List<QualityInspect> 绫诲瀷鐨勯泦鍚�
-        Map<String, List<QualityInspect>> groupedByCheckResult = qualityInspectList.stream()
-                .collect(Collectors.groupingBy(QualityInspect::getCheckResult));
-        List<QualityInspect> qualityInspects = groupedByCheckResult.get("涓嶅悎鏍�");
-        if (ObjectUtils.isNull(qualityInspects) || qualityInspects.size() == 0) {
-            return null;
+        // 鏍规嵁 unqualifiedQuantity > 0 绛涢�変笉鍚堟牸璁板綍
+        List<QualityInspect> qualityInspects = qualityInspectList.stream()
+                .filter(i -> i.getUnqualifiedQuantity() != null && i.getUnqualifiedQuantity().compareTo(BigDecimal.ZERO) > 0)
+                .collect(Collectors.toList());
+
+        if (ObjectUtils.isEmpty(qualityInspects)) {
+            // 鍗充娇娌℃湁涓嶅悎鏍艰褰曪紝涔熷簲璇ヨ繑鍥炵粺璁℃暟鎹紝鍙槸鍥捐〃椤逛负绌�
+            dto.setItem(new ArrayList<>());
+            return dto;
         }
+
         // 4. 澶勭悊鍥捐〃椤� (Item)
         List<QualityStatisticsItem> itemList = new ArrayList<>();
 
@@ -2242,8 +2237,11 @@
     private BigDecimal sumQuantity(List<QualityInspect> list, Integer type) {
         return list.stream()
                 .filter(i -> i.getInspectType().equals(type))
-                .map(QualityInspect::getQuantity)
-                .filter(Objects::nonNull)
+                .map(i -> {
+                    BigDecimal qualified = i.getQualifiedQuantity() != null ? i.getQualifiedQuantity() : BigDecimal.ZERO;
+                    BigDecimal unqualified = i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO;
+                    return qualified.add(unqualified);
+                })
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
     }
 
@@ -2251,11 +2249,18 @@
         QualityStatisticsItem item = new QualityStatisticsItem();
         item.setDate(dateLabel);
 
-        item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(QualityInspect::getQuantity)
+        // 缁熻姣忕妫�楠岀被鍨嬬殑涓嶅悎鏍兼暟閲�
+        item.setSupplierNum(list.stream()
+                .filter(i -> i.getInspectType() == 0)
+                .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add));
-        item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(QualityInspect::getQuantity)
+        item.setProcessNum(list.stream()
+                .filter(i -> i.getInspectType() == 1)
+                .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add));
-        item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(QualityInspect::getQuantity)
+        item.setFactoryNum(list.stream()
+                .filter(i -> i.getInspectType() == 2)
+                .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add));
 
         return item;

--
Gitblit v1.9.3