From f16bf325804fb3bc6ab883693a96a374b3c63188 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 18 六月 2026 17:41:50 +0800
Subject: [PATCH] 不合格库存批号自动生成

---
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java |  131 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 107 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
index cf4c1a7..d738db1 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -13,6 +13,7 @@
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.stock.enums.StockInventorySourceEnum;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
@@ -30,6 +31,7 @@
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -62,7 +64,35 @@
 
     @Override
     public IPage<StockUninventoryDto> pageWasteQuery(Page page, StockUninventoryDto stockUninventoryDto) {
-        return stockUninventoryMapper.pageWasteQuery(page, stockUninventoryDto);
+        IPage<StockUninventoryDto> resultPage = stockUninventoryMapper.pageWasteQuery(page, stockUninventoryDto);
+        resultPage.getRecords().forEach(dto -> {
+            if (StringUtils.isNotEmpty(dto.getSource())) {
+                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(dto.getSource());
+                if (sourceEnum != null) {
+                    dto.setSourceText(sourceEnum.getValue());
+                }
+            }
+        });
+        return resultPage;
+    }
+
+    @Override
+    public IPage<StockUninventoryDto> getWasteBatchNoQty(Page page, StockInventoryDto stockInventoryDto) {
+        IPage<StockUninventoryDto> resultPage = stockUninventoryMapper.getWasteBatchNoQty(page, stockInventoryDto);
+        resultPage.getRecords().forEach(dto -> {
+            if (StringUtils.isNotEmpty(dto.getSource())) {
+                StockInventorySourceEnum unQualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getSource());
+                if (unQualifiedSourceEnum != null) {
+                    dto.setSourceText(unQualifiedSourceEnum.getValue());
+                }
+            }
+        });
+        return resultPage;
+    }
+
+    @Override
+    public List<StockUninventoryDto> getWasteByModelId(Long productModelId) {
+        return stockUninventoryMapper.getWasteByModelId(productModelId);
     }
 
     @Override
@@ -70,23 +100,20 @@
     public Integer addStockUninventory(StockUninventoryDto stockUninventoryDto) {
         String inventoryType = resolveInventoryType(stockUninventoryDto);
         stockUninventoryDto.setType(inventoryType);
-        LambdaQueryWrapper<StockUninventory> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId());
-        wrapper.eq(StockUninventory::getType, inventoryType);
-        if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) {
-            stockUninventoryDto.setBatchNo(null);
-            wrapper.isNull(StockUninventory::getBatchNo);
-        } else {
-            wrapper.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo());
-        }
+        String batchNo = resolveOrGenerateBatchNo(stockUninventoryDto.getBatchNo(), stockUninventoryDto.getProductModelId());
+        stockUninventoryDto.setBatchNo(batchNo);
         //鏂板鍏ュ簱璁板綍鍐嶆坊鍔犲簱瀛�
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
-        stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
+        stockInRecordDto.setBatchNo(batchNo);
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
-        stockInRecordDto.setType("1");
+        if (UNQUALIFIED_TYPE.equals(inventoryType)) {
+            stockInRecordDto.setType("1");
+        } else {
+            stockInRecordDto.setType("2");
+        }
         stockInRecordDto.setManufacturerId(stockUninventoryDto.getManufacturerId());
         stockInRecordDto.setSource(stockUninventoryDto.getSource());
         stockInRecordService.add(stockInRecordDto);
@@ -99,6 +126,8 @@
     public Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto) {
         String inventoryType = resolveInventoryType(stockUninventoryDto);
         stockUninventoryDto.setType(inventoryType);
+        String batchNo = resolveOutboundBatchNo(stockUninventoryDto.getProductModelId(), inventoryType, stockUninventoryDto.getBatchNo());
+        stockUninventoryDto.setBatchNo(batchNo);
 
         //  鏂板鍑哄簱璁板綍
         StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
@@ -106,12 +135,18 @@
         stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
         stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
-        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
+        stockOutRecordDto.setBatchNo(batchNo);
         stockOutRecordDto.setType("1");
         stockOutRecordService.add(stockOutRecordDto);
-        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda()
+        LambdaQueryWrapper<StockUninventory> queryWrapper = new QueryWrapper<StockUninventory>().lambda()
                 .eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId())
-                .eq(StockUninventory::getType, inventoryType));
+                .eq(StockUninventory::getType, inventoryType);
+        if (StringUtils.isEmpty(batchNo)) {
+            queryWrapper.isNull(StockUninventory::getBatchNo);
+        } else {
+            queryWrapper.eq(StockUninventory::getBatchNo, batchNo);
+        }
+        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(queryWrapper);
         if (ObjectUtils.isEmpty(oldStockInventory)) {
             throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
         }else {
@@ -123,19 +158,22 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto) {
-        stockUninventoryDto.setType(resolveInventoryType(stockUninventoryDto));
+        String inventoryType = resolveInventoryType(stockUninventoryDto);
+        stockUninventoryDto.setType(inventoryType);
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
-        String batchNo = StringUtils.trim(stockUninventoryDto.getBatchNo());
-        if (StringUtils.isEmpty(batchNo)) {
-            batchNo = generateAutoBatchNo(stockUninventoryDto.getProductModelId());
-        }
+        String batchNo = resolveOrGenerateBatchNo(stockUninventoryDto.getBatchNo(), stockUninventoryDto.getProductModelId());
         stockInRecordDto.setBatchNo(batchNo);
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
-        stockInRecordDto.setType("1");
+        if (UNQUALIFIED_TYPE.equals(inventoryType)) {
+            stockInRecordDto.setType("1");
+        } else {
+            stockInRecordDto.setType("2");
+        }
         stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
+        stockInRecordDto.setSource(stockUninventoryDto.getSource());
         stockInRecordService.add(stockInRecordDto);
         return 1;
     }
@@ -145,13 +183,15 @@
     public Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto) {
         String inventoryType = resolveInventoryType(stockUninventoryDto);
         stockUninventoryDto.setType(inventoryType);
+        String batchNo = resolveOutboundBatchNo(stockUninventoryDto.getProductModelId(), inventoryType, stockUninventoryDto.getBatchNo());
+        stockUninventoryDto.setBatchNo(batchNo);
         LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
         eq.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId());
         eq.eq(StockUninventory::getType, inventoryType);
-        if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) {
+        if (StringUtils.isEmpty(batchNo)) {
             eq.isNull(StockUninventory::getBatchNo);
         } else {
-            eq.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo());
+            eq.eq(StockUninventory::getBatchNo, batchNo);
         }
         StockUninventory stockUninventory = stockUninventoryMapper.selectOne(eq);
         if (stockUninventory == null) {
@@ -177,7 +217,7 @@
         stockOutRecordDto.setRecordId(stockUninventoryDto.getRecordId());
         stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
-        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
+        stockOutRecordDto.setBatchNo(batchNo);
         stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
         stockOutRecordDto.setType("1");
         stockOutRecordDto.setRemark(stockUninventoryDto.getRemark());
@@ -188,6 +228,14 @@
     @Override
     public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
         List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto);
+        list.forEach(item -> {
+            if (StringUtils.isNotEmpty(item.getSource())) {
+                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(item.getSource());
+                if (sourceEnum != null) {
+                    item.setSourceText(sourceEnum.getValue());
+                }
+            }
+        });
         ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
         util.exportExcel(response,list, "涓嶅悎鏍煎簱瀛樹俊鎭�");
     }
@@ -195,6 +243,14 @@
     @Override
     public void exportWasteQuery(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
         List<StockUnInventoryExportData> list = stockUninventoryMapper.listWasteQueryExportData(stockUninventoryDto);
+        list.forEach(item -> {
+            if (StringUtils.isNotEmpty(item.getSource())) {
+                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(item.getSource());
+                if (sourceEnum != null) {
+                    item.setSourceText(sourceEnum.getValue());
+                }
+            }
+        });
         ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
         util.exportExcel(response, list, "搴熷搧鏌ヨ淇℃伅");
     }
@@ -278,6 +334,33 @@
         return maxSequence;
     }
 
+    private String resolveOrGenerateBatchNo(String batchNo, Long productModelId) {
+        String normalizedBatchNo = StringUtils.trim(batchNo);
+        if (StringUtils.isNotEmpty(normalizedBatchNo)) {
+            return normalizedBatchNo;
+        }
+        return generateAutoBatchNo(productModelId);
+    }
+
+    private String resolveOutboundBatchNo(Long productModelId, String inventoryType, String batchNo) {
+        String normalizedBatchNo = StringUtils.trim(batchNo);
+        if (StringUtils.isNotEmpty(normalizedBatchNo)) {
+            return normalizedBatchNo;
+        }
+        List<StockUninventory> stockUninventoryList = stockUninventoryMapper.selectList(
+                Wrappers.<StockUninventory>lambdaQuery()
+                        .eq(StockUninventory::getProductModelId, productModelId)
+                        .eq(StockUninventory::getType, inventoryType)
+                        .orderByDesc(StockUninventory::getId));
+        if (CollectionUtils.isEmpty(stockUninventoryList)) {
+            throw new BaseException("搴撳瓨璁板綍涓嶅瓨鍦�");
+        }
+        if (stockUninventoryList.size() == 1) {
+            return stockUninventoryList.get(0).getBatchNo();
+        }
+        throw new BaseException("褰撳墠浜у搧瑙勬牸瀛樺湪澶氫釜鎵规锛岃鍏堥�夋嫨鎵瑰彿鍚庡啀鍑哄簱");
+    }
+
     private int parseSequence(String batchNo, String prefix) {
         if (StringUtils.isEmpty(batchNo) || StringUtils.isEmpty(prefix) || !batchNo.startsWith(prefix)) {
             return 0;

--
Gitblit v1.9.3