From 2e71bdbcdf853bb35e68016b84f0254f7366bfeb Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期五, 24 四月 2026 11:14:28 +0800
Subject: [PATCH] 文件工具类变更

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |  351 ++++++++++++++++++++++++---------------------------------
 1 files changed, 149 insertions(+), 202 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 6c681b8..56cfbb0 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,14 +5,17 @@
 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.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.*;
-import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.pojo.ProductionAccount;
+import com.ruoyi.production.pojo.ProductionOperationTask;
+import com.ruoyi.production.pojo.ProductionOrder;
+import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.service.ProductionOrderService;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
@@ -23,13 +26,17 @@
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInventory;
+import com.ruoyi.technology.bean.vo.TechnologyBomStructureVo;
+import com.ruoyi.technology.mapper.TechnologyBomStructureMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
+import com.ruoyi.technology.pojo.TechnologyRouting;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -38,8 +45,12 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -50,40 +61,27 @@
  * @date 2025-05-08
  */
 @Service
-@AllArgsConstructor
+@RequiredArgsConstructor
 public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService {
 
-    private SalesLedgerProductMapper salesLedgerProductMapper;
-    private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-
-    private SalesLedgerMapper salesLedgerMapper;
-
-    private PurchaseLedgerMapper purchaseLedgerMapper;
-
-    private ProductOrderMapper productOrderMapper;
-
-    private ProcessRouteItemMapper processRouteItemMapper;
-
-    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
-
-    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
-
-    private ProcessRouteMapper processRouteMapper;
-    private ProductProcessRouteMapper productProcessRouteMapper;
-
-    private ProductWorkOrderMapper productWorkOrderMapper;
-    private ProductionProductMainMapper productionProductMainMapper;
-    private ProductionProductOutputMapper productionProductOutputMapper;
-    private ProductionProductInputMapper productionProductInputMapper;
-    private QualityInspectMapper qualityInspectMapper;
-    private ShippingInfoMapper shippingInfoMapper;
-
-    private StockUtils stockUtils;
-
-
-
-    @Autowired
-    private ProductStructureMapper productStructureMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final ProductionAccountMapper productionAccountMapper;
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final ProductionOrderMapper productionOrderMapper;
+    private final ProductionOperationTaskMapper productionOperationTaskMapper;
+    private final ProductionOrderService productionOrderService;
+    private final TechnologyRoutingMapper technologyRoutingMapper;
+    private final TechnologyBomStructureMapper technologyBomStructureMapper;
+    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+    private final ProductionProductMainMapper productionProductMainMapper;
+    private final ProductionProductOutputMapper productionProductOutputMapper;
+    private final ProductionProductInputMapper productionProductInputMapper;
+    private final QualityInspectMapper qualityInspectMapper;
+    private final ShippingInfoMapper shippingInfoMapper;
+    private final ShippingInfoServiceImpl shippingInfoService;
+    private final StockUtils stockUtils;
+    private final StockInventoryMapper stockInventoryMapper;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -107,6 +105,8 @@
                     item.setShippingDate(shippingInfo.getShippingDate());
                     item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                     item.setShippingStatus(shippingInfo.getStatus());
+                    item.setExpressCompany(shippingInfo.getExpressCompany());
+                    item.setExpressNumber(shippingInfo.getExpressNumber());
                 }
             });
             // 寮�绁�
@@ -152,6 +152,12 @@
         List<SalesLedgerProduct> deletedProducts = salesLedgerProductMapper.selectBatchIds(Arrays.asList(ids));
         if (deletedProducts.isEmpty()) {
             return 0; // 娌℃湁鍙垹闄ょ殑鏁版嵁
+        }
+        //鍒犻櫎鍙戣揣淇℃伅
+        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
+                .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids)));
+        if(!CollectionUtils.isEmpty(shippingInfos)){
+            shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
 
         // 鍙兘灞炰簬澶氫釜涓昏〃
@@ -202,6 +208,7 @@
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
         if (salesLedgerProduct.getId() == null) {
+            salesLedgerProduct.setRegisterDate(LocalDateTime.now());
             result = salesLedgerProductMapper.insert(salesLedgerProduct);
             addProductionData(salesLedgerProduct);
         } else {
@@ -211,9 +218,7 @@
             /*鍒犻櫎瀵瑰簲鐨勭敓浜ф暟鎹苟閲嶆柊鏂板*/
             deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
             // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
-            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
-            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
-            salesLedgerProductionAccountingMapper.delete(reportWrapper);
+
             addProductionData(salesLedgerProduct);
         }
 
@@ -251,74 +256,25 @@
      * 鏂板鐢熶骇鏁版嵁
      */
     public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
-        ProductOrder productOrder = new ProductOrder();
-        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);
+        ProductionOrder productionOrder = new ProductionOrder();
+        productionOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
+        productionOrder.setProductModelId(salesLedgerProduct.getProductModelId());
+        productionOrder.setSaleLedgerProductId(salesLedgerProduct.getId().intValue());
+        productionOrder.setNpsNo(generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))));
+        productionOrder.setQuantity(salesLedgerProduct.getQuantity());
+        productionOrder.setCompleteQuantity(BigDecimal.ZERO);
 
-        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) {
-                    // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
-                    QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
-                    queryWrapper.likeRight("work_order_no", datePrefix)
-                            .orderByDesc("work_order_no")
-                            .last("LIMIT 1");
-
-                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
-
-                    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 = 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);
+        TechnologyRouting routing = technologyRoutingMapper.selectOne(
+                new QueryWrapper<TechnologyRouting>().lambda()
+                        .eq(TechnologyRouting::getProductModelId, salesLedgerProduct.getProductModelId())
+                        .orderByDesc(TechnologyRouting::getCreateTime)
+                        .last("LIMIT 1"));
+        if (routing != null) {
+            productionOrder.setTechnologyRoutingId(routing.getId());
+        }
+        productionOrderMapper.insert(productionOrder);
+        if (productionOrder.getTechnologyRoutingId() != null) {
+            productionOrderService.syncProductionOrderSnapshot(productionOrder.getId());
         }
     }
 
@@ -326,84 +282,44 @@
      * 鍒犻櫎鐢熶骇鏁版嵁
      */
     public void deleteProductionData(List<Long> productIds) {
-        //鎵归噺鏌ヨproductOrder
-        List<ProductOrder> productOrders = productOrderMapper.selectList(
-                new LambdaQueryWrapper<ProductOrder>()
-                        .in(ProductOrder::getProductModelId, productIds)
-        );
-        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
-            List<Long> orderIds = productOrders.stream()
-                    .map(ProductOrder::getId)
-                    .collect(Collectors.toList());
-
-            // 鎵归噺鏌ヨprocessRouteItems
-            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
-                    new LambdaQueryWrapper<ProductProcessRouteItem>()
-                            .in(ProductProcessRouteItem::getProductOrderId, orderIds)
-            );
-
-            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) {
-                // 鑾峰彇瑕佸垹闄ょ殑宸ュ簭椤笽D
-                List<Long> routeItemIds = allRouteItems.stream()
-                        .map(ProductProcessRouteItem::getId)
-                        .collect(Collectors.toList());
-
-                // 鏌ヨ鍏宠仈鐨勫伐鍗旾D
-                List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList(
-                        new LambdaQueryWrapper<ProductWorkOrder>()
-                                .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)
-                );
-                if (!com.baomidou.mybatisplus.core.toolkit.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 (!com.baomidou.mybatisplus.core.toolkit.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);
+        List<ProductionOrder> productionOrders = productionOrderMapper.selectList(
+                new LambdaQueryWrapper<ProductionOrder>()
+                        .in(ProductionOrder::getSaleLedgerProductId, productIds.stream().map(Long::intValue).collect(Collectors.toList())));
+        if (org.springframework.util.CollectionUtils.isEmpty(productionOrders)) {
+            return;
+        }
+        List<Long> orderIds = productionOrders.stream().map(ProductionOrder::getId).collect(Collectors.toList());
+        List<Long> taskIds = productionOperationTaskMapper.selectList(
+                        new LambdaQueryWrapper<ProductionOperationTask>()
+                                .in(ProductionOperationTask::getProductionOrderId, orderIds))
+                .stream().map(ProductionOperationTask::getId).collect(Collectors.toList());
+        if (!taskIds.isEmpty()) {
+            List<ProductionProductMain> productMains = productionProductMainMapper.selectList(
+                    new LambdaQueryWrapper<ProductionProductMain>()
+                            .in(ProductionProductMain::getProductionOperationTaskId, taskIds));
+            List<Long> productMainIds = productMains.stream().map(ProductionProductMain::getId).collect(Collectors.toList());
+            if (!productMainIds.isEmpty()) {
+                List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+                        new LambdaQueryWrapper<QualityInspect>().in(QualityInspect::getProductMainId, productMainIds));
+                qualityInspects.forEach(qualityInspect -> {
+                    if (qualityInspect.getInspectState() == 1) {
+                        throw new RuntimeException("宸叉彁浜ょ殑妫�楠屽崟涓嶈兘鍒犻櫎");
                     }
-
-                    // 鍒犻櫎鐢熶骇涓昏〃鏁版嵁
-                    productionProductMainMapper.deleteByWorkOrderIds(workOrderIds);
-
-                    // 鍒犻櫎宸ュ崟鏁版嵁
-                    productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
-                            .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+                });
+                productionProductOutputMapper.deleteByProductMainIds(productMainIds);
+                productionProductInputMapper.deleteByProductMainIds(productMainIds);
+                qualityInspectMapper.deleteByProductMainIds(productMainIds);
+                productionAccountMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+                        .in(ProductionAccount::getProductionProductMainId, productMainIds));
+                for (Long productMainId : productMainIds) {
+                    stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                    stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                 }
             }
-            // 鎵归噺鍒犻櫎processRouteItem
-            productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
-                    .in(ProductProcessRouteItem::getProductOrderId, orderIds));
-
-            // 鎵归噺鍒犻櫎productProcessRoute
-            productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
-                    .in(ProductProcessRoute::getProductOrderId, orderIds));
-
-            // 鎵归噺鍒犻櫎productOrder
-            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
-                    .in(ProductOrder::getProductModelId, productIds));
+            productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>()
+                    .in(ProductionProductMain::getProductionOperationTaskId, taskIds));
         }
+        productionOrderService.removeProductionOrder(orderIds);
     }
 
     @Override
@@ -425,7 +341,7 @@
         IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct);
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
-            if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
+            if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){
                 item.setStatusName("宸插畬鎴愪粯娆�");
             }else{
                 item.setStatusName("鏈畬鎴愪粯娆�");
@@ -470,36 +386,67 @@
     }
     @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"));
-        if (processRoute == null) {
+        TechnologyRouting routing = technologyRoutingMapper.selectOne(
+                new QueryWrapper<TechnologyRouting>().lambda()
+                        .eq(TechnologyRouting::getProductModelId, salesLedgerProduct.getProductModelId())
+                        .orderByDesc(TechnologyRouting::getCreateTime)
+                        .last("LIMIT 1"));
+        if (routing == null) {
             return R.fail("璇峰厛璁剧疆宸ヨ壓璺嚎");
         }
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
-        if (productStructureDtos.isEmpty()) {
+        List<TechnologyBomStructureVo> structureList = technologyBomStructureMapper.listByBomId(routing.getBomId().longValue());
+        if (structureList == null || structureList.isEmpty()) {
             return R.fail("璇峰厛璁剧疆浜у搧缁撴瀯");
         }
         int count = 0;
         StringBuilder stringBuffer = new StringBuilder();
-        for (ProductStructureDto productStructureDto : productStructureDtos) {
-            BigDecimal stockQuantity = stockUtils.getStockQuantity(productStructureDto.getProductModelId()).get("stockQuantity");
-            //鎵�闇�鏁伴噺
-            BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
-            BigDecimal subtract =stockQuantity.subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
-            if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
+        for (TechnologyBomStructureVo structure : structureList) {
+            if (structure.getParentId() == null) {
+                continue;
+            }
+            StockInventory stockInventory = stockInventoryMapper.selectOne(
+                    new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, structure.getProductModelId()));
+            if (stockInventory == null) {
                 count++;
-                stringBuffer.append(productStructureDto.getProductName())
+                stringBuffer.append(structure.getProductName()).append("-").append(structure.getModel()).append("搴撳瓨涓嶈冻").append(System.lineSeparator());
+                continue;
+            }
+            BigDecimal required = salesLedgerProduct.getQuantity().multiply(structure.getUnitQuantity() == null ? BigDecimal.ZERO : structure.getUnitQuantity());
+            BigDecimal remain = stockInventory.getQualitity()
+                    .subtract(stockInventory.getLockedQuantity())
+                    .subtract(required)
+                    .divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
+            if (remain.compareTo(BigDecimal.ZERO) < 0) {
+                count++;
+                stringBuffer.append(structure.getProductName())
                         .append("-")
-                        .append(productStructureDto.getModel())
+                        .append(structure.getModel())
                         .append("搴撳瓨涓嶈冻锛屽皯")
-                        .append(subtract)
+                        .append(remain.abs())
                         .append(System.lineSeparator());
             }
         }
-        if (count>0) {
+        if (count > 0) {
             return R.fail(stringBuffer.toString());
-        }else {
-            return R.ok();
         }
+        return R.ok();
+    }
+
+    private String generateNextOrderNo(String datePrefix) {
+        QueryWrapper<ProductionOrder> queryWrapper = new QueryWrapper<>();
+        queryWrapper.likeRight("nps_no", "SC" + datePrefix);
+        queryWrapper.orderByDesc("nps_no");
+        queryWrapper.last("LIMIT 1");
+        ProductionOrder latestOrder = productionOrderMapper.selectOne(queryWrapper);
+        int sequence = 1;
+        if (latestOrder != null && latestOrder.getNpsNo() != null && !latestOrder.getNpsNo().isEmpty()) {
+            String sequenceStr = latestOrder.getNpsNo().substring(("SC" + datePrefix).length());
+            try {
+                sequence = Integer.parseInt(sequenceStr) + 1;
+            } catch (NumberFormatException e) {
+                sequence = 1;
+            }
+        }
+        return "SC" + datePrefix + String.format("%04d", sequence);
     }
 }

--
Gitblit v1.9.3