From c94ab7a91bfb3015d929a94837f3a45289e8bbf1 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 03 四月 2026 11:51:49 +0800
Subject: [PATCH] feat:采购/库存入库添加批号

---
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |   63 +++++++++++++++++++++++++++++--
 1 files changed, 58 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index b9a065e..0e66a5c 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -37,9 +37,12 @@
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * <p>
@@ -76,6 +79,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
+        List<StockInventory> stockInventoryList = stockInventoryMapper.selectList(null);
         //鏂板鍏ュ簱璁板綍鍐嶆坊鍔犲簱瀛�
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
@@ -87,19 +91,65 @@
         stockInRecordDto.setLockedQuantity(stockInventoryDto.getLockedQuantity());
         stockInRecordDto.setApproveStatus(0);
         stockInRecordDto.setType("0");
+        if (stockInventoryDto.getBatchNo() == null || stockInventoryDto.getBatchNo().isEmpty()) {
+            String batchNo;
+            // 鑾峰彇褰撳墠鏈堜唤锛堜袱浣嶏級
+            LocalDate now = LocalDate.now();
+            String monthFlag = now.format(DateTimeFormatter.ofPattern("MM"));
+
+            // 鑾峰彇褰撳墠鏈堜唤鐨勬渶澶ф祦姘村彿
+            int maxSeq = getCurrentMonthMaxSeq(stockInventoryDto, monthFlag, stockInventoryList);
+
+            // 鏂版祦姘村彿 = 鏈�澶ф祦姘村彿 + 1
+            int newSeq = maxSeq + 1;
+            String seqStr = String.format("%03d", newSeq);
+
+            // 缁勮batchNo
+            batchNo = stockInventoryDto.getMaterialCode() + stockInventoryDto.getModel() + "P" + monthFlag + seqStr;
+            stockInRecordDto.setBatchNo(batchNo);
+        } else {
+            stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+        }
         Long id = stockInRecordService.add(stockInRecordDto);
         LoginUser loginUser = SecurityUtils.getLoginUser();
         if (id != null) {
             try {
-                addApproveByPurchase(loginUser, stockInRecordDto,id);
+                addApproveByPurchase(loginUser, stockInRecordDto, id);
             } catch (Exception e) {
-                e.printStackTrace();
+                throw new RuntimeException(e.getMessage());
             }
         }
         return true;
     }
 
-    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto,Long id) throws Exception {
+    /**
+     * 鏌ヨ褰撳墠鏈堜唤宸插瓨鍦ㄧ殑鏈�澶ф祦姘村彿
+     */
+    private static int getCurrentMonthMaxSeq(StockInventoryDto dto, String monthFlag, List<StockInventory> existingList) {
+        int maxSeq = 0;
+
+        String prefix = dto.getMaterialCode() + dto.getModel() + "P" + monthFlag;
+
+        // 姝e垯鍖归厤锛氬墠缂� + 3浣嶆暟瀛�
+        Pattern pattern = Pattern.compile(Pattern.quote(prefix) + "(\\d{3})");
+
+        for (StockInventory item : existingList) {
+            String batchNo = item.getBatchNo();
+            if (batchNo == null) continue;
+
+            Matcher matcher = pattern.matcher(batchNo);
+            if (matcher.find()) {
+                int seq = Integer.parseInt(matcher.group(1));
+                if (seq > maxSeq) {
+                    maxSeq = seq;
+                }
+            }
+        }
+
+        return maxSeq;
+    }
+
+    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto, Long id) throws Exception {
         ApproveProcessVO approveProcessVO = new ApproveProcessVO();
         approveProcessVO.setApproveType(9);
         approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
@@ -123,6 +173,7 @@
         StockInventory oldStockInventory = stockInventoryMapper.selectOne(
                 new QueryWrapper<StockInventory>().lambda()
                         .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
+                        .eq(StockInventory::getBatchNo, stockInRecord.getBatchNo())
         );
 
         if (ObjectUtils.isEmpty(oldStockInventory)) {
@@ -134,12 +185,14 @@
             newStockInventory.setRemark(stockInRecord.getRemark());
             newStockInventory.setLockedQuantity(stockInRecord.getLockedQuantity());
             newStockInventory.setWarnNum(stockInRecord.getWarnNum());
+            newStockInventory.setBatchNo(stockInRecord.getBatchNo());
             stockInventoryMapper.insert(newStockInventory);
         } else {
             // 瀛樺湪鍒欐洿鏂�
             LambdaUpdateWrapper<StockInventory> updateWrapper = new LambdaUpdateWrapper<>();
             updateWrapper
                     .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
+                    .eq(StockInventory::getBatchNo, stockInRecord.getBatchNo())
                     .setSql(stockInRecord.getStockInNum() != null,
                             "qualitity = qualitity + " + stockInRecord.getStockInNum())
                     .setSql(true, "version = version + 1")
@@ -179,7 +232,7 @@
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
             stockInventoryMapper.insert(newStockInventory);
-        }else {
+        } else {
             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
         }
         return true;
@@ -209,7 +262,7 @@
             // 鏌ヨ浜у搧瑙勬牸鍚�
             ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
             Product product = productMapper.selectById(productModel.getProductId());
-            throw new RuntimeException(product.getProductName()+"/"+productModel.getModel() + "搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
+            throw new RuntimeException(product.getProductName() + "/" + productModel.getModel() + "搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
         }
 
         stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);

--
Gitblit v1.9.3