From bc1b3ee367f7e9aef88fc59647a9631f39eca6b5 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 23 四月 2025 09:19:55 +0800
Subject: [PATCH] 1.数采 2.国产网分仪

---
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java |  178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 164 insertions(+), 14 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
index 2192576..8ca0333 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -1,8 +1,10 @@
 package com.ruoyi.device.service.impl;
 
+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;
@@ -12,7 +14,9 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
+import com.ruoyi.basic.mapper.LaboratoryMapper;
 import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.Laboratory;
 import com.ruoyi.basic.pojo.StructureItemParameter;
 import com.ruoyi.common.core.domain.Result;
 import com.ruoyi.common.core.domain.entity.User;
@@ -25,18 +29,19 @@
 import com.ruoyi.device.pojo.*;
 import com.ruoyi.device.service.DataConfigService;
 import com.ruoyi.device.service.DeviceService;
-import com.ruoyi.device.service.DocumentService;
+import com.ruoyi.device.service.DeviceDocumentsService;
 import com.ruoyi.device.utils.DataAcquisition;
 import com.ruoyi.framework.exception.ErrorException;
 import com.ruoyi.inspect.mapper.InsSampleMapper;
 import com.ruoyi.inspect.pojo.InsProduct;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
@@ -48,6 +53,7 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -61,15 +67,17 @@
 
     private UserMapper userMapper;
 
+    private LaboratoryMapper laboratoryMapper;
+
+    private SysDictDataMapper sysDictDataMapper;
+
     private StructureItemParameterMapper structureItemParameterMapper;
 
     private DataConfigService dataConfigService;
 
-    private QrShowServiceImpl qrShowService;
-
     private InsSampleMapper insSampleMapper;
 
-    private DocumentService documentService;
+    private DeviceDocumentsService documentService;
 
     private DeviceMetricRecordMapper deviceMetricRecordMapper;
 
@@ -120,11 +128,6 @@
     }
 
     @Override
-    public List<Device> selectDevicePrincipal() {
-        return deviceMapper.selectDevicePrincipal();
-    }
-
-    @Override
     public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
         List<Integer> id;
 
@@ -171,7 +174,7 @@
         }
         deviceDto.setAuthorizedPersonName(name);
         //鏌ヨ璁惧鏍″噯淇℃伅
-        DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate");
+        DeviceMetricRecord calibrate = getDeviceMetricRecord(id, "calibrate");
         deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
 
         // 鍒颁簡鍋滅敤鏃ユ湡锛岃嚜鍔ㄥ皢鐘舵�佹敼涓哄仠鐢�
@@ -185,6 +188,21 @@
             }
         }
         return deviceDto;
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @param deviceId
+     * @param type
+     * @return
+     */
+    public DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type){
+        return Optional.ofNullable(
+                deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery()
+                        .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                        .eq(DeviceMetricRecord::getType, type)
+                        .orderByDesc(DeviceMetricRecord::getCreateTime)
+                        .last("limit 1"))).orElse(new DeviceMetricRecord());
     }
 
     @Override
@@ -309,7 +327,7 @@
         // 璁惧淇℃伅
         Device device = baseMapper.selectById(deviceId);
         // 璁惧妗f
-        List<Document> documentList = documentService.list(Wrappers.<Document>lambdaQuery().eq(Document::getDeviceId, deviceId));
+        List<DeviceDocuments> documentList = documentService.list(Wrappers.<DeviceDocuments>lambdaQuery().eq(DeviceDocuments::getDeviceId, deviceId));
         // 璁惧鏍″噯琛�
         List<DeviceMetricRecord> deviceMetricRecordList = deviceMetricRecordMapper.selectList(Wrappers.<DeviceMetricRecord>lambdaQuery().eq(DeviceMetricRecord::getDeviceId, deviceId));
         // 璁惧缁翠慨琛�
@@ -411,13 +429,13 @@
      * @param documentList              妗f鍒楄〃
      * @param documentExportWordDtoList 杩斿洖缁檞ord鐨勬暟鎹垪琛�
      */
-    private static void extracted(List<Document> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
+    private static void extracted(List<DeviceDocuments> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
         // 缁欐。妗堝姞搴忓彿   骞朵笖鍒嗕负宸﹀彸涓や釜鍒楄〃鍦╳ord涓樉绀�
         for (int i = 0; i < documentList.size(); i++) {
             // 鍒涘缓word琛ㄦ牸涓竴琛岀殑鏁版嵁瀵硅薄
             DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto();
             // 鑾峰彇妗f淇℃伅
-            Document document = documentList.get(i);
+            DeviceDocuments document = documentList.get(i);
             // 鏍煎紡鍖栨棩鏈�
             DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             // 鏍规嵁搴忓彿 鍒嗗埆鍔犲叆涓や釜鍒楄〃
@@ -489,4 +507,136 @@
             throw new RuntimeException("瀵煎嚭澶辫触");
         }
     }
+
+    @Override
+    @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    public void importExcel(List<Device> batch) {
+        if (CollUtil.isEmpty(batch)) {
+            return;
+        }
+
+        // 鎻愬墠鑾峰彇璁惧鍚嶇О銆佸瀷鍙峰拰绠$悊缂栧彿闆嗗悎
+        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);
+        }
+    }
+
+    @Override
+    public Result<?> dataCollection1(HttpServletRequest request, DeviceCollectionDto dto) {
+        return null;
+    }
+
+    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();
+                }
+            }
+
+            // 鐢熸垚鍞竴閿�
+            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 {
+                toInsert.add(device);
+            }
+        }
+    }
+
+    private void batchOperate(List<Device> toInsert, List<Device> toUpdate) {
+        // 鎵归噺鎻掑叆
+        if (CollUtil.isNotEmpty(toInsert)) {
+            deviceMapper.insertBatchSomeColumn(toInsert);
+        }
+
+        // 鎵归噺鏇存柊
+        if (CollUtil.isNotEmpty(toUpdate)) {
+            updateBatchById(toUpdate);
+        }
+    }
 }

--
Gitblit v1.9.3