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/StatisticEleReadingUtil.java |   74 +++++++++++++++++++++++++++++++++++++
 1 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/http/util/StatisticEleReadingUtil.java b/src/main/java/com/ruoyi/http/util/StatisticEleReadingUtil.java
new file mode 100644
index 0000000..b1b21e8
--- /dev/null
+++ b/src/main/java/com/ruoyi/http/util/StatisticEleReadingUtil.java
@@ -0,0 +1,74 @@
+package com.ruoyi.http.util;
+
+import com.alibaba.fastjson2.JSONArray;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 鐢甸噺璇绘暟涓庡�嶇巼璁$畻
+ */
+public final class StatisticEleReadingUtil {
+
+    public static final int CONSUMPTION_SCALE = 4;
+
+    private StatisticEleReadingUtil() {
+    }
+
+    public static BigDecimal firstReading(JSONArray arr) {
+        if (arr == null || arr.isEmpty()) {
+            return null;
+        }
+        return arr.getBigDecimal(0);
+    }
+
+    public static BigDecimal calcConsumption(BigDecimal prev, BigDecimal curr, Integer ratio) {
+        if (prev == null || curr == null) {
+            return null;
+        }
+        BigDecimal diff = curr.subtract(prev);
+        return applyRatio(diff, ratio);
+    }
+
+    public static BigDecimal calcConsumptionFromRaw(BigDecimal raw, Integer ratio) {
+        if (raw == null) {
+            return null;
+        }
+        return applyRatio(raw, ratio);
+    }
+
+    public static BigDecimal applyRatio(BigDecimal value, Integer ratio) {
+        if (value == null) {
+            return null;
+        }
+        int r = ratio == null || ratio <= 0 ? 1 : ratio;
+        return value.multiply(BigDecimal.valueOf(r)).setScale(CONSUMPTION_SCALE, RoundingMode.HALF_UP);
+    }
+
+    public static String formatReadingArray(JSONArray arr) {
+        if (arr == null || arr.isEmpty()) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < arr.size(); i++) {
+            if (i > 0) {
+                sb.append("/");
+            }
+            sb.append(arr.getDouble(i));
+        }
+        return sb.toString();
+    }
+
+    public static BigDecimal parseFirstReading(String reading) {
+        if (reading == null || reading.isBlank()) {
+            return null;
+        }
+        int idx = reading.indexOf('/');
+        String first = idx > 0 ? reading.substring(0, idx) : reading;
+        try {
+            return new BigDecimal(first.trim());
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+}

--
Gitblit v1.9.3