From 8bf9254ba43e744517d4de2516121da2979fd057 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 01 四月 2025 11:29:51 +0800
Subject: [PATCH] 1.检验项目参数导入 2.对象导入

---
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java |  321 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 207 insertions(+), 114 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
index c58580b..d59f70f 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
@@ -2,10 +2,8 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -22,11 +20,10 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ湇鍔″疄鐜扮被
@@ -192,132 +189,228 @@
     public List<TestItemDto> getItemTree() {
         return structureItemParameterMapper.getItemTree();
     }
-
+    
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void importPartExcel(List<StructureTestObjectData> list) {
-        // 鎵归噺鏌ヨ StructureTestObject
-        Map<String, StructureTestObject> structureTestObjectMap = getStructureTestObjectMap(list);
-        // 鎵归噺鏌ヨ WorkShop
-        Map<String, WorkShop> workShopMap = getWorkShopMap(list);
+        // 闃舵1: 鏁版嵁棰勫鐞�
+        // 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鏍囨湰淇℃伅
+        Set<String> specimenKeys = list.stream()
+                .map(i -> i.getSpecimenName() + "|" + i.getSpecimenNameEn())
+                .collect(Collectors.toSet());
 
-        List<StructureTestObject> insertStructureTestObjects = new ArrayList<>();
-        List<StructureTestObject> updateStructureTestObjects = new ArrayList<>();
-        List<Product> insertProducts = new ArrayList<>();
-        List<Product> updateProducts = new ArrayList<>();
+        // 闃舵2: 鎵归噺鏌ヨ鐜版湁缁撴瀯娴嬭瘯瀵硅薄
+        Map<String, StructureTestObject> existStructureTestObjects = structureTestObjectMapper.selectList(
+                Wrappers.<StructureTestObject>lambdaQuery()
+                        .in(StructureTestObject::getSpecimenName, list.stream().map(StructureTestObjectData::getSpecimenName).collect(Collectors.toSet()))
+                        .in(StructureTestObject::getSpecimenNameEn, list.stream().map(StructureTestObjectData::getSpecimenNameEn).collect(Collectors.toSet()))
+        ).stream().collect(Collectors.toMap(
+                obj -> obj.getSpecimenName() + "|" + obj.getSpecimenNameEn(),
+                Function.identity(),
+                (existing, replacement) -> existing  // 澶勭悊閲嶅閿�
+        ));
 
-        for (StructureTestObjectData data : list) {
-            String key = data.getSpecimenName() + "_" + data.getSpecimenNameEn();
-            StructureTestObject structureTestObject = structureTestObjectMap.get(key);
-
-            if (ObjectUtils.isEmpty(structureTestObject)) {
-                structureTestObject = createStructureTestObject(data);
-                insertStructureTestObjects.add(structureTestObject);
-            } else {
-                updateStructureTestObject(structureTestObject, data);
-                updateStructureTestObjects.add(structureTestObject);
-            }
-
-            String productKey = data.getName() + "_" + data.getNameEn();
-            Product product = productMapper.selectOne(new LambdaQueryWrapper<Product>()
-                    .eq(Product::getName, data.getName())
-                    .eq(Product::getNameEn, data.getNameEn()));
-
-            if (ObjectUtils.isEmpty(product)) {
-                product = createProduct(data, structureTestObject.getId(), workShopMap);
-                insertProducts.add(product);
-            } else {
-                updateProduct(product, data, structureTestObject.getId(), workShopMap);
-                updateProducts.add(product);
-            }
-        }
-
-        // 鎵归噺鎻掑叆鍜屾洿鏂�
-        if (!insertStructureTestObjects.isEmpty()) {
-            structureTestObjectService.saveOrUpdateBatch(insertStructureTestObjects);
-        }
-        if (!updateStructureTestObjects.isEmpty()) {
-            structureTestObjectService.updateBatchById(updateStructureTestObjects);
-        }
-        if (!insertProducts.isEmpty()) {
-            productService.saveOrUpdateBatch(insertProducts);
-        }
-        if (!updateProducts.isEmpty()) {
-            productService.updateBatchById(updateProducts);
-        }
-    }
-
-    private Map<String, StructureTestObject> getStructureTestObjectMap(List<StructureTestObjectData> list) {
-        List<String> specimenNames = list.stream().map(StructureTestObjectData::getSpecimenName).collect(Collectors.toList());
-        List<String> specimenNamesEn = list.stream().map(StructureTestObjectData::getSpecimenNameEn).collect(Collectors.toList());
-        List<StructureTestObject> structureTestObjects = structureTestObjectMapper.selectList(new LambdaQueryWrapper<StructureTestObject>()
-                .in(StructureTestObject::getSpecimenName, specimenNames)
-                .in(StructureTestObject::getSpecimenNameEn, specimenNamesEn));
-        Map<String, StructureTestObject> map = new HashMap<>();
-        for (StructureTestObject obj : structureTestObjects) {
-            map.put(obj.getSpecimenName() + "_" + obj.getSpecimenNameEn(), obj);
-        }
-        return map;
-    }
-
-    private Map<String, WorkShop> getWorkShopMap(List<StructureTestObjectData> list) {
-        List<String> workShopNames = list.stream()
+        // 闃舵3: 棰勫鐞嗚溅闂翠俊鎭�
+        Set<String> workShopNames = list.stream()
                 .map(StructureTestObjectData::getWorkShopName)
                 .filter(StringUtils::isNotEmpty)
-                .distinct()
-                .collect(Collectors.toList());
-        List<WorkShop> workShops = workShopMapper.selectList(new LambdaQueryWrapper<WorkShop>()
-                .in(WorkShop::getName, workShopNames));
-        Map<String, WorkShop> map = new HashMap<>();
-        for (WorkShop workShop : workShops) {
-            map.put(workShop.getName(), workShop);
-        }
-        return map;
-    }
+                .collect(Collectors.toSet());
 
-    private StructureTestObject createStructureTestObject(StructureTestObjectData data) {
-        StructureTestObject structureTestObject = new StructureTestObject();
-        structureTestObject.setLaboratoryId(9);
-        structureTestObject.setSpecimenName(data.getSpecimenName());
-        structureTestObject.setSpecimenNameEn(data.getSpecimenNameEn());
-        structureTestObject.setCode(data.getCode());
-        structureTestObject.setWorkShopName("");
-        return structureTestObject;
-    }
+        Map<String, WorkShop> workShopCache = workShopNames.isEmpty() ?
+                Collections.emptyMap() :
+                workShopMapper.selectList(Wrappers.<WorkShop>lambdaQuery()
+                                .in(WorkShop::getName, workShopNames))
+                        .stream()
+                        .collect(Collectors.toMap(WorkShop::getName, Function.identity()));
 
-    private void updateStructureTestObject(StructureTestObject structureTestObject, StructureTestObjectData data) {
-        structureTestObject.setCode(data.getCode());
-        structureTestObject.setLaboratoryId(9);
-    }
+        // 闃舵4: 鍑嗗鎵归噺鎿嶄綔鏁版嵁
+        List<StructureTestObject> structureTestObjectsToInsert = new ArrayList<>();
+        List<StructureTestObject> structureTestObjectsToUpdate = new ArrayList<>();
+        List<Product> productsToInsert = new ArrayList<>();
+        List<Product> productsToUpdate = new ArrayList<>();
 
-    private Product createProduct(StructureTestObjectData data, Integer objectId, Map<String, WorkShop> workShopMap) {
-        Product product = new Product();
-        product.setName(data.getName());
-        product.setNameEn(data.getNameEn());
-        if (StringUtils.isNotEmpty(data.getWorkShopName())) {
-            WorkShop workShop = workShopMap.get(data.getWorkShopName());
-            if (workShop == null) {
-                throw new BaseException("璇峰厛缁存姢杞﹂棿淇℃伅");
+        // 闃舵5: 涓诲鐞嗛�昏緫锛堜粎澶勭悊缁撴瀯娴嬭瘯瀵硅薄锛�
+        List<StructureTestObjectData> pendingProducts = new ArrayList<>(); // 鏂板锛氭殏瀛樺緟澶勭悊鐨勪骇鍝佹暟鎹�
+
+        for (StructureTestObjectData i : list) {
+            // 澶勭悊缁撴瀯娴嬭瘯瀵硅薄锛堥�昏緫涓嶅彉锛�
+            String specimenKey = i.getSpecimenName() + "|" + i.getSpecimenNameEn();
+            StructureTestObject structureTestObject = existStructureTestObjects.get(specimenKey);
+
+            if (structureTestObject == null) {
+                StructureTestObject newObj = createNewStructureTestObject(i, workShopCache); // 淇敼锛氫紶鍏ヨ溅闂寸紦瀛�
+                structureTestObjectsToInsert.add(newObj);
+                existStructureTestObjects.put(specimenKey, newObj);
+            } else {
+                updateExistingStructureTestObject(structureTestObject, i);
+                structureTestObjectsToUpdate.add(structureTestObject);
             }
-            product.setWorkShopId(workShop.getId());
+
+            // 鏆傚瓨浜у搧澶勭悊鏁版嵁锛堟柊澧烇級
+            pendingProducts.add(i);
         }
-        product.setWorkShopName(data.getWorkShopName());
-        product.setObjectId(objectId);
-        return product;
+
+        // 闃舵6: 鍏堝鐞嗙粨鏋勬祴璇曞璞℃壒閲忔搷浣�
+        executeStructureTestObjectBatch(structureTestObjectsToInsert, structureTestObjectsToUpdate);
+
+        // 闃舵7: 鏇存柊缂撳瓨涓殑ID锛堝叧閿柊澧炴楠わ級
+        refreshStructureTestObjectIds(existStructureTestObjects, structureTestObjectsToInsert);
+
+        // 闃舵8: 澶勭悊浜у搧鏁版嵁
+        processProducts(pendingProducts, existStructureTestObjects, workShopCache,
+                productsToInsert, productsToUpdate);
+
+        // 闃舵9: 鎵ц浜у搧鎵归噺鎿嶄綔
+        executeProductBatch(productsToInsert, productsToUpdate);
     }
 
-    private void updateProduct(Product product, StructureTestObjectData data, Integer objectId, Map<String, WorkShop> workShopMap) {
-        if (StringUtils.isNotEmpty(data.getWorkShopName())) {
-            WorkShop workShop = workShopMap.get(data.getWorkShopName());
-            if (workShop == null) {
-                throw new BaseException("璇峰厛缁存姢杞﹂棿淇℃伅");
-            }
-            product.setWorkShopId(workShop.getId());
+    // 鏇存柊鐜版湁缁撴瀯娴嬭瘯瀵硅薄
+    private void updateExistingStructureTestObject(StructureTestObject obj, StructureTestObjectData data) {
+        obj.setCode(data.getCode());
+        obj.setLaboratoryId(9);
+    }
+
+    // 澶勭悊浜у搧鏁版嵁
+    private void processProductData(StructureTestObjectData data,
+                                    Integer objectId,
+                                    Map<String, WorkShop> workShopCache,
+                                    List<Product> insertList,
+                                    List<Product> updateList) {
+        // 鏋勫缓浜у搧鍞竴鏍囪瘑
+        String productKey = data.getName() + "|" + data.getNameEn();
+
+        // 妫�鏌ュ唴瀛樹腑鏄惁宸插鐞嗚繃璇ヤ骇鍝�
+        Optional<Product> existingProduct = findProductInBatchLists(productKey, insertList, updateList);
+
+        // 濡傛灉鍐呭瓨涓笉瀛樺湪锛屾煡璇㈡暟鎹簱
+        if (!existingProduct.isPresent()) {
+            Product dbProduct = productMapper.selectOne(Wrappers.<Product>lambdaQuery()
+                    .eq(Product::getName, data.getName())
+                    .eq(Product::getNameEn, data.getNameEn())
+                    .last("limit 1"));
+            existingProduct = Optional.ofNullable(dbProduct);
         }
-        product.setWorkShopName(data.getWorkShopName());
+
+        // 鍒涘缓鎴栨洿鏂颁骇鍝�
+        Product product = existingProduct.orElseGet(Product::new);
+        boolean isNew = product.getId() == null;
+
+        // 璁剧疆浜у搧灞炴��
+        setupProduct(product, data, objectId, workShopCache);
+
+        // 鍔犲叆瀵瑰簲鍒楄〃
+        if (isNew) {
+            insertList.add(product);
+        } else {
+            updateList.add(product);
+        }
+    }
+
+    // 鍦ㄤ骇鍝佹壒閲忓垪琛ㄤ腑鏌ユ壘
+    private Optional<Product> findProductInBatchLists(String productKey,
+                                                      List<Product> insertList,
+                                                      List<Product> updateList) {
+        return Stream.concat(insertList.stream(), updateList.stream())
+                .filter(p -> (p.getName() + "|" + p.getNameEn()).equals(productKey))
+                .findFirst();
+    }
+
+    // 璁剧疆浜у搧淇℃伅
+    private void setupProduct(Product product,
+                              StructureTestObjectData data,
+                              Integer objectId,
+                              Map<String, WorkShop> workShopCache) {
         product.setName(data.getName());
         product.setNameEn(data.getNameEn());
         product.setObjectId(objectId);
+        // 澶勭悊杞﹂棿淇℃伅
+        if (StringUtils.isNotEmpty(data.getWorkShopName())) {
+            WorkShop workShop = workShopCache.get(data.getWorkShopName());
+            if (workShop == null) {
+                throw new BaseException("杞﹂棿淇℃伅鏈淮鎶�: " + data.getWorkShopName());
+            }
+            product.setWorkShopId(workShop.getId());
+            product.setWorkShopName(data.getWorkShopName());
+        }
     }
+
+    // 鍒涘缓缁撴瀯娴嬭瘯瀵硅薄锛堜娇鐢ㄧ紦瀛樿溅闂翠俊鎭級
+    private StructureTestObject createNewStructureTestObject(StructureTestObjectData data,
+                                                             Map<String, WorkShop> workShopCache) {
+        StructureTestObject obj = new StructureTestObject();
+        obj.setLaboratoryId(9);
+        obj.setSpecimenName(data.getSpecimenName());
+        obj.setSpecimenNameEn(data.getSpecimenNameEn());
+        obj.setCode(data.getCode());
+        obj.setObjectType(data.getObjectType());
+
+        // 浣跨敤缂撳瓨鑾峰彇杞﹂棿淇℃伅
+        if (StringUtils.isNotEmpty(data.getWorkShopName())) {
+            WorkShop workShop = workShopCache.get(data.getWorkShopName());
+            if (workShop == null) {
+                throw new BaseException("杞﹂棿淇℃伅鏈淮鎶�: " + data.getWorkShopName());
+            }
+            obj.setWorkShopId(workShop.getId());
+            obj.setWorkShopName(data.getWorkShopName());
+        } else {
+            obj.setWorkShopName("");
+        }
+        return obj;
+    }
+
+    // 鍒锋柊缁撴瀯娴嬭瘯瀵硅薄ID锛堝叧閿柟娉曪級
+    private void refreshStructureTestObjectIds(
+            Map<String, StructureTestObject> existStructureTestObjects,
+            List<StructureTestObject> insertedObjects) {
+
+        insertedObjects.forEach(obj -> {
+            String key = obj.getSpecimenName() + "|" + obj.getSpecimenNameEn();
+            existStructureTestObjects.get(key).setId(obj.getId()); // 鏇存柊缂撳瓨涓殑ID
+        });
+    }
+
+    // 澶勭悊浜у搧鏁版嵁锛堢嫭绔嬫柟娉曪級
+    private void processProducts(List<StructureTestObjectData> pendingProducts,
+                                 Map<String, StructureTestObject> structureTestObjectCache,
+                                 Map<String, WorkShop> workShopCache,
+                                 List<Product> insertList,
+                                 List<Product> updateList) {
+
+        // 闃舵5鍘熸湁浜у搧澶勭悊閫昏緫杩佺Щ鑷虫
+        pendingProducts.forEach(i -> {
+            String specimenKey = i.getSpecimenName() + "|" + i.getSpecimenNameEn();
+            StructureTestObject sto = structureTestObjectCache.get(specimenKey);
+
+            processProductData(
+                    i,
+                    sto.getId(), // 姝ゆ椂ID宸叉纭缃�
+                    workShopCache,
+                    insertList,
+                    updateList
+            );
+        });
+    }
+
+    // 鍒嗘媶鎵归噺鎿嶄綔鏂规硶
+    private void executeStructureTestObjectBatch(List<StructureTestObject> toInsert,
+                                                 List<StructureTestObject> toUpdate) {
+        if (!toInsert.isEmpty()) {
+            structureTestObjectMapper.insertBatchSomeColumn(toInsert);
+        }
+        if (!toUpdate.isEmpty()) {
+            structureTestObjectService.updateBatchById(toUpdate);
+        }
+    }
+
+    private void executeProductBatch(List<Product> toInsert,
+                                     List<Product> toUpdate) {
+        if (!toInsert.isEmpty()) {
+            productMapper.insertBatchSomeColumn(toInsert);
+        }
+        if (!toUpdate.isEmpty()) {
+            productService.updateBatchById(toUpdate);
+        }
+    }
+
 }
 

--
Gitblit v1.9.3