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