From ba4f2ca4b3ae845d2bd1e92338b948a8f95ffaaa Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 09 六月 2026 15:11:27 +0800
Subject: [PATCH] 修改废品入库类型

---
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java |  111 ++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 93 insertions(+), 18 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 85fc1b1..81e6ae9 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -13,6 +13,8 @@
 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;
@@ -28,16 +30,21 @@
 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.math.RoundingMode;
 import java.util.List;
 
 @Service
 @AllArgsConstructor
 public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
+
+    private static final String UNQUALIFIED_TYPE = "unqualified";
+    private static final String WASTE_TYPE = "waste";
 
     private StockInRecordMapper stockInRecordMapper;
     private StockInventoryMapper stockInventoryMapper;
@@ -53,7 +60,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);
@@ -97,9 +104,11 @@
                     stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
                     stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
                 }
-            }else if (stockInRecord.getType().equals("1")) {
+            }else if (stockInRecord.getType().equals("1") || stockInRecord.getType().equals("2")) {
+                String uninventoryType = resolveUninventoryTypeByInRecordType(stockInRecord.getType());
                 LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<StockUninventory>()
-                        .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
+                        .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId())
+                        .eq(StockUninventory::getType, uninventoryType);
                 if (StringUtils.isEmpty(stockInRecord.getBatchNo())) {
                     eq.isNull(StockUninventory::getBatchNo);
                 } else {
@@ -113,6 +122,7 @@
                     stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                     stockUninventoryDto.setBatchNo(stockUninventory.getBatchNo());
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
+                    stockUninventoryDto.setType(uninventoryType);
                     stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
                 }
             }
@@ -145,9 +155,12 @@
         return stockInventoryMapper.selectOne(eq);
     }
 
-    private StockUninventory getStockUninventory(Long productModelId, String batchNo) {
+    private StockUninventory getStockUninventory(Long productModelId, String batchNo, String uninventoryType) {
         LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
         eq.eq(StockUninventory::getProductModelId, productModelId);
+        if (StringUtils.isNotEmpty(uninventoryType)) {
+            eq.eq(StockUninventory::getType, uninventoryType);
+        }
         if (StringUtils.isEmpty(batchNo)) {
             eq.isNull(StockUninventory::getBatchNo);
         } else {
@@ -204,14 +217,18 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int batchApprove(List<Long> ids, Integer approvalStatus) {
-        if (CollectionUtils.isEmpty(ids)) {
+    public int batchApprove(Integer approvalStatus, List<StockInRecordDto.StockInRecordApproveItemDto> items) {
+        if (CollectionUtils.isEmpty(items)) {
             throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) {
             throw new BaseException("瀹℃壒鐘舵�佸�兼棤鏁�");
         }
-        for (Long id : ids) {
+        for (StockInRecordDto.StockInRecordApproveItemDto item : items) {
+            Long id = item.getId();
+            if (id == null) {
+                throw new BaseException("鍏ュ簱璁板綍ID涓嶈兘涓虹┖");
+            }
             StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
             if (stockInRecord == null) {
                 throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
@@ -219,6 +236,18 @@
             if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
                 throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
             }
+
+            // 鑾峰彇瀹℃壒鏃朵慨鏀圭殑鍏ュ簱鏁伴噺锛屽鏋滄病鏈変慨鏀瑰垯浣跨敤鍘熸暟閲�
+            final BigDecimal finalStockInNum;
+            if (item.getStockInNum() != null && item.getStockInNum().compareTo(BigDecimal.ZERO) > 0) {
+                finalStockInNum = item.getStockInNum();
+                adjustPurchaseInboundAuditFields(stockInRecord, finalStockInNum);
+                // 鏇存柊鍏ュ簱璁板綍鐨勫叆搴撴暟閲�
+                stockInRecord.setStockInNum(finalStockInNum);
+            } else {
+                finalStockInNum = stockInRecord.getStockInNum();
+            }
+
             stockInRecord.setApprovalStatus(approvalStatus);
             stockInRecordMapper.updateById(stockInRecord);
 
@@ -233,37 +262,43 @@
                 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);
+                    stockInventoryDto.setQualitity(finalStockInNum);
                     if (stockInventory == null) {
                         stockInventoryMapper.insert(new StockInventory() {{
                             setProductModelId(stockInRecord.getProductModelId());
-                            setQualitity(stockInRecord.getStockInNum());
+                            setQualitity(finalStockInNum);
                             setBatchNo(stockInRecord.getBatchNo());
                             setRemark(stockInRecord.getRemark());
                             setWarnNum(stockInRecord.getWarnNum());
+                            setManufacturerId(stockInRecord.getManufacturerId());
+                            setSource(stockInRecord.getSource());
                             setVersion(1);
                         }});
                     } else {
                         stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
                     }
-                } else if ("1".equals(stockInRecord.getType())) {
+                } else if ("1".equals(stockInRecord.getType()) || "2".equals(stockInRecord.getType())) {
                     // 涓嶅悎鏍煎叆搴� -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
-                    StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
+                    String uninventoryType = resolveUninventoryTypeByInRecordType(stockInRecord.getType());
+                    StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo(), uninventoryType);
                     StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                     stockUninventoryDto.setProductModelId(stockInRecord.getProductModelId());
                     stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
-                    stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
+                    stockUninventoryDto.setQualitity(finalStockInNum);
                     stockUninventoryDto.setRemark(stockInRecord.getRemark());
+                    stockUninventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
+                    stockUninventoryDto.setSource(stockInRecord.getSource());
+                    stockUninventoryDto.setType(uninventoryType);
                     if (stockUninventory == null) {
                         stockUninventoryMapper.insert(new StockUninventory() {{
                             setProductModelId(stockInRecord.getProductModelId());
-                            setQualitity(stockInRecord.getStockInNum());
+                            setQualitity(finalStockInNum);
                             setBatchNo(stockInRecord.getBatchNo());
+                            setType(uninventoryType);
                             setRemark(stockInRecord.getRemark());
+                            setManufacturerId(stockInRecord.getManufacturerId());
+                            setSource(stockInRecord.getSource());
                             setVersion(1);
                         }});
                     } else {
@@ -272,7 +307,47 @@
                 }
             }
         }
-        return ids.size();
+        return items.size();
+    }
+
+    private String resolveUninventoryTypeByInRecordType(String stockInType) {
+        if ("2".equals(stockInType)) {
+            return WASTE_TYPE;
+        }
+        return UNQUALIFIED_TYPE;
+    }
+
+    private void adjustPurchaseInboundAuditFields(StockInRecord stockInRecord, BigDecimal finalStockInNum) {
+        if (stockInRecord == null || finalStockInNum == null) {
+            return;
+        }
+        if (!StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode().equals(stockInRecord.getRecordType())) {
+            return;
+        }
+        BigDecimal theoryStockInNum = stockInRecord.getTheoryStockInNum();
+        if (theoryStockInNum == null || theoryStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        if (finalStockInNum.compareTo(theoryStockInNum) > 0) {
+            throw new BaseException("閲囪喘鍏ュ簱瀹℃牳鏃讹紝瀹為檯鍏ュ簱鏁伴噺涓嶈兘澶т簬鐞嗚鍏ュ簱鏁伴噺");
+        }
+        if (Boolean.TRUE.equals(stockInRecord.getIsContainsWater())) {
+            BigDecimal waterContent = theoryStockInNum.subtract(finalStockInNum)
+                    .multiply(new BigDecimal("100"))
+                    .divide(theoryStockInNum, 4, RoundingMode.HALF_UP);
+            stockInRecord.setWaterContent(waterContent);
+        }
+    }
+
+    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

--
Gitblit v1.9.3