From 663120b055dfdced4a67ce1d4160ae8ca19b4190 Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期四, 12 三月 2026 18:04:21 +0800
Subject: [PATCH] 修改工单所需数量

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |   72 ++++++++++++++++++++++++++++-------
 1 files changed, 57 insertions(+), 15 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 270f256..08f431c 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,9 +5,10 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
@@ -19,19 +20,19 @@
 import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
@@ -70,6 +71,8 @@
     private ProductionProductOutputMapper productionProductOutputMapper;
     private ProductionProductInputMapper productionProductInputMapper;
     private QualityInspectMapper qualityInspectMapper;
+    private ProductBomMapper productBomMapper;
+    private ProductStructureMapper productStructureMapper;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -213,18 +216,18 @@
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
         if (salesLedgerProduct.getId() == null) {
             result = salesLedgerProductMapper.insert(salesLedgerProduct);
-            addProductionData(salesLedgerProduct);
+//            addProductionData(salesLedgerProduct,2);
         } else {
             //鏌ヨ鍘熸湰鐨勪骇鍝佸瀷鍙穒d
             salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
             result = salesLedgerProductMapper.updateById(salesLedgerProduct);
             /*鍒犻櫎瀵瑰簲鐨勭敓浜ф暟鎹苟閲嶆柊鏂板*/
-            deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
-            // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
-            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
-            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
-            salesLedgerProductionAccountingMapper.delete(reportWrapper);
-            addProductionData(salesLedgerProduct);
+//            deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
+//            // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
+//            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
+//            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
+//            salesLedgerProductionAccountingMapper.delete(reportWrapper);
+//            addProductionData(salesLedgerProduct,2);
         }
 
         // 濡傛灉鎻掑叆鎴栨洿鏂版垚鍔燂紝骞朵笖鏈� salesLedgerId锛屾墠缁х画鏇存柊涓昏〃閲戦
@@ -259,12 +262,21 @@
 
     /**
      * 鏂板鐢熶骇鏁版嵁
+     * @param salesLedgerProduct
+     * @param type 1=鐢熶骇 2=閿�鍞�
      */
+    @Transactional(rollbackFor = Exception.class)
     public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
+        // 鍥犱负鐢熶骇闇�姹傛敼鍔紝闇�瑕侀澶栫粰sales_ledger_product鏂板鏁版嵁锛宼ype锛�3
+        salesLedgerProduct.setType(3);
+        salesLedgerProduct.setRegister(SecurityUtils.getLoginUser().getNickName());
+        salesLedgerProduct.setRegisterDate(LocalDateTime.now());
+
+        salesLedgerProductMapper.insert(salesLedgerProduct);
         ProductOrder productOrder = new ProductOrder();
         productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
         productOrder.setProductModelId(salesLedgerProduct.getId());
-        productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
+        productOrder.setNpsNo(OrderUtils.countTodayByCreateTime(productOrderMapper, "SC"));
         productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
         productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
         productOrderMapper.insert(productOrder);
@@ -274,6 +286,13 @@
                 .orderByDesc(ProcessRoute::getCreateTime));
         if (processRoutes.size()>0){
             ProcessRoute processRoute = processRoutes.get(0);
+            // 鑾峰彇浜у搧bom淇℃伅
+            List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
+            if (salesLedgerProduct.getQuantity() == null) {
+                throw new RuntimeException("鏈�缁堢敓浜ф暟閲忎笉瀛樺湪");
+            }
+            Map<Long, BigDecimal> quantities = countWorkOrderNum(productStructureDtos, salesLedgerProduct.getQuantity());
+
             //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
             ProductProcessRoute productProcessRoute = new ProductProcessRoute();
             productProcessRoute.setProductModelId(processRoute.getProductModelId());
@@ -319,7 +338,7 @@
                     ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                     productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                     productWorkOrder.setProductOrderId(productOrder.getId());
-                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
+                    productWorkOrder.setPlanQuantity(quantities.get(processRouteItem.getProcessId()));
                     productWorkOrder.setWorkOrderNo(workOrderNoStr);
                     productWorkOrder.setStatus(1);
 
@@ -330,6 +349,29 @@
             productOrder.setRouteId(processRoute.getId());
             productOrderMapper.updateById(productOrder);
         }
+    }
+
+    /**
+     * 璁$畻宸ュ崟鏁伴噺
+     * productStructures bom淇℃伅
+     * quantity 闇�姹傛暟閲�
+     */
+    public Map<Long, BigDecimal> countWorkOrderNum(List<ProductStructureDto> productStructures, BigDecimal quantity) {
+        BigDecimal originalQuantity = quantity;
+        Map<Long, BigDecimal> resultMap = new HashMap<>();
+        resultMap.put(productStructures.get(productStructures.size() - 1).getProcessId(), quantity);
+        for (int i = productStructures.size() - 2; i >= 0; i--) {
+            ProductStructureDto productStructureDto = productStructures.get(i);
+            Assert.notNull(productStructureDto.getUnitQuantity(), "鍗曚綅浜у嚭鎵�闇�鏁伴噺涓嶅瓨鍦�");
+            if (productStructureDto.getMaterialType().equals("0")) {
+                quantity = quantity.multiply(productStructureDto.getUnitQuantity());
+                resultMap.put(productStructureDto.getProcessId(), quantity);
+            } else {
+                resultMap.put(productStructureDto.getProcessId(), originalQuantity.multiply(productStructureDto.getUnitQuantity()));
+            }
+
+        }
+        return resultMap;
     }
 
     /**
@@ -422,9 +464,9 @@
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
             if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
-                item.setStatusName("宸插畬鎴愪粯娆�");
+                item.setStatusName("宸插畬鎴愬洖娆�");
             }else{
-                item.setStatusName("鏈畬鎴愪粯娆�");
+                item.setStatusName("鏈畬鎴愬洖娆�");
             }
         });
         return salesLedgerProductDtoIPage;

--
Gitblit v1.9.3