From d1314d8e2842d96085299a53b9938e677b53617f Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 04 二月 2026 15:11:28 +0800
Subject: [PATCH] refactor(stock): 重构库存相关枚举类以区分出入库类型

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  142 +++++++++++++++++++++++++++++-----------------
 1 files changed, 89 insertions(+), 53 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 76a5757..7a67d50 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -11,8 +11,10 @@
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+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.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -24,6 +26,7 @@
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
+import com.ruoyi.quality.service.IQualityInspectService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,6 +36,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -41,6 +45,7 @@
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
 
+    private IQualityInspectService qualityInspectService;
     private ProductionProductMainMapper productionProductMainMapper;
 
 
@@ -148,7 +153,7 @@
             productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
             productionProductInput.setProductMainId(productionProductMain.getId());
             productionProductInputMapper.insert(productionProductInput);
-            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
 
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
@@ -163,41 +168,46 @@
         //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
         if (productQty.compareTo(BigDecimal.ZERO) > 0) {
             /*鏂板璐ㄦ*/
-            //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
             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;
-            }
-            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.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);
-                        });
+            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.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);
+                            });
+                }
+            }else {
+                //鐩存帴鍏ュ簱
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -224,10 +234,7 @@
             productOrderMapper.updateById(productOrder);
             /*娣诲姞鐢熶骇鏍哥畻*/
             SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
-                    .salesLedgerWorkId(productionProductMain.getId())
-                    .salesLedgerSchedulingId(0L)
-                    .salesLedgerId(productOrder.getSalesLedgerId())
-                    .salesLedgerProductId(productOrder.getSaleLedgerProductId())
+                    .productMainId(productionProductMain.getId())
                     .schedulingUserId(user.getUserId())
                     .schedulingUserName(user.getNickName())
                     .finishedNum(productQty)
@@ -240,14 +247,15 @@
         }
         //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
         if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
-            if (BigDecimal.ZERO.compareTo(dto.getScrapQty()) > 0) {
-                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
+                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
             }
         }
         return true;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean removeProductMain(Long id) {
         ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id);
         //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
@@ -256,20 +264,39 @@
         /*鍒犻櫎鏍哥畻*/
         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 outputQty = productionProductOutput.getQuantity() != null
+                        ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
+
+                productOrder.setCompleteQuantity(orderCompleteQty.subtract(outputQty));
+                productOrder.setEndTime(null);
+                productOrderMapper.updateById(productOrder);
+            } else {
+                throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
+            }
         }
         //鍒犻櫎璐ㄦ
         qualityInspectMapper.selectList(
@@ -280,7 +307,9 @@
                     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()));
@@ -288,11 +317,18 @@
         productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                 .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
         //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
-        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+        //鍒犻櫎涓嶉渶瑕佽川妫�鐨勫悎鏍煎叆搴�
+        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
         //鍒犻櫎鎶曞叆瀵瑰簲鐨勫嚭搴撹褰�
-        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.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