From e529b1dd89b5f2927457a284e660d489b9aa8cc8 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 01 四月 2026 11:24:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java           |   31 +
 src/main/java/com/ruoyi/stock/pojo/StockInventory.java                                |    6 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                      |    7 
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                   |    9 
 src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java                                 |    7 
 src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java               |    4 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java          |   40 +
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                   |    2 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                            |    3 
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                                |    7 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                       |   26 
 src/main/resources/mapper/basic/ProductModelMapper.xml                                |    4 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java               |    4 
 src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java         |    1 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                |   11 
 src/main/java/com/ruoyi/basic/pojo/ProductModel.java                                  |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |  286 ++++++++++++++++-
 src/main/java/com/ruoyi/basic/controller/ProductController.java                       |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java          |   59 +--
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                              |    3 
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                                 |    6 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  138 +++++++-
 src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java                           |   31 +
 src/main/resources/mapper/stock/StockInventoryMapper.xml                              |   73 ++++
 src/main/resources/static/return-record.docx                                          |    0 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                |   13 
 src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java                  |    4 
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java              |    2 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java              |    9 
 src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java      |    4 
 src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java          |   28 +
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java       |   81 ++++
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java             |    6 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java                        |    5 
 src/main/resources/static/sale-outbound.docx                                          |    0 
 src/main/java/com/ruoyi/basic/pojo/Product.java                                       |    4 
 src/main/java/com/ruoyi/stock/pojo/StockUninventory.java                              |    6 
 src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml                      |    4 
 38 files changed, 774 insertions(+), 155 deletions(-)

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..22ba5ac 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -13,7 +13,6 @@
 import com.ruoyi.approve.service.IApproveNodeService;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceRepair;
@@ -25,7 +24,10 @@
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.SalesQuotation;
@@ -204,7 +206,8 @@
                             purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
                         }else {
                             //鐩存帴鍏ュ簱
-                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
+                            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
+                                    purchaseLedger.getId(),salesLedgerProduct.getBatchNo(),salesLedgerProduct.getCustomer());
                         }
                     }
                 } else if (status.equals(3)) {
diff --git a/src/main/java/com/ruoyi/basic/controller/ProductController.java b/src/main/java/com/ruoyi/basic/controller/ProductController.java
index 252ab4d..fd14500 100644
--- a/src/main/java/com/ruoyi/basic/controller/ProductController.java
+++ b/src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -17,8 +17,6 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
-import com.ruoyi.sales.service.ISalesLedgerService;
-import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java b/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
index 1fd8c81..0829aae 100644
--- a/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
+++ b/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
@@ -9,6 +9,13 @@
     private Long id;
     private Long parentId;
     private String productName;
+    private String model;
+    private String batchNo;
+    private String customer;
+    private String uidNo;
+    private String unit;
+    private Long productModelId;
     private String label; // 鐢ㄤ簬鏍戝舰缁撴瀯鐨勬樉绀哄悕绉�
     private List<ProductTreeDto> children;
+    private String nodeType;
 }
diff --git a/src/main/java/com/ruoyi/basic/pojo/Product.java b/src/main/java/com/ruoyi/basic/pojo/Product.java
index 6b4e14b..f5fba59 100644
--- a/src/main/java/com/ruoyi/basic/pojo/Product.java
+++ b/src/main/java/com/ruoyi/basic/pojo/Product.java
@@ -4,9 +4,11 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
 @TableName("product")
-public class Product {
+public class Product implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index 8a765d6..ce92abf 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -83,4 +83,7 @@
      */
     @Excel(name = "UID鐮�")
     private String uidNo;
+
+    @TableField(exist = false)
+    private String parentName;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..4f20fb0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,6 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
-import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.pojo.StockInRecord;
@@ -13,15 +12,11 @@
 import com.ruoyi.stock.service.StockInventoryService;
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
-import com.ruoyi.stock.service.impl.StockInRecordServiceImpl;
-import com.ruoyi.stock.service.impl.StockOutRecordServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
 @Component
 @RequiredArgsConstructor
@@ -40,7 +35,7 @@
      * @param recordType
      * @param recordId
      */
-    public void addUnStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void addUnStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
         StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
         stockUninventoryDto.setRecordId(recordId);
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -56,7 +51,7 @@
      * @param recordType
      * @param recordId
      */
-    public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType,Long recordId) {
+    public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType, Long recordId) {
         StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
         stockUninventoryDto.setRecordId(recordId);
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -72,12 +67,16 @@
      * @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 batchNo,String customer) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
-        stockInventoryDto.setRecordType(String.valueOf(recordType));
+        if (recordType != null) {
+            stockInventoryDto.setRecordType(recordType);
+        }
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setBatchNo(batchNo);
+        stockInventoryDto.setCustomer(customer);
         stockInventoryService.addstockInventory(stockInventoryDto);
     }
 
@@ -88,12 +87,16 @@
      * @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 batchNo,String customer) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
-        stockInventoryDto.setRecordType(String.valueOf(recordType));
+        if (recordType != null) {
+            stockInventoryDto.setRecordType(recordType);
+        }
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setBatchNo(batchNo);
+        stockInventoryDto.setCustomer(customer);
         stockInventoryService.subtractStockInventory(stockInventoryDto);
     }
 
@@ -106,6 +109,7 @@
             stockInRecordService.batchDelete(Collections.singletonList(one.getId()));
         }
     }
+
     public void deleteStockOutRecord(Long recordId, String recordType) {
         StockOutRecord one = stockOutRecordService.getOne(new QueryWrapper<StockOutRecord>()
                 .lambda().eq(StockOutRecord::getRecordId, recordId)
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 448892f..3a3bc0c 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -91,12 +91,6 @@
         return R.ok(productOrderService.getProductOrderBatchNo());
     }
 
-    @ApiOperation("鏌ヨ鐢熶骇璁㈠崟瀵瑰簲鐨凚OM鐨勫師鏉愭枡")
-    @GetMapping("/getByBomId")
-    public R getByBomId(Long bomId) {
-        return R.ok(productOrderService.getByBomId(bomId));
-    }
-
     @ApiOperation("鐢熶骇璁㈠崟棰嗘枡鏇存柊")
     @PostMapping("/drawMaterials")
     public R drawMaterials(@RequestBody ProductOrderDto productOrderDto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
index 029e457..45b50aa 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -5,7 +5,6 @@
 import com.ruoyi.production.dto.ProductWorkOrderDto;
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspect;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
diff --git a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java b/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
index d45c3a4..7cab486 100644
--- a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
+++ b/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
@@ -1,17 +1,44 @@
 package com.ruoyi.production.dto;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-
 import java.math.BigDecimal;
 
 @Data
+@ApiModel("棰嗘枡鍗旸TO")
 public class DrawMaterialDto {
 
+    @ApiModelProperty("璁㈠崟ID")
     private Long id;
+
+    @ApiModelProperty("鍨嬪彿ID")
     private Long productModelId;
+
+    @ApiModelProperty("搴撳瓨鏁伴噺")
     private BigDecimal qualitity;
+
+    @ApiModelProperty("棰嗙敤鏁伴噺")
     private BigDecimal requisitionQty;
+
+    @ApiModelProperty("浜у搧鍚嶇О")
     private String productName;
+
+    @ApiModelProperty("浜у搧鍨嬪彿")
     private String model;
+
+    @ApiModelProperty("浜у搧鍗曚綅")
     private String unit;
-}
+
+    @ApiModelProperty("鎶ュ伐棰嗙敤鏁伴噺")
+    private BigDecimal reportQty;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index 3fde6d7..3b292a0 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -10,6 +10,7 @@
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.List;
 
 @Data
 @ExcelIgnoreUnannotated
@@ -72,4 +73,7 @@
     private String otherData;
     // 宸ュ簭id
     private Long processId;
+
+    //鍘熸枡
+    private List<DrawMaterialDto> drawMaterialList;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index 82bece9..13338c7 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -30,4 +30,13 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 0519fd3..c415950 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -33,7 +33,5 @@
 
     List<SelectOptionDTO<String>> getProductOrderBatchNo();
 
-    List getByBomId(Long bomId);
-
     int drawMaterials(ProductOrderDto productOrderDto);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 0ed4db6..f479a16 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -23,8 +23,8 @@
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductOrderService;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInventory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -32,7 +32,8 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service
@@ -247,43 +248,9 @@
 
     @Override
     public List<SelectOptionDTO<String>> getProductOrderBatchNo() {
-        List<ProductOrder> productOrders = productOrderMapper.selectList(null);
-        return productOrders.stream().map(productOrder -> new SelectOptionDTO<>(productOrder.getBatchNo(), productOrder.getBatchNo())).collect(Collectors.toList());
-    }
-
-    @Override
-    public List<StockInventoryDto> getByBomId(Long bomId) {
-        List<ProductStructureDto> structureList = productStructureMapper.listBybomId(bomId);
-
-        if (CollectionUtils.isEmpty(structureList)) {
-            return Collections.emptyList();
-        }
-
-        Set<Long> allNodeIds = structureList.stream()
-                .map(ProductStructureDto::getId)
-                .collect(Collectors.toSet());
-
-        Set<Long> parentIds = structureList.stream()
-                .filter(node -> node.getParentId() != null && node.getParentId() != 0)
-                .map(ProductStructureDto::getParentId)
-                .collect(Collectors.toSet());
-
-        Set<Long> leafNodeIds = new HashSet<>(allNodeIds);
-        leafNodeIds.removeAll(parentIds);
-
-        //  鑾峰彇鍙跺瓙鑺傜偣鐨� productModelId
-        List<Long> productModelIds = structureList.stream()
-                .filter(node -> leafNodeIds.contains(node.getId()))
-                .map(ProductStructureDto::getProductModelId)
-                .filter(Objects::nonNull)
-                .distinct()
-                .collect(Collectors.toList());
-
-        if (productModelIds.isEmpty()) {
-            return Collections.emptyList();
-        }
-
-        return stockInventoryMapper.getStockInventory(productModelIds);
+        //鏌ヨ搴撳瓨鎵瑰彿
+        List<StockInventory> stockInventoryList = stockInventoryMapper.selectList(null);
+        return stockInventoryList.stream().map(stockInventory -> new SelectOptionDTO<>(stockInventory.getBatchNo(), stockInventory.getBatchNo())).collect(Collectors.toList());
     }
 
     @Override
@@ -308,6 +275,16 @@
         if (CollectionUtils.isEmpty(drawMaterialsList)) {
             throw new RuntimeException("棰嗘枡鏄庣粏涓嶈兘涓虹┖");
         }
+        // 濡傛灉鏈夋暟鎹厛鍔犲簱瀛�
+        ProductOrder productOrder = productOrderMapper.selectById(productOrderDto.getId());
+        if (productOrder != null) {
+            List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+            for (DrawMaterialDto drawMaterialDto : materialDtoList) {
+                stockUtils.addStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), null, productOrderDto.getId(),
+                        drawMaterialDto.getBatchNo(), drawMaterialDto.getCustomer()
+                );
+            }
+        }
 
         // 澶勭悊棰嗘枡锛堟墸鍑忓簱瀛橈級
         try {
@@ -315,7 +292,9 @@
                 if (drawMaterialDto.getProductModelId() == null) {
                     throw new RuntimeException("浜у搧鍨嬪彿ID涓嶈兘涓虹┖");
                 }
-                stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId());
+                stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(),
+                        StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId(),
+                        drawMaterialDto.getBatchNo(),drawMaterialDto.getCustomer());
             }
         } catch (Exception e) {
             throw new RuntimeException("棰嗘枡澶辫触锛�" + e.getMessage());
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 4a68ce8..e3644de 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,10 +7,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.data.PictureRenderData;
 import com.deepoove.poi.data.Pictures;
-import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.MatrixToImageWriter;
 import com.ruoyi.production.dto.ProductWorkOrderDto;
 import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
@@ -18,8 +16,6 @@
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.production.pojo.ProductWorkOrderFile;
 import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspectParam;
-import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
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 f499e2f..7175825 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,8 +1,10 @@
 package com.ruoyi.production.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 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.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,12 +14,12 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.production.dto.DrawMaterialDto;
 import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -30,7 +32,6 @@
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -39,6 +40,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -140,22 +142,80 @@
         productionProductMain.setStatus(0);
         productionProductMain.setDeviceId(dto.getDeviceId());
         productionProductMainMapper.insert(productionProductMain);
-        /*鏂板鎶ュ伐鎶曞叆琛�*/
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
-        if (productStructureDtos.isEmpty()) {
-            //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
-            ProductStructureDto productStructureDto = new ProductStructureDto();
-            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
-            productStructureDto.setUnitQuantity(BigDecimal.ONE);
-            productStructureDtos.add(productStructureDto);
+        /* 鏂板鎶ュ伐鎶曞叆琛� */
+        ProductWorkOrder WorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+        if (WorkOrder == null) {
+            throw new RuntimeException("宸ュ崟涓嶅瓨鍦�");
         }
-        for (ProductStructureDto productStructureDto : productStructureDtos) {
 
-            ProductionProductInput productionProductInput = new ProductionProductInput();
-            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
-            productionProductInput.setProductMainId(productionProductMain.getId());
-            productionProductInputMapper.insert(productionProductInput);
+        ProductOrder order = productOrderMapper.selectById(WorkOrder.getProductOrderId());
+        if (order == null) {
+            throw new RuntimeException("浜у搧璁㈠崟涓嶅瓨鍦�");
+        }
+        List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList();
+        if (!CollectionUtils.isEmpty(drawMaterialList)) {
+
+            // 鐗╂枡Map
+            List<DrawMaterialDto> existingMaterialList = JSON.parseArray(order.getDrawMaterials(), DrawMaterialDto.class);
+            if (CollectionUtils.isEmpty(existingMaterialList)) {
+                throw new RuntimeException("鍙鐢ㄧ墿鏂欏垪琛ㄤ负绌�");
+            }
+
+            Map<String, DrawMaterialDto> materialMap = existingMaterialList.stream()
+                    .collect(Collectors.toMap(
+                            materialDto -> materialDto.getProductModelId() + "_" +
+                                    (materialDto.getBatchNo() == null ? "" : materialDto.getBatchNo()) + "_" +
+                                    (materialDto.getCustomer() == null ? "" : materialDto.getCustomer()),
+                            Function.identity(),
+                            (existing, replacement) -> existing
+                    ));
+
+            // 澶勭悊鎶ュ伐鐗╂枡
+            List<ProductionProductInput> inputList = new ArrayList<>();
+
+            for (DrawMaterialDto drawMaterial : drawMaterialList) {
+                Long modelId = drawMaterial.getProductModelId();
+                BigDecimal reportQty = drawMaterial.getReportQty();
+
+                String key = drawMaterial.getProductModelId() + "_" +
+                        (drawMaterial.getBatchNo() == null ? "" : drawMaterial.getBatchNo()) + "_" +
+                        (drawMaterial.getCustomer() == null ? "" : drawMaterial.getCustomer());
+
+                DrawMaterialDto material = materialMap.get(key);
+                if (material == null) {
+                    throw new RuntimeException("鐗╂枡涓嶅瓨鍦�: 浜у搧鍨嬪彿ID=" + modelId +
+                            ", 鎵规鍙�=" + drawMaterial.getBatchNo() +
+                            ", 瀹㈡埛=" + drawMaterial.getCustomer());
+                }
+
+                // 楠岃瘉搴撳瓨
+                BigDecimal availableQty = material.getRequisitionQty().subtract(reportQty);
+                if (availableQty.compareTo(BigDecimal.valueOf(0)) < 0) {
+                    throw new RuntimeException(String.format("鐗╂枡%s搴撳瓨涓嶈冻锛屽彲鐢�:%s锛岄渶棰�:%s",
+                            modelId, availableQty, reportQty));
+                }
+
+                // 鏇存柊鍙鐢�
+                material.setRequisitionQty(availableQty);
+
+                // 鏋勫缓鎶曞叆璁板綍
+                ProductionProductInput input = new ProductionProductInput();
+                input.setProductModelId(modelId);
+                input.setQuantity(reportQty);
+                input.setProductMainId(productionProductMain.getId());
+                input.setRemark(drawMaterial.getRemark());
+                input.setBatchNo(drawMaterial.getBatchNo());
+                input.setCustomer(drawMaterial.getCustomer());
+                inputList.add(input);
+            }
+
+            if (!inputList.isEmpty()) {
+                for (ProductionProductInput productionProductInput : inputList) {
+                    productionProductInputMapper.insert(productionProductInput);
+                }
+                order.setDrawMaterials(JSON.toJSONString(existingMaterialList));
+                productOrderMapper.updateById(order);
+            }
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -193,14 +253,13 @@
                 qualityInspect.setProductName(product.getProductName());
                 qualityInspect.setModel(productModel.getModel());
                 qualityInspect.setUnit(productModel.getUnit());
-                qualityInspect.setQuantity(productQty);
+                qualityInspect.setQuantity(productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()));
                 qualityInspect.setProcess(process);
                 qualityInspect.setInspectState(0);
                 qualityInspect.setInspectType(inspectType);
                 qualityInspect.setProductMainId(productionProductMain.getId());
                 qualityInspect.setProductModelId(productModel.getId());
                 qualityInspect.setBatchNo(productOrder.getBatchNo());
-                qualityInspect.setInspectedQuantity(dto.getInspectedQuantity());
                 qualityInspect.setManufacturingTeam(productOrder.getManufacturingTeam());
                 qualityInspectMapper.insert(qualityInspect);
                 List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
@@ -217,9 +276,12 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+                String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()),
+                        StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId(),order.getBatchNo(),customer
+                );
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -275,10 +337,10 @@
     public Boolean removeProductMain(Long id) {
         //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
-        if (qualityInspects.size() > 0){
+        if (qualityInspects.size() > 0) {
             List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
                     .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
-            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
                 throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
             }
         }
@@ -332,9 +394,37 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
-                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+            stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
 
+        ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
+        List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+
+        // 鎵归噺鏌ヨ骞舵瀯寤篗ap
+        Map<Long, BigDecimal> usedQuantityMap = productionProductInputMapper.selectList(
+                        new LambdaQueryWrapper<ProductionProductInput>()
+                                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())
+                                .in(ProductionProductInput::getProductModelId,
+                                        materialDtoList.stream()
+                                                .map(DrawMaterialDto::getProductModelId)
+                                                .collect(Collectors.toList()))
+                ).stream()
+                .collect(Collectors.groupingBy(
+                        ProductionProductInput::getProductModelId,
+                        Collectors.reducing(BigDecimal.ZERO, ProductionProductInput::getQuantity, BigDecimal::add)
+                ));
+
+        // 鏇存柊鎵�鏈夌墿鏂�
+        materialDtoList.forEach(dto -> {
+            BigDecimal usedQty = usedQuantityMap.getOrDefault(dto.getProductModelId(), BigDecimal.ZERO);
+            dto.setRequisitionQty(dto.getRequisitionQty().add(usedQty));
+        });
+
+        // 鏇存柊璁㈠崟
+        productOrder.setDrawMaterials(JSON.toJSONString(materialDtoList));
+        productOrderMapper.updateById(productOrder);
+
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index d71b3bb..17f1a29 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,29 +1,23 @@
 package com.ruoyi.purchase.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.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.account.pojo.AccountExpense;
-import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.account.service.AccountExpenseService;
-import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.approve.vo.ApproveProcessVO;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
-import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -39,19 +33,25 @@
 import com.ruoyi.purchase.dto.PurchaseLedgerImportDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto;
 import com.ruoyi.purchase.mapper.*;
-import com.ruoyi.purchase.pojo.*;
+import com.ruoyi.purchase.pojo.PaymentRegistration;
+import com.ruoyi.purchase.pojo.ProductRecord;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
 import com.ruoyi.quality.mapper.*;
-import com.ruoyi.quality.pojo.*;
-import com.ruoyi.sales.dto.SalesLedgerImportDto;
-import com.ruoyi.sales.dto.SalesLedgerProductImportDto;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.BeanUtils;
@@ -207,7 +207,7 @@
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
-            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
+            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType(),supplierManage);
         }
         //鏂板鍘熸潗鏂欐楠�  瀹℃壒涔嬪悗鎵嶇敓鎴愭楠�
 //        if (productList != null) {
@@ -230,6 +230,7 @@
         QualityInspect qualityInspect = new QualityInspect();
         qualityInspect.setInspectType(0);
         qualityInspect.setSupplier(purchaseLedger.getSupplierName());
+        qualityInspect.setBatchNo(saleProduct.getBatchNo());
         qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
         qualityInspect.setProductId(saleProduct.getProductId());
         qualityInspect.setProductName(saleProduct.getProductCategory());
@@ -254,7 +255,7 @@
         }
     }
 
-    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type,SupplierManage supplierManage) {
         if (products == null || products.isEmpty()) {
             throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�");
         }
@@ -324,6 +325,8 @@
                 salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
                 salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
+                salesLedgerProduct.setCustomer(supplierManage.getSupplierName());
+                salesLedgerProduct.setBatchNo(salesLedgerProduct.getBatchNo());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
             }
         }
@@ -511,6 +514,15 @@
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType());
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+        // 鏌ヨ鍏宠仈浜у搧鐨刄ID
+        for (SalesLedgerProduct product : products) {
+            if (product.getProductModelId() != null) {
+                ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
+                if (productModel != null) {
+                    product.setUidNo(productModel.getUidNo());
+                }
+            }
+        }
 
         // 3.鏌ヨ涓婁紶鏂囦欢
         LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
index e558c30..14b7483 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -4,11 +4,11 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.service.IQualityUnqualifiedService;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -24,6 +24,7 @@
 
     /**
      * 鏂板涓嶅悎鏍肩鐞�
+     *
      * @param qualityUnqualified
      * @return
      */
@@ -35,21 +36,23 @@
 
     /**
      * 鍒犻櫎涓嶅悎鏍肩鐞�
+     *
      * @param ids
      * @return
      */
     @DeleteMapping("/del")
     public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
-       qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> {
-           if (qualityUnqualified.getInspectState()==1){
-               throw new RuntimeException("璇ヤ笉鍚堟牸鏁版嵁宸茬粡澶勭悊鏃犳硶鍒犻櫎!");
-           }
-       });
+        qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> {
+            if (qualityUnqualified.getInspectState() == 1) {
+                throw new RuntimeException("璇ヤ笉鍚堟牸鏁版嵁宸茬粡澶勭悊鏃犳硶鍒犻櫎!");
+            }
+        });
         return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids));
     }
 
     /**
      * 涓嶅悎鏍肩鐞嗚鎯�
+     *
      * @param id
      * @return
      */
@@ -60,6 +63,7 @@
 
     /**
      * 涓嶅悎鏍肩鐞嗕慨鏀�
+     *
      * @param qualityUnqualified
      * @return
      */
@@ -69,7 +73,8 @@
     }
 
     /**
-     *涓嶅悎鏍肩鐞嗗垎椤垫煡璇�
+     * 涓嶅悎鏍肩鐞嗗垎椤垫煡璇�
+     *
      * @param page
      * @param qualityUnqualified
      * @return
@@ -81,16 +86,18 @@
 
     /**
      * 涓嶅悎鏍肩鐞嗗鍑�
+     *
      * @param response
      * @param qualityUnqualified
      */
     @PostMapping("/export")
-    public void qualityUnqualifiedExport(HttpServletResponse response,QualityUnqualified qualityUnqualified) {
+    public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) {
         qualityUnqualifiedService.qualityUnqualifiedExport(response, qualityUnqualified);
     }
 
     /**
      * 涓嶅悎鏍肩鐞嗗鐞�
+     *
      * @param qualityUnqualified
      * @return
      */
@@ -99,5 +106,8 @@
         return AjaxResult.success(qualityUnqualifiedService.deal(qualityUnqualified));
     }
 
-
+    @GetMapping("/downloadReturnRecord")
+    public void downloadReturnRecord(@RequestParam("id") Long id,HttpServletResponse response) throws IOException {
+        qualityUnqualifiedService.downloadReturnRecord(id,response);
+    }
 }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java b/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
index ceff474..5579e9f 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
@@ -3,10 +3,10 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 public interface IQualityUnqualifiedService extends IService<QualityUnqualified> {
 
@@ -18,4 +18,6 @@
     int deal(QualityUnqualified qualityUnqualified);
 
     QualityUnqualified getUnqualified(Integer id);
+
+    void downloadReturnRecord(Long id, HttpServletResponse response) throws IOException;
 }
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 5ba5685..52272ad 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -15,6 +15,12 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.production.pojo.ProductionProductMain;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
@@ -61,6 +67,13 @@
 
     private ProductModelMapper productModelMapper;
 
+    private ProductionProductMainMapper productionProductMainMapper;
+
+    private ProductWorkOrderMapper productWorkOrderMapper;
+
+    private ProductOrderMapper productOrderMapper;
+
+
     @Override
     public int add(QualityInspectDto qualityInspectDto) {
         QualityInspect qualityInspect = new QualityInspect();
@@ -88,6 +101,20 @@
     @Override
     public int submit(QualityInspect inspect) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+
+        String batchNo;
+        String customer;
+        if (productionProductMain != null) {
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            batchNo = productOrder.getBatchNo();
+            customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+        } else {
+            batchNo = qualityInspect.getBatchNo();
+            customer = qualityInspect.getSupplier();
+        }
+
         //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
         if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
             throw new RuntimeException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
@@ -104,7 +131,9 @@
             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(), batchNo, customer
+            );
         }
         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 1650690..b8ac021 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,16 +7,13 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
-import com.ruoyi.production.mapper.ProductProcessRouteMapper;
-import com.ruoyi.production.mapper.ProductWorkOrderMapper;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductOrderService;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
@@ -29,10 +26,14 @@
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @AllArgsConstructor
 @Service
@@ -47,6 +48,7 @@
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
     private ProductWorkOrderMapper productWorkOrderMapper;
     private StockUninventoryService stockUninventoryService;
+    private ProductOrderMapper productOrderMapper;
 
     @Override
     public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -64,10 +66,12 @@
     public int deal(QualityUnqualified qualityUnqualified) {
         QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
         QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+        ProductWorkOrder workOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+        ProductOrder orders = productOrderMapper.selectById(workOrder.getProductOrderId());
         if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
             switch (qualityUnqualified.getDealResult()) {
                 case "杩斾慨":
-                case "杩斿伐":
                     //鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
                     if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
                         //杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
@@ -131,8 +135,12 @@
                     break;
                 case "璁╂鏀捐":
                     //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
-                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+                    stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(),
+                            orders.getBatchNo(), customer
+                    );
                     break;
+                case "杩斿伐":
                 default:
                     break;
             }
@@ -146,7 +154,8 @@
                     break;
                 case "璁╂鏀捐":
                     //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
-                    stockUtils.addStock(modelId, unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+                    stockUtils.addStock(modelId, unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(), orders.getBatchNo(), customer);
                     break;
                 default:
                     break;
@@ -161,4 +170,60 @@
     public QualityUnqualified getUnqualified(Integer id) {
         return qualityUnqualifiedMapper.getUnqualified(id);
     }
+
+    @Override
+    public void downloadReturnRecord(Long id, HttpServletResponse response) {
+        XWPFTemplate template = null;
+        InputStream inputStream = null;
+        OutputStream out = null;
+        try {
+            // 1. 鏌ヨ鏁版嵁
+            QualityUnqualified info = qualityUnqualifiedMapper.selectById(id);
+            Map<String, Object> data = new HashMap<>();
+            data.put("productName", info.getProductName());
+            data.put("model", info.getModel());
+
+            // 鍔犺浇妯℃澘
+            inputStream = getClass().getResourceAsStream("/static/return-record.docx");
+            if (inputStream == null) {
+                throw new RuntimeException("妯℃澘鏂囦欢涓嶅瓨鍦紝璇锋鏌ヨ矾寰勶細/static/return-record.docx");
+            }
+
+            // 娓叉煋妯℃澘
+            template = XWPFTemplate.compile(inputStream).render(data);
+
+            // 璁剧疆鍝嶅簲澶�
+            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+            response.setHeader("Content-Disposition", "attachment; filename=rework_record_" + id + ".docx");
+            response.setContentLengthLong(-1);
+
+            out = response.getOutputStream();
+            template.write(out);
+            out.flush();
+        } catch (Exception e) {
+            throw new RuntimeException("涓嬭浇澶辫触", e);
+        } finally {
+            if (template != null) {
+                try {
+                    template.close();
+                } catch (Exception e) {
+                    log.error("鍏抽棴妯℃澘澶辫触", e);
+                }
+            }
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (Exception e) {
+                    log.error("鍏抽棴杈撳叆娴佸け璐�", e);
+                }
+            }
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (Exception e) {
+                    log.error("鍏抽棴杈撳嚭娴佸け璐�", e);
+                }
+            }
+        }
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 49548e1..65e3230 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -87,7 +87,7 @@
 
 
             //鍑哄簱
-            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),null,null);
         }
 
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index dff5d64..bc3e5fd 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -241,4 +241,7 @@
 
     @ApiModelProperty(value = "鎵瑰彿")
     private String batchNo;
+
+    @ApiModelProperty(value = "渚涘簲鍟�")
+    private String customer;
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index eedc54f..bd71f54 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -194,6 +194,9 @@
             product.setTempnoInvoiceAmount(product.getNoInvoiceAmount());
             product.setTempNoInvoiceNum(product.getNoInvoiceNum());
             product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
+            product.setUidNo(product.getUidNo());
+            product.setUnit(product.getUnit());
+            product.setBatchNo(product.getBatchNo());
             product.setRegisterDate(LocalDateTime.now());
             // 鍙戣揣淇℃伅
             ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
@@ -202,6 +205,13 @@
                     .last("limit 1"));
             if (shippingInfo != null) {
                 product.setShippingStatus(shippingInfo.getStatus());
+            }
+            // 鏌ヨ鍏宠仈浜у搧鐨刄ID
+            if (product.getProductModelId() != null) {
+                ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
+                if (productModel != null) {
+                    product.setUidNo(productModel.getUidNo());
+                }
             }
         }
 
@@ -911,6 +921,7 @@
             map.put("taxInclusiveUnitPrice", product.getTaxInclusiveUnitPrice().setScale(2, RoundingMode.HALF_UP).toString());
             map.put("taxInclusiveTotalPrice", product.getTaxInclusiveTotalPrice().setScale(2, RoundingMode.HALF_UP).toString());
             map.put("batchNo", product.getBatchNo());
+            map.put("uidNo", product.getUidNo());
             // 鏌ヨ鍑瘉
             ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
             if (productModel != null) {
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 c9651a7..625e765 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -67,7 +67,9 @@
         //鎵e噺搴撳瓨
         if(!"宸插彂璐�".equals(byId.getStatus())){
             SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
-            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+            stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(),
+                    StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),null,null
+            );
         }
         byId.setExpressNumber(req.getExpressNumber());
         byId.setExpressCompany(req.getExpressCompany());
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index f878bdb..ed2092f 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.ProductDto;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -105,4 +106,16 @@
     public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
         return R.ok(stockInventoryService.thawStock(stockInventoryDto));
     }
+
+    @ApiOperation("鏌ヨ搴撳瓨鍘熸潗鏂�")
+    @GetMapping("/getMaterials")
+    public R getMaterials(StockInventoryDto stockInventoryDto) {
+        return R.ok(stockInventoryService.getMaterials(stockInventoryDto));
+    }
+
+    @ApiOperation("鏌ヨ搴撳瓨浜у搧")
+    @GetMapping("/getStockInventoryAll")
+    public R getStockInventoryAll(ProductDto productDto) {
+        return R.ok(stockInventoryService.getStockInventoryAll(productDto));
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 1f00a00..f28c0eb 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -42,4 +42,7 @@
     private BigDecimal currentStock;
 
     private BigDecimal  unLockedQuantity;
+    private Long productId;      // 浜у搧ID
+    private Long parentId;  // 鐖剁骇浜у搧ID
+    private Long productModelId;   // 浜у搧鍨嬪彿ID
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 3d520a0..07fd0db 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.ProductDto;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.execl.StockInventoryExportData;
@@ -51,4 +52,8 @@
     BigDecimal selectTotalByDate(@Param("now") LocalDate now);
 
     List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids);
+
+    List<StockInventoryDto> getMaterials(@Param("ew")StockInventoryDto stockInventoryDto);
+
+    List<StockInventoryDto> getStockInventoryAll(@Param("ew") ProductDto productDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index c0b8a27..1d058af 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -63,4 +63,10 @@
     @ApiModelProperty(value = "淇敼鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
index 36e7cf0..c0b379f 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -63,4 +63,10 @@
 
     @ApiModelProperty("澶囨敞")
     private String remark;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index e4e3b82..b14ae2e 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -71,4 +71,11 @@
 
     @ApiModelProperty(value = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
index 6ed47de..0d6f83b 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -59,4 +59,10 @@
     @ApiModelProperty("琚鍗曢攣瀹氭暟閲�")
     private BigDecimal lockedQuantity;
 
+    @ApiModelProperty("鎵瑰彿")
+    private String batchNo;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String customer;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..6a0e368 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.basic.dto.ProductDto;
+import com.ruoyi.basic.dto.ProductTreeDto;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
@@ -10,6 +12,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * <p>
@@ -38,4 +41,8 @@
     Boolean frozenStock(StockInventoryDto stockInventoryDto);
 
     Boolean thawStock(StockInventoryDto stockInventoryDto);
+
+    List<StockInventoryDto> getMaterials(StockInventoryDto stockInventoryDto);
+
+    List<ProductTreeDto> getStockInventoryAll(ProductDto productDto);
 }
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 62e7236..97354b1 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -1,11 +1,19 @@
 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.CollectionUtils;
 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.basic.dto.ProductDto;
+import com.ruoyi.basic.dto.ProductTreeDto;
+import com.ruoyi.basic.mapper.ProductMapper;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -19,15 +27,14 @@
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
 import com.ruoyi.stock.service.StockOutRecordService;
-import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 /**
  * <p>
@@ -38,13 +45,22 @@
  * @since 2026-01-21 04:16:36
  */
 @Service
-@AllArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
+    @Autowired
     private  StockInventoryMapper stockInventoryMapper;
+    @Autowired
     private StockInRecordService stockInRecordService;
+    @Autowired
     private StockOutRecordService stockOutRecordService;
+    @Autowired
     private SalesLedgerProductMapper salesLedgerProductMapper;
+    @Autowired
+    private ProductMapper productMapper;
+    @Autowired
+    private ProductModelMapper productModelMapper;
+
+
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -55,16 +71,24 @@
     @Transactional(rollbackFor = Exception.class)
     public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
         //鏂板鍏ュ簱璁板綍鍐嶆坊鍔犲簱瀛�
-        StockInRecordDto stockInRecordDto = new StockInRecordDto();
-        stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
-        stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
-        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
-        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
-        stockInRecordDto.setType("0");
-        stockInRecordService.add(stockInRecordDto);
+        if (stockInventoryDto.getRecordType() != null) {
+            StockInRecordDto stockInRecordDto = new StockInRecordDto();
+            stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
+            stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
+            stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
+            stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+            stockInRecordDto.setType("0");
+            stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+            stockInRecordDto.setCustomer(stockInventoryDto.getCustomer());
+            stockInRecordService.add(stockInRecordDto);
+        }
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-        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::getBatchNo, stockInventoryDto.getBatchNo())
+                .eq(StockInventory::getCustomer, stockInventoryDto.getCustomer())
+        );
         if (ObjectUtils.isEmpty(oldStockInventory)) {
             StockInventory newStockInventory = new StockInventory();
             newStockInventory.setProductModelId(stockInventoryDto.getProductModelId());
@@ -73,6 +97,8 @@
             newStockInventory.setRemark(stockInventoryDto.getRemark());
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
+            newStockInventory.setBatchNo(stockInventoryDto.getBatchNo());
+            newStockInventory.setCustomer(stockInventoryDto.getCustomer());
             stockInventoryMapper.insert(newStockInventory);
         }else {
              stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
@@ -85,14 +111,22 @@
     @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");
-        stockOutRecordService.add(stockOutRecordDto);
-        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+        if (stockInventoryDto.getRecordType() != null) {
+            StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
+            stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
+            stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
+            stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
+            stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+            stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+            stockOutRecordDto.setCustomer(stockInventoryDto.getCustomer());
+            stockOutRecordDto.setType("0");
+            stockOutRecordService.add(stockOutRecordDto);
+        }
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda()
+                .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+                .eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo())
+                .eq(StockInventory::getCustomer, stockInventoryDto.getCustomer())
+        );
         if (ObjectUtils.isEmpty(oldStockInventory)) {
             throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
         }
@@ -206,4 +240,216 @@
         stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
         return this.updateById(stockInventory);
     }
+
+    @Override
+    public List<StockInventoryDto> getMaterials(StockInventoryDto stockInventoryDto) {
+        return stockInventoryMapper.getMaterials(stockInventoryDto);
+    }
+
+    @Override
+    public List<ProductTreeDto> getStockInventoryAll(ProductDto productDto) {
+        // 鏌ヨ搴撳瓨鍒楄〃
+        List<StockInventoryDto> stockList = stockInventoryMapper.getStockInventoryAll(productDto);
+
+        if (CollectionUtils.isEmpty(stockList)) {
+            return new ArrayList<>();
+        }
+
+        // 鏋勫缓浜у搧鏍戯紙鍩轰簬浜у搧琛ㄧ殑鐖跺瓙鍏崇郴锛�
+        Map<Long, ProductTreeDto> productNodeMap = buildProductTree(stockList);
+
+        // 灏嗗簱瀛樻暟鎹紙鍨嬪彿->鎵规->瀹㈡埛锛夋寕杞藉埌瀵瑰簲鐨勪骇鍝佽妭鐐逛笅
+        attachStockDataToProduct(productNodeMap, stockList);
+
+        // 杩斿洖鏍硅妭鐐�
+        List<ProductTreeDto> tree = new ArrayList<>();
+        for (ProductTreeDto node : productNodeMap.values()) {
+            if (node.getParentId() == null || node.getParentId() == 0) {
+                tree.add(node);
+            }
+        }
+
+        return tree;
+    }
+
+    /**
+     * 鏋勫缓浜у搧鏍戯紙鑷姩閫掑綊鏌ヨ鎵�鏈夌埗绾э紝鍖呭惈鏍硅妭鐐癸級
+     */
+    private Map<Long, ProductTreeDto> buildProductTree(List<StockInventoryDto> stockList) {
+        // 1. 鏀堕泦鎵�鏈夐渶瑕佸姞杞界殑浜у搧ID
+        Set<Long> needQueryIds = new HashSet<>();
+        for (StockInventoryDto stock : stockList) {
+            if (stock.getProductId() != null) {
+                needQueryIds.add(stock.getProductId());
+            }
+        }
+
+        // 閫掑綊鏌ヨ鎵�鏈夎妭鐐癸紙鐩村埌鏍硅妭鐐癸級
+        Set<Long> allAncestors = getAllAncestorIds(needQueryIds);
+        needQueryIds.addAll(allAncestors);
+
+        // 鎵归噺鏌ヨ鎵�鏈変骇鍝侊紙鍖呭惈瀹屾暣灞傜骇锛�
+        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(Product::getId, needQueryIds);
+        List<Product> products = productMapper.selectList(wrapper);
+
+        // 鏋勫缓鑺傜偣Map
+        Map<Long, ProductTreeDto> nodeMap = new HashMap<>();
+        for (Product product : products) {
+            ProductTreeDto node = new ProductTreeDto();
+            node.setId(product.getId());
+            node.setParentId(product.getParentId());
+            node.setProductName(product.getProductName());
+            node.setLabel(product.getProductName());
+            node.setNodeType("product");
+            node.setChildren(new ArrayList<>());
+            nodeMap.put(product.getId(), node);
+        }
+
+        // 鏋勫缓鐖跺瓙鍏崇郴
+        for (ProductTreeDto node : nodeMap.values()) {
+            Long parentId = node.getParentId();
+            if (parentId != null && parentId != 0 && nodeMap.containsKey(parentId)) {
+                nodeMap.get(parentId).getChildren().add(node);
+            }
+        }
+
+        return nodeMap;
+    }
+
+    /**
+     * 閫掑綊鏌ヨ鎵�鏈変骇鍝佺殑绁栧厛ID锛堢洿鍒版牴鑺傜偣锛�
+     */
+    private Set<Long> getAllAncestorIds(Set<Long> productIds) {
+        Set<Long> ancestorIds = new HashSet<>();
+        Queue<Long> queue = new LinkedList<>(productIds);
+
+        while (!queue.isEmpty()) {
+            Long currentId = queue.poll();
+            Product product = productMapper.selectById(currentId);
+            if (product == null) continue;
+
+            Long parentId = product.getParentId();
+            if (parentId != null && parentId != 0 && !ancestorIds.contains(parentId)) {
+                ancestorIds.add(parentId);
+                queue.add(parentId);
+            }
+        }
+        return ancestorIds;
+    }
+
+    /**
+     * 灏嗗簱瀛樻暟鎹紙鍨嬪彿->鎵规->瀹㈡埛锛夋寕杞藉埌浜у搧鑺傜偣涓�
+     */
+    private void attachStockDataToProduct(Map<Long, ProductTreeDto> productNodeMap,
+                                          List<StockInventoryDto> stockList) {
+        for (StockInventoryDto stock : stockList) {
+            Long productId = stock.getProductId();
+            if (productId == null || !productNodeMap.containsKey(productId)) {
+                continue;
+            }
+
+            ProductTreeDto productNode = productNodeMap.get(productId);
+
+            // 鏋勫缓璇ヤ骇鍝佺殑搴撳瓨鏍戯紙鍨嬪彿 -> 鎵规 -> 瀹㈡埛锛�
+            ProductTreeDto stockTree = buildStockTree(stock);
+
+            // 鍚堝苟鍒颁骇鍝佽妭鐐圭殑 children 涓�
+            mergeStockTree(productNode.getChildren(), stockTree);
+        }
+    }
+
+    /**
+     * 鏋勫缓鍗曚釜搴撳瓨鐨勬爲缁撴瀯锛堝瀷鍙� -> 鎵规 -> 瀹㈡埛锛�
+     */
+    private ProductTreeDto buildStockTree(StockInventoryDto stock) {
+        // 鍨嬪彿鑺傜偣
+        ProductTreeDto modelNode = new ProductTreeDto();
+        modelNode.setModel(stock.getModel());
+        modelNode.setUidNo(stock.getUidNo());
+        modelNode.setUnit(stock.getUnit());
+        modelNode.setProductModelId(stock.getProductModelId());
+        modelNode.setLabel(stock.getModel());
+        modelNode.setNodeType("model");
+        modelNode.setChildren(new ArrayList<>());
+
+        // 鎵规鑺傜偣
+        ProductTreeDto batchNode = new ProductTreeDto();
+        String batchNo = StringUtils.isBlank(stock.getBatchNo()) ? "鏃犳壒娆�" : stock.getBatchNo();
+        batchNode.setBatchNo(batchNo);
+        batchNode.setLabel("鎵规: " + batchNo);
+        batchNode.setNodeType("batch");
+        batchNode.setChildren(new ArrayList<>());
+
+        // 瀹㈡埛鑺傜偣
+        ProductTreeDto customerNode = new ProductTreeDto();
+        String customer = StringUtils.isBlank(stock.getCustomer()) ? "鏃犲鎴�" : stock.getCustomer();
+        customerNode.setCustomer(customer);
+        customerNode.setLabel(customer);
+        customerNode.setNodeType("customer");
+        customerNode.setChildren(new ArrayList<>());
+
+        batchNode.getChildren().add(customerNode);
+        modelNode.getChildren().add(batchNode);
+
+        return modelNode;
+    }
+
+    /**
+     * 鍚堝苟搴撳瓨鏍戝埌浜у搧鑺傜偣鐨� children 涓�
+     */
+    private void mergeStockTree(List<ProductTreeDto> children, ProductTreeDto newStockTree) {
+        if (children == null) {
+            return;
+        }
+
+        // 鏌ユ壘鏄惁宸叉湁鐩稿悓鍨嬪彿鐨勮妭鐐�
+        ProductTreeDto existingModelNode = null;
+        for (ProductTreeDto child : children) {
+            if (child.getNodeType().equals("model") &&
+                    child.getModel() != null &&
+                    child.getModel().equals(newStockTree.getModel())) {
+                existingModelNode = child;
+                break;
+            }
+        }
+
+        if (existingModelNode == null) {
+            // 娌℃湁鐩稿悓鍨嬪彿锛岀洿鎺ユ坊鍔�
+            children.add(newStockTree);
+        } else {
+            // 鏈夌浉鍚屽瀷鍙凤紝鍚堝苟鎵规鑺傜偣
+            ProductTreeDto newBatchNode = newStockTree.getChildren().get(0);
+
+            // 鏌ユ壘鏄惁宸叉湁鐩稿悓鎵规
+            ProductTreeDto existingBatchNode = null;
+            for (ProductTreeDto batchChild : existingModelNode.getChildren()) {
+                if (batchChild.getNodeType().equals("batch") &&
+                        batchChild.getBatchNo() != null &&
+                        batchChild.getBatchNo().equals(newBatchNode.getBatchNo())) {
+                    existingBatchNode = batchChild;
+                    break;
+                }
+            }
+
+            if (existingBatchNode == null) {
+                existingModelNode.getChildren().add(newBatchNode);
+            } else {
+                // 鍚堝苟瀹㈡埛鑺傜偣
+                ProductTreeDto newCustomerNode = newBatchNode.getChildren().get(0);
+                boolean customerExists = false;
+                for (ProductTreeDto customerChild : existingBatchNode.getChildren()) {
+                    if (customerChild.getNodeType().equals("customer") &&
+                            customerChild.getCustomer() != null &&
+                            customerChild.getCustomer().equals(newCustomerNode.getCustomer())) {
+                        customerExists = true;
+                        break;
+                    }
+                }
+                if (!customerExists) {
+                    existingBatchNode.getChildren().add(newCustomerNode);
+                }
+            }
+        }
+    }
 }
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index e4bbefa..530d2f3 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -16,11 +16,13 @@
         <result column="validity_period" property="validityPeriod" />
         <result column="filing_certificate_no" property="filingCertificateNo" />
         <result column="uid_no" property="uidNo" />
+        <result column="parent_name" property="parentName" />
     </resultMap>
     <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
-        select pm.*,p.product_name
+        select pm.*,p.product_name, parent_p.product_name as parent_name
         from product_model pm
         left join product p on pm.product_id = p.id
+        left join product parent_p on p.parent_id = parent_p.id
         <where>
             <if test="c.model != null and c.model != ''">
                 and pm.model  like  concat('%',#{c.model},'%')
diff --git a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
index c5c007e..1446ab6 100644
--- a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
+++ b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -189,7 +189,7 @@
         T1.supplier_name,
         SUM(contract_amount) AS invoiceAmount,
         IFNULL( SUM(T2.current_payment_amount) , 0 ) AS paymentAmount,
-        IFNULL((IFNULL(SUM(contract_amount),0)  - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount
+        IFNULL((IFNULL(SUM(contract_amount),0) - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount
         FROM purchase_ledger T1
         LEFT JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id
         <where>
@@ -197,7 +197,7 @@
                 T1.supplier_name LIKE CONCAT ('%',#{req.supplierName},'%')
             </if>
         </where>
-        GROUP BY T1.supplier_name
+        GROUP BY T1.supplier_id, T1.supplier_name
     </select>
 
     <select id="supplierNameListPageDetails" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 7bcef36..21bc11e 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -65,7 +65,9 @@
         si.remark,
         pm.unit,
         pm.uid_no as uidNo,
-        p.product_name
+        p.product_name,
+        si.batch_no,
+        si.customer
         from stock_inventory si
         left join product_model pm on si.product_model_id = pm.id
         left join product p on pm.product_id = p.id
@@ -257,4 +259,73 @@
         ORDER BY pm.id
     </select>
 
+    <select id="getMaterials" resultType="com.ruoyi.stock.dto.StockInventoryDto">
+        SELECT
+        si.id,
+        si.qualitity,
+        COALESCE(si.locked_quantity, 0) AS locked_quantity,
+        si.product_model_id,
+        si.create_time,
+        si.update_time,
+        COALESCE(si.warn_num, 0) AS warn_num,
+        si.version,
+        (si.qualitity - COALESCE(si.locked_quantity, 0)) AS un_locked_quantity,
+        pm.model,
+        si.remark,
+        pm.unit,
+        pm.uid_no AS uidNo,
+        p.product_name,
+        p1.product_name AS parentName,
+        si.batch_no,
+        si.customer
+        FROM
+        stock_inventory si
+        LEFT JOIN product_model pm ON si.product_model_id = pm.id
+        LEFT JOIN product p ON pm.product_id = p.id
+        LEFT JOIN product p1 ON p1.id = p.parent_id
+        WHERE
+            p1.product_name = '鍘熸潗鏂�';
+        <if test="ew.batchNo != null and ew.batchNo !=''">
+            and si.batch_no like concat('%',#{ew.batchNo},'%')
+        </if>
+        <if test="ew.customer != null and ew.customer !=''">
+            and si.customer like concat('%',#{ew.customer},'%')
+        </if>
+    </select>
+
+    <select id="getStockInventoryAll" resultType="com.ruoyi.stock.dto.StockInventoryDto">
+        SELECT
+            si.id,
+            si.qualitity,
+            COALESCE(si.locked_quantity, 0) AS locked_quantity,
+            si.product_model_id,
+            si.create_time,
+            si.update_time,
+            COALESCE(si.warn_num, 0) AS warn_num,
+            si.version,
+            (si.qualitity - COALESCE(si.locked_quantity, 0)) AS un_locked_quantity,
+            pm.id as productModelId,
+            pm.model,
+            si.remark,
+            pm.unit,
+            pm.uid_no AS uidNo,
+            p.id AS product_id,
+            p.product_name,
+            p.parent_id AS parent_id,
+            p1.product_name AS parentName,
+            si.batch_no,
+            si.customer
+            FROM
+            stock_inventory si
+            LEFT JOIN product_model pm ON si.product_model_id = pm.id
+            LEFT JOIN product p ON pm.product_id = p.id
+            LEFT JOIN product p1 ON p1.id = p.parent_id
+        <where>
+            <if test="ew.productName != null and ew.productName != ''">
+                AND p.product_name LIKE CONCAT('%', #{ew.productName}, '%')
+            </if>
+        </where>
+    </select>
+
+
 </mapper>
diff --git a/src/main/resources/static/return-record.docx b/src/main/resources/static/return-record.docx
new file mode 100644
index 0000000..f6ff374
--- /dev/null
+++ b/src/main/resources/static/return-record.docx
Binary files differ
diff --git a/src/main/resources/static/sale-outbound.docx b/src/main/resources/static/sale-outbound.docx
index 781a210..6b348a9 100644
--- a/src/main/resources/static/sale-outbound.docx
+++ b/src/main/resources/static/sale-outbound.docx
Binary files differ

--
Gitblit v1.9.3