From f4c288c55d08c04cd026508b358beebfcdce5fc2 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期五, 22 五月 2026 09:29:09 +0800
Subject: [PATCH] feat(product): 添加产品型号向下复制功能并优化生产报工重量计算 - 在ProductController中新增downCopy接口实现产品型号批量复制功能 - 将ProductionProductMainDto中的bomInputQty字段重命名为inputWeight - 在ProductionProductMainServiceImpl中添加JSON解析逻辑支持从otherData中提取投入重量 - 新增resolveInputWeight、findParameterValue、findFieldValue等工具方法处理复杂参数解析 - 为ProductModelDto添加targetProductId字段用于指定复制目标 - 修复销售台账按调度员ID和姓名分组的SQL查询问题 - 优化库存服务中剩余数量计算的空值处理逻辑 - 完善生产投料数量为空时的默认值处理机制

---
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |  384 ++++++++++++++++++++++++++++++------------------------
 1 files changed, 210 insertions(+), 174 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 5a2681f..30077e3 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -16,17 +16,14 @@
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.stock.dto.FinishedProductTreeDto;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import com.ruoyi.stock.dto.StockInRecordDto;
-import com.ruoyi.stock.dto.StockInventoryDto;
-import com.ruoyi.stock.dto.StockOutRecordDto;
-import com.ruoyi.stock.dto.StockUninventoryDto;
+import com.ruoyi.stock.dto.*;
+import com.ruoyi.stock.execl.FinishedProductInventoryExportData;
+import com.ruoyi.stock.execl.NonFinishedProductInventoryExportData;
 import com.ruoyi.stock.execl.StockInventoryExportData;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.pojo.StockInRecord;
@@ -45,12 +42,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -79,40 +71,40 @@
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
     }
 
-    /**
-     * 鏌ヨ鎴愬搧搴撳瓨鏍戙��
-     * 杩斿洖缁撴瀯娌跨敤鍩虹璧勬枡浜у搧鏍戯紝鍙跺瓙鑺傜偣琛ュ厖鎴愬搧搴撳瓨缁村害锛氬瀷鍙枫�佸伐搴忓垎绫汇�佺數鍘嬨��
-     */
     @Override
     public List<FinishedProductTreeDto> finishedProductList(StockInventoryDto stockInventoryDto) {
-        List<StockInventoryDto> inventoryList = stockInventoryMapper.selectFinishedProductInventoryList(stockInventoryDto);
-        if (inventoryList.isEmpty()) {
+        // 鏌ヨ搴撳瓨鏁版嵁
+        List<FinishedProductTreeDto> dataList = stockInventoryMapper.selectFinishedProductList(stockInventoryDto);
+        if (dataList.isEmpty()) {
             return new ArrayList<>();
         }
 
-        List<Product> allProducts = productMapper.selectList(null);
-        Map<Long, Product> productMap = new HashMap<>();
-        Map<Long, List<Product>> childrenMap = new HashMap<>();
-        for (Product product : allProducts) {
-            productMap.put(product.getId(), product);
-            childrenMap.computeIfAbsent(product.getParentId(), key -> new ArrayList<>()).add(product);
+        // 鎸変骇鍝両D鍒嗙粍锛屾瀯寤烘爲褰㈢粨鏋�
+        Map<Long, FinishedProductTreeDto> productMap = new LinkedHashMap<>();
+        for (FinishedProductTreeDto data : dataList) {
+            Long productId = data.getProductId();
+            if (!productMap.containsKey(productId)) {
+                // 鍒涘缓浜у搧澶х被鑺傜偣
+                FinishedProductTreeDto productNode = new FinishedProductTreeDto();
+                productNode.setProductId(productId);
+                productNode.setProductName(data.getProductName());
+                productNode.setLabel(data.getLabel());
+                productNode.setChildren(new ArrayList<>());
+                productMap.put(productId, productNode);
+            }
+            // 娣诲姞搴撳瓨鍙跺瓙鑺傜偣
+            FinishedProductTreeDto leafNode = new FinishedProductTreeDto();
+            leafNode.setStockId(data.getStockId());
+            leafNode.setProductModelId(data.getProductModelId());
+            leafNode.setModel(data.getModel());
+            leafNode.setProcessCategory(data.getProcessCategory());
+            leafNode.setVoltage(data.getVoltage());
+            leafNode.setMaterialCode(data.getMaterialCode());
+            leafNode.setUnit(data.getUnit());
+            productMap.get(productId).getChildren().add(leafNode);
         }
 
-        Map<Long, List<FinishedProductTreeDto>> leafMap = buildFinishedProductLeafMap(inventoryList);
-        Set<Long> visibleProductIds = collectVisibleProductIds(leafMap.keySet(), productMap);
-
-        List<FinishedProductTreeDto> result = new ArrayList<>();
-        for (Product rootProduct : allProducts) {
-            if (!isFinishedRoot(rootProduct)) {
-                continue;
-            }
-            FinishedProductTreeDto rootNode = buildProductNode(rootProduct);
-            rootNode.setChildren(buildFinishedChildren(rootProduct.getId(), childrenMap, leafMap, visibleProductIds));
-            if (!rootNode.getChildren().isEmpty()) {
-                result.add(rootNode);
-            }
-        }
-        return result;
+        return new ArrayList<>(productMap.values());
     }
 
     @Override
@@ -279,6 +271,25 @@
         stockOutRecordDto.setType("0");
         stockOutRecordService.add(stockOutRecordDto);
 
+        //閿�鍞嚭搴撴寜鐓т繚瀛樼殑搴撳瓨id
+        if (stockInventoryDto.getStockId() != null) {
+            StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getStockId());
+            if (ObjectUtils.isEmpty(stockInventory)) {
+                throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
+            }
+            BigDecimal lockedQty = defaultDecimal(stockInventory.getLockedQuantity());
+            if (stockInventoryDto.getQualitity().compareTo(defaultDecimal(stockInventory.getQualitity()).subtract(lockedQty)) > 0) {
+                ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
+                Product product = productMapper.selectById(productModel.getProductId());
+                throw new RuntimeException(product.getProductName() + "/" + productModel.getModel() + "搴撳瓨涓嶈冻锛屾棤娉曞嚭搴�");
+            }
+            stockInventory.setQualitity(defaultDecimal(stockInventory.getQualitity()).subtract(stockInventoryDto.getQualitity()));
+            stockInventory.setVersion(stockInventory.getVersion() == null ? 1 : stockInventory.getVersion() + 1);
+            stockInventory.setUpdateTime(LocalDateTime.now());
+            stockInventoryMapper.updateById(stockInventory);
+            return true;
+        }
+
         if (StringUtils.isBlank(stockInventoryDto.getBatchNo()) && !usesDimensionIdentity(normalizeDimension(stockInventoryDto.getProcessCategory()), normalizeDimension(stockInventoryDto.getVoltage()))) {
             List<StockInventory> stockInventories = stockInventoryMapper.selectList(new QueryWrapper<StockInventory>().lambda()
                     .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
@@ -287,7 +298,7 @@
                 throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
             }
 
-            BigDecimal remainingQty = stockInventoryDto.getQualitity();
+            BigDecimal remainingQty = stockInventoryDto.getQualitity() == null ? BigDecimal.ZERO : stockInventoryDto.getQualitity();
             for (StockInventory stockInventory : stockInventories) {
                 BigDecimal lockedQty = defaultDecimal(stockInventory.getLockedQuantity());
                 BigDecimal availableQty = defaultDecimal(stockInventory.getQualitity()).subtract(lockedQty);
@@ -335,7 +346,7 @@
     }
 
     @Override
-    public R importStockInventory(MultipartFile file) {
+    public R importStockInventory(MultipartFile file, Integer productType) {
         try {
             List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectProduct();
             Map<String, SalesLedgerProduct> productMap = new HashMap<>();
@@ -344,65 +355,129 @@
                 productMap.put(key, product);
             }
 
-            ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
-            List<StockInventoryExportData> list = util.importExcel(file.getInputStream());
             List<String> unmatchedRecords = new ArrayList<>();
             int successCount = 0;
 
-            for (StockInventoryExportData dto : list) {
-                String key = dto.getProductName() + "|" + dto.getModel();
-                SalesLedgerProduct matchedProduct = productMap.get(key);
+            // productType: 1=鎴愬搧, 0=闈炴垚鍝�
+            if (productType == 1) {
+                // 鎴愬搧瀵煎叆锛堝寘鍚伐搴忕被鍒拰鐢靛帇锛�
+                ExcelUtil<FinishedProductInventoryExportData> util = new ExcelUtil<>(FinishedProductInventoryExportData.class);
+                List<FinishedProductInventoryExportData> list = util.importExcel(file.getInputStream());
 
-                if (matchedProduct != null) {
-                    if (dto.getQualifiedQuantity() != null && dto.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
-                        StockInventoryDto stockInventoryDto = new StockInventoryDto();
-                        stockInventoryDto.setRecordId(0L);
-                        stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
-                        stockInventoryDto.setQualitity(dto.getQualifiedQuantity());
-                        stockInventoryDto.setRemark(dto.getRemark());
-                        stockInventoryDto.setWarnNum(dto.getWarnNum());
-                        stockInventoryDto.setBatchNo(dto.getQualifiedBatchNo());
-                        stockInventoryDto.setProcessCategory(dto.getProcessCategory());
-                        stockInventoryDto.setVoltage(dto.getVoltage());
+                for (FinishedProductInventoryExportData dto : list) {
+                    String key = dto.getProductName() + "|" + dto.getModel();
+                    SalesLedgerProduct matchedProduct = productMap.get(key);
 
-                        if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) {
-                            if (dto.getQualifiedLockedQuantity().compareTo(dto.getQualifiedQuantity()) > 0) {
-                                throw new RuntimeException("鍚堟牸鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫悎鏍煎簱瀛樻暟閲�");
+                    if (matchedProduct != null) {
+                        if (dto.getQualifiedQuantity() != null && dto.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+                            stockInventoryDto.setRecordId(0L);
+                            stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
+                            stockInventoryDto.setQualitity(dto.getQualifiedQuantity());
+                            stockInventoryDto.setRemark(dto.getRemark());
+                            stockInventoryDto.setWarnNum(dto.getWarnNum());
+                            stockInventoryDto.setBatchNo(dto.getQualifiedBatchNo());
+                            stockInventoryDto.setProcessCategory(dto.getProcessCategory());
+                            stockInventoryDto.setVoltage(dto.getVoltage());
+
+                            if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) {
+                                if (dto.getQualifiedLockedQuantity().compareTo(dto.getQualifiedQuantity()) > 0) {
+                                    throw new RuntimeException("鍚堟牸鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫悎鏍煎簱瀛樻暟閲�");
+                                }
+                                stockInventoryDto.setLockedQuantity(dto.getQualifiedLockedQuantity());
+                            } else {
+                                stockInventoryDto.setLockedQuantity(BigDecimal.ZERO);
                             }
-                            stockInventoryDto.setLockedQuantity(dto.getQualifiedLockedQuantity());
-                        } else {
-                            stockInventoryDto.setLockedQuantity(BigDecimal.ZERO);
+
+                            stockInventoryDto.setProductModelId(matchedProduct.getProductModelId());
+                            this.addstockInventory(stockInventoryDto);
+                            successCount++;
                         }
 
-                        stockInventoryDto.setProductModelId(matchedProduct.getProductModelId());
-                        this.addstockInventory(stockInventoryDto);
-                        successCount++;
-                    }
+                        if (dto.getUnQualifiedQuantity() != null && dto.getUnQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                            StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+                            stockUninventoryDto.setRecordId(0L);
+                            stockUninventoryDto.setRecordType(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
+                            stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity());
+                            stockUninventoryDto.setRemark(dto.getRemark());
+                            stockUninventoryDto.setBatchNo(dto.getUnQualifiedBatchNo());
 
-                    if (dto.getUnQualifiedQuantity() != null && dto.getUnQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
-                        StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
-                        stockUninventoryDto.setRecordId(0L);
-                        stockUninventoryDto.setRecordType(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
-                        stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity());
-                        stockUninventoryDto.setRemark(dto.getRemark());
-                        stockUninventoryDto.setBatchNo(dto.getUnQualifiedBatchNo());
-
-                        if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) {
-                            if (dto.getUnQualifiedLockedQuantity().compareTo(dto.getUnQualifiedQuantity()) > 0) {
-                                throw new RuntimeException("涓嶅悎鏍煎喕缁撴暟閲忎笉鑳借秴杩囨湰娆″鍏ョ殑涓嶅悎鏍煎簱瀛樻暟閲�");
+                            if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) {
+                                if (dto.getUnQualifiedLockedQuantity().compareTo(dto.getUnQualifiedQuantity()) > 0) {
+                                    throw new RuntimeException("涓嶅悎鏍煎喕缁撴暟閲忎笉鑳借秴杩囨湰娆″鍏ョ殑涓嶅悎鏍煎簱瀛樻暟閲�");
+                                }
+                                stockUninventoryDto.setLockedQuantity(dto.getUnQualifiedLockedQuantity());
+                            } else {
+                                stockUninventoryDto.setLockedQuantity(BigDecimal.ZERO);
                             }
-                            stockUninventoryDto.setLockedQuantity(dto.getUnQualifiedLockedQuantity());
-                        } else {
-                            stockUninventoryDto.setLockedQuantity(BigDecimal.ZERO);
+
+                            stockUninventoryDto.setProductModelId(matchedProduct.getProductModelId());
+                            stockUninventoryService.addStockUninventory(stockUninventoryDto);
+                            successCount++;
+                        }
+                    } else {
+                        String unmatchedRecord = "浜у搧鍚嶇О锛�" + dto.getProductName() + "锛屽瀷鍙凤細" + dto.getModel() + " 鏈尮閰嶅埌搴撳瓨浜у搧";
+                        unmatchedRecords.add(unmatchedRecord);
+                    }
+                }
+            } else {
+                // 闈炴垚鍝佸鍏ワ紙涓嶅寘鍚伐搴忕被鍒拰鐢靛帇锛�
+                ExcelUtil<NonFinishedProductInventoryExportData> util = new ExcelUtil<>(NonFinishedProductInventoryExportData.class);
+                List<NonFinishedProductInventoryExportData> list = util.importExcel(file.getInputStream());
+
+                for (NonFinishedProductInventoryExportData dto : list) {
+                    String key = dto.getProductName() + "|" + dto.getModel();
+                    SalesLedgerProduct matchedProduct = productMap.get(key);
+
+                    if (matchedProduct != null) {
+                        if (dto.getQualifiedQuantity() != null && dto.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+                            stockInventoryDto.setRecordId(0L);
+                            stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
+                            stockInventoryDto.setQualitity(dto.getQualifiedQuantity());
+                            stockInventoryDto.setRemark(dto.getRemark());
+                            stockInventoryDto.setWarnNum(dto.getWarnNum());
+                            stockInventoryDto.setBatchNo(dto.getQualifiedBatchNo());
+
+                            if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) {
+                                if (dto.getQualifiedLockedQuantity().compareTo(dto.getQualifiedQuantity()) > 0) {
+                                    throw new RuntimeException("鍚堟牸鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫悎鏍煎簱瀛樻暟閲�");
+                                }
+                                stockInventoryDto.setLockedQuantity(dto.getQualifiedLockedQuantity());
+                            } else {
+                                stockInventoryDto.setLockedQuantity(BigDecimal.ZERO);
+                            }
+
+                            stockInventoryDto.setProductModelId(matchedProduct.getProductModelId());
+                            this.addstockInventory(stockInventoryDto);
+                            successCount++;
                         }
 
-                        stockUninventoryDto.setProductModelId(matchedProduct.getProductModelId());
-                        stockUninventoryService.addStockUninventory(stockUninventoryDto);
-                        successCount++;
+                        if (dto.getUnQualifiedQuantity() != null && dto.getUnQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                            StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+                            stockUninventoryDto.setRecordId(0L);
+                            stockUninventoryDto.setRecordType(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
+                            stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity());
+                            stockUninventoryDto.setRemark(dto.getRemark());
+                            stockUninventoryDto.setBatchNo(dto.getUnQualifiedBatchNo());
+
+                            if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) {
+                                if (dto.getUnQualifiedLockedQuantity().compareTo(dto.getUnQualifiedQuantity()) > 0) {
+                                    throw new RuntimeException("涓嶅悎鏍煎喕缁撴暟閲忎笉鑳借秴杩囨湰娆″鍏ョ殑涓嶅悎鏍煎簱瀛樻暟閲�");
+                                }
+                                stockUninventoryDto.setLockedQuantity(dto.getUnQualifiedLockedQuantity());
+                            } else {
+                                stockUninventoryDto.setLockedQuantity(BigDecimal.ZERO);
+                            }
+
+                            stockUninventoryDto.setProductModelId(matchedProduct.getProductModelId());
+                            stockUninventoryService.addStockUninventory(stockUninventoryDto);
+                            successCount++;
+                        }
+                    } else {
+                        String unmatchedRecord = "浜у搧鍚嶇О锛�" + dto.getProductName() + "锛屽瀷鍙凤細" + dto.getModel() + " 鏈尮閰嶅埌搴撳瓨浜у搧";
+                        unmatchedRecords.add(unmatchedRecord);
                     }
-                } else {
-                    String unmatchedRecord = "浜у搧鍚嶇О锛�" + dto.getProductName() + "锛屽瀷鍙凤細" + dto.getModel() + " 鏈尮閰嶅埌搴撳瓨浜у搧";
-                    unmatchedRecords.add(unmatchedRecord);
                 }
             }
 
@@ -423,10 +498,55 @@
     }
 
     @Override
-    public void exportStockInventory(HttpServletResponse response, StockInventoryDto stockInventoryDto) {
+    public void exportStockInventory(HttpServletResponse response, StockInventoryDto stockInventoryDto, Integer productType) {
         List<StockInventoryExportData> list = stockInventoryMapper.listStockInventoryExportData(stockInventoryDto);
-        ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
-        util.exportExcel(response, list, "搴撳瓨淇℃伅");
+
+        // productType: 1=鎴愬搧, 0=闈炴垚鍝�
+        if (productType == 1) {
+            // 鎴愬搧瀵煎嚭锛堝寘鍚伐搴忕被鍒拰鐢靛帇锛�
+            List<FinishedProductInventoryExportData> finishedList = new ArrayList<>();
+            for (StockInventoryExportData data : list) {
+                FinishedProductInventoryExportData finishedData = new FinishedProductInventoryExportData();
+                finishedData.setProductName(data.getProductName());
+                finishedData.setModel(data.getModel());
+                finishedData.setUnit(data.getUnit());
+                finishedData.setMaterialCode(data.getMaterialCode());
+                finishedData.setProcessCategory(data.getProcessCategory());
+                finishedData.setVoltage(data.getVoltage());
+                finishedData.setQualifiedBatchNo(data.getQualifiedBatchNo());
+                finishedData.setUnQualifiedBatchNo(data.getUnQualifiedBatchNo());
+                finishedData.setQualifiedQuantity(data.getQualifiedQuantity());
+                finishedData.setUnQualifiedQuantity(data.getUnQualifiedQuantity());
+                finishedData.setWarnNum(data.getWarnNum());
+                finishedData.setQualifiedLockedQuantity(data.getQualifiedLockedQuantity());
+                finishedData.setUnQualifiedLockedQuantity(data.getUnQualifiedLockedQuantity());
+                finishedData.setRemark(data.getRemark());
+                finishedList.add(finishedData);
+            }
+            ExcelUtil<FinishedProductInventoryExportData> util = new ExcelUtil<>(FinishedProductInventoryExportData.class);
+            util.exportExcel(response, finishedList, "鎴愬搧搴撳瓨淇℃伅");
+        } else {
+            // 闈炴垚鍝佸鍑猴紙涓嶅寘鍚伐搴忕被鍒拰鐢靛帇锛�
+            List<NonFinishedProductInventoryExportData> nonFinishedList = new ArrayList<>();
+            for (StockInventoryExportData data : list) {
+                NonFinishedProductInventoryExportData nonFinishedData = new NonFinishedProductInventoryExportData();
+                nonFinishedData.setProductName(data.getProductName());
+                nonFinishedData.setModel(data.getModel());
+                nonFinishedData.setUnit(data.getUnit());
+                nonFinishedData.setMaterialCode(data.getMaterialCode());
+                nonFinishedData.setQualifiedBatchNo(data.getQualifiedBatchNo());
+                nonFinishedData.setUnQualifiedBatchNo(data.getUnQualifiedBatchNo());
+                nonFinishedData.setQualifiedQuantity(data.getQualifiedQuantity());
+                nonFinishedData.setUnQualifiedQuantity(data.getUnQualifiedQuantity());
+                nonFinishedData.setWarnNum(data.getWarnNum());
+                nonFinishedData.setQualifiedLockedQuantity(data.getQualifiedLockedQuantity());
+                nonFinishedData.setUnQualifiedLockedQuantity(data.getUnQualifiedLockedQuantity());
+                nonFinishedData.setRemark(data.getRemark());
+                nonFinishedList.add(nonFinishedData);
+            }
+            ExcelUtil<NonFinishedProductInventoryExportData> util = new ExcelUtil<>(NonFinishedProductInventoryExportData.class);
+            util.exportExcel(response, nonFinishedList, "闈炴垚鍝佸簱瀛樹俊鎭�");
+        }
     }
 
     @Override
@@ -505,89 +625,5 @@
 
     private BigDecimal defaultDecimal(BigDecimal value) {
         return value == null ? BigDecimal.ZERO : value;
-    }
-
-    private Map<Long, List<FinishedProductTreeDto>> buildFinishedProductLeafMap(List<StockInventoryDto> inventoryList) {
-        Map<Long, List<FinishedProductTreeDto>> leafMap = new HashMap<>();
-        for (StockInventoryDto inventory : inventoryList) {
-            FinishedProductTreeDto leafNode = new FinishedProductTreeDto();
-            leafNode.setId(inventory.getId() == null ? null : -inventory.getId());
-            leafNode.setParentId(inventory.getProductId());
-            leafNode.setProductId(inventory.getProductId());
-            leafNode.setProductModelId(inventory.getProductModelId());
-            leafNode.setProductName(inventory.getProductName());
-            leafNode.setLabel(buildLeafLabel(inventory));
-            leafNode.setModel(inventory.getModel());
-            leafNode.setMaterialCode(inventory.getMaterialCode());
-            leafNode.setProcessCategory(inventory.getProcessCategory());
-            leafNode.setVoltage(inventory.getVoltage());
-            leafNode.setChildren(new ArrayList<>());
-            leafMap.computeIfAbsent(inventory.getProductId(), key -> new ArrayList<>()).add(leafNode);
-        }
-        return leafMap;
-    }
-
-    private Set<Long> collectVisibleProductIds(Set<Long> leafProductIds, Map<Long, Product> productMap) {
-        Set<Long> visibleIds = new HashSet<>();
-        for (Long productId : leafProductIds) {
-            Long currentId = productId;
-            while (currentId != null) {
-                Product current = productMap.get(currentId);
-                if (current == null) {
-                    break;
-                }
-                visibleIds.add(currentId);
-                currentId = current.getParentId();
-            }
-        }
-        return visibleIds;
-    }
-
-    private List<FinishedProductTreeDto> buildFinishedChildren(Long parentId,
-                                                               Map<Long, List<Product>> childrenMap,
-                                                               Map<Long, List<FinishedProductTreeDto>> leafMap,
-                                                               Set<Long> visibleProductIds) {
-        List<FinishedProductTreeDto> children = new ArrayList<>();
-        List<Product> childProducts = childrenMap.getOrDefault(parentId, new ArrayList<>());
-        for (Product childProduct : childProducts) {
-            if (!visibleProductIds.contains(childProduct.getId())) {
-                continue;
-            }
-            FinishedProductTreeDto childNode = buildProductNode(childProduct);
-            List<FinishedProductTreeDto> subChildren = buildFinishedChildren(childProduct.getId(), childrenMap, leafMap, visibleProductIds);
-            subChildren.addAll(leafMap.getOrDefault(childProduct.getId(), new ArrayList<>()));
-            childNode.setChildren(subChildren);
-            children.add(childNode);
-        }
-        return children;
-    }
-
-    private FinishedProductTreeDto buildProductNode(Product product) {
-        FinishedProductTreeDto node = new FinishedProductTreeDto();
-        BeanUtils.copyProperties(product, node);
-        node.setLabel(product.getProductName());
-        node.setChildren(new ArrayList<>());
-        return node;
-    }
-
-    private boolean isFinishedRoot(Product product) {
-        return product.getParentId() == null && "鎴愬搧".equals(StringUtils.trimToEmpty(product.getProductName()));
-    }
-
-    private String buildLeafLabel(StockInventoryDto inventory) {
-        List<String> parts = new ArrayList<>();
-        if (StringUtils.isNotBlank(inventory.getProductName())) {
-            parts.add(StringUtils.trim(inventory.getProductName()));
-        }
-        if (StringUtils.isNotBlank(inventory.getModel())) {
-            parts.add(StringUtils.trim(inventory.getModel()));
-        }
-        if (StringUtils.isNotBlank(inventory.getProcessCategory())) {
-            parts.add(StringUtils.trim(inventory.getProcessCategory()));
-        }
-        if (StringUtils.isNotBlank(inventory.getVoltage())) {
-            parts.add(StringUtils.trim(inventory.getVoltage()));
-        }
-        return String.join(" / ", parts);
     }
 }

--
Gitblit v1.9.3