From e5d1fb3d5ce9468b92e79825bbcb38f05ea73aff Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期一, 12 十月 2026 18:12:34 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java |   56 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
index 0fb8618..4b53f5d 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
@@ -36,31 +36,51 @@
 
     @Override
     public void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
-        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
-                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
-                .eq(FeStandardSubstance::getState, 0)
-                .last("limit 1"));
-        if (ObjectUtils.isEmpty(standardSubstance)){
-            throw new ErrorException("璇ョ墿璐ㄥ凡琚�熷嚭锛�");
+        Long borrowQuantity = feStandardSubstanceRecord.getBorrowQuantity();
+        if (borrowQuantity == null || borrowQuantity <= 0) {
+            throw new ErrorException("璇峰~鍐欐纭殑棰嗙敤鏁伴噺锛�");
         }
+        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(feStandardSubstanceRecord.getSubstanceId());
+        if (ObjectUtils.isEmpty(standardSubstance)){
+            throw new ErrorException("璇ユ爣鍑嗙墿璐ㄤ笉瀛樺湪锛�");
+        }
+        long remaining = calcRemaining(standardSubstance);
+        if (remaining <= 0) {
+            throw new ErrorException("璇ユ爣鍑嗙墿璐ㄥ凡鍏ㄩ儴棰嗙敤锛屽墿浣欐暟閲忎负0锛�");
+        }
+        if (borrowQuantity > remaining) {
+            throw new ErrorException("棰嗙敤鏁伴噺涓嶈兘瓒呰繃鍓╀綑鏁伴噺锛堝綋鍓嶅墿浣�" + remaining + "锛夛紒");
+        }
+        long remainingAfter = remaining - borrowQuantity;
+        feStandardSubstanceRecord.setRemainingQuantity(remainingAfter);
+        // 璁板綍棰嗙敤褰撴椂鐨勫師濮嬫暟閲忓揩鐓э紝涔嬪悗娓呭崟閲屽啀鏀规暟閲忎笉褰卞搷鍘嗗彶棰嗙敤璁板綍
+        feStandardSubstanceRecord.setOriginalQuantity(standardSubstance.getQuantity());
         this.baseMapper.insert(feStandardSubstanceRecord);
-        standardSubstance.setState(1);
+        standardSubstance.setState(remainingAfter == 0 ? 1 : 0);
         feStandardSubstanceMapper.updateById(standardSubstance);
     }
 
     @Override
-    public void returnSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
-        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
-                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
-                .eq(FeStandardSubstance::getState, 1));
-        if (ObjectUtils.isEmpty(standardSubstance)){
-            throw new ErrorException("璇ョ墿璐ㄦ湭琚鐢紝鏃犻渶褰掕繕锛�");
+    public Long getRemainingQuantity(Integer substanceId) {
+        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(substanceId);
+        if (ObjectUtils.isEmpty(standardSubstance)) {
+            return 0L;
         }
-        standardSubstance.setState(0);
-        feStandardSubstanceMapper.updateById(standardSubstance);
-        baseMapper.update(feStandardSubstanceRecord, Wrappers.<FeStandardSubstanceRecord>lambdaUpdate()
-                .eq(FeStandardSubstanceRecord::getSubstanceId, feStandardSubstanceRecord.getSubstanceId())
-                .eq(FeStandardSubstanceRecord::getStatus, 0));
+        return Math.max(calcRemaining(standardSubstance), 0L);
+    }
+
+    private long calcRemaining(FeStandardSubstance substance) {
+        long total = substance.getQuantity() == null ? 0L : substance.getQuantity();
+        long borrowed = 0L;
+        List<FeStandardSubstanceRecord> records = this.baseMapper.selectList(Wrappers.<FeStandardSubstanceRecord>lambdaQuery()
+                .eq(FeStandardSubstanceRecord::getSubstanceId, substance.getId()));
+        for (FeStandardSubstanceRecord record : records) {
+            if ("1".equals(record.getStatus())) { // 鍘嗗彶褰掕繕璁板綍涓嶈鍏ュ凡棰嗙敤
+                continue;
+            }
+            borrowed += record.getBorrowQuantity() == null ? total : record.getBorrowQuantity();
+        }
+        return total - borrowed;
     }
 
     @Override

--
Gitblit v1.9.3