From 3d4cb4fafdee76f0dc2f895f21a37bfa0f638c6a Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 16 一月 2026 15:09:50 +0800
Subject: [PATCH] 生产报工的新增和删除已经投入产出

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |  122 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 107 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 6517eaa..1dadd18 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -12,17 +12,22 @@
 import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.sales.dto.MonthlyAmountDto;
 import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.mapper.*;
@@ -94,12 +99,21 @@
     private final ProductOrderMapper productOrderMapper;
 
     private final ProcessRouteMapper processRouteMapper;
+    private final ProductProcessRouteMapper productProcessRouteMapper;
 
     private final ProcessRouteItemMapper processRouteItemMapper;
 
     private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
 
     private final ProductWorkOrderMapper productWorkOrderMapper;
+
+    private final ProductionProductMainMapper productionProductMainMapper;
+
+    private final ProductionProductOutputMapper productionProductOutputMapper;
+
+    private final ProductionProductInputMapper productionProductInputMapper;
+
+    private final QualityInspectMapper qualityInspectMapper;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -112,6 +126,10 @@
     private static final long LOCK_EXPIRE_TIME = 30;  // 閿佽嚜鍔ㄨ繃鏈熸椂闂达紙绉掞級
 
     private final RedisTemplate<String, String> redisTemplate;
+    @Autowired
+    private ProductModelMapper productModelMapper;
+    @Autowired
+    private ProductStructureMapper productStructureMapper;
 
     @Override
     public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -367,15 +385,19 @@
             return 0;
         }
         // 鍒犻櫎閿�鍞鐞嗘暟鎹�
-        // 1. 鍏堝垹闄ゅ瓙琛ㄦ暟鎹�
-        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
-        productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList);
-        salesLedgerProductMapper.delete(productWrapper);
+        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList)
+                .select(SalesLedgerProduct::getId);
+
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(queryWrapper);
+        List<Long> productIds = products.stream()
+                .map(SalesLedgerProduct::getId)
+                .collect(Collectors.toList());
 
         //鎵归噺鏌ヨproductOrder
         List<ProductOrder> productOrders = productOrderMapper.selectList(
                 new LambdaQueryWrapper<ProductOrder>()
-                        .in(ProductOrder::getProductModelId, idList)
+                        .in(ProductOrder::getProductModelId, productIds)
         );
 
         if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
@@ -386,26 +408,75 @@
             // 鎵归噺鏌ヨprocessRouteItems
             List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
                     new LambdaQueryWrapper<ProductProcessRouteItem>()
-                            .in(ProductProcessRouteItem::getRouteId, orderIds)
+                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
             );
 
-            if (!org.springframework.util.CollectionUtils.isEmpty(allRouteItems)) {
+            if (!CollectionUtils.isEmpty(allRouteItems)) {
+                // 鑾峰彇瑕佸垹闄ょ殑宸ュ簭椤笽D
                 List<Long> routeItemIds = allRouteItems.stream()
                         .map(ProductProcessRouteItem::getId)
                         .collect(Collectors.toList());
 
-                // 鎵归噺鍒犻櫎workOrder
-                productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
-                        .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
-            }
+                // 鏌ヨ鍏宠仈鐨勫伐鍗旾D
+                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
+                        new LambdaQueryWrapper<ProductWorkOrder>()
+                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
+                );
+                if (!CollectionUtils.isEmpty(workOrders)) {
+                    List<Long> workOrderIds = workOrders.stream()
+                            .map(ProductWorkOrder::getId)
+                            .collect(Collectors.toList());
 
+                    // 鏌ヨ鍏宠仈鐨勭敓浜т富琛↖D
+                    List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
+                            new LambdaQueryWrapper<ProductionProductMain>()
+                                    .in(ProductionProductMain::getWorkOrderId, workOrderIds)
+                    );
+                    List<Long> productMainIds = productMains.stream()
+                            .map(ProductionProductMain::getId)
+                            .collect(Collectors.toList());
+
+                    // 鍒犻櫎浜у嚭琛ㄣ�佹姇鍏ヨ〃鏁版嵁
+                    if (!CollectionUtils.isEmpty(productMainIds)) {
+                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
+                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
+                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+                                new LambdaQueryWrapper<QualityInspect>()
+                                        .in(QualityInspect::getProductMainId, productMainIds)
+                        );
+                        qualityInspects.forEach(qualityInspect -> {
+                            //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
+                            if(qualityInspect.getInspectState() == 1){
+                                throw new RuntimeException("宸叉彁浜ょ殑妫�楠屽崟涓嶈兘鍒犻櫎");
+                            }
+                        });
+                        qualityInspectMapper.deleteByProductMainIds(productMainIds);
+                    }
+
+                    // 鍒犻櫎鐢熶骇涓昏〃鏁版嵁
+                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
+
+                    // 鍒犻櫎宸ュ崟鏁版嵁
+                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+                }
+            }
             // 鎵归噺鍒犻櫎processRouteItem
             productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
-                    .in(ProductProcessRouteItem::getRouteId, orderIds));
+                    .in(ProductProcessRouteItem::getProductOrderId, orderIds));
+
+            // 鎵归噺鍒犻櫎productProcessRoute
+            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
+                    .in(ProductProcessRoute::getProductOrderId, orderIds));
 
             // 鎵归噺鍒犻櫎productOrder
             productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
-                    .in(ProductOrder::getProductModelId, idList));
+                    .in(ProductOrder::getProductModelId, productIds));
+        }
+
+        // 鎵归噺鍒犻櫎浜у搧瀛愯〃
+        if (!productIds.isEmpty()) {
+            salesLedgerProductMapper.deleteBatchIds(productIds);
         }
 
         LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
@@ -431,7 +502,6 @@
             wrapperTree.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgerIds);
             receiptPaymentMapper.delete(wrapperTree);
         }
-
 
         // 鍒犻櫎鐢熶骇绠℃帶鏁版嵁
         // 鍒犻櫎鐢熶骇璁㈠崟鏁版嵁
@@ -628,10 +698,21 @@
                 productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
                 productOrder.setProductModelId(salesLedgerProduct.getId());
                 productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
+                productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
+                productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
                 productOrderMapper.insert(productOrder);
 
                 ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
+                List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
                 if (processRoute != null) {
+                    //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+                    ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+                    productProcessRoute.setProductModelId(processRoute.getProductModelId());
+                    productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+                    productProcessRoute.setProductOrderId(productOrder.getId());
+                    productProcessRoute.setBomId(processRoute.getBomId());
+                    productProcessRouteMapper.insert(productProcessRoute);
+                    //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎瀛愯〃
                     List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
                     // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
                     String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
@@ -639,7 +720,9 @@
                         ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                         productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                         productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
-                        productProcessRouteItem.setRouteId(productOrder.getId());
+                        productProcessRouteItem.setProductOrderId(productOrder.getId());
+                        productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
+                        productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
                         int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                         if (insert > 0) {
                             // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
@@ -665,7 +748,16 @@
                             // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
                             String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
                             ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+                            productStructureDtos.stream().forEach(productStructureDto -> {
+                                if (productStructureDto.getProductModelId().equals(productProcessRouteItem.getProductModelId())){
+                                    productWorkOrder.setPlanQuantity(productWorkOrder.getPlanQuantity());
+                                }
+                            });
+                            if (Objects.equals(productProcessRouteItem.getProductModelId(), salesLedgerProduct.getProductModelId())) {
+                                productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
+                            }
                             productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+                            productWorkOrder.setProductOrderId(productOrder.getId());
                             productWorkOrder.setWorkOrderNo(workOrderNoStr);
                             productWorkOrder.setStatus(1);
                             productWorkOrderMapper.insert(productWorkOrder);

--
Gitblit v1.9.3