From b83811618d78d7a9832b325334b7a35cd6a3b64b Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 08 六月 2026 13:21:01 +0800
Subject: [PATCH] 采购台账手动入库,保存差额;入库审核 重新计算含水量

---
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |   75 +++++++++++++++++++++++++++++--------
 1 files changed, 59 insertions(+), 16 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 8c1fe41..a3458b8 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -22,7 +22,6 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.utils.FileUtil;
-import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.enums.ApprovalStatusEnum;
 import com.ruoyi.common.enums.ReviewStatusEnum;
@@ -1093,35 +1092,44 @@
             if (salesLedgerProduct == null) {
                 throw new BaseException("閲囪喘浜у搧涓嶅瓨鍦�");
             }
+            if (!purchaseLedger.getId().equals(salesLedgerProduct.getSalesLedgerId()) || !Integer.valueOf(2).equals(salesLedgerProduct.getType())) {
+                throw new BaseException("閲囪喘浜у搧涓庨噰璐彴璐︿笉鍖归厤");
+            }
 
-            // 鑾峰彇鐞嗚鍏ュ簱鏁伴噺锛堝墠绔紶鍏ョ殑inboundQuantity锛�
+            ProductModel productModel = productModelMapper.selectById(salesLedgerProduct.getProductModelId());
+            if (Boolean.TRUE.equals(salesLedgerProduct.getIsChecked())) {
+                throw new BaseException("浜у搧銆�" + productModel.getModel() + "銆戦渶瑕佽川妫�锛岃璧拌川妫�鍏ュ簱娴佺▼");
+            }
+
             BigDecimal theoryStockInNum = item.getInboundQuantity();
             if (theoryStockInNum == null) {
                 theoryStockInNum = salesLedgerProduct.getQuantity();
             }
-            // 绌哄�煎拰闈炴鏁版牎楠�
             if (theoryStockInNum == null || theoryStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
                 throw new BaseException("鐞嗚鍏ュ簱鏁伴噺蹇呴』澶т簬0");
             }
 
-            // 鑾峰彇瀹為檯鍏ュ簱鏁伴噺锛堝墠绔紶鍏ョ殑actualInboundQuantity锛�
-            BigDecimal actualStockInNum = item.getActualInboundQuantity();
-            if (actualStockInNum == null) {
-                actualStockInNum = theoryStockInNum;
+            BigDecimal approvedStockInNum = getApprovedPurchaseStockInNum(
+                    purchaseLedger.getId(),
+                    purchaseLedger.getPurchaseContractNumber(),
+                    salesLedgerProduct.getId(),
+                    salesLedgerProduct.getProductModelId()
+            );
+            BigDecimal remainingStockInNum = salesLedgerProduct.getQuantity().subtract(approvedStockInNum);
+            if (remainingStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BaseException("浜у搧銆�" +  productModel.getModel() + "銆戝凡瀹屾垚鍏ュ簱");
             }
-            // 闈炴鏁版牎楠�
+            if (theoryStockInNum.compareTo(remainingStockInNum) > 0) {
+                throw new BaseException("浜у搧銆�" +  productModel.getModel() + "銆戠悊璁哄叆搴撴暟閲忎笉鑳藉ぇ浜庡緟鍏ュ簱鏁伴噺" + remainingStockInNum.stripTrailingZeros().toPlainString());
+            }
+
+            Boolean isContainsWater = Boolean.TRUE.equals(item.getIsContainsWater());
+            BigDecimal waterContent = normalizeWaterContent(isContainsWater, item.getWaterContent());
+            BigDecimal actualStockInNum = calculateActualStockInNum(theoryStockInNum, isContainsWater, waterContent);
             if (actualStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
                 throw new BaseException("瀹為檯鍏ュ簱鏁伴噺蹇呴』澶т簬0");
             }
 
-            // 鑾峰彇鏄惁鍚按鍜屽惈姘撮噺
-            Boolean isContainsWater = item.getIsContainsWater();
-            BigDecimal waterContent = item.getWaterContent();
-            if (waterContent == null) {
-                waterContent = BigDecimal.ZERO;
-            }
-
-            // 璋冪敤StockUtils杩涜鍏ュ簱锛堝甫鍚按閲忎俊鎭級
             stockUtils.addStockWithBatchNo(
                     salesLedgerProduct.getProductModelId(),
                     actualStockInNum,
@@ -1139,6 +1147,41 @@
         return count;
     }
 
+    private BigDecimal getApprovedPurchaseStockInNum(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(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    private BigDecimal normalizeWaterContent(Boolean isContainsWater, BigDecimal waterContent) {
+        if (!Boolean.TRUE.equals(isContainsWater)) {
+            return BigDecimal.ZERO;
+        }
+        if (waterContent == null) {
+            throw new BaseException("鍚按鏃跺繀椤诲~鍐欏惈姘撮噺");
+        }
+        if (waterContent.compareTo(BigDecimal.ZERO) < 0 || waterContent.compareTo(new BigDecimal("100")) >= 0) {
+            throw new BaseException("鍚按閲忓繀椤诲湪0鍒�100涔嬮棿");
+        }
+        return waterContent;
+    }
+
+    private BigDecimal calculateActualStockInNum(BigDecimal theoryStockInNum, Boolean isContainsWater, BigDecimal waterContent) {
+        if (!Boolean.TRUE.equals(isContainsWater)) {
+            return theoryStockInNum;
+        }
+        BigDecimal percent = waterContent.divide(new BigDecimal("100"), 6, RoundingMode.HALF_UP);
+        BigDecimal actualStockInNum = theoryStockInNum.multiply(BigDecimal.ONE.subtract(percent));
+        return actualStockInNum.setScale(4, RoundingMode.HALF_UP);
+    }
+
     /**
      * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
      */

--
Gitblit v1.9.3