From 352a6420c3241955abd26aaaad997fdc65ffdb3a Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 26 三月 2026 14:27:32 +0800
Subject: [PATCH] feat: 销售订单绑定工艺路线

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |   74 ++++++++++++++++++++++++++++++++++++
 1 files changed, 73 insertions(+), 1 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 570b2f5..991d011 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -15,6 +15,7 @@
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.SaleEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.EnumUtil;
@@ -26,6 +27,8 @@
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.pojo.ProcessRoute;
+import com.ruoyi.production.pojo.ProcessRouteItem;
 import com.ruoyi.production.service.ProductionProductMainService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
@@ -37,6 +40,9 @@
 import com.ruoyi.sales.dto.*;
 import com.ruoyi.sales.mapper.*;
 import com.ruoyi.sales.pojo.*;
+import com.ruoyi.sales.service.ISalesLedgerProcessRouteService;
+import com.ruoyi.sales.service.ISalesLedgerProductProcessBindService;
+import com.ruoyi.sales.service.ISalesLedgerProductProcessService;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -110,6 +116,13 @@
     private final ProductionProductInputMapper productionProductInputMapper;
     private final QualityInspectMapper qualityInspectMapper;
     private final RedisTemplate<String, String> redisTemplate;
+
+    private final ISalesLedgerProductProcessService salesLedgerProductProcessService;
+
+    private final ISalesLedgerProductProcessBindService salesLedgerProductProcessBindService;
+
+    private final ISalesLedgerProcessRouteService salesLedgerProcessRouteService;
+
     @Autowired
     private SysDeptMapper sysDeptMapper;
     @Value("${file.upload-dir}")
@@ -154,7 +167,7 @@
             // 鏌ヨ閫�璐т俊鎭�
             List<Long> productIds = salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList());
             List<SimpleReturnOrderGroupDto> groupListByProductIds = new ArrayList<>();
-            if(CollectionUtils.isNotEmpty(productIds)){
+            if (CollectionUtils.isNotEmpty(productIds)) {
                 groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
             }
             Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getSalesLedgerProductId, SimpleReturnOrderGroupDto::getSumReturnQuantity));
@@ -194,6 +207,23 @@
                     .last("limit 1"));
             if (shippingInfo != null) {
                 product.setShippingStatus(shippingInfo.getStatus());
+            }
+            // 鍔犲伐鏄庣粏锛屽厛鏌ind琛ㄨ幏鍙栬浜у搧鍏宠仈鐨勫伐搴忓強鏁伴噺
+            List<SalesLedgerProductProcessBind> bindList = salesLedgerProductProcessBindService.list(
+                    new LambdaQueryWrapper<SalesLedgerProductProcessBind>()
+                            .eq(SalesLedgerProductProcessBind::getSalesLedgerProductId, product.getId()));
+            if (!bindList.isEmpty()) {
+                List<Integer> processIds = bindList.stream()
+                        .map(SalesLedgerProductProcessBind::getSalesLedgerProductProcessId)
+                        .collect(Collectors.toList());
+                Map<Integer, Integer> processQuantityMap = bindList.stream()
+                        .collect(Collectors.toMap(
+                                SalesLedgerProductProcessBind::getSalesLedgerProductProcessId,
+                                SalesLedgerProductProcessBind::getQuantity,
+                                (a, b) -> a));
+                List<SalesLedgerProductProcess> processList = salesLedgerProductProcessService.listByIds(processIds);
+                processList.forEach(p -> p.setQuantity(processQuantityMap.get(p.getId())));
+                product.setSalesProductProcessList(processList);
             }
         }
 
@@ -479,6 +509,8 @@
                         .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
                         .orderByDesc(ShippingInfo::getCreateTime)
                         .last("limit 1"));
+                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                product.setShippingDate(shippingInfo.getShippingDate());
                 if (shippingInfo != null) {
                     product.setShippingStatus(shippingInfo.getStatus());
                 }
@@ -493,6 +525,38 @@
 
 
         return salesLedgerDtoIPage;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saleProcessBind(SalesLedgerProcessRoute salesLedgerProcessRoute) {
+        if (salesLedgerProcessRoute == null) {
+            throw new ServiceException("缁戝畾澶辫触,鏁版嵁涓嶈兘涓虹┖");
+        }
+
+        SalesLedger salesLedger = baseMapper.selectById(salesLedgerProcessRoute.getSalesLedgerId());
+        if (salesLedger == null) {
+            throw new ServiceException("缁戝畾澶辫触,閿�鍞鍗曚笉瀛樺湪");
+        }
+        ProcessRoute processRoute = processRouteMapper.selectById(salesLedgerProcessRoute.getProcessRouteId());
+        if (processRoute == null) {
+            throw new ServiceException("缁戝畾澶辫触,宸ヨ壓璺嚎涓嶅瓨鍦�");
+        }
+        //  娓呴櫎宸茬粦瀹氱殑鏁版嵁
+        salesLedgerProcessRouteService.remove(new LambdaQueryWrapper<SalesLedgerProcessRoute>().eq(SalesLedgerProcessRoute::getSalesLedgerId, salesLedger.getId()).eq(SalesLedgerProcessRoute::getProcessRouteId, processRoute.getId()));
+
+        //  灏嗘暟鎹縼绉诲埌sales_ledger_process_route
+        List<ProcessRouteItem> routeItems = processRouteItemMapper.selectList(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
+        SalesLedgerProcessRoute ledgerProcessRoute;
+        List<SalesLedgerProcessRoute> salesLedgerProcessRouteList = new ArrayList<>();
+        for (ProcessRouteItem routeItem : routeItems) {
+            ledgerProcessRoute = new SalesLedgerProcessRoute();
+            ledgerProcessRoute.setProcessRouteId(processRoute.getId());
+            ledgerProcessRoute.setSalesLedgerId(salesLedger.getId());
+            ledgerProcessRoute.setProcessRouteItemId(routeItem.getId());
+            salesLedgerProcessRouteList.add(ledgerProcessRoute);
+        }
+        salesLedgerProcessRouteService.saveBatch(salesLedgerProcessRouteList);
     }
 
     /**
@@ -542,6 +606,9 @@
         if (!productIds.isEmpty()) {
             salesLedgerProductMapper.deleteBatchIds(productIds);
         }
+
+        //  娓呴櫎浜у搧鐨勫姞宸�
+        salesLedgerProductProcessBindService.remove(new LambdaQueryWrapper<SalesLedgerProductProcessBind>().in(SalesLedgerProductProcessBind::getSalesLedgerProductId, productIds));
 
         LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
@@ -725,6 +792,8 @@
             for (SalesLedgerProduct product : updateList) {
                 product.setType(type.getCode());
                 salesLedgerProductMapper.updateById(product);
+                //  娓呯┖閿�鍞骇鍝佺粦瀹氱殑鍔犲伐
+                salesLedgerProductProcessBindService.updateProductProcessBind(product.getSalesProductProcessList(), product.getId());
             }
         }
         // 鎵ц鎻掑叆鎿嶄綔
@@ -735,6 +804,9 @@
                 salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
+                //  缁戝畾浜у搧棰濆鍔犲伐
+                //  娓呯┖閿�鍞骇鍝佺粦瀹氱殑鍔犲伐
+                salesLedgerProductProcessBindService.updateProductProcessBind(salesLedgerProduct.getSalesProductProcessList(), salesLedgerProduct.getId());
                 // 娣诲姞鐢熶骇鏁版嵁
                 salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
             }

--
Gitblit v1.9.3