| | |
| | | package com.ruoyi.device.service.impl; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.fastjson.TypeReference; |
| | | import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.utils.RedisUtil; |
| | | import com.ruoyi.device.constant.DCResistanceMqttConstants; |
| | | import com.ruoyi.device.constant.ElongationMqttConstants; |
| | | import com.ruoyi.device.mapper.CollectBridgeMapper; |
| | | import com.ruoyi.device.pojo.CollectBridge; |
| | | import com.ruoyi.device.service.CollectBridgeService; |
| | | import com.ruoyi.device.vo.DCResistanceMqttVO; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.Duration; |
| | | import java.time.Instant; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * 数字电桥采集 |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void addBridgeValueByNS(String jsonStr) { |
| | | Map<String, Object> dataMap = JSONObject.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){}.getType()); |
| | | if(CollectionUtil.isNotEmpty(dataMap) && Objects.nonNull(dataMap.get("data"))){ |
| | | List<DCResistanceMqttVO> dataList = JSONArray.parseObject(dataMap.get("data").toString(), new TypeReference<List<DCResistanceMqttVO>>(){}.getType()); |
| | | //过滤出包含实际电阻值的对象 |
| | | // 处理 NSDQCS.DQCS.DZZ 数据 |
| | | processSingleValueDataStream(dataList, DCResistanceMqttConstants.NSDQCS_DQCS_DZZ); |
| | | // 处理 NSTSSC.TSSC.WY 数据 |
| | | processThreeTimesValueDataStream(dataList, ElongationMqttConstants.NSTSSC_TSSC_WY); |
| | | } |
| | | } |
| | | /** |
| | | * 处理单值数据流的数据并保存到 Redis |
| | | * @param dataList 数据列表 |
| | | * @param dataStream 数据流标识 |
| | | */ |
| | | private void processSingleValueDataStream(List<DCResistanceMqttVO> dataList, String dataStream) { |
| | | DCResistanceMqttVO dcResistanceMqttVO = dataList.stream() |
| | | .filter(f -> StringUtils.equals(f.getDataStream(), dataStream)) |
| | | .findFirst() |
| | | .orElse(null); |
| | | if(Objects.nonNull(dcResistanceMqttVO)){ |
| | | List<DCResistanceMqttVO.DataPoint> dataPoints = dcResistanceMqttVO.getDataPoints(); |
| | | BigDecimal value = CollectionUtil.isNotEmpty(dataPoints)?dataPoints.get(0).getValue():BigDecimal.ZERO; |
| | | // 保存单个值到 redis |
| | | RedisUtil.set(dataStream, value.doubleValue()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 处理需要获取三次不同值的数据流,并保存到 Redis |
| | | * @param dataList 数据列表 |
| | | * @param dataStream 数据流标识 |
| | | */ |
| | | private void processThreeTimesValueDataStream(List<DCResistanceMqttVO> dataList, String dataStream) { |
| | | // 从 Redis 获取已存储的值 |
| | | Object valueFromRedis = RedisUtil.get(dataStream); |
| | | JSONArray valueArray = new JSONArray(); |
| | | |
| | | if (valueFromRedis != null) { |
| | | if (valueFromRedis instanceof String) { |
| | | try { |
| | | valueArray = JSONArray.parseArray((String) valueFromRedis); |
| | | } catch (Exception e) { |
| | | // 如果解析失败,说明 Redis 中的值可能不是合法的 JSON 数组,创建空数组 |
| | | valueArray = new JSONArray(); |
| | | } |
| | | } else if (valueFromRedis instanceof Double) { |
| | | // 如果是 Double 类型,将其添加到数组中 |
| | | valueArray.add(valueFromRedis); |
| | | } |
| | | } |
| | | |
| | | // 筛选出当前数据流对应的数据 |
| | | DCResistanceMqttVO dcResistanceMqttVO = dataList.stream() |
| | | .filter(f -> StringUtils.equals(f.getDataStream(), dataStream)) |
| | | .findFirst() |
| | | .orElse(null); |
| | | |
| | | if (Objects.nonNull(dcResistanceMqttVO)) { |
| | | List<DCResistanceMqttVO.DataPoint> dataPoints = dcResistanceMqttVO.getDataPoints(); |
| | | if (CollectionUtil.isNotEmpty(dataPoints)) { |
| | | BigDecimal value = dataPoints.get(0).getValue(); |
| | | valueArray.add(value.doubleValue()); |
| | | |
| | | // 只保留最新的三个值 |
| | | if (valueArray.size() > 3) { |
| | | valueArray.remove(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 将更新后的值保存到 Redis |
| | | RedisUtil.set(dataStream, valueArray.toJSONString()); |
| | | } |
| | | public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) { |
| | | Duration duration = Duration.between(dateTime1, dateTime2); |
| | | long minutesDifference = Math.abs(duration.toMinutes()); |