From ac6db1c4fddcb89c9668e34a35f023817a59f838 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 01 四月 2026 17:54:44 +0800
Subject: [PATCH] yys 1.产品导入新增excel错误提示 2.bom导入新增excel错误提示 3.仓储物流增加库位字段 4.修改发货出库-新增库位 5.修改采购入库审核-新增库位 6.生产入库-新增库位,审核

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java             |    5 
 src/main/java/com/ruoyi/stock/pojo/StockInventory.java                                  |    3 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                        |    2 
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                     |    4 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java           |    1 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                              |    5 
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                                  |    3 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                         |   15 +
 src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java  |    6 
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java                         |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java                |   45 +++++
 src/main/java/com/ruoyi/basic/dto/ProductModelExcelCopyErrorDto.java                    |   13 +
 src/main/java/com/ruoyi/production/service/ProductBomService.java                       |    2 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java                              |    3 
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java                   |   12 +
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java                 |    5 
 src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java  |    6 
 src/main/resources/mapper/stock/StockUninventoryMapper.xml                              |    4 
 src/main/java/com/ruoyi/basic/pojo/ProductModel.java                                    |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java               |   38 +++
 src/main/java/com/ruoyi/basic/service/IProductModelService.java                         |    3 
 src/main/java/com/ruoyi/production/dto/BomImportErrorDto.java                           |   15 +
 src/main/java/com/ruoyi/basic/controller/ProductController.java                         |    4 
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                                   |    9 +
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java   |    7 
 src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java              |   45 ++++-
 src/main/resources/mapper/stock/StockInventoryMapper.xml                                |    1 
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java               |    1 
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java                 |   88 +++++----
 src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java                                  |    8 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                                  |    4 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                                 |    3 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                  |    5 
 src/main/java/com/ruoyi/production/pojo/ProductOrder.java                               |   14 +
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java                |   51 -----
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                                 |   14 +
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                |   15 +
 src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java |   14 
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java         |    6 
 src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java                       |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java             |   15 +
 src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java                   |   14 +
 src/main/java/com/ruoyi/production/controller/ProductBomController.java                 |    7 
 src/main/java/com/ruoyi/stock/pojo/StockUninventory.java                                |    3 
 src/main/java/com/ruoyi/approve/service/IApproveNodeService.java                        |    3 
 45 files changed, 388 insertions(+), 142 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
index 5cda3a3..d57718e 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -1,8 +1,12 @@
 package com.ruoyi.approve.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ruoyi.approve.pojo.ApproveNode;
 import com.ruoyi.approve.service.IApproveNodeService;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,6 +14,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.util.List;
 
 @Api(tags = "瀹℃壒璁板綍")
 @RestController
@@ -42,6 +47,15 @@
         return AjaxResult.success();
     }
 
+    @ApiOperation(value = "閲囪喘瀹℃牳濉啓搴撲綅鍏ュ簱")
+    @PostMapping("/purchaseApprove")
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult purchaseApprove(@RequestBody List<SalesLedgerProduct> salesLedgerProducts) {
+        approveNodeService.purchaseApprove(salesLedgerProducts);
+        return AjaxResult.success();
+    }
+
+
     /**
      * 鍒濆鍖栧鎵硅妭鐐�
      * @param id
diff --git a/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
index eac4cce..747a785 100644
--- a/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
+++ b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.approve.pojo.ApproveNode;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 
 import java.io.IOException;
 import java.util.List;
@@ -18,4 +19,6 @@
     void updateApproveNode(ApproveNode approveNode) throws IOException;
 
     void delApproveNodeByApproveId(String id);
+
+    void purchaseApprove(List<SalesLedgerProduct> salesLedgerProducts);
 }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 00a53f5..50b6194 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -202,9 +202,6 @@
                         // 璐ㄦ
                         if (salesLedgerProduct.getIsChecked()) {
                             purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
-                        }else {
-                            //鐩存帴鍏ュ簱
-                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
                         }
                     }
                 } else if (status.equals(3)) {
@@ -306,6 +303,18 @@
         }
     }
 
+    @Override
+    public void purchaseApprove(List<SalesLedgerProduct> salesLedgerProducts) {
+        for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
+            stockUtils.addStock(salesLedgerProduct.getProductModelId(),
+                    salesLedgerProduct.getQuantity(),
+                    StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
+                    salesLedgerProduct.getId(),
+                    salesLedgerProduct.getStockLocation(),
+                    2);
+        }
+    }
+
     //瀹℃壒绫诲瀷鑾峰彇(涓庡墠绔〉闈㈠搴�)
     private String approveProcessType(Integer approveType){
         switch (approveType){
diff --git a/src/main/java/com/ruoyi/basic/controller/ProductController.java b/src/main/java/com/ruoyi/basic/controller/ProductController.java
index 22dc714..22fee19 100644
--- a/src/main/java/com/ruoyi/basic/controller/ProductController.java
+++ b/src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -139,8 +139,8 @@
      */
     @Log(title = "瀵煎叆浜у搧",businessType = BusinessType.IMPORT)
     @PostMapping("import")
-    public AjaxResult importProduct(MultipartFile file) {
-        return AjaxResult.success(productModelService.importProduct(file));
+    public void importProduct(HttpServletResponse response,MultipartFile file) {
+        productModelService.importProduct(file,response);
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/basic/dto/ProductModelExcelCopyErrorDto.java b/src/main/java/com/ruoyi/basic/dto/ProductModelExcelCopyErrorDto.java
new file mode 100644
index 0000000..e2887f9
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/dto/ProductModelExcelCopyErrorDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.basic.dto;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+import org.apache.poi.ss.usermodel.IndexedColors;
+
+@Data
+public class ProductModelExcelCopyErrorDto extends ProductModelExcelCopyDto{
+
+    @Excel(name = "閿欒淇℃伅",sort = 1,color = IndexedColors.RED)
+    private String errorMsg;
+
+}
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index 6b41fab..6ba6f08 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -16,6 +16,10 @@
 
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "閿欒淇℃伅")
+    @TableField(exist = false)
+    private String errorMsg;
+
     @TableField(exist = false)
     private List<CommonFile> SalesLedgerFiles;
 
diff --git a/src/main/java/com/ruoyi/basic/service/IProductModelService.java b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
index 1952821..9486941 100644
--- a/src/main/java/com/ruoyi/basic/service/IProductModelService.java
+++ b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
@@ -8,6 +8,7 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
 
@@ -34,5 +35,5 @@
      */
     IPage<ProductModel> modelListPage(Page page , ProductDto productDto);
 
-    Boolean importProduct(MultipartFile file);
+    void importProduct(MultipartFile file, HttpServletResponse response);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index 066d886..b2918bd 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -32,6 +32,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -130,46 +131,52 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean importProduct(MultipartFile file) {
+    public void importProduct(MultipartFile file, HttpServletResponse response) {
+        ExcelUtil<ProductModelExcelCopyDto> productModelExcelUtil = new ExcelUtil<>(ProductModelExcelCopyDto.class);
+        List<ProductModelExcelCopyDto> productModelList = null;
         try {
-            ExcelUtil<ProductModelExcelCopyDto> productModelExcelUtil = new ExcelUtil<>(ProductModelExcelCopyDto.class);
-            List<ProductModelExcelCopyDto> productModelList = productModelExcelUtil.importExcel(file.getInputStream());
-            if(CollectionUtils.isNotEmpty(productModelList)){
-                // 2. 鎸変骇鍝佸悕绉�,鍥剧焊缂栧彿鍒嗙粍
-                Map<Map.Entry<String, String>, List<ProductModelExcelCopyDto>> groupedByProductNameAndDrawingNumber =
-                        productModelList.stream()
-                                .collect(Collectors.groupingBy(
-                                        dto -> new AbstractMap.SimpleEntry<>(
-                                                dto.getProductName(),
-                                                dto.getModel()
-                                        )
-                                ));
-                // 2. 閬嶅巻鍒嗙粍缁撴灉澶勭悊鏁版嵁
-                for (Map.Entry<Map.Entry<String, String>, List<ProductModelExcelCopyDto>> entry : groupedByProductNameAndDrawingNumber.entrySet()) {
-                    Map.Entry<String, String> groupKey = entry.getKey();
-                    String productName = groupKey.getKey(); // 浜у搧鍚嶇О
-                    String drawingNumber = groupKey.getValue(); // 鍥剧焊缂栧彿
-                    List<ProductModelExcelCopyDto> dtoList = entry.getValue();
-
-                    // 绌哄垪琛ㄨ烦杩囷紝閬垮厤鍚庣画NPE
-                    if (CollectionUtils.isEmpty(dtoList)) {
-                        continue;
-                    }
-                    ProductModelExcelCopyDto firstDto = dtoList.get(0);
-                    String model = firstDto.getModel();
-
-                    // 3. 鏌ヨ/鏂板浜у搧锛堟寜浜у搧鍚嶇О+鍥剧焊缂栧彿锛屾洿绮惧噯锛�
-                    Product product = getOrCreateProduct(productName, drawingNumber);
-
-                    // 4. 鎵归噺澶勭悊浜у搧鍨嬪彿锛堟寜鍥剧焊缂栧彿+鍨嬪彿锛�
-                    processProductModel(dtoList, product.getId(), model, drawingNumber);
-                }
-            }
-            return true;
+            productModelList = productModelExcelUtil.importExcel(file.getInputStream());
         }catch (Exception e) {
-            e.printStackTrace();
+            throw new ServiceException("鏂囦欢瑙f瀽澶辫触");
         }
-        return false;
+        if(CollectionUtils.isNotEmpty(productModelList)){
+            // 2. 鎸変骇鍝佸悕绉�,鍥剧焊缂栧彿鍒嗙粍
+            Map<Map.Entry<String, String>, List<ProductModelExcelCopyDto>> groupedByProductNameAndDrawingNumber =
+                    productModelList.stream()
+                            .collect(Collectors.groupingBy(
+                                    dto -> new AbstractMap.SimpleEntry<>(
+                                            dto.getProductName(),
+                                            dto.getModel()
+                                    )
+                            ));
+            List<ProductModelExcelCopyErrorDto> errorList = new ArrayList<>();
+            // 2. 閬嶅巻鍒嗙粍缁撴灉澶勭悊鏁版嵁
+            for (Map.Entry<Map.Entry<String, String>, List<ProductModelExcelCopyDto>> entry : groupedByProductNameAndDrawingNumber.entrySet()) {
+                Map.Entry<String, String> groupKey = entry.getKey();
+                String productName = groupKey.getKey(); // 浜у搧鍚嶇О
+                String drawingNumber = groupKey.getValue(); // 鍥剧焊缂栧彿
+                List<ProductModelExcelCopyDto> dtoList = entry.getValue();
+
+                // 绌哄垪琛ㄨ烦杩囷紝閬垮厤鍚庣画NPE
+                if (CollectionUtils.isEmpty(dtoList)) {
+                    continue;
+                }
+                ProductModelExcelCopyDto firstDto = dtoList.get(0);
+                String model = firstDto.getModel();
+
+                // 3. 鏌ヨ/鏂板浜у搧锛堟寜浜у搧鍚嶇О+鍥剧焊缂栧彿锛屾洿绮惧噯锛�
+                Product product = getOrCreateProduct(productName, drawingNumber);
+
+                // 4. 鎵归噺澶勭悊浜у搧鍨嬪彿锛堟寜鍥剧焊缂栧彿+鍨嬪彿锛�
+                processProductModel(dtoList, product.getId(), model, drawingNumber,errorList);
+            }
+            if(CollectionUtils.isNotEmpty(errorList)){
+                // 5. 鎵归噺澶勭悊閿欒鏁版嵁
+                ExcelUtil<ProductModelExcelCopyErrorDto> errorExcelUtil = new ExcelUtil<>(ProductModelExcelCopyErrorDto.class);
+                errorExcelUtil.exportExcel(response,errorList, "閿欒鏁版嵁");
+            }
+        }
+
     }
 
     /**
@@ -196,11 +203,14 @@
      * 鎶藉彇閫氱敤鏂规硶锛氬鐞嗕骇鍝佸瀷鍙凤紙鏂板/鏇存柊锛�
      */
     private void processProductModel(List<ProductModelExcelCopyDto> dtoList,
-                                     Long productId, String model, String drawingNumber) {
+                                     Long productId,
+                                     String model,
+                                     String drawingNumber,
+                                     List<ProductModelExcelCopyErrorDto> errorList) {
         // 鏌ヨ鎵�鏈夊伐鑹鸿矾绾�
         List<ProductProcess> productRoutes = productProcessMapper.selectList(new QueryWrapper<ProductProcess>());
         if(CollectionUtils.isEmpty(productRoutes)){
-            throw new ServiceException("璇峰厛鍒涘缓浜у搧宸ヨ壓璺嚎");
+            productRoutes = new ArrayList<>();
         }
         for (ProductModelExcelCopyDto dto : dtoList) {
             // 鏌ヨ鏉′欢锛氬瀷鍙�+鍥剧焊缂栧彿锛堟洿绮惧噯锛岀鍚堝垎缁勯�昏緫锛�
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
index cfced60..6c23423 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -139,13 +139,13 @@
         for (ReturnSaleProductDto returnSaleProduct : list) {
             bigDecimal = bigDecimal.add(returnSaleProduct.getPrice());
             // 鏄惁鏈夎川閲忛棶棰�
-            if (returnSaleProduct.getIsQuality() == 1) {
-                // 鏈夎川閲忛棶棰橈紝鍏ヤ笉鍚堟牸搴�
-                stockUtils.addUnStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInUnQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(),returnSaleProduct.getId());
-            }else{
-                // 鏃犺川閲忛棶棰橈紝鍏ュ悎鏍煎簱
-                stockUtils.addStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode(),returnSaleProduct.getId());
-            }
+//            if (returnSaleProduct.getIsQuality() == 1) {
+//                // 鏈夎川閲忛棶棰橈紝鍏ヤ笉鍚堟牸搴�
+//                stockUtils.addUnStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInUnQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(),returnSaleProduct.getId());
+//            }else{
+//                // 鏃犺川閲忛棶棰橈紝鍏ュ悎鏍煎簱
+//                stockUtils.addStock(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode(),returnSaleProduct.getId());
+//            }
             returnSaleProduct.setStatus(1);
             returnSaleProductService.updateById(returnSaleProduct);
         }
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 4e85270..aa535a3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -49,6 +49,7 @@
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
         stockUninventoryDto.setQualitity(quantity);
         stockUninventoryDto.setProductModelId(productModelId);
+        stockUninventoryDto.setStockLocation("涓嶅悎鏍煎簱浣�");
         stockUninventoryService.addStockUninventory(stockUninventoryDto);
     }
 
@@ -65,6 +66,7 @@
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
         stockUninventoryDto.setQualitity(quantity);
         stockUninventoryDto.setProductModelId(productModelId);
+        stockUninventoryDto.setStockLocation("涓嶅悎鏍煎簱浣�");
         stockUninventoryService.subtractStockUninventory(stockUninventoryDto);
     }
 
@@ -75,13 +77,19 @@
      * @param recordType
      * @param recordId
      */
-    public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void addStock(Long productModelId,
+                         BigDecimal quantity,
+                         String recordType,
+                         Long recordId,
+                         String stockLocation,
+                         Integer isProduction) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
-        stockInventoryService.addstockInventory(stockInventoryDto);
+        stockInventoryDto.setStockLocation(stockLocation);
+        stockInventoryService.addstockInventory(stockInventoryDto,isProduction);
     }
 
     /**
@@ -91,12 +99,13 @@
      * @param recordType
      * @param recordId
      */
-    public void substractStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void substractStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId,String stockLocation) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setStockLocation(stockLocation);
         stockInventoryService.subtractStockInventory(stockInventoryDto);
     }
 
diff --git a/src/main/java/com/ruoyi/production/controller/ProductBomController.java b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
index 0ad7d59..43662d0 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductBomController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -102,12 +102,11 @@
     }
 
 
-    @PostMapping("uploadBom")
-    @PreAuthorize("@ss.hasPermi('product:bom:import')")
+    @PostMapping("/uploadBom")
     @Log(title = "鏍规嵁Excel瀵煎叆BOM", businessType = BusinessType.IMPORT)
     @ApiOperation("鏍规嵁Excel瀵煎叆BOM")
-    public AjaxResult uploadBom(@RequestParam("file") MultipartFile file) {
-        return productBomService.uploadBom(file);
+    public void uploadBom(@RequestParam("file") MultipartFile file,HttpServletResponse response) {
+        productBomService.uploadBom(file,response);
     }
 
     @PostMapping("exportBom")
diff --git a/src/main/java/com/ruoyi/production/dto/BomImportErrorDto.java b/src/main/java/com/ruoyi/production/dto/BomImportErrorDto.java
new file mode 100644
index 0000000..2dc4155
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/BomImportErrorDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.poi.ss.usermodel.IndexedColors;
+
+@Data
+public class BomImportErrorDto extends BomImportDto{
+
+    @ApiModelProperty(value = "閿欒淇℃伅")
+    @Excel(name = "閿欒淇℃伅",sort = 1,color = IndexedColors.RED)
+    private String errorMsg;
+
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index e6739fa..ea7bbcc 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -64,6 +64,20 @@
     private String npsNo;
 
     /**
+     * 涓嶉�氳繃鍘熷洜
+     */
+    @ApiModelProperty(value = "涓嶉�氳繃鍘熷洜")
+    @Excel(name = "涓嶉�氳繃鍘熷洜")
+    private String reason;
+
+    /**
+     * 瀹為檯鍏ュ簱鏁伴噺
+     */
+    @ApiModelProperty(value = "瀹為檯鍏ュ簱鏁伴噺")
+    @Excel(name = "瀹為檯鍏ュ簱鏁伴噺")
+    private BigDecimal actualStockInNum;
+
+    /**
      * 绉熸埛id
      */
     @ApiModelProperty(value = "绉熸埛id")
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index 3f15e1c..424f0cc 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -36,4 +36,8 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty(value = "搴撲綅")
+    @TableField(exist = false)
+    private String stockLocation;
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductBomService.java b/src/main/java/com/ruoyi/production/service/ProductBomService.java
index d812f9f..d4746c6 100644
--- a/src/main/java/com/ruoyi/production/service/ProductBomService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductBomService.java
@@ -24,7 +24,7 @@
 
     AjaxResult add(ProductBom productBom);
 
-    AjaxResult uploadBom(MultipartFile file);
+    void uploadBom(MultipartFile file,HttpServletResponse response);
 
     void exportBom(HttpServletResponse response, Integer bomId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
index ea3dc41..91dbec8 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
@@ -14,6 +14,7 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.production.dto.BomImportDto;
+import com.ruoyi.production.dto.BomImportErrorDto;
 import com.ruoyi.production.dto.ProductBomDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.mapper.ProductBomMapper;
@@ -23,6 +24,7 @@
 import com.ruoyi.production.service.ProductBomService;
 import com.ruoyi.production.service.ProductProcessService;
 import com.ruoyi.production.service.ProductStructureService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -103,14 +105,17 @@
      * @param children 褰撳墠鐖堕」鐨勫瓙椤瑰垪琛�
      * @return 淇濆瓨鍚庣殑鐖堕」浜у搧ID
      */
-    private void saveBomRecursive(List<BomImportDto> children,ProductBom bom,ProductModel rootModel,Map<String, Long> processMap) {
+    private void saveBomRecursive(List<BomImportDto> children,
+                                  ProductBom bom,ProductModel rootModel,
+                                  Map<String, Long> processMap,
+                                  List<BomImportErrorDto> errorList ) {
         // 1. 鑾峰彇children涓瓙椤逛骇鍝佺紪鍙蜂负绌虹殑鏁版嵁
         List<BomImportDto> parentChildren = children
                 .stream()
                 .filter(child -> StringUtils.isEmpty(child.getChildCode()))
                 .collect(Collectors.toList());
         if(CollectionUtils.isEmpty(parentChildren)){
-            throw new ServiceException("璇烽�夋嫨鐖堕」浜у搧缂栧彿");
+            return;
         }
         BomImportDto parentId = parentChildren.get(0); // 鐖剁骇鏁版嵁
         ProductStructure rootNode = new ProductStructure();
@@ -129,7 +134,13 @@
             }
             //  鑾峰彇瀛愰」妯″瀷淇℃伅
             ProductModel childModel = findModel(child.getChildName(), child.getChildSpec());
-
+            if(childModel.getId() == null){
+                BomImportErrorDto errorDto = new BomImportErrorDto();
+                BeanUtils.copyProperties(child, errorDto);
+                errorDto.setErrorMsg(childModel.getErrorMsg());
+                errorList.add(errorDto);
+                continue;
+            }
             //  鎻掑叆缁撴瀯琛�
             ProductStructure node = new ProductStructure();
             node.setBomId(bom.getId());
@@ -147,16 +158,16 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult uploadBom(MultipartFile file) {
+    public void uploadBom(MultipartFile file,HttpServletResponse response) {
         ExcelUtil<BomImportDto> util = new ExcelUtil<>(BomImportDto.class);
         List<BomImportDto> list;
         try {
             list = util.importExcel(file.getInputStream());
         } catch (Exception e) {
-            return AjaxResult.error("Excel瑙f瀽澶辫触");
+            throw new ServiceException("Excel瑙f瀽澶辫触");
         }
 
-        if (list == null || list.isEmpty()) return AjaxResult.error("鏁版嵁涓虹┖");
+        if (list == null || list.isEmpty()) throw new ServiceException("鏂囦欢涓虹┖");
 
         //  澶勭悊宸ュ簭
         list.forEach(dto -> {
@@ -172,11 +183,20 @@
         Map<String, List<BomImportDto>> parentMap = list.stream()
                 .filter(bom -> StringUtils.isNotBlank(bom.getParentCode()))
                 .collect(Collectors.groupingBy(BomImportDto::getParentCode));
+        List<BomImportErrorDto> errorList = new ArrayList<>();
         // 2. 閬嶅巻鎵�鏈夌埗椤癸紝閫掑綊淇濆瓨
         for (Map.Entry<String, List<BomImportDto>> entry : parentMap.entrySet()) {
+
             //  鍒涘缓 BOM 鏁版嵁
             BomImportDto first = entry.getValue().get(0);
             ProductModel rootModel = findModel(first.getParentName(), first.getParentSpec());
+            if(rootModel.getId() == null){
+                BomImportErrorDto error = new BomImportErrorDto();
+                BeanUtils.copyProperties(first, error);
+                error.setErrorMsg(rootModel.getErrorMsg());
+                errorList.add(error);
+                continue;
+            }
             ProductBom bom = new ProductBom();
             bom.setProductModelId(rootModel.getId());
             bom.setVersion("1.0");
@@ -185,9 +205,13 @@
             productBomMapper.updateById(bom);
             // 澶勭悊bom瀛愯〃鏁版嵁
             List<BomImportDto> children = entry.getValue();
-            saveBomRecursive(children,bom,rootModel,processMap);
+            saveBomRecursive(children,bom,rootModel,processMap,errorList);
         }
-        return AjaxResult.success("BOM瀵煎叆鎴愬姛");
+        // 鍒ゆ柇鏄惁鏈夐敊璇暟鎹紝鏈夊氨瀵煎嚭
+        if(CollectionUtils.isNotEmpty(errorList)){
+            ExcelUtil<BomImportErrorDto> utils = new ExcelUtil<>(BomImportErrorDto.class);
+            utils.exportExcel(response,errorList, "BOM閿欒鏁版嵁");
+        }
     }
 
 
@@ -276,7 +300,10 @@
         ProductModel model = productModelService.getOne(new LambdaQueryWrapper<ProductModel>()
 //                .eq(ProductModel::getProductId, product.getId())
                 .eq(ProductModel::getModel, spec).last("limit 1"));
-        if (model == null) throw new ServiceException("鍥剧焊缂栧彿鏈淮鎶わ細" + name + "[" + spec + "]");
+        if (model == null){
+            model = new ProductModel();
+            model.setErrorMsg("鍥剧焊缂栧彿鏈淮鎶わ細" + "[" + spec + "]");
+        }
         return model;
     }
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
index 1b3ab34..777d388 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
@@ -56,7 +56,11 @@
         }
         for (ProductionProductInput productionProductInput : productionProductInputs) {
             productionProductInputMapper.insert(productionProductInput);
-            stockUtils.substractStock(productionProductInput.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductInput.getProductOrderId());
+            stockUtils.substractStock(productionProductInput.getProductModelId(),
+                    productionProductInput.getQuantity(),
+                    StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(),
+                    productionProductInput.getProductOrderId(),
+                    productionProductInput.getStockLocation());
             // 鎵i櫎鐗╂枡娓呭崟
             ProductStructureRecord productStructureRecord = productStructureRecordMapper.selectById(productionProductInput.getProductStructureRecordId());
             if(productStructureRecord != null){
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java
index 931f343..aa77619 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java
@@ -49,7 +49,11 @@
             productionProductInput1.setReturnQuantity(qty.add(qty1));
             productionProductInputMapper.updateById(productionProductInput1);
             // 閫�鏂欏叆搴�
-            stockUtils.addStock(input.getProductModelId(), input.getReturnQuantity(), StockInQualifiedRecordTypeEnum.RETURN_MATERIAL_IN.getCode(), input.getId());
+            stockUtils.addStock(input.getProductModelId(),
+                    input.getReturnQuantity(), StockInQualifiedRecordTypeEnum.RETURN_MATERIAL_IN.getCode(),
+                    input.getId(),
+                    input.getStockLocation(),
+                    2);
             // 澧炲姞鐗╂枡娓呭崟
             ProductStructureRecord productStructureRecord = productStructureRecordMapper.selectById(input.getProductStructureRecordId());
             if(productStructureRecord != null){
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 9c55cbb..b18766d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -264,7 +264,12 @@
                 productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
                 productOrder.setStatus("宸插畬鎴�");
                 // 鐢熶骇瀹屾垚鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productOrder.getCompleteQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(),
+                        productOrder.getCompleteQuantity(),
+                        StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+                        productOrder.getId(),
+                        "",
+                        1);
             }
 //            if (productWorkOrderList.stream().filter(item -> item.getStatus() == 3).count() == productProcessRouteItems.size() - 1) {
 //
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 2111b99..a9fb71f 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -94,7 +94,10 @@
             qualityUnqualifiedMapper.insert(qualityUnqualified);
         } else {
             //鍚堟牸鐩存帴鍏ュ簱
-            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
+            stockUtils.addStock(qualityInspect.getProductModelId(),
+                    qualityInspect.getQuantity(),
+                    StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(),
+                    qualityInspect.getId(),"璐ㄦ鍚堟牸鍏ュ簱",2);
         }
         qualityInspect.setInspectState(1);//宸叉彁浜�
         return qualityInspectMapper.updateById(qualityInspect);
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 5e98fa8..4b2bbe8 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -131,7 +131,11 @@
                     break;
                 case "璁╂鏀捐":
                     //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
-                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    stockUtils.addStock(qualityInspect.getProductModelId(),
+                            unqualified.getQuantity(),
+                            StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(),
+                            unqualified.getId(),
+                            "璁╂鏀捐",2);
                     qualityInspect.setCheckResult("鍚堟牸");
                     qualityInspectService.submit(qualityInspect);
                     break;
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 49548e1..050318d 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -44,57 +44,6 @@
         return AjaxResult.success(listPage);
     }
 
-    @PostMapping("/update")
-    @ApiOperation("鍙戣揣瀹℃壒,鏇存柊鍙戣揣瀹℃壒鐘舵��")
-    @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody ShipmentApproval req) {
-
-        //  鏌ヨ鍙戣揣瀹℃壒
-        ShipmentApproval shipmentApproval = shipmentApprovalMapper.selectById(req.getId());
-        if (shipmentApproval == null) {
-            return AjaxResult.error("鍙戣揣瀹℃壒涓嶅瓨鍦�");
-        }
-
-        //  鏇存柊鍙戣揣瀹℃壒鐘舵��
-        shipmentApproval.setApproveStatus(req.getApproveStatus());
-        boolean update = shipmentApprovalService.updateById(shipmentApproval);
-        if (!update) {
-            //  浜嬪姟鍥炴粴
-            throw new ServiceException("鍙戣揣瀹℃壒鏇存柊澶辫触");
-        }
-        //  鏌ヨ鍏宠仈鐨勯攢鍞彴璐︿骇鍝�
-        SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId());
-        if (salesLedgerProduct == null) {
-            //  鎶涘紓甯镐簨鍔″洖婊�
-            throw new ServiceException("閿�鍞彴璐︿笉瀛樺湪锛屽鎵瑰洖婊�");
-        }
-
-        //  鍚屾鏇存柊閿�鍞彴璐︿骇鍝佺殑瀹℃壒鐘舵��
-        salesLedgerProduct.setApproveStatus(req.getApproveStatus());
-        salesLedgerProductService.updateById(salesLedgerProduct);
-
-        //  瀹℃壒閫氳繃
-        if (req.getApproveStatus() == 3) {
-//            // 鏌ヨ閲囪喘鍏ュ簱璁板綍
-//            LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>()
-//                    .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId());
-//            ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper);
-//
-//            if (procurementRecordStorage == null) {
-//                // 淇濊瘉鍓嶉潰鐨勪慨鏀瑰叏閮ㄥ洖婊�
-//                throw new ServiceException("閲囪喘璁板綍涓嶅瓨鍦紝瀹℃壒鍥炴粴");
-//            }
-
-
-            //鍑哄簱
-            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
-        }
-
-        return AjaxResult.success();
-    }
-
-
-
     /**
      * 瀵煎嚭鍙戣揣淇℃伅绠$悊
      */
diff --git a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
index 48db590..470c58e 100644
--- a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -17,6 +17,10 @@
 @Data
 public class ShippingInfoDto extends ShippingInfo {
 
+    @ApiModelProperty(value = "搴撲綅")
+    @TableField(exist = false)
+    private String stockLocation;
+
     /**
      * 瀹℃壒浜篿d鍒楄〃
      */
@@ -45,4 +49,8 @@
      */
     private BigDecimal returnTotal = BigDecimal.ZERO;
 
+    private String productCategory;
+
+    private String specificationModel;
+
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 0947aa4..6bb8e1d 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -23,8 +23,13 @@
 @TableName("sales_ledger_product")
 @Data
 public class SalesLedgerProduct implements Serializable {
+
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "搴撲綅")
+    @TableField(exist = false)
+    private String stockLocation;
+
     /**
      * 浜у搧淇℃伅涓婚敭
      */
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java
index 90e1d9e..9482e48 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfoDetail.java
@@ -31,6 +31,9 @@
 @ApiModel(value = "ShippingInfoDetail瀵硅薄", description = "鍙戣揣鏄庣粏琛�")
 public class ShippingInfoDetail implements Serializable {
 
+    @ApiModelProperty(value = "搴撲綅")
+    private String stockLocation;
+
     private static final long serialVersionUID = 1L;
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java
index f3e9e4d..bfed098 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoDetailServiceImpl.java
@@ -84,6 +84,7 @@
         }
         // 鎵e簱瀛�
         shippingInfo.setShippingTotal(shippingInfoDetail.getShippingNum());
+        shippingInfo.setStockLocation(shippingInfoDetail.getStockLocation());
         shippingInfoService.deductStock(shippingInfo);
         // 杩佺Щ鏂囦欢
         if(CollectionUtils.isNotEmpty(shippingInfoDetail.getTempFileIds())){
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index 21049c7..1ccdb57 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -166,7 +166,10 @@
         }
         //鎵e噺搴撳瓨
         SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
-        stockUtils.substractStock(salesLedgerProduct.getProductModelId(), req.getShippingTotal(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+        stockUtils.substractStock(salesLedgerProduct.getProductModelId(),
+                req.getShippingTotal(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(),
+                req.getId(),
+                req.getStockLocation());
         byId.setExpressNumber(req.getExpressNumber());
         byId.setExpressCompany(req.getExpressCompany());
         byId.setStatus(req.getStatus());
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index b12fc67..19b3bad 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -2,14 +2,18 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
+import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.service.StockInRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -42,6 +46,14 @@
         return AjaxResult.success(stockInRecordService.batchDelete(ids));
     }
 
+    @ApiOperation("鐢熶骇鍏ュ簱瀹℃牳")
+    @PostMapping("/productionApprove")
+    @Transactional(rollbackFor = Exception.class)
+    public R productionApprove(@RequestBody StockInRecordDto stockInRecordDto) {
+        return R.ok(stockInRecordService.productionApprove(stockInRecordDto));
+    }
+
+
     @PostMapping("/exportStockInRecord")
     @ApiOperation("瀵煎嚭鍏ュ簱璁板綍")
     public void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto) {
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index 70f638e..5c5b0ac 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -14,6 +14,7 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -49,7 +50,7 @@
     public R addstockInventory(@RequestBody StockInventoryDto stockInventoryDto) {
         stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()));
         stockInventoryDto.setRecordId(0L);
-        return R.ok(stockInventoryService.addstockInventory(stockInventoryDto));
+        return R.ok(stockInventoryService.addstockInventory(stockInventoryDto,2));
     }
 
 
@@ -61,9 +62,9 @@
         return R.ok(stockInventoryService.subtractStockInventory(stockInventoryDto));
     }
 
-
     @PostMapping("importStockInventory")
     @ApiOperation("瀵煎叆搴撳瓨")
+    @Transactional(rollbackFor = Exception.class)
     public R importStockInventory(MultipartFile file) {
         return stockInventoryService.importStockInventory(file);
     }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index cabba21..88b65ae 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -3,6 +3,8 @@
 import com.ruoyi.stock.pojo.StockInRecord;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 
 @Data
 public class StockInRecordDto extends StockInRecord {
@@ -31,4 +33,16 @@
     //鐜板瓨閲�
     private String currentStock;
 
+    /**
+     * 涓嶉�氳繃鍘熷洜
+     */
+    private String reason;
+
+    /**
+     * 瀹為檯鍏ュ簱鏁伴噺
+     */
+    private BigDecimal actualStockInNum;
+
+
+
 }
diff --git a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
index 4b7553f..196bb86 100644
--- a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
+++ b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -30,6 +30,9 @@
 
     @Excel(name = "澶囨敞")
     private String remark;
+
+    @Excel(name = "搴撲綅")
+    private String stockLocation;
 //
 //    @Excel(name = "鏈�鏂版洿鏂版椂闂�")
 //    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index 395d18f..9c3e721 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -28,6 +28,9 @@
     @ApiModelProperty(value = "鍏ュ簱鏁伴噺")
     private BigDecimal stockInNum;
 
+    @ApiModelProperty(value = "寰呭鏍稿叆搴撴暟閲忥紙鐢熶骇锛�")
+    private BigDecimal waitAuditNum;
+
     @ApiModelProperty(value = "璁板綍绫诲瀷  鏋氫妇")
     private String recordType;
 
@@ -62,4 +65,10 @@
     @ApiModelProperty(value = "淇敼鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
+
+    @ApiModelProperty(value = "搴撲綅")
+    private String stockLocation;
+
+    @ApiModelProperty(value = "鐘舵�侊紙1 - 寰呭鏍�  2-宸插叆搴擄級")
+    private Integer status;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
index 36e7cf0..6780b32 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -63,4 +63,7 @@
 
     @ApiModelProperty("澶囨敞")
     private String remark;
+
+    @ApiModelProperty(value = "搴撲綅")
+    private String stockLocation;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index e4e3b82..0efcd3d 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -71,4 +71,7 @@
 
     @ApiModelProperty(value = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
+
+    @ApiModelProperty(value = "搴撲綅")
+    private String stockLocation;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
index 6ed47de..0a122a8 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -59,4 +59,7 @@
     @ApiModelProperty("琚鍗曢攣瀹氭暟閲�")
     private BigDecimal lockedQuantity;
 
+    @ApiModelProperty(value = "搴撲綅")
+    private String stockLocation;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 29ba7e5..f758a56 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -19,4 +19,6 @@
     int batchDelete(List<Long> ids);
 
     void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
+
+    Object productionApprove(StockInRecordDto stockInRecordDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..3abc49f 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -23,7 +23,7 @@
 
     IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto);
 
-    Boolean addstockInventory(StockInventoryDto stockInventoryDto);
+    Boolean addstockInventory(StockInventoryDto stockInventoryDto,Integer isProduction);
 
     Boolean subtractStockInventory(StockInventoryDto stockInventoryDto);
 
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 30e545f..82d526e 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -1,7 +1,9 @@
 package com.ruoyi.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
@@ -9,8 +11,11 @@
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.pojo.ProductOrder;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -36,6 +41,8 @@
     private StockInRecordMapper stockInRecordMapper;
     private StockInventoryMapper stockInventoryMapper;
     private StockUninventoryMapper stockUninventoryMapper;
+
+    private ProductOrderMapper productOrderMapper;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -90,6 +97,7 @@
                     StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                     stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
+                    stockUninventoryDto.setStockLocation(stockInRecord.getStockLocation());
                     stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
                 }
             }
@@ -110,4 +118,41 @@
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
         util.exportExcel(response,list, "鍏ュ簱璁板綍淇℃伅");
     }
+
+    @Override
+    public Object productionApprove(StockInRecordDto stockInRecordDto) {
+        //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
+        //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>()
+                .lambda()
+                .eq(StockInventory::getProductModelId, stockInRecordDto.getProductModelId())
+                .eq(StockInventory::getStockLocation, stockInRecordDto.getStockLocation()));
+        StockInventory newStockInventory = new StockInventory();
+        newStockInventory.setProductModelId(stockInRecordDto.getProductModelId());
+        newStockInventory.setQualitity(stockInRecordDto.getActualStockInNum());
+        newStockInventory.setVersion(1);
+        newStockInventory.setRemark(stockInRecordDto.getRemark());
+        newStockInventory.setStockLocation(stockInRecordDto.getStockLocation());
+        if (ObjectUtils.isEmpty(oldStockInventory)) {
+            stockInventoryMapper.insert(newStockInventory);
+        }else {
+            StockInventoryDto oldStockInventoryDto = new StockInventoryDto();
+            BeanUtils.copyProperties(oldStockInventory, oldStockInventoryDto);
+            stockInventoryMapper.updateAddStockInventory(oldStockInventoryDto);
+        }
+        stockInRecordDto.setStatus(2);
+        stockInRecordDto.setStockInNum(stockInRecordDto.getActualStockInNum() == null ? stockInRecordDto.getWaitAuditNum() : stockInRecordDto.getActualStockInNum());
+        stockInRecordMapper.updateById(stockInRecordDto);
+        ProductOrder productOrder = productOrderMapper.selectById(stockInRecordDto.getRecordId());
+        if(productOrder != null){
+            if(StringUtils.isNotEmpty(stockInRecordDto.getReason())){
+                productOrder.setReason(stockInRecordDto.getReason());
+            }
+            if(stockInRecordDto.getActualStockInNum() != null){
+                productOrder.setActualStockInNum(stockInRecordDto.getActualStockInNum());
+            }
+            productOrderMapper.updateById(productOrder);
+        }
+        return true;
+    }
 }
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 5cb6dda..462326b 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -52,20 +52,39 @@
     }
 
     //鍏ュ簱璋冪敤
+
+    /**
+     *
+     * @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());
@@ -74,6 +93,7 @@
             newStockInventory.setRemark(stockInventoryDto.getRemark());
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
+            newStockInventory.setStockLocation(stockInventoryDto.getStockLocation());
             stockInventoryMapper.insert(newStockInventory);
         }else {
              stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
@@ -92,10 +112,14 @@
         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("浜у搧搴撳瓨涓嶅瓨鍦�");
+            throw new RuntimeException("搴撲綅銆�" + stockInventoryDto.getStockLocation() + "銆戜骇鍝佸簱瀛樹笉瀛樺湪");
         }
         BigDecimal lockedQty = oldStockInventory.getLockedQuantity();
         if (lockedQty == null) {
@@ -104,7 +128,6 @@
         if (stockInventoryDto.getQualitity().compareTo(oldStockInventory.getQualitity().subtract(lockedQty)) > 0) {
             throw new RuntimeException("搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
         }
-
         stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
         return true;
     }
@@ -137,7 +160,8 @@
                         }
                         stockInventoryDto.setLockedQuantity(dto.getLockedQuantity());
                         stockInventoryDto.setProductModelId(item.getProductModelId());
-                        this.addstockInventory(stockInventoryDto);
+                        stockInventoryDto.setStockLocation(dto.getStockLocation());
+                        this.addstockInventory(stockInventoryDto,2);
                         matched = true;
                         break; // 鎵惧埌鍖归厤椤瑰悗璺冲嚭寰幆
                     }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index e01fe5d..f0fb538 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -93,6 +93,7 @@
                     StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                     stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                     stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum());
+                    stockUninventoryDto.setStockLocation(stockOutRecord.getStockLocation());
                     stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
                 }
             }
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 2d5b8f5..07d1562 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -54,16 +54,21 @@
         stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
         stockInRecordDto.setType("1");
+        stockInRecordDto.setStockLocation(stockUninventoryDto.getStockLocation());
         stockInRecordService.add(stockInRecordDto);
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
+        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>()
+                .lambda()
+                .eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId())
+                .eq(StockUninventory::getStockLocation, stockUninventoryDto.getStockLocation()));
         if (ObjectUtils.isEmpty(oldStockUnInventory)) {
             StockUninventory newStockUnInventory = new StockUninventory();
             newStockUnInventory.setProductModelId(stockUninventoryDto.getProductModelId());
             newStockUnInventory.setQualitity(stockUninventoryDto.getQualitity());
             newStockUnInventory.setVersion(1);
             newStockUnInventory.setRemark(stockUninventoryDto.getRemark());
+            newStockUnInventory.setStockLocation(stockUninventoryDto.getStockLocation());
             stockUninventoryMapper.insert(newStockUnInventory);
         }else {
             stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
@@ -81,11 +86,15 @@
         stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
         stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
+        stockOutRecordDto.setStockLocation(stockUninventoryDto.getStockLocation());
         stockOutRecordDto.setType("1");
         stockOutRecordService.add(stockOutRecordDto);
-        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
+        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>()
+                .lambda()
+                .eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId())
+                .eq(StockUninventory::getStockLocation, stockUninventoryDto.getStockLocation()));
         if (ObjectUtils.isEmpty(oldStockInventory)) {
-            throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
+            throw new RuntimeException("搴撲綅銆�" + stockUninventoryDto.getStockLocation() + "銆戜骇鍝佸簱瀛樹笉瀛樺湪");
         }else {
             stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
         }
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 9e28542..067dda6 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -21,7 +21,9 @@
         sl.sales_contract_no,
         sl.customer_name,
         s.shipping_total AS shipping_total,
-        slp.id as salesLedgerProductId
+        slp.id as salesLedgerProductId,
+        slp.product_category,
+        slp.specification_model
         FROM shipping_info s
         LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
         LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index fc2b81d..70737b7 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -15,6 +15,9 @@
         LEFT JOIN sys_user as u on sir.create_user = u.user_id
         <where>
             pm.product_type = #{params.productType}
+            <if test="params.status != null">
+                and sir.status = #{params.status}
+            </if>
             <if test="params.timeStr != null and params.timeStr != ''">
                 and sir.create_time like concat('%',#{params.timeStr},'%')
             </if>
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index a1f65b0..44d0941 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -63,6 +63,7 @@
         (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
         pm.model,
         si.remark,
+        si.stock_location,
         pm.unit,
         p.product_name
         from stock_inventory si
diff --git a/src/main/resources/mapper/stock/StockUninventoryMapper.xml b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
index d72b6cb..3265879 100644
--- a/src/main/resources/mapper/stock/StockUninventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -25,7 +25,7 @@
             </if>
             update_time = now()
         </set>
-        where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity}
+        where product_model_id = #{ew.productModelId} and stock_location = #{ew.stockLocation} and qualitity >= #{ew.qualitity}
     </update>
     <update id="updateAddStockUnInventory">
         update stock_uninventory
@@ -41,7 +41,7 @@
             </if>
             update_time = now()
         </set>
-        where product_model_id = #{ew.productModelId}
+        where product_model_id = #{ew.productModelId} and stock_location = #{ew.stockLocation}
     </update>
     <select id="pageStockUninventory" resultType="com.ruoyi.stock.dto.StockUninventoryDto">
         select su.id,

--
Gitblit v1.9.3