liding
2025-04-01 8bf9254ba43e744517d4de2516121da2979fd057
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);
        }
    }
}