From 956481188a15a01b6c4372a47e95a6aca3100956 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期一, 16 三月 2026 13:07:20 +0800
Subject: [PATCH] refactor(production): 优化采购入库记录查询逻辑

---
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  127 ++++++++++++++++++++++++++++++------------
 1 files changed, 90 insertions(+), 37 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 cf80649..57fcc88 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -16,10 +16,13 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.procurementrecord.dto.Details;
+import com.ruoyi.procurementrecord.dto.ProcurementAddDto;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.controller.ProductWorkOrderController;
 import com.ruoyi.production.dto.ProductStructureDto;
@@ -45,6 +48,7 @@
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -71,6 +75,9 @@
     private ProcessRouteItemMapper processRouteItemMapper;
 
     private SalesLedgerProductMapper salesLedgerProductMapper;
+
+
+    private ProcurementRecordService procurementRecordService;
 
     private ProductModelMapper productModelMapper;
 
@@ -153,7 +160,25 @@
         productionProductMain.setStatus(0);
         productionProductMainMapper.insert(productionProductMain);
         /*鏂板鎶ュ伐鎶曞叆琛�*/
+        List<ProductStructureDto> allProcess = productStructureMapper.listBybomId(productProcessRoute.getBomId());
         List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
+
+        List<Long> lastProcessIds = new ArrayList<>();
+
+        if (!allProcess.isEmpty()) {
+            String lastProcessName = allProcess.get(allProcess.size() - 1).getProcessName();
+
+            for (int i = allProcess.size() - 1; i >= 0; i--) {
+                ProductStructureDto d = allProcess.get(i);
+
+                if (lastProcessName.equals(d.getProcessName())) {
+                    lastProcessIds.add(d.getId());
+                } else {
+                    break;
+                }
+            }
+        }
+
         if (productStructureDtos.size() == 0) {
             //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
             ProductStructureDto productStructureDto = new ProductStructureDto();
@@ -164,12 +189,20 @@
         for (ProductStructureDto productStructureDto : productStructureDtos) {
             ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
             Product product = productMapper.selectById(productModel1.getProductId());
+
+            // 鍒ゆ柇鏄惁涓烘渶鍚庝竴閬撳伐搴�
+            BigDecimal needQuantity = dto.getQuantity().divide(productStructureDto.getUnitQuantity(), 2, BigDecimal.ROUND_HALF_UP);
+            if (lastProcessIds.contains(productStructureDto.getId())) {
+                needQuantity = dto.getQuantity().multiply(productStructureDto.getUnitQuantity());
+            }
+
+
             // 鏌ヨ浜у搧搴撳瓨
             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) {
+            if (stockQuantity.compareTo(needQuantity) < 0) {
                 throw new RuntimeException(product.getProductName()+"浜у搧鐨�"+productModel1.getModel() + "鐨勮鏍煎簱瀛樹笉瓒�");
             }
             // 鏌ヨ閲囪喘浜у搧
@@ -179,7 +212,7 @@
 
             ProductionProductInput productionProductInput = new ProductionProductInput();
             productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
+            productionProductInput.setQuantity(needQuantity);
             productionProductInput.setProductMainId(productionProductMain.getId());
             productionProductInputMapper.insert(productionProductInput);
             //瀵瑰簲鐨勫簱瀛樺嚭搴�
@@ -188,11 +221,15 @@
             ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
             Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS" + dateFormat.format(now))[1]);
             // 鏌ヨ閲囪喘鍏ュ簱璁板綍
-            List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(new LambdaQueryWrapper<ProcurementRecordStorage>()
-                    .in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream()
-                            .map(SalesLedgerProduct::getId)
-                            .collect(Collectors.toList()))
-                    .orderByDesc(ProcurementRecordStorage::getInboundNum));
+            LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            if (!org.springframework.util.CollectionUtils.isEmpty(salesLedgerProducts)) {
+                procurementRecordStorageLambdaQueryWrapper.in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream()
+                        .map(SalesLedgerProduct::getId)
+                        .collect(Collectors.toList()));
+            }
+
+            procurementRecordStorageLambdaQueryWrapper.orderByDesc(ProcurementRecordStorage::getInboundNum);
+            List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
             if(CollectionUtils.isNotEmpty(procurementRecordStorages)) {
                 // 鐢熶骇鎵i櫎閲囪喘搴撳瓨鍘熸枡
                 BigDecimal quantity = productionProductInput.getQuantity();
@@ -239,36 +276,52 @@
         productionProductOutputMapper.insert(productionProductOutput);
         //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
         List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
-        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
-            //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
-            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(2);  // 鍘绘帀鑷姩杩涘叆杩囩▼妫�楠岄�昏緫
-            qualityInspect.setProductMainId(productionProductMain.getId());
-            qualityInspect.setProductModelId(productModel.getId());
-            qualityInspectMapper.insert(qualityInspect);
-            List<QualityTestStandardBinding> qualityTestStandardBindings = qualityTestStandardBindingMapper.selectList(
-                    new LambdaQueryWrapper<QualityTestStandardBinding>()
-                            .eq(QualityTestStandardBinding::getProductId, product.getId()));
-            if (qualityTestStandardBindings.size()>0){
-                qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
-                                .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandardBindings.get(0).getTestStandardId()))
-                        .forEach(qualityTestStandardParam -> {
-                            QualityInspectParam param = new QualityInspectParam();
-                            BeanUtils.copyProperties(qualityTestStandardParam, param);
-                            param.setId(null);
-                            param.setInspectId(qualityInspect.getId());
-                            qualityInspectParamMapper.insert(param);
-                        });
-            }
-        }
+//        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
+//            //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
+//            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(2);  // 鍘绘帀鑷姩杩涘叆杩囩▼妫�楠岄�昏緫
+//            qualityInspect.setProductMainId(productionProductMain.getId());
+//            qualityInspect.setProductModelId(productModel.getId());
+//            qualityInspectMapper.insert(qualityInspect);
+//            List<QualityTestStandardBinding> qualityTestStandardBindings = qualityTestStandardBindingMapper.selectList(
+//                    new LambdaQueryWrapper<QualityTestStandardBinding>()
+//                            .eq(QualityTestStandardBinding::getProductId, product.getId()));
+//            if (qualityTestStandardBindings.size()>0){
+//                qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+//                                .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandardBindings.get(0).getTestStandardId()))
+//                        .forEach(qualityTestStandardParam -> {
+//                            QualityInspectParam param = new QualityInspectParam();
+//                            BeanUtils.copyProperties(qualityTestStandardParam, param);
+//                            param.setId(null);
+//                            param.setInspectId(qualityInspect.getId());
+//                            qualityInspectParamMapper.insert(param);
+//                        });
+//            }
+//        }
+
+        ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
+        procurementRecordOutAdd.setType(2);
+        procurementRecordOutAdd.setTypeName("鐢熶骇鍑哄巶妫�楠屽悎鏍煎叆搴�");
+        procurementRecordOutAdd.setNickName(SecurityUtils.getLoginUser().getNickName());
+        List<Details> details = new ArrayList<>();
+        Details details1 = new Details();
+        details1.setInboundQuantity(dto.getQuantity());
+        details1.setId(Math.toIntExact(productModel.getId()));
+//        details1.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice());
+//        details1.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice());
+        details1.setProductModelId(productModel.getId());
+        details.add(details1);
+        procurementRecordOutAdd.setDetails(details);
+//        procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId());
+        procurementRecordService.add(procurementRecordOutAdd);
 
         /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
         ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());

--
Gitblit v1.9.3