From 6ad5c2cdc193cf7bb02884961b7434cd7f607a0d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 16 四月 2026 10:48:09 +0800
Subject: [PATCH] feat(production): 扩展生产工艺路线支持多产品绑定及工单权限控制

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |  159 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 101 insertions(+), 58 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 68b52cb..82fcdba 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,6 +6,10 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.ProductMapper;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.Product;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
@@ -62,6 +66,10 @@
     private SalesLedgerMapper salesLedgerMapper;
 
     private PurchaseLedgerMapper purchaseLedgerMapper;
+
+    private ProductMapper productMapper;
+
+    private ProductModelMapper productModelMapper;
 
     private ProductOrderMapper productOrderMapper;
 
@@ -263,74 +271,103 @@
     }
 
     /**
+     * 閫氳繃浜у搧澶х被锛岃鏍煎瀷鍙锋煡璇roductModelId
+     */
+    public Long getProductModelId(String productCategory, String productSpecification) {
+        Product product = productMapper.selectOne(new QueryWrapper<Product>()
+                .lambda()
+                .eq(Product::getProductName, productCategory)
+                .orderByDesc(Product::getId)
+                .last("LIMIT 1"));
+        if(product == null){
+            throw new RuntimeException("璇峰厛娣诲姞浜у搧");
+        }
+        ProductModel productModel = productModelMapper.selectOne(new QueryWrapper<ProductModel>()
+                .lambda()
+                .eq(ProductModel::getProductId, product.getId())
+                .eq(ProductModel::getModel, productSpecification)
+                .orderByDesc(ProductModel::getId)
+                .last("LIMIT 1"));
+        return productModel == null ? null : productModel.getId();
+    }
+
+    /**
      * 鏂板鐢熶骇鏁版嵁
      */
     public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
         ProductOrder productOrder = new ProductOrder();
         productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
-        productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
+        if(salesLedgerProduct.getProductModelId() == null){
+            Long productModelId = getProductModelId(salesLedgerProduct.getProductCategory(), salesLedgerProduct.getSpecificationModel());
+            productOrder.setProductModelId(productModelId);
+        }else{
+            productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
+        }
         productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
         String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
         productOrder.setNpsNo(string);
         productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
         productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
         productOrderMapper.insert(productOrder);
-
-        List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
-                .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
-                .orderByDesc(ProcessRoute::getCreateTime));
-        if (processRoutes.size()>0){
-            ProcessRoute processRoute = processRoutes.get(0);
-            //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
-            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"));
-            for (ProcessRouteItem processRouteItem : processRouteItems) {
-                ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
-                productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
-                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
-                productProcessRouteItem.setProductOrderId(productOrder.getId());
-                productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
-                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
-                int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
-                if (insert > 0) {
-                    // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
-                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
-                    int sequenceNumber = 1; // 榛樿搴忓彿
-                    if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
-                        String lastNo = lastWorkOrder.getWorkOrderNo().toString();
-                        if (lastNo.startsWith(datePrefix)) {
-                            String seqStr = lastNo.substring(datePrefix.length());
-                            try {
-                                sequenceNumber = Integer.parseInt(seqStr) + 1;
-                            } catch (NumberFormatException e) {
-                                sequenceNumber = 1;
-                            }
-                        }
-                    }
-                    // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
-                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
-                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
-                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
-                    productWorkOrder.setProductOrderId(productOrder.getId());
-                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
-                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
-                    productWorkOrder.setStatus(1);
-
-                    productWorkOrderMapper.insert(productWorkOrder);
-                }
-
-            }
-            productOrder.setRouteId(processRoute.getId());
-            productOrderMapper.updateById(productOrder);
-        }
+        // 鍙栨秷榛樿鐨勫伐鑹鸿矾绾�
+//        List<ProcessRoute> processRoutes = processRouteMapper.selectList(
+//                new QueryWrapper<ProcessRoute>()
+//                        .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
+//                                .or()
+//                                .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
+//                        .orderByDesc("create_time"));
+//        if (processRoutes.size()>0){
+//            ProcessRoute processRoute = processRoutes.get(0);
+//            //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+//            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+//            productProcessRoute.setProductModelId(salesLedgerProduct.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"));
+//            for (ProcessRouteItem processRouteItem : processRouteItems) {
+//                ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
+//                productProcessRouteItem.setProductModelId(salesLedgerProduct.getProductModelId());
+//                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+//                productProcessRouteItem.setProductOrderId(productOrder.getId());
+//                productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
+//                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
+//                int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+//                if (insert > 0) {
+//                    // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+//                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
+//                    int sequenceNumber = 1; // 榛樿搴忓彿
+//                    if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
+//                        String lastNo = lastWorkOrder.getWorkOrderNo().toString();
+//                        if (lastNo.startsWith(datePrefix)) {
+//                            String seqStr = lastNo.substring(datePrefix.length());
+//                            try {
+//                                sequenceNumber = Integer.parseInt(seqStr) + 1;
+//                            } catch (NumberFormatException e) {
+//                                sequenceNumber = 1;
+//                            }
+//                        }
+//                    }
+//                    // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
+//                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
+//                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+//                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+//                    productWorkOrder.setProductOrderId(productOrder.getId());
+//                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
+//                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
+//                    productWorkOrder.setStatus(1);
+//
+//                    productWorkOrderMapper.insert(productWorkOrder);
+//                }
+//
+//            }
+//            productOrder.setRouteId(processRoute.getId());
+//            productOrderMapper.updateById(productOrder);
+//        }
     }
 
     /**
@@ -491,7 +528,13 @@
     @Override
     public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
         //鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
-        ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()).orderByDesc(ProcessRoute::getCreateTime).last("LIMIT 1"));
+        ProcessRoute processRoute = processRouteMapper.selectOne(
+                new QueryWrapper<ProcessRoute>()
+                        .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
+                                .or()
+                                .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
+                        .orderByDesc("create_time")
+                        .last("LIMIT 1"));
         if (processRoute == null) {
             return R.fail("璇峰厛璁剧疆宸ヨ壓璺嚎");
         }

--
Gitblit v1.9.3