From 0617c5edd84b4b63047226797b066ac79426542e Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期一, 11 五月 2026 16:19:20 +0800
Subject: [PATCH] refactor(stock): 优化盘点计划编辑功能的商品关联处理

---
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java |   49 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
index 698c0a8..86b78a1 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
@@ -22,10 +22,8 @@
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -119,6 +117,8 @@
             return R.fail("鐩樼偣鍗曚笉瀛樺湪");
         }
         for (StockInventoryCheckItem item : stockInventoryCheckPlanDto.getCheckItems()) {
+            //鏇存柊搴撳瓨閿佸畾鐘舵��
+            stockInventoryService.updateLocked(item.getProductModelId(),item.getBatchNo(), false);
             if (item.getDifferenceQuantity() == null || item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) == 0) {
                 continue;
             }
@@ -129,16 +129,15 @@
             stockInventoryDto.setRecordId(stockInventoryCheckPlanDto.getId());
 
             if (item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) > 0) {
-                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
-                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
+                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode());
+                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs (), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                 //鐩存帴瀹℃牳閫氳繃
                 stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1);
             }else {
-                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode());
-                StockOutRecordDto stockOutRecordDto = stockUtils.substractStock(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
+                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
+                StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                 //鐩存帴瀹℃牳閫氳繃
-                stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()), 1);
-
+                stockOutRecordService.batchApprove(Collections.singletonList(stock.getId()), 1);
             }
         }
         stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems());
@@ -205,19 +204,41 @@
     public R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
         SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId());
         stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName());
-        //璧嬪��
-        //璁剧疆鐩樼偣鍟嗗搧鍏宠仈ID骞舵煡璇㈢郴缁熷簱瀛�
+        // 鏌ヨ鏁版嵁搴撲腑鐨勬棫鏁版嵁
+        List<StockInventoryCheckProduct> oldItems = stockInventoryCheckProductMapper.selectList(
+                new LambdaQueryWrapper<StockInventoryCheckProduct>()
+                        .eq(StockInventoryCheckProduct::getInventoryCheckPlanId, stockInventoryCheckPlanDto.getId()));
+        // 璁剧疆鐩樼偣鍟嗗搧鍏宠仈 ID 骞舵煡璇㈢郴缁熷簱瀛�
         stockInventoryCheckPlanDto.getItems().forEach(item -> {
             item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId());
-            List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
+            // 鏌ヨ骞惰缃郴缁熷簱瀛�
+            List<StockInventory> list = stockInventoryService.list(
+                    new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
             BigDecimal systemQty = list.stream()
                     .map(StockInventory::getQualitity)
                     .filter(Objects::nonNull)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
             item.setSystemQuantity(systemQty);
+            // 濡傛灉鏃ф暟鎹腑涓嶅瓨鍦ㄨ ID锛岃鏄庢槸鏂板锛岄渶瑕佹竻绌� ID 璁╂暟鎹簱鑷姩鐢熸垚
+            boolean isExisting = oldItems.stream().anyMatch(old -> old.getId().equals(item.getId()));
+            if (!isExisting) {
+                item.setId(null);
+            }
         });
-        //鏇存柊鎴栨柊澧�
+        // 浣跨敤 insertOrUpdate 鎵归噺澶勭悊锛岃嚜鍔ㄥ尯鍒嗘柊澧炲拰鏇存柊
         stockInventoryCheckProductMapper.insertOrUpdate(stockInventoryCheckPlanDto.getItems());
+        // 澶勭悊鍒犻櫎锛氭棫鏁版嵁涓湁浣嗘柊鏁版嵁涓病鏈夌殑椤�
+        Set<Long> newItemIds = stockInventoryCheckPlanDto.getItems().stream()
+                .map(StockInventoryCheckProduct::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        List<Long> toDeleteIds = oldItems.stream()
+                .map(StockInventoryCheckProduct::getId)
+                .filter(id -> !newItemIds.contains(id))
+                .collect(Collectors.toList());
+        if (!toDeleteIds.isEmpty()) {
+            stockInventoryCheckProductMapper.deleteByIds(toDeleteIds);
+        }
         return R.ok(this.updateById(stockInventoryCheckPlanDto));
     }
 

--
Gitblit v1.9.3