From b999398ae9b2719d2db15716dd353f7a3855d59e Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期一, 07 四月 2025 17:33:55 +0800 Subject: [PATCH] Merge branch 'radio_frequency' of http://114.132.189.42:9002/r/lims-ruoyi-after into radio_frequency --- basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java | 346 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 227 insertions(+), 119 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..3490bf4 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,19 +2,16 @@ 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; +import com.ruoyi.basic.dto.*; import com.ruoyi.basic.excel.StructureTestObjectData; import com.ruoyi.basic.service.*; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.QueryWrappers; -import com.ruoyi.basic.dto.PageTestObjectDto; -import com.ruoyi.basic.dto.TestItemDto; import com.ruoyi.basic.mapper.*; import com.ruoyi.basic.pojo.*; import com.ruoyi.common.utils.StringUtils; @@ -22,11 +19,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)琛ㄦ湇鍔″疄鐜扮被 @@ -59,7 +55,9 @@ private StructureItemParameterService structureItemParameterService; private WorkShopMapper workShopMapper; - + + private ModelMapper modelMapper; + @Override public IPage<StructureItemParameter> selectItemParameterList(Page page, StructureItemParameter itemParameter) { return structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter)); @@ -70,8 +68,7 @@ if (itemParameter.getBsm().equals("") || itemParameter.getBsm() == null) { itemParameter.setBsm("0"); } - int insert = structureItemParameterMapper.insert(itemParameter); - return insert; + return structureItemParameterMapper.insert(itemParameter); } @Override @@ -193,131 +190,242 @@ return structureItemParameterMapper.getItemTree(); } + @Override + public List<TestItemDto> getItemTreeProduct(StructureTestObjectDto structureTestObjectDto) { + return structureItemParameterMapper.getItemTreeProduct(structureTestObjectDto.getObjectType()); + } + + @Override + public List<Model> getProductTypes(ModelDto modelDto) { + return modelMapper.selectList(Wrappers.<Model>lambdaQuery().eq(Model::getProductId, modelDto.getProductId())); + } + + @Override + public List<ProductPart> getPartNoList(ProductPartDto productPartDto) { + return productPartMapper.selectList(Wrappers.<ProductPart>lambdaQuery().eq(ProductPart::getProductId, productPartDto.getProductId())); + } + @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); + // 闃舵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())) + .in(StructureTestObject::getObjectType, list.stream().map(StructureTestObjectData::getObjectType).collect(Collectors.toSet())) + ).stream().collect(Collectors.toMap( + obj -> generateStructureKey(obj.getSpecimenName(), obj.getSpecimenNameEn(), obj.getObjectType()), // 缁熶竴閿敓鎴� + Function.identity(), + (existing, replacement) -> existing + )); - List<StructureTestObject> insertStructureTestObjects = new ArrayList<>(); - List<StructureTestObject> updateStructureTestObjects = new ArrayList<>(); - List<Product> insertProducts = new ArrayList<>(); - List<Product> updateProducts = new ArrayList<>(); - - 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() + "|" + i.getObjectType(); + 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 String generateStructureKey(String name, String nameEn, String objectType) { + return name + "|" + nameEn + "|" + objectType; + } + + // 澶勭悊浜у搧鏁版嵁 + private void processProductData(StructureTestObjectData data, + Integer objectId, + Map<String, WorkShop> workShopCache, + List<Product> insertList, + List<Product> updateList) { + // 鏋勫缓浜у搧鍞竴鏍囪瘑 + String productKey = data.getName() + "|" + data.getNameEn() + "|" + data.getObjectType(); + + // 妫�鏌ュ唴瀛樹腑鏄惁宸插鐞嗚繃璇ヤ骇鍝� + 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() + "|" + obj.getObjectType(); + 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() + "|" + i.getObjectType(); + 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