From f2c7576cbd050824ec78233483e06fc375382bfb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 02 四月 2026 17:04:03 +0800
Subject: [PATCH] yys 1.客户档案导入-维护人,维护时间默认当前 2.销售报价审核非必填,产品选择方式也要改 3.销售产品增加物料号字段 4.产品维护增加录入时间,修改时间 6.发货审核不需要了 7.BI的生产核算分析不要了,增加生产订单当前工序 3.库存导入模板规格改成图纸编号,产品名称可以为空,加个库位 4.库存管理外购改为标准件 5.bom产品唯一 6.产品根据bom计算子项数量(只统计二级)

---
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |  153 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 125 insertions(+), 28 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 ae5b91f..fcec502 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -4,22 +4,21 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.pojo.BorrowInfo;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.execl.StockInventoryExportData;
-import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -27,6 +26,8 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -45,33 +46,54 @@
     private StockInRecordService stockInRecordService;
     private StockOutRecordService stockOutRecordService;
     private SalesLedgerProductMapper salesLedgerProductMapper;
-    private StockUtils stockUtils;
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
     }
 
     //鍏ュ簱璋冪敤
+
+    /**
+     *
+     * @param stockInventoryDto
+     * @param isProduction  鏄惁鐢熶骇鍏ュ簱 1-鏄� 2-鍚︼紙鐢熶骇闇�瑕佸鏍告墠鑳藉叆搴擄級
+     * @return
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
+    public Boolean addstockInventory(StockInventoryDto stockInventoryDto,Integer isProduction) {
         //鏂板鍏ュ簱璁板綍鍐嶆坊鍔犲簱瀛�
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
-        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
+        if(isProduction == 1){
+            stockInRecordDto.setWaitAuditNum(stockInventoryDto.getQualitity());
+        }else{
+            stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
+        }
         stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockInRecordDto.setType("0");
+        stockInRecordDto.setStockLocation(stockInventoryDto.getStockLocation());
+        stockInRecordDto.setStatus(isProduction);
         stockInRecordService.add(stockInRecordDto);
+        if(isProduction == 1){
+            return false;
+        }
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>()
+                .lambda()
+                .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+                .eq(StockInventory::getStockLocation, stockInventoryDto.getStockLocation()));
         if (ObjectUtils.isEmpty(oldStockInventory)) {
             StockInventory newStockInventory = new StockInventory();
             newStockInventory.setProductModelId(stockInventoryDto.getProductModelId());
             newStockInventory.setQualitity(stockInventoryDto.getQualitity());
             newStockInventory.setVersion(1);
             newStockInventory.setRemark(stockInventoryDto.getRemark());
+            newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
+            newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
+            newStockInventory.setStockLocation(stockInventoryDto.getStockLocation());
             stockInventoryMapper.insert(newStockInventory);
         }else {
              stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
@@ -83,48 +105,89 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
-            //  鏂板鍑哄簱璁板綍
+        //  鏂板鍑哄簱璁板綍
         StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
         stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
         stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
         stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
         stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockOutRecordDto.setType("0");
+        stockOutRecordDto.setStockLocation(stockInventoryDto.getStockLocation());
         stockOutRecordService.add(stockOutRecordDto);
-        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>()
+                .lambda()
+                .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+                .eq(StockInventory::getStockLocation, stockInventoryDto.getStockLocation()));
         if (ObjectUtils.isEmpty(oldStockInventory)) {
-            throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
-        }else {
-            stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
+            throw new RuntimeException("搴撲綅銆�" + stockInventoryDto.getStockLocation() + "銆戜骇鍝佸簱瀛樹笉瀛樺湪");
         }
+        BigDecimal lockedQty = oldStockInventory.getLockedQuantity();
+        if (lockedQty == null) {
+            lockedQty = BigDecimal.ZERO;
+        }
+        if (stockInventoryDto.getQualitity().compareTo(oldStockInventory.getQualitity().subtract(lockedQty)) > 0) {
+            throw new RuntimeException("搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
+        }
+        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
         return true;
     }
 
     @Override
     public R importStockInventory(MultipartFile file) {
         try {
-            final StringBuffer[] errorMsg = {new StringBuffer()};
-            //鏌ヨ鎵�鏈夌殑浜у搧
-            List<SalesLedgerProduct> salesLedgerProducts =salesLedgerProductMapper.selectProduct();
+            // 鏌ヨ鎵�鏈夌殑浜у搧
+            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectProduct();
 
             ExcelUtil<StockInventoryExportData> util = new ExcelUtil<StockInventoryExportData>(StockInventoryExportData.class);
             List<StockInventoryExportData> list = util.importExcel(file.getInputStream());
-            list.stream().forEach(dto -> {
-                salesLedgerProducts.stream().forEach(item->{
-                    if (item.getProductCategory().equals(dto.getProductName())&&item.getSpecificationModel().equals(dto.getModel())) {
-                            //鏇存柊搴撳瓨
-                            stockUtils.addStock(item.getId(),dto.getQualitity(), StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode(),0L);
-                    }else {
-                        errorMsg[0] = errorMsg[0].append("浜у搧鍚嶇О锛�"+dto.getProductName()+"瑙勬牸锛�"+dto.getModel()+"涓嶅瓨鍦�").append("\n");
+
+            // 璁板綍鏈壘鍒板尮閰嶉」鐨勬暟鎹�
+            List<String> unmatchedRecords = new ArrayList<>();
+
+            list.forEach(dto -> {
+                boolean matched = false;
+                for (SalesLedgerProduct item : salesLedgerProducts) {
+                    if (item.getSpecificationModel().equals(dto.getModel())) {
+                        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+                        stockInventoryDto.setRecordId(0L);
+                        stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
+                        stockInventoryDto.setQualitity(dto.getQualitity());
+                        stockInventoryDto.setRemark(dto.getRemark());
+                        stockInventoryDto.setWarnNum(dto.getWarnNum());
+                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity())&&dto.getLockedQuantity().compareTo(dto.getQualitity())>0) {
+                            throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫簱瀛樻暟閲�");
+                        }
+                        stockInventoryDto.setLockedQuantity(dto.getLockedQuantity());
+                        stockInventoryDto.setProductModelId(item.getProductModelId());
+                        stockInventoryDto.setStockLocation(dto.getStockLocation());
+                        this.addstockInventory(stockInventoryDto,2);
+                        matched = true;
+                        break; // 鎵惧埌鍖归厤椤瑰悗璺冲嚭寰幆
                     }
-                });
+                }
+                if (!matched) {
+                    // 璁板綍鏈尮閰嶇殑鏁版嵁
+                    String unmatchedInfo = String.format("浜у搧鍚嶇О锛�%s锛岃鏍煎瀷鍙凤細%s",
+                            dto.getProductName(), dto.getModel());
+                    unmatchedRecords.add(unmatchedInfo);
+                }
             });
-            return R.ok(errorMsg[0]);
-        }catch (Exception e){
+            // 鏋勫缓杩斿洖淇℃伅
+            StringBuilder message = new StringBuilder();
+            if (!unmatchedRecords.isEmpty()) {
+                message.append("浠ヤ笅浜у搧鏈壘鍒板尮閰嶉」锛歕n");
+                for (String record : unmatchedRecords) {
+                    message.append(record).append("\n");
+                }
+                throw new RuntimeException(message.toString());
+            }
+        } catch (Exception e) {
             e.printStackTrace();
+            return R.fail("瀵煎叆澶辫触锛�" + e.getMessage());
         }
-        return R.fail();
+        return R.ok("瀵煎叆鎴愬姛");
     }
+
 
     @Override
     public void exportStockInventory(HttpServletResponse response, StockInventoryDto stockInventoryDto) {
@@ -133,4 +196,38 @@
         ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
         util.exportExcel(response,list, "搴撳瓨淇℃伅");
     }
+
+    @Override
+    public IPage<StockInRecordDto> stockInventoryPage(StockInventoryDto stockInventoryDto, Page page) {
+        return stockInventoryMapper.stockInventoryPage(stockInventoryDto,page);
+    }
+
+    @Override
+    public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) {
+        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page);
+    }
+
+    @Override
+    public Boolean frozenStock(StockInventoryDto stockInventoryDto) {
+        StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
+        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+            throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
+        }
+        if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) {
+            stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
+        }else {
+            stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
+        }
+        return this.updateById(stockInventory);
+    }
+
+    @Override
+    public Boolean thawStock(StockInventoryDto stockInventoryDto) {
+        StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
+        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+            throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
+        }
+        stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
+        return this.updateById(stockInventory);
+    }
 }

--
Gitblit v1.9.3