From f4ef6d1f4489e0d4cbba1845792945b924c16228 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 14 十月 2026 18:29:56 +0800
Subject: [PATCH] feat: 客户签订合同统计 + MES 首页质检合格率

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java |   51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java
index 38bbc03..474e9fd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/home/MesHomeStatisticsServiceImpl.java
@@ -11,6 +11,7 @@
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -19,7 +20,7 @@
 /**
  * MES 棣栭〉缁熻 Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 public class MesHomeStatisticsServiceImpl implements MesHomeStatisticsService {
@@ -89,6 +90,23 @@
         // 5. 寮傚父/寰呭姙
         summary.setAndonActiveCount(homeStatisticsMapper.selectAndonActiveCount());
         summary.setRepairActiveCount(homeStatisticsMapper.selectRepairActiveCount());
+
+        // 6. 璐ㄦ鍚堟牸鐜囷紙鏉ユ枡 / 杩囩▼ / 鍑鸿揣锛�
+        //    鏁伴噺鍙e緞 = 鍚堟牸鏁伴噺 / 妫�楠屾暟閲忥紱涓嶈繃婊ゅ崟鎹姸鎬侊紝涔熶笉鍋氭椂闂磋寖鍥撮檺鍒讹紙鍏ㄩ噺绱锛�
+        Map<String, Map<String, BigDecimal>> qcSummary = new HashMap<>();
+        for (Map<String, Object> row : homeStatisticsMapper.selectQcQualifiedSummary()) {
+            Map<String, BigDecimal> metrics = new HashMap<>();
+            metrics.put("checkQuantity", getDecimalFromObj(row.get("checkQuantity")));
+            metrics.put("qualifiedQuantity", getDecimalFromObj(row.get("qualifiedQuantity")));
+            qcSummary.put(String.valueOf(row.get("type")), metrics);
+        }
+        summary.setIqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("IQC")));
+        summary.setIpqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("IPQC")));
+        summary.setOqcQualifiedRate(calcQcQualifiedRate(qcSummary.get("OQC")));
+        // 涓変釜鐜妭鍚勮嚜鐨勬楠屾暟閲忓悎璁★紙鍚堟牸鐜囩殑鍒嗘瘝锛夛紝渚涘崱鐗囧壇琛屽睍绀烘牱鏈噺
+        summary.setIqcCheckQuantity(calcCheckQuantity(qcSummary.get("IQC")));
+        summary.setIpqcCheckQuantity(calcCheckQuantity(qcSummary.get("IPQC")));
+        summary.setOqcCheckQuantity(calcCheckQuantity(qcSummary.get("OQC")));
 
         return summary;
     }
@@ -165,4 +183,35 @@
         return new BigDecimal(obj.toString());
     }
 
+    /**
+     * 璁$畻璐ㄦ鍚堟牸鐜囷紙鐧惧垎姣旓紝淇濈暀涓や綅灏忔暟锛�
+     *
+     * 妫�楠屾暟閲忎负 0锛堝嵆娌℃湁宸插畬鎴愮殑璐ㄦ鍗曪級鏃惰繑鍥� null锛�
+     * 璁╅〉闈㈡樉绀恒�屸�斻�嶏紝鑰屼笉鏄瀵兼�х殑 0%銆�
+     */
+    private BigDecimal calcQcQualifiedRate(Map<String, BigDecimal> qcSummary) {
+        if (qcSummary == null) {
+            return null;
+        }
+        BigDecimal checkedQuantity = getDecimal(qcSummary, "checkQuantity");
+        if (checkedQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+            return null;
+        }
+        return getDecimal(qcSummary, "qualifiedQuantity")
+                .multiply(BigDecimal.valueOf(100))
+                .divide(checkedQuantity, 2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 鍙栬妫�楠岀幆鑺傜殑妫�楠屾暟閲忓悎璁★紙鍚堟牸鐜囩殑鍒嗘瘝锛屽嵆鍗$墖鍓灞曠ず鐨勬牱鏈噺锛�
+     *
+     * 璇ョ幆鑺傛病鏈変换浣曡川妫�鍗曟椂杩斿洖 0銆�
+     */
+    private Long calcCheckQuantity(Map<String, BigDecimal> qcSummary) {
+        if (qcSummary == null) {
+            return 0L;
+        }
+        return getDecimal(qcSummary, "checkQuantity").longValue();
+    }
+
 }

--
Gitblit v1.9.3