From ecef4e046635a6eb78c92cd72dd96a84401164d9 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 07 四月 2025 16:40:59 +0800
Subject: [PATCH] 1.检验项查询拼接类型 2,设备检验项优化

---
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java |  294 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 271 insertions(+), 23 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 f83bd97..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("妫�楠屽璞′笉鑳介噸澶�");
         }
 
@@ -100,12 +108,14 @@
         List<Product> products = productMapper.selectList(Wrappers.<Product>lambdaQuery()
                 .eq(Product::getObjectId, id));
         List<Integer> productIds = products.stream().map(Product::getId).collect(Collectors.toList());
-        productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
-                .in(ProductPart::getProductId, productIds));
+        if (CollectionUtils.isNotEmpty(productIds)) {
+            productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
+                    .in(ProductPart::getProductId, productIds));
 
-        // 鍒犻櫎浜у搧缁存姢
-        productMapper.delete(Wrappers.<Product>lambdaQuery()
-                .in(Product::getId, productIds));
+            // 鍒犻櫎浜у搧缁存姢
+            productMapper.delete(Wrappers.<Product>lambdaQuery()
+                    .in(Product::getId, productIds));
+        }
 
         return structureTestObjectMapper.deleteById(id);
     }
@@ -119,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());
@@ -157,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("妫�楠屽璞′笉鑳介噸澶�");
         }
 
@@ -166,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));
     }
 
     //璁惧閲岄潰閫夋嫨妫�楠岄」鐩�(鏍戝舰缁撴瀯)
@@ -179,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