From b3c9b97decc88be244995cd37ba70a3d04982d2b Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 23 四月 2026 15:07:36 +0800
Subject: [PATCH] fix:报工投入

---
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                   |    3 +
 src/main/resources/mapper/production/ProductionProductInputMapper.xml                 |    1 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   36 +++++++++---------
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java              |    3 -
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |   33 ++++++++++++++++
 5 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index 82bece9..e2ace30 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -23,6 +23,9 @@
     @ApiModelProperty(value = "鏁伴噺")
     private BigDecimal quantity;
 
+    @ApiModelProperty(value = "batchNo")
+    private String batchNo;
+
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
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 84b382b..b2ab1ce 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -18,6 +18,7 @@
 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;
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -175,23 +176,22 @@
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
         /*鏂板鎶ュ伐鎶曞叆琛�*/
-//        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-//        if (productStructureDtos.isEmpty()) {
-//            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
-//            ProductStructureDto productStructureDto = new ProductStructureDto();
-//            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
-//            productStructureDto.setUnitQuantity(BigDecimal.ONE);
-//            productStructureDtos.add(productStructureDto);
-//        }
-//        for (ProductStructureDto productStructureDto : productStructureDtos) {
-//            System.out.println(productStructureDto.getProductModelId());
-//            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(),dto.getBatchNo());
-//        }
+        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
+        if (productStructureDtos.isEmpty()) {
+            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭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(), null);
+        }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
         productionProductOutput.setProductMainId(productionProductMain.getId());
@@ -448,4 +448,4 @@
         
         return productionProductMainDtos;
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 34b6963..4154682 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -6,7 +6,6 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
@@ -61,7 +60,7 @@
 
         int insertRows = stockInRecordMapper.insert(stockInRecord);
 
-        Long insertId = stockInRecord.getId(); // 鏇挎崲涓轰綘鐨勫疄闄呬富閿瓧娈碉細getRecordId()/getInboundId() 绛�
+        Long insertId = stockInRecord.getId();
 
         return insertRows > 0 ? insertId : null;
     }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 13968cb..72fc3fa 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -37,6 +37,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
@@ -251,6 +252,38 @@
         stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockOutRecordDto.setType("0");
         stockOutRecordService.add(stockOutRecordDto);
+        if (ObjectUtils.isEmpty(stockInventoryDto.getBatchNo())) {
+            List<StockInventory> stockInventories = stockInventoryMapper.selectList(new QueryWrapper<StockInventory>().lambda()
+                    .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+                    .orderByAsc(StockInventory::getId));
+            if (ObjectUtils.isEmpty(stockInventories)) {
+                throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
+            }
+
+            BigDecimal remainingQty = stockInventoryDto.getQualitity();
+            for (StockInventory stockInventory : stockInventories) {
+                BigDecimal lockedQty = stockInventory.getLockedQuantity() == null ? BigDecimal.ZERO : stockInventory.getLockedQuantity();
+                BigDecimal availableQty = stockInventory.getQualitity().subtract(lockedQty);
+                if (availableQty.compareTo(BigDecimal.ZERO) <= 0) {
+                    continue;
+                }
+
+                BigDecimal deductQty = remainingQty.min(availableQty);
+                stockInventory.setQualitity(stockInventory.getQualitity().subtract(deductQty));
+                stockInventory.setVersion(stockInventory.getVersion() == null ? 1 : stockInventory.getVersion() + 1);
+                stockInventory.setUpdateTime(LocalDateTime.now());
+                stockInventoryMapper.updateById(stockInventory);
+
+                remainingQty = remainingQty.subtract(deductQty);
+                if (remainingQty.compareTo(BigDecimal.ZERO) <= 0) {
+                    return true;
+                }
+            }
+
+            ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
+            Product product = productMapper.selectById(productModel.getProductId());
+            throw new RuntimeException(product.getProductName() + "/" + productModel.getModel() + "搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
+        }
         StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
                 .eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()));
         if (ObjectUtils.isEmpty(oldStockInventory)) {
diff --git a/src/main/resources/mapper/production/ProductionProductInputMapper.xml b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
index 3eb9bda..35691be 100644
--- a/src/main/resources/mapper/production/ProductionProductInputMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -7,6 +7,7 @@
         <result property="productMainId" column="product_main_id"/>
         <result property="productModelId" column="product_model_id"/>
         <result property="quantity" column="quantity"/>
+        <result property="batchNo" column="batch_no"/>
         <result property="tenantId" column="tenant_id"/>
         <result property="createTime" column="create_time"/>
     </resultMap>

--
Gitblit v1.9.3