From 81695840a4aba964eeaaa553563f1e973d0ec9e9 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 15 六月 2026 13:26:54 +0800
Subject: [PATCH] 修改可入库数量的计算

---
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                 |   26 +++++++++++++++++++-------
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |   12 +++++++-----
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                   |    4 ++++
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java    |    3 +++
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java     |    3 +++
 5 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 0833069..651cf9e 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1113,13 +1113,13 @@
                 throw new BaseException("鐞嗚鍏ュ簱鏁伴噺蹇呴』澶т簬0");
             }
 
-            BigDecimal approvedStockInNum = getApprovedPurchaseStockInNum(
+            BigDecimal occupiedStockInNum = getOccupiedPurchaseStockInNum(
                     purchaseLedger.getId(),
                     purchaseLedger.getPurchaseContractNumber(),
                     salesLedgerProduct.getId(),
                     salesLedgerProduct.getProductModelId()
             );
-            BigDecimal remainingStockInNum = salesLedgerProduct.getQuantity().subtract(approvedStockInNum);
+            BigDecimal remainingStockInNum = salesLedgerProduct.getQuantity().subtract(occupiedStockInNum);
             if (remainingStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
                 throw new BaseException("浜у搧銆�" +  productModel.getModel() + "銆戝凡瀹屾垚鍏ュ簱");
             }
@@ -1151,15 +1151,17 @@
         return count;
     }
 
-    private BigDecimal getApprovedPurchaseStockInNum(Long purchaseLedgerId, String purchaseContractNumber, Long productId, Long productModelId) {
+    private BigDecimal getOccupiedPurchaseStockInNum(Long purchaseLedgerId, String purchaseContractNumber, Long productId, Long productModelId) {
         if (purchaseLedgerId == null || productId == null || productModelId == null || !StringUtils.hasText(purchaseContractNumber)) {
             return BigDecimal.ZERO;
         }
         List<StockInRecord> stockRecords = findDirectStockRecords(purchaseLedgerId, purchaseContractNumber, productModelId, productId);
         return stockRecords.stream()
                 .filter(Objects::nonNull)
-                .filter(item -> ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()))
-                .map(StockInRecord::getStockInNum)
+                .filter(item -> item.getApprovalStatus() == null
+                        || ReviewStatusEnum.PENDING_REVIEW.getCode().equals(item.getApprovalStatus())
+                        || ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()))
+                .map(item -> item.getTheoryStockInNum() != null ? item.getTheoryStockInNum() : item.getStockInNum())
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
     }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 56b1f4c..d9e9457 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -186,6 +186,10 @@
     // 鍙敤鏁伴噺  quantity - returnQuality
     @TableField(exist = false)
     private BigDecimal availableQuality;
+
+    // 寰呭叆搴撴暟閲�  quantity - 宸插鎵圭悊璁哄叆搴� - 寰呭鎵圭悊璁哄叆搴�
+    @TableField(exist = false)
+    private BigDecimal pendingInboundQuantity;
     @Schema(description = "鍒涘缓鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index b085676..fd08560 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -60,6 +60,9 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int add(StockInRecordDto stockInRecordDto) {
+        if (stockInRecordDto.getCreateTime() == null) {
+            stockInRecordDto.setCreateTime(LocalDateTime.now());
+        }
         String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches", stockInRecordDto.getCreateTime() != null ? stockInRecordDto.getCreateTime() : LocalDateTime.now());
         stockInRecordDto.setInboundBatches(no);
         StockInRecord stockInRecord = new StockInRecord();
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index a5da266..49e8961 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -63,6 +63,9 @@
 
     @Override
     public int add(StockOutRecordDto stockOutRecordDto) {
+        if (stockOutRecordDto.getCreateTime() == null) {
+            stockOutRecordDto.setCreateTime(LocalDateTime.now());
+        }
         String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", stockOutRecordDto.getCreateTime() != null ? stockOutRecordDto.getCreateTime() : LocalDateTime.now());
         stockOutRecordDto.setOutboundBatches(no);
         if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index f9a5d1a..14908a2 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -44,6 +44,15 @@
         (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) as no_quantity,
         IFNULL(t5.pending_approval_quantity, 0) as pending_approval_quantity,
         CASE
+         WHEN T1.type != 2 THEN NULL
+         ELSE GREATEST(
+            IFNULL(T1.quantity, 0)
+            - IFNULL(t4.approved_stock_in_num, 0)
+            - IFNULL(t4.pending_stock_in_num, 0),
+            0
+         )
+        END AS pending_inbound_quantity,
+        CASE
          WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) = 0 THEN '寰呭彂璐�'
          WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) > 0 THEN '瀹℃壒涓�'
          WHEN (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) > 0 THEN '閮ㄥ垎鍙戣揣'
@@ -51,8 +60,8 @@
         END as shippingStatus,
         CASE
          WHEN T1.type != 2 THEN NULL
-         WHEN IFNULL(t4.approved_stock_in_num, 0) &lt;= 0 THEN '寰呭叆搴�'
-         WHEN IFNULL(t4.approved_stock_in_num, 0) &gt;= IFNULL(T1.quantity, 0) THEN '瀹屽叏鍏ュ簱'
+         WHEN IFNULL(t4.approved_stock_in_num, 0) + IFNULL(t4.pending_stock_in_num, 0) &lt;= 0 THEN '寰呭叆搴�'
+         WHEN IFNULL(t4.approved_stock_in_num, 0) + IFNULL(t4.pending_stock_in_num, 0) &gt;= IFNULL(T1.quantity, 0) THEN '瀹屽叏鍏ュ簱'
         ELSE '鍏ュ簱涓�'
         END AS stock_in_approval_status
         FROM
@@ -109,10 +118,12 @@
         ) t3 ON t3.sales_ledger_product_id = T1.id
         LEFT JOIN (
         SELECT rel.sales_ledger_product_id,
-               IFNULL(SUM(rel.stock_in_num), 0) AS approved_stock_in_num
+               IFNULL(SUM(rel.approved_stock_in_num), 0) AS approved_stock_in_num,
+               IFNULL(SUM(rel.pending_stock_in_num), 0) AS pending_stock_in_num
         FROM (
             SELECT slp.id AS sales_ledger_product_id,
-                   sir.stock_in_num
+                   CASE WHEN COALESCE(sir.approval_status, 0) = 1 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS approved_stock_in_num,
+                   CASE WHEN COALESCE(sir.approval_status, 0) = 0 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS pending_stock_in_num
             FROM stock_in_record sir
             INNER JOIN sales_ledger_product slp
                 ON slp.type = 2
@@ -122,12 +133,13 @@
                     (sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', slp.id))
                     OR (sir.batch_no IS NULL AND sir.product_model_id = slp.product_model_id)
                 )
-            WHERE sir.approval_status = 1
+            WHERE COALESCE(sir.approval_status, 0) IN (0, 1)
 
             UNION ALL
 
             SELECT slp.id AS sales_ledger_product_id,
-                   sir.stock_in_num
+                   CASE WHEN COALESCE(sir.approval_status, 0) = 1 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS approved_stock_in_num,
+                   CASE WHEN COALESCE(sir.approval_status, 0) = 0 THEN COALESCE(sir.theory_stock_in_num, sir.stock_in_num) ELSE 0 END AS pending_stock_in_num
             FROM stock_in_record sir
             INNER JOIN quality_inspect qi
                 ON TRIM(sir.record_type) = '10'
@@ -136,7 +148,7 @@
                 ON slp.type = 2
                 AND slp.sales_ledger_id = qi.purchase_ledger_id
                 AND slp.product_model_id = qi.product_model_id
-            WHERE sir.approval_status = 1
+            WHERE COALESCE(sir.approval_status, 0) IN (0, 1)
         ) rel
         GROUP BY rel.sales_ledger_product_id
         ) t4 ON t4.sales_ledger_product_id = T1.id

--
Gitblit v1.9.3