From 6f0df10fdd0e55e5ed3e31b1720efd25e2bf02fb Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 16 九月 2026 18:51:12 +0800
Subject: [PATCH] fix: 添加条件过滤以确保查询结果中合格数量大于零

---
 src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java |  347 ++++++++++++++++++++++++++-------------------------------
 1 files changed, 159 insertions(+), 188 deletions(-)

diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java
index 807374f..f0b8bb3 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java
@@ -13,27 +13,31 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.production.dto.BomImportDto;
-import com.ruoyi.production.dto.ProductStructureDto;
-import com.ruoyi.production.pojo.ProductStructure;
+import com.ruoyi.technology.bean.dto.BomImportDto;
 import com.ruoyi.technology.bean.dto.TechnologyBomDto;
+import com.ruoyi.technology.bean.vo.TechnologyBomStructureVo;
 import com.ruoyi.technology.bean.vo.TechnologyBomVo;
 import com.ruoyi.technology.mapper.TechnologyBomMapper;
+import com.ruoyi.technology.mapper.TechnologyOperationMapper;
 import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
 import com.ruoyi.technology.pojo.TechnologyBom;
 import com.ruoyi.technology.pojo.TechnologyBomStructure;
+import com.ruoyi.technology.pojo.TechnologyOperation;
 import com.ruoyi.technology.pojo.TechnologyRouting;
 import com.ruoyi.technology.service.TechnologyBomService;
 import com.ruoyi.technology.service.TechnologyBomStructureService;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import jakarta.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @Service
 @RequiredArgsConstructor
@@ -44,6 +48,7 @@
     private final TechnologyBomStructureService technologyBomStructureService;
     private final TechnologyRoutingMapper technologyRoutingMapper;
     private final IProductService productService;
+    private final TechnologyOperationMapper technologyOperationMapper;
 
     /**
      * 鍒嗛〉鏌ヨBOM鍒楄〃銆�
@@ -79,7 +84,7 @@
     }
 
     /**
-     * 鏂板BOM骞跺垵濮嬪寲鏍圭粨鏋勮妭鐐广��
+     * 鏂板BOM銆侭OM涓昏〃鏈韩鍗充唬琛ㄦ垚鍝佽鏍硷紝鏄庣粏琛ㄤ笉鍐嶅啓鍏ユ垚鍝佹牴鑺傜偣銆�
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -91,29 +96,29 @@
         }
         technologyBom.setBomNo("BM." + String.format("%05d", technologyBom.getId()));
         technologyBomMapper.updateById(technologyBom);
-        initRootStructure(technologyBom.getId().longValue(), technologyBom.getProductModelId());
         return R.ok();
     }
 
     /**
-     * 淇敼BOM锛岃鏍煎彉鍖栨椂鍚屾鍒锋柊鍏宠仈缁撴瀯涓庤矾绾挎暟鎹��
+     * 淇敼BOM銆傛垚鍝佽鏍煎彉鍖栨椂鍚屾鍒锋柊宸ヨ壓璺嚎鐨勬垚鍝佽鏍硷紝
+     * 骞舵竻鐞嗕笌鏂版垚鍝佽鏍煎啿绐佺殑鐗╂枡琛岋紙鎴愬搧涓嶈兘浣滀负鑷韩鐗╂枡锛夛紝鍏朵綑鐗╂枡-宸ュ簭鍏崇郴淇濈暀銆�
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R update(TechnologyBom technologyBom) {
         if (technologyBom.getId() == null) {
-            throw new ServiceException("BOM id is required");
+            throw new ServiceException("BOM ID涓嶈兘涓虹┖");
         }
         validateProductModel(technologyBom.getProductModelId());
         TechnologyBom oldBom = technologyBomMapper.selectById(technologyBom.getId());
         if (oldBom == null) {
-            throw new ServiceException("BOM not found");
+            throw new ServiceException("BOM涓嶅瓨鍦�");
         }
         if (oldBom.getProductModelId() != null && !oldBom.getProductModelId().equals(technologyBom.getProductModelId())) {
             technologyRoutingMapper.updateProductModelByBomId(technologyBom.getProductModelId(), technologyBom.getId().longValue());
             technologyBomStructureService.remove(Wrappers.<TechnologyBomStructure>lambdaQuery()
-                    .eq(TechnologyBomStructure::getBomId, technologyBom.getId().longValue()));
-            initRootStructure(technologyBom.getId().longValue(), technologyBom.getProductModelId());
+                    .eq(TechnologyBomStructure::getBomId, technologyBom.getId().longValue())
+                    .eq(TechnologyBomStructure::getProductModelId, technologyBom.getProductModelId()));
         }
         if (technologyBom.getBomNo() == null) {
             technologyBom.setBomNo(oldBom.getBomNo());
@@ -127,14 +132,14 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean batchDelete(List<Integer> ids) {
+    public boolean batchDelete(List<Long> ids) {
         if (ids == null || ids.isEmpty()) {
-            throw new ServiceException("Select at least one BOM");
+            throw new ServiceException("璇疯嚦灏戦�夋嫨涓�涓狟OM");
         }
         List<TechnologyRouting> list = technologyRoutingMapper.selectList(Wrappers.<TechnologyRouting>lambdaQuery()
                 .in(TechnologyRouting::getBomId, ids));
         if (!list.isEmpty()) {
-            throw new ServiceException("BOM is referenced by routing");
+            throw new ServiceException("BOM宸茶宸ヨ壓璺嚎寮曠敤锛屼笉鑳藉垹闄�");
         }
         technologyBomStructureService.remove(Wrappers.<TechnologyBomStructure>lambdaQuery()
                 .in(TechnologyBomStructure::getBomId, ids));
@@ -146,28 +151,18 @@
      */
     private void validateProductModel(Long productModelId) {
         if (productModelId == null) {
-            throw new ServiceException("Product model is required");
+            throw new ServiceException("浜у搧瑙勬牸ID涓嶈兘涓虹┖");
         }
         ProductModel productModel = productModelService.getById(productModelId);
         if (productModel == null) {
-            throw new ServiceException("Product model not found");
+            throw new ServiceException("浜у搧瑙勬牸涓嶅瓨鍦�");
         }
     }
 
     /**
-     * 鍒濆鍖朆OM鏍硅妭鐐圭粨鏋勩��
+     * 瀵煎叆鎵佸钩BOM锛氭瘡琛� = 鎴愬搧 + 涓�涓墿鏂欒鏍� + 娑堣�楀伐搴忋��
+     * 鍚屼竴娆″鍏ョ殑鎵�鏈夎蹇呴』灞炰簬鍚屼竴涓垚鍝侊紱鏃х殑鐖跺瓙/鍗曚綅鐢ㄩ噺妯℃澘浼氳鏄庣‘鎷掔粷銆�
      */
-    private void initRootStructure(Long bomId, Long productModelId) {
-        ProductModel productModel = productModelService.getById(productModelId);
-        TechnologyBomStructure root = new TechnologyBomStructure();
-        root.setBomId(bomId);
-        root.setParentId(null);
-        root.setProductModelId(productModelId);
-        root.setUnit(productModel.getUnit());
-        root.setUnitQuantity(BigDecimal.ONE);
-        technologyBomStructureService.save(root);
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R uploadBom(MultipartFile file) {
@@ -179,148 +174,169 @@
             return R.fail("Excel瑙f瀽澶辫触");
         }
 
-        if (list == null || list.isEmpty()) return R.fail("鏁版嵁涓虹┖");
+        if (list == null || list.isEmpty()) {
+            return R.fail("鏁版嵁涓虹┖");
+        }
 
-        //  澶勭悊宸ュ簭
         list.forEach(dto -> {
-            dto.setParentName(clean(dto.getParentName()));
-            dto.setParentSpec(clean(dto.getParentSpec()));
-            dto.setChildName(clean(dto.getChildName()));
-            dto.setChildSpec(clean(dto.getChildSpec()));
+            dto.setProductName(clean(dto.getProductName()));
+            dto.setProductSpec(clean(dto.getProductSpec()));
+            dto.setMaterialName(clean(dto.getMaterialName()));
+            dto.setMaterialSpec(clean(dto.getMaterialSpec()));
+            dto.setProcess(clean(dto.getProcess()));
         });
-        handleProcess(list);
-//        Map<String, Long> processMap = productProcessService.list().stream()
-//                .collect(Collectors.toMap(ProductProcess::getName, ProductProcess::getId, (k1, k2) -> k1));
 
-        //  鍒涘缓 BOM 鏁版嵁
+        boolean templateMatched = list.stream().anyMatch(dto -> StringUtils.isNotBlank(dto.getProductName())
+                && StringUtils.isNotBlank(dto.getMaterialName()));
+        if (!templateMatched) {
+            return R.fail("BOM瀵煎叆妯℃澘宸叉洿鏂颁负鎵佸钩缁撴瀯锛岃浣跨敤鏈�鏂版ā鏉匡紙鎴愬搧浜у搧鍚嶇О/瑙勬牸銆佺墿鏂欎骇鍝佸悕绉�/瑙勬牸銆佹秷鑰楀伐搴忥級");
+        }
+
         BomImportDto first = list.get(0);
-        ProductModel rootModel = findModel(first.getParentName(), first.getParentSpec());
+        ProductModel productModel = findModel(first.getProductName(), first.getProductSpec());
         TechnologyBom bom = new TechnologyBom();
-        bom.setProductModelId(rootModel.getId());
+        bom.setProductModelId(productModel.getId());
         bom.setVersion("1.0");
+        bom.setRemark(first.getRemark());
         technologyBomMapper.insert(bom);
         bom.setBomNo("BM." + String.format("%05d", bom.getId()));
         technologyBomMapper.updateById(bom);
 
-        // 璁板綍宸茬粡鎻掑叆缁撴瀯鐨勮妭鐐癸細Key = "鍚嶇О+瑙勬牸", Value = structure_id
-        Map<String, Long> treePathMap = new HashMap<>();
+        Map<String, Long> operationIdByName = new HashMap<>();
+        for (TechnologyOperation operation : technologyOperationMapper.selectList(null)) {
+            if (StringUtils.isNotBlank(operation.getName())) {
+                operationIdByName.putIfAbsent(operation.getName().trim(), operation.getId());
+            }
+        }
 
+        Set<String> relationKeys = new HashSet<>();
         for (int i = 0; i < list.size(); i++) {
             BomImportDto dto = list.get(i);
-            String parentKey = dto.getParentName() + "|" + dto.getParentSpec();
-            String childKey = dto.getChildName() + "|" + dto.getChildSpec();
-
-            //澶勭悊鏍硅妭鐐�,绗竴琛屼笖瀛愰」涓虹┖
-            if (i == 0 && StringUtils.isBlank(dto.getChildName())) {
-                ProductStructure rootNode = new ProductStructure();
-                rootNode.setBomId(bom.getId());
-                rootNode.setParentId(null); // 椤跺眰娌℃湁鐖惰妭鐐�
-                rootNode.setProductModelId(rootModel.getId());
-                rootNode.setUnitQuantity(BigDecimal.ONE);
-                rootNode.setUnit(rootModel.getUnit());
-//                productStructureService.save(rootNode);
-
-                treePathMap.put(parentKey, rootNode.getId());
-                continue;
+            int rowNo = i + 2;
+            if (StringUtils.isBlank(dto.getMaterialName())) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱" + rowNo + "琛岀己灏戠墿鏂欎骇鍝佸悕绉�");
+            }
+            if (StringUtils.isNotBlank(dto.getProductName())
+                    && !sameModel(dto, first)) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱" + rowNo + "琛岀殑鎴愬搧涓庣涓�琛屼笉涓�鑷达紝涓�娆″鍏ュ彧鑳界淮鎶や竴涓狟OM");
+            }
+            if (StringUtils.isBlank(dto.getProcess())) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱" + rowNo + "琛岀己灏戞秷鑰楀伐搴�");
+            }
+            Long operationId = operationIdByName.get(dto.getProcess());
+            if (operationId == null) {
+                throw new ServiceException("瀵煎叆澶辫触锛氬伐搴忔湭缁存姢[" + dto.getProcess() + "]锛堢" + rowNo + "琛岋級");
             }
 
-            //  澶勭悊瀛愬眰绾ц妭鐐�
-            //  鎵惧埌鐖惰妭鐐瑰湪鏁版嵁搴撻噷鐨� ID
-            Long parentStructureId = treePathMap.get(parentKey);
-            if (parentStructureId == null) {
-                // 濡傛灉 Map 閲屾壘涓嶅埌锛岃鏄� Excel 椤哄簭涔变簡鎴栬�呮暟鎹湁璇�
-                throw new ServiceException("瀵煎叆澶辫触: 鐖堕」[" + dto.getParentName() + "]蹇呴』鍦ㄥ叾瀛愰」涔嬪墠瀹氫箟");
+            ProductModel materialModel = findModel(dto.getMaterialName(), dto.getMaterialSpec());
+            if (materialModel.getId().equals(productModel.getId())) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱" + rowNo + "琛屾垚鍝佽鏍间笉鑳戒綔涓鸿嚜韬殑鐗╂枡");
+            }
+            if (!relationKeys.add(materialModel.getId() + "#" + operationId)) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱" + rowNo + "琛岀墿鏂欎笌宸ュ簭閲嶅閰嶇疆");
             }
 
-            //  鑾峰彇瀛愰」妯″瀷淇℃伅
-            ProductModel childModel = findModel(dto.getChildName(), dto.getChildSpec());
-
-            //  鎻掑叆缁撴瀯琛�
-            ProductStructure node = new ProductStructure();
-            node.setBomId(bom.getId());
-            node.setParentId(parentStructureId); // 鐖惰妭鐐笽D
-            node.setProductModelId(childModel.getId());
-            node.setUnitQuantity(dto.getUnitQty());
-            node.setUnit(childModel.getUnit());
-//            if (processMap.containsKey(dto.getProcess())) {
-//                node.setProcessId(processMap.get(dto.getProcess()));
-//            }
-//            productStructureService.save(node);
-
-            //  鎶婂綋鍓嶅瓙椤硅褰曞埌 Map,浣滀负浠ュ悗鏇存繁灞傜骇鐨勭埗椤规煡鎵句緷鎹�
-            //  鍚屼竴鐖堕」涓嬬殑鍚屽悕瀛愰」涓嶉渶瑕侀噸澶嶈褰�
-            treePathMap.put(childKey, node.getId());
+            TechnologyBomStructure node = new TechnologyBomStructure();
+            node.setBomId(bom.getId().longValue());
+            node.setProductModelId(materialModel.getId());
+            node.setOperationId(operationId);
+            technologyBomStructureService.save(node);
         }
 
         return R.ok("BOM瀵煎叆鎴愬姛");
     }
 
-
+    /**
+     * 瀵煎嚭鎵佸钩BOM锛氭垚鍝� + 鐗╂枡 + 娑堣�楀伐搴忋��
+     */
     @Override
-    public void exportBom(HttpServletResponse response, Integer bomId) {
+    public void exportBom(HttpServletResponse response, Long bomId) {
         if (bomId == null) {
+            throw new ServiceException("BOM ID涓嶈兘涓虹┖");
+        }
+        TechnologyBom bom = technologyBomMapper.selectById(bomId);
+        if (bom == null) {
+            throw new ServiceException("BOM涓嶅瓨鍦�");
+        }
+
+        List<TechnologyBomStructureVo> detailList = technologyBomStructureService.listByBomId(bomId);
+        if (detailList == null || detailList.isEmpty()) {
             return;
         }
 
-//        List<ProductStructureDto> treeData = productStructureService.listBybomId(bomId);
-//        if (treeData == null || treeData.isEmpty()) {
-//            return;
-//        }
-//
-//        //  灏嗘爲褰㈢粨鏋勬墎骞冲寲 浣跨敤 BFS绠楁硶 瀵煎嚭,鎸夊眰绾ч『搴�
-//        List<BomImportDto> exportList = new ArrayList<>();
-//
-//        // Map<ID, Node> idMap 鐢ㄤ簬鏌ユ壘鐖惰妭鐐�
-//        Map<Long, ProductStructureDto> idMap = new HashMap<>();
-//        populateMap(treeData, idMap);
-//
-//        //  treeData 鐨勭涓�涓槸鏍硅妭鐐�
-//        for (ProductStructureDto root : treeData) {
-//            //  娣诲姞鏍硅妭鐐�
-//            BomImportDto rootRow = new BomImportDto();
-//            rootRow.setParentName(root.getProductName());
-//            rootRow.setParentSpec(root.getModel());
-//            rootRow.setUnitQty(root.getUnitQuantity());
-//            rootRow.setRemark("");
-//            exportList.add(rootRow);
-//
-//            //  BFS 閬嶅巻-闃熷垪
-//            Queue<ProductStructureDto> queue = new LinkedList<>();
-//            if (root.getChildren() != null) {
-//                queue.addAll(root.getChildren());
-//            }
-//
-//            while (!queue.isEmpty()) {
-//                ProductStructureDto child = queue.poll();
-//
-//                // 鏌ユ壘鐖惰妭鐐�
-//                ProductStructureDto parent = idMap.get(child.getParentId());
-//                if (parent == null) {
-//                    // 闄や簡鏈�澶栧眰鑺傜偣,鍏朵粬鑺傜偣鐨勭埗绫昏偗瀹氭槸涓嶄細涓虹┖鐨�
-//                    continue;
-//                }
-//
-//                BomImportDto row = new BomImportDto();
-//                // 鐖剁被淇℃伅
-//                row.setParentName(parent.getProductName());
-//                row.setParentSpec(parent.getModel());
-//                // 瀛愮被淇℃伅
-//                row.setChildName(child.getProductName());
-//                row.setChildSpec(child.getModel());
-//                row.setUnitQty(child.getUnitQuantity());
-//                row.setProcess(child.getProcessName());
-//
-//                exportList.add(row);
-//
-//                //  灏嗗瓙鑺傜偣鐨勫瓙鑺傜偣鍔犲叆闃熷垪-涓嬩竴灞�
-//                if (child.getChildren() != null && !child.getChildren().isEmpty()) {
-//                    queue.addAll(child.getChildren());
-//                }
-//            }
-//        }
+        ProductModel productModel = productModelService.getById(bom.getProductModelId());
+        String productName = null;
+        if (productModel != null && productModel.getProductId() != null) {
+            Product product = productService.getById(productModel.getProductId());
+            productName = product == null ? null : product.getProductName();
+        }
+
+        List<BomImportDto> exportList = new ArrayList<>(detailList.size());
+        for (TechnologyBomStructureVo detail : detailList) {
+            BomImportDto row = new BomImportDto();
+            row.setProductName(productName);
+            row.setProductSpec(productModel == null ? null : productModel.getModel());
+            row.setProductCode(productModel == null ? null : productModel.getProductCode());
+            row.setMaterialName(detail.getProductName());
+            row.setMaterialSpec(detail.getModel());
+            row.setMaterialCode(detail.getProductCode());
+            row.setProcess(detail.getOperationName());
+            exportList.add(row);
+        }
 
         ExcelUtil<BomImportDto> util = new ExcelUtil<>(BomImportDto.class);
-//        util.exportExcel(response, exportList, "BOM缁撴瀯瀵煎嚭");
+        util.exportExcel(response, exportList, "BOM缁撴瀯瀵煎嚭");
+    }
+
+    /**
+     * 澶嶅埗BOM锛氬鍒舵垚鍝佽鏍间笌鍏ㄩ儴鎵佸钩鐗╂枡-宸ュ簭鍏崇郴銆�
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R copy(TechnologyBom technologyBom) {
+        if (technologyBom == null || technologyBom.getId() == null) {
+            throw new ServiceException("BOM ID涓嶈兘涓虹┖");
+        }
+        TechnologyBom oldTechnologyBom = technologyBomMapper.selectById(technologyBom.getId());
+        if (oldTechnologyBom == null) {
+            throw new ServiceException("BOM涓嶅瓨鍦�");
+        }
+        validateProductModel(oldTechnologyBom.getProductModelId());
+
+        TechnologyBom newTechnologyBom = new TechnologyBom();
+        newTechnologyBom.setProductModelId(oldTechnologyBom.getProductModelId());
+        newTechnologyBom.setVersion("FZ" + oldTechnologyBom.getVersion());
+        newTechnologyBom.setRemark(oldTechnologyBom.getRemark());
+        boolean saved = technologyBomMapper.insert(newTechnologyBom) > 0;
+        if (!saved) {
+            return R.fail("Copy BOM failed");
+        }
+        newTechnologyBom.setBomNo("BM." + String.format("%05d", newTechnologyBom.getId()));
+        technologyBomMapper.updateById(newTechnologyBom);
+
+        List<TechnologyBomStructureVo> oldDetailList =
+                technologyBomStructureService.listByBomId(technologyBom.getId().longValue());
+        if (oldDetailList != null && !oldDetailList.isEmpty()) {
+            List<TechnologyBomStructure> newDetailList = new ArrayList<>(oldDetailList.size());
+            for (TechnologyBomStructureVo oldDetail : oldDetailList) {
+                TechnologyBomStructure newDetail = new TechnologyBomStructure();
+                newDetail.setBomId(newTechnologyBom.getId().longValue());
+                newDetail.setProductModelId(oldDetail.getProductModelId());
+                newDetail.setOperationId(oldDetail.getOperationId());
+                newDetailList.add(newDetail);
+            }
+            technologyBomStructureService.saveBatch(newDetailList);
+        }
+        return R.ok();
+    }
+
+    private boolean sameModel(BomImportDto row, BomImportDto first) {
+        return StringUtils.equals(row.getProductName(), first.getProductName())
+                && StringUtils.equals(defaultBlank(row.getProductSpec()), defaultBlank(first.getProductSpec()));
+    }
+
+    private String defaultBlank(String value) {
+        return value == null ? "" : value;
     }
 
     private ProductModel findModel(String name, String spec) {
@@ -335,53 +351,8 @@
         return model;
     }
 
-    private void handleProcess(List<BomImportDto> list) {
-
-        Set<String> processNames = list.stream()
-                .map(BomImportDto::getProcess)
-                .filter(StringUtils::isNotBlank)
-                .collect(Collectors.toSet());
-
-        if (processNames.isEmpty()) {
-            return;
-        }
-
-//        List<ProductProcess> exists = productProcessService.list(
-//                new LambdaQueryWrapper<ProductProcess>().in(ProductProcess::getName, processNames)
-//        );
-
-//        Set<String> existNames = exists.stream()
-//                .map(ProductProcess::getName)
-//                .collect(Collectors.toSet());
-//
-//        List<ProductProcess> needSave = processNames.stream()
-//                .filter(n -> !existNames.contains(n))
-//                .map(n -> {
-//                    ProductProcess p = new ProductProcess();
-//                    p.setName(n);
-//                    return p;
-//                })
-//                .collect(Collectors.toList());
-//
-//        if (!needSave.isEmpty()) {
-//            productProcessService.saveBatch(needSave);
-//            needSave.forEach(p -> p.setNo("GX" + String.format("%08d", p.getId())));
-//            productProcessService.updateBatchById(needSave);
-//        }
-    }
-
     private String clean(String s) {
         if (s == null) return null;
         return s.replaceAll("[\\u00A0\\u3000]", "").trim();
-    }
-
-    private void populateMap(List<ProductStructureDto> nodes, Map<Long, ProductStructureDto> map) {
-        if (nodes == null || nodes.isEmpty()) {
-            return;
-        }
-        for (ProductStructureDto node : nodes) {
-            map.put(node.getId(), node);
-            populateMap(node.getChildren(), map);
-        }
     }
 }

--
Gitblit v1.9.3