From c3a981e80973ac52b5988aca62b87409976c6fb1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 18 六月 2026 13:09:28 +0800
Subject: [PATCH] 1.计量器具台账上传附件报错 2.质量拉的数据不对(未明确) 3.计量器具台账逾期的做标红提醒 4.设备保养定时任务和记录要加上具体的保养内容 5.质量要区分质检规则抽检还是全检,抽检的话是抽多少百分比 6.供应商管理东西太少了,没有资质文件啊这些东西(是不是可以参考pro) 7.采购审批把人从李莹莹改成龙红星

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |  159 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 128 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 590700d..6bd4693 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -25,6 +25,7 @@
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.quality.utils.QualityInspectTemplateExportHelper;
 import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
@@ -72,17 +73,46 @@
 
     private ProcurementRecordService procurementRecordService;
 
+    private final QualityInspectTemplateExportHelper qualityInspectTemplateExportHelper;
+
     @Override
     public int add(QualityInspectDto qualityInspectDto) {
         QualityInspect qualityInspect = new QualityInspect();
         BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
         qualityInspect.setInspectState(0);//榛樿鏈彁浜�
+        // 鏍规嵁 inspectRule 琛ュ叏鎶芥姣斾緥鍜屾娊妫�鏁伴噺榛樿鍊�
+        applyInspectRuleDefaults(qualityInspect);
         qualityInspectMapper.insert(qualityInspect);
         for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
             qualityInspectParam.setInspectId(qualityInspect.getId());
         }
         qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
         return 0;
+    }
+
+    /**
+     * 鏍规嵁 inspectRule 璁剧疆鎶芥姣斾緥鍜屾娊妫�鏁伴噺榛樿鍊�
+     * - inspectRule=0 (鍏ㄦ): sampleRatio=100, sampleQuantity=鍏ㄩ儴鏁伴噺
+     * - inspectRule=1 (鎶芥): sampleRatio 鍙栦紶鍏ュ�兼垨0, sampleQuantity=鏁伴噺脳姣斾緥/100
+     */
+    private void applyInspectRuleDefaults(QualityInspect inspect) {
+        Integer rule = inspect.getInspectRule();
+        java.math.BigDecimal quantity = inspect.getQuantity();
+        if (rule == null || rule == 0) {
+            // 鍏ㄦ
+            inspect.setSampleRatio(java.math.BigDecimal.valueOf(100));
+            inspect.setSampleQuantity(quantity != null ? quantity : java.math.BigDecimal.ZERO);
+        } else {
+            // 鎶芥
+            java.math.BigDecimal ratio = inspect.getSampleRatio() != null ? inspect.getSampleRatio() : java.math.BigDecimal.ZERO;
+            inspect.setSampleRatio(ratio);
+            if (quantity != null && ratio.compareTo(java.math.BigDecimal.ZERO) > 0) {
+                inspect.setSampleQuantity(quantity.multiply(ratio)
+                        .divide(java.math.BigDecimal.valueOf(100), 0, java.math.RoundingMode.CEILING));
+            } else {
+                inspect.setSampleQuantity(java.math.BigDecimal.ZERO);
+            }
+        }
     }
 
     @Override
@@ -134,7 +164,15 @@
             }
             stockInventoryDto.setRecordId(qualityInspect.getId());
             stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
-            stockInventoryDto.setQualitity(qualityInspect.getQualifiedQuantity());
+            // 鍏ュ簱鏁伴噺 = 鍚堟牸鏁伴噺 * 鍏ュ簱姣斾緥 / 100锛屽叆搴撴瘮渚嬮粯璁�100%
+            BigDecimal stockInRatio = qualityInspect.getStockInRatio();
+            if (stockInRatio == null || stockInRatio.compareTo(BigDecimal.ZERO) <= 0) {
+                stockInRatio = new BigDecimal("100.00");
+            }
+            BigDecimal actualStockInQuantity = qualityInspect.getQualifiedQuantity()
+                    .multiply(stockInRatio)
+                    .divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP);
+            stockInventoryDto.setQualitity(actualStockInQuantity);
             if (qualityInspect.getCheckTime() != null) {
                 LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
                 stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
@@ -200,33 +238,11 @@
         if (!validResults.contains(request.getCheckResult())) {
             return R.fail("妫�娴嬬粨鏋滃繀椤讳负锛氬悎鏍笺�佷笉鍚堟牸銆侀儴鍒嗗悎鏍�");
         }
-        if (request.getQuantity() == null || request.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
-            return R.fail("鎬绘暟閲忓繀椤诲ぇ浜�0");
-        }
         if (request.getTestStandardId() == null) {
             return R.fail("鎸囨爣鏍囧噯ID涓嶈兘涓虹┖");
         }
-        // quantity = qualifiedQuantity + unqualifiedQuantity
-        BigDecimal qty = request.getQuantity();
-        BigDecimal qualified = request.getQualifiedQuantity() != null ? request.getQualifiedQuantity() : BigDecimal.ZERO;
-        BigDecimal unqualified = request.getUnqualifiedQuantity() != null ? request.getUnqualifiedQuantity() : BigDecimal.ZERO;
-        if (qty.compareTo(qualified.add(unqualified)) != 0) {
-            return R.fail("鎬绘暟閲忓繀椤荤瓑浜庡悎鏍兼暟閲忓姞涓嶅悎鏍兼暟閲�");
-        }
+
         String checkResult = request.getCheckResult();
-        if ("鍚堟牸".equals(checkResult)) {
-            if (qualified.compareTo(qty) != 0 || unqualified.compareTo(BigDecimal.ZERO) != 0) {
-                return R.fail("妫�楠岀粨鏋滀负鍚堟牸鏃讹紝鍚堟牸鏁伴噺搴旂瓑浜庢�绘暟閲忥紝涓嶅悎鏍兼暟閲忓簲涓�0");
-            }
-        } else if ("涓嶅悎鏍�".equals(checkResult)) {
-            if (qualified.compareTo(BigDecimal.ZERO) != 0 || unqualified.compareTo(qty) != 0) {
-                return R.fail("妫�楠岀粨鏋滀负涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忓簲涓�0锛屼笉鍚堟牸鏁伴噺搴旂瓑浜庢�绘暟閲�");
-            }
-        } else {
-            if (qualified.compareTo(BigDecimal.ZERO) <= 0 || unqualified.compareTo(BigDecimal.ZERO) <= 0) {
-                return R.fail("妫�楠岀粨鏋滀负閮ㄥ垎鍚堟牸鏃讹紝鍚堟牸鏁伴噺鍜屼笉鍚堟牸鏁伴噺閮藉繀椤诲ぇ浜�0");
-            }
-        }
 
         // 瑙f瀽妫�娴嬫棩鏈�
         Date checkTimeDate = null;
@@ -239,8 +255,7 @@
 
         for (Long id : request.getIds()) {
             try {
-                // 浣跨敤鐙珛浜嬪姟澶勭悊姣忎釜妫�楠屽崟锛岄伩鍏嶅崟涓け璐ュ奖鍝嶆暣浣撲簨鍔�
-                processSingleInspect(id, request, checkResult, qty, qualified, unqualified, checkTimeDate);
+                processSingleInspect(id, request, checkResult, checkTimeDate);
                 success++;
             } catch (Exception e) {
                 errors.add("妫�楠屽崟 " + id + " 澶勭悊澶辫触锛�" + e.getMessage());
@@ -256,12 +271,13 @@
 
     /**
      * 鍦ㄧ嫭绔嬩簨鍔′腑澶勭悊鍗曚釜妫�楠屽崟
+     * 鏀寔鍏ㄦ鍜屾娊妫�妯″紡锛�
+     * - 鍏ㄦ锛氭暟閲忋�佸悎鏍兼暟閲忛粯璁や娇鐢ㄦ楠屽崟鑷韩鐨勬暟閲忥紝涓嶅悎鏍兼暟閲忎负0
+     * - 鎶芥锛氫娇鐢ㄥ墠绔紶鍏ョ殑 sampleQuantity/qualifiedQuantity/unqualifiedQuantity
      */
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     public void processSingleInspect(Long id, BatchQuickInspectRequest request,
-                                     String checkResult, BigDecimal qty,
-                                     BigDecimal qualified, BigDecimal unqualified,
-                                     Date checkTimeDate) {
+                                     String checkResult, Date checkTimeDate) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
         if (qualityInspect == null) {
             throw new RuntimeException("妫�楠屽崟涓嶅瓨鍦�");
@@ -270,12 +286,66 @@
             throw new RuntimeException("妫�楠屽崟宸叉彁浜�");
         }
 
+        // 鍒ゆ柇妫�楠岃鍒欙細鍏ㄦ(0/null) 鎴� 鎶芥(1)
+        Integer inspectRule = qualityInspect.getInspectRule();
+        boolean isFullInspect = inspectRule == null || inspectRule == 0;
+
+        BigDecimal totalQty = qualityInspect.getQuantity() != null ? qualityInspect.getQuantity() : BigDecimal.ZERO;
+        BigDecimal sampleQty;
+        BigDecimal qualified;
+        BigDecimal unqualified;
+
+        if (isFullInspect) {
+            // 鍏ㄦ妯″紡锛氭楠屾暟閲� = 鎬绘暟閲�
+            sampleQty = totalQty;
+            // 濡傛灉鍓嶇浼犲叆浜嗗悎鏍�/涓嶅悎鏍兼暟閲忓垯浣跨敤锛屽惁鍒欓粯璁ゅ叏閮ㄥ悎鏍�
+            if (request.getQualifiedQuantity() != null && request.getUnqualifiedQuantity() != null) {
+                qualified = request.getQualifiedQuantity();
+                unqualified = request.getUnqualifiedQuantity();
+            } else {
+                qualified = totalQty;
+                unqualified = BigDecimal.ZERO;
+            }
+        } else {
+            // 鎶芥妯″紡
+            // 鎶芥鏁伴噺锛氫紭鍏堜娇鐢ㄥ墠绔紶鍏ュ�硷紝鍏舵浣跨敤妫�楠屽崟宸叉湁鐨� sampleQuantity锛屾渶鍚庢寜姣斾緥璁$畻
+            if (request.getSampleQuantity() != null && request.getSampleQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                sampleQty = request.getSampleQuantity();
+            } else if (qualityInspect.getSampleQuantity() != null && qualityInspect.getSampleQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                sampleQty = qualityInspect.getSampleQuantity();
+            } else {
+                // 鎸夋娊妫�姣斾緥璁$畻
+                BigDecimal ratio = qualityInspect.getSampleRatio() != null ? qualityInspect.getSampleRatio() : BigDecimal.ZERO;
+                sampleQty = totalQty.multiply(ratio)
+                        .divide(BigDecimal.valueOf(100), 0, BigDecimal.ROUND_CEILING);
+            }
+            // 鏍¢獙鎶芥鏁伴噺涓嶈兘瓒呰繃鎬绘暟閲�
+            if (sampleQty.compareTo(totalQty) > 0) {
+                sampleQty = totalQty;
+            }
+
+            // 鍚堟牸/涓嶅悎鏍兼暟閲忥細浼樺厛浣跨敤鍓嶇浼犲叆鍊�
+            if (request.getQualifiedQuantity() != null || request.getUnqualifiedQuantity() != null) {
+                qualified = request.getQualifiedQuantity() != null ? request.getQualifiedQuantity() : BigDecimal.ZERO;
+                unqualified = request.getUnqualifiedQuantity() != null ? request.getUnqualifiedQuantity() : BigDecimal.ZERO;
+            } else {
+                // 榛樿鎶芥鏍锋湰鍏ㄩ儴鍚堟牸
+                qualified = sampleQty;
+                unqualified = BigDecimal.ZERO;
+            }
+        }
+
         // 2. 鏇存柊妫�楠屽崟瀛楁
         qualityInspect.setCheckResult(checkResult);
         qualityInspect.setTestStandardId(request.getTestStandardId());
-        qualityInspect.setQuantity(qty);
+        // 璁板綍瀹為檯妫�楠屾暟閲忥紙鎶芥鏃朵负鏍锋湰鏁伴噺锛屽叏妫�鏃朵负鎬绘暟閲忥級
+        qualityInspect.setQuantity(sampleQty);
         qualityInspect.setQualifiedQuantity(qualified);
         qualityInspect.setUnqualifiedQuantity(unqualified);
+        // 鏇存柊鎶芥鏁伴噺瀛楁
+        if (!isFullInspect) {
+            qualityInspect.setSampleQuantity(sampleQty);
+        }
         if (request.getCheckCompany() != null) {
             qualityInspect.setCheckCompany(request.getCheckCompany());
         }
@@ -310,7 +380,15 @@
             }
             stockInventoryDto.setRecordId(qualityInspect.getId());
             stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
-            stockInventoryDto.setQualitity(qualified);
+            // 鍏ュ簱鏁伴噺 = 鍚堟牸鏁伴噺 * 鍏ュ簱姣斾緥 / 100锛屽叆搴撴瘮渚嬮粯璁�100%
+            BigDecimal stockInRatio = qualityInspect.getStockInRatio();
+            if (stockInRatio == null || stockInRatio.compareTo(BigDecimal.ZERO) <= 0) {
+                stockInRatio = new BigDecimal("100.00");
+            }
+            BigDecimal actualStockInQuantity = qualified
+                    .multiply(stockInRatio)
+                    .divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP);
+            stockInventoryDto.setQualitity(actualStockInQuantity);
             if (qualityInspect.getCheckTime() != null) {
                 LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
                 stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
@@ -463,5 +541,24 @@
 
     }
 
+    @Override
+    public void exportWeiLong(HttpServletResponse response, Long id) {
+        qualityInspectTemplateExportHelper.exportWeiLong(response, id);
+    }
+
+    @Override
+    public void exportBaiShi(HttpServletResponse response, Long id) {
+        qualityInspectTemplateExportHelper.exportBaiShi(response, id);
+    }
+
+    @Override
+    public void exportDaLi(HttpServletResponse response, Long id) {
+        qualityInspectTemplateExportHelper.exportDaLi(response, id);
+    }
+
+    @Override
+    public String analyzeTemplate(String templatePath) {
+        return qualityInspectTemplateExportHelper.analyzeTemplate(templatePath);
+    }
 
 }

--
Gitblit v1.9.3