From caab0b18b4500c34173f0f932499b7324997ab92 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 25 六月 2026 17:35:30 +0800
Subject: [PATCH] fix: 质检报表合格率修改

---
 src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java     |   83 +++++++++++++++++++++++++--
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java |    1 
 src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java               |    4 
 src/main/resources/mapper/quality/QualityInspectMapper.xml                     |   47 +++------------
 4 files changed, 88 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index 354f971..0af9a9f 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -53,6 +53,7 @@
         if (StringUtils.isNotBlank(timingTask.getTaskName())) {
             queryWrapper.like(TimingTask::getTaskName, timingTask.getTaskName());
         }
+        queryWrapper.orderByDesc(TimingTask::getCreateTime);
         IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
 
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
diff --git a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java b/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
index 388ebcc..a4a0c25 100644
--- a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
+++ b/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
@@ -29,9 +29,9 @@
     List<QualityInspectStatDto> getInspectStatistics();
 
     /**
-     * 鑾峰彇鍚堟牸鐜囩粺璁℃暟鎹�
+     * 鑾峰彇鍚堟牸鐜囩粺璁″師濮嬫暟鎹�
      */
-    List<QualityPassRateDto> getPassRateStatistics();
+    List<QualityInspect> getRawPassRateStatistics();
 
     /**
      * 鑾峰彇鏈堝害鍚堟牸鐜囩粺璁℃暟鎹�
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..fdc2088 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
@@ -1,21 +1,16 @@
 package com.ruoyi.quality.service.impl;
 
-import com.ruoyi.basic.service.IProductModelService;
-import com.ruoyi.basic.service.IProductService;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.production.service.ProductOrderService;
 import com.ruoyi.quality.dto.*;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.service.QualityReportService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -32,7 +27,79 @@
 
     @Override
     public List<QualityPassRateDto> getPassRateStatistics() {
-        return qualityInspectMapper.getPassRateStatistics();
+        List<QualityInspect> rawList = qualityInspectMapper.getRawPassRateStatistics();
+
+        Map<Integer, QualityPassRateDto> map = new HashMap<>();
+        for (int i = 0; i <= 2; i++) {
+            QualityPassRateDto dto = new QualityPassRateDto();
+            dto.setModelType(i);
+            dto.setTotalCount(BigDecimal.ZERO);
+            dto.setCompletedCount(BigDecimal.ZERO);
+            dto.setQualifiedCount(BigDecimal.ZERO);
+            dto.setUnqualifiedCount(BigDecimal.ZERO);
+            map.put(i, dto);
+        }
+
+        for (QualityInspect qi : rawList) {
+            Integer type = qi.getInspectType();
+            if (type == null || !map.containsKey(type) || qi.getQuantity() == null) continue;
+
+            QualityPassRateDto dto = map.get(type);
+
+            BigDecimal qty = qi.getQuantity();
+            dto.setTotalCount(dto.getTotalCount().add(qty));
+
+            if (qi.getInspectState() != null && qi.getInspectState() == 1) {
+                dto.setCompletedCount(dto.getCompletedCount().add(qty));
+
+                BigDecimal qualified = BigDecimal.ZERO;
+                BigDecimal unqualified = BigDecimal.ZERO;
+
+                String result = qi.getCheckResult();
+                BigDecimal qiQualified = qi.getQualifiedQuantity() != null ? qi.getQualifiedQuantity() : BigDecimal.ZERO;
+                BigDecimal qiUnqualified = qi.getUnqualifiedQuantity() != null ? qi.getUnqualifiedQuantity() : BigDecimal.ZERO;
+
+                if ("鍚堟牸".equals(result)) {
+                    qualified = qty;
+                } else if ("涓嶅悎鏍�".equals(result)) {
+                    unqualified = qty;
+                } else if ("閮ㄥ垎鍚堟牸".equals(result)) {
+                    if (qiUnqualified.compareTo(BigDecimal.ZERO) > 0) {
+                        qualified = qty.subtract(qiUnqualified);
+                        unqualified = qiUnqualified;
+                    } else {
+                        qualified = qiQualified;
+                        unqualified = qty.subtract(qiQualified);
+                    }
+                } else {
+                    qualified = qiQualified;
+                    unqualified = qiUnqualified;
+                }
+
+                dto.setQualifiedCount(dto.getQualifiedCount().add(qualified));
+                dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(unqualified));
+            }
+        }
+
+        List<QualityPassRateDto> resultList = new ArrayList<>();
+        for (int i = 0; i <= 2; i++) {
+            QualityPassRateDto dto = map.get(i);
+
+            if (dto.getTotalCount().compareTo(BigDecimal.ZERO) == 0) {
+                dto.setCompletionRate(BigDecimal.ZERO);
+            } else {
+                dto.setCompletionRate(dto.getCompletedCount().divide(dto.getTotalCount(), 4, java.math.RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, java.math.RoundingMode.HALF_UP));
+            }
+
+            if (dto.getCompletedCount().compareTo(BigDecimal.ZERO) == 0) {
+                dto.setPassRate(BigDecimal.ZERO);
+            } else {
+                dto.setPassRate(dto.getQualifiedCount().divide(dto.getCompletedCount(), 4, java.math.RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, java.math.RoundingMode.HALF_UP));
+            }
+            resultList.add(dto);
+        }
+
+        return resultList;
     }
 
     @Override
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index bcb8391..7bf3332 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -158,7 +158,7 @@
         GROUP BY pt.root_id, pt.root_name
     </select>
 
-    <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
+    <select id="getRawPassRateStatistics" resultType="com.ruoyi.quality.pojo.QualityInspect">
         WITH RECURSIVE product_tree AS (SELECT id,
                                                product_name,
                                                CASE product_name
@@ -177,42 +177,15 @@
                                         FROM product p
                                                  INNER JOIN product_tree pt ON p.parent_id = pt.id)
 
-        SELECT base.modelType,
-               COALESCE(SUM(qi.quantity), 0)                                                AS totalCount,
-               COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
-               COALESCE(SUM(CASE
-                                  WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity,
-                                                                          CASE WHEN qi.check_result = '鍚堟牸' THEN IFNULL(qi.quantity, 0) ELSE 0 END)
-                                  ELSE 0 END), 0)                                  AS qualifiedCount,
-               COALESCE(SUM(CASE
-                                  WHEN qi.inspect_state = 1 THEN IFNULL(qi.unqualified_quantity,
-                                                                        CASE WHEN qi.check_result IN ('涓嶅悎鏍�', '閮ㄥ垎鍚堟牸') THEN IFNULL(qi.quantity, 0) ELSE 0 END)
-                                  ELSE 0 END), 0)                                  AS unqualifiedCount,
-
-               IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
-                  ROUND(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END)
-                            / SUM(qi.quantity) * 100, 2)
-                   )                                                                        AS completionRate,
-
-               IF(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) = 0, 0,
-                  ROUND(SUM(CASE
-                                WHEN qi.inspect_state = 1 THEN IFNULL(qi.qualified_quantity,
-                                                                        CASE WHEN qi.check_result = '鍚堟牸' THEN IFNULL(qi.quantity, 0) ELSE 0 END)
-                                ELSE 0 END)
-                            / SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END) * 100, 2)
-                   )                                                                        AS passRate
-
-        FROM (SELECT 0 AS modelType
-              UNION ALL
-              SELECT 1
-              UNION ALL
-              SELECT 2) base
-                 LEFT JOIN product_tree pt ON base.modelType = pt.modelType
-                 LEFT JOIN product_model pm ON pm.product_id = pt.id
-                 LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id
-
-        GROUP BY base.modelType
-        ORDER BY base.modelType
+        SELECT pt.modelType AS inspectType,
+               qi.quantity,
+               qi.inspect_state AS inspectState,
+               qi.check_result AS checkResult,
+               qi.qualified_quantity AS qualifiedQuantity,
+               qi.unqualified_quantity AS unqualifiedQuantity
+        FROM product_tree pt
+                 INNER JOIN product_model pm ON pm.product_id = pt.id
+                 INNER JOIN quality_inspect qi ON qi.product_model_id = pm.id
     </select>
 
     <select id="getMonthlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityMonthlyPassRateDto">

--
Gitblit v1.9.3