From 61f1de60e6f58dd8e19f01c56f2e56e40885d65b Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 23 六月 2026 17:39:58 +0800
Subject: [PATCH] 点击发货-》发货审核-》出厂质检-》出库审核-》出库通过

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |  248 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 231 insertions(+), 17 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 2842878..13c832f 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -17,6 +17,9 @@
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.quality.dto.AutoJudgeAllResponse;
+import com.ruoyi.quality.dto.AutoJudgeRequest;
+import com.ruoyi.quality.dto.AutoJudgeResponse;
 import com.ruoyi.quality.dto.BatchQuickInspectRequest;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
@@ -26,6 +29,7 @@
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.utils.QualityInspectTemplateExportHelper;
+import com.ruoyi.quality.utils.QualityJudgeUtil;
 import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
@@ -80,12 +84,39 @@
         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
@@ -126,18 +157,36 @@
             qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
         }
 
-        // 鍚堟牸鐩存帴鍏ュ簱
-        if(qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
+        // 鍚堟牸鍏ュ簱澶勭悊锛堟牴鎹楠岀被鍨嬪尯鍒嗭級
+        // 杩囩▼妫�楠�(inspectType=1)锛氬叆搴撳埌鎴愬搧搴�
+        // 鍑哄巶妫�楠�(inspectType=2)锛氫笉鍋氫换浣曚笟鍔″鐞�
+        // 鍘熸潗鏂欐楠�(inspectType=0)锛氭甯歌川妫�鍏ュ簱
+        Integer inspectType = qualityInspect.getInspectType();
+        boolean shouldStockIn = inspectType == null || inspectType == 0 || inspectType == 1;
+
+        if (shouldStockIn && qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
             //浠呮坊鍔犲叆搴撹褰�
             StockInventoryDto stockInventoryDto = new StockInventoryDto();
-            //濡傛灉鏄噰璐川妫�鍚堟牸鍏ュ簱閫夌敤CUSTOMIZATION_UNSTOCK_OUT,鍏朵綑鍚堟牸鍏ュ簱閫夌敤QUALITYINSPECT_STOCK_IN
-            stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
-            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())){
+            //杩囩▼妫�楠屼娇鐢ㄧ敓浜ф姤宸ュ叆搴撶被鍨嬶紝鍏朵粬璐ㄦ浣跨敤璐ㄦ鍏ュ簱绫诲瀷
+            if (inspectType != null && inspectType == 1) {
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()));
+            } else if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) {
+                //閲囪喘璐ㄦ鍚堟牸鍏ュ簱
                 stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            } else {
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
             }
             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));
@@ -236,7 +285,9 @@
 
     /**
      * 鍦ㄧ嫭绔嬩簨鍔′腑澶勭悊鍗曚釜妫�楠屽崟
-     * 鏁伴噺銆佸悎鏍兼暟閲忛粯璁や娇鐢ㄦ楠屽崟鑷韩鐨勬暟閲忥紝涓嶅悎鏍兼暟閲忎负0
+     * 鏀寔鍏ㄦ鍜屾娊妫�妯″紡锛�
+     * - 鍏ㄦ锛氭暟閲忋�佸悎鏍兼暟閲忛粯璁や娇鐢ㄦ楠屽崟鑷韩鐨勬暟閲忥紝涓嶅悎鏍兼暟閲忎负0
+     * - 鎶芥锛氫娇鐢ㄥ墠绔紶鍏ョ殑 sampleQuantity/qualifiedQuantity/unqualifiedQuantity
      */
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     public void processSingleInspect(Long id, BatchQuickInspectRequest request,
@@ -249,17 +300,66 @@
             throw new RuntimeException("妫�楠屽崟宸叉彁浜�");
         }
 
-        // 鏁伴噺榛樿鍙栨楠屽崟鑷韩鐨勬暟閲忥紝涓嶅悎鏍兼暟閲忎负0
-        BigDecimal qty = qualityInspect.getQuantity() != null ? qualityInspect.getQuantity() : BigDecimal.ZERO;
-        BigDecimal qualified = qty;
-        BigDecimal unqualified = BigDecimal.ZERO;
+        // 鍒ゆ柇妫�楠岃鍒欙細鍏ㄦ(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());
         }
@@ -285,16 +385,34 @@
         // 4. 鏇存柊妫�楠屽崟
         qualityInspectMapper.updateById(qualityInspect);
 
-        // 5. 鍚堟牸鍏ュ簱澶勭悊
-        if (qualified.compareTo(BigDecimal.ZERO) > 0) {
+        // 5. 鍚堟牸鍏ュ簱澶勭悊锛堟牴鎹楠岀被鍨嬪尯鍒嗭級
+        // 杩囩▼妫�楠�(inspectType=1)锛氬叆搴撳埌鎴愬搧搴�
+        // 鍑哄巶妫�楠�(inspectType=2)锛氫笉鍋氫换浣曚笟鍔″鐞�
+        // 鍘熸潗鏂欐楠�(inspectType=0)锛氭甯歌川妫�鍏ュ簱
+        Integer inspectType = qualityInspect.getInspectType();
+        boolean shouldStockIn = inspectType == null || inspectType == 0 || inspectType == 1;
+
+        if (shouldStockIn && qualified.compareTo(BigDecimal.ZERO) > 0) {
             StockInventoryDto stockInventoryDto = new StockInventoryDto();
-            stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
-            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) {
+            //杩囩▼妫�楠屼娇鐢ㄧ敓浜ф姤宸ュ叆搴撶被鍨嬶紝鍏朵粬璐ㄦ浣跨敤璐ㄦ鍏ュ簱绫诲瀷
+            if (inspectType != null && inspectType == 1) {
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()));
+            } else if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) {
                 stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            } else {
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
             }
             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));
@@ -467,4 +585,100 @@
         return qualityInspectTemplateExportHelper.analyzeTemplate(templatePath);
     }
 
+    @Override
+    public AutoJudgeResponse autoJudge(AutoJudgeRequest request) {
+        QualityJudgeUtil.JudgeResult result = QualityJudgeUtil.judge(
+                request.getTestValue(),
+                request.getStandardValue(),
+                request.getMinValue(),
+                request.getMaxValue(),
+                request.getJudgeType()
+        );
+        return new AutoJudgeResponse(result.getQualified(), result.getMessage());
+    }
+
+    @Override
+    public AutoJudgeAllResponse autoJudgeAll(Long inspectId) {
+        List<QualityInspectParam> params = qualityInspectParamService.list(
+                Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspectId));
+
+        AutoJudgeAllResponse response = new AutoJudgeAllResponse();
+        List<AutoJudgeAllResponse.ParamJudgeResult> paramResults = new ArrayList<>();
+        boolean hasRequiredUnqualified = false;
+        boolean hasNonRequiredUnqualified = false;
+        boolean allTextDescription = true;
+        boolean hasRequiredParam = false;
+
+        for (QualityInspectParam param : params) {
+            AutoJudgeAllResponse.ParamJudgeResult paramResult = new AutoJudgeAllResponse.ParamJudgeResult();
+            paramResult.setParamId(param.getId());
+            paramResult.setParameterItem(param.getParameterItem());
+            paramResult.setIsRequired(param.getIsRequired() != null && param.getIsRequired() == 1);
+
+            if (paramResult.getIsRequired()) {
+                hasRequiredParam = true;
+            }
+
+            String judgeType = param.getJudgeType();
+            if (QualityJudgeUtil.JUDGE_TYPE_TEXT_DESCRIPTION.equals(judgeType)) {
+                paramResult.setIsQualified(null);
+                paramResult.setMessage("鏂囧瓧鎻忚堪绫诲瀷闇�鎵嬪姩鍒ゆ柇");
+            } else {
+                allTextDescription = false;
+                QualityJudgeUtil.JudgeResult result = QualityJudgeUtil.judge(
+                        param.getTestValue(),
+                        param.getStandardValue(),
+                        param.getMinValue(),
+                        param.getMaxValue(),
+                        judgeType
+                );
+                paramResult.setIsQualified(result.getQualified());
+                paramResult.setMessage(result.getMessage());
+
+                // 鏇存柊鍙傛暟椤圭殑鍒ゆ柇缁撴灉
+                if (result.getQualified() != null) {
+                    param.setIsQualified(result.getQualified() ? 1 : 0);
+                    qualityInspectParamService.updateById(param);
+                }
+
+                // 妫�鏌ュ繀瑕佸垽鏂弬鏁版槸鍚︿笉鍚堟牸
+                if (paramResult.getIsRequired() && Boolean.FALSE.equals(result.getQualified())) {
+                    hasRequiredUnqualified = true;
+                }
+                // 妫�鏌ラ潪蹇呰鍒ゆ柇鍙傛暟鏄惁涓嶅悎鏍�
+                if (!paramResult.getIsRequired() && Boolean.FALSE.equals(result.getQualified())) {
+                    hasNonRequiredUnqualified = true;
+                }
+            }
+            paramResults.add(paramResult);
+        }
+
+        response.setParamResults(paramResults);
+        response.setHasRequiredUnqualified(hasRequiredUnqualified);
+        response.setHasNonRequiredUnqualified(hasNonRequiredUnqualified);
+        response.setAllTextDescription(allTextDescription);
+
+        // 纭畾鏁翠綋鍒ゆ柇缁撴灉
+        if (allTextDescription) {
+            response.setAutoJudgeResult(null);
+        } else if (hasRequiredUnqualified) {
+            response.setAutoJudgeResult("涓嶅悎鏍�");
+        } else if (hasNonRequiredUnqualified) {
+            // 蹇呰鍙傛暟閮藉悎鏍硷紝浣嗘湁闈炲繀瑕佸弬鏁颁笉鍚堟牸 鈫� 閮ㄥ垎鍚堟牸
+            response.setAutoJudgeResult("閮ㄥ垎鍚堟牸");
+        } else {
+            // 鎵�鏈夐渶瑕佽嚜鍔ㄥ垽鏂殑鍙傛暟椤归兘鍚堟牸锛屾暣浣撲负鍚堟牸
+            response.setAutoJudgeResult("鍚堟牸");
+        }
+
+        // 鏇存柊璐ㄦ涓昏〃鐨勮嚜鍔ㄥ垽鏂粨鏋�
+        QualityInspect inspect = qualityInspectMapper.selectById(inspectId);
+        if (inspect != null) {
+            inspect.setAutoJudgeResult(response.getAutoJudgeResult());
+            qualityInspectMapper.updateById(inspect);
+        }
+
+        return response;
+    }
+
 }

--
Gitblit v1.9.3