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 | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 264 insertions(+), 18 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 4b436aa..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 @@ -7,21 +7,22 @@ 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.basic.service.CapacityScopeService; -import com.ruoyi.basic.service.StandardProductListService; -import com.ruoyi.basic.service.StructureItemParameterService; +import com.ruoyi.common.utils.StringUtils; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -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)琛ㄦ湇鍔″疄鐜扮被 @@ -39,6 +40,10 @@ private ProductMapper productMapper; + private ProductService productService; + + private StructureTestObjectService structureTestObjectService; + private StructureTestObjectPartMapper structureTestObjectPartMapper; private ProductPartMapper productPartMapper; @@ -49,18 +54,21 @@ 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)); + return structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter)); } @Override public int addItemParameter(StructureItemParameter itemParameter) { - if (itemParameter.getBsm().equals("")||itemParameter.getBsm()==null){ + if (itemParameter.getBsm().equals("") || itemParameter.getBsm() == null) { itemParameter.setBsm("0"); } - int insert = structureItemParameterMapper.insert(itemParameter); - return insert; + return structureItemParameterMapper.insert(itemParameter); } @Override @@ -75,15 +83,15 @@ @Override public IPage<PageTestObjectDto> selectTestObjectList(Page page, PageTestObjectDto pageTestObjectDto) { - String partNo = pageTestObjectDto.getPartNo(); - pageTestObjectDto.setPartNo(null); - return structureTestObjectMapper.selectTestObjectList(page, QueryWrappers.queryWrappers(pageTestObjectDto),partNo); + String specimenName = pageTestObjectDto.getSample(); + pageTestObjectDto.setSample(null); + return structureTestObjectMapper.selectTestObjectList(page, QueryWrappers.queryWrappers(pageTestObjectDto), specimenName); } @Override public int addTestObject(StructureTestObject testObject) { Long count = structureTestObjectMapper.selectCount(Wrappers.<StructureTestObject>lambdaQuery().eq(StructureTestObject::getSpecimenName, testObject.getSpecimenName())); - if(count.compareTo(0L) > 0){ + if (count.compareTo(0L) > 0) { throw new BaseException("妫�楠屽璞′笉鑳介噸澶�"); } @@ -121,7 +129,7 @@ // 鏌ヨ鎵�鏈夊璞′竴鏍风殑妫�楠岄」鐩� List<StandardProductList> standardProductLists = standardProductListService.list(Wrappers.<StandardProductList>lambdaUpdate() .eq(StandardProductList::getSampleType, oldTestObject.getSpecimenName())); - if (CollectionUtils.isNotEmpty(standardProductLists)){ + if (CollectionUtils.isNotEmpty(standardProductLists)) { for (StandardProductList standardProductList : standardProductLists) { // 淇敼鎵�鏈夌殑瀵硅薄鍚嶇О鍜屾暟鍨嬬粨鏋� standardProductList.setSampleType(testObject.getSpecimenName()); @@ -159,7 +167,7 @@ Long count = structureTestObjectMapper.selectCount(Wrappers.<StructureTestObject>lambdaQuery() .eq(StructureTestObject::getSpecimenName, testObject.getSpecimenName()) .ne(StructureTestObject::getId, testObject.getId())); - if(count.compareTo(0L) > 0){ + if (count.compareTo(0L) > 0) { throw new BaseException("妫�楠屽璞′笉鑳介噸澶�"); } @@ -168,7 +176,7 @@ @Override public List<StructureTestObject> selectTestObjectByName() { - return structureTestObjectMapper.selectList(Wrappers.<StructureTestObject>lambdaQuery().select(StructureTestObject::getSpecimenName,StructureTestObject::getId)); + return structureTestObjectMapper.selectList(Wrappers.<StructureTestObject>lambdaQuery().select(StructureTestObject::getSpecimenName, StructureTestObject::getId)); } //璁惧閲岄潰閫夋嫨妫�楠岄」鐩�(鏍戝舰缁撴瀯) @@ -181,5 +189,243 @@ public List<TestItemDto> getItemTree() { 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) { + // 闃舵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 + )); + + // 闃舵3: 棰勫鐞嗚溅闂翠俊鎭� + Set<String> workShopNames = list.stream() + .map(StructureTestObjectData::getWorkShopName) + .filter(StringUtils::isNotEmpty) + .collect(Collectors.toSet()); + + 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())); + + // 闃舵4: 鍑嗗鎵归噺鎿嶄綔鏁版嵁 + List<StructureTestObject> structureTestObjectsToInsert = new ArrayList<>(); + List<StructureTestObject> structureTestObjectsToUpdate = new ArrayList<>(); + List<Product> productsToInsert = new ArrayList<>(); + List<Product> productsToUpdate = new ArrayList<>(); + + // 闃舵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); + } + + // 鏆傚瓨浜у搧澶勭悊鏁版嵁锛堟柊澧烇級 + pendingProducts.add(i); + } + + // 闃舵6: 鍏堝鐞嗙粨鏋勬祴璇曞璞℃壒閲忔搷浣� + executeStructureTestObjectBatch(structureTestObjectsToInsert, structureTestObjectsToUpdate); + + // 闃舵7: 鏇存柊缂撳瓨涓殑ID锛堝叧閿柊澧炴楠わ級 + refreshStructureTestObjectIds(existStructureTestObjects, structureTestObjectsToInsert); + + // 闃舵8: 澶勭悊浜у搧鏁版嵁 + processProducts(pendingProducts, existStructureTestObjects, workShopCache, + productsToInsert, productsToUpdate); + + // 闃舵9: 鎵ц浜у搧鎵归噺鎿嶄綔 + executeProductBatch(productsToInsert, productsToUpdate); + } + + // 鏇存柊鐜版湁缁撴瀯娴嬭瘯瀵硅薄 + 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 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