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