From 3440ecd09d9dfc884fe111a2cdd4daff7aae50ef Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期五, 18 九月 2026 15:21:09 +0800
Subject: [PATCH] feat: 检验模块新增纸质单据导出模板(原材料/出厂/过程检验),过程检验新增技术参数等字段并改造判定提交逻辑

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 161 insertions(+), 14 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 625ff8b..7aa3355 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ruoyi.quality.service.impl;
 
 
-import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -9,24 +8,38 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
+import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
+import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.quality.dto.QualityInspectDto;
+import com.ruoyi.quality.utils.FinalInspectExportUtil;
+import com.ruoyi.quality.utils.ProcessInspectExportUtil;
+import com.ruoyi.quality.utils.RawMaterialInspectExportUtil;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
+import com.ruoyi.quality.mapper.QualityUnqualifiedOrderMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.quality.pojo.QualityUnqualifiedOrder;
 import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
@@ -38,6 +51,8 @@
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -51,6 +66,7 @@
     private final StockUtils stockUtils;
     private final StockInventoryService stockInventoryService;
     private final StockInRecordService stockInRecordService;
+    private final FileUtil fileUtil;
     private QualityInspectMapper qualityInspectMapper;
 
     private IQualityInspectParamService qualityInspectParamService;
@@ -58,6 +74,8 @@
     private QualityTestStandardMapper qualityTestStandardMapper;
 
     private QualityUnqualifiedMapper qualityUnqualifiedMapper;
+
+    private QualityUnqualifiedOrderMapper qualityUnqualifiedOrderMapper;
 
     private SalesLedgerProductMapper salesLedgerProductMapper;
 
@@ -67,12 +85,17 @@
     public int add(QualityInspectDto qualityInspectDto) {
         QualityInspect qualityInspect = new QualityInspect();
         BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
+        qualityInspect.setId(null);//寮哄埗璧版暟鎹簱鑷锛岄伩鍏嶅墠绔浼爄d瀵艰嚧涓婚敭鍐茬獊
         qualityInspect.setInspectState(0);//榛樿鏈彁浜�
         qualityInspectMapper.insert(qualityInspect);
-        for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
-            qualityInspectParam.setInspectId(qualityInspect.getId());
+        if (ObjectUtils.isNotEmpty(qualityInspectDto.getQualityInspectParams())) {
+            for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
+                qualityInspectParam.setInspectId(qualityInspect.getId());
+            }
+            qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
         }
-        qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
+        // 淇濆瓨闄勪欢
+        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.QUALITY_INSPECT, qualityInspect.getId(), qualityInspectDto.getStorageBlobDTOs());
         return 0;
     }
 
@@ -83,6 +106,8 @@
         QualityInspectDto qualityInspectDto = new QualityInspectDto();
         BeanUtils.copyProperties(qualityInspect, qualityInspectDto);
         qualityInspectDto.setQualityInspectParams(qualityInspectParams);
+        // 鏌ヨ闄勪欢
+        qualityInspectDto.setStorageBlobVOs(fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum.QUALITY_INSPECT, qualityInspect.getId()));
         return qualityInspectDto;
     }
 
@@ -90,16 +115,61 @@
     @Override
     public int submit(QualityInspect inspect) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
-        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
-        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
-            throw new RuntimeException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
+
+        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            throw new ServiceException("璇ヨ褰曞凡鎻愪氦锛屼笉鑳介噸澶嶆彁浜�");
         }
 
-        // 鍖哄垎鍚堟牸鏁伴噺浠ュ強涓嶅悎鏍煎鐞嗚繘琛屽搴旂殑澶勭悊
-        Assert.isTrue(qualityInspect.getQuantity().compareTo(qualityInspect.getQualifiedQuantity().add(qualityInspect.getUnqualifiedQuantity())) == 0,"璇锋鏌ュ悎鏍兼暟閲忓拰涓嶅悎鏍兼暟閲忥紝闇�瑕佸悎鏍兼暟閲�+涓嶅悎鏍兼暟閲忎笌鎬绘暟淇濇寔涓�鑷�");
-        if(qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
-            //鍚堟牸鐩存帴鍏ュ簱
-            // stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
+        // 鍘熸潗鏂欐楠�/杩囩▼妫�楠�/鍑哄巶妫�楠岋細琛ㄥ崟涓嶅啀濉啓鍚堟牸/涓嶅悎鏍兼暟閲忥紝鏀圭敤銆屽垽瀹氥�嶅瓧娈�
+        boolean isVerdictInspect = qualityInspect.getInspectType() != null
+                && (qualityInspect.getInspectType() == 0 || qualityInspect.getInspectType() == 1 || qualityInspect.getInspectType() == 2);
+
+        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
+        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
+            if (isVerdictInspect) {
+                // 鏀圭敤銆屽垽瀹氥�嶅瓧娈�
+                if (ObjectUtils.isNull(qualityInspect.getVerdict())) {
+                    throw new ServiceException("璇峰厛鍒ゅ畾鏄惁鍚堟牸");
+                }
+            } else {
+                throw new ServiceException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
+            }
+        }
+
+        // 鐢便�屽垽瀹氥�嶆帹瀵煎悎鏍�/涓嶅悎鏍兼暟閲�
+        if (isVerdictInspect) {
+            BigDecimal total = qualityInspect.getQuantity() == null ? BigDecimal.ZERO : qualityInspect.getQuantity();
+            if ("鍚堟牸".equals(qualityInspect.getVerdict())) {
+                qualityInspect.setQualifiedQuantity(total);
+                qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
+            } else if ("涓嶅悎鏍�".equals(qualityInspect.getVerdict())) {
+                qualityInspect.setQualifiedQuantity(BigDecimal.ZERO);
+                qualityInspect.setUnqualifiedQuantity(total);
+            }
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
+            throw new ServiceException("鍚堟牸鏁伴噺涓嶈兘涓虹┖");
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getUnqualifiedQuantity())) {
+            throw new ServiceException("涓嶅悎鏍兼暟閲忎笉鑳戒负绌�");
+        }
+
+        // 濡傛灉鍚堟牸鏁伴噺涓虹┖锛岃涓�0
+        if (qualityInspect.getQualifiedQuantity() == null) {
+            qualityInspect.setQualifiedQuantity(BigDecimal.ZERO);
+        }
+
+        // 濡傛灉涓嶅悎鏍兼暟閲忎负绌猴紝璁句负0
+        if (qualityInspect.getUnqualifiedQuantity() == null) {
+            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
+        }
+
+        // 鍚堟牸鐩存帴鍏ュ簱(杩囩▼妫�涓嶅叆搴�)
+        if (qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0 &&
+                qualityInspect.getInspectType() != 1 &&
+                qualityInspect.getInspectType() != 0) {
             //浠呮坊鍔犲叆搴撹褰�
             StockInventoryDto stockInventoryDto = new StockInventoryDto();
             //濡傛灉鏄噰璐川妫�鍚堟牸鍏ュ簱閫夌敤CUSTOMIZATION_UNSTOCK_OUT,鍏朵綑鍚堟牸鍏ュ簱閫夌敤QUALITYINSPECT_STOCK_IN
@@ -110,26 +180,85 @@
             stockInventoryDto.setRecordId(qualityInspect.getId());
             stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
             stockInventoryDto.setQualitity(qualityInspect.getQualifiedQuantity());
+            if (qualityInspect.getCheckTime() != null) {
+                LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
+                stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
+            }
             stockInventoryDto.setBatchNo(resolveProductionBatchNo(
                     qualityInspect.getProductMainId(),
                     qualityInspect.getId(),
                     qualityInspect.getProductModelId()));
             stockInventoryService.addStockInRecordOnly(stockInventoryDto);
         }
+        // 涓嶅悎鏍煎鐞�
         if(qualityInspect.getUnqualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
             QualityUnqualified qualityUnqualified = new QualityUnqualified();
             BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
             qualityUnqualified.setInspectState(0);//寰呭鐞�
             qualityUnqualified.setQuantity(qualityInspect.getUnqualifiedQuantity());
+            qualityUnqualified.setProductModelId(qualityInspect.getProductModelId());
             List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
             String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
-            qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
+            if (text == null || text.isEmpty()) {
+                text = qualityInspect.getAbnormalRemark();
+            }
+            qualityUnqualified.setDefectivePhenomena((text == null || text.isEmpty()) ? "妫�楠屼笉鍚堟牸" : text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
             qualityUnqualified.setInspectId(qualityInspect.getId());
             qualityUnqualifiedMapper.insert(qualityUnqualified);
+
+            // 鑷姩鍒涘缓涓嶅悎鏍煎搧澶勭悊鍗曪紝娴佸叆鏂版ā鍧�
+            QualityUnqualifiedOrder order = new QualityUnqualifiedOrder();
+            order.setUnqualifiedId(qualityUnqualified.getId());
+            order.setUnqualifiedProcess(qualityInspect.getInspectType() + 1);
+            order.setUnqualifiedQuantity(qualityInspect.getUnqualifiedQuantity());
+            order.setQuantity(qualityInspect.getQuantity());
+            order.setProductModelId(qualityInspect.getProductModelId());
+            order.setInspectorName(qualityInspect.getCheckName());
+            if (qualityInspect.getCheckTime() != null) {
+                order.setInspectDate(new java.util.Date(qualityInspect.getCheckTime().getTime()));
+            }
+            order.setSupplierName(qualityInspect.getSupplier());
+            order.setSpecificationModel(qualityInspect.getModel());
+            order.setProblemDescription(qualityInspect.getDefectivePhenomena());
+            order.setStatus(0);
+            String orderNo = OrderUtils.countTodayByCreateTime(
+                    qualityUnqualifiedOrderMapper, "BHG", "order_no", LocalDateTime.now());
+            order.setOrderNo(orderNo);
+            qualityUnqualifiedOrderMapper.insert(order);
         }
 
         qualityInspect.setInspectState(1);//宸叉彁浜�
         return qualityInspectMapper.updateById(qualityInspect);
+    }
+
+    @Override
+    public R autoSubmit(Long id) {
+        if (id == null) {
+            return R.fail("妫�楠屽崟ID涓嶈兘涓虹┖");
+        }
+        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+        if (qualityInspect == null) {
+            return R.fail("妫�楠屽崟涓嶅瓨鍦�");
+        }
+        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            return R.ok("妫�楠屽崟宸叉彁浜�");
+        }
+
+        if (ObjectUtils.isNull(qualityInspect.getVerdict())) {
+            qualityInspect.setVerdict("鍚堟牸");
+        }
+        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
+            qualityInspect.setCheckResult("鍚堟牸");
+        }
+        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
+            qualityInspect.setQualifiedQuantity(qualityInspect.getQuantity() == null ? BigDecimal.ZERO : qualityInspect.getQuantity());
+        }
+        if (ObjectUtils.isNull(qualityInspect.getUnqualifiedQuantity())) {
+            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
+        }
+        qualityInspectMapper.updateById(qualityInspect);
+        int rows = submit(qualityInspect);
+        return rows > 0 ? R.ok("妫�楠屽崟鎻愪氦鎴愬姛") : R.fail("妫�楠屽崟鎻愪氦澶辫触");
     }
 
     private String resolveProductionBatchNo(Long productionProductMainId,
@@ -232,7 +361,10 @@
         }
         QualityInspect qualityInspect = new QualityInspect();
         BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
-        return qualityInspectMapper.updateById(qualityInspect);
+        int result = qualityInspectMapper.updateById(qualityInspect);
+        // 淇濆瓨闄勪欢
+        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.QUALITY_INSPECT, qualityInspectDto.getId(), qualityInspectDto.getStorageBlobDTOs());
+        return result;
     }
 
     @Override
@@ -243,6 +375,21 @@
     @Override
     public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) {
         List<QualityInspect> qualityInspects = qualityInspectMapper.qualityInspectExport(qualityInspect);
+        // 鍘熸潗鏂欐楠岋細鎸夌焊璐ㄥ崟鎹牱寮忓鍑�
+        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 0) {
+            RawMaterialInspectExportUtil.export(response, qualityInspects);
+            return;
+        }
+        // 杩囩▼妫�楠岋細鎸夌焊璐ㄥ崟鎹牱寮忓鍑�
+        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 1) {
+            ProcessInspectExportUtil.export(response, qualityInspects);
+            return;
+        }
+        // 鍑哄巶妫�楠岋細鎸夌焊璐ㄥ崟鎹牱寮忓鍑�
+        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 2) {
+            FinalInspectExportUtil.export(response, qualityInspects);
+            return;
+        }
         ExcelUtil<QualityInspect> util = new ExcelUtil<QualityInspect>(QualityInspect.class);
         switch (qualityInspect.getInspectType()) {
             case 0:

--
Gitblit v1.9.3