From 6d3a76f894052209cad136ec9bff6ddcd43fc4e7 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 20 四月 2026 17:55:48 +0800
Subject: [PATCH] feat: 扫码时做限制,若采购台账已全部质检入库,APP扫码 入库时提示已入库。并且联动质检

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |  319 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 258 insertions(+), 61 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 f6d6b27..2afc5dc 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,18 +5,21 @@
 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.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 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.service.impl.SalesLedgerProductionAccountingServiceImpl;
+import com.ruoyi.production.service.impl.ProductOrderServiceImpl;
+import com.ruoyi.purchase.dto.SimpleReturnOrderGroupDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
@@ -26,12 +29,13 @@
 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.pojo.*;
+import com.ruoyi.sales.service.ISalesLedgerProductProcessBindService;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
+import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockInventory;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,6 +69,7 @@
     private SalesLedgerMapper salesLedgerMapper;
 
     private PurchaseLedgerMapper purchaseLedgerMapper;
+    private PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
 
     private ProductOrderMapper productOrderMapper;
 
@@ -76,6 +81,7 @@
 
     private ProcessRouteMapper processRouteMapper;
     private ProductProcessRouteMapper productProcessRouteMapper;
+    private ProductModelMapper productModelMapper;
 
     private ProductWorkOrderMapper productWorkOrderMapper;
     private ProductionProductMainMapper productionProductMainMapper;
@@ -87,18 +93,24 @@
 
     private StockUtils stockUtils;
 
+    private StockInRecordMapper stockInRecordMapper;
 
+    private final ISalesLedgerProductProcessBindService salesLedgerProductProcessBindService;
 
     @Autowired
     private ProductStructureMapper productStructureMapper;
     @Autowired
     private StockInventoryMapper stockInventoryMapper;
     @Autowired
-    private SalesLedgerProductionAccountingServiceImpl salesLedgerProductionAccountingServiceImpl;
+    private ProductOrderServiceImpl productOrderServiceImpl;
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
-        return salesLedgerProductMapper.selectById(id);
+        SalesLedgerProduct row = salesLedgerProductMapper.selectById(id);
+        if (row != null) {
+            row.fillRemainingQuantity();
+        }
+        return row;
     }
 
     @Override
@@ -107,50 +119,112 @@
 //        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
 //                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
-        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
-            salesLedgerProducts.forEach(item -> {
-                // 鍙戣揣淇℃伅
-                ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
-                        .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
-                        .orderByDesc(ShippingInfo::getCreateTime)
-                        .last("limit 1"));
-                if(shippingInfo != null){
-                    item.setShippingDate(shippingInfo.getShippingDate());
-                    item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
-                    item.setShippingStatus(shippingInfo.getStatus());
-                    item.setExpressCompany(shippingInfo.getExpressCompany());
-                    item.setExpressNumber(shippingInfo.getExpressNumber());
-                }
-            });
-            // 寮�绁�
+        if (CollectionUtils.isEmpty(salesLedgerProducts)) {
+            return salesLedgerProducts;
+        }
+
+        salesLedgerProducts.forEach(item -> {
+            ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+                    .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
+                    .orderByDesc(ShippingInfo::getCreateTime)
+                    .last("limit 1"));
+            if (shippingInfo != null) {
+                item.setShippingDate(shippingInfo.getShippingDate());
+                item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                item.setShippingStatus(shippingInfo.getStatus());
+                item.setExpressCompany(shippingInfo.getExpressCompany());
+                item.setExpressNumber(shippingInfo.getExpressNumber());
+            }
+        });
+
+        if (salesLedgerProduct.getSalesLedgerId() != null) {
             InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
             invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
             List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
-            // 缁熻寮�绁ㄧ櫥璁颁骇鍝佺殑宸插紑绁ㄦ暟/宸插紑绁ㄩ噾棰�
             if (!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)) {
                 for (SalesLedgerProduct ledgerProduct : salesLedgerProducts) {
                     BigDecimal invoiceNum = BigDecimal.ZERO;
                     BigDecimal invoiceAmount = BigDecimal.ZERO;
-                    BigDecimal noInvoiceNum = BigDecimal.ZERO;
-                    BigDecimal noInvoiceAmount = BigDecimal.ZERO;
                     for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
-                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
-                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
+                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
+                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
                             invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                         }
                     }
-                    noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum);
-                    noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount);
+                    BigDecimal ledgerQuantity = ledgerProduct.getQuantity() == null ? BigDecimal.ZERO : ledgerProduct.getQuantity();
+                    BigDecimal ledgerTotalPrice = ledgerProduct.getTaxInclusiveTotalPrice() == null ? BigDecimal.ZERO : ledgerProduct.getTaxInclusiveTotalPrice();
                     ledgerProduct.setInvoiceNum(invoiceNum);
                     ledgerProduct.setInvoiceAmount(invoiceAmount);
-                    ledgerProduct.setNoInvoiceNum(noInvoiceNum);
-                    ledgerProduct.setNoInvoiceAmount(noInvoiceAmount);
-
-
+                    ledgerProduct.setNoInvoiceNum(ledgerQuantity.subtract(invoiceNum));
+                    ledgerProduct.setNoInvoiceAmount(ledgerTotalPrice.subtract(invoiceAmount));
                 }
             }
-
         }
+
+        List<Long> productIds = salesLedgerProducts.stream()
+                .map(SalesLedgerProduct::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        Map<Long, BigDecimal> returnOrderGroupDtoMap = Collections.emptyMap();
+        if (!CollectionUtils.isEmpty(productIds)) {
+            List<SimpleReturnOrderGroupDto> groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
+            if (!CollectionUtils.isEmpty(groupListByProductIds)) {
+                returnOrderGroupDtoMap = groupListByProductIds.stream()
+                        .collect(Collectors.toMap(SimpleReturnOrderGroupDto::getSalesLedgerProductId,
+                                SimpleReturnOrderGroupDto::getSumReturnQuantity,
+                                BigDecimal::add));
+            }
+        }
+
+        List<Long> productModelIds = salesLedgerProducts.stream()
+                .map(SalesLedgerProduct::getProductModelId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, ProductModel> productModelMap = Collections.emptyMap();
+        if (!CollectionUtils.isEmpty(productModelIds)) {
+            List<ProductModel> productModels = productModelMapper.selectBatchIds(productModelIds);
+            if (!CollectionUtils.isEmpty(productModels)) {
+                productModelMap = productModels.stream()
+                        .collect(Collectors.toMap(ProductModel::getId, Function.identity()));
+            }
+        }
+
+        Map<Long, BigDecimal> finalReturnOrderGroupDtoMap = returnOrderGroupDtoMap;
+        Map<Long, ProductModel> finalProductModelMap = productModelMap;
+        salesLedgerProducts.forEach(item -> {
+            if (item.getFutureTickets() == null || item.getFutureTickets().compareTo(BigDecimal.ZERO) == 0) {
+                item.setFutureTickets(BigDecimal.ZERO);
+            }
+            if (item.getFutureTicketsAmount() == null || item.getFutureTicketsAmount().compareTo(BigDecimal.ZERO) == 0) {
+                item.setFutureTicketsAmount(BigDecimal.ZERO);
+            }
+            BigDecimal returnQuality = finalReturnOrderGroupDtoMap.getOrDefault(item.getId(), BigDecimal.ZERO);
+            item.setReturnQuality(returnQuality);
+            BigDecimal quantity = item.getQuantity() == null ? BigDecimal.ZERO : item.getQuantity();
+            BigDecimal shipped = item.getShippedQuantity() == null ? BigDecimal.ZERO : item.getShippedQuantity();
+            BigDecimal available = quantity.subtract(returnQuality).subtract(shipped);
+            item.setAvailableQuality(available.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : available);
+            item.fillRemainingQuantity();
+            if (item.getApproveStatus() == null || item.getApproveStatus() != 2) {
+                BigDecimal remainingShipped = item.getRemainingShippedQuantity() == null ? BigDecimal.ZERO : item.getRemainingShippedQuantity();
+                boolean hasOutbound = shipped.compareTo(BigDecimal.ZERO) > 0;
+                if (hasOutbound && remainingShipped.compareTo(BigDecimal.ZERO) <= 0) {
+                    item.setApproveStatus(0);
+                } else {
+                    Integer hasSufficientStock = item.getHasSufficientStock();
+                    if (hasSufficientStock != null && hasSufficientStock == 0) {
+                        item.setApproveStatus(0);
+                    } else {
+                        item.setApproveStatus(1);
+                    }
+                }
+            }
+            ProductModel productModel = finalProductModelMap.get(item.getProductModelId());
+            if (productModel != null) {
+                item.setThickness(productModel.getThickness());
+            }
+        });
         return salesLedgerProducts;
     }
 
@@ -169,7 +243,7 @@
         //鍒犻櫎鍙戣揣淇℃伅
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids)));
-        if(!CollectionUtils.isEmpty(shippingInfos)){
+        if (!CollectionUtils.isEmpty(shippingInfos)) {
             shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
 
@@ -206,12 +280,12 @@
     @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
         // 寰呭洖娆撅紝浠樻
-        if(salesLedgerProduct.getType().equals(1)){
+        if (salesLedgerProduct.getType().equals(1)) {
             salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal()));
             //鏈紑绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
             salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
-        }else{
+        } else {
             salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
             // 鏈潵绁ㄦ暟閲�+閲戦
             salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
@@ -220,14 +294,38 @@
 
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
+        salesLedgerProduct.fillRemainingQuantity();
         if (salesLedgerProduct.getId() == null) {
             salesLedgerProduct.setRegisterDate(LocalDateTime.now());
             result = salesLedgerProductMapper.insert(salesLedgerProduct);
             addProductionData(salesLedgerProduct);
         } else {
+            SalesLedgerProduct dbBefore = salesLedgerProductMapper.selectById(salesLedgerProduct.getId());
+            if (dbBefore == null) {
+                throw new RuntimeException("閿�鍞骇鍝佷笉瀛樺湪锛屾棤娉曠紪杈�");
+            }
+            // 涓嶈兘鎶婅鍗曟暟閲忔敼鍒板皬浜庡凡鍙戣揣鏁伴噺锛屽惁鍒欒处瀹炰笉涓�鑷�
+            BigDecimal shipped = dbBefore.getShippedQuantity() == null ? BigDecimal.ZERO : dbBefore.getShippedQuantity();
+            BigDecimal newOrderQty = salesLedgerProduct.getQuantity() == null ? BigDecimal.ZERO : salesLedgerProduct.getQuantity();
+            if (newOrderQty.compareTo(shipped) < 0) {
+                throw new RuntimeException("缂栬緫澶辫触,璁㈠崟鏁伴噺涓嶈兘灏忎簬宸插彂璐ф暟閲�");
+            }
             //鏌ヨ鍘熸湰鐨勪骇鍝佸瀷鍙穒d
             salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
             result = salesLedgerProductMapper.updateById(salesLedgerProduct);
+
+            // 鍏佽鈥滃鍏ュ簱鈥濓細褰撹鍗曟暟閲忚涓嬭皟鏃讹紝鍙洖閫�鈥滀笅璋冨樊棰濃�濆搴旂殑鍏ュ簱鏁伴噺
+            // 渚嬶細鍘熻鍗�100锛屽凡鍏ュ簱120锛涙敼涓�50 -> 鍙洖閫�50锛屾渶缁堝凡鍏ュ簱70锛堜笉寮哄帇鍒�50锛�
+            BigDecimal oldOrderQty = dbBefore.getQuantity() == null ? BigDecimal.ZERO : dbBefore.getQuantity();
+            BigDecimal stocked = dbBefore.getStockedQuantity() == null ? BigDecimal.ZERO : dbBefore.getStockedQuantity();
+            BigDecimal reduced = oldOrderQty.subtract(newOrderQty);
+            if (reduced.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal rollbackQty = stocked.min(reduced);
+                if (rollbackQty.compareTo(BigDecimal.ZERO) > 0) {
+                    rollbackExcessStockIn(dbBefore, rollbackQty);
+                }
+            }
+
             /*鍒犻櫎瀵瑰簲鐨勭敓浜ф暟鎹苟閲嶆柊鏂板*/
             deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
             // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
@@ -261,8 +359,109 @@
                         PurchaseLedger.class
                 );
             }
+
+            //  娓呯┖閿�鍞骇鍝佺粦瀹氱殑鍔犲伐
+            salesLedgerProductProcessBindService.updateProductProcessBind(salesLedgerProduct.getSalesProductProcessList(), salesLedgerProduct.getId());
+
+            // 鏂板/缂栬緫浜у搧鍚庯紝鍒锋柊閿�鍞富鍗曞叆搴撶姸鎬侊紙閬垮厤鍥犳柊澧炴湭鍏ュ簱琛屽鑷寸姸鎬佷笉鍑嗭級
+            refreshSalesLedgerStockStatus(salesLedgerId);
         }
         return result;
+    }
+
+    private void rollbackExcessStockIn(SalesLedgerProduct dbBefore, BigDecimal rollbackQtyTotal) {
+        if (dbBefore == null || rollbackQtyTotal == null || rollbackQtyTotal.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        if (dbBefore.getProductModelId() == null) {
+            throw new RuntimeException("鍥為��鍏ュ簱澶辫触,浜у搧瑙勬牸鏈淮鎶�");
+        }
+        Long productId = dbBefore.getId();
+        //  鍊掑簭鍥為��锛氫紭鍏堝洖閫�鈥滄壂鐮佸叆搴撯�濓紝鍐嶅洖閫�鈥滄墜鍔ㄥ叆搴撯��
+        List<String> recordTypes = Arrays.asList(
+                StockInQualifiedRecordTypeEnum.SALE_SCAN_STOCK_IN.getCode(),
+                StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode()
+        );
+        List<StockInRecord> records = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                .eq(StockInRecord::getSalesLedgerProductId, productId)
+                .eq(StockInRecord::getType, "0")
+                .in(StockInRecord::getRecordType, recordTypes)
+                .orderByDesc(StockInRecord::getCreateTime));
+        BigDecimal remaining = rollbackQtyTotal;
+        for (StockInRecord r : records) {
+            if (remaining.compareTo(BigDecimal.ZERO) <= 0) {
+                break;
+            }
+            BigDecimal inNum = r.getStockInNum() == null ? BigDecimal.ZERO : r.getStockInNum();
+            if (inNum.compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
+            }
+            BigDecimal rollbackQty = inNum.min(remaining);
+
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            stockInventoryDto.setProductModelId(dbBefore.getProductModelId());
+            stockInventoryDto.setQualitity(rollbackQty);
+            int affectRows = stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
+            if (affectRows <= 0) {
+                throw new RuntimeException("鍥為��鍏ュ簱澶辫触,褰撳墠搴撳瓨涓嶈冻,鏃犳硶鎵e洖瓒呭叆搴撴暟閲�");
+            }
+
+            BigDecimal newInNum = inNum.subtract(rollbackQty);
+            if (newInNum.compareTo(BigDecimal.ZERO) <= 0) {
+                stockInRecordMapper.deleteById(r.getId());
+            } else {
+                r.setStockInNum(newInNum);
+                stockInRecordMapper.updateById(r);
+            }
+            remaining = remaining.subtract(rollbackQty);
+        }
+        if (remaining.compareTo(BigDecimal.ZERO) > 0) {
+            throw new RuntimeException("鍥為��鍏ュ簱澶辫触,鏈壘鍒拌冻澶熺殑鍏ュ簱璁板綍鐢ㄤ簬鎵e洖瓒呭叆搴撴暟閲�");
+        }
+
+        //  鍥炲啓浜у搧琛屽凡鍏ュ簱鏁伴噺涓庣姸鎬�
+        SalesLedgerProduct fresh = salesLedgerProductMapper.selectById(dbBefore.getId());
+        if (fresh == null) {
+            return;
+        }
+        BigDecimal newStocked = (fresh.getStockedQuantity() == null ? BigDecimal.ZERO : fresh.getStockedQuantity()).subtract(rollbackQtyTotal);
+        if (newStocked.compareTo(BigDecimal.ZERO) < 0) {
+            newStocked = BigDecimal.ZERO;
+        }
+        BigDecimal orderQty = fresh.getQuantity() == null ? BigDecimal.ZERO : fresh.getQuantity();
+        int stockStatus;
+        if (newStocked.compareTo(BigDecimal.ZERO) <= 0) stockStatus = 0;
+        else if (orderQty.compareTo(BigDecimal.ZERO) > 0 && newStocked.compareTo(orderQty) < 0) stockStatus = 1;
+        else stockStatus = 2;
+        fresh.setStockedQuantity(newStocked);
+        fresh.setProductStockStatus(stockStatus);
+        fresh.fillRemainingQuantity();
+        salesLedgerProductMapper.updateById(fresh);
+    }
+
+    private void refreshSalesLedgerStockStatus(Long salesLedgerId) {
+        if (salesLedgerId == null) {
+            return;
+        }
+        SalesLedger ledger = salesLedgerMapper.selectById(salesLedgerId);
+        if (ledger == null) {
+            return;
+        }
+        List<SalesLedgerProduct> allProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)
+                .eq(SalesLedgerProduct::getType, 1));
+        if (CollectionUtils.isEmpty(allProducts)) {
+            ledger.setStockStatus(0);
+            salesLedgerMapper.updateById(ledger);
+            return;
+        }
+        boolean anyInbound = allProducts.stream().anyMatch(p -> {
+            BigDecimal sq = p.getStockedQuantity();
+            return sq != null && sq.compareTo(BigDecimal.ZERO) > 0;
+        });
+        boolean allFull = allProducts.stream().allMatch(p -> Objects.equals(p.getProductStockStatus(), 2));
+        ledger.setStockStatus(allFull ? 2 : (anyInbound ? 1 : 0));
+        salesLedgerMapper.updateById(ledger);
     }
 
     /**
@@ -273,7 +472,8 @@
         productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
         productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
         productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
-        productOrder.setNpsNo("SC" + String.format("%08d", 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);
@@ -281,7 +481,7 @@
         List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
                 .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
                 .orderByDesc(ProcessRoute::getCreateTime));
-        if (processRoutes.size()>0){
+        if (processRoutes.size() > 0) {
             ProcessRoute processRoute = processRoutes.get(0);
             //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
             ProductProcessRoute productProcessRoute = new ProductProcessRoute();
@@ -304,13 +504,7 @@
                 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);
-
+                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                     int sequenceNumber = 1; // 榛樿搴忓彿
                     if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                         String lastNo = lastWorkOrder.getWorkOrderNo().toString();
@@ -324,7 +518,7 @@
                         }
                     }
                     // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
-                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
+                    String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
                     ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                     productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                     productWorkOrder.setProductOrderId(productOrder.getId());
@@ -397,9 +591,9 @@
                         //鍒犻櫎鍑哄簱璁板綍
                         for (Long productMainId : productMainIds) {
                             //鍒犻櫎鐢熶骇鍑哄簱璁板綍
-                            stockUtils.deleteStockOutRecord(productMainId, StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
+                            stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
                             //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
-                            stockUtils.deleteStockInRecord(productMainId, StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+                            stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
                         }
                         qualityInspects.forEach(qualityInspect -> {
                             //inspectState=1 宸叉彁浜� 涓嶈兘鍒犻櫎
@@ -439,11 +633,12 @@
         IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct);
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
-            if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
+            if (item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0) {
                 item.setStatusName("宸插畬鎴愪粯娆�");
-            }else{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
+            item.fillRemainingQuantity();
         });
         return salesLedgerProductDtoIPage;
     }
@@ -453,11 +648,12 @@
         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{
+            } else {
                 item.setStatusName("鏈畬鎴愪粯娆�");
             }
+            item.fillRemainingQuantity();
         });
         return salesLedgerProductDtoIPage;
     }
@@ -496,6 +692,7 @@
             throw new RuntimeException("鍔ㄦ�佹洿鏂颁富琛ㄩ噾棰濆け璐�", e);
         }
     }
+
     @Override
     public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
         //鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
@@ -514,7 +711,7 @@
 
             //鎵�闇�鏁伴噺
             BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
-            BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
+            BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
             if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
                 count++;
                 stringBuffer.append(productStructureDto.getProductName())
@@ -525,9 +722,9 @@
                         .append(System.lineSeparator());
             }
         }
-        if (count>0) {
+        if (count > 0) {
             return R.fail(stringBuffer.toString());
-        }else {
+        } else {
             return R.ok();
         }
     }

--
Gitblit v1.9.3