From f8dfc6add4658bec89ef48c2bc091cfdbd7f65c8 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期四, 19 三月 2026 16:35:28 +0800
Subject: [PATCH] feat(production): 实现生产报工审核功能

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  386 +++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 262 insertions(+), 124 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 5d1e454..36a02b7 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,9 +1,9 @@
 package com.ruoyi.production.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -13,46 +13,52 @@
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.enums.AuditEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
-import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.controller.ProductWorkOrderController;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductionProductMainService;
+import com.ruoyi.production.vo.ProductAuditVo;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
-import io.swagger.models.auth.In;
+import com.ruoyi.quality.service.IQualityInspectService;
 import lombok.AllArgsConstructor;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
-import oshi.driver.mac.net.NetStat;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
-    private final ProcurementRecordOutMapper procurementRecordOutMapper;
+    private IQualityInspectService qualityInspectService;
     private ProductionProductMainMapper productionProductMainMapper;
 
-    private ProductWorkOrderController productWorkOrderController;
 
     private ProductWorkOrderMapper productWorkOrderMapper;
 
@@ -61,11 +67,11 @@
 
     private ProductionProductOutputMapper productionProductOutputMapper;
 
-    private ProcessRouteItemMapper processRouteItemMapper;
 
     private ProductModelMapper productModelMapper;
 
     private QualityInspectMapper qualityInspectMapper;
+    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
 
     private ProductProcessMapper productProcessMapper;
     private ProductProcessRouteMapper productProcessRouteMapper;
@@ -74,7 +80,6 @@
 
 
     private QualityTestStandardParamMapper qualityTestStandardParamMapper;
-    private QualityTestStandardBindingMapper qualityTestStandardBindingMapper;
     private QualityTestStandardMapper qualityTestStandardMapper;
 
     private QualityInspectParamMapper qualityInspectParamMapper;
@@ -96,6 +101,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean addProductMain(ProductionProductMainDto dto) {
         SysUser user = userMapper.selectUserById(dto.getUserId());
         ProductionProductMain productionProductMain = new ProductionProductMain();
@@ -142,11 +148,13 @@
         productionProductMain.setUserName(dto.getUserName());
         productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
+        productionProductMain.setAuditUserId(dto.getAuditUserId());
+        productionProductMain.setAuditUserName(dto.getAuditUserName());
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
         /*鏂板鎶ュ伐鎶曞叆琛�*/
         List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-        if (productStructureDtos.size() == 0) {
+        if (productStructureDtos.isEmpty()) {
             //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
             ProductStructureDto productStructureDto = new ProductStructureDto();
             productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
@@ -154,145 +162,264 @@
             productStructureDtos.add(productStructureDto);
         }
         for (ProductStructureDto productStructureDto : productStructureDtos) {
-            ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
-            Product product = productMapper.selectById(productModel1.getProductId());
-            BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
-            if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
-                throw new RuntimeException(product.getProductName()+"浜у搧鐨�"+productModel1.getModel() + "鐨勮鏍煎簱瀛樹负0");
-            }
-            if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
-                throw new RuntimeException(product.getProductName()+"浜у搧鐨�"+productModel1.getModel() + "鐨勮鏍煎簱瀛樹笉瓒�");
-            }
+
             ProductionProductInput productionProductInput = new ProductionProductInput();
             productionProductInput.setProductModelId(productStructureDto.getProductModelId());
             productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
             productionProductInput.setProductMainId(productionProductMain.getId());
             productionProductInputMapper.insert(productionProductInput);
-            //瀵瑰簲鐨勫簱瀛樺嚭搴�
-            DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
-            LocalDate now = LocalDate.now();
-            ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
-            Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS" + dateFormat.format(now))[1]);
-            ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
-                    .procurementRecordStorageId(0)
-                    .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
-                    .salesLedgerProductId(productionProductMain.getId())//鍏宠仈鎶ュ伐浜у嚭
-                    .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�" + (aLong + 1) + "鎵规")
-                    .inboundNum(productionProductInput.getQuantity())
-                    .type(4)
-                    .createBy(user.getNickName())
-                    .productModelId(productModel1.getId());
-            procurementRecordOutMapper.insert(procurementRecordOut.build());
+            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
         productionProductOutput.setProductMainId(productionProductMain.getId());
         productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
         productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
+        productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
         productionProductOutputMapper.insert(productionProductOutput);
-        /*鏂板璐ㄦ*/
-        //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
-        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
-        int inspectType = 1;
-        String process = productProcess.getName();//宸ュ簭
-        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
-            //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
-            inspectType = 2;
-            process = null;
+        //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
+        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+        //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
+        if (productQty.compareTo(BigDecimal.ZERO) > 0) {
+            List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+            /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+            productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
+            if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
+                productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+            }
+            if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
+                productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+            }
+            productWorkOrderMapper.updateById(productWorkOrder);
+            //鐢熶骇璁㈠崟
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            if (ObjectUtils.isNull(productOrder.getStartTime())) {
+                productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
+            }
+            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
+                productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
+                if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
+                    productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+                }
+            }
+            productOrderMapper.updateById(productOrder);
         }
-        Product product = productMapper.selectById(productModel.getProductId());
-        QualityInspect qualityInspect = new QualityInspect();
-        qualityInspect.setProductId(product.getId());
-        qualityInspect.setProductName(product.getProductName());
-        qualityInspect.setModel(productModel.getModel());
-        qualityInspect.setUnit(productModel.getUnit());
-        qualityInspect.setQuantity(dto.getQuantity());
-        qualityInspect.setProcess(productProcess.getName());
-        qualityInspect.setInspectState(0);
-        qualityInspect.setInspectType(inspectType);
-        qualityInspect.setProductMainId(productionProductMain.getId());
-        qualityInspect.setProductModelId(productModel.getId());
-        qualityInspectMapper.insert(qualityInspect);
-        List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType,process);
-        if (qualityTestStandard.size()>0){
-            qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
-            qualityInspectMapper.updateById(qualityInspect);
-            qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
-                    .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandard.get(0).getId()))//榛樿鑾峰彇鏈�鏂扮殑
-                    .forEach(qualityTestStandardParam -> {
-                QualityInspectParam param = new QualityInspectParam();
-                BeanUtils.copyProperties(qualityTestStandardParam, param);
-                param.setId(null);
-                param.setInspectId(qualityInspect.getId());
-                qualityInspectParamMapper.insert(param);
-            });
-        }
-        /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
-        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
-        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(dto.getQuantity()));
-        if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())){
-            productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
-        }
-        if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0){
-            productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
-        }
-        productWorkOrderMapper.updateById(productWorkOrder);
-        //鐢熶骇璁㈠崟
-        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
-        if (ObjectUtils.isNull(productOrder.getStartTime())){
-            productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
-        }
-        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
-            //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
-            productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(dto.getQuantity()));
-            if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0){
-                productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+        //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
+        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
+            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
+                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
             }
         }
-        productOrderMapper.updateById(productOrder);
-        /*娣诲姞鐢熶骇鏍哥畻*/
-        SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
-                .salesLedgerWorkId(productionProductMain.getId())
-                .salesLedgerSchedulingId(0L)
-                .salesLedgerId(productOrder.getSalesLedgerId())
-                .salesLedgerProductId(productOrder.getProductModelId())
-                .schedulingUserId(user.getUserId())
-                .schedulingUserName(user.getNickName())
-                .finishedNum(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO)
-                .workHours(productProcess.getSalaryQuota())
-                .process(productProcess.getName())
-                .schedulingDate(LocalDate.now())
-                .tenantId(dto.getTenantId())
-                .build();
-        salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
+        //nextAddProductMain(productionProductOutput) // 鐢变簬闇�瑕佸鏍革紝鎵�浠ラ渶瑕佹媶灏佷笅鏉�
         return true;
     }
 
     @Override
-    public Boolean removeProductMain(ProductionProductMainDto dto) {
-        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(dto.getId());
+    @Transactional(rollbackFor = Exception.class)
+    public void auditProductMain(ProductAuditVo productAuditVo) {
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productAuditVo.getId());
+
+        // 褰撳墠瀹℃壒浜� 瑕佷笌褰撳墠鐧诲綍浜轰负鍚屼竴浜�
+        Assert.isTrue(SecurityUtils.getUserId().equals(productionProductMain.getAuditUserId()), "褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰撳墠瀹℃壒浜�");
+
+
+        // 鐘舵�佸繀椤讳负寰呭鏍哥姸鎬�
+        if (!Objects.equals(productionProductMain.getAuditStatus(), AuditEnum.NO_AUDIT.getCode())) {
+            throw new ServiceException("褰撳墠鐘舵�佸凡瀹℃牳,涓嶈兘閲嶅瀹℃牳");
+        }
+
+        LambdaQueryWrapper<ProductionProductOutput> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProductionProductOutput::getProductMainId, productionProductMain.getId());
+        queryWrapper.last("limit 1");
+        ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectOne(queryWrapper);
+        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+
+
+        switch (productAuditVo.getAuditStatus()) {
+            case NO_AUDIT:
+                throw new ServiceException("淇敼瀹℃牳鐘舵�佸け璐ワ紝涓嶈兘涓烘湭瀹℃牳鐘舵��");
+            case AUDIT_SUCCESS:
+
+                Assert.isTrue(productionProductOutput != null, "娌℃湁鎵惧埌瀵瑰簲鐨勬姤宸ヤ骇鍑鸿褰�");
+                ((ProductionProductMainService) AopContext.currentProxy()).nextAddProductMain(productionProductOutput);
+                break;
+            case AUDIT_FAIL:
+                // 鍑忓皯 鏇存柊宸ュ崟鍜岀敓浜ц鍗�
+                ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+                ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
+                productWorkOrder.setCompleteQuantity(
+                        productWorkOrder.getCompleteQuantity()
+                                .subtract(productionProductOutput.getQuantity())
+                                .max(BigDecimal.ZERO)
+                );
+                List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+
+
+                if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                    //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗� 闇�瑕佹墸闄�
+                    productOrder.setCompleteQuantity(
+                            productOrder.getCompleteQuantity()
+                                    .subtract(productionProductOutput.getQuantity())
+                                    .max(BigDecimal.ZERO)
+                    );
+                    if (productOrder.getCompleteQuantity().compareTo(productionProductOutput.getQuantity()) > 0) {
+                        productOrder.setEndTime(null);
+                    }
+                    productOrderMapper.updateById(productOrder);
+                }
+
+                if (productWorkOrder.getCompleteQuantity().compareTo(productionProductOutput.getQuantity()) > 0) {
+                    productWorkOrder.setActualEndTime(null);
+                }
+
+                productWorkOrderMapper.updateById(productWorkOrder);
+
+                break;
+        }
+
+        // 淇敼鐘舵��
+        ProductionProductMain updateDate = new ProductionProductMain();
+        updateDate.setId(productionProductMain.getId());
+        updateDate.setAuditStatus(productAuditVo.getAuditStatus().getCode());
+        updateDate.setSureAuditUserId(SecurityUtils.getUserId());
+        updateDate.setSureAuditUserName(SecurityUtils.getUsername());
+        updateDate.setAuditTime(LocalDateTime.now());
+        updateDate.setAuditOpinion(productAuditVo.getAuditOpinion());
+        productionProductMainMapper.updateById(updateDate);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void nextAddProductMain(@NotNull ProductionProductOutput productionProductOutput){
+        //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductOutput.getProductMainId());
+        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
+        //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
+        ProductModel productModel = productModelMapper.selectById(productProcessRouteItem.getProductModelId());
+        SysUser user = userMapper.selectUserById(SecurityUtils.getUserId());
+
+        //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
+        if (productQty.compareTo(BigDecimal.ZERO) > 0) {
+            /*鏂板璐ㄦ*/
+            List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
+            if (productProcessRouteItem.getIsQuality()) {
+                //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
+                int inspectType = 1;
+                String process = productProcess.getName();//宸ュ簭
+                if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                    //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
+                    inspectType = 2;
+                    process = null;
+                }
+                Product product = productMapper.selectById(productModel.getProductId());
+                QualityInspect qualityInspect = new QualityInspect();
+                qualityInspect.setProductId(product.getId());
+                qualityInspect.setProductName(product.getProductName());
+                qualityInspect.setModel(productModel.getModel());
+                qualityInspect.setUnit(productModel.getUnit());
+                qualityInspect.setQuantity(productQty);
+                qualityInspect.setProcess(process);
+                qualityInspect.setInspectState(0);
+                qualityInspect.setInspectType(inspectType);
+                qualityInspect.setProductMainId(productionProductMain.getId());
+                qualityInspect.setProductModelId(productModel.getId());
+                qualityInspectMapper.insert(qualityInspect);
+                List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
+                if (!qualityTestStandard.isEmpty()) {
+                    qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
+                    qualityInspectMapper.updateById(qualityInspect);
+                    qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+                                    .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))//榛樿鑾峰彇鏈�鏂扮殑
+                            .forEach(qualityTestStandardParam -> {
+                                QualityInspectParam param = new QualityInspectParam();
+                                BeanUtils.copyProperties(qualityTestStandardParam, param);
+                                param.setId(null);
+                                param.setInspectId(qualityInspect.getId());
+                                qualityInspectParamMapper.insert(param);
+                            });
+                }
+            }else {
+                //鐩存帴鍏ュ簱
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+            }
+
+            /*娣诲姞鐢熶骇鏍哥畻        鍖哄垎宸ュ簭鏄浠惰繕鏄鏃�*/
+            BigDecimal workHours = (productProcess.getType() == 1)
+                    ? productProcess.getSalaryQuota().multiply(productQty)
+                    : productProcess.getSalaryQuota();
+
+            SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
+                    .productMainId(productionProductMain.getId())
+                    .schedulingUserId(user.getUserId())
+                    .schedulingUserName(user.getNickName())
+                    .finishedNum(productQty)
+                    .workHours(workHours)
+                    .process(productProcess.getName())
+                    .schedulingDate(LocalDate.now())
+                    .tenantId(productionProductOutput.getTenantId())
+                    .build();
+            salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
+        }
+    }
+
+    @Override
+    public Boolean removeProductMain(Long id) {
+        //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
+        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
+        if (qualityInspects.size() > 0){
+            List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
+                    .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
+                throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+            }
+        }
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id);
         //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
         ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
         ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0);
         /*鍒犻櫎鏍哥畻*/
         salesLedgerProductionAccountingMapper.delete(
                 new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
-                        .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId())
+                        .eq(SalesLedgerProductionAccounting::getProductMainId, productionProductMain.getId())
         );
         /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
         ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
-        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
-        productWorkOrder.setActualEndTime(null);
-        productWorkOrderMapper.updateById(productWorkOrder);
+        if (productWorkOrder != null && productionProductOutput != null) {
+            BigDecimal outputQty = productionProductOutput.getQuantity() == null ? BigDecimal.ZERO : productionProductOutput.getQuantity();
+            BigDecimal scrapQty = productionProductOutput.getScrapQty() == null ? BigDecimal.ZERO : productionProductOutput.getScrapQty();
+            BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity();
+
+            BigDecimal validQuantity = outputQty.subtract(scrapQty);
+
+            productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity));
+            productWorkOrder.setActualEndTime(null);
+            productWorkOrderMapper.updateById(productWorkOrder);
+        } else {
+            throw new ServiceException("鎿嶄綔澶辫触锛氬伐鍗曚俊鎭垨浜у嚭璁板綍涓嶅瓨鍦�");
+        }
         //鍒ゆ柇鏄惁鏄渶鍚庝竴閬撳伐搴�
         List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
-        if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()){
+        if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
-            productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
-            productOrder.setEndTime(null);
-            productOrderMapper.updateById(productOrder);
+            if (productOrder != null) {
+                BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
+                BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
+                BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
+                BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
+                BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
+                productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
+                productOrder.setEndTime(null);
+                productOrderMapper.updateById(productOrder);
+            } else {
+                throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
+            }
         }
-        /*鍒犻櫎浜у嚭*/
         //鍒犻櫎璐ㄦ
         qualityInspectMapper.selectList(
                 new LambdaQueryWrapper<QualityInspect>()
@@ -302,17 +429,28 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
+                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
+
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
-        /*鍒犻櫎鎶曞叆*/
-        procurementRecordOutMapper.delete(new LambdaQueryWrapper<ProcurementRecordOut>()
-                .eq(ProcurementRecordOut::getSalesLedgerProductId, productionProductMain.getId()));
+        //鍒犻櫎鎶曞叆璁板綍
         productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                 .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
+        //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+        //鍒犻櫎涓嶉渶瑕佽川妫�鐨勫悎鏍煎叆搴�
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
+        //鍒犻櫎鎶曞叆瀵瑰簲鐨勫嚭搴撹褰�
+        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
         // 鍒犻櫎涓昏〃
         productionProductMainMapper.deleteById(productionProductMain.getId());
         return true;
     }
+
+    @Override
+    public ArrayList<Long> listMain(List<Long> idList) {
+        return productionProductMainMapper.listMain(idList);
+    }
 }

--
Gitblit v1.9.3