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 |  504 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 395 insertions(+), 109 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 f39a456..6bd4693 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,54 +1,54 @@
 package com.ruoyi.quality.service.impl;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
-import com.ruoyi.common.exception.base.BaseException;
+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.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.procurementrecord.dto.Details;
-import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.quality.dto.BatchQuickInspectRequest;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.quality.mapper.QualityInspectParamMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectParam;
-import com.ruoyi.quality.pojo.QualityTestStandard;
 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;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
-import com.ruoyi.staff.mapper.StaffOnJobMapper;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffOnJobService;
+import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.service.StockInventoryService;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.sql.Date;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -56,8 +56,11 @@
 @AllArgsConstructor
 @Service
 @Transactional(rollbackFor = Exception.class)
-public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect>  implements IQualityInspectService {
+public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService {
 
+    private final StockUtils stockUtils;
+    private final StockInventoryService stockInventoryService;
+    private final StockInRecordService stockInRecordService;
     private QualityInspectMapper qualityInspectMapper;
 
     private IQualityInspectParamService qualityInspectParamService;
@@ -70,11 +73,15 @@
 
     private ProcurementRecordService procurementRecordService;
 
+    private final QualityInspectTemplateExportHelper qualityInspectTemplateExportHelper;
+
     @Override
     public int add(QualityInspectDto qualityInspectDto) {
         QualityInspect qualityInspect = new QualityInspect();
-        BeanUtils.copyProperties(qualityInspectDto,qualityInspect);
+        BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
         qualityInspect.setInspectState(0);//榛樿鏈彁浜�
+        // 鏍规嵁 inspectRule 琛ュ叏鎶芥姣斾緥鍜屾娊妫�鏁伴噺榛樿鍊�
+        applyInspectRuleDefaults(qualityInspect);
         qualityInspectMapper.insert(qualityInspect);
         for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
             qualityInspectParam.setInspectId(qualityInspect.getId());
@@ -83,12 +90,37 @@
         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
     public QualityInspectDto getDetailById(Integer id) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
         List<QualityInspectParam> qualityInspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
         QualityInspectDto qualityInspectDto = new QualityInspectDto();
-        BeanUtils.copyProperties(qualityInspect,qualityInspectDto);
+        BeanUtils.copyProperties(qualityInspect, qualityInspectDto);
         qualityInspectDto.setQualityInspectParams(qualityInspectParams);
         return qualityInspectDto;
     }
@@ -97,108 +129,343 @@
     @Override
     public int submit(QualityInspect inspect) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
-        /*鍒ゆ柇涓嶅悎鏍�*/
-        if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("涓嶅悎鏍�")){
+
+        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
+        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
+            throw new ServiceException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
+        }
+
+        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){
+            //浠呮坊鍔犲叆搴撹褰�
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            //濡傛灉鏄噰璐川妫�鍚堟牸鍏ュ簱閫夌敤CUSTOMIZATION_UNSTOCK_OUT,鍏朵綑鍚堟牸鍏ュ簱閫夌敤QUALITYINSPECT_STOCK_IN
+            stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
+            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())){
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            }
+            stockInventoryDto.setRecordId(qualityInspect.getId());
+            stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
+            // 鍏ュ簱鏁伴噺 = 鍚堟牸鏁伴噺 * 鍏ュ簱姣斾緥 / 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));
+            }
+            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);
+            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+"杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
+            qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
+            qualityUnqualified.setInspectId(qualityInspect.getId());
             qualityUnqualifiedMapper.insert(qualityUnqualified);
         }
 
-        LoginUser loginUser = SecurityUtils.getLoginUser();
-        if (qualityInspect.getInspectType() == 0) {
-            if ("鍚堟牸".equals(qualityInspect.getCheckResult())) {
-                ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
-                procurementRecordOutAdd.setType(1);
-                procurementRecordOutAdd.setTypeName("閲囪喘鍏ュ簱");
-                procurementRecordOutAdd.setNickName(loginUser.getNickName());
-                procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId()));
-                if (qualityInspect.getPurchaseLedgerId() == null) {
-                    throw new BaseException("璇烽�夋嫨閲囪喘鍗�");
-                }
-                SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(qualityInspect.getProductId());
-
-                ArrayList<Details> detailss = new ArrayList<>();
-                Details details = new Details();
-                details.setId(Math.toIntExact(salesLedgerProduct.getId()));
-                details.setInboundQuantity(qualityInspect.getQuantity());
-                details.setWarnNum(salesLedgerProduct.getWarnNum());
-                details.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
-                details.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
-                details.setProductModelId(qualityInspect.getProductModelId());
-                detailss.add( details);
-                procurementRecordOutAdd.setDetails(detailss);
-                procurementRecordService.add(procurementRecordOutAdd);
-            }
-        }else if (qualityInspect.getInspectType() == 1) {
-            //鏌ヨUnitPrice/TotalPrice
-            ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
-            procurementRecordOutAdd.setType(2);
-            procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
-            procurementRecordOutAdd.setNickName(loginUser.getNickName());
-            List<Details> details = new ArrayList<>();
-            Details details1 = new Details();
-            details1.setInboundQuantity(qualityInspect.getQuantity());
-            details1.setProductModelId(qualityInspect.getProductModelId());
-            procurementRecordOutAdd.setDetails(details);
-
-            ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
-                    .salesLedgerProductId(0)
-                    .inboundBatches( "鐢熶骇鍗婃垚鍝佸叆搴�")
-                    .inboundNum(details1.getInboundQuantity())
-                    .type(2)
-                    .warnNum(new BigDecimal(0))
-                    .unitPrice(new BigDecimal(0))
-                    .totalPrice(new BigDecimal(0))
-                    .createTime(LocalDateTime.now())
-                    .createUser(loginUser.getUserId())
-                    .updateTime(LocalDateTime.now())
-                    .updateUser(loginUser.getUserId())
-                    .createBy(procurementRecordOutAdd.getNickName())
-                    .productModelId(details1.getProductModelId());
-            procurementRecordService.save(procurementRecordBuilder.build());
-
-
-
-        }else if (qualityInspect.getInspectType() == 2) {
-            //鏌ヨUnitPrice/TotalPrice
-            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId());
-            ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
-            procurementRecordOutAdd.setType(2);
-            procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
-            procurementRecordOutAdd.setNickName(loginUser.getNickName());
-            List<Details> details = new ArrayList<>();
-            Details details1 = new Details();
-            details1.setInboundQuantity(qualityInspect.getQuantity());
-            details1.setId(Math.toIntExact(salesLedgerProduct.getId()));
-            details1.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
-            details1.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
-            details1.setProductModelId(salesLedgerProduct.getProductModelId());
-            details.add(details1);
-            procurementRecordOutAdd.setDetails(details);
-            procurementRecordService.add(procurementRecordOutAdd);
-        }
         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.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("妫�楠屽崟鎻愪氦澶辫触");
+    }
+
+    @Override
+    public R batchQuickInspect(BatchQuickInspectRequest request) {
+        // 1. 鏁版嵁鏍¢獙
+        if (request.getIds() == null || request.getIds().isEmpty()) {
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃楠屽崟");
+        }
+        List<String> validResults = Arrays.asList("鍚堟牸", "涓嶅悎鏍�", "閮ㄥ垎鍚堟牸");
+        if (!validResults.contains(request.getCheckResult())) {
+            return R.fail("妫�娴嬬粨鏋滃繀椤讳负锛氬悎鏍笺�佷笉鍚堟牸銆侀儴鍒嗗悎鏍�");
+        }
+        if (request.getTestStandardId() == null) {
+            return R.fail("鎸囨爣鏍囧噯ID涓嶈兘涓虹┖");
+        }
+
+        String checkResult = request.getCheckResult();
+
+        // 瑙f瀽妫�娴嬫棩鏈�
+        Date checkTimeDate = null;
+        if (request.getCheckTime() != null && !request.getCheckTime().isEmpty()) {
+            checkTimeDate = Date.valueOf(LocalDate.parse(request.getCheckTime()));
+        }
+
+        int success = 0;
+        List<String> errors = new ArrayList<>();
+
+        for (Long id : request.getIds()) {
+            try {
+                processSingleInspect(id, request, checkResult, checkTimeDate);
+                success++;
+            } catch (Exception e) {
+                errors.add("妫�楠屽崟 " + id + " 澶勭悊澶辫触锛�" + e.getMessage());
+            }
+        }
+
+        if (!errors.isEmpty()) {
+            return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉★紝澶辫触 %d 鏉°�傚け璐ュ師鍥狅細%s",
+                    success, errors.size(), String.join("锛�", errors)));
+        }
+        return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉�", success));
+    }
+
+    /**
+     * 鍦ㄧ嫭绔嬩簨鍔′腑澶勭悊鍗曚釜妫�楠屽崟
+     * 鏀寔鍏ㄦ鍜屾娊妫�妯″紡锛�
+     * - 鍏ㄦ锛氭暟閲忋�佸悎鏍兼暟閲忛粯璁や娇鐢ㄦ楠屽崟鑷韩鐨勬暟閲忥紝涓嶅悎鏍兼暟閲忎负0
+     * - 鎶芥锛氫娇鐢ㄥ墠绔紶鍏ョ殑 sampleQuantity/qualifiedQuantity/unqualifiedQuantity
+     */
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void processSingleInspect(Long id, BatchQuickInspectRequest request,
+                                     String checkResult, Date checkTimeDate) {
+        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
+        if (qualityInspect == null) {
+            throw new RuntimeException("妫�楠屽崟涓嶅瓨鍦�");
+        }
+        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
+            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(sampleQty);
+        qualityInspect.setQualifiedQuantity(qualified);
+        qualityInspect.setUnqualifiedQuantity(unqualified);
+        // 鏇存柊鎶芥鏁伴噺瀛楁
+        if (!isFullInspect) {
+            qualityInspect.setSampleQuantity(sampleQty);
+        }
+        if (request.getCheckCompany() != null) {
+            qualityInspect.setCheckCompany(request.getCheckCompany());
+        }
+        if (request.getCheckName() != null) {
+            qualityInspect.setCheckName(request.getCheckName());
+        }
+        if (checkTimeDate != null) {
+            qualityInspect.setCheckTime(checkTimeDate);
+        }
+        qualityInspect.setInspectState(1);
+
+        // 3. 淇濆瓨妫�楠屽弬鏁�
+        if (request.getParamList() != null && !request.getParamList().isEmpty()) {
+            qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery()
+                    .eq(QualityInspectParam::getInspectId, id));
+            for (QualityInspectParam param : request.getParamList()) {
+                param.setInspectId(id);
+                param.setId(null);
+            }
+            qualityInspectParamService.saveBatch(request.getParamList());
+        }
+
+        // 4. 鏇存柊妫�楠屽崟
+        qualityInspectMapper.updateById(qualityInspect);
+
+        // 5. 鍚堟牸鍏ュ簱澶勭悊
+        if (qualified.compareTo(BigDecimal.ZERO) > 0) {
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()));
+            if (ObjectUtils.isNotEmpty(qualityInspect.getPurchaseLedgerId())) {
+                stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
+            }
+            stockInventoryDto.setRecordId(qualityInspect.getId());
+            stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
+            // 鍏ュ簱鏁伴噺 = 鍚堟牸鏁伴噺 * 鍏ュ簱姣斾緥 / 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));
+            }
+            stockInventoryDto.setBatchNo(resolveProductionBatchNo(
+                    qualityInspect.getProductMainId(),
+                    qualityInspect.getId(),
+                    qualityInspect.getProductModelId()));
+            stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+        }
+
+        // 6. 涓嶅悎鏍煎鐞�
+        if (unqualified.compareTo(BigDecimal.ZERO) > 0) {
+            QualityUnqualified qualityUnqualified = new QualityUnqualified();
+            BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
+            qualityUnqualified.setInspectState(0);
+            qualityUnqualified.setQuantity(unqualified);
+            List<QualityInspectParam> inspectParams = qualityInspectParamService.list(
+                    Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
+            String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
+            qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");
+            qualityUnqualified.setInspectId(id);
+            qualityUnqualifiedMapper.insert(qualityUnqualified);
+        }
+    }
+
+    private String resolveProductionBatchNo(Long productionProductMainId,
+                                            Long qualityInspectId,
+                                            Long productModelId) {
+        if (productModelId == null) {
+            return null;
+        }
+        if (productionProductMainId != null) {
+            StockInRecord productionRecord = stockInRecordService.getOne(
+                    Wrappers.<StockInRecord>lambdaQuery()
+                            .eq(StockInRecord::getRecordId, productionProductMainId)
+                            .eq(StockInRecord::getProductModelId, productModelId)
+                            .in(StockInRecord::getRecordType, Arrays.asList(
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+                                    StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()))
+                            .isNotNull(StockInRecord::getBatchNo)
+                            .orderByDesc(StockInRecord::getId)
+                            .last("limit 1"),
+                    false);
+            if (productionRecord != null) {
+                return productionRecord.getBatchNo();
+            }
+        }
+        if (qualityInspectId == null) {
+            return null;
+        }
+        StockInRecord inspectRecord = stockInRecordService.getOne(
+                Wrappers.<StockInRecord>lambdaQuery()
+                        .eq(StockInRecord::getRecordId, qualityInspectId)
+                        .eq(StockInRecord::getProductModelId, productModelId)
+                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())
+                        .isNotNull(StockInRecord::getBatchNo)
+                        .orderByDesc(StockInRecord::getId)
+                        .last("limit 1"),
+                false);
+        return inspectRecord == null ? null : inspectRecord.getBatchNo();
     }
 
     /*鐢熸垚妫�楠屾姤鍛�*/
     @Override
     public void down(HttpServletResponse response, QualityInspect qualityInspect) {
         QualityInspect inspect = qualityInspectMapper.selectById(qualityInspect.getId());
-        String inspectType="";
-        switch (inspect.getInspectType()){
+        String inspectType = "";
+        switch (inspect.getInspectType()) {
             case 0:
-                inspectType="鍘熸潗鏂欐楠�";
+                inspectType = "鍘熸潗鏂欐楠�";
                 break;
             case 1:
-                inspectType="杩囩▼妫�楠�";
+                inspectType = "杩囩▼妫�楠�";
                 break;
             case 2:
-                inspectType="鍑哄巶妫�楠�";
+                inspectType = "鍑哄巶妫�楠�";
                 break;
         }
         List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
@@ -240,31 +507,31 @@
     @Override
     public int updateQualityInspect(QualityInspectDto qualityInspectDto) {
         if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) {
-            qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId,qualityInspectDto.getId()));
+            qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId()));
             for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
                 qualityInspectParam.setInspectId(qualityInspectDto.getId());
             }
             qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
         }
         QualityInspect qualityInspect = new QualityInspect();
-        BeanUtils.copyProperties(qualityInspectDto,qualityInspect);
+        BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
         return qualityInspectMapper.updateById(qualityInspect);
     }
 
     @Override
-    public IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect) {
-        return qualityInspectMapper.qualityInspectListPage(page,qualityInspect);
+    public IPage<QualityInspectDto> qualityInspectListPage(Page page, QualityInspectDto qualityInspect) {
+        return qualityInspectMapper.qualityInspectListPage(page, qualityInspect);
     }
 
     @Override
     public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) {
-        List<QualityInspect> qualityInspects =qualityInspectMapper.qualityInspectExport(qualityInspect);
+        List<QualityInspect> qualityInspects = qualityInspectMapper.qualityInspectExport(qualityInspect);
         ExcelUtil<QualityInspect> util = new ExcelUtil<QualityInspect>(QualityInspect.class);
-        switch (qualityInspect.getInspectType()){
+        switch (qualityInspect.getInspectType()) {
             case 0:
                 util.exportExcel(response, qualityInspects, "鍘熸潗鏂欐楠屽鍑�");
                 break;
-            case  1:
+            case 1:
                 util.exportExcel(response, qualityInspects, "杩囩▼妫�楠屽鍑�");
                 break;
             case 2:
@@ -274,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