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/resources/mapper/sales/SalesLedgerProductMapper.xml   |   40 +++++++++----
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  109 +++++++++++++++--------------------
 2 files changed, 75 insertions(+), 74 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 "鍗婃垚鍝�":
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index dde96d9..4016b2a 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -60,9 +60,9 @@
         GROUP BY sales_ledger_product_id
         ) t3 ON t3.sales_ledger_product_id = T1.id
         LEFT JOIN (
-            SELECT 
-                purchase_ledger_id, 
-                product_model_id, 
+            SELECT
+                purchase_ledger_id,
+                product_model_id,
                 SUM(IFNULL(quantity, 0)) AS approved_stock_in_num
             FROM quality_inspect
             WHERE inspect_state = 1
@@ -183,7 +183,7 @@
             JOIN product pr ON slp.product_id = pr.id
         WHERE
             slp.type = 2
-            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸潗鏂�' )
+            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸枡' )
         GROUP BY
             pr.id,
             pr.product_name
@@ -194,20 +194,36 @@
 
     <select id="selectProductCountByTypeAndDate" resultType="int">
         SELECT IFNULL(COUNT(*), 0)
-        FROM sales_ledger_product
+        FROM sales_ledger_product slp
+        LEFT JOIN sales_ledger sl ON sl.id = slp.sales_ledger_id
+        LEFT JOIN purchase_ledger pl ON pl.id = slp.sales_ledger_id
         WHERE type = #{type}
-        <if test="startDate != null">
-            AND register_date &gt;= #{startDate}
-        </if>
-        <if test="endDate != null">
-            AND register_date &lt;= #{endDate}
-        </if>
+
+        <choose>
+            <when test="type == 1">
+                <if test="startDate != null">
+                    AND sl.entry_date &gt;= #{startDate}
+                </if>
+                <if test="endDate != null">
+                    AND sl.entry_date &lt;= #{endDate}
+                </if>
+            </when>
+
+            <when test="type == 2">
+                <if test="startDate != null">
+                    AND pl.entry_date &gt;= #{startDate}
+                </if>
+                <if test="endDate != null">
+                    AND pl.entry_date &lt;= #{endDate}
+                </if>
+            </when>
+        </choose>
     </select>
 
     <select id="selectRawMaterialExpense" resultType="java.math.BigDecimal">
         WITH RECURSIVE product_tree AS (SELECT id
                                         FROM product
-                                        WHERE product_name = '鍘熸潗鏂�'
+                                        WHERE product_name = '鍘熸枡'
 
                                         UNION ALL
 

--
Gitblit v1.9.3