From 320f03d434299518324e6b9de60a6156b4ca280d Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期日, 13 九月 2026 14:46:29 +0800
Subject: [PATCH] fix: 添加型号缓存以避免重复导入相同产品型号

---
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java |   43 +++++++++++++++++++++++++++++++++----------
 1 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index bd46fb4..cb0c373 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -51,7 +51,7 @@
     private final TechnologyBomMapper technologyBomMapper;
     private ProductModelMapper productModelMapper;
 
-    private static final List<String> IMPORT_SHEET_NAMES = Arrays.asList("鍘熸枡", "鍗婃垚鍝�", "鎴愬搧");
+    private static final List<String> IMPORT_SHEET_NAMES = Arrays.asList("鍘熸潗鏂�", "鍘熸枡", "鍗婃垚鍝�", "鎴愬搧");
 
     @Override
     public int addOrEditProductModel(ProductModelDto productModelDto) {
@@ -156,29 +156,38 @@
             Long topId = findOrCreateTopProduct(sheetName);
             Map<String, Long> nodeCache = new HashMap<>();
             Map<Long, Set<String>> codeCache = new HashMap<>();
+            Map<Long, Set<String>> modelCache = new HashMap<>();
             for (int i = 0; i < rows.size(); i++) {
                 ProductImportRowDto row = rows.get(i);
                 int rowNum = i + 2;
                 String parentName = trimToNull(row.getProductParentName());
                 String categoryName = trimToNull(row.getProductCategoryName());
                 String productName = trimToNull(row.getProductName());
-                if (categoryName == null) {
-                    throw new ServiceException("绗� " + rowNum + " 琛� [浜у搧澶х被] 涓嶈兘涓虹┖");
-                }
                 if (productName == null) {
                     throw new ServiceException("绗� " + rowNum + " 琛� [浜у搧鍚嶇О] 涓嶈兘涓虹┖");
                 }
 
                 String path = String.valueOf(topId);
-                Long parentNodeId = topId;
+                Long currentParentId = topId;
                 if (parentName != null) {
                     path = path + ">" + parentName;
-                    parentNodeId = ensureChildNode(nodeCache, path, parentNodeId, parentName);
+                    currentParentId = ensureChildNode(nodeCache, path, currentParentId, parentName);
                 }
-                path = path + ">" + categoryName;
-                Long categoryId = ensureChildNode(nodeCache, path, parentNodeId, categoryName);
+                if (categoryName != null) {
+                    path = path + ">" + categoryName;
+                    currentParentId = ensureChildNode(nodeCache, path, currentParentId, categoryName);
+                }
                 path = path + ">" + productName;
-                Long leafId = ensureChildNode(nodeCache, path, categoryId, productName);
+                Long leafId = ensureChildNode(nodeCache, path, currentParentId, productName);
+
+                String model = StringUtils.isEmpty(row.getModel()) ? "/" : row.getModel().trim();
+
+                // 鍚屼竴浜у搧涓嬪悕绉帮紙浜у搧鑺傜偣锛�+ 鍨嬪彿鐩稿悓鍒欒烦杩�
+                Set<String> models = modelCache.computeIfAbsent(leafId, this::loadProductModels);
+                if (!models.add(model)) {
+                    skipCount++;
+                    continue;
+                }
 
                 String code = trimToNull(row.getProductCode());
                 if (code == null) {
@@ -193,7 +202,7 @@
                 ProductModel productModel = new ProductModel();
                 productModel.setProductId(leafId);
                 productModel.setProductCode(code);
-                productModel.setModel(StringUtils.isEmpty(row.getModel()) ? "/" : row.getModel().trim());
+                productModel.setModel(model);
                 productModel.setUnit(trimToNull(row.getUnit()));
                 productModelMapper.insert(productModel);
                 successCount++;
@@ -253,6 +262,20 @@
         return codes;
     }
 
+    private Set<String> loadProductModels(Long productId) {
+        List<ProductModel> list = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>()
+                .eq(ProductModel::getProductId, productId));
+        Set<String> models = new HashSet<>();
+        for (ProductModel productModel : list) {
+            if (StringUtils.isEmpty(productModel.getModel())) {
+                models.add("/");
+            } else {
+                models.add(productModel.getModel().trim());
+            }
+        }
+        return models;
+    }
+
     private String generateUniqueCode(Set<String> generatedCodes) {
         for (int i = 0; i < 200; i++) {
             String code = randomCode(5);

--
Gitblit v1.9.3