From d5e714fecf9cba48c1a225e6eb53078cdad647c7 Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期四, 31 七月 2025 13:55:19 +0800
Subject: [PATCH] 获取redis数据,接收前端数据存reids
---
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java | 81 ++++++++++++++++++-
cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java | 1
cnas-device/src/main/java/com/ruoyi/device/dto/WeightRequestDto.java | 11 ++
cnas-device/src/main/java/com/ruoyi/device/controller/WeightController.java | 58 ++++++++++++++
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java | 3
cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java | 72 +++++++++++++++++
6 files changed, 217 insertions(+), 9 deletions(-)
diff --git a/cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java b/cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java
index 421baf0..f0f613d 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java
+++ b/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";
}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/WeightController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/WeightController.java
new file mode 100644
index 0000000..2838296
--- /dev/null
+++ b/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) {
+ // 濡傛灉瑙f瀽澶辫触锛岃鏄� Redis 涓殑鍊煎彲鑳戒笉鏄悎娉曠殑 JSON 鏁扮粍锛屽垱寤虹┖鏁扮粍
+ valueArray = new JSONArray();
+ }
+ } else if (valueFromRedis instanceof Double) {
+ valueArray.add(valueFromRedis);
+ }
+ }
+ valueArray.addAll(weightList);
+ RedisUtil.set(dataStream, valueArray.toJSONString());
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/WeightRequestDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/WeightRequestDto.java
new file mode 100644
index 0000000..26ba3d8
--- /dev/null
+++ b/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;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
index f85eab0..93f15b1 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -76,7 +76,8 @@
break;
case "/ztt/v3/2455221/publish":
//鑰愪笣锛氫几闀跨巼鏁版嵁瑙f瀽
- log.info("浼搁暱鐜囨秷鎭綋锛歿}",parse);
+ mqCallback.collectBridgeService.addBridgeValueByNS(parse);
+// log.info("浼搁暱鐜囨秷鎭綋锛歿}",parse);
break;
}
// 濉厖閲囬泦鏁版嵁
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
index 6024f31..8fa0b1c 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
+++ b/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);
- 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());
- }
+ // 澶勭悊 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(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) {
+ // 濡傛灉瑙f瀽澶辫触锛岃鏄� 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());
diff --git a/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
index 87867f3..c717dd4 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
+++ b/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 {
+ // 瑙f瀽 JSON 鏁扮粍瀛楃涓蹭负 List<BigDecimal>
+ List<BigDecimal> values = JSONArray.parseArray((String) value, BigDecimal.class);
+ list.addAll(values);
+ numberOfDataEntries.addAndGet(values.size());
+ } catch (Exception e) {
+ // 瑙f瀽澶辫触锛岃褰曢敊璇棩蹇楋紝浣跨敤鍘熷瓧绗︿覆鍊�
+ System.err.println("瑙f瀽 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());
--
Gitblit v1.9.3