zouyu
2025-10-17 c65ab218b14e87489f1594b2d932f7bd54b3ba11
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -17,6 +17,8 @@
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.RedisUtil;
import com.ruoyi.device.constant.DCResistanceMqttConstants;
import com.ruoyi.device.dto.*;
import com.ruoyi.device.mapper.CollectBridgeMapper;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
@@ -25,7 +27,7 @@
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;
@@ -45,9 +47,11 @@
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
@@ -65,11 +69,9 @@
    private DataConfigService dataConfigService;
    private QrShowServiceImpl qrShowService;
    private InsSampleMapper insSampleMapper;
    private DocumentService documentService;
    private DeviceDocumentsService documentService;
    private DeviceMetricRecordMapper deviceMetricRecordMapper;
@@ -96,10 +98,6 @@
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int upDeviceParameter(Device itemParameter) {
        // 删除数采集配置数据
        dataConfigService.deleteDataConfig();
        // 需要同时更改 device表
        return deviceMapper.updateById(itemParameter);
    }
@@ -166,7 +164,7 @@
        }
        deviceDto.setAuthorizedPersonName(name);
        //查询设备校准信息
        DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate");
        DeviceMetricRecord calibrate = getDeviceMetricRecord(id, "calibrate");
        deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
        // 到了停用日期,自动将状态改为停用
@@ -182,8 +180,25 @@
        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
    public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) {
        // 查询检验项
        List<Integer> itemIds = dto.getItemIds();
@@ -225,18 +240,42 @@
        // 数采返回信息
        Map<String, Object> map = new HashMap<>();
        for (Device device : deviceList) {
            Device device1 = deviceMapper.selectById(device.getId());
            dto.setDbUserName(device1.getDbUserName());
            dto.setDbPassword(device1.getDbPassword());
            dto.setDbTable(device1.getDbTable());
            String ip = device.getIp();
            // 根据检验项获取config
            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
                    .in(DataConfig::getStructureItemParameterId, itemParameterIds)
                    .eq(DataConfig::getDeviceId, device.getId()));
            // 获取设备配置类
            // 判断设备是否是数字直桥
            // 判断设备是否是数字直桥JCZX-ZB-ER02022
            if (device.getManagementNumber().equals("JCZX-ZB-ER02022")) {
                map.putAll(dataCollectBridge(list, device, dto.getEntrustCode()));
            } else {
                map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag()));
            }else if(device.getFileType().equals(".mqtt")){
                //如果文件类型是mqtt,则不走采集器采集
                Map<String, List<DataConfig>> userMap = list.stream()
                        .peek(i -> {
                            String itemName = i.getInspectionItem();
                            if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
                                itemName += "@" + i.getInspectionItemClass();
                            }
                            String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
                            // 添加检验项名称
                            i.setInsProductItem(name);
                        })
                        .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
                map.putAll(getActualResistanceValueAsMap(userMap, device,dto.getEntrustCode()));
            }else {
                String dbUserName = StringUtils.isNotBlank(dto.getDbUserName())?dto.getDbUserName():"";
                String dbPassword = StringUtils.isNotBlank(dto.getDbPassword())?dto.getDbPassword():"";
                String dbTable = StringUtils.isNotBlank(dto.getDbTable())?dto.getDbTable():"";
                map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag(),dbUserName,dbPassword,dbTable));
            }
        }
@@ -248,6 +287,46 @@
        } else {
            return Result.success(null);
        }
    }
    /**
     * 从 Redis 中获取实际电阻值,并以键值对形式返回
     * @param dataConfig 数据配置信息
     * @param device 设备信息
     * @return 包含实际电阻值处理结果的键值对;若未获取到有效数据则返回空 Map
     */
    public Map<String, Object> getActualResistanceValueAsMap(Map<String, List<DataConfig>> dataConfig, Device device,String entrustCode) {
        Map<String, Object> map = new HashMap<>();
        if (ObjectUtils.isEmpty(dataConfig)) {
            return map;
        }
        dataConfig.forEach((k, v) -> {
            AtomicInteger numberOfDataEntries = new AtomicInteger();
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String refery = DataAcquisition.getRefer(v.get(config).getRefery());
                if (refery.equals(DCResistanceMqttConstants.NSDQCS_DQCS_DZZ)){
                    // 查询对应委托编号的数据
//                    Object value = RedisUtil.get(refery);
                    CollectBridge collectBridge = collectBridgeMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery().eq(CollectBridge::getEntrustCode,entrustCode).last("limit 1"));
                    if(Objects.isNull(collectBridge)){
                        throw new ErrorException("直流电阻数采异常:没有找到委托编号为【"+entrustCode+"】的数据");
                    }
                    list.add(0,1);//测试长度,默认1
                    list.add(1,Objects.isNull(collectBridge.getCollectTemperature())?0.0:collectBridge.getCollectTemperature());//todo:温度,暂时未采集到值
                    list.add(2,collectBridge.getCollectValue());//实际电阻值
                }else {
                    // 从 Redis 中获取列表数据
                    List<?> objectList = RedisUtil.lGet(refery, 0, -1);
                    list.addAll(objectList);
                }
                numberOfDataEntries.getAndIncrement();
            }
            // 进行公式计算
            Object resultValue = DataAcquisition.calculationFormula(list, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
@@ -271,21 +350,21 @@
        Map<String, Object> map = new HashMap<>();
        userMap.forEach((k, v) -> {
            List<String> resultValue = new ArrayList<>();
            // 查询直桥电流电阻数采值
            List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery()
                    .like(CollectBridge::getEntrustCode, entrustCode)
                    .orderByAsc(CollectBridge::getCollectDate));
            resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList());
            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("equipName", device.getDeviceName());
            hashMap.put("equipValue", device.getManagementNumber());
            hashMap.put("result", resultValue);
            map.put(k, hashMap);
        });
//        userMap.forEach((k, v) -> {
//            List<String> resultValue = new ArrayList<>();
//            // 查询直桥电流电阻数采值
//            List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery()
//                    .like(CollectBridge::getEntrustCode, entrustCode)
//                    .orderByAsc(CollectBridge::getCollectDate));
//
//            resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList());
//
//            Map<String, Object> hashMap = new HashMap<>();
//            hashMap.put("equipName", device.getDeviceName());
//            hashMap.put("equipValue", device.getManagementNumber());
//            hashMap.put("result", resultValue);
//            map.put(k, hashMap);
//        });
        return map;
    }
@@ -304,7 +383,7 @@
        // 设备信息
        Device device = baseMapper.selectById(deviceId);
        // 设备档案
        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));
        // 设备维修表
@@ -344,6 +423,7 @@
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
@@ -388,11 +468,11 @@
                DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(i);
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                // 维修日期
                deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getDate().format(dateTimeFormatter));
                deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getMaintenanceDate().format(dateTimeFormatter));
                // 处理方法
                deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getContent());
                deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getMaintenanceContent());
                // 备注
                deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getComments());
                deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getRemark());
            }
            deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto);
@@ -406,13 +486,13 @@
     * @param documentList              档案列表
     * @param documentExportWordDtoList 返回给word的数据列表
     */
    private static void extracted(List<Document> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
    private static void extracted(List<DeviceDocuments> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
        // 给档案加序号   并且分为左右两个列表在word中显示
        for (int i = 0; i < documentList.size(); i++) {
            // 创建word表格中一行的数据对象
            DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto();
            // 获取档案信息
            Document document = documentList.get(i);
            DeviceDocuments document = documentList.get(i);
            // 格式化日期
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            // 根据序号 分别加入两个列表
@@ -479,6 +559,7 @@
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");