chenrui
2025-04-10 2f467298075f6eb3bc40ecfa6da88c009f7fd0f8
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -1,9 +1,10 @@
package com.ruoyi.device.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
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;
@@ -34,16 +35,14 @@
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -54,7 +53,7 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.regex.Pattern;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -509,49 +508,130 @@
        }
    }
    //导入设备
    @Override
    public void importExcel(List<Device> list){
        if (CollectionUtil.isEmpty(list)) {
    @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    public void importExcel(List<Device> batch) {
        if (CollUtil.isEmpty(batch)) {
            return;
        }
        List<Device> deviceList = new ArrayList<>();
        List<Device> devices = new ArrayList<>();
        for (Device device : list) {
            Device device1 = deviceMapper.selectOne(Wrappers.<Device>lambdaQuery()
                    .eq(Device::getDeviceName, device.getDeviceName())
                    .eq(Device::getSpecificationModel, device.getSpecificationModel())
                    .eq(Device::getManagementNumber, device.getManagementNumber()));
            //管理人
            if (ObjectUtils.isNotEmpty(device.getEquipmentManagerName())){
                //查对应管理人
                User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                        .eq(User::getName, device.getEquipmentManagerName()));
                device.setEquipmentManager(user.getId());
        // 提前获取设备名称、型号和管理编号集合
        Set<String> deviceNames = batch.stream().map(Device::getDeviceName).collect(Collectors.toSet());
        Set<String> specificationModels = batch.stream().map(Device::getSpecificationModel).collect(Collectors.toSet());
        Set<String> managementNumbers = batch.stream().map(Device::getManagementNumber).collect(Collectors.toSet());
        // 批量查询关联数据(用户、实验室)
        Map<String, Integer> userMap = queryUserMap(batch);
        Map<String, Integer> labMap = queryLabMap(batch);
        // 内存处理:转换关联字段并去重,同时拆分插入和更新列表
        List<Device> toInsert = new ArrayList<>();
        List<Device> toUpdate = new ArrayList<>();
        processBatch(batch, userMap, labMap, deviceNames, specificationModels, managementNumbers, toInsert, toUpdate);
        // 批量操作数据库
        batchOperate(toInsert, toUpdate);
    }
    /**
     * 判断该设备是否可以数采
     * @param managementNumber
     * @param request
     * @return
     */
    @Override
    public Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request) {
        String ip = DataAcquisition.getIp(request);
        List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                .eq(Device::getIp, ip));
        if (ObjectUtils.isEmpty(device)) {
            return Result.success(false);
        }
        if (ObjectUtils.isEmpty(device.get(0).getFileType()) || ObjectUtils.isEmpty(device.get(0).getCollectUrl())) {
            return Result.success(false);
        } else {
            return Result.success(true);
        }
    }
    private Map<String, Integer> queryUserMap(List<Device> batch) {
        Set<String> managerNames = batch.stream()
                .map(Device::getEquipmentManagerName)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        if (CollUtil.isEmpty(managerNames)) {
            return Collections.emptyMap();
        }
        return userMapper.selectList(
                new LambdaQueryWrapper<User>().in(User::getName, managerNames)
        ).stream().collect(Collectors.toMap(User::getName, User::getId));
    }
    private Map<String, Integer> queryLabMap(List<Device> batch) {
        Set<String> labNames = batch.stream()
                .map(Device::getSubordinateDepartments)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        if (CollUtil.isEmpty(labNames)) {
            return Collections.emptyMap();
        }
        return laboratoryMapper.selectList(
                new LambdaQueryWrapper<Laboratory>().in(Laboratory::getLaboratoryName, labNames)
        ).stream().collect(Collectors.toMap(Laboratory::getLaboratoryName, Laboratory::getId));
    }
    private void processBatch(List<Device> batch, Map<String, Integer> userMap, Map<String, Integer> labMap,
                              Set<String> deviceNames, Set<String> specificationModels, Set<String> managementNumbers,
                              List<Device> toInsert, List<Device> toUpdate) {
        // 预计算唯一键(设备名称+型号+管理编号)
        Map<String, Device> existDevices = deviceMapper.selectList(
                new LambdaQueryWrapper<Device>()
                        .in(Device::getDeviceName, deviceNames)
                        .in(Device::getSpecificationModel, specificationModels)
                        .in(Device::getManagementNumber, managementNumbers)
        ).stream().collect(Collectors.toMap(
                d -> d.getDeviceName() + "|" + d.getSpecificationModel() + "|" + d.getManagementNumber(),
                Function.identity()
        ));
        for (Device device : batch) {
            // 转换关联字段
            device.setEquipmentManager(userMap.get(device.getEquipmentManagerName()));
            device.setSubordinateDepartmentsId(labMap.get(device.getSubordinateDepartments()));
            // 设备状态
            if (ObjectUtils.isNotEmpty(device.getDeviceStatusName())) {
                try {
                    // 查字典对应的值
                    String status = sysDictDataMapper.selectDictValue("device_status", device.getDeviceStatusName());
                    device.setDeviceStatus(Integer.parseInt(status));
                } catch (Exception e) {
                    // 处理异常,例如记录日志
                    e.printStackTrace();
                }
            }
            //所属部门
            if (ObjectUtils.isNotEmpty(device.getSubordinateDepartments())){
                //查对应所属部门
                Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
                        .eq(Laboratory::getLaboratoryName,device.getSubordinateDepartments()));
                device.setSubordinateDepartmentsId(laboratory.getId());
            }
            //设备状态
            if (ObjectUtils.isNotEmpty(device.getDeviceStatusName())){
                //查字典对应的值
                String status = sysDictDataMapper.selectDictValue("device_status", device.getDeviceStatusName());
                device.setDeviceStatus(Integer.parseInt(status));
            }
            if (ObjectUtils.isNotEmpty(device1)) {
                devices.add(device1);
            // 生成唯一键
            String key = device.getDeviceName() + "|" + device.getSpecificationModel() + "|" + device.getManagementNumber();
            if (existDevices.containsKey(key)) {
                Device exist = existDevices.get(key);
                BeanUtils.copyProperties(device, exist, "id");
                toUpdate.add(exist);
            } else {
                deviceList.add(device);
                toInsert.add(device);
            }
        }
        //批量新增
        saveBatch(deviceList);
        //批量修改
        updateBatchById(devices);
    }
    private void batchOperate(List<Device> toInsert, List<Device> toUpdate) {
        // 批量插入
        if (CollUtil.isNotEmpty(toInsert)) {
            deviceMapper.insertBatchSomeColumn(toInsert);
        }
        // 批量更新
        if (CollUtil.isNotEmpty(toUpdate)) {
            updateBatchById(toUpdate);
        }
    }
}