From cd0984bff3ac9c4480685671d4e033c8b082bfed Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 04 六月 2026 17:04:39 +0800
Subject: [PATCH] 发货去除库存数量限制,产品库存不足也可以发货,库存数量可以展示为负

---
 src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java |  108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 108 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
index f01f315..cc5c01a 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
@@ -103,4 +103,112 @@
 
         return result;
     }
+
+    @Override
+    public List<QualityPassRateDto> getMonthlyPassRateWithComparison(String year, Integer month) {
+        if (StringUtils.isEmpty(year) || month == null || month < 1 || month > 12) {
+            return new ArrayList<>();
+        }
+
+        // 鑾峰彇褰撳墠骞存湀鐨勫悎鏍肩巼鏁版嵁
+        List<QualityMonthlyPassRateDto> currentMonthData = qualityInspectMapper.getMonthlyPassRateStatistics(year);
+
+        // 璁$畻涓婃湀
+        int lastMonth = month - 1;
+        String lastMonthYear = year;
+        if (lastMonth == 0) {
+            lastMonth = 12;
+            lastMonthYear = String.valueOf(Integer.parseInt(year) - 1);
+        }
+
+        // 璁$畻鍘诲勾鍚屾湀
+        String lastYear = String.valueOf(Integer.parseInt(year) - 1);
+
+        // 鑾峰彇涓婃湀鏁版嵁
+        List<QualityMonthlyPassRateDto> lastMonthData = qualityInspectMapper.getMonthlyPassRateStatistics(lastMonthYear);
+
+        // 鑾峰彇鍘诲勾鍚屾湀鏁版嵁
+        List<QualityMonthlyPassRateDto> lastYearData = qualityInspectMapper.getMonthlyPassRateStatistics(lastYear);
+
+        // 鏈堜唤鍚嶇О鏄犲皠
+        String[] monthNames = {"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                               "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"};
+        String currentMonthName = monthNames[month - 1];
+        String lastMonthName = monthNames[lastMonth - 1];
+
+        // 鏋勫缓缁撴灉
+        List<QualityPassRateDto> result = new ArrayList<>();
+
+        for (int modelType = 0; modelType <= 2; modelType++) {
+            final int type = modelType;
+
+            QualityPassRateDto dto = new QualityPassRateDto();
+            dto.setModelType(modelType);
+
+            // 褰撳墠鏈堟暟鎹�
+            QualityMonthlyPassRateDto currentDto = currentMonthData.stream()
+                    .filter(d -> d.getMonth().equals(currentMonthName) && d.getModelType() == type)
+                    .findFirst()
+                    .orElse(null);
+
+            if (currentDto != null) {
+                dto.setTotalCount(currentDto.getTotalCount());
+                dto.setCompletedCount(currentDto.getCompletedCount());
+                dto.setQualifiedCount(currentDto.getQualifiedCount());
+                dto.setUnqualifiedCount(currentDto.getUnqualifiedCount());
+                dto.setCompletionRate(currentDto.getCompletionRate());
+                dto.setPassRate(currentDto.getPassRate());
+            } else {
+                dto.setTotalCount(BigDecimal.ZERO);
+                dto.setCompletedCount(BigDecimal.ZERO);
+                dto.setQualifiedCount(BigDecimal.ZERO);
+                dto.setUnqualifiedCount(BigDecimal.ZERO);
+                dto.setCompletionRate(BigDecimal.ZERO);
+                dto.setPassRate(BigDecimal.ZERO);
+            }
+
+            // 涓婃湀鏁版嵁
+            QualityMonthlyPassRateDto lastMonthDto = lastMonthData.stream()
+                    .filter(d -> d.getMonth().equals(lastMonthName) && d.getModelType() == type)
+                    .findFirst()
+                    .orElse(null);
+
+            BigDecimal lastMonthPassRate = lastMonthDto != null ? lastMonthDto.getPassRate() : BigDecimal.ZERO;
+            dto.setLastMonthPassRate(lastMonthPassRate);
+
+            // 鍘诲勾鍚屾湀鏁版嵁
+            QualityMonthlyPassRateDto lastYearDto = lastYearData.stream()
+                    .filter(d -> d.getMonth().equals(currentMonthName) && d.getModelType() == type)
+                    .findFirst()
+                    .orElse(null);
+
+            BigDecimal lastYearPassRate = lastYearDto != null ? lastYearDto.getPassRate() : BigDecimal.ZERO;
+            dto.setLastYearPassRate(lastYearPassRate);
+
+            // 璁$畻鐜瘮鍙樺寲
+            BigDecimal currentPassRate = dto.getPassRate() != null ? dto.getPassRate() : BigDecimal.ZERO;
+            if (lastMonthPassRate != null && lastMonthPassRate.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal momChange = currentPassRate.subtract(lastMonthPassRate);
+                dto.setMomChange(momChange);
+                dto.setMomTrend(momChange.compareTo(BigDecimal.ZERO));
+            } else {
+                dto.setMomChange(BigDecimal.ZERO);
+                dto.setMomTrend(0);
+            }
+
+            // 璁$畻鍚屾瘮鍙樺寲
+            if (lastYearPassRate != null && lastYearPassRate.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal yoyChange = currentPassRate.subtract(lastYearPassRate);
+                dto.setYoyChange(yoyChange);
+                dto.setYoyTrend(yoyChange.compareTo(BigDecimal.ZERO));
+            } else {
+                dto.setYoyChange(BigDecimal.ZERO);
+                dto.setYoyTrend(0);
+            }
+
+            result.add(dto);
+        }
+
+        return result;
+    }
 }

--
Gitblit v1.9.3