From 816e856344d34b73a13d7db4055de2c66e7cd534 Mon Sep 17 00:00:00 2001
From: DYL <Dn1332079466>
Date: 星期一, 10 二月 2025 10:25:15 +0800
Subject: [PATCH] 电能负荷分析

---
 zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java             |   36 +
 zhitan-system/src/main/resources/mapper/energyMonitor/ElectricLoadMapper.xml                      |    5 
 zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java |   21 
 zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java    |   19 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexInforModel.java         |   33 +
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadDetail.java        |   36 +
 zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/ElectricLoadMapper.java               |   14 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java    |  268 ++++++++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadVO.java            |   23 
 zhitan-common/src/main/java/com/zhitan/common/utils/ChartUtils.java                               |  177 +++++
 zhitan-common/src/main/java/com/zhitan/common/utils/DoubleUtil.java                               |  103 +++
 zhitan-common/src/main/java/com/zhitan/common/utils/StringUtil.java                               |   70 ++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java            |   26 
 zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java          |   13 
 zhitan-common/src/main/java/com/zhitan/common/utils/DateTimeUtil.java                             |  748 ++++++++++++++++++++++++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexAndUnitDevice.java      |   20 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadItem.java          |   44 +
 zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java                     |   10 
 zhitan-common/src/main/java/com/zhitan/common/utils/IntegerUtil.java                              |   40 +
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/ElectricLoadEntity.java               |   12 
 zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java                              |   28 
 21 files changed, 1,736 insertions(+), 10 deletions(-)

diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java
index 6434f20..3e4d5c9 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java
@@ -1,9 +1,14 @@
 package com.zhitan.web.controller.energyMonitor;
 
 import com.zhitan.common.annotation.Log;
+import com.zhitan.common.constant.CommonConst;
 import com.zhitan.common.core.controller.BaseController;
 import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO;
+import com.zhitan.energyMonitor.service.IElectricLoadService;
 import com.zhitan.energyMonitor.service.IEnergyUnitToDeviceService;
+import com.zhitan.model.domain.EnergyIndex;
 import com.zhitan.model.service.IEnergyIndexService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,8 +32,8 @@
 public class ElectricLoadController extends BaseController {
     @Autowired
     private IEnergyUnitToDeviceService energyUnitToDeviceService;
-//    @Autowired
-//    private IElectricLoadService electricLoadService;
+    @Autowired
+    private IElectricLoadService electricLoadService;
     @Autowired
     private IEnergyIndexService energyIndexService;
 
@@ -48,11 +53,11 @@
                            @RequestParam(name = "meterId") String meterId,
                            @RequestParam(name = "timeType") String timeType,
                            @RequestParam(name = "timeCode") String timeCode) {
-//        EnergyIndex energyIndex = energyIndexService.getDeviceIndexByCode(energyUnitId, meterId, CommonConst.TAG_CODE_ZYGGL);
-//
-//        EnergyUnitToDevice energyUnitToDevice = energyUnitToDeviceService.getEnergyUnitToDeviceById(energyUnitId, meterId);
-//        ListElectricLoadVO lsvo = electricLoadService.list(timeType, timeCode, energyIndex, energyUnitToDevice);
-        return AjaxResult.success(null);
+        EnergyIndex energyIndex = energyIndexService.getDeviceIndexByCode(energyUnitId, meterId, CommonConst.TAG_CODE_ZYGGL);
+
+        EnergyUnitToDevice energyUnitToDevice = energyUnitToDeviceService.getEnergyUnitToDeviceById(energyUnitId, meterId);
+        ListElectricLoadVO vo = electricLoadService.list(timeType, timeCode, energyIndex, energyUnitToDevice);
+        return AjaxResult.success(vo);
     }
 
 }
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/ChartUtils.java b/zhitan-common/src/main/java/com/zhitan/common/utils/ChartUtils.java
new file mode 100644
index 0000000..a099168
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/ChartUtils.java
@@ -0,0 +1,177 @@
+package com.zhitan.common.utils;
+
+
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 缁熻鍥剧浉鍏虫暟鎹伐鍏风被
+ * @author: yxw
+ * @date: 2022骞�04鏈�28鏃� 15:29
+ */
+public class ChartUtils {
+
+    /**
+     * 鏋勯�犳棩鏈熷垪琛�
+     *
+     * @param timeType
+     * @param timeCode
+     * @param dateList
+     */
+    public static void generateDateList(String timeType, String timeCode, List<Date> dateList) {
+        Date now = new Date();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                if (!timeCode.contains(CommonConst.SINGLE_MINUS_SIGN)) {
+                    timeCode = DateTimeUtil.toDateTimeStr(timeCode, DateTimeUtil.COMMON_PATTERN_DAY, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                }
+                int hour = 23;
+                for (int i =  CommonConst.DIGIT_0; i <= hour; i++) {
+                    String tempCode = timeCode + " 0" + i;
+                    if (i > 9) {
+                        tempCode = timeCode + " " + i;
+                    }
+                    Date tempD = DateTimeUtil.toDateTime(tempCode, DateTimeUtil.COMMON_PATTERN_TO_HOUR);
+                    dateList.add(tempD);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                if (!timeCode.contains(CommonConst.SINGLE_MINUS_SIGN)) {
+                    timeCode = DateTimeUtil.toDateTimeStr(timeCode, DateTimeUtil.COMMON_PATTERN_MONTH, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                }
+                int max = DateTimeUtil.getDateTimeLastDay(DateTimeUtil.toDateTime(timeCode, DateTimeUtil.COMMON_PATTERN_TO_MONTH));
+
+                for (int i =  CommonConst.DIGIT_1; i <= max; i++) {
+                    String tempCode = timeCode + "-0" + i;
+                    if (i > 9) {
+                        tempCode = timeCode + "-" + i;
+                    }
+                    Date tempD = DateTimeUtil.toDateTime(tempCode, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                    dateList.add(tempD);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                int monthMax = 12;
+                for (int i = CommonConst.DIGIT_1; i <= monthMax; i++) {
+                    String tempCode = timeCode + "-0" + i;
+                    if (i > 9) {
+                        tempCode = timeCode + "-" + i;
+                    }
+                    Date tempD = DateTimeUtil.toDateTime(tempCode, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                    dateList.add(tempD);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * 鑾峰彇瀵瑰簲鐨勭粨鏉熸椂闂�
+     *
+     * @param timeType
+     * @param date
+     * @return
+     */
+    public static Date getEndTime(String timeType, Date date) {
+        Date d1 = new Date();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                d1 = DateTimeUtil.addDays(date, CommonConst.DIGIT_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                d1 = DateTimeUtil.addMonths(date, CommonConst.DIGIT_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                d1 = DateTimeUtil.addYears(date, CommonConst.DIGIT_1);
+                break;
+            default:
+                break;
+        }
+        return d1;
+    }
+
+    /**
+     * 鑾峰彇鏃ユ湡鏄剧ず瀛楃
+     *
+     * @param timeType
+     * @param date
+     * @return
+     */
+    public static String getTimeCode(String timeType, Date date) {
+        String str = CommonConst.EMPTY;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                break;
+            default:
+                break;
+        }
+        return str;
+    }
+
+    /**
+     * 鑾峰彇鏃ユ湡鏄剧ず瀛楃
+     *
+     * @param timeType
+     * @param date
+     * @return
+     */
+    public static String getTimeCodeChart(String timeType, Date date) {
+        String str = CommonConst.EMPTY;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_HOUR_MINUTE);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_MONTH_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                str = DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                break;
+            default:
+                break;
+        }
+        return str;
+    }
+
+    /**
+     * 鑾峰彇鏃ユ湡鏄剧ず瀛楃
+     *
+     * @param timeType
+     * @param timeCode
+     * @return
+     */
+    public static Date getDateTime(String timeType, String timeCode) {
+        Date d1 = new Date();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                if (!timeCode.contains(CommonConst.SINGLE_MINUS_SIGN)) {
+                    timeCode = DateTimeUtil.toDateTimeStr(timeCode, DateTimeUtil.COMMON_PATTERN_DAY, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                }
+                d1 = DateTimeUtil.toDateTime(timeCode, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                if (!timeCode.contains(CommonConst.SINGLE_MINUS_SIGN)) {
+                    timeCode = DateTimeUtil.toDateTimeStr(timeCode, DateTimeUtil.COMMON_PATTERN_MONTH, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                }
+                d1 = DateTimeUtil.toDateTime(timeCode, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                d1 = DateTimeUtil.toDateTime(timeCode, DateTimeUtil.COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return d1;
+    }
+}
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/DateTimeUtil.java b/zhitan-common/src/main/java/com/zhitan/common/utils/DateTimeUtil.java
new file mode 100644
index 0000000..248cb2f
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/DateTimeUtil.java
@@ -0,0 +1,748 @@
+package com.zhitan.common.utils;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * @Description: 鏃堕棿宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 12:23
+ */
+@Slf4j
+public class DateTimeUtil {
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡
+     */
+    public static final String COMMON_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 鏍煎紡鍖栨棩鏈熷埌鍒嗛挓
+     */
+    public static final String COMMON_PATTERN_END_WITH_MINUTE = "yyyy-MM-dd HH:mm";
+    /**
+     * 鏃ユ湡鏍煎紡 - 灏忔椂:鍒嗛挓
+     */
+    public static final String COMMON_PATTERN_HOUR_MINUTE = "HH:mm";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 骞翠唤
+     */
+    public static final String COMMON_PATTERN_YEAR = "yyyy";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏌愪竴骞�,
+     */
+    public static final String COMMON_PATTERN_CERTAIN_YEAR = "yy";
+
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_MONTH = "yyyyMM";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_TO_MONTH = "yyyy-MM";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_TO_MONTH_WORD = "yyyy-MM鏈�";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_TO_MONTH_ZH = "yyyy骞碝M鏈�";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+     */
+    public static final String COMMON_PATTERN_DAY = "yyyyMMdd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+     */
+    public static final String COMMON_PATTERN_TO_DAY = "yyyy-MM-dd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+     */
+    public static final String COMMON_PATTERN_TO_DAY_WORD = "yyyy-MM-dd鏃�";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堟棩
+     */
+    public static final String COMMON_PATTERN_MONTH_DAY = "MM-dd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶╂煇涓�澶�,
+     */
+    public static final String COMMON_PATTERN_DAY_OF_MONTH = "dd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_HOUR = "yyyyMMddHH";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_TO_HOUR = "yyyy-MM-dd HH";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_TO_HOUR_WORD = "yyyy-MM-dd HH鏃�";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_TO_HOUR_TEXT = "yyyy骞碝M鏈坉d鏃� HH鏃�";
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿,鏃堕棿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+     *
+     * @return
+     */
+    public static String getNowDateTime() {
+        return getNowDateTime(COMMON_PATTERN);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿
+     *
+     * @param pattern 鏃堕棿鏍煎紡
+     * @return
+     */
+    public static String getNowDateTime(String pattern) {
+        //璁剧疆鏃ユ湡鏍煎紡
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        String dateTime = df.format(new Date());
+        return dateTime;
+    }
+
+    /**
+     * 鑾峰彇浠婂勾鐨勫勾浠藉��
+     *
+     * @return
+     */
+    public static String getNowYear() {
+        return getNowDateTime(COMMON_PATTERN_YEAR);
+    }
+
+    /**
+     * 鑾峰彇浠婂勾鐨勬湀浠藉��
+     *
+     * @return
+     */
+    public static String getNowMonth() {
+        return getNowDateTime(COMMON_PATTERN_MONTH);
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愭椂闂寸被鍨�,榛樿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+     *
+     * @param dateTimeStr
+     * @return
+     */
+    public static Date toDateTime(String dateTimeStr) {
+        DateTime dt = null;
+        try {
+            dt = DateTime.of(dateTimeStr, COMMON_PATTERN);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愭椂闂寸被鍨�
+     *
+     * @param dateTimeStr
+     * @return
+     */
+    public static Date toDateTime(String dateTimeStr, String pattern) {
+        DateTime dt = null;
+        try {
+            dt = DateTime.of(dateTimeStr, pattern);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愮壒瀹氭牸寮忕殑鏃堕棿瀛楃涓茬被鍨�
+     *
+     * @param dateTimeStr   鏃堕棿瀛楃涓�
+     * @param sourcePattern 瀛楃涓叉椂闂存牸寮�
+     * @param toPattern     瑕佽浆鎴愪粈涔堟牸寮忕殑鏃堕棿
+     * @return
+     */
+    public static String toDateTimeStr(String dateTimeStr, String sourcePattern, String toPattern) {
+        String str = CommonConst.EMPTY;
+        try {
+            DateTime dt = DateTime.of(dateTimeStr, sourcePattern);
+            str = getDateTime(dt, toPattern);
+        } catch (Exception e) {
+
+        }
+        return str;
+    }
+
+    /**
+     * 鏃堕棿杞垚鎸囧畾鐨勬牸寮�
+     *
+     * @param pattern 鏃堕棿鏍煎紡
+     * @return
+     */
+    public static String getDateTime(Date dt, String pattern) {
+        //璁剧疆鏃ユ湡鏍煎紡
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        return df.format(dt);
+    }
+
+    /**
+     * 鏃堕棿杞垚yyyy-MM-dd HH:mm:ss鏍煎紡
+     *
+     * @return
+     */
+    public static String getDateTime(Date dt) {
+        if (ObjectUtil.isEmpty(dt)) {
+            return CommonConst.EMPTY;
+        }
+        return getDateTime(dt, COMMON_PATTERN);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿鎵�灞炴湀浠界殑鏈�鍚庝竴澶�
+     *
+     * @return
+     */
+    public static int getDateTimeLastDay(Date dt) {
+        String month = getMonth(dt);
+        String firstDate = month + "01";
+        Date nextMonthFirstDate = addMonths(toDateTime(firstDate, COMMON_PATTERN_DAY), CommonConst.DIGIT_1);
+        Date currentMonthLastDate = addDays(nextMonthFirstDate, CommonConst.DIGIT_MINUS_1);
+        int day = IntegerUtil.toInt(getDateTime(currentMonthLastDate, COMMON_PATTERN_DAY_OF_MONTH));
+        return day;
+    }
+
+    /**
+     * 鑾峰彇骞翠唤鍊�
+     *
+     * @return
+     */
+    public static String getYear(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_YEAR);
+    }
+
+    /**
+     * 鑾峰彇鏈堜唤鍊� 202202
+     *
+     * @return
+     */
+    public static String getMonth(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_MONTH);
+    }
+
+    /**
+     * 鑾峰彇澶�,鏍煎紡锛歽yyyMMdd
+     *
+     * @return
+     */
+    public static String toDay(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_DAY);
+    }
+
+    /**
+     * 鑾峰彇灏忔椂:yyyyMMddHH
+     *
+     * @return
+     */
+    public static String toHour(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_HOUR);
+    }
+
+    /**
+     * 杞垚瀛楃涓茬被鍨嬪��
+     *
+     * @return
+     */
+    public static String toString(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫勾鏁�
+     *
+     * @param dateTime
+     * @param years
+     * @return
+     */
+    public static Date addYears(Date dateTime, int years) {
+        return calcDate(dateTime, years, Calendar.YEAR);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勬湀鏁�
+     *
+     * @param dateTime
+     * @param months
+     * @return
+     */
+    public static Date addMonths(Date dateTime, int months) {
+        return calcDate(dateTime, months, Calendar.MONTH);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫ぉ鏁�
+     *
+     * @param dateTime
+     * @param days
+     * @return
+     */
+    public static Date addDays(Date dateTime, int days) {
+        return calcDate(dateTime, days, Calendar.DATE);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫皬鏃舵暟
+     *
+     * @param dateTime
+     * @param hours
+     * @return
+     */
+    public static Date addHours(Date dateTime, int hours) {
+        return calcDate(dateTime, hours, Calendar.HOUR);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫垎閽熸暟
+     *
+     * @param dateTime
+     * @param minutes
+     * @return
+     */
+    public static Date addMinutes(Date dateTime, int minutes) {
+        return calcDate(dateTime, minutes, Calendar.MINUTE);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫皬鏃舵暟
+     *
+     * @param dateTime
+     * @param seconds
+     * @return
+     */
+    public static Date addSeconds(Date dateTime, int seconds) {
+        return calcDate(dateTime, seconds, Calendar.SECOND);
+    }
+
+    /**
+     * 璁$畻鏃ユ湡閫氱敤鏂规硶
+     *
+     * @param dateTime
+     * @param addValue
+     * @param calendarType 璁$畻绫诲瀷锛欳alendar.YEAR锛孋alendar.MONTH,Calendar.DAY
+     * @return
+     */
+    private static Date calcDate(Date dateTime, int addValue, int calendarType) {
+        Date dt = null;
+        try {
+            Calendar calendar = new GregorianCalendar();
+            calendar.setTime(dateTime);
+            //鎶婃棩鏈熷線鍚庡鍔犱竴骞达紝鏁存暟寰�鍚庢帹锛岃礋鏁板線鍓嶇Щ
+            calendar.add(calendarType, addValue);
+            // 鑾峰彇鐩稿姞鎴栬�呯浉鍑忎箣鍚庣殑鏃堕棿鍊�
+            Date tempDt = calendar.getTime();
+            // 鎶婃椂闂磋浆鎴愭墍闇�瑕佺殑鏍煎紡
+            String temp = getDateTime(tempDt, COMMON_PATTERN);
+            dt = toDateTime(temp);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+
+    /**
+     * 鑾峰彇璇ユ椂闂村睘浜庡綋澶╃殑绗嚑涓皬鏃�
+     *
+     * @param dateTime
+     * @return
+     */
+    public static int getHourOfDay(Date dateTime) {
+        return getDateValue(dateTime, Calendar.HOUR_OF_DAY);
+    }
+
+    /**
+     * 鑾峰彇璇ユ椂闂村睘浜庡綋鏈堢殑绗嚑澶�
+     *
+     * @param dateTime
+     * @return
+     */
+    public static int getDayOfMonth(Date dateTime) {
+        return getDateValue(dateTime, Calendar.DAY_OF_MONTH);
+    }
+
+    /**
+     * 鑾峰彇璇ユ椂闂村睘浜庡綋鍛ㄧ殑绗嚑澶�
+     * 涓�鍛ㄧ殑绗竴澶╂槸鍛ㄦ棩
+     *
+     * @param dateTime
+     * @return
+     */
+    public static int getDayOfWeek(Date dateTime) {
+        return getDateValue(dateTime, Calendar.DAY_OF_WEEK);
+    }
+
+    /**
+     * 鑾峰彇璇ユ椂闂村睘浜庡勾鐨勭鍑犱釜鏈�
+     * 鏈堜唤鍊�+1鏄湡瀹炵殑褰撳墠鏈�
+     *
+     * @param dateTime
+     * @return 宸茬粡鍦ㄧ郴缁熶腑鑾峰彇鍊肩殑鍩虹涓婂姞1浜嗭紝鐜板湪鏄湡瀹炵殑褰撳墠鏈堜唤鍊�
+     */
+    public static int getMonthOfYear(Date dateTime) {
+        return getDateValue(dateTime, Calendar.MONTH) + 1;
+    }
+
+    /**
+     * 鑾峰彇褰撳ぉ鐨勭鍑犱釜灏忔椂/褰撴湀鐨勭鍑犲ぉ/褰撳勾鐨勭鍑犱釜鏈�
+     *
+     * @param dateTime     濡傛灉鏃堕棿鍊间负绌猴紝榛樿褰撳墠鏃堕棿
+     * @param calendarType
+     * @return
+     */
+    private static int getDateValue(Date dateTime, int calendarType) {
+        int value = 0;
+        try {
+            if (ObjectUtil.isEmpty(dateTime)) {
+                dateTime = new Date();
+            }
+            Calendar calendar = new GregorianCalendar();
+            calendar.setTime(dateTime);
+            value = calendar.get(calendarType);
+        } catch (Exception e) {
+
+        }
+        return value;
+    }
+
+    /**
+     * 瀵规瘮time1 鍜� time2 鐨勫ぇ灏�
+     *
+     * @param time1
+     * @param time2
+     * @return -1:time1灏忎簬time2;0:time1绛変簬time2;1:time1澶т簬time2;
+     */
+    public static int compareDateDiff(Date time1, Date time2) {
+        long diff = time1.getTime() - time2.getTime();
+        int res = 0;
+        if (diff > 0) {
+            res = 1;
+        } else if (diff < 0) {
+            res = -1;
+        }
+        return res;
+    }
+
+    /**
+     * 鑾峰彇鏌ヨdata_item鎵�闇�瑕佺殑timecode鍊�
+     *
+     * @param timeType 鏃ユ湡绫诲瀷
+     * @param date     鏃堕棿
+     * @return
+     */
+    public static String getTimeCode(String timeType, Date date) {
+        String timeCode = CommonConst.EMPTY;
+        if (ObjectUtil.isEmpty(date)) {
+            date = new Date();
+        }
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                timeCode = CommonConst.WORD_H + getDateTime(date, COMMON_PATTERN_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                timeCode = CommonConst.WORD_D + getDateTime(date, COMMON_PATTERN_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                timeCode = CommonConst.WORD_M + getDateTime(date, COMMON_PATTERN_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                timeCode = CommonConst.WORD_Y + getDateTime(date, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return timeCode;
+    }
+
+    /**
+     * 鑾峰彇鏌ヨ鏃ユ湀骞存姤琛ㄦ墍闇�瑕佺殑timecode鍊�
+     *
+     * @param timeType 鏃ユ湡绫诲瀷
+     * @param date     鏃堕棿
+     * @return
+     */
+    public static String getReportTimeCode(String timeType, Date date) {
+        String timeCode = CommonConst.EMPTY;
+        if (ObjectUtil.isEmpty(date)) {
+            date = new Date();
+        }
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                timeCode = getDateTime(date, COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                timeCode = getDateTime(date, COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                timeCode = getDateTime(date, COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                timeCode = getDateTime(date, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return timeCode;
+    }
+
+    /**
+     * 鑾峰彇鏃堕棿瀵瑰簲鐨勭幆姣旀椂闂�
+     *
+     * @param timeType HOUR/DAY/MONTH/YEAR
+     * @param date     鏃堕棿鍊�
+     * @return
+     */
+    public static Date getLoopTime(String timeType, Date date) {
+        Date dt = null;
+        if (ObjectUtil.isEmpty(date)) {
+            date = new Date();
+        }
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                dt = addHours(date, CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = addDays(date, CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = addMonths(date, CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = addYears(date, CommonConst.DIGIT_MINUS_1);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鑾峰彇鏁寸偣鏃堕棿
+     *
+     * @param timeType HOUR/DAY/MONTH/YEAR
+     * @param date     鏃堕棿鍊�
+     * @return
+     */
+    public static Date getHourTime(String timeType, Date date) {
+        Date dt = null;
+        if (ObjectUtil.isEmpty(date)) {
+            date = new Date();
+        }
+        String tempStr = null;
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                tempStr = getDateTime(date, COMMON_PATTERN_TO_HOUR);
+                dt = toDateTime(tempStr, COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                tempStr = getDateTime(date, COMMON_PATTERN_TO_DAY);
+                dt = toDateTime(tempStr, COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                tempStr = getDateTime(date, COMMON_PATTERN_TO_MONTH);
+                dt = toDateTime(tempStr, COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                tempStr = getDateTime(date, COMMON_PATTERN_YEAR);
+                dt = toDateTime(tempStr, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 璁$畻涓や釜鏃堕棿闂撮殧澶╂暟锛堟棩鏈熸牸寮忔瘮杈冿級
+     *
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public static int daysBetween(Date beginTime, Date endTime) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(beginTime);
+        long beginStamp = calendar.getTimeInMillis();
+        calendar.setTime(endTime);
+        long endStamp = calendar.getTimeInMillis();
+        long betweenDays = (endStamp - beginStamp) / (1000 * 3600 * 24);
+        return Integer.parseInt(String.valueOf(betweenDays));
+    }
+
+    /**
+     * 璁$畻涓や釜鏃堕棿闂撮殧澶╂暟锛堝瓧绗︿覆鏍煎紡姣旇緝锛�
+     *
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    public static int daysBetween(String beginTime, String endTime) {
+        try {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            Date begin = format.parse(beginTime);
+            Date end = format.parse(endTime);
+            return daysBetween(begin, end);
+        } catch (ParseException exception) {
+            log.error("璁$畻涓や釜鏃堕棿闂撮殧澶╂暟" + exception.getMessage());
+            return 0;
+        }
+    }
+
+    /**
+     * 鏍规嵁鏃堕棿绫诲瀷鎶婂瓧绗︿覆杞垚瀵瑰簲鐨勬椂闂�
+     *
+     * @param timeType 鏃堕棿绫诲瀷
+     * @param time     鏃堕棿瀛楃涓�
+     * @return
+     */
+    public static Date getTime(String timeType, String time) {
+        Date dt = null;
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                dt = toDateTime(time, COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = toDateTime(time, COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = toDateTime(time, COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = toDateTime(time, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鏍规嵁鏃堕棿绫诲瀷鎶婅繛缁殑鏃ユ湡瀛楃涓茶浆鎴愬搴旂殑鏃堕棿 锛�202303銆�20230303銆�2023030301銆�202303030101锛�
+     *
+     * @param timeType 鏃堕棿绫诲瀷
+     * @param time     鏃堕棿瀛楃涓�
+     * @return
+     */
+    public static Date getTimeByContinuousTimeCode(String timeType, String time) {
+        Date dt = null;
+        timeType = StringUtil.ifEmptyOrNullReturnValue(timeType).toUpperCase();
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                dt = toDateTime(time, COMMON_PATTERN_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = toDateTime(time, COMMON_PATTERN_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = toDateTime(time, COMMON_PATTERN_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = toDateTime(time, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鏍规嵁鏃堕棿绫诲瀷杩斿洖澶┿�佹湀銆佸勾鏈�鍚庣殑鏃堕棿
+     *
+     * @param timeType 鏃堕棿绫诲瀷
+     * @param time     鏃堕棿
+     * @return
+     */
+    public static Date getEndTimeByType(String timeType, Date time) {
+        Date dt = null;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = DateUtil.endOfDay(time);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = DateUtil.endOfMonth(time);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = DateUtil.endOfYear(time);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鏍规嵁鍛ㄦ湡绫诲瀷瀵圭敓浜у懆鏈熻繘琛屽姞鍑忚绠�
+     * 濉姤鍛ㄦ湡绫诲瀷锛圚OUR灏忔椂銆丏AY澶┿�丮ONTH鏈堛�乊EAR骞达級
+     *
+     * @param date      鐢熶骇鍛ㄦ湡
+     * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+     * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+     * @param val 璁$畻鍊�
+     * @return
+     */
+    public static Date productionCycleCal(Date date, String cycleType,int val) {
+        Date momDate = date;
+        switch (cycleType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                momDate = DateUtils.addHours(date, val);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                momDate = DateUtils.addDays(date, val);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                momDate = DateUtils.addMonths(date, val);
+                break;
+        }
+        return momDate;
+    }
+
+    /**
+     * 鏍规嵁鍛ㄦ湡绫诲瀷瀵圭敓浜у懆鏈熻繘琛屽姞鍑忚绠� 骞朵笖杩涗綅  渚嬪锛� HOUR +1杩涗綅灏辨槸 鍔犱竴澶�
+     * 濉姤鍛ㄦ湡绫诲瀷锛圚OUR灏忔椂銆丏AY澶┿�丮ONTH鏈堛�乊EAR骞达級
+     *
+     * @param date      鐢熶骇鍛ㄦ湡
+     * @param cycleType 鐢熶骇鍛ㄦ湡绫诲瀷
+     * @param val 璁$畻鍊�
+     * @return
+     */
+    public static Date productionCycleCalCarry(Date date, String cycleType,int val) {
+        Date momDate = date;
+        switch (cycleType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                momDate = DateUtils.addDays(date, val);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                momDate = DateUtils.addMonths(date, val);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                momDate = DateUtils.addYears(date, val);
+                break;
+        }
+        return momDate;
+    }
+}
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/DoubleUtil.java b/zhitan-common/src/main/java/com/zhitan/common/utils/DoubleUtil.java
new file mode 100644
index 0000000..e56b678
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/DoubleUtil.java
@@ -0,0 +1,103 @@
+package com.zhitan.common.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+
+/**
+ * @Description: 鏁板瓧宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�02鏈�07鏃� 15:03
+ */
+public class DoubleUtil {
+    public static double toDouble(String str) {
+        double d = 0;
+        try {
+            d = Double.parseDouble(str);
+        } catch (Exception e) {
+            d = 0;
+        }
+        return d;
+    }
+
+    /**
+     * long 杞垚 double绫诲瀷
+     *
+     * @param l
+     * @return
+     */
+    public static double toDouble(long l) {
+        return toDouble(l + "");
+    }
+
+    /**
+     * long 杞垚 double绫诲瀷
+     *
+     * @param l
+     * @return
+     */
+    public static double toDouble(Object l) {
+        return toDouble(l + "");
+    }
+
+    /**
+     * int 杞垚 double绫诲瀷
+     *
+     * @param i
+     * @return
+     */
+    public static double toDouble(int i) {
+        return toDouble(i + "");
+    }
+
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁板瓧绗︿覆
+     *
+     * @param value
+     * @return
+     */
+    public static String formatDoubleToStr(Double value, int format) {
+        if (ObjectUtil.isEmpty(value)) {
+            value = 0.00;
+        }
+        String str = String.format("%." + format + "f", value).toString();
+        return str;
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁板瓧绗︿覆,榛樿鏍煎紡鍖栦负2浣嶅皬鏁�
+     *
+     * @param value
+     * @return
+     */
+    public static String formatDoubleToStr(Double value) {
+        return formatDoubleToStr(value, 2);
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁�
+     *
+     * @param value
+     * @param format
+     * @return
+     */
+    public static double formatDouble(Double value, int format) {
+        if (ObjectUtil.isEmpty(value)) {
+            return 0D;
+        }
+        String str = formatDoubleToStr(value, format);
+        return toDouble(str);
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负2浣嶆暟鐨勫皬鏁�
+     *
+     * @param value
+     * @return
+     */
+    public static double formatDouble(Double value) {
+        if (ObjectUtil.isEmpty(value)) {
+            return 0D;
+        }
+        return formatDouble(value, 2);
+    }
+}
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/IntegerUtil.java b/zhitan-common/src/main/java/com/zhitan/common/utils/IntegerUtil.java
new file mode 100644
index 0000000..4ab42f8
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/IntegerUtil.java
@@ -0,0 +1,40 @@
+package com.zhitan.common.utils;
+
+/**
+ * @Description: 鏁存暟鐩稿叧宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�03鏈�10鏃� 17:31
+ */
+public class IntegerUtil {
+    /**
+     * 瀛楃涓茶浆鎴恑nt绫诲瀷
+     *
+     * @param str
+     * @return
+     */
+    public static int toInt(String str) {
+        int d = 0;
+        try {
+            d = Integer.parseInt(str);
+        } catch (Exception e) {
+            d = 0;
+        }
+        return d;
+    }
+
+    /**
+     * long杞垚int绫诲瀷
+     *
+     * @param l
+     * @return
+     */
+    public static int toInt(long l) {
+        int d = 0;
+        try {
+            d = (int) l;
+        } catch (Exception e) {
+            d = 0;
+        }
+        return d;
+    }
+}
diff --git a/zhitan-common/src/main/java/com/zhitan/common/utils/StringUtil.java b/zhitan-common/src/main/java/com/zhitan/common/utils/StringUtil.java
new file mode 100644
index 0000000..35522d0
--- /dev/null
+++ b/zhitan-common/src/main/java/com/zhitan/common/utils/StringUtil.java
@@ -0,0 +1,70 @@
+package com.zhitan.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zhitan.common.constant.CommonConst;
+
+/**
+ * @Description: 瀛楃涓插伐鍏风被
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 12:27
+ */
+public class StringUtil {
+    /**
+     * 鍒ゆ柇瀛楃涓叉槸鍚︿负绌哄瓧绗︿覆鎴栬�匩ull
+     *
+     * @param str 闇�瑕佸垽鏂殑瀛楃涓�
+     * @return
+     */
+    public static boolean isEmptyOrNull(String str) {
+        if (str == null || CommonConst.EMPTY.equals(str)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 瀛楃涓插鏋滀负绌哄瓧绗︿覆鎴栬�匩ull杩斿洖绌哄瓧绗︿覆锛屽惁鍒欒繑鍥炲瓧绗︿覆鏈韩鐨勫��
+     *
+     * @param str
+     * @return
+     */
+    public static String ifEmptyOrNullReturnValue(String str) {
+        if (isEmptyOrNull(str)) {
+            return CommonConst.EMPTY;
+        }
+        return str;
+    }
+
+    /**
+     * 瀵硅薄杞垚json瀛楃涓�
+     *
+     * @param obj
+     * @return
+     */
+    public static String toJson(Object obj) {
+        return JSONObject.toJSONString(obj);
+    }
+
+    /**
+     * 瀵硅薄杞垚JSONObject
+     *
+     * @param obj
+     * @return
+     */
+    public static JSONObject toJsonObject(Object obj) {
+        return JSONObject.parseObject(toJson(obj));
+    }
+
+    /**
+     * 棣栧瓧姣嶅ぇ鍐�
+     *
+     * @param str
+     * @return
+     */
+    public static String captureWord(String str) {
+        str = str.toLowerCase();
+        char[] cs = str.toCharArray();
+        cs[0] -= 32;
+        return String.valueOf(cs);
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/ElectricLoadEntity.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/ElectricLoadEntity.java
new file mode 100644
index 0000000..0d089e2
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/ElectricLoadEntity.java
@@ -0,0 +1,12 @@
+package com.zhitan.energyMonitor.domain;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 15:58
+ */
+@Data
+public class ElectricLoadEntity {
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexAndUnitDevice.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexAndUnitDevice.java
new file mode 100644
index 0000000..f1f0845
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexAndUnitDevice.java
@@ -0,0 +1,20 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * 閲囬泦鐐圭敤鑳藉崟鍏冪數琛�
+ *
+ * @author fanxinfu
+ */
+@Data
+public class EnergyIndexAndUnitDevice {
+
+  private String indexId;
+  private String indexName;
+  private String energyType;
+  private String energyName;
+  private String energyUnitName;
+  private String energyUnitDeviceName;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexInforModel.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexInforModel.java
new file mode 100644
index 0000000..78a7a82
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexInforModel.java
@@ -0,0 +1,33 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 鐐逛綅璇︾粏淇℃伅
+ *
+ * @Author: Zhujw
+ * @Date: 2023/5/26
+ */
+@Data
+public class EnergyIndexInforModel {
+
+  @ApiModelProperty(value = "鐐逛綅id")
+  private String indexId;
+
+  @ApiModelProperty(value = "璁¢噺鍣ㄥ叿id")
+  private String meterId;
+
+  @ApiModelProperty(value = "鐐逛綅鍚嶇О")
+  private String indexName;
+
+  @ApiModelProperty(value = "鐐逛綅绫诲瀷(閲囬泦銆佽绠�)")
+  private String indexType;
+
+  @ApiModelProperty(value = "鐐逛綅code")
+  private String indexCode;
+
+  @ApiModelProperty(value = "鐐逛綅鍗曚綅")
+  private String indexUnit;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadDetail.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadDetail.java
new file mode 100644
index 0000000..9ee1c52
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadDetail.java
@@ -0,0 +1,36 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ListElectricLoadDetail {
+    /**
+     * 鏈�澶ц礋鑽�
+     */
+    private String max;
+    /**
+     * 鏈�澶ц礋鑽峰彂鐢熸椂闂�
+     */
+    private String maxTime;
+    /**
+     * 鏈�灏忚礋鑽�
+     */
+    private String min;
+    /**
+     * 鏈�灏忚礋鑽峰彂鐢熸椂闂�
+     */
+    private String minTime;
+    /**
+     * 骞冲潎璐熻嵎
+     */
+    private String avg;
+    /**
+     * 璐熻嵎鐜� = 骞冲潎璐熻嵎 / 鏈�澶ц礋鑽�
+     */
+    private String rate;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadItem.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadItem.java
new file mode 100644
index 0000000..da4a6c7
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadItem.java
@@ -0,0 +1,44 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ListElectricLoadItem {
+    /**
+     * 鐢佃〃鍚嶇О
+     */
+    private String name;
+    /**
+     * 鏃堕棿
+     */
+    private String timeCode;
+    /**
+     * 缁熻鍥炬樉绀烘椂闂�
+     */
+    private String timeCodeChart;
+    /**
+     * 鏈�澶ц礋鑽�
+     */
+    private String max;
+    /**
+     * 鏈�灏忚礋鑽�
+     */
+    private String min;
+    /**
+     * 骞冲潎璐熻嵎
+     */
+    private String avg;
+    /**
+     * 瀹炴椂鍊�
+     */
+    private String value;
+    /**
+     * 璐熻嵎鐜�
+     */
+    private String rate;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadVO.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadVO.java
new file mode 100644
index 0000000..dd06a35
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadVO.java
@@ -0,0 +1,23 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:58
+ */
+@Data
+public class ListElectricLoadVO {
+    /**
+     * 璁板綍鍒楄〃
+     */
+    private List<ListElectricLoadItem> itemList;
+
+    /**
+     * 璇︽儏瀹炰綋
+     */
+    private ListElectricLoadDetail detail;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/ElectricLoadMapper.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/ElectricLoadMapper.java
new file mode 100644
index 0000000..8bd0ba4
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/ElectricLoadMapper.java
@@ -0,0 +1,14 @@
+package com.zhitan.energyMonitor.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhitan.energyMonitor.domain.ElectricLoadEntity;
+
+/**
+ * @Description: sensor_alarm_item
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+public interface ElectricLoadMapper extends BaseMapper<ElectricLoadEntity> {
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java
new file mode 100644
index 0000000..9b32577
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java
@@ -0,0 +1,26 @@
+package com.zhitan.energyMonitor.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhitan.energyMonitor.domain.ElectricLoadEntity;
+import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO;
+import com.zhitan.model.domain.EnergyIndex;
+
+/**
+ * @Description:
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+public interface IElectricLoadService extends IService<ElectricLoadEntity> {
+
+    /**
+     * 鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁
+     *
+     * @param timeType
+     * @param timeCode
+     * @param energyIndex
+     * @return
+     */
+    ListElectricLoadVO list(String timeType, String timeCode, EnergyIndex energyIndex, EnergyUnitToDevice energyUnitToDevice);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java
new file mode 100644
index 0000000..2eb8560
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java
@@ -0,0 +1,268 @@
+package com.zhitan.energyMonitor.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.enums.CollectionModes;
+import com.zhitan.common.enums.GroupTimeType;
+import com.zhitan.common.utils.ChartUtils;
+import com.zhitan.common.utils.DateTimeUtil;
+import com.zhitan.common.utils.DoubleUtil;
+import com.zhitan.common.utils.StringUtil;
+import com.zhitan.energyMonitor.domain.ElectricLoadEntity;
+import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadDetail;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadItem;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO;
+import com.zhitan.energyMonitor.mapper.ElectricLoadMapper;
+import com.zhitan.energyMonitor.service.IElectricLoadService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.realtimedata.domain.TagValue;
+import com.zhitan.realtimedata.service.RealtimeDatabaseService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: sensor_alarm_item
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+@Service
+public class ElectricLoadServiceImpl extends ServiceImpl<ElectricLoadMapper, ElectricLoadEntity> implements IElectricLoadService {
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+    @Override
+    public ListElectricLoadVO list(String timeType, String timeCode, EnergyIndex energyIndex, EnergyUnitToDevice energyUnitToDevice) {
+        ListElectricLoadVO vo = new ListElectricLoadVO();
+        List<ListElectricLoadItem> itemList = new ArrayList<>();
+        vo.setItemList(itemList);
+        ListElectricLoadDetail detail = new ListElectricLoadDetail();
+        detail.setMaxTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMinTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setAvg(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setRate(CommonConst.DOUBLE_MINUS_SIGN);
+        vo.setDetail(detail);
+        if (ObjectUtil.isEmpty(energyIndex) || ObjectUtil.isEmpty(energyUnitToDevice)) {
+            return vo;
+        }
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(timeType, timeCode, dateList);
+        // 鍥犱负influxdb娌℃湁鎸夌収鏈堝垎缁勫彇鏁版嵁锛屽彧鑳芥寜鐓ф棩鏈熷惊鐜彇鏁版嵁
+        if (TimeTypeConst.TIME_TYPE_YEAR.equals(timeType)) {
+            getYearData(timeType, dateList, energyIndex, energyUnitToDevice, detail, itemList);
+        } else {
+            getDayAndMonthData(timeType, timeCode, energyIndex, energyUnitToDevice, detail, itemList);
+        }
+        if (!StringUtil.isEmptyOrNull(energyIndex.getCode())) {
+            Date start = ChartUtils.getDateTime(timeType, timeCode);
+            Date end = ChartUtils.getEndTime(timeType, start);
+
+            String code = energyIndex.getCode();
+            TagValue maxTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.max);
+            TagValue minTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.min);
+            TagValue avgTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.mean);
+
+            double avg = CommonConst.DIGIT_DOUBLE_0;
+            if (!ObjectUtil.isEmpty(avgTagValueModel) && !ObjectUtil.isEmpty(avgTagValueModel.getValue())) {
+                detail.setAvg(DoubleUtil.formatDoubleToStr(avgTagValueModel.getValue()) + CommonConst.ELECTRIC_LOAD_UNIT);
+                avg = avgTagValueModel.getValue();
+            }
+
+            if (!ObjectUtil.isEmpty(maxTagValueModel) && !ObjectUtil.isEmpty(maxTagValueModel.getValue())) {
+                detail.setMax(DoubleUtil.formatDoubleToStr(maxTagValueModel.getValue()));
+                detail.setMaxTime(DateTimeUtil.getDateTime(maxTagValueModel.getDataTime(), DateTimeUtil.COMMON_PATTERN));
+
+                if (maxTagValueModel.getValue() != CommonConst.DIGIT_DOUBLE_0) {
+                    double rate = avg * CommonConst.DIGIT_DOUBLE_100 / maxTagValueModel.getValue();
+                    detail.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT);
+                }
+            }
+
+            if (!ObjectUtil.isEmpty(minTagValueModel) && !ObjectUtil.isEmpty(minTagValueModel.getValue())) {
+                detail.setMin(DoubleUtil.formatDoubleToStr(minTagValueModel.getValue()));
+                detail.setMinTime(DateTimeUtil.getDateTime(minTagValueModel.getDataTime(), DateTimeUtil.COMMON_PATTERN));
+            }
+
+            if (!CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMax())) {
+                String m = detail.getMax();
+                detail.setMax(m + CommonConst.ELECTRIC_LOAD_UNIT);
+            }
+            if (!CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMin())) {
+                String min = detail.getMin();
+                detail.setMin(min + CommonConst.ELECTRIC_LOAD_UNIT);
+            }
+            if (CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMax())) {
+                detail.setAvg(CommonConst.DOUBLE_MINUS_SIGN);
+            }
+        }
+
+        return vo;
+    }
+
+    /**
+     * 鑾峰彇鏈堝拰澶╂暟鎹�,鍥犱负influxdb鍙互鎸夌収鍒嗐�傛椂銆傚ぉ鍒嗙粍鍙栨暟锛屼笉鍙互鎸夌収鏈堝垎缁勫彇鏁帮紝鎵�浠ュ垎鎴愪袱涓柟娉曟潵鍐�
+     *
+     * @param timeType
+     * @param timeCode
+     * @param energyIndex
+     * @param energyUnitToDevice
+     * @param detail
+     * @param itemList
+     */
+    private void getDayAndMonthData(String timeType, String timeCode, EnergyIndex energyIndex, EnergyUnitToDevice energyUnitToDevice, ListElectricLoadDetail detail, List<ListElectricLoadItem> itemList) {
+        String tagCodes = energyIndex.getCode();
+        List<TagValue> maxList = new ArrayList<>();
+        List<TagValue> minList = new ArrayList<>();
+        List<TagValue> avgList = new ArrayList<>();
+        if (TimeTypeConst.TIME_TYPE_DAY.equals(timeType)) {
+        } else {
+            String tempTimeCode = StringUtil.ifEmptyOrNullReturnValue(timeCode).replace(CommonConst.SINGLE_MINUS_SIGN, CommonConst.EMPTY);
+            Date start = DateTimeUtil.toDateTime(tempTimeCode, DateTimeUtil.COMMON_PATTERN_MONTH);
+            Date end = DateTimeUtil.addMonths(start, CommonConst.DIGIT_1);
+            if (!StringUtil.isEmptyOrNull(tagCodes)) {
+                maxList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.max, GroupTimeType.d);
+                minList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.min, GroupTimeType.d);
+                avgList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.mean, GroupTimeType.d);
+            }
+        }
+        if (CollectionUtils.isEmpty(maxList)) {
+            maxList = new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(minList)) {
+            minList = new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(avgList)) {
+            avgList = new ArrayList<>();
+        }
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(timeType, timeCode, dateList);
+        Date now = new Date();
+        Date temNow = now;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_HOUR, now);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_DAY, now);
+                break;
+            default:
+                break;
+        }
+        for (Date date : dateList) {
+            ListElectricLoadItem temp = new ListElectricLoadItem();
+            temp.setTimeCode(ChartUtils.getTimeCode(timeType, date));
+            temp.setName(ObjectUtils.isNotEmpty(energyUnitToDevice) ? energyUnitToDevice.getName() : "");
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setAvg(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date));
+            temp.setRate(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValue(CommonConst.DOUBLE_MINUS_SIGN);
+            itemList.add(temp);
+            // 濡傛灉澶т簬褰撳墠鏃堕棿榛樿--
+            if (DateTimeUtil.compareDateDiff(date, temNow) > CommonConst.DIGIT_0) {
+                continue;
+            }
+            //澶╃殑鍒ゆ柇
+            if (TimeTypeConst.TIME_TYPE_DAY.equals(timeType)) {
+                // 鐢变簬瀹炴椂搴撹繑鍥炵殑鏃堕棿瀵瑰簲鍊间唬琛ㄧ殑鏄墠涓�涓懆鏈熺殑鍊�
+                Date nextHour = DateTimeUtil.addHours(date, CommonConst.DIGIT_1);
+                if (!StringUtil.isEmptyOrNull(energyIndex.getCode())) {
+                    TagValue tagValue = realtimeDatabaseService.retrieve(energyIndex.getCode(), nextHour);
+                    if (!ObjectUtil.isEmpty(tagValue)) {
+                        if (ObjectUtils.isEmpty(tagValue) || ObjectUtils.isEmpty(tagValue.getValue())) {
+                            temp.setValue(CommonConst.DOUBLE_MINUS_SIGN);
+                        } else {
+                            temp.setValue(String.valueOf(DoubleUtil.formatDouble(tagValue.getValue())));
+                        }
+                    }
+                }
+            } else {
+                //鏈堢殑鍒ゆ柇锛岀敱浜庡疄鏃跺簱杩斿洖鐨勬椂闂村搴斿�间唬琛ㄧ殑鏄墠涓�涓懆鏈熺殑鍊�
+                Date nextDay = DateTimeUtil.addDays(date, CommonConst.DIGIT_1);
+                TagValue tagValueMonth = maxList.stream().filter(x -> (new DateTime(x.getDataTime())).withTimeAtStartOfDay().toDate().equals(nextDay)).findAny().orElse(null);
+                if (!ObjectUtil.isEmpty(tagValueMonth)) {
+                    //鏈堢殑鎵惧ぉ
+                    TagValue minModel = minList.stream().filter(x -> x.getDataTime().equals(tagValueMonth.getDataTime())).findAny().orElse(null);
+                    if (!ObjectUtil.isEmpty(minModel)) {
+                        temp.setMin(String.valueOf(DoubleUtil.formatDouble(minModel.getValue())));
+                    }
+                    TagValue avgModel = avgList.stream().filter(x -> x.getDataTime().equals(tagValueMonth.getDataTime())).findAny().orElse(null);
+                    if (!ObjectUtil.isEmpty(avgModel)) {
+                        temp.setAvg(String.valueOf(DoubleUtil.formatDouble(avgModel.getValue())));
+                    }
+                    temp.setMax(String.valueOf(DoubleUtil.formatDouble(tagValueMonth.getValue())));
+
+                    temp.setRate(CommonConst.DOUBLE_MINUS_SIGN);
+                    if (Double.parseDouble(temp.getMax()) != CommonConst.DIGIT_DOUBLE_0) {
+                        double rate = Double.parseDouble(temp.getAvg()) * 100 / Double.parseDouble(temp.getMax());
+                        temp.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇骞存暟鎹�
+     *
+     * @param timeType
+     * @param dateList
+     * @param energyIndex
+     * @param energyUnitToDevice
+     * @param detail
+     * @param itemList
+     */
+    private void getYearData(String timeType, List<Date> dateList, EnergyIndex energyIndex, EnergyUnitToDevice energyUnitToDevice, ListElectricLoadDetail detail, List<ListElectricLoadItem> itemList) {
+        String tagCode = StringUtil.ifEmptyOrNullReturnValue(energyIndex.getCode());
+        for (Date date : dateList) {
+            ListElectricLoadItem temp = new ListElectricLoadItem();
+            Date endTime = DateTimeUtil.addMonths(date, CommonConst.DIGIT_1);
+            temp.setAvg(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            if (!StringUtil.isEmptyOrNull(tagCode)) {
+                String code = energyIndex.getCode();
+                TagValue rt3 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.max);
+                TagValue rt4 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.min);
+                TagValue rt2 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.mean);
+                if (ObjectUtils.isNotEmpty(rt2.getValue())) {
+                    temp.setAvg(String.valueOf(DoubleUtil.formatDouble(rt2.getValue())));
+                }
+                if (ObjectUtils.isNotEmpty(rt3.getValue())) {
+                    temp.setMax(String.valueOf(DoubleUtil.formatDouble(rt3.getValue())));
+                }
+                if (ObjectUtils.isNotEmpty(rt4.getValue())) {
+                    temp.setMin(String.valueOf(DoubleUtil.formatDouble(rt4.getValue())));
+                }
+            }
+
+            temp.setTimeCode(ChartUtils.getTimeCode(timeType, date));
+            temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date));
+            temp.setName(StringUtil.ifEmptyOrNullReturnValue(energyUnitToDevice.getName()));
+            temp.setRate(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValue(CommonConst.DOUBLE_MINUS_SIGN);
+            if (!temp.getMax().equals(CommonConst.DOUBLE_MINUS_SIGN) && Double.parseDouble(temp.getMax()) != CommonConst.DIGIT_DOUBLE_0) {
+                double rate = Double.parseDouble(temp.getAvg()) * 100 / Double.parseDouble(temp.getMax());
+                temp.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT);
+            }
+            itemList.add(temp);
+        }
+    }
+
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java b/zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java
index aa59f95..140689e 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java
@@ -81,12 +81,40 @@
 
   @ApiModelProperty(value = "")
   private String equipment;
+
   @ApiModelProperty(value = "id")
   private String energyId;
+
+  /**
+   * 鐢ㄨ兘鍗曞厓id
+   */
+  private String energyUnitId;
+
+  /**
+   * 鍗曞厓鍒拌澶囩殑id
+   */
+  private String energyUnitToDeviceId;
 
   @Transient
   @TableField(exist = false)
   private  String meterName;
+
+  public String getEnergyUnitId() {
+    return energyUnitId;
+  }
+
+  public String getEnergyUnitToDeviceId() {
+    return energyUnitToDeviceId;
+  }
+
+  public void setEnergyUnitId(String energyUnitId) {
+    this.energyUnitId = energyUnitId;
+  }
+
+  public void setEnergyUnitToDeviceId(String energyUnitToDeviceId) {
+    this.energyUnitToDeviceId = energyUnitToDeviceId;
+  }
+
   public void setIndexId(String indexId) {
     this.indexId = indexId;
   }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java b/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
index 6807f7e..ad2d221 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java
@@ -116,4 +116,14 @@
                                       String name,Long pageNum, Long pageSize);
 
   List<EnergyIndex> getIndexByCode(String code,String nodeId);
+
+  /**
+   * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+   *
+   * @param energyUnitId 鐢ㄨ兘鍗曞厓id
+   * @param meterId      璁惧id
+   * @param indexCode    鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+   * @return
+   */
+  EnergyIndex getDeviceIndexByCode(String energyUnitId, String meterId, String indexCode);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
index 2bb7ff0..8269d9d 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java
@@ -1,6 +1,7 @@
 package com.zhitan.model.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zhitan.basicdata.domain.MeterImplement;
 import com.zhitan.basicdata.services.IMeterImplementService;
@@ -17,6 +18,7 @@
 import com.zhitan.model.service.IEnergyIndexService;
 import com.zhitan.model.service.IModelNodeService;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -315,4 +317,38 @@
 
     return energyIndexList;
   }
+
+  /**
+   * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+   *
+   * @param energyUnitId 鐢ㄨ兘鍗曞厓id
+   * @param meterId      璁惧id
+   * @param indexCode    鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+   * @return
+   */
+  @Override
+  public EnergyIndex getDeviceIndexByCode(String energyUnitId, String meterId, String indexCode) {
+
+    List<EnergyIndex> energyIndexList = listDeviceIndexByCode(energyUnitId, meterId, indexCode);
+    EnergyIndex energyIndex = energyIndexList.stream().findFirst().orElse(null);
+    if (ObjectUtils.isEmpty(energyIndex)) {
+      energyIndex = new EnergyIndex();
+    }
+    return energyIndex;
+  }
+
+  /**
+   * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+   *
+   * @param energyUnitId 鐢ㄨ兘鍗曞厓id
+   * @param meterId      璁惧id
+   * @param indexCode    鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+   * @return
+   */
+  public List<EnergyIndex> listDeviceIndexByCode(String energyUnitId, String meterId, String indexCode) {
+    return energyIndexMapper.selectList(Wrappers.<EnergyIndex>lambdaQuery()
+            .eq(EnergyIndex::getEnergyUnitId, energyUnitId)
+            .eq(EnergyIndex::getEnergyUnitToDeviceId, meterId)
+            .like(EnergyIndex::getCode, indexCode));
+  }
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java b/zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java
index dc45bc7..0f32c0f 100644
--- a/zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java
+++ b/zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java
@@ -2,6 +2,7 @@
 
 
 import com.zhitan.common.enums.CollectionModes;
+import com.zhitan.common.enums.GroupTimeType;
 import com.zhitan.common.enums.RetrievalModes;
 import com.zhitan.realtimedata.domain.TagValue;
 
@@ -94,6 +95,18 @@
                               CollectionModes collectionModes);
 
     /**
+     * 鑾峰彇娴嬬偣鍦ㄤ竴娈垫椂闂村唴鎸夌収鏌愪竴鏃堕棿鍛ㄦ湡鐨勭粺璁℃暟鎹�.
+     *
+     * @param tagCodes  娴嬬偣缂栧彿闆嗗悎
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   缁撴潫鏃堕棿,鍖呮嫭缁撴潫鏃堕棿
+     * @param modes 缁熻绫诲瀷
+     * @param timeType  鍒嗙粍鏃堕棿鍛ㄦ湡锛堝垎銆佹椂銆佸ぉ锛�
+     * @return 娴嬬偣缁熻缁撴灉
+     */
+    List<TagValue> statistics(String tagCodes, Date beginTime, Date endTime, CollectionModes modes, GroupTimeType timeType);
+
+    /**
      * 瀛樺偍娴嬬偣鐨勫疄鏃舵暟鎹�.
      *
      * @param tagValues 娴嬬偣瀹炴椂鏁版嵁
diff --git a/zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java
index 7128652..9e16113 100644
--- a/zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java
@@ -1,7 +1,10 @@
 package com.zhitan.realtimedata.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.google.common.collect.Lists;
 import com.zhitan.common.enums.CollectionModes;
+import com.zhitan.common.enums.GroupTimeType;
 import com.zhitan.common.enums.RetrievalModes;
 import com.zhitan.realtimedata.data.RealtimeDatabaseManager;
 import com.zhitan.realtimedata.data.influxdb.InfluxDBRepository;
@@ -10,9 +13,7 @@
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 瀹炴椂鏁版嵁搴撳彇鏁版湇鍔″疄鐜扮被.
@@ -131,6 +132,20 @@
         return repository.statistics(tagCodes, beginTime, endTime, collectionModes);
     }
 
+    @Override
+    public List<TagValue> statistics(String tagCodes, Date beginTime, Date endTime, CollectionModes modes, GroupTimeType timeType) {
+        try {
+            List<String> tagCodeList = Arrays.asList(tagCodes.split(StrUtil.COMMA).clone());
+            List<TagValue> tagValues = repository.statistics(tagCodeList, beginTime, endTime, modes, timeType);
+            if (ObjectUtil.isEmpty(tagValues)) {
+                tagValues = new ArrayList<>();
+            }
+            return tagValues;
+        } catch (Exception e) {
+            return new ArrayList<>();
+        }
+    }
+
     /**
      * 瀛樺偍娴嬬偣鐨勫疄鏃舵暟鎹�.
      *
diff --git a/zhitan-system/src/main/resources/mapper/energyMonitor/ElectricLoadMapper.xml b/zhitan-system/src/main/resources/mapper/energyMonitor/ElectricLoadMapper.xml
new file mode 100644
index 0000000..fa624b8
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/energyMonitor/ElectricLoadMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhitan.energyMonitor.mapper.ElectricLoadMapper">
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3