From 17a63200983a8e154a1eb3549d1caffa050372c1 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 30 三月 2026 17:14:45 +0800
Subject: [PATCH] feat:1.生产订单领用 2.报工领用(关联订单领用) 3.报工删除(关联报工领用) 4.不合格处理(返工生成返工附件并下载)

---
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                      |    3 
 src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java                   |    3 
 src/main/java/com/ruoyi/basic/controller/ProductController.java                       |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java          |   47 +-----
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |  120 ++++++++++++++---
 src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java                           |   11 +
 src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java               |    4 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                              |   26 +++
 src/main/resources/static/return-record.docx                                          |    0 
 src/main/java/com/ruoyi/production/service/ProductOrderService.java                   |    2 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                       |    9 
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                |    6 
 src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java                  |    4 
 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       |   69 +++++++++
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java             |    6 
 src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java         |    1 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java                        |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |   21 ++-
 20 files changed, 268 insertions(+), 100 deletions(-)

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/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..26578a0 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
@@ -75,7 +70,9 @@
     public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
-        stockInventoryDto.setRecordType(String.valueOf(recordType));
+        if (recordType != null) {
+            stockInventoryDto.setRecordType(recordType);
+        }
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
         stockInventoryService.addstockInventory(stockInventoryDto);
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..f53fe59 100644
--- a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
+++ b/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
@@ -7,11 +7,22 @@
 @Data
 public class DrawMaterialDto {
 
+    //璁㈠崟id
     private Long id;
+    //鍨嬪彿id
     private Long productModelId;
+    //搴撳瓨鏁伴噺
     private BigDecimal qualitity;
+    //棰嗙敤鏁伴噺
     private BigDecimal requisitionQty;
+    //浜у搧鍚嶇О
     private String productName;
+    //浜у搧鍨嬪彿
     private String model;
+    //浜у搧鍗曚綅
     private String unit;
+    //鎶ュ伐棰嗙敤鏁伴噺
+    private BigDecimal reportQty;
+    //浜у搧鍗曚綅
+    private String remark;
 }
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..404a09b 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -30,4 +30,7 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
 }
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..3d694ca 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -23,7 +23,6 @@
 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -32,7 +31,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
@@ -252,41 +252,6 @@
     }
 
     @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);
-    }
-
-    @Override
     @Transactional(rollbackFor = Exception.class)
     public int drawMaterials(ProductOrderDto productOrderDto) {
         if (productOrderDto == null || productOrderDto.getId() == null) {
@@ -308,6 +273,14 @@
         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());
+            }
+        }
 
         // 澶勭悊棰嗘枡锛堟墸鍑忓簱瀛橈級
         try {
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..de4908d 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,68 @@
         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);
-        }
-        for (ProductStructureDto productStructureDto : productStructureDtos) {
+        /* 鏂板鎶ュ伐鎶曞叆琛� */
+        List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList();
+        if (!CollectionUtils.isEmpty(drawMaterialList)) {
+            // 1. 鎵归噺鏌ヨ鏁版嵁
+            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+            if (productWorkOrder == null) {
+                throw new RuntimeException("宸ュ崟涓嶅瓨鍦�");
+            }
 
-            ProductionProductInput productionProductInput = new ProductionProductInput();
-            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
-            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
-            productionProductInput.setProductMainId(productionProductMain.getId());
-            productionProductInputMapper.insert(productionProductInput);
+            ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+            if (productOrder == null) {
+                throw new RuntimeException("浜у搧璁㈠崟涓嶅瓨鍦�");
+            }
+
+            // 2. 瑙f瀽骞舵瀯寤虹墿鏂橫ap
+            List<DrawMaterialDto> existingMaterialList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+            if (CollectionUtils.isEmpty(existingMaterialList)) {
+                throw new RuntimeException("鍙鐢ㄧ墿鏂欏垪琛ㄤ负绌�");
+            }
+
+            Map<Long, DrawMaterialDto> materialMap = existingMaterialList.stream()
+                    .collect(Collectors.toMap(DrawMaterialDto::getProductModelId,
+                            Function.identity()));
+
+            // 澶勭悊鎶ュ伐鐗╂枡
+            List<ProductionProductInput> inputList = new ArrayList<>();
+
+            for (DrawMaterialDto drawMaterial : drawMaterialList) {
+                Long modelId = drawMaterial.getProductModelId();
+                BigDecimal reportQty = drawMaterial.getReportQty();
+
+                DrawMaterialDto material = materialMap.get(modelId);
+                if (material == null) {
+                    throw new RuntimeException("鐗╂枡涓嶅瓨鍦�: " + modelId);
+                }
+
+                // 楠岃瘉搴撳瓨
+                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());
+                inputList.add(input);
+            }
+
+            if (!inputList.isEmpty()) {
+                for (ProductionProductInput productionProductInput : inputList) {
+                    productionProductInputMapper.insert(productionProductInput);
+                }
+                productOrder.setDrawMaterials(JSON.toJSONString(existingMaterialList));
+                productOrderMapper.updateById(productOrder);
+            }
         }
         /*鏂板鎶ュ伐浜у嚭琛�*/
         ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -217,7 +265,7 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
                 stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
@@ -275,10 +323,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 +380,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/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/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 1650690..a3c199d 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,8 +7,8 @@
 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;
@@ -17,7 +17,10 @@
 import com.ruoyi.production.mapper.ProductProcessRouteMapper;
 import com.ruoyi.production.mapper.ProductWorkOrderMapper;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
-import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductProcessRoute;
+import com.ruoyi.production.pojo.ProductProcessRouteItem;
+import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.production.service.ProductOrderService;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
@@ -29,10 +32,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
@@ -67,7 +74,6 @@
         if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
             switch (qualityUnqualified.getDealResult()) {
                 case "杩斾慨":
-                case "杩斿伐":
                     //鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
                     if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
                         //杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
@@ -133,6 +139,7 @@
                     //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
                     stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
                     break;
+                case "杩斿伐":
                 default:
                     break;
             }
@@ -161,4 +168,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/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index f878bdb..5540404 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -105,4 +105,10 @@
     public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
         return R.ok(stockInventoryService.thawStock(stockInventoryDto));
     }
+
+    @ApiOperation("鏌ヨ搴撳瓨鍘熸潗鏂�")
+    @GetMapping("/getMaterials")
+    public R getMaterials() {
+        return R.ok(stockInventoryService.getMaterials());
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 3d520a0..2280374 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -51,4 +51,6 @@
     BigDecimal selectTotalByDate(@Param("now") LocalDate now);
 
     List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids);
+
+    List<StockInventoryDto> getMaterials();
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..9b43570 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -10,6 +10,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * <p>
@@ -38,4 +39,6 @@
     Boolean frozenStock(StockInventoryDto stockInventoryDto);
 
     Boolean thawStock(StockInventoryDto stockInventoryDto);
+
+    List<StockInventoryDto> getMaterials();
 }
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..3de9e50 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -55,13 +55,15 @@
     @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");
+            stockInRecordService.add(stockInRecordDto);
+        }
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
         StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
@@ -206,4 +208,9 @@
         stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
         return this.updateById(stockInventory);
     }
+
+    @Override
+    public List<StockInventoryDto> getMaterials() {
+        return stockInventoryMapper.getMaterials();
+    }
 }
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 7bcef36..da3f233 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -257,4 +257,30 @@
         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
+        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 = '鍘熸潗鏂�';
+    </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

--
Gitblit v1.9.3