yaowanxin
2 天以前 d5e714fecf9cba48c1a225e6eb53078cdad647c7
获取redis数据,接收前端数据存reids
已修改4个文件
已添加2个文件
218 ■■■■■ 文件已修改
cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/WeightController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/WeightRequestDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java
@@ -10,5 +10,6 @@
    public final static String  NSDQCS_DQCS_DZZ = "NSDQCS.DQCS.DZZ";
    public final static String  NSDQCS_DQCS_64 = "NSDQCS.DQCS.64";
    public final static String  NSTSSC_TSSC_WY = "NSTSSC.TSSC.WY";
}
cnas-device/src/main/java/com/ruoyi/device/controller/WeightController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.device.controller;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.utils.RedisUtil;
import com.ruoyi.device.constant.DCResistanceMqttConstants;
import com.ruoyi.device.dto.WeightRequestDto;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/weight")
public class WeightController {
    @PostMapping("/handleWeights")
    public ResponseEntity<String> handleWeights(@RequestBody WeightRequestDto weightRequest) {
        try {
            List<Double> weightList = weightRequest.getWeights();
            // åœ¨è¿™é‡Œæ·»åŠ æ•°æ®å¤„ç†é€»è¾‘ï¼Œä¾‹å¦‚æ‰“å°ã€å­˜å‚¨åˆ°æ•°æ®åº“ç­‰
            System.out.println("接收到的数据: " + weightList);
            processThreeTimesValueDataStream(weightList, WeightRequestDto.DENSITY);
            // å¤„理成功返回 200 çŠ¶æ€ç å’Œæ¶ˆæ¯
            return ResponseEntity.ok("数据处理成功");
        } catch (Exception e) {
            // å¤„理失败返回 500 çŠ¶æ€ç å’Œé”™è¯¯æ¶ˆæ¯
            return ResponseEntity.internalServerError().body("数据处理失败: " + e.getMessage());
        }
    }
    private void processThreeTimesValueDataStream(List<Double> weightList, 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) {
                valueArray.add(valueFromRedis);
            }
        }
        valueArray.addAll(weightList);
        RedisUtil.set(dataStream, valueArray.toJSONString());
    }
}
cnas-device/src/main/java/com/ruoyi/device/dto/WeightRequestDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.device.dto;
import lombok.Data;
import java.util.List;
@Data
public class WeightRequestDto {
    public final static String  DENSITY = "DENSITY";
    private List<Double> weights;
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -76,7 +76,8 @@
                    break;
                case "/ztt/v3/2455221/publish":
                    //耐丝:伸长率数据解析
                    log.info("伸长率消息体:{}",parse);
                    mqCallback.collectBridgeService.addBridgeValueByNS(parse);
//                    log.info("伸长率消息体:{}",parse);
                    break;
            }
            // å¡«å……采集数据
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -112,16 +112,83 @@
        if(CollectionUtil.isNotEmpty(dataMap) && Objects.nonNull(dataMap.get("data"))){
            List<DCResistanceMqttVO> dataList = JSONArray.parseObject(dataMap.get("data").toString(), new TypeReference<List<DCResistanceMqttVO>>(){}.getType());
            //过滤出包含实际电阻值的对象
            DCResistanceMqttVO dcResistanceMqttVO = dataList.stream().filter(f -> StringUtils.equals(f.getDataStream(), DCResistanceMqttConstants.NSDQCS_DQCS_DZZ)).findFirst().orElse(null);
            // å¤„理 NSDQCS.DQCS.DZZ æ•°æ®
            processSingleValueDataStream(dataList, DCResistanceMqttConstants.NSDQCS_DQCS_DZZ);
            // å¤„理 NSTSSC.TSSC.WY æ•°æ®
            processThreeTimesValueDataStream(dataList, DCResistanceMqttConstants.NSTSSC_TSSC_WY);
//            DCResistanceMqttVO dcResistanceMqttVO = dataList.stream().filter(f -> StringUtils.equals(f.getDataStream(), DCResistanceMqttConstants.NSDQCS_DQCS_DZZ)).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(DCResistanceMqttConstants.NSDQCS_DQCS_DZZ,value.doubleValue());
//            }
        }
    }
    /**
     * å¤„理单值数据流的数据并保存到 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(DCResistanceMqttConstants.NSDQCS_DQCS_DZZ,value.doubleValue());
            // ä¿å­˜å•个值到 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());
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
@@ -7,6 +7,8 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.common.utils.RedisUtil;
import com.ruoyi.device.constant.DCResistanceMqttConstants;
import com.ruoyi.device.dto.DeviceCollectionDto;
import com.ruoyi.device.pojo.DataConfig;
import com.ruoyi.device.pojo.Device;
@@ -147,6 +149,9 @@
                case ".png":
                    map = readPngString(data, userMap, device);
                    break;
                case ".mqtt":
                    map = getActualResistanceValueAsMap(userMap, device);
                    break;
                default:
                    map = null;
                    break;
@@ -159,6 +164,71 @@
            return map;
        }
    }
    /**
     * ä»Ž Redis ä¸­èŽ·å–å®žé™…ç”µé˜»å€¼ï¼Œå¹¶ä»¥é”®å€¼å¯¹å½¢å¼è¿”å›ž
     * @param dataConfig æ•°æ®é…ç½®ä¿¡æ¯
     * @param device è®¾å¤‡ä¿¡æ¯
     * @return åŒ…含实际电阻值处理结果的键值对;若未获取到有效数据则返回空 Map
     */
    public static Map<String, Object> getActualResistanceValueAsMap(Map<String, List<DataConfig>> dataConfig, Device device) {
        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 = getRefer(v.get(config).getRefery());
                // ä»Ž Redis ä¸­èŽ·å–å€¼
                Object value = RedisUtil.get(refery);
                if (ObjectUtils.isNotEmpty(value)) {
                    if (value instanceof String && ((String) value).startsWith("[") && ((String) value).endsWith("]")) {
                        try {
                            // è§£æž JSON æ•°ç»„字符串为 List<BigDecimal>
                            List<BigDecimal> values = JSONArray.parseArray((String) value, BigDecimal.class);
                            list.addAll(values);
                            numberOfDataEntries.addAndGet(values.size());
                        } catch (Exception e) {
                            // è§£æžå¤±è´¥ï¼Œè®°å½•错误日志,使用原字符串值
                            System.err.println("解析 Redis è¿”回的 JSON æ•°ç»„失败: " + value);
                            list.add(value);
                            numberOfDataEntries.addAndGet(1);
                        }
                    } else {
                        numberOfDataEntries.addAndGet(1);
                        list.add(value);
                    }
                }
            }
            // æ‹¼æŽ¥æ•°é‡‡é…ç½®
            List<Object> result = new ArrayList<>();
            for (int i = 0; i < numberOfDataEntries.get(); i++) {
                StringBuilder aggregate = new StringBuilder();
                for (int j = 0; j < v.size(); j++) {
                    int index;
                    if (j == 0) {
                        index = i;
                    } else {
                        index = numberOfDataEntries.get() + i;
                    }
                    if (index < list.size()) {
                        aggregate.append(list.get(index).toString()).append(",");
                    }
                }
                if (aggregate.length() > 0) {
                    aggregate.setLength(aggregate.length() - 1);
                }
                result.add(aggregate.toString());
            }
            // è¿›è¡Œå…¬å¼è®¡ç®—
            Object resultValue = calculationFormula(result, v.get(0), k, device);
            map.put(k, resultValue);
        });
        return map;
    }
    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) {
        Set<String> set = new LinkedHashSet<>();
@@ -506,7 +576,7 @@
            listResult.addAll(list);
        }
        // ä¸ºäº†ç»™å‰ç«¯åšæ•°æ®åŒºåˆ†
        if (listResult.size() > 1) {
        if (listResult.size() >= 1) {
            hashMap.put("result", listResult);
        } else {
            hashMap.put("result", listResult.get(0).toString());