From d2ab6f7153e604bac7bc4ad58f27f368b65d8a1e Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 16 六月 2026 13:54:58 +0800
Subject: [PATCH] feat: 添加能耗数据综合分析功能,支持按天和周维度的趋势分析
---
src/main/java/com/ruoyi/http/util/StatisticEleParseUtil.java | 132 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 132 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/ruoyi/http/util/StatisticEleParseUtil.java b/src/main/java/com/ruoyi/http/util/StatisticEleParseUtil.java
new file mode 100644
index 0000000..bb682de
--- /dev/null
+++ b/src/main/java/com/ruoyi/http/util/StatisticEleParseUtil.java
@@ -0,0 +1,132 @@
+package com.ruoyi.http.util;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.http.pojo.TqdianbiaoEleRecord;
+import com.ruoyi.http.vo.StatisticEleRecordVo;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public final class StatisticEleParseUtil {
+
+ private StatisticEleParseUtil() {
+ }
+
+ public static List<TqdianbiaoEleRecord> parseToEntities(String raw, String dimension) {
+ JSONObject root = JSON.parseObject(raw);
+ if (root == null) {
+ throw new ServiceException("鐢佃〃鎺ュ彛杩斿洖涓虹┖");
+ }
+ if (root.getIntValue("status") != 1) {
+ String msg = root.getString("msg");
+ throw new ServiceException("鐢佃〃鎺ュ彛杩斿洖寮傚父: " + (msg != null ? msg : raw));
+ }
+ JSONObject data = root.getJSONObject("data");
+ if (data == null || data.isEmpty()) {
+ return new ArrayList<>();
+ }
+ LocalDateTime now = LocalDateTime.now();
+ List<TqdianbiaoEleRecord> list = new ArrayList<>();
+ for (String timeKey : data.keySet()) {
+ JSONArray records = data.getJSONArray(timeKey);
+ if (records == null) {
+ continue;
+ }
+ for (int i = 0; i < records.size(); i++) {
+ JSONObject rec = records.getJSONObject(i);
+ TqdianbiaoEleRecord entity = new TqdianbiaoEleRecord();
+ entity.setMeterId(rec.getLong("mid"));
+ entity.setDimension(dimension);
+ entity.setTimeKey(timeKey);
+ entity.setReadingMethod("sync");
+ Integer ratio = rec.getInteger("r");
+ entity.setRatio(ratio);
+ entity.setStartTime(rec.getString("st"));
+ entity.setEndTime(rec.getString("et"));
+
+ JSONArray sArr = rec.getJSONArray("s");
+ JSONArray eArr = rec.getJSONArray("e");
+ JSONArray dArr = rec.getJSONArray("d");
+ entity.setStartReading(StatisticEleReadingUtil.formatReadingArray(sArr));
+ entity.setEndReading(StatisticEleReadingUtil.formatReadingArray(eArr));
+ entity.setPrevReading(StatisticEleReadingUtil.firstReading(sArr));
+ entity.setCurrReading(StatisticEleReadingUtil.firstReading(eArr));
+
+ fillConsumption(entity, dArr, ratio, sArr, eArr);
+ entity.setSyncTime(now);
+ list.add(entity);
+ }
+ }
+ list.sort(Comparator.comparing(TqdianbiaoEleRecord::getTimeKey));
+ return list;
+ }
+
+ public static List<StatisticEleRecordVo> toVoList(List<TqdianbiaoEleRecord> entities) {
+ List<StatisticEleRecordVo> list = new ArrayList<>();
+ for (TqdianbiaoEleRecord entity : entities) {
+ list.add(toVo(entity));
+ }
+ return list;
+ }
+
+ public static StatisticEleRecordVo toVo(TqdianbiaoEleRecord entity) {
+ StatisticEleRecordVo vo = new StatisticEleRecordVo();
+ vo.setId(entity.getId());
+ vo.setTimeKey(entity.getTimeKey());
+ vo.setMeterId(entity.getMeterId());
+ vo.setMeterName(entity.getMeterName());
+ vo.setRatio(entity.getRatio());
+ vo.setReadingMethod(entity.getReadingMethod());
+ vo.setPrevReading(toDouble(entity.getPrevReading()));
+ vo.setCurrReading(toDouble(entity.getCurrReading()));
+ vo.setStartTime(entity.getStartTime());
+ vo.setEndTime(entity.getEndTime());
+ vo.setTotalConsumption(toDouble(entity.getTotalConsumption()));
+ vo.setSharpConsumption(toDouble(entity.getSharpConsumption()));
+ vo.setPeakConsumption(toDouble(entity.getPeakConsumption()));
+ vo.setFlatConsumption(toDouble(entity.getFlatConsumption()));
+ vo.setValleyConsumption(toDouble(entity.getValleyConsumption()));
+ vo.setStartReading(entity.getStartReading());
+ vo.setEndReading(entity.getEndReading());
+ return vo;
+ }
+
+ private static void fillConsumption(TqdianbiaoEleRecord entity, JSONArray d, Integer ratio,
+ JSONArray sArr, JSONArray eArr) {
+ if (d != null && !d.isEmpty()) {
+ entity.setTotalConsumption(StatisticEleReadingUtil.calcConsumptionFromRaw(d.getBigDecimal(0), ratio));
+ entity.setSharpConsumption(consumptionAt(d, 1, ratio));
+ entity.setPeakConsumption(consumptionAt(d, 2, ratio));
+ entity.setFlatConsumption(consumptionAt(d, 3, ratio));
+ entity.setValleyConsumption(consumptionAt(d, 4, ratio));
+ entity.setDeepValleyConsumption(consumptionAt(d, 5, ratio));
+ } else {
+ BigDecimal rawTotal = StatisticEleReadingUtil.calcConsumption(
+ StatisticEleReadingUtil.firstReading(sArr),
+ StatisticEleReadingUtil.firstReading(eArr),
+ 1);
+ entity.setTotalConsumption(StatisticEleReadingUtil.calcConsumptionFromRaw(rawTotal, ratio));
+ }
+ }
+
+ private static BigDecimal consumptionAt(JSONArray d, int index, Integer ratio) {
+ if (d.size() <= index) {
+ return null;
+ }
+ return StatisticEleReadingUtil.calcConsumptionFromRaw(d.getBigDecimal(index), ratio);
+ }
+
+ private static Double toDouble(BigDecimal value) {
+ if (value == null) {
+ return null;
+ }
+ return value.setScale(StatisticEleReadingUtil.CONSUMPTION_SCALE, RoundingMode.HALF_UP).doubleValue();
+ }
+}
--
Gitblit v1.9.3