From 13afb7eafeffac6ecccc7c66d36974c54c5172d4 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 28 五月 2026 15:13:37 +0800
Subject: [PATCH] 库存管理增加库存类型,并返回相关数据显示

---
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java |  117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 111 insertions(+), 6 deletions(-)

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 7051075..7facfcf 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -13,10 +13,14 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+
+import java.time.LocalDateTime;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.execl.StockInRecordExportData;
+import com.ruoyi.production.mapper.ProductionOrderPickMapper;
+import com.ruoyi.production.pojo.ProductionOrderPick;
 import com.ruoyi.stock.mapper.StockInRecordMapper;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
@@ -26,10 +30,12 @@
 import com.ruoyi.stock.service.StockInRecordService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
+import org.jspecify.annotations.NonNull;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Service
@@ -39,6 +45,7 @@
     private StockInRecordMapper stockInRecordMapper;
     private StockInventoryMapper stockInventoryMapper;
     private StockUninventoryMapper stockUninventoryMapper;
+    private ProductionOrderPickMapper productionOrderPickMapper;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -49,7 +56,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int add(StockInRecordDto stockInRecordDto) {
-        String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches");
+        String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches", stockInRecordDto.getCreateTime() != null ? stockInRecordDto.getCreateTime() : LocalDateTime.now());
         stockInRecordDto.setInboundBatches(no);
         StockInRecord stockInRecord = new StockInRecord();
         BeanUtils.copyProperties(stockInRecordDto, stockInRecord);
@@ -152,6 +159,32 @@
         return stockUninventoryMapper.selectOne(eq);
     }
 
+    /**
+     * 鍥炴粴鐢熶骇閫�鏂欏叆搴撶殑棰嗘枡璁板綍閫�鏂欐暟閲�
+     * @param stockInRecord 鍏ュ簱璁板綍
+     */
+    private void rollbackFeedReturnQty(StockInRecord stockInRecord) {
+        ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+        if (productionOrderPick != null) {
+            BigDecimal returnQty = productionOrderPick.getReturnQty();
+            if (returnQty == null) {
+                returnQty = BigDecimal.ZERO;
+            }
+            BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
+            if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
+                newReturnQty = BigDecimal.ZERO;
+            }
+            productionOrderPick.setReturnQty(newReturnQty);
+            // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+            BigDecimal actualQty = productionOrderPick.getQuantity().add(
+                productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+                .subtract(newReturnQty);
+            productionOrderPick.setActualQty(actualQty);
+            productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+            productionOrderPickMapper.updateById(productionOrderPick);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int batchDeletePending(List<Long> ids) {
@@ -162,6 +195,11 @@
             }
             if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
                 throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+
+            // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鍒犻櫎鏃堕渶瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
+            if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+                rollbackFeedReturnQty(stockInRecord);
             }
         }
         return stockInRecordMapper.deleteBatchIds(ids);
@@ -186,22 +224,28 @@
             }
             stockInRecord.setApprovalStatus(approvalStatus);
             stockInRecordMapper.updateById(stockInRecord);
+
+            // 瀹℃壒椹冲洖鏃讹紝濡傛灉鏄敓浜ч��鏂欏叆搴擄紝闇�瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
+            if (ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus) &&
+                StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+                rollbackFeedReturnQty(stockInRecord);
+            }
+
             // 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
             if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) {
                 if ("0".equals(stockInRecord.getType())) {
                     // 鍚堟牸鍏ュ簱 -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
                     StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
-                    StockInventoryDto stockInventoryDto = new StockInventoryDto();
-                    stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
-                    stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
-                    stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
-                    stockInventoryDto.setRemark(stockInRecord.getRemark());
+                    StockInventoryDto stockInventoryDto = getStockInventoryDto(stockInRecord);
                     if (stockInventory == null) {
                         stockInventoryMapper.insert(new StockInventory() {{
                             setProductModelId(stockInRecord.getProductModelId());
                             setQualitity(stockInRecord.getStockInNum());
                             setBatchNo(stockInRecord.getBatchNo());
                             setRemark(stockInRecord.getRemark());
+                            setWarnNum(stockInRecord.getWarnNum());
+                            setManufacturerId(stockInRecord.getManufacturerId());
+                            setSource(stockInRecord.getSource());
                             setVersion(1);
                         }});
                     } else {
@@ -215,12 +259,16 @@
                     stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
                     stockUninventoryDto.setRemark(stockInRecord.getRemark());
+                    stockUninventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
+                    stockUninventoryDto.setSource(stockInRecord.getSource());
                     if (stockUninventory == null) {
                         stockUninventoryMapper.insert(new StockUninventory() {{
                             setProductModelId(stockInRecord.getProductModelId());
                             setQualitity(stockInRecord.getStockInNum());
                             setBatchNo(stockInRecord.getBatchNo());
                             setRemark(stockInRecord.getRemark());
+                            setManufacturerId(stockInRecord.getManufacturerId());
+                            setSource(stockInRecord.getSource());
                             setVersion(1);
                         }});
                     } else {
@@ -231,4 +279,61 @@
         }
         return ids.size();
     }
+
+    private static @NonNull StockInventoryDto getStockInventoryDto(StockInRecord stockInRecord) {
+        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+        stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
+        stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
+        stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
+        stockInventoryDto.setRemark(stockInRecord.getRemark());
+        stockInventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
+        stockInventoryDto.setSource(stockInRecord.getSource());
+        return stockInventoryDto;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchReAudit(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+
+        for (Long id : ids) {
+            StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+            if (stockInRecord == null) {
+                throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶閲嶆柊瀹℃牳!!!");
+            }
+            // 鍙湁椹冲洖鐘舵�佹墠鑳介噸鏂板鏍�
+            if (!ReviewStatusEnum.REJECTED.getCode().equals(stockInRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁椹冲洖鐘舵�佺殑璁板綍鎵嶈兘閲嶆柊瀹℃牳,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+
+            // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鎭㈠閫�鏂欐暟閲忥紙鍥犱负椹冲洖鏃跺凡鎵e噺锛�
+            if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+                ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+                if (productionOrderPick != null) {
+                    BigDecimal returnQty = productionOrderPick.getReturnQty();
+                    if (returnQty == null) {
+                        returnQty = BigDecimal.ZERO;
+                    }
+                    // 閲嶆柊瀹℃牳鏃舵仮澶嶉��鏂欐暟閲�
+                    BigDecimal newReturnQty = returnQty.add(stockInRecord.getStockInNum());
+                    productionOrderPick.setReturnQty(newReturnQty);
+                    // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+                    BigDecimal actualQty = productionOrderPick.getQuantity().add(
+                        productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+                        .subtract(newReturnQty);
+                    productionOrderPick.setActualQty(actualQty);
+                    productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+                    productionOrderPickMapper.updateById(productionOrderPick);
+                }
+            }
+
+            // 灏嗙姸鎬佹敼涓哄緟瀹℃牳
+            stockInRecord.setApprovalStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
+            stockInRecordMapper.updateById(stockInRecord);
+        }
+
+        return ids.size();
+    }
 }

--
Gitblit v1.9.3