From 9909b15c6d0435bee3b2a92115762f2c046d238f Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 27 三月 2026 17:57:43 +0800
Subject: [PATCH] yys 1.删除报工记录bug

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   98 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 66 insertions(+), 32 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 e24045c..f8408e2 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -33,6 +34,7 @@
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -97,6 +99,30 @@
         if (productProcessRouteItem == null) {
             throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
         }
+        // 鑾峰彇璁㈠崟鐨勫伐鍗�
+        List<ProductWorkOrder> productWorkOrderList = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery()
+                .eq(ProductWorkOrder::getProductOrderId, productProcessRouteItem.getProductOrderId()));
+        // 鑾峰彇瀹屾垚鏁伴噺
+        BigDecimal completeQuantity = productWorkOrderList
+                .stream()
+                .filter(item -> item.getStatus() == 3)
+                .map(ProductWorkOrder::getCompleteQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 鑾峰彇鎵�鏈夋暟閲�
+        BigDecimal totalQuantity = productWorkOrderList
+                .stream()
+                .map(ProductWorkOrder::getPlanQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        // 鑾峰彇鏈畬鎴愭暟閲�
+        BigDecimal unCompleteQuantity = totalQuantity.subtract(completeQuantity);
+        if (unCompleteQuantity.compareTo(BigDecimal.ZERO) <= 0) {
+            throw new ServiceException("璇ュ伐鍗曞凡鍏ㄩ儴瀹屾垚");
+        }
+        // 璁$畻姣斾緥
+        BigDecimal ratio = unCompleteQuantity.divide(totalQuantity, 2, RoundingMode.HALF_UP);
+        if(CollectionUtils.isEmpty(productWorkOrderList)){
+            productWorkOrderList = new ArrayList<>();
+        }
         //褰撳墠鍏蜂綋宸ュ簭
         ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
         //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
@@ -137,25 +163,25 @@
         productionProductMain.setWorkOrderId(dto.getWorkOrderId());
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
-        /*鏂板鎶ュ伐鎶曞叆琛�*/
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-        if (productStructureDtos.size() == 0) {
-            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
-            ProductStructureDto productStructureDto = new ProductStructureDto();
-            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
-            productStructureDto.setUnitQuantity(BigDecimal.ONE);
-            productStructureDtos.add(productStructureDto);
-        }
-        for (ProductStructureDto productStructureDto : productStructureDtos) {
-
-            ProductionProductInput productionProductInput = new ProductionProductInput();
-            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
-            productionProductInput.setProductMainId(productionProductMain.getId());
-            productionProductInputMapper.insert(productionProductInput);
-            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
-
-        }
+        /*鏂板鎶ュ伐鎶曞叆琛紙閫昏緫鏀逛负鎵嬪姩棰嗘枡锛�*/
+//        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcess.getId());
+//        if (productStructureDtos.size() == 0) {
+//            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
+//            ProductStructureDto productStructureDto = new ProductStructureDto();
+//            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
+//            productStructureDto.setUnitQuantity(BigDecimal.ONE);
+//            productStructureDtos.add(productStructureDto);
+//        }
+//        for (ProductStructureDto productStructureDto : productStructureDtos) {
+//
+//            ProductionProductInput productionProductInput = new ProductionProductInput();
+//            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
+//            productionProductInput.setQuantity(dto.getQuantity());
+//            productionProductInput.setProductMainId(productionProductMain.getId());
+//            productionProductInputMapper.insert(productionProductInput);
+//            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+//
+//        }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
         productionProductOutput.setProductMainId(productionProductMain.getId());
@@ -173,7 +199,7 @@
                 //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
                 int inspectType = 1;
                 String process = productProcess.getName();//宸ュ簭
-                if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+                if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                     //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
                     inspectType = 2;
                     process = null;
@@ -207,28 +233,36 @@
                 }
             }else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+//                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
             productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
             if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
                 productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+                productWorkOrder.setStatus(2);
             }
             if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
                 productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+                productWorkOrder.setStatus(3);
             }
             productWorkOrderMapper.updateById(productWorkOrder);
             //鐢熶骇璁㈠崟
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
             if (ObjectUtils.isNull(productOrder.getStartTime())) {
                 productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
+                productOrder.setStatus("鐢熶骇涓�");
             }
-            if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+            // 閫氳繃姣斾緥璁$畻瀹屾垚鏁伴噺
+            productOrder.setCompleteQuantity(productOrder.getQuantity().multiply(ratio));
+            if (productWorkOrderList.size() == productProcessRouteItems.size() - 1) {
                 //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
-                productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
+                productOrder.setCompleteQuantity(productOrder.getQuantity());
                 if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
                     productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+                    productOrder.setStatus("宸插畬鎴�");
+                    // 鐢熶骇瀹屾垚鍏ュ簱
+                    stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
                 }
             }
             productOrderMapper.updateById(productOrder);
@@ -246,11 +280,11 @@
             salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
         }
         //濡傛灉鎶ュ簾鏁伴噺>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());
-            }
-        }
+//        if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
+//            if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
+//                stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+//            }
+//        }
         return true;
     }
 
@@ -274,7 +308,7 @@
             BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity();
 
             BigDecimal validQuantity = outputQty.subtract(scrapQty);
-
+            productWorkOrder.setStatus(2);
             productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity));
             productWorkOrder.setActualEndTime(null);
             productWorkOrderMapper.updateById(productWorkOrder);
@@ -298,7 +332,7 @@
                 productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
 
                 productOrder.setEndTime(null);
-
+                productOrder.setStatus("鐢熶骇涓�");
                 productOrderMapper.updateById(productOrder);
             } else {
                 throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
@@ -320,8 +354,8 @@
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
         //鍒犻櫎鎶曞叆璁板綍
-        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
-                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
+//        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
+//                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
         //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
         stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
         //鍒犻櫎涓嶉渶瑕佽川妫�鐨勫悎鏍煎叆搴�

--
Gitblit v1.9.3