From 8a6c688d9fc28cfd7647105536fd35374d8d0f0c Mon Sep 17 00:00:00 2001
From: zhitan-cloud <394600+ustcyc@user.noreply.gitee.com>
Date: 星期三, 12 二月 2025 05:20:31 +0800
Subject: [PATCH] !63 !62 综合能耗日月年 Merge pull request !63 from letsgocoding/develop1.0

---
 zhitan-system/src/main/java/com/zhitan/model/service/impl/EnergyIndexServiceImpl.java                            |  567 +-
 zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricLoadController.java                   |   29 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadDetail.java                       |   36 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java             |  413 ++
 zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java             |   64 
 zhitan-common/src/main/java/com/zhitan/common/utils/DoubleUtil.java                                              |  103 
 zhitan-vue/public/logo.png                                                                                       |    0 
 zhitan-vue/src/views/alarmmanage/measuremen/measuremen.vue                                                       |  417 +-
 zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java                        |   77 
 zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java                                         |   19 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java                         |   23 
 zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java                            |  150 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java                  |   44 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricPowerFactorServiceImpl.java            |  115 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java                           |   68 
 zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/YearComprehensiveController.java    |  161 
 zhitan-vue/src/views/index.vue                                                                                   |    4 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/YearComprehensiveServiceImpl.java    |   68 
 zhitan-vue/src/views/realtimemonitor/realtimemonitor/components/chart-modal.vue                                  |  286 
 zhitan-vue/src/views/svg/equipmentfile/chartView.vue                                                             |  314 +
 zhitan-vue/package.json                                                                                          |    2 
 zhitan-vue/src/api/svg/equipmentfile.js                                                                          |   40 
 zhitan-vue/src/views/login.vue                                                                                   |   38 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java                     |   20 
 zhitan-vue/src/api/comprehensiveStatistics/processEnergyConsumption.js                                           |   19 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java                     |   55 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/MonthlyComprehensive.java                  |  415 ++
 zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java                                    |   10 
 zhitan-vue/src/utils/ruoyi.js                                                                                    |  207 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java                       |   34 
 zhitan-common/src/main/java/com/zhitan/common/utils/ChartUtils.java                                              |  177 
 zhitan-admin/src/main/java/com/zhitan/web/controller/common/CommonController.java                                |   30 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java                           |   18 
 zhitan-system/src/main/resources/mapper/comprehensivestatistics/DailyComprehensiveMapper.xml                     |    4 
 zhitan-system/src/main/java/com/zhitan/model/service/IEnergyIndexService.java                                    |  174 
 zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java                                  |   32 
 zhitan-vue/src/views/carbonemission/carbonEmission.vue                                                           |  268 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/YearComprehensiveMapper.java               |   51 
 zhitan-vue/src/views/comprehensive/yearComprehensive/index.vue                                                   |  245 +
 zhitan-vue/src/components/FileUpload/index.vue                                                                   |   12 
 zhitan-system/src/main/resources/mapper/comprehensivestatistics/MonthlyComprehensiveMapper.xml                   |  101 
 zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml                                                |  103 
 zhitan-vue/index.html                                                                                            |  385 +-
 zhitan-vue/src/views/comprehensive/dailyComprehensive/index.vue                                                  |  245 +
 zhitan-vue/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js                          |   17 
 zhitan-vue/src/views/comprehensive/comps/LineChart.vue                                                           |  173 
 zhitan-vue/src/views/svg/components/configure.vue                                                                |  204 +
 zhitan-common/src/main/java/com/zhitan/common/utils/StringUtil.java                                              |   70 
 zhitan-system/src/main/java/com/zhitan/model/domain/EnergyIndex.java                                             |    3 
 zhitan-vue/src/assets/images/login-background.jpg                                                                |    0 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/DailyComprehensiveMapper.java              |    2 
 zhitan-vue/src/views/svg/components/configureView.vue                                                            |  124 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java                       |   44 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexInforModel.java                        |   33 
 zhitan-system/src/main/resources/mapper/comprehensivestatistics/YearComprehensiveMapper.xml                      |   81 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadVO.java                           |   23 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java                         |   60 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/ImonthlyComprehensive.java                |   41 
 zhitan-common/src/main/java/com/zhitan/common/utils/DateTimeUtil.java                                            |  748 ++++
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ListElectricLoadItem.java                         |   44 
 zhitan-admin/src/main/resources/application.yml                                                                  |    2 
 zhitan-admin/src/main/java/com/zhitan/web/controller/keyequipment/YearKeyEquipmentController.java                |    9 
 zhitan-vue/src/assets/styles/ruoyi.scss                                                                          |    7 
 zhitan-system/src/main/java/com/zhitan/realtimedata/service/impl/RealtimeDatabaseServiceImpl.java                |   21 
 zhitan-vue/src/views/comprehensive/monthlyComprehensive/index.vue                                                |  241 +
 zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java                                       |    3 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorItem.java                      |   20 
 zhitan-admin/src/main/java/com/zhitan/web/controller/peakvalley/PeakValleyController.java                        |    2 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/DailyReport.java                           |  321 +
 zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java                                               |   26 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java                   |  258 +
 zhitan-vue/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js                                |   17 
 zhitan-vue/src/views/peakvalley/timeSharing/timeSharing.vue                                                      |  329 -
 zhitan-vue/src/views/svg/equipmentfile/index.vue                                                                 |  243 +
 zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java                                         |   15 
 zhitan-system/src/main/java/com/zhitan/peakvalley/service/IPeakValleyService.java                                |    5 
 zhitan-vue/src/api/comprehensiveStatistics/comprehensive.js                                                      |   70 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/IyearComprehensive.java                   |   42 
 zhitan-common/src/main/java/com/zhitan/common/utils/IntegerUtil.java                                             |   40 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorVO.java                        |   23 
 zhitan-system/src/main/java/com/zhitan/home/service/HomePageServiceImpl.java                                     |    5 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/MonthlyComprehensiveMapper.java            |   51 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorDetail.java                    |   33 
 zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricPowerFactorController.java            |   55 
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/MonthlyComprehensiveServiceImpl.java |   42 
 zhitan-vue/src/views/alarmmanage/energyconsumption/energyConsumption.vue                                         |  415 +-
 zhitan-vue/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js                              |   26 
 zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/MonthlyComprehensiveController.java |  205 +
 zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml                                                |   10 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricPowerFactorService.java                    |   19 
 zhitan-vue/src/views/peakvalley/period/period.vue                                                                |  308 -
 zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java                                             |   14 
 /dev/null                                                                                                        |  293 -
 zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/YearComperhensive.java                     |  214 +
 zhitan-system/src/main/java/com/zhitan/realtimedata/service/RealtimeDatabaseService.java                         |   13 
 zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/EnergyIndexAndUnitDevice.java                     |   20 
 zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java           |   39 
 97 files changed, 8,566 insertions(+), 2,200 deletions(-)

diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/common/CommonController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/common/CommonController.java
index 7eb390d..c00de71 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/common/CommonController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/common/CommonController.java
@@ -1,10 +1,12 @@
 package com.zhitan.web.controller.common;
 
-import java.util.ArrayList;
-import java.util.List;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import com.zhitan.common.config.BaseConfig;
+import com.zhitan.common.constant.Constants;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.common.utils.StringUtils;
+import com.zhitan.common.utils.file.FileUploadUtils;
+import com.zhitan.common.utils.file.FileUtils;
+import com.zhitan.framework.config.ServerConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.MediaType;
@@ -13,13 +15,12 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import com.zhitan.common.config.BaseConfig;
-import com.zhitan.common.constant.Constants;
-import com.zhitan.common.core.domain.AjaxResult;
-import com.zhitan.common.utils.StringUtils;
-import com.zhitan.common.utils.file.FileUploadUtils;
-import com.zhitan.common.utils.file.FileUtils;
-import com.zhitan.framework.config.ServerConfig;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 閫氱敤璇锋眰澶勭悊
@@ -36,6 +37,9 @@
     private ServerConfig serverConfig;
 
     private static final String FILE_DELIMETER = ",";
+
+    @Resource
+    private BaseConfig baseConfig;
 
     /**
      * 閫氱敤涓嬭浇璇锋眰
@@ -81,7 +85,7 @@
             String filePath = BaseConfig.getUploadPath();
             // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О
             String fileName = FileUploadUtils.upload(filePath, file);
-            String url = serverConfig.getUrl() + fileName;
+            String url = baseConfig.getDomainName() + fileName;
             AjaxResult ajax = AjaxResult.success();
             ajax.put("url", url);
             ajax.put("fileName", fileName);
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/MonthlyComprehensiveController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/MonthlyComprehensiveController.java
new file mode 100644
index 0000000..8e41cf7
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/MonthlyComprehensiveController.java
@@ -0,0 +1,205 @@
+package com.zhitan.web.controller.comprehensivestatistics;
+
+import com.zhitan.common.core.controller.BaseController;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.common.utils.poi.ExcelUtil;
+import com.zhitan.comprehensivestatistics.domain.MonthlyComprehensive;
+import com.zhitan.comprehensivestatistics.service.ImonthlyComprehensive;
+import com.zhitan.model.domain.ModelNode;
+import com.zhitan.model.service.IModelNodeService;
+import com.zhitan.realtimedata.domain.DataItem;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@Slf4j
+@RestController
+@RequestMapping("/comprehensive/monthlyComprehensive")
+@Api(value = "缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛塩ontroller",tags = {"缁煎悎鎸囨爣鍒嗘瀽"})
+public class MonthlyComprehensiveController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private ImonthlyComprehensive monthlyComprehensive;
+
+    /*鍏ㄥ巶鑳借�楃粺璁�*/
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛夊垪琛�")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            List<MonthlyComprehensive> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2))) {
+                if (i > 9) {
+                    bb = aa + "-" + i + " 00:00:00";
+                } else {
+                    bb = aa + "-0" + i + " 00:00:00";
+                }
+                MonthlyComprehensive report = new MonthlyComprehensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                tableColumn.put("value" + i, String.valueOf(i) + "鏃�");
+                i++;
+            }
+
+            MonthlyComprehensive reportList = new MonthlyComprehensive();
+            List<Map> table = new ArrayList<>();
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success(reportList);
+            }
+            List<MonthlyComprehensive> list = monthlyComprehensive.getMonthlyComprehensiveList(modelNode.getNodeId(),
+                    dataList, dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(), dataItem.getIndexStorageId());
+            int count = Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            reportList.setTabledata(list);
+
+            return AjaxResult.success(reportList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+/**/
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+     */
+    @GetMapping("/listChart")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堟湀锛夋暟鎹�")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String beginTime=aa+"-01 00:00:00";
+        dataItem.setBeginTime(sf.parse(beginTime));
+        String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<MonthlyComprehensive> list = monthlyComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+    /*缁煎悎鏈堟姤琛ㄥ鍑�*/
+//    @Log(title = "缁煎悎鏈堟姤琛ㄥ鍑�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "缁煎悎鏈堟姤琛ㄥ鍑�")
+    public AjaxResult export(DataItem dataItem) {
+        try {
+
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            List<MonthlyComprehensive> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2))) {
+                if (i > 9) {
+                    bb = aa + "-" + i + " 00:00:00";
+                } else {
+                    bb = aa + "-0" + i + " 00:00:00";
+                }
+                MonthlyComprehensive report = new MonthlyComprehensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                tableColumn.put("value" + i, i + "鏃�");
+                i++;
+            }
+
+            MonthlyComprehensive reportList = new MonthlyComprehensive();
+            List<Map> table = new ArrayList<>();
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success(reportList);
+            }
+            List<MonthlyComprehensive> list = monthlyComprehensive.getMonthlyComprehensiveList(modelNode.getNodeId(), dataList,
+                    dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(), dataItem.getIndexStorageId());
+            int count = Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            if (CollectionUtils.isNotEmpty(list)) {
+                list.forEach(this::valueRep);
+            }
+            ExcelUtil<MonthlyComprehensive> util = new ExcelUtil<>(MonthlyComprehensive.class);
+            return util.exportExcel(list, "缁煎悎鎸囨爣鍒嗘瀽鏈�");
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    public void valueRep(Object dr){
+        Field[] fields = dr.getClass().getDeclaredFields();
+        for(Field field:fields){
+            field.setAccessible(true);
+            Object obj = field.getType();
+            if(field.getType().getName().equals("java.lang.Double")){
+                String name = field.getName();
+                try {
+                    if(ObjectUtils.isEmpty(field.get(dr)))
+                    {
+                        field.set(dr,0.00);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/YearComprehensiveController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/YearComprehensiveController.java
new file mode 100644
index 0000000..fc5a46c
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/comprehensivestatistics/YearComprehensiveController.java
@@ -0,0 +1,161 @@
+package com.zhitan.web.controller.comprehensivestatistics;
+
+import cn.hutool.core.date.DateUtil;
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.controller.BaseController;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.common.enums.BusinessType;
+import com.zhitan.common.utils.poi.ExcelUtil;
+import com.zhitan.comprehensivestatistics.domain.YearComperhensive;
+import com.zhitan.comprehensivestatistics.service.IyearComprehensive;
+import com.zhitan.model.domain.ModelNode;
+import com.zhitan.model.service.IModelNodeService;
+import com.zhitan.realtimedata.domain.DataItem;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/comprehensive/yearComprehensive")
+@Api(value = "缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛塩ontroller",tags = {"缁煎悎鎸囨爣鍒嗘瀽"})
+public class YearComprehensiveController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IyearComprehensive yearComprehensive;
+
+    /*鍏ㄥ巶鑳借�楃粺璁�*/
+    @GetMapping("/list")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛夊垪琛�")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            List<YearComperhensive> dataList = new ArrayList<>();
+
+            dataItem.setBeginTime(DateUtil.beginOfYear(dataItem.getDataTime()));
+            dataItem.setEndTime(DateUtil.endOfYear(dataItem.getDataTime()));
+
+            DateFormat df = new SimpleDateFormat("yyyy");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa = df.format(dataItem.getDataTime());
+            String bb = "";
+            int i = 1;
+            while (i <= 12) {
+                if(i > 9){
+                    bb = aa + "-" + i + "-01 00:00:00";
+                }else{
+                    bb = aa + "-0" + i + "-01 00:00:00";
+                }
+                YearComperhensive report = new YearComperhensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                i++;
+            }
+            List<YearComperhensive> list = yearComprehensive.getYearComprehensiveList(modelNode.getNodeId(),
+                    dataList,dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+     */
+    @GetMapping("/listChart")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堝勾锛夋暟鎹�")
+    public AjaxResult listChart(DataItem dataItem){
+
+        dataItem.setBeginTime(DateUtil.beginOfYear(dataItem.getDataTime()));
+        dataItem.setEndTime(DateUtil.endOfYear(dataItem.getDataTime()));
+
+        List<YearComperhensive> list = yearComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 瀵煎嚭宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @Log(title = "缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "缁煎悎骞存姤琛ㄥ鍑�")
+    public AjaxResult export(DataItem dataItem) {
+        try {
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            List<YearComperhensive> dataList = new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa = df.format(dataItem.getBeginTime());
+            String bb = "";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                YearComperhensive report=new YearComperhensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+            List<YearComperhensive> list = yearComprehensive.getYearComprehensiveList(modelNode.getNodeId(),
+                    dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            if(CollectionUtils.isNotEmpty(list)){
+                list.forEach(this::valueRep);
+            }
+            ExcelUtil<YearComperhensive> util = new ExcelUtil<>(YearComperhensive.class);
+            return util.exportExcel(list, "缁煎悎鎸囨爣鍒嗘瀽骞�");
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    public void valueRep(Object dr){
+        Field[] fields = dr.getClass().getDeclaredFields();
+        for(Field field:fields){
+            field.setAccessible(true);
+            Object obj = field.getType();
+            if(field.getType().getName().equals("java.lang.Double")){
+                String name = field.getName();
+                try {
+                    if(ObjectUtils.isEmpty(field.get(dr)))
+                    {
+                        field.set(dr,0.00);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+}
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..b20411c 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,12 @@
 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.service.IEnergyUnitToDeviceService;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO;
+import com.zhitan.energyMonitor.service.IElectricLoadService;
+import com.zhitan.model.domain.EnergyIndex;
 import com.zhitan.model.service.IEnergyIndexService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -26,33 +29,29 @@
 @Slf4j
 public class ElectricLoadController extends BaseController {
     @Autowired
-    private IEnergyUnitToDeviceService energyUnitToDeviceService;
-//    @Autowired
-//    private IElectricLoadService electricLoadService;
+    private IElectricLoadService electricLoadService;
     @Autowired
     private IEnergyIndexService energyIndexService;
 
     /**
      * 鏍规嵁鐢佃〃id鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁
      *
-     * @param energyUnitId 鐢ㄨ兘鍗曞厓id
-     * @param meterId      鐢佃〃id
-     * @param timeType     鏃堕棿绫诲瀷 DAY/MONTH/YEAR
-     * @param timeCode     鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
-     * @return
+     * @param nodeId   鐢ㄨ兘鍗曞厓id
+     * @param meterId  鐢佃〃id
+     * @param timeType 鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+     * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
      */
     @Log(title = "鏍规嵁鐢佃〃id鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁")
     @ApiOperation(value = "鏍规嵁鐢佃〃id鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁", notes = "鏍规嵁鐢佃〃id鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁")
     @GetMapping(value = "/detail")
-    public AjaxResult list(@RequestParam(name = "energyUnitId") String energyUnitId,
+    public AjaxResult list(@RequestParam(name = "nodeId") String nodeId,
                            @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(nodeId, meterId, CommonConst.TAG_CODE_ZYGGL);
+
+        ListElectricLoadVO vo = electricLoadService.list(timeType, timeCode, energyIndex);
+        return AjaxResult.success(vo);
     }
 
 }
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricPowerFactorController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricPowerFactorController.java
new file mode 100644
index 0000000..a82aeec
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricPowerFactorController.java
@@ -0,0 +1,55 @@
+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.service.IElectricPowerFactorService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.model.service.IEnergyIndexService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: 鍔熺巼鍥犳暟
+ * @Author: yxw
+ * @Date: 2022-04-24
+ * @Version: V1.2
+ */
+@Api(tags = "鍔熺巼鍥犳暟")
+@RestController
+@RequestMapping("/powerFactorAnalysis")
+@Slf4j
+public class ElectricPowerFactorController extends BaseController {
+
+    @Autowired
+    private IElectricPowerFactorService electricPowerFactorService;
+
+    @Autowired
+    private IEnergyIndexService energyIndexService;
+
+    /**
+     * 鏍规嵁鐢佃〃id鑾峰彇鍔熺巼鍥犳暟鏁版嵁
+     *
+     * @param nodeId   鑺傜偣id
+     * @param meterId  鐢佃〃id
+     * @param timeCode 鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21
+     */
+    @Log(title = "鏍规嵁鐢佃〃id鑾峰彇鍔熺巼鍥犳暟鏁版嵁")
+    @ApiOperation(value = "鏍规嵁鐢佃〃id鑾峰彇鍔熺巼鍥犳暟鏁版嵁", notes = "鏍规嵁鐢佃〃id鑾峰彇鍔熺巼鍥犳暟鏁版嵁")
+    @GetMapping(value = "/detail")
+    public AjaxResult list(@RequestParam(name = "nodeId") String nodeId,
+                           @RequestParam(name = "meterId") String meterId,
+                           @RequestParam(name = "timeCode") String timeCode) {
+        EnergyIndex energyIndex = energyIndexService.getDeviceIndexByCode(nodeId, meterId, CommonConst.TAG_CODE_GLYS);
+
+        return AjaxResult.success(electricPowerFactorService.list(timeCode, energyIndex));
+    }
+
+}
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java
new file mode 100644
index 0000000..fca2c2d
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/energyMonitor/ElectricThreePhaseController.java
@@ -0,0 +1,64 @@
+package com.zhitan.web.controller.energyMonitor;
+
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.controller.BaseController;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.energyMonitor.service.IElectricThreePhaseService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.model.service.IEnergyIndexService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Description: 涓夌浉涓嶅钩琛�
+ * @Author: yxw
+ * @Date: 2022-04-24
+ * @Version: V1.2
+ */
+@Api(tags = "涓夌浉涓嶅钩琛�")
+@RestController
+@RequestMapping("/threePhaseUnbalanceAnalysis")
+@Slf4j
+public class ElectricThreePhaseController extends BaseController {
+
+    @Autowired
+    private IElectricThreePhaseService electricThreePhaseService;
+    @Autowired
+    private IEnergyIndexService energyIndexService;
+
+    /**
+     * 鑾峰彇鐢ㄨ兘鍗曞厓涓嬬殑鏌愪釜鐢佃〃鐨勪笁鐩镐笉骞宠 鏁版嵁
+     *
+     * @param nodeId 鑺傜偣id
+     * @param meterId      鐢佃〃id
+     * @param timeType     鏃堕棿绫诲瀷 DAY/MONTH/YEAR
+     * @param timeCode     鏃堕棿鍊� 涓庢椂闂寸被鍨嬪搴旓細2022-03-21/2022-03/2022
+     * @param requestType  璇锋眰绫诲瀷锛�0.鐢靛帇锛�1.鐢垫祦
+     * @return
+     */
+    @Log(title = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�")
+    @ApiOperation(value = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�", notes = "鏍规嵁鐢佃〃id鏌ヨ涓夌浉涓嶅钩琛℃暟鎹�")
+    @GetMapping(value = "/detail")
+    public AjaxResult list(@RequestParam(name = "nodeId") String nodeId,
+                           @RequestParam(name = "meterId") String meterId,
+                           @RequestParam(name = "timeType") String timeType,
+                           @RequestParam(name = "timeCode") String timeCode,
+                           @RequestParam(name = "requestType") String requestType) {
+        if (ObjectUtils.isEmpty(meterId)){
+            return AjaxResult.error("鐢佃〃id涓嶈兘涓虹┖");
+        }
+        List<EnergyIndex> energyIndexList = energyIndexService.listDeviceIndex(nodeId, meterId);
+
+        return AjaxResult.success(electricThreePhaseService.list(timeType, timeCode, energyIndexList, requestType, meterId));
+    }
+
+}
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/keyequipment/YearKeyEquipmentController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/keyequipment/YearKeyEquipmentController.java
index 00afae6..8f0c4c5 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/keyequipment/YearKeyEquipmentController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/keyequipment/YearKeyEquipmentController.java
@@ -1,8 +1,10 @@
 package com.zhitan.web.controller.keyequipment;
 
+import cn.hutool.core.date.DateUtil;
 import com.zhitan.common.core.controller.BaseController;
 import com.zhitan.common.core.domain.AjaxResult;
 import com.zhitan.common.core.page.TableDataInfo;
+import com.zhitan.comprehensivestatistics.domain.YearComperhensive;
 import com.zhitan.keyequipment.domain.YearKeyEquipment;
 import com.zhitan.keyequipment.service.IYearKeyEquipmentService;
 import com.zhitan.model.domain.EnergyIndex;
@@ -53,9 +55,13 @@
         }
         List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
         List<YearKeyEquipment> dataList=new ArrayList<>();
+
+        dataItem.setBeginTime(DateUtil.beginOfYear(dataItem.getDataTime()));
+        dataItem.setEndTime(DateUtil.endOfYear(dataItem.getDataTime()));
+
         DateFormat df = new SimpleDateFormat("yyyy");
         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String aa= df.format(dataItem.getBeginTime());
+        String aa= df.format(dataItem.getDataTime());
         String bb="";
         int i = 1;
         while (i <= 12) {
@@ -78,6 +84,7 @@
     @GetMapping("/listChart")
     @ApiOperation(value = "閲嶇偣璁惧鑳借�楃粺璁★紙骞达級鍥捐〃")
     public AjaxResult listChart(DataItem dataItem){
+
         List<YearKeyEquipment> list = yearKeyEquipmentService.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
         return AjaxResult.success(list);
     }
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/peakvalley/PeakValleyController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/peakvalley/PeakValleyController.java
index 211ddee..bd07910 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/peakvalley/PeakValleyController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/peakvalley/PeakValleyController.java
@@ -60,8 +60,6 @@
     @ApiOperation(value = "鑾峰彇灏栧嘲骞宠胺鍒嗘椂缁熻")
     public AjaxResult segmentAnalysisDay(PeakValleyDTO dto) {
         return AjaxResult.success(rulesService.segmentAnalysisDay(dto));
-//        return AjaxResult.success(rulesService.segmentAnalysisDayCustomize(dto));
     }
-
 
 }
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
new file mode 100644
index 0000000..af79e0b
--- /dev/null
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
@@ -0,0 +1,39 @@
+package com.zhitan.web.controller.statisticalAnalysis;
+
+import com.zhitan.common.annotation.Log;
+import com.zhitan.common.core.domain.AjaxResult;
+import com.zhitan.dataitem.service.IDataItemService;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 鑳借�楃粺璁″垎鏋�
+ */
+@Api(tags = "鑳借�楃粺璁″垎鏋�")
+@RestController
+@RequestMapping("/statisticsAnalysis")
+public class EnergyDataItemController {
+
+    @Autowired
+    private IDataItemService dataItemService;
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    @Log(title = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽")
+    @ApiOperation(value = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽", notes = "鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽")
+    @GetMapping(value = "/getFlowCharts")
+    public AjaxResult getFlowCharts(@Validated FlowChartsDTO dto) {
+        return AjaxResult.success(dataItemService.getFlowCharts(dto));
+    }
+}
diff --git a/zhitan-admin/src/main/resources/application.yml b/zhitan-admin/src/main/resources/application.yml
index b766372..86eed19 100644
--- a/zhitan-admin/src/main/resources/application.yml
+++ b/zhitan-admin/src/main/resources/application.yml
@@ -11,6 +11,8 @@
   addressEnabled: true
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
+  # 鍩熷悕鍦板潃
+  domainName: https://demo-ems.zhitancloud.com/prod-api
 
 # 寮�鍙戠幆澧冮厤缃�
 server:
diff --git a/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java b/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
index c9096ba..04ee184 100644
--- a/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
+++ b/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
@@ -30,6 +30,12 @@
     /** 楠岃瘉鐮佺被鍨� */
     private static String captchaType;
 
+    /**
+     * 鏂囦欢鍦板潃鍩熷悕
+     */
+    private String domainName;
+
+
     public String getName()
     {
         return name;
@@ -123,4 +129,12 @@
     public static String getConfigurePath() {
         return getProfile() + "/configure";
     }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
 }
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/comprehensivestatistics/domain/DailyReport.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/DailyReport.java
new file mode 100644
index 0000000..4bd3d04
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/DailyReport.java
@@ -0,0 +1,321 @@
+package com.zhitan.comprehensivestatistics.domain;
+
+
+import com.zhitan.common.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+public class DailyReport implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "0鏃�")
+    private Double value0;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<DailyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue0() {
+        return value0;
+    }
+
+    public void setValue0(Double value0) {
+        this.value0 = value0;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<DailyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<DailyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/MonthlyComprehensive.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/MonthlyComprehensive.java
new file mode 100644
index 0000000..4f29498
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/MonthlyComprehensive.java
@@ -0,0 +1,415 @@
+package com.zhitan.comprehensivestatistics.domain;
+
+import com.zhitan.common.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-12-31
+ */
+public class MonthlyComprehensive implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String unitId;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "24鏃�")
+    private Double value24;
+    @Excel(name = "25鏃�")
+    private Double value25;
+    @Excel(name = "26鏃�")
+    private Double value26;
+    @Excel(name = "27鏃�")
+    private Double value27;
+    @Excel(name = "28鏃�")
+    private Double value28;
+    @Excel(name = "29鏃�")
+    private Double value29;
+    @Excel(name = "30鏃�")
+    private Double value30;
+    @Excel(name = "31鏃�")
+    private Double value31;
+    private String timeCode;
+    private Integer count;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<MonthlyComprehensive> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<MonthlyComprehensive> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<MonthlyComprehensive> tabledata) {
+        this.tabledata = tabledata;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/YearComperhensive.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/YearComperhensive.java
new file mode 100644
index 0000000..aa177cd
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/domain/YearComperhensive.java
@@ -0,0 +1,214 @@
+package com.zhitan.comprehensivestatistics.domain;
+
+import com.zhitan.common.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class YearComperhensive implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String unitId;
+    @Excel(name = "1鏈�")
+    private Double value1;
+    @Excel(name = "2鏈�")
+    private Double value2;
+    @Excel(name = "3鏈�")
+    private Double value3;
+    @Excel(name = "4鏈�")
+    private Double value4;
+    @Excel(name = "5鏈�")
+    private Double value5;
+    @Excel(name = "6鏈�")
+    private Double value6;
+    @Excel(name = "7鏈�")
+    private Double value7;
+    @Excel(name = "8鏈�")
+    private Double value8;
+    @Excel(name = "9鏈�")
+    private Double value9;
+    @Excel(name = "10鏈�")
+    private Double value10;
+    @Excel(name = "11鏈�")
+    private Double value11;
+    @Excel(name = "12鏈�")
+    private Double value12;
+    private String timeCode;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<DailyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<DailyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<DailyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/DailyComprehensiveMapper.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/DailyComprehensiveMapper.java
index 08777d9..3a4de64 100644
--- a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/DailyComprehensiveMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/DailyComprehensiveMapper.java
@@ -14,7 +14,7 @@
  * @date 2020-03-25
  */
 public interface DailyComprehensiveMapper {
-    public List<DailyComprehensive> getDailyComprehensiveList(@Param("nodeId") String nodeId,
+    List<DailyComprehensive> getDailyComprehensiveList(@Param("nodeId") String nodeId,
                                                               @Param("dataList") List<DailyComprehensive> dataList,
                                                               @Param("beginTime") Date beginTime,
                                                               @Param("endTime") Date endTime,
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/MonthlyComprehensiveMapper.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/MonthlyComprehensiveMapper.java
new file mode 100644
index 0000000..ca9a75c
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/MonthlyComprehensiveMapper.java
@@ -0,0 +1,51 @@
+package com.zhitan.comprehensivestatistics.mapper;
+
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.comprehensivestatistics.domain.MonthlyComprehensive;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface MonthlyComprehensiveMapper {
+    /**
+     * 鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛夊垪琛�
+     *
+     * @param nodeId
+     * @param dataList
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    public List<MonthlyComprehensive> getMonthlyComprehensiveList(@Param("nodeId") String nodeId,
+                                                                  @Param("dataList") List<MonthlyComprehensive> dataList,
+                                                                  @Param("beginTime") Date beginTime,
+                                                                  @Param("endTime") Date endTime,
+                                                                  @Param("timeType") TimeType timeType,
+                                                                  @Param("indexStorageId") String indexStorageId);
+
+    /**
+     * 鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堟湀锛夋暟鎹�
+     *
+     * @param indexId
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<MonthlyComprehensive> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/YearComprehensiveMapper.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/YearComprehensiveMapper.java
new file mode 100644
index 0000000..7293dd7
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/mapper/YearComprehensiveMapper.java
@@ -0,0 +1,51 @@
+package com.zhitan.comprehensivestatistics.mapper;
+
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.comprehensivestatistics.domain.YearComperhensive;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface YearComprehensiveMapper {
+    /**
+     * 鑾峰彇骞存暟鎹�
+     *
+     * @param nodeId
+     * @param dataList
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    public List<YearComperhensive> getYearComprehensiveList(@Param("nodeId") String nodeId,
+                                                            @Param("dataList") List<YearComperhensive> dataList,
+                                                            @Param("beginTime") Date beginTime,
+                                                            @Param("endTime") Date endTime,
+                                                            @Param("timeType") TimeType timeType,
+                                                            @Param("indexStorageId") String indexStorageId);
+
+    /**
+     * 鑾峰彇骞存暟鎹�-chart
+     *
+     * @param indexId
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<YearComperhensive> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/ImonthlyComprehensive.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/ImonthlyComprehensive.java
new file mode 100644
index 0000000..13221a0
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/ImonthlyComprehensive.java
@@ -0,0 +1,41 @@
+package com.zhitan.comprehensivestatistics.service;
+
+
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.comprehensivestatistics.domain.MonthlyComprehensive;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface ImonthlyComprehensive {
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+     *
+     * @param nodeId
+     * @param dataList
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<MonthlyComprehensive> getMonthlyComprehensiveList(String nodeId, List<MonthlyComprehensive> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+     *
+     * @param indexId
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<MonthlyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/IyearComprehensive.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/IyearComprehensive.java
new file mode 100644
index 0000000..2c3a979
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/IyearComprehensive.java
@@ -0,0 +1,42 @@
+package com.zhitan.comprehensivestatistics.service;
+
+
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.comprehensivestatistics.domain.YearComperhensive;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IyearComprehensive {
+    /**
+     * 鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛夊垪琛�
+     *
+     * @param nodeId
+     * @param dataList
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<YearComperhensive> getYearComprehensiveList(String nodeId, List<YearComperhensive> dataList,
+                                                            Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+
+    /**
+     * 鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛夊浘琛ㄦ暟鎹�
+     *
+     * @param indexId
+     * @param beginTime
+     * @param endTime
+     * @param timeType
+     * @param indexStorageId
+     * @return
+     */
+    List<YearComperhensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/MonthlyComprehensiveServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/MonthlyComprehensiveServiceImpl.java
new file mode 100644
index 0000000..04beef7
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/MonthlyComprehensiveServiceImpl.java
@@ -0,0 +1,42 @@
+package com.zhitan.comprehensivestatistics.service.impl;
+
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.comprehensivestatistics.domain.MonthlyComprehensive;
+import com.zhitan.comprehensivestatistics.mapper.MonthlyComprehensiveMapper;
+import com.zhitan.comprehensivestatistics.service.ImonthlyComprehensive;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class MonthlyComprehensiveServiceImpl implements ImonthlyComprehensive {
+    @Resource
+    private MonthlyComprehensiveMapper monthMapper;
+
+    public List<MonthlyComprehensive> getMonthlyComprehensiveList(String nodeId, List<MonthlyComprehensive> dataList,
+                                                                  Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return monthMapper.getMonthlyComprehensiveList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<MonthlyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return monthMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/YearComprehensiveServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/YearComprehensiveServiceImpl.java
new file mode 100644
index 0000000..df2ac97
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/comprehensivestatistics/service/impl/YearComprehensiveServiceImpl.java
@@ -0,0 +1,68 @@
+package com.zhitan.comprehensivestatistics.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.common.utils.DateTimeUtil;
+import com.zhitan.comprehensivestatistics.domain.YearComperhensive;
+import com.zhitan.comprehensivestatistics.mapper.YearComprehensiveMapper;
+import com.zhitan.comprehensivestatistics.service.IyearComprehensive;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class YearComprehensiveServiceImpl implements IyearComprehensive {
+    @Resource
+    private YearComprehensiveMapper yearMapper;
+
+    @Override
+    public List<YearComperhensive> getYearComprehensiveList(String nodeId, List<YearComperhensive> dataList,
+                                                            Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return yearMapper.getYearComprehensiveList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<YearComperhensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        List<YearComperhensive> dataList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(indexId)) {
+            List<YearComperhensive> listChart = yearMapper.getListChart(indexId, beginTime, endTime, timeType, indexStorageId);
+            if (CollectionUtils.isNotEmpty(listChart)) {
+                Date date = new Date();
+                YearComperhensive first = listChart.get(CommonConst.DIGIT_0);
+                Map<String, YearComperhensive> listChartMap = yearMapper.getListChart(indexId, beginTime, endTime, timeType, indexStorageId)
+                        .stream().collect(Collectors.toMap(YearComperhensive::getTimeCode, prot -> prot));
+                while (beginTime.before(date)) {
+                    YearComperhensive yearComperhensive = new YearComperhensive();
+                    String format = CommonConst.WORD_M + DateUtil.format(beginTime, DateTimeUtil.COMMON_PATTERN_MONTH);
+                    YearComperhensive item = listChartMap.get(format);
+                    if (ObjectUtils.isNotEmpty(item)) {
+                        yearComperhensive = item;
+                    } else {
+                        yearComperhensive.setTimeCode(format);
+                        yearComperhensive.setIndexId(indexId);
+                        yearComperhensive.setTimeType(timeType.name());
+                        yearComperhensive.setUnitId(first.getUnitId());
+                        yearComperhensive.setIndexName(first.getIndexName());
+                    }
+                    dataList.add(yearComperhensive);
+                    beginTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_1);
+                }
+            }
+        }
+        return dataList;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java b/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java
new file mode 100644
index 0000000..33560fa
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/domain/vo/NodeIndexValueVO.java
@@ -0,0 +1,32 @@
+package com.zhitan.dataitem.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author DYL
+ **/
+@Data
+public class NodeIndexValueVO {
+
+    /**
+     * 鑺傜偣id
+     */
+    private String nodeId;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String nodeName;
+
+    /**
+     * 鐐逛綅id
+     */
+    private String indexId;
+
+    /**
+     * 绱Н閲�
+     */
+    private BigDecimal value;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java b/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
index 2f6d9ab..94f00fe 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/mapper/DataItemMapper.java
@@ -1,5 +1,6 @@
 package com.zhitan.dataitem.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhitan.carbonemission.domain.CarbonEmission;
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
@@ -16,7 +17,7 @@
  * @author sys
  * @date 2020-03-25
  */
-public interface DataItemMapper {
+public interface DataItemMapper extends BaseMapper<DataItem> {
     /**
      * 闃舵鏁版嵁褰曞叆
      *
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java b/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
index 993beb7..99c2a1c 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/service/IDataItemService.java
@@ -4,6 +4,8 @@
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
 import com.zhitan.realtimedata.domain.DataItem;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsVO;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -88,4 +90,12 @@
      * @return
      */
     List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds);
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    FlowChartsVO getFlowCharts(FlowChartsDTO dto);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
index 1e29b7f..27fb12a 100644
--- a/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/dataitem/service/impl/DataItemServiceImpl.java
@@ -1,16 +1,32 @@
 package com.zhitan.dataitem.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zhitan.common.enums.TimeType;
 import com.zhitan.dataitem.domain.StagseDataEntry;
+import com.zhitan.dataitem.domain.vo.NodeIndexValueVO;
 import com.zhitan.dataitem.mapper.DataItemMapper;
 import com.zhitan.dataitem.service.IDataItemService;
+import com.zhitan.model.domain.ModelNode;
+import com.zhitan.model.mapper.EnergyIndexMapper;
+import com.zhitan.model.mapper.ModelNodeMapper;
+import com.zhitan.model.mapper.NodeIndexMapper;
 import com.zhitan.realtimedata.domain.DataItem;
+import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsItemVO;
+import com.zhitan.statisticalAnalysis.domain.vo.FlowChartsVO;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * stagseDataEntryService涓氬姟灞傚鐞�
@@ -22,7 +38,14 @@
 @AllArgsConstructor
 public class DataItemServiceImpl implements IDataItemService {
 
-    private final DataItemMapper dataItemMapper;
+    @Resource
+    private DataItemMapper dataItemMapper;
+    @Resource
+    private ModelNodeMapper modelNodeMapper;
+    @Resource
+    private EnergyIndexMapper energyIndexMapper;
+    @Resource
+    private NodeIndexMapper nodeIndexMapper;
 
 
     /**
@@ -117,4 +140,125 @@
     public List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds) {
         return dataItemMapper.getDataItemHourInforByIndexIds(beginTime, endTime, timeType, indexIds);
     }
+
+    /**
+     * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return 缁撴灉
+     */
+    @Override
+    public FlowChartsVO getFlowCharts(FlowChartsDTO dto) {
+        FlowChartsVO flowChartsVO = new FlowChartsVO();
+        // 鐖惰妭鐐筰d
+        LambdaQueryWrapper<ModelNode> wrapper = Wrappers.<ModelNode>lambdaQuery()
+                .eq(ModelNode::getModelCode, dto.getModelCode())
+                .isNull(ModelNode::getParentId);
+        List<ModelNode> modelNodes = modelNodeMapper.selectList(wrapper);
+        if(ObjectUtils.isEmpty(modelNodes)){
+            throw new RuntimeException("鏈煡璇㈠埌妯″瀷淇℃伅");
+        }
+        Optional<ModelNode> modelNodeInfo = modelNodes.stream().findFirst();
+        String nodeId = modelNodeInfo.map(ModelNode::getNodeId).toString();
+        dto.setNodeId(nodeId);
+        String energyType = dto.getEnergyType();
+        LocalDate queryTime = dto.getQueryTime();
+        TimeType timeType = dto.getTimeType();
+
+        // 鑾峰彇鑺傜偣淇℃伅
+        ModelNode modelNode = modelNodeMapper.selectModelNodeById(nodeId);
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return flowChartsVO;
+        }
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Map<String, LocalDateTime> dateTimeMap = getDataItemByIndexId(timeType, queryTime);
+
+        // 鑾峰彇鑺傜偣鍜岀偣浣嶇殑绱Н閲�
+        List<NodeIndexValueVO> parentDataItemList = modelNodeMapper.getDataItemByNodeId(nodeId, energyType, timeType, dateTimeMap);
+
+        // 鑾峰彇瀛愯妭鐐逛笅鐨勭偣浣嶇殑绱Н閲�
+        List<NodeIndexValueVO> childDataItemList = modelNodeMapper.getDataItemByParentNodeId(nodeId, energyType, timeType, dateTimeMap);
+
+        // 鑾峰彇鐖惰妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+        if (ObjectUtils.isNotEmpty(parentDataItemList)) {
+            // 鐖惰妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+            BigDecimal totalValue = parentDataItemList.stream().map(NodeIndexValueVO::getValue)
+                    .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 鎬荤疮绉噺
+            flowChartsVO.setTotalAccumulatedAmount(totalValue);
+        }
+        // 鑾峰彇瀛愯妭鐐逛笅鐨勮兘鑰楁暟鎹�
+        if (ObjectUtils.isNotEmpty(childDataItemList)) {
+            // 瀛愯妭鐐逛笅鐨勮兘鑰楁暟鎹�诲拰
+            BigDecimal childTotalValue = childDataItemList.stream().map(NodeIndexValueVO::getValue)
+                    .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 瀛愯妭鐐圭疮绉噺
+            flowChartsVO.setChildNodeAccumulatedAmount(childTotalValue);
+
+            // 鏍规嵁瀛愯妭鐐筰d鍒嗙粍
+            Map<String, List<NodeIndexValueVO>> voMap = childDataItemList.stream()
+                    .collect(Collectors.groupingBy(NodeIndexValueVO::getNodeId));
+            List<FlowChartsItemVO> itemList = new ArrayList<>();
+
+            for (String childNodeId : voMap.keySet()) {
+                FlowChartsItemVO vo = new FlowChartsItemVO();
+                vo.setSource(modelNode.getName());
+                List<NodeIndexValueVO> valueList = voMap.getOrDefault(childNodeId, Collections.emptyList());
+                if (ObjectUtils.isNotEmpty(valueList)) {
+                    // 鍚勪釜瀛愯妭鐐圭殑鑳借�楁暟鎹�诲拰
+                    BigDecimal value = valueList.stream().map(NodeIndexValueVO::getValue)
+                            .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    valueList.stream().findFirst().ifPresent(nodeIndexValueVO -> vo.setTarget(nodeIndexValueVO.getNodeName()));
+                    vo.setValue(value);
+                }
+                itemList.add(vo);
+            }
+            flowChartsVO.setItemVOList(itemList);
+        }
+        return flowChartsVO;
+    }
+
+    /**
+     * 鏍规嵁indexId鏌ヨ鑳借�楁暟鎹�
+     */
+    private Map<String, LocalDateTime> getDataItemByIndexId(TimeType timeType, LocalDate queryTime) {
+        LocalDateTime startTime;
+        LocalDateTime endTime;
+        LocalDate startDate;
+        LocalDate endDate;
+        switch (timeType) {
+            case DAY:
+                // 褰撳ぉ鐨勫紑濮嬫椂闂�
+                startTime = LocalDateTime.of(queryTime, LocalTime.MIN);
+                // 褰撳ぉ鐨勭粨鏉熸椂闂�
+                endTime = LocalDateTime.of(queryTime, LocalTime.MAX);
+                break;
+            case MONTH:
+                // 褰撴湀鐨勫紑濮嬫椂闂�
+                startDate = queryTime.with(TemporalAdjusters.firstDayOfMonth());
+                startTime = LocalDateTime.of(startDate, LocalTime.MIN);
+                // 褰撴湀鐨勭粨鏉熸椂闂�
+                endDate = queryTime.with(TemporalAdjusters.lastDayOfMonth());
+                endTime = LocalDateTime.of(endDate, LocalTime.MAX);
+                break;
+            case YEAR:
+                // 褰撳勾鐨勫紑濮嬫椂闂�
+                startDate = queryTime.with(TemporalAdjusters.firstDayOfYear());
+                startTime = LocalDateTime.of(startDate, LocalTime.MIN);
+                // 褰撳勾鐨勭粨鏉熸椂闂�
+                endDate = queryTime.with(TemporalAdjusters.lastDayOfYear());
+                endTime = LocalDateTime.of(endDate, LocalTime.MAX);
+                break;
+            default:
+                // 褰撳ぉ鐨勫紑濮嬫椂闂�
+                startTime = LocalDateTime.of(queryTime, LocalTime.MIN);
+                // 褰撳ぉ鐨勭粨鏉熸椂闂�
+                endTime = LocalDateTime.of(queryTime, LocalTime.MAX);
+                break;
+        }
+        Map<String, LocalDateTime> localDateTimeMap = new HashMap<>();
+        localDateTimeMap.put("startTime", startTime);
+        localDateTimeMap.put("endTime", endTime);
+        return localDateTimeMap;
+    }
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/EnergyUnitToDevice.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/EnergyUnitToDevice.java
deleted file mode 100644
index bf35d02..0000000
--- a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/EnergyUnitToDevice.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.zhitan.energyMonitor.domain;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.zhitan.common.annotation.Excel;
-import com.zhitan.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.experimental.Accessors;
-
-import java.math.BigDecimal;
-
-/**
- * @Description: 鐢ㄨ兘鍗曞厓鍏宠仈鐨勫钩鍙版ā鏉夸腑浠〃鐨勭晫闈㈤�昏緫鍏崇郴 涓嶅惈鏈� 閲囬泦銆佽绠椾俊鎭�
- * @Author: jeecg-boot
- * @Date:   2022-01-26
- * @Version: V1.0
- */
-@Data
-@TableName("energy_unit_to_device")
-@Accessors(chain = true)
-@EqualsAndHashCode(callSuper = false)
-@ApiModel(value="energy_unit_to_device瀵硅薄", description="鐢ㄨ兘鍗曞厓鍏宠仈鐨勫钩鍙版ā鏉夸腑浠〃鐨勭晫闈㈤�昏緫鍏崇郴 涓嶅惈鏈� 閲囬泦銆佽绠椾俊鎭�")
-public class EnergyUnitToDevice extends BaseEntity {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "鏂颁富閿�")
-    @TableId(type = IdType.ASSIGN_ID)
-    private String newId;
-
-	/**涓婚敭*/
-    @ApiModelProperty(value = "涓婚敭")
-    private String id;
-
-	/**鍏宠仈浠〃鍚嶇О*/
-	@Excel(name = "鍏宠仈浠〃鍚嶇О", width = 15)
-    @ApiModelProperty(value = "鍏宠仈浠〃鍚嶇О")
-    private String name;
-
-	/**鍏宠仈浠〃缂栫爜*/
-	@Excel(name = "鍏宠仈浠〃缂栫爜", width = 15)
-    @ApiModelProperty(value = "鍏宠仈浠〃缂栫爜")
-    private String code;
-
-	/**鑳芥簮绫诲瀷锛堟按琛ㄣ�佺數琛ㄣ�佹皵琛ㄧ瓑锛�*/
-	@Excel(name = "鑳芥簮绫诲瀷锛堟按琛ㄣ�佺數琛ㄣ�佹皵琛ㄧ瓑锛�", width = 15)
-    @ApiModelProperty(value = "鑳芥簮绫诲瀷锛堟按琛ㄣ�佺數琛ㄣ�佹皵琛ㄧ瓑锛�")
-    private String deviceType;
-
-	/**鐢ㄨ兘鍗曞厓涓婚敭*/
-	@Excel(name = "鐢ㄨ兘鍗曞厓涓婚敭", width = 15)
-    @ApiModelProperty(value = "鐢ㄨ兘鍗曞厓涓婚敭")
-    private String energyUnitId;
-
-	/**绉熸埛涓婚敭*/
-	@Excel(name = "绉熸埛涓婚敭", width = 15)
-    @ApiModelProperty(value = "绉熸埛涓婚敭")
-    private Integer tenantId;
-
-    @ApiModelProperty(value = "鍙備笌璁¢噺")
-    private String partMeasurement;
-
-    @ApiModelProperty(value = "瀹夎浣嶇疆")
-    private String installPosition;
-
-    @ApiModelProperty(value = "鍒嗘憡姣斾緥")
-    private BigDecimal shareRatio;
-}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorDetail.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorDetail.java
new file mode 100644
index 0000000..2da7ece
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorDetail.java
@@ -0,0 +1,33 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ElectricPowerFactorDetail {
+    /**
+     * 鏈�澶у姛鐜囧洜鏁�
+     */
+    private String max;
+    /**
+     * 鏈�澶у姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String maxTime;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁�
+     */
+    private String min;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String minTime;
+    /**
+     * 骞冲潎鍔熺巼鍥犳暟
+     */
+    private String avg;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorItem.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorItem.java
new file mode 100644
index 0000000..42c024d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorItem.java
@@ -0,0 +1,20 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ElectricPowerFactorItem {
+    /**
+     * 鏃堕棿
+     */
+    private String timeCode;
+    /**
+     * 瀹炴椂鍊�
+     */
+    private String value;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorVO.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorVO.java
new file mode 100644
index 0000000..83b3eef
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricPowerFactorVO.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 ElectricPowerFactorVO {
+    /**
+     * 璁板綍鍒楄〃
+     */
+    private List<ElectricPowerFactorItem> itemList;
+
+    /**
+     * 璇︽儏瀹炰綋
+     */
+    private ElectricPowerFactorDetail detail;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java
new file mode 100644
index 0000000..6175ef9
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseDetail.java
@@ -0,0 +1,55 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�04鏈�24鏃� 16:59
+ */
+@Data
+public class ElectricThreePhaseDetail {
+    /**
+     * 鏈�澶у姛鐜囧洜鏁�
+     */
+    private String max;
+    /**
+     * 鏈�澶у姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String maxTime;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁�
+     */
+    private String min;
+    /**
+     * 鏈�灏忓姛鐜囧洜鏁板彂鐢熸椂闂�
+     */
+    private String minTime;
+
+    /**
+     * 鏈�澶у��-A鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxA;
+    /**
+     * 鏈�澶у��-B鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxB;
+    /**
+     * 鏈�澶у��-C鐩哥數娴�/鐢靛帇
+     */
+    private String valueMaxC;
+
+    /**
+     * 鏈�灏忓��-A鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinA;
+    /**
+     * 鏈�灏忓��-B鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinB;
+    /**
+     * 鏈�灏忓��-C鐩哥數娴�/鐢靛帇
+     */
+    private String valueMinC;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.java
new file mode 100644
index 0000000..779321a
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseItem.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 ElectricThreePhaseItem {
+    /**
+     * 鐢佃〃鍚嶇О
+     */
+    private String name;
+    /**
+     * 鏃堕棿
+     */
+    private String timeCode;
+    /**
+     * 缁熻鍥炬樉绀烘椂闂�
+     */
+    private String timeCodeChart;
+    /**
+     * 鏈�澶т笁鐩镐笉骞宠 
+     */
+    private String max;
+    /**
+     * 鏈�灏忎笁鐩镐笉骞宠 
+     */
+    private String min;
+    /**
+     * A鐩哥數娴�/鐢靛帇
+     */
+    private String valueA;
+    /**
+     * D鐩哥數娴�/鐢靛帇
+     */
+    private String valueB;
+    /**
+     * C鐩哥數娴�/鐢靛帇
+     */
+    private String valueC;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java
new file mode 100644
index 0000000..5051870
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseTempModel.java
@@ -0,0 +1,44 @@
+package com.zhitan.energyMonitor.domain.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�05鏈�06鏃� 14:02
+ */
+@Data
+public class ElectricThreePhaseTempModel {
+
+    private Double max;
+    private Date maxTime;
+    private Double min;
+    private Date minTime;
+    /**
+     * 鏈�澶у��-A鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxA;
+    /**
+     * 鏈�澶у��-B鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxB;
+    /**
+     * 鏈�澶у��-C鐩哥數娴�/鐢靛帇
+     */
+    private double valueMaxC;
+
+    /**
+     * 鏈�灏忓��-A鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinA;
+    /**
+     * 鏈�灏忓��-B鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinB;
+    /**
+     * 鏈�灏忓��-C鐩哥數娴�/鐢靛帇
+     */
+    private double valueMinC;
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.java
new file mode 100644
index 0000000..76e9e74
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/domain/vo/ElectricThreePhaseVO.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 ElectricThreePhaseVO {
+    /**
+     * 璁板綍鍒楄〃
+     */
+    private List<ElectricThreePhaseItem> itemList;
+
+    /**
+     * 璇︽儏瀹炰綋
+     */
+    private ElectricThreePhaseDetail detail;
+}
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/EnergyUnitToDeviceMapper.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/EnergyUnitToDeviceMapper.java
deleted file mode 100644
index 32edd1e..0000000
--- a/zhitan-system/src/main/java/com/zhitan/energyMonitor/mapper/EnergyUnitToDeviceMapper.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.zhitan.energyMonitor.mapper;
-
-import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
-import com.zhitan.energyMonitor.domain.vo.EnergyCalculateCalcTV;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * @Description: 鐢ㄨ兘鍗曞厓鍏宠仈鐨勫钩鍙版ā鏉夸腑浠〃鐨勭晫闈㈤�昏緫鍏崇郴 涓嶅惈鏈� 閲囬泦銆佽绠椾俊鎭�
- * @Author: jeecg-boot
- * @Date: 2022-01-26
- * @Version: V1.0
- */
-public interface EnergyUnitToDeviceMapper extends BaseMapper<EnergyUnitToDevice> {
-
-    /**
-     * 鏍规嵁璁$畻鐐逛綅涓婚敭鍜岀敤鑳藉崟鍏冧富閿� 鏌ヨ 浣跨敤鐨� 閲囬泦鐐瑰強浠〃淇℃伅
-     *
-     * @param calculateIndexId
-     * @param energyUnitId
-     * @return
-     */
-    public List<EnergyCalculateCalcTV> getCalculateDevices(@Param("calculateIndexId") String calculateIndexId,
-                                                           @Param("energyUnitId") String energyUnitId,
-                                                           @Param("tenantId") String tenantId);
-
-    /**
-     * 涓-鏍规嵁绉熸埛id闆嗗悎鏌ヨ璁¢噺鍣ㄥ叿id
-     *
-     * @param unitIds
-     * @return
-     */
-    @InterceptorIgnore(tenantLine = "true")
-    List<String> listDeviceByTenantIds(@Param("unitIds") List<String> unitIds);
-}
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..f3c4448
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricLoadService.java
@@ -0,0 +1,18 @@
+package com.zhitan.energyMonitor.service;
+
+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 {
+
+    /**
+     * 鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁
+     */
+    ListElectricLoadVO list(String timeType, String timeCode, EnergyIndex energyIndex);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricPowerFactorService.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricPowerFactorService.java
new file mode 100644
index 0000000..b74cc1b
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricPowerFactorService.java
@@ -0,0 +1,19 @@
+package com.zhitan.energyMonitor.service;
+
+import com.zhitan.energyMonitor.domain.vo.ElectricPowerFactorVO;
+import com.zhitan.model.domain.EnergyIndex;
+
+
+/**
+ * @Description:
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+public interface IElectricPowerFactorService {
+
+    /**
+     * 鑾峰彇璐熻嵎鍒嗘瀽鏁版嵁
+     */
+    ElectricPowerFactorVO list(String timeCode, EnergyIndex energyIndex);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java
new file mode 100644
index 0000000..8b8ce8d
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IElectricThreePhaseService.java
@@ -0,0 +1,20 @@
+package com.zhitan.energyMonitor.service;
+
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseVO;
+import com.zhitan.model.domain.EnergyIndex;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+public interface IElectricThreePhaseService {
+
+    /**
+     * 鑾峰彇涓夌浉涓嶅钩琛℃暟鎹�
+     */
+    ElectricThreePhaseVO list(String timeType, String timeCode, List<EnergyIndex> energyIndexList, String requestType, String meterId);
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IEnergyUnitToDeviceService.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IEnergyUnitToDeviceService.java
deleted file mode 100644
index 30bb563..0000000
--- a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/IEnergyUnitToDeviceService.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.zhitan.energyMonitor.service;
-
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
-import com.zhitan.energyMonitor.domain.vo.ListElectricityMeterVO;
-import com.zhitan.energyMonitor.domain.vo.UnitToDeviceRelationVO;
-
-import java.util.List;
-
-/**
- * @Description: 鐢ㄨ兘鍗曞厓鍏宠仈鐨勫钩鍙版ā鏉夸腑浠〃鐨勭晫闈㈤�昏緫鍏崇郴 涓嶅惈鏈� 閲囬泦銆佽绠椾俊鎭�
- * @Author: jeecg-boot
- * @Date:   2022-01-26
- * @Version: V1.0
- */
-public interface IEnergyUnitToDeviceService extends IService<EnergyUnitToDevice> {
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓ID鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃闆嗗悎
-     * @param unitId
-     * @return
-     */
-    List<EnergyUnitToDevice> queryTenantUnitDeviceByUnitId(String unitId);
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓ID鑾峰彇绉熸埛涓嬫墍鏈夋湁鏁堢殑瀹炰綋琛ㄩ泦鍚�
-     * @param unitId
-     * @return
-     */
-    List<EnergyUnitToDevice> queryTenantEntityMeterByUnitId(String unitId);
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     * @return 浠〃id闆嗗悎
-     */
-    List<String> getEnergyUnitDeviceIdByUnitId(String unitId);
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id闆嗗悎鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitIds 鐢ㄨ兘鍗曞厓id
-     */
-    List<String> getEnergyUnitDeviceIdByUnitIds(List<String> unitIds);
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id闆嗗悎+鑳芥簮绫诲瀷鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitIds    鐢ㄨ兘鍗曞厓id闆嗗悎
-     * @return
-     */
-    List<String> getDeviceIdByUnitIds(List<String> unitIds);
-
-    /**
-     * 鏇存柊鑳藉崟鍏僫d鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     * @return 浠〃id闆嗗悎
-     */
-    List<String> updateEnergyUnitDeviceIdByUnitId(String unitId);
-
-    /**
-     * 鍒犻櫎鑳藉崟鍏僫d鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     * @param unitId    鐢ㄨ兘鍗曞厓id
-     * @return  浠〃id闆嗗悎
-     */
-    void deleteEnergyUnitDeviceIdByUnitId(String unitId);
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓ID鑾峰彇绉熸埛涓嬫湁鏁堢殑鐢佃〃闆嗗悎
-     * @param unitId
-     * @return
-     */
-    List<ListElectricityMeterVO> listElectricityMeter(String unitId);
-
-    /**
-     * 鑾峰彇绉熸埛涓嬫湁鏁堢殑琛ㄩ泦鍚�
-     * @return
-     */
-    List<EnergyUnitToDevice> listAllMeter();
-
-    /**
-     * 鏍规嵁璁¢噺鍣ㄥ叿id鍜岀敤鑳藉崟鍏僫d鏌ヨ琛ㄥ叧绯�
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     * @param id     id
-     * @return EnergyUnitToDevice瀹炰綋
-     */
-    EnergyUnitToDevice getEnergyUnitToDeviceById(String unitId, String id);
-
-    /**
-     * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ涓庣敤鑳界殑鍏崇郴
-     *
-     * @param unitIds
-     * @return
-     */
-    List<UnitToDeviceRelationVO> listDeviceByUnitIds(List<String> unitIds);
-}
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..a01fd03
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java
@@ -0,0 +1,258 @@
+package com.zhitan.energyMonitor.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.basicdata.domain.MeterImplement;
+import com.zhitan.basicdata.mapper.MeterImplementMapper;
+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.vo.ListElectricLoadDetail;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadItem;
+import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO;
+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 javax.annotation.Resource;
+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 implements IElectricLoadService {
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+    @Resource
+    private MeterImplementMapper meterImplementMapper;
+
+    @Override
+    public ListElectricLoadVO list(String timeType, String timeCode, EnergyIndex energyIndex) {
+        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);
+
+        MeterImplement meterImplement = meterImplementMapper.selectById(energyIndex.getMeterId());
+
+        if (ObjectUtil.isEmpty(meterImplement)) {
+            return vo;
+        }
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(timeType, timeCode, dateList);
+        // 鍥犱负influxdb娌℃湁鎸夌収鏈堝垎缁勫彇鏁版嵁锛屽彧鑳芥寜鐓ф棩鏈熷惊鐜彇鏁版嵁
+        if (TimeTypeConst.TIME_TYPE_YEAR.equals(timeType)) {
+            getYearData(timeType, dateList, energyIndex, meterImplement.getMeterName(), itemList);
+        } else {
+            getDayAndMonthData(timeType, timeCode, energyIndex, meterImplement.getMeterName(), 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鍙互鎸夌収鍒嗐�傛椂銆傚ぉ鍒嗙粍鍙栨暟锛屼笉鍙互鎸夌収鏈堝垎缁勫彇鏁帮紝鎵�浠ュ垎鎴愪袱涓柟娉曟潵鍐�
+     */
+    private void getDayAndMonthData(String timeType, String timeCode, EnergyIndex energyIndex, String meterName, 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(meterName) ? meterName : "");
+            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);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇骞存暟鎹�
+     */
+    private void getYearData(String timeType, List<Date> dateList, EnergyIndex energyIndex, String meterName, 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(meterName));
+            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/energyMonitor/service/impl/ElectricPowerFactorServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricPowerFactorServiceImpl.java
new file mode 100644
index 0000000..ea366f9
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricPowerFactorServiceImpl.java
@@ -0,0 +1,115 @@
+package com.zhitan.energyMonitor.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.utils.ChartUtils;
+import com.zhitan.common.utils.DateTimeUtil;
+import com.zhitan.common.utils.DoubleUtil;
+import com.zhitan.energyMonitor.domain.vo.ElectricPowerFactorDetail;
+import com.zhitan.energyMonitor.domain.vo.ElectricPowerFactorItem;
+import com.zhitan.energyMonitor.domain.vo.ElectricPowerFactorVO;
+import com.zhitan.energyMonitor.service.IElectricPowerFactorService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.realtimedata.domain.TagValue;
+import com.zhitan.realtimedata.service.RealtimeDatabaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+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
+ */
+@Slf4j
+@Service
+public class ElectricPowerFactorServiceImpl implements IElectricPowerFactorService {
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+    @Override
+    public ElectricPowerFactorVO list(String timeCode, EnergyIndex energyIndex) {
+        ElectricPowerFactorVO vo = new ElectricPowerFactorVO();
+        List<ElectricPowerFactorItem> itemList = new ArrayList<>();
+        ElectricPowerFactorDetail detail = new ElectricPowerFactorDetail();
+        detail.setMaxTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMinTime(CommonConst.DOUBLE_MINUS_SIGN);
+        vo.setItemList(itemList);
+        vo.setDetail(detail);
+
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(TimeTypeConst.TIME_TYPE_DAY, timeCode, dateList);
+        double max = CommonConst.DIGIT_0, min = CommonConst.MIN_INIT_VALUE;
+        //dateList璁℃暟
+        Date now = new Date();
+        //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+        now = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_HOUR, now);
+        int i = CommonConst.DIGIT_0;
+        for (Date date : dateList) {
+            ElectricPowerFactorItem temp = new ElectricPowerFactorItem();
+            temp.setTimeCode(ChartUtils.getTimeCodeChart(TimeTypeConst.TIME_TYPE_DAY, date));
+            temp.setValue(CommonConst.DOUBLE_MINUS_SIGN);
+            itemList.add(temp);
+            // 濡傛灉澶т簬褰撳墠鏃堕棿榛樿--
+            if (DateTimeUtil.compareDateDiff(date, now) > CommonConst.DIGIT_0) {
+                i++;
+                continue;
+            }
+            TagValue tagValue = new TagValue();
+            try {
+                TagValue retrieve = realtimeDatabaseService.retrieve(energyIndex.getCode(), date);
+                if (ObjectUtil.isNotEmpty(retrieve)) {
+                    tagValue = retrieve;
+                }
+            } catch (Exception e) {
+                log.error("鑾峰彇鍔熺巼鍥犳暟寮傚父锛�" + e.getMessage());
+            }
+            if (ObjectUtil.isNotEmpty(tagValue.getValue())) {
+                double value = DoubleUtil.formatDouble(tagValue.getValue());
+
+                temp.setValue(String.valueOf(value));
+                //缁欐渶灏忓�艰祴鍊肩涓�鏉�
+                if (i == CommonConst.DIGIT_0) {
+                    min = Double.parseDouble(temp.getValue());
+                }
+                if (value > max) {
+                    max = value;
+                    detail.setMax(max + CommonConst.EMPTY);
+                    detail.setMaxTime(DateTimeUtil.getDateTime(date));
+                }
+                if (value <= min) {
+                    min = value;
+                    detail.setMin(min + CommonConst.EMPTY);
+                    detail.setMinTime(DateTimeUtil.getDateTime(date));
+                }
+            }
+            i++;
+        }
+
+        detail.setAvg(CommonConst.DOUBLE_MINUS_SIGN);
+        if (ObjectUtil.isNotEmpty(itemList)) {
+            double avg = CommonConst.DIGIT_DOUBLE_0;
+            for (ElectricPowerFactorItem li : itemList) {
+                try {
+                    if (!li.getValue().equals(CommonConst.DOUBLE_MINUS_SIGN)) {
+                        avg += DoubleUtil.toDouble(li.getValue());
+                    }
+                } catch (Exception e) {
+                    log.error(e.getMessage());
+                }
+            }
+            detail.setAvg(DoubleUtil.formatDoubleToStr(avg / itemList.size()));
+        }
+
+        return vo;
+    }
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java
new file mode 100644
index 0000000..5a21836
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricThreePhaseServiceImpl.java
@@ -0,0 +1,413 @@
+package com.zhitan.energyMonitor.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.zhitan.basicdata.domain.MeterImplement;
+import com.zhitan.basicdata.mapper.MeterImplementMapper;
+import com.zhitan.common.constant.CommonConst;
+import com.zhitan.common.constant.TimeTypeConst;
+import com.zhitan.common.utils.*;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseDetail;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseItem;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseTempModel;
+import com.zhitan.energyMonitor.domain.vo.ElectricThreePhaseVO;
+import com.zhitan.energyMonitor.service.IElectricThreePhaseService;
+import com.zhitan.model.domain.EnergyIndex;
+import com.zhitan.realtimedata.domain.TagValue;
+import com.zhitan.realtimedata.service.RealtimeDatabaseService;
+import org.joda.time.DateTime;
+import org.joda.time.Duration;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: sensor_alarm_item
+ * @Author: jeecg-boot
+ * @Date: 2022-04-19
+ * @Version: V1.0
+ */
+@Service
+public class ElectricThreePhaseServiceImpl implements IElectricThreePhaseService {
+
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+    @Resource
+    private MeterImplementMapper meterImplementMapper;
+
+    /**
+     * 鑾峰彇涓夌浉涓嶅钩琛℃暟鎹�
+     *
+     * @param timeType        鏃堕棿绫诲瀷
+     * @param timeCode        鏃堕棿缂栫爜
+     * @param energyIndexList 鐐逛綅闆嗗悎
+     * @param requestType     绫诲瀷
+     * @return ElectricThreePhaseVo
+     * @Date 14:27 2022/5/30
+     **/
+    @Override
+    public ElectricThreePhaseVO list(String timeType, String timeCode, List<EnergyIndex> energyIndexList, String requestType, String meterId) {
+        ElectricThreePhaseVO vo = new ElectricThreePhaseVO();
+        if (ObjectUtil.isEmpty(energyIndexList)) {
+            return vo;
+        }
+        // 鑾峰彇鐢靛帇涓嶅钩琛℃暟鎹�
+        if (CommonConst.STR_NUMBER_0.equals(requestType)) {
+            energyIndexList = energyIndexList.stream()
+                    .filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_A)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_B)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_VOLTAGE_C)).collect(Collectors.toList());
+        } else {
+            energyIndexList = energyIndexList.stream()
+                    .filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_A)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_B)
+                            || StringUtil.ifEmptyOrNullReturnValue(x.getCode()).trim().endsWith(CommonConst.TAG_CODE_CURRENT_C))
+                    .collect(Collectors.toList());
+        }
+        List<String> tagCodeList = energyIndexList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+        tagCodeList.add(CommonConst.STR_NUMBER_MINUS_ONE);
+        String tagCodes = String.join(StrUtil.COMMA, tagCodeList);
+
+        Date start = ChartUtils.getDateTime(timeType, timeCode);
+        Date end = getEndTime(timeType, start);
+
+        DateTime begin = new DateTime(start);
+        DateTime finish = new DateTime(end);
+        long millis = new Duration(begin, finish).getMillis();
+        int pointCount = IntegerUtil.toInt(millis / CommonConst.DIGIT_3600 / CommonConst.DIGIT_1000);
+
+        List<TagValue> tagValueList = realtimeDatabaseService.retrieve(tagCodes, start, end, pointCount);
+        List<ElectricThreePhaseItem> itemList = new ArrayList<>();
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(timeType, timeCode, dateList);
+        ElectricThreePhaseTempModel tempModel = new ElectricThreePhaseTempModel();
+
+        Date now = new Date();
+        for (Date date : dateList) {
+            Date tempDate = date;
+            Date temNow = now;
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    tempDate = DateTimeUtil.addHours(date, CommonConst.DIGIT_1);
+                    //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_HOUR, now);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    tempDate = date;
+                    //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_DAY, now);
+                    break;
+                case TimeTypeConst.TIME_TYPE_YEAR:
+                    tempDate = date;
+                    temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_MONTH, now);
+                    break;
+                default:
+                    break;
+            }
+            MeterImplement meterImplement = meterImplementMapper.selectById(meterId);
+
+            ElectricThreePhaseItem temp = new ElectricThreePhaseItem();
+            if (ObjectUtil.isNotEmpty(meterImplement)) {
+                temp.setName(meterImplement.getMeterName());
+            }
+            temp.setTimeCode(ChartUtils.getTimeCode(timeType, date));
+            temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date));
+            temp.setValueA(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValueB(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setValueC(CommonConst.DOUBLE_MINUS_SIGN);
+            itemList.add(temp);
+            // 濡傛灉澶т簬褰撳墠鏃堕棿榛樿--
+            if (DateTimeUtil.compareDateDiff(date, temNow) > CommonConst.DIGIT_0) {
+                continue;
+            }
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    // 鏋勯�犲綋澶╂瘡涓皬鏃剁殑鏁版嵁
+                    listDayData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    // 鏋勯�犲綋鏈堟瘡澶╃殑鏁版嵁
+                    listMonthData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                case TimeTypeConst.TIME_TYPE_YEAR:
+                    // 鏋勯�犲綋骞存瘡鏈堢殑鏁版嵁
+                    listYearData(tempDate, tagValueList, temp, tempModel);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+            tempModel.setMin(null);
+        }
+        //璁剧疆鍊�
+        ElectricThreePhaseDetail detail = new ElectricThreePhaseDetail();
+        BeanUtils.copyProperties(tempModel, detail);
+        detail.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMaxTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxA(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxB(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMaxC(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setMinTime(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinA(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinB(CommonConst.DOUBLE_MINUS_SIGN);
+        detail.setValueMinC(CommonConst.DOUBLE_MINUS_SIGN);
+        if (ObjectUtil.isNotNull(tempModel.getMax())) {
+            detail.setMax(DoubleUtil.formatDoubleToStr(tempModel.getMax()) + CommonConst.SYMBOL_PERCENT);
+            detail.setMaxTime(DateTimeUtil.getDateTime(tempModel.getMaxTime()));
+            detail.setValueMaxA(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxA()));
+            detail.setValueMaxB(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxB()));
+            detail.setValueMaxC(DoubleUtil.formatDoubleToStr(tempModel.getValueMaxC()));
+        }
+        if (ObjectUtil.isNotNull(tempModel.getMin())) {
+            detail.setMin(DoubleUtil.formatDoubleToStr(tempModel.getMin()) + CommonConst.SYMBOL_PERCENT);
+            detail.setMinTime(DateTimeUtil.getDateTime(tempModel.getMinTime()));
+            detail.setValueMinA(DoubleUtil.formatDoubleToStr(tempModel.getValueMinA()));
+            detail.setValueMinB(DoubleUtil.formatDoubleToStr(tempModel.getValueMinB()));
+            detail.setValueMinC(DoubleUtil.formatDoubleToStr(tempModel.getValueMinC()));
+        }
+        vo.setDetail(detail);
+        vo.setItemList(itemList);
+        return vo;
+    }
+
+    /**
+     * 鏋勯�犲綋鏈堢殑鏁版嵁鍒楄〃
+     *
+     * @param date
+     * @param tagValueList
+     * @param temp
+     * @param tempModel
+     */
+    private void listYearData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(TimeTypeConst.TIME_TYPE_MONTH, DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_MONTH), dateList);
+        ElectricThreePhaseTempModel tempModelMonth = new ElectricThreePhaseTempModel();
+        for (Date date1 : dateList) {
+            listMonthData(date1, tagValueList, temp, tempModelMonth);
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            if (ObjectUtil.isNotNull(tempModelMonth.getMax())) {
+                temp.setMax(DoubleUtil.formatDoubleToStr(tempModelMonth.getMax()));
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMin())) {
+                temp.setMin(DoubleUtil.formatDoubleToStr(tempModelMonth.getMin()));
+            }
+            if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+                tempModel.setMin(null);
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMax())) {
+                if (ObjectUtil.isNull(tempModel.getMax()) || (ObjectUtil.isNotNull(tempModel.getMax()) && tempModelMonth.getMax() > tempModel.getMax())) {
+                    tempModel.setMax(DoubleUtil.formatDouble(tempModelMonth.getMax()));
+                    tempModel.setMaxTime(tempModelMonth.getMaxTime());
+                    tempModel.setValueMaxA(DoubleUtil.formatDouble(tempModelMonth.getValueMaxA()));
+                    tempModel.setValueMaxB(DoubleUtil.formatDouble(tempModelMonth.getValueMaxB()));
+                    tempModel.setValueMaxC(DoubleUtil.formatDouble(tempModelMonth.getValueMaxC()));
+                }
+            }
+            if (ObjectUtil.isNotNull(tempModelMonth.getMin())) {
+                if (ObjectUtil.isNull(tempModel.getMin()) || (ObjectUtil.isNotNull(tempModel.getMin()) && tempModelMonth.getMin() <= tempModel.getMin())) {
+                    tempModel.setMin(DoubleUtil.formatDouble(tempModelMonth.getMin()));
+                    tempModel.setMinTime(tempModelMonth.getMinTime());
+                    tempModel.setValueMinA(DoubleUtil.formatDouble(tempModelMonth.getValueMinA()));
+                    tempModel.setValueMinB(DoubleUtil.formatDouble(tempModelMonth.getValueMinB()));
+                    tempModel.setValueMinC(DoubleUtil.formatDouble(tempModelMonth.getValueMinC()));
+                }
+            }
+        }
+    }
+
+    /**
+     * 鏋勯�犲綋鏈堢殑鏁版嵁鍒楄〃
+     *
+     * @param date
+     * @param tagValueList
+     * @param temp
+     * @param tempModel
+     */
+    private void listMonthData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        List<Date> dateList = new ArrayList<>();
+        ChartUtils.generateDateList(TimeTypeConst.TIME_TYPE_DAY, DateTimeUtil.getDateTime(date, DateTimeUtil.COMMON_PATTERN_TO_DAY), dateList);
+        ElectricThreePhaseTempModel tempModelDay = new ElectricThreePhaseTempModel();
+        for (Date date1 : dateList) {
+            Date tempDate = DateTimeUtil.addHours(date1, CommonConst.DIGIT_1);
+            listDayData(tempDate, tagValueList, temp, tempModelDay);
+            temp.setMax(CommonConst.DOUBLE_MINUS_SIGN);
+            temp.setMin(CommonConst.DOUBLE_MINUS_SIGN);
+            if (ObjectUtil.isNotNull(tempModelDay.getMax())) {
+                temp.setMax(DoubleUtil.formatDoubleToStr(tempModelDay.getMax()));
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMin())) {
+                temp.setMin(DoubleUtil.formatDoubleToStr(tempModelDay.getMin()));
+            }
+            if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+                tempModel.setMin(null);
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMax())) {
+                if (ObjectUtil.isNull(tempModel.getMax()) || (ObjectUtil.isNotNull(tempModel.getMax()) && tempModelDay.getMax() > tempModel.getMax())) {
+                    tempModel.setMax(DoubleUtil.formatDouble(tempModelDay.getMax()));
+                    tempModel.setMaxTime(tempModelDay.getMaxTime());
+                    tempModel.setValueMaxA(DoubleUtil.formatDouble(tempModelDay.getValueMaxA()));
+                    tempModel.setValueMaxB(DoubleUtil.formatDouble(tempModelDay.getValueMaxB()));
+                    tempModel.setValueMaxC(DoubleUtil.formatDouble(tempModelDay.getValueMaxC()));
+                }
+            }
+            if (ObjectUtil.isNotNull(tempModelDay.getMin())) {
+                if (ObjectUtil.isNull(tempModel.getMin()) || (ObjectUtil.isNotNull(tempModel.getMin()) && tempModelDay.getMin() <= tempModel.getMin())) {
+                    tempModel.setMin(DoubleUtil.formatDouble(tempModelDay.getMin()));
+                    tempModel.setMinTime(tempModelDay.getMinTime());
+                    tempModel.setValueMinA(DoubleUtil.formatDouble(tempModelDay.getValueMinA()));
+                    tempModel.setValueMinB(DoubleUtil.formatDouble(tempModelDay.getValueMinB()));
+                    tempModel.setValueMinC(DoubleUtil.formatDouble(tempModelDay.getValueMinC()));
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇褰撳ぉ鐨勬暟鎹垪琛�
+     *
+     * @param date
+     * @param tagValueList
+     * @param tempModel
+     */
+    private void listDayData(Date date, List<TagValue> tagValueList, ElectricThreePhaseItem temp, ElectricThreePhaseTempModel tempModel) {
+        Date endTime = DateTimeUtil.addHours(date, CommonConst.DIGIT_1);
+        List<TagValue> currentTagValueList = tagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) <= 0 && DateTimeUtil.compareDateDiff(endTime, x.getDataTime()) > 0).collect(Collectors.toList());
+        List<TagValue> currentATagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_A")).collect(Collectors.toList());
+        List<TagValue> currentBTagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_B")).collect(Collectors.toList());
+        List<TagValue> currentCTagValueList = currentTagValueList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getTagCode()).trim().endsWith("_C")).collect(Collectors.toList());
+        TagValue tagValueA = currentATagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        TagValue tagValueB = currentBTagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        TagValue tagValueC = currentCTagValueList.stream().filter(x -> DateTimeUtil.compareDateDiff(date, x.getDataTime()) == 0).findAny().orElse(null);
+        Double valueA = null, valueB = null, valueC = null;
+        if (ObjectUtil.isNotEmpty(tagValueA)) {
+            valueA = tagValueA.getValue();
+            temp.setValueA(String.valueOf(DoubleUtil.formatDouble(tagValueA.getValue())));
+        } else {
+            temp.setValueA(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        if (!ObjectUtil.isEmpty(tagValueB)) {
+            valueB = tagValueB.getValue();
+            temp.setValueB(String.valueOf(DoubleUtil.formatDouble(tagValueB.getValue())));
+        } else {
+            temp.setValueB(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        if (!ObjectUtil.isEmpty(tagValueC)) {
+            valueC = tagValueC.getValue();
+            temp.setValueC(String.valueOf(DoubleUtil.formatDouble(tagValueC.getValue())));
+        } else {
+            temp.setValueC(CommonConst.DOUBLE_MINUS_SIGN);
+        }
+        Double value = calcUnbalanceValue(valueA, valueB, valueC);
+        if (ObjectUtil.isEmpty(value)) {
+            return;
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || CommonConst.MIN_INIT_VALUE == tempModel.getMin()) {
+            tempModel.setMin(value);
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMax()) || value > tempModel.getMax()) {
+            tempModel.setMax(DoubleUtil.formatDouble(value));
+            if (!ObjectUtil.isEmpty(tagValueA)) {
+                tempModel.setMaxTime(tagValueA.getDataTime());
+            }
+            tempModel.setValueMaxA(DoubleUtil.formatDouble(valueA));
+            tempModel.setValueMaxB(DoubleUtil.formatDouble(valueB));
+            tempModel.setValueMaxC(DoubleUtil.formatDouble(valueC));
+        }
+        if (ObjectUtil.isEmpty(tempModel.getMin()) || value <= tempModel.getMin()) {
+            tempModel.setMin(DoubleUtil.formatDouble(value));
+            tempModel.setValueMinA(DoubleUtil.formatDouble(valueA));
+            tempModel.setValueMinB(DoubleUtil.formatDouble(valueB));
+            tempModel.setValueMinC(DoubleUtil.formatDouble(valueC));
+            if (!ObjectUtil.isEmpty(tagValueA)) {
+                tempModel.setMinTime(tagValueA.getDataTime());
+            }
+        }
+    }
+
+    /**
+     * 璁$畻涓夌浉涓嶅钩琛℃瀬鍊�
+     *
+     * @param valueA
+     * @param valueB
+     * @param valueC
+     * @return
+     */
+    private Double calcUnbalanceValue(Double valueA, Double valueB, Double valueC) {
+        /**
+         * 1銆佽绠椾笁鐩稿钩鍧囩數娴侊紝A/B/C涓夌浉鐢垫祦鐩稿姞闄や互3
+         * 2銆� MAX锛堢浉鐢垫祦-涓夌浉骞冲潎鐢垫祦锛�/涓夌浉骞冲潎鐢垫祦锛�
+         * 姣斿涓夌浉鐢垫祦鍒嗗埆涓篒A=9A IB=8A IC=4A锛屽垯涓夌浉骞冲潎鐢垫祦涓�7A锛岀浉鐢垫祦-涓夌浉骞冲潎鐢垫祦鍒嗗埆涓�2A 1A 3A锛屽彇宸�兼渶澶ч偅涓紝鏁匨AX锛堢浉鐢垫祦-涓夌浉骞冲潎鐢垫祦锛�=3A锛屾墍浠ヤ笁鐩哥數娴佷笉骞宠 搴�=3/7銆�
+         */
+        Double result = null;
+        Double sum = null;
+        if (ObjectUtil.isNotNull(valueA)) {
+            sum = valueA;
+        }
+        if (ObjectUtil.isNotNull(valueB)) {
+            sum += valueB;
+        }
+        if (ObjectUtil.isNotNull(valueC)) {
+            sum += valueC;
+        }
+        if (ObjectUtil.isNotNull(sum)) {
+            double avg = sum / CommonConst.DIGIT_3;
+            double diff1 = 0, diff2 = 0, diff3 = 0;
+            if (ObjectUtil.isNotNull(valueA)) {
+                diff1 = Math.abs(valueA - avg);
+            }
+            if (ObjectUtil.isNotNull(valueB)) {
+                diff2 = Math.abs(valueB - avg);
+            }
+            if (ObjectUtil.isNotNull(valueC)) {
+                diff3 = Math.abs(valueC - avg);
+            }
+            double max = diff1;
+            if (diff2 > max) {
+                max = diff2;
+            }
+            if (diff3 > max) {
+                max = diff3;
+            }
+            if (avg != CommonConst.DIGIT_DOUBLE_0) {
+                result = max * CommonConst.DIGIT_DOUBLE_100 / avg;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 鑾峰彇瀵瑰簲鐨勭粨鏉熸椂闂�
+     *
+     * @param timeType
+     * @param date
+     * @return
+     */
+    public static Date getEndTime(String timeType, Date date) {
+        Date d1 = null;
+        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;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/EnergyUnitToDeviceServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/EnergyUnitToDeviceServiceImpl.java
deleted file mode 100644
index 5df3d47..0000000
--- a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/EnergyUnitToDeviceServiceImpl.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package com.zhitan.energyMonitor.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zhitan.common.constant.CommonConst;
-import com.zhitan.energyMonitor.domain.EnergyUnitToDevice;
-import com.zhitan.energyMonitor.domain.vo.ListElectricityMeterVO;
-import com.zhitan.energyMonitor.domain.vo.UnitToDeviceRelationVO;
-import com.zhitan.energyMonitor.mapper.EnergyUnitToDeviceMapper;
-import com.zhitan.energyMonitor.service.IEnergyUnitToDeviceService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @Description: 鐢ㄨ兘鍗曞厓鍏宠仈鐨勫钩鍙版ā鏉夸腑浠〃鐨勭晫闈㈤�昏緫鍏崇郴 涓嶅惈鏈� 閲囬泦銆佽绠椾俊鎭�
- * @Author: jeecg-boot
- * @Date: 2022-01-26
- * @Version: V1.0
- */
-@Service
-public class EnergyUnitToDeviceServiceImpl extends ServiceImpl<EnergyUnitToDeviceMapper, EnergyUnitToDevice>
-        implements IEnergyUnitToDeviceService {
-
-
-//    @Autowired
-//    private IMeasuringInstrumentsService meterService;
-
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id鑾峰彇绉熸埛涓嬬殑鍏朵笅鐨勪华琛ㄥ垪琛�
-     *
-     * @param unitId
-     * @return
-     */
-    @Override
-    public List<EnergyUnitToDevice> queryTenantUnitDeviceByUnitId(String unitId) {
-
-        QueryWrapper<EnergyUnitToDevice> queryWrapper = new QueryWrapper<EnergyUnitToDevice>();
-//                .eq(TableColumnConst.TABLE_COLUMN_ENERGY_UNIT_ID, unitId);
-        return baseMapper.selectList(queryWrapper);
-    }
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓ID鑾峰彇绉熸埛涓嬫墍鏈夋湁鏁堢殑瀹炰綋琛ㄩ泦鍚�
-     *
-     * @param unitId
-     * @return
-     */
-    @Override
-    public List<EnergyUnitToDevice> queryTenantEntityMeterByUnitId(String unitId) {
-
-        List<EnergyUnitToDevice> unitToDeviceList = baseMapper.selectList(Wrappers.<EnergyUnitToDevice>lambdaQuery()
-                .eq(EnergyUnitToDevice::getEnergyUnitId, unitId)
-        );
-//        if (CollectionUtils.isNotEmpty(unitToDeviceList)) {
-//            List<String> meterIds = unitToDeviceList.stream().map(EnergyUnitToDevice::getId).collect(Collectors.toList());
-//            // 杩囨护鍑哄疄浣撹〃
-//            Integer applianceType = EquipmentInformationEnum.MEASURING_INSTRUMENT_TYPE.ENTITY.getValue();
-//            List<Meter> meterList = meterService.list(Wrappers.<Meter>lambdaQuery()
-//                    .select(Meter::getId).in(Meter::getId, meterIds)
-//                    .eq(Meter::getApplianceType, applianceType)
-//            );
-//            List<String> newMeterIds = meterList.stream().map(Meter::getId).collect(Collectors.toList());
-//            unitToDeviceList = unitToDeviceList.stream().filter(li -> newMeterIds.contains(li.getId())).collect(Collectors.toList());
-//        }
-        return unitToDeviceList;
-    }
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     * @return 浠〃id闆嗗悎
-     */
-    @Override
-//    @Cacheable(value = CacheConstant.ENERGY_UNIT_DEVICE_ID_CACHE, key = "#unitId", unless = "#result == null")
-    public List<String> getEnergyUnitDeviceIdByUnitId(String unitId) {
-
-        if (StringUtils.isEmpty(unitId)) {
-            return Collections.emptyList();
-        }
-        List<EnergyUnitToDevice> energyUnitToDevices = baseMapper.selectList(Wrappers.<EnergyUnitToDevice>lambdaQuery()
-                .select(EnergyUnitToDevice::getId).eq(EnergyUnitToDevice::getEnergyUnitId, unitId)
-        );
-        if (CollectionUtils.isEmpty(energyUnitToDevices)) {
-            return Collections.emptyList();
-        }
-        return energyUnitToDevices.stream().map(EnergyUnitToDevice::getId).collect(Collectors.toList());
-    }
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id闆嗗悎鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitIds 鐢ㄨ兘鍗曞厓id
-     */
-    @Override
-    public List<String> getEnergyUnitDeviceIdByUnitIds(List<String> unitIds) {
-        if (CollectionUtils.isEmpty(unitIds)) {
-            return Collections.emptyList();
-        }
-        List<String> deviceIdList = new ArrayList<>();
-        for (String unitId : unitIds) {
-            List<String> unitDeviceIdByUnitId = this.getEnergyUnitDeviceIdByUnitId(unitId);
-            if (CollectionUtils.isNotEmpty(unitDeviceIdByUnitId)) {
-                deviceIdList.addAll(unitDeviceIdByUnitId);
-            }
-        }
-        return deviceIdList;
-    }
-
-    /**
-     * 鏍规嵁鐢ㄨ兘鍗曞厓id闆嗗悎+鑳芥簮绫诲瀷鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitIds 鐢ㄨ兘鍗曞厓id闆嗗悎
-     * @return
-     */
-    @Override
-    public List<String> getDeviceIdByUnitIds(List<String> unitIds) {
-        if (CollectionUtils.isEmpty(unitIds)) {
-            return Collections.emptyList();
-        }
-
-        return baseMapper.listDeviceByTenantIds(unitIds);
-    }
-
-    /**
-     * 鏇存柊鑳藉崟鍏僫d鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     * @return 浠〃id闆嗗悎
-     */
-    @Override
-//    @CachePut(value = CacheConstant.ENERGY_UNIT_DEVICE_ID_CACHE, key = "#unitId", unless = "#result == null")
-    public List<String> updateEnergyUnitDeviceIdByUnitId(String unitId) {
-
-        if (StringUtils.isEmpty(unitId)) {
-            return Collections.emptyList();
-        }
-        List<EnergyUnitToDevice> energyUnitToDevices = baseMapper.selectList(Wrappers.<EnergyUnitToDevice>lambdaQuery()
-                .select(EnergyUnitToDevice::getId).eq(EnergyUnitToDevice::getEnergyUnitId, unitId)
-        );
-        if (CollectionUtils.isEmpty(energyUnitToDevices)) {
-            return Collections.emptyList();
-        }
-        return energyUnitToDevices.stream().map(EnergyUnitToDevice::getId).collect(Collectors.toList());
-    }
-
-    /**
-     * 鍒犻櫎鑳藉崟鍏僫d鑾峰彇绉熸埛涓嬫湁鏁堢殑浠〃id闆嗗悎
-     *
-     * @param unitId 鐢ㄨ兘鍗曞厓id
-     */
-    @Override
-//    @CacheEvict(value = CacheConstant.ENERGY_UNIT_DEVICE_ID_CACHE, key = "#unitId")
-    public void deleteEnergyUnitDeviceIdByUnitId(String unitId) {
-    }
-
-    @Override
-    public List<ListElectricityMeterVO> listElectricityMeter(String unitId) {
-
-        LambdaQueryWrapper<EnergyUnitToDevice> queryWrapper = new LambdaQueryWrapper<EnergyUnitToDevice>()
-                .eq(EnergyUnitToDevice::getEnergyUnitId, unitId);
-//                .eq(EnergyUnitToDevice::getDeviceType, EnergyTypeConst.ELECTRICITY);
-        List<EnergyUnitToDevice> models = baseMapper.selectList(queryWrapper);
-
-        List<ListElectricityMeterVO> resultList = new ArrayList<>();
-        for (EnergyUnitToDevice model : models) {
-            ListElectricityMeterVO temp = new ListElectricityMeterVO();
-            temp.setCode(model.getId());
-            temp.setLabel(model.getName());
-            resultList.add(temp);
-        }
-        return resultList;
-    }
-
-    @Override
-    public List<EnergyUnitToDevice> listAllMeter() {
-        QueryWrapper<EnergyUnitToDevice> queryWrapper = new QueryWrapper<EnergyUnitToDevice>();
-        return baseMapper.selectList(queryWrapper);
-    }
-
-    @Override
-    public EnergyUnitToDevice getEnergyUnitToDeviceById(String unitId, String id) {
-        if (StringUtils.isEmpty(id)) {
-            return null;
-        }
-        LambdaQueryWrapper<EnergyUnitToDevice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-        lambdaQueryWrapper.eq(EnergyUnitToDevice::getEnergyUnitId, unitId);
-        lambdaQueryWrapper.eq(EnergyUnitToDevice::getId, id);
-        List<EnergyUnitToDevice> energyUnitToDevices = baseMapper.selectList(lambdaQueryWrapper);
-        if (CollectionUtils.isNotEmpty(energyUnitToDevices)) {
-            return energyUnitToDevices.get(CommonConst.DIGIT_0);
-        }
-        return null;
-    }
-
-    /**
-     * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ涓庣敤鑳界殑鍏崇郴
-     *
-     * @param unitIds
-     * @return
-     */
-    @Override
-    public List<UnitToDeviceRelationVO> listDeviceByUnitIds(List<String> unitIds) {
-        List<UnitToDeviceRelationVO> relationList = new ArrayList<>();
-        if (CollectionUtils.isEmpty(unitIds)) {
-            return relationList;
-        }
-        List<EnergyUnitToDevice> unitToDeviceList = baseMapper.selectList(Wrappers.<EnergyUnitToDevice>lambdaQuery()
-                .select(EnergyUnitToDevice::getId, EnergyUnitToDevice::getEnergyUnitId, EnergyUnitToDevice::getName)
-                .in(EnergyUnitToDevice::getEnergyUnitId, unitIds)
-        );
-        if (CollectionUtils.isNotEmpty(unitToDeviceList)) {
-            unitToDeviceList.forEach(li -> {
-                UnitToDeviceRelationVO vo = new UnitToDeviceRelationVO();
-                vo.setDeviceId(li.getId());
-                vo.setUnitId(li.getEnergyUnitId());
-                vo.setDeviceName(li.getName());
-                relationList.add(vo);
-            });
-        }
-        return relationList;
-    }
-}
diff --git a/zhitan-system/src/main/java/com/zhitan/home/service/HomePageServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/home/service/HomePageServiceImpl.java
index 201c59f..d7ac636 100644
--- a/zhitan-system/src/main/java/com/zhitan/home/service/HomePageServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/home/service/HomePageServiceImpl.java
@@ -66,10 +66,13 @@
     @Override
     public List<HomeEnergyStatisticsVO> energyConsumptionSummation(String timeType, String modelcode) {
         Date currentTime = new Date();
-//        Date currentTime = DateUtil.parseDateTime("2023-04-11 00:00:00");
 
         DateTime tongbiTime = DateUtil.offsetMonth(currentTime, -12);
         DateTime huanbiTime = DateUtil.offsetMonth(currentTime, -1);
+        if(TimeType.DAY.name().equals( timeType)){
+            huanbiTime = DateUtil.offsetDay(currentTime, -1);
+        }
+
         final List<HomeEnergyStatisticsVO> current = getEnergyTotalByTime(timeType, modelcode, currentTime);
         final List<HomeEnergyStatisticsVO> tongbi = getEnergyTotalByTime(timeType, modelcode, tongbiTime);
         final List<HomeEnergyStatisticsVO> huanbi = getEnergyTotalByTime(timeType, modelcode, huanbiTime);
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..c9af73f 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
@@ -75,18 +75,21 @@
 
   @ApiModelProperty(value = "琛ㄨid")
   private String meterId;
+
   @ApiModelProperty(value = "椤哄簭鍙�")
   @Excel(name = "椤哄簭鍙�")
   private int orderNum;
 
   @ApiModelProperty(value = "")
   private String equipment;
+
   @ApiModelProperty(value = "id")
   private String energyId;
 
   @Transient
   @TableField(exist = false)
   private  String meterName;
+
   public void setIndexId(String indexId) {
     this.indexId = indexId;
   }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java b/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java
new file mode 100644
index 0000000..b4de1e1
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/model/domain/NodeIndex.java
@@ -0,0 +1,26 @@
+package com.zhitan.model.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 妯″瀷鑺傜偣涓庢寚鏍囩殑鍏宠仈鍏崇郴(NodeIndex)瀹炰綋绫�
+ *
+ * @author makejava
+ * @since 2025-02-10 15:08:14
+ */
+@Data
+public class NodeIndex implements Serializable {
+    private static final long serialVersionUID = 386292923712960012L;
+    /**
+     * 鑺傜偣涓婚敭
+     */
+    private String nodeId;
+    /**
+     * 鎸囨爣涓婚敭
+     */
+    private String indexId;
+
+}
+
diff --git a/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java b/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
index 3df1018..9b6bb93 100644
--- a/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
+++ b/zhitan-system/src/main/java/com/zhitan/model/mapper/ModelNodeMapper.java
@@ -5,11 +5,14 @@
 import com.zhitan.basicdata.domain.MeterImplement;
 import com.zhitan.basicdata.domain.SysEnergy;
 import com.zhitan.basicdata.domain.SysProduct;
+import com.zhitan.common.enums.TimeType;
+import com.zhitan.dataitem.domain.vo.NodeIndexValueVO;
 import com.zhitan.model.domain.EnergyIndex;
 import com.zhitan.model.domain.ModelNode;
 import com.zhitan.model.domain.vo.ModelNodeIndexInfor;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 
@@ -196,4 +199,20 @@
     ModelNode getFirstModeNodeInfo(String modelCode);
 
     List<ModelNodeIndexInfor> selectIndexByNodeIds(@Param("modelCode") String modelCode,@Param("nodeIds") List<String> nodeIds);
+
+    /**
+     * 鏍规嵁鐖惰妭鐐筰d鍜岃兘婧愮被鍨嬫煡璇㈢偣浣嶄笅鐨勭疮绉噺
+     */
+    List<NodeIndexValueVO> getDataItemByParentNodeId(@Param("parentId") String parentId,
+                                                     @Param("energyType") String energyType,
+                                                     @Param("timeType") TimeType timeType,
+                                                     @Param("dateTimeMap") Map<String, LocalDateTime> dateTimeMap);
+
+    /**
+     * 鏍规嵁鑺傜偣id鍜岃兘婧愮被鍨嬫煡璇㈢偣浣嶄笅鐨勭疮绉噺
+     */
+    List<NodeIndexValueVO> getDataItemByNodeId(@Param("nodeId") String nodeId,
+                                                     @Param("energyType") String energyType,
+                                                     @Param("timeType") TimeType timeType,
+                                                     @Param("dateTimeMap") Map<String, LocalDateTime> dateTimeMap);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java b/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java
new file mode 100644
index 0000000..92808f2
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/model/mapper/NodeIndexMapper.java
@@ -0,0 +1,15 @@
+package com.zhitan.model.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhitan.model.domain.NodeIndex;
+
+/**
+ * 妯″瀷鑺傜偣涓庢寚鏍囩殑鍏宠仈鍏崇郴(NodeIndex)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2025-02-10 15:09:17
+ */
+public interface NodeIndexMapper extends BaseMapper<NodeIndex> {
+
+}
+
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..1f4c23c 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
@@ -13,107 +13,125 @@
  * @author fanxinfu
  * @date 2020-02-14
  */
-public interface IEnergyIndexService  {
+public interface IEnergyIndexService {
 
-  EnergyIndex getiEnergyIndexByCode(String code);
+    EnergyIndex getiEnergyIndexByCode(String code);
 
-  /**
-   * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ鐐逛綅淇℃伅
-   *
-   * @param meterId 璁¢噺鍣ㄥ叿id闆嗗悎
-   * @return
-   */
-  List<EnergyIndex> listIndexByMeterIds(String nodeId,List<String> meterId);
+    /**
+     * 鏍规嵁璁¢噺鍣ㄥ叿id闆嗗悎鏌ヨ鐐逛綅淇℃伅
+     *
+     * @param meterId 璁¢噺鍣ㄥ叿id闆嗗悎
+     * @return
+     */
+    List<EnergyIndex> listIndexByMeterIds(String nodeId, List<String> meterId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅
-   *
-   * @param indexId 鎸囨爣淇℃伅ID
-   * @return 鎸囨爣淇℃伅
-   */
-  EnergyIndex selectEnergyIndexById(String indexId);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param indexId 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    EnergyIndex selectEnergyIndexById(String indexId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅
-   *
-   * @param indexId 鎸囨爣淇℃伅ID
-   * @return 鎸囨爣淇℃伅
-   */
-  List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param indexId 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 鎸囨爣淇℃伅闆嗗悎
-   */
-  List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+     *
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 鎸囨爣淇℃伅闆嗗悎
+     */
+    List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
 
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
-   *
-   * @param query 鎸囨爣淇℃伅
-   * @return 鎸囨爣淇℃伅闆嗗悎
-   */
-  List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query);
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+     *
+     * @param query 鎸囨爣淇℃伅
+     * @return 鎸囨爣淇℃伅闆嗗悎
+     */
+    List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query);
 
-  /**
-   * 鏂板鎸囨爣淇℃伅
-   *
-   * @param nodeId
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  int insertEnergyIndex(String nodeId, EnergyIndex energyIndex);
+    /**
+     * 鏂板鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    int insertEnergyIndex(String nodeId, EnergyIndex energyIndex);
 
-  /**
-   * 淇敼鎸囨爣淇℃伅
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  int updateEnergyIndex(EnergyIndex energyIndex);
+    /**
+     * 淇敼鎸囨爣淇℃伅
+     *
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    int updateEnergyIndex(EnergyIndex energyIndex);
 
-  /**
-   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
-   *
-   *
-   * @param nodeId
-   * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
-   * @return 缁撴灉
-   */
-  int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
+    /**
+     * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
+     * @return 缁撴灉
+     */
+    int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
 
-  boolean energyIndexHasExist(String code);
+    boolean energyIndexHasExist(String code);
 
-  boolean energyIndexHasExist(String indexId, String code);
+    boolean energyIndexHasExist(String indexId, String code);
 
-  AjaxResult addMeterIndex(String meterId);
+    AjaxResult addMeterIndex(String meterId);
 
-  List<EnergyIndex> getMeterIndex(String meterId);
+    List<EnergyIndex> getMeterIndex(String meterId);
 
-  boolean modelHasConfig(String modelCode);
+    boolean modelHasConfig(String modelCode);
 
-  List<EnergyIndex> selectCollectIndex(String deviceId);
+    List<EnergyIndex> selectCollectIndex(String deviceId);
 
-  List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
+    List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
 
-  List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
+    List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
 
-  List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
+    List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
 
-  List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
+    List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
 
-  void removeNodeIndex(String nodeId, List<String> removeLink);
+    void removeNodeIndex(String nodeId, List<String> removeLink);
 
-  AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport);
+    AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport);
 
-  List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
+    List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
 
-  Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize);
+    Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize);
 
-  Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds,String code,
-                                      String name,Long pageNum, Long pageSize);
+    Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds, String code,
+                                        String name, Long pageNum, Long pageSize);
 
-  List<EnergyIndex> getIndexByCode(String code,String nodeId);
+    List<EnergyIndex> getIndexByCode(String code, String nodeId);
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId    鑺傜偣id
+     * @param meterId   璁惧id
+     * @param indexCode 鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+     * @return
+     */
+    EnergyIndex getDeviceIndexByCode(String nodeId, String meterId, String indexCode);
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId  鑺傜偣id
+     * @param meterId 璁惧id
+     * @return
+     */
+    List<EnergyIndex> listDeviceIndex(String nodeId, String meterId);
 }
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..aa5f76f 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;
 
@@ -33,286 +35,333 @@
 @Service
 public class EnergyIndexServiceImpl implements IEnergyIndexService {
 
-  @Autowired
-  private EnergyIndexMapper energyIndexMapper;
-  @Autowired
-  private IDaqTemplateService daqTemplateService;
-  @Autowired
-  private IMeterImplementService meterImplementService;
-  @Autowired
-  private IModelNodeService modelNodeService;
+    @Autowired
+    private EnergyIndexMapper energyIndexMapper;
+    @Autowired
+    private IDaqTemplateService daqTemplateService;
+    @Autowired
+    private IMeterImplementService meterImplementService;
+    @Autowired
+    private IModelNodeService modelNodeService;
 
-  @Autowired
-  private ModelNodeMapper modelNodeMapper;
+    @Autowired
+    private ModelNodeMapper modelNodeMapper;
 
-  @Override
-  public EnergyIndex getiEnergyIndexByCode(String code) {
-    return energyIndexMapper.getiEnergyIndexByCode(code);
-  }
-
-  @Override
-  public List<EnergyIndex> listIndexByMeterIds(String nodeId, List<String> meterId) {
-    return energyIndexMapper.listIndexByMeterIds(nodeId,meterId);
-  }
-
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅
-   *
-   * @param indexId 鎸囨爣淇℃伅ID
-   * @return 鎸囨爣淇℃伅
-   */
-  @Override
-  public EnergyIndex selectEnergyIndexById(String indexId) {
-    return energyIndexMapper.selectEnergyIndexById(indexId);
-  }
-
-  @Override
-  public List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId) {
-    if (CollectionUtils.isEmpty(indexId)) {
-      return Collections.emptyList();
-    }
-    return energyIndexMapper.selectEnergyIndexByIds(indexId);
-  }
-
-  @Override
-  public List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex) {
-    return energyIndexMapper.selectEnergyIndexList(energyIndex);
-  }
-
-  /**
-   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 鎸囨爣淇℃伅
-   */
-  @Override
-  public List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query) {
-    return energyIndexMapper.selectEnergyIndex(query);
-  }
-
-  /**
-   * 鏂板鎸囨爣淇℃伅
-   *
-   * @param nodeId
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  @Override
-  public int insertEnergyIndex(String nodeId, EnergyIndex energyIndex) {
-    energyIndex.setNodeId(nodeId);
-    energyIndexMapper.insertEnergyIndex( energyIndex);
-    return energyIndexMapper.insertNodeIndex(nodeId,energyIndex.getIndexId());
-  }
-
-  /**
-   * 淇敼鎸囨爣淇℃伅
-   *
-   * @param energyIndex 鎸囨爣淇℃伅
-   * @return 缁撴灉
-   */
-  @Override
-  public int updateEnergyIndex(EnergyIndex energyIndex) {
-    return energyIndexMapper.updateEnergyIndex(energyIndex);
-  }
-
-  /**
-   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
-   *
-   * @param nodeId
-   * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
-   * @return 缁撴灉
-   */
-  @Override
-  public int deleteEnergyIndexByIds(String nodeId, String[] indexIds) {
-    return energyIndexMapper.deleteEnergyIndexByIds(nodeId, indexIds);
-  }
-
-  @Override
-  public boolean energyIndexHasExist(String code) {
-    int count = energyIndexMapper.energyIndexHasExist(code);
-    return count > 0;
-  }
-
-  @Override
-  public boolean energyIndexHasExist(String indexId, String code) {
-    int count = energyIndexMapper.energyIndexHasExistWhenUpdate(indexId, code);
-    return count > 0;
-  }
-
-  @Override
-  public AjaxResult addMeterIndex(String meterId) {
-    MeterImplement meterImplement = meterImplementService.selectMeterImplementById(meterId);
-    if (meterImplement == null) {
-      return AjaxResult.error("鎵句笉鍒板搴旂殑璁¢噺鍣ㄥ叿锛�");
+    @Override
+    public EnergyIndex getiEnergyIndexByCode(String code) {
+        return energyIndexMapper.getiEnergyIndexByCode(code);
     }
 
-    DaqTemplate query = new DaqTemplate();
-    query.setDeviceType(meterImplement.getMeterType());
-    List<DaqTemplate> daqTemplates = daqTemplateService.selectDaqTemplateList(query);
-    if (daqTemplates.isEmpty()) {
-      return AjaxResult.error("璁¢噺鍣ㄥ叿鎵�灞炵殑绫诲瀷娌℃湁鎵惧埌瀵瑰簲鐨勬ā鏉匡紒");
+    @Override
+    public List<EnergyIndex> listIndexByMeterIds(String nodeId, List<String> meterId) {
+        return energyIndexMapper.listIndexByMeterIds(nodeId, meterId);
     }
 
-    List<EnergyIndex> energyIndices = new ArrayList<>();
-    daqTemplates.forEach(daqTemplate -> {
-      EnergyIndex energyIndex = new EnergyIndex();
-      energyIndex.setIndexId(UUID.randomUUID().toString());
-      energyIndex.setCode(meterImplement.getCode() + "_" + daqTemplate.getCode());
-      energyIndex.setName(daqTemplate.getName());
-      energyIndex.setUnitId(daqTemplate.getUnit());
-      energyIndex.setIndexType(IndexType.COLLECT);
-      energyIndex.setMeterId(meterId);
-      energyIndices.add(energyIndex);
-    });
-
-    energyIndexMapper.deleteIndexByMeterId(meterId);
-    energyIndexMapper.insertEnergyIndices(energyIndices);
-    return AjaxResult.success();
-  }
-
-  @Override
-  public List<EnergyIndex> getMeterIndex(String meterId) {
-    return energyIndexMapper.getMeterIndex(meterId);
-  }
-
-  @Override
-  public boolean modelHasConfig(String modelCode) {
-    int count = energyIndexMapper.modelHasConfig(modelCode);
-    return count > 0;
-  }
-
-  @Override
-  public List<EnergyIndex> selectCollectIndex(String deviceId) {
-    return energyIndexMapper.selectCollectIndex(deviceId);
-  }
-
-  @Override
-  public List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds) {
-    return energyIndexMapper.getEnergyIndexByIds(indexIds);
-  }
-
-  @Override
-  public List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes) {
-    if (indexCodes.isEmpty()) {
-      return new ArrayList<>();
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param indexId 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    @Override
+    public EnergyIndex selectEnergyIndexById(String indexId) {
+        return energyIndexMapper.selectEnergyIndexById(indexId);
     }
 
-    return energyIndexMapper.getEnergyIndexByCodes(indexCodes);
-  }
-
-  @Override
-  public List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId) {
-    return energyIndexMapper.getIndexByNodeAndChildrenNode(nodeId);
-  }
-
-  @Override
-  public List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter) {
-    return energyIndexMapper.searchIndexByNodeAndChildrenNode(nodeId, filter);
-  }
-
-  @Override
-  public void removeNodeIndex(String nodeId, List<String> removeLink) {
-    energyIndexMapper.removeNodeIndex(nodeId, removeLink);
-  }
-
-  @Override
-  public AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport) {
-    List<String> codes = energyIndexList.stream().map(EnergyIndex::getCode)
-        .collect(Collectors.toList());
-    List<String> nodeCodes = energyIndexList.stream().map(EnergyIndex::getNodeId)
-        .collect(Collectors.toList());
-    List<EnergyIndex> indexList = energyIndexMapper.getEnergyIndexByCodes(codes);
-    List<ModelNode> modelNodes = modelNodeService.getModelNodeByNodeCodes(nodeCodes);
-    Map<String, String> nodeCodeToId = modelNodes.stream()
-        .collect(Collectors.toMap(ModelNode::getCode, ModelNode::getNodeId));
-    Set<String> cacheIndexCodes = indexList.stream().map(EnergyIndex::getCode)
-        .collect(Collectors.toSet());
-
-    List<EnergyIndex> insertData = new ArrayList<>();
-    List<EnergyIndex> updateData = new ArrayList<>();
-    List<String> errorNodeCode = new ArrayList<>();
-    List<String> insertIndexCode = new ArrayList<>();
-    AtomicBoolean existDuplicateCode = new AtomicBoolean(false);
-    energyIndexList.forEach(energyIndex -> {
-      if (cacheIndexCodes.contains(energyIndex.getCode())) {
-        updateData.add(energyIndex);
-      } else {
-        String nodeCode = energyIndex.getNodeId();
-        if (nodeCodeToId.containsKey(nodeCode)) {
-          if (!insertIndexCode.contains(energyIndex.getCode())) {
-            insertIndexCode.add(energyIndex.getCode());
-            energyIndex.setIndexId(UUID.randomUUID().toString());
-            energyIndex.setNodeId(nodeCodeToId.get(nodeCode));
-            insertData.add(energyIndex);
-          } else {
-            existDuplicateCode.set(true);
-          }
-        } else if (!errorNodeCode.contains(nodeCode)) {
-          errorNodeCode.add(nodeCode);
+    @Override
+    public List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId) {
+        if (CollectionUtils.isEmpty(indexId)) {
+            return Collections.emptyList();
         }
-      }
-    });
-
-    if (updateSupport && !updateData.isEmpty()) {
-      updateData.forEach(energyIndexMapper::updateEnergyIndex);
+        return energyIndexMapper.selectEnergyIndexByIds(indexId);
     }
 
-    if (!insertData.isEmpty()) {
-      energyIndexMapper.saveEnergyIndex(insertData);
+    @Override
+    public List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex) {
+        return energyIndexMapper.selectEnergyIndexList(energyIndex);
     }
 
-    String errMsg = "";
-    if (existDuplicateCode.get()) {
-      errMsg += "瀛樺湪閲嶅鐨勬寚鏍囩紪鐮侊紝宸茶嚜鍔ㄨ繃婊わ紒";
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+     *
+     * @return 鎸囨爣淇℃伅
+     */
+    @Override
+    public List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query) {
+        return energyIndexMapper.selectEnergyIndex(query);
     }
 
-    if (!errorNodeCode.isEmpty()) {
-      errMsg += String.join(",", errorNodeCode) + "娌℃湁鎵惧埌瀵瑰簲鐨勮妭鐐规暟鎹紝鍥犳鍏朵笅鐨勬墍鏈夋寚鏍囧鍏ュけ璐ワ紒";
+    /**
+     * 鏂板鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyIndex(String nodeId, EnergyIndex energyIndex) {
+        energyIndex.setNodeId(nodeId);
+        energyIndexMapper.insertEnergyIndex(energyIndex);
+        return energyIndexMapper.insertNodeIndex(nodeId, energyIndex.getIndexId());
     }
 
-    if (StringUtils.isNotBlank(errMsg)) {
-      return AjaxResult.error(errMsg);
-    }
-    return AjaxResult.success("瀵煎叆鎴愬姛锛�");
-  }
-
-  @Override
-  public List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes) {
-    if (indexCodes.isEmpty()) {
-      return new ArrayList<>();
+    /**
+     * 淇敼鎸囨爣淇℃伅
+     *
+     * @param energyIndex 鎸囨爣淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyIndex(EnergyIndex energyIndex) {
+        return energyIndexMapper.updateEnergyIndex(energyIndex);
     }
 
-    return energyIndexMapper.getEnergyIndexMeterByCodes(indexCodes);
-  }
+    /**
+     * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+     *
+     * @param nodeId
+     * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyIndexByIds(String nodeId, String[] indexIds) {
+        return energyIndexMapper.deleteEnergyIndexByIds(nodeId, indexIds);
+    }
 
-  /**
-   * @description: hmj 鍒嗛〉鏌ヨ
-   * @param query
-   * @param pageNum
-   * @param pageSize
-   * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.zhitan.model.domain.EnergyIndex>
-   * @author: hmj
-   * @date: 2024/10/11 23:56
-   */
-  @Override
-  public Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize) {
-    return  energyIndexMapper.selectEnergyIndexPage(new Page<>(pageNum,pageSize),query);
-  }
+    @Override
+    public boolean energyIndexHasExist(String code) {
+        int count = energyIndexMapper.energyIndexHasExist(code);
+        return count > 0;
+    }
 
-  @Override
-  public Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds,String code,
-                                             String name,Long pageNum, Long pageSize) {
-    LambdaQueryWrapper<EnergyIndex> queryWrapper = new LambdaQueryWrapper<>();
-    queryWrapper.in(EnergyIndex::getMeterId,meterIndexIds);
-    queryWrapper.like(StringUtils.isNotEmpty(code),EnergyIndex::getCode,code);
-    queryWrapper.like(StringUtils.isNotEmpty(name),EnergyIndex::getName,name);
-    return energyIndexMapper.selectPage(new Page<>(pageNum,pageSize),queryWrapper);
-  }
+    @Override
+    public boolean energyIndexHasExist(String indexId, String code) {
+        int count = energyIndexMapper.energyIndexHasExistWhenUpdate(indexId, code);
+        return count > 0;
+    }
 
-  @Override
-  public List<EnergyIndex> getIndexByCode(String code, String nodeId) {
-    List<EnergyIndex> energyIndexList =  energyIndexMapper.getIndexByCode(code,nodeId);
+    @Override
+    public AjaxResult addMeterIndex(String meterId) {
+        MeterImplement meterImplement = meterImplementService.selectMeterImplementById(meterId);
+        if (meterImplement == null) {
+            return AjaxResult.error("鎵句笉鍒板搴旂殑璁¢噺鍣ㄥ叿锛�");
+        }
 
-    return energyIndexList;
-  }
+        DaqTemplate query = new DaqTemplate();
+        query.setDeviceType(meterImplement.getMeterType());
+        List<DaqTemplate> daqTemplates = daqTemplateService.selectDaqTemplateList(query);
+        if (daqTemplates.isEmpty()) {
+            return AjaxResult.error("璁¢噺鍣ㄥ叿鎵�灞炵殑绫诲瀷娌℃湁鎵惧埌瀵瑰簲鐨勬ā鏉匡紒");
+        }
+
+        List<EnergyIndex> energyIndices = new ArrayList<>();
+        daqTemplates.forEach(daqTemplate -> {
+            EnergyIndex energyIndex = new EnergyIndex();
+            energyIndex.setIndexId(UUID.randomUUID().toString());
+            energyIndex.setCode(meterImplement.getCode() + "_" + daqTemplate.getCode());
+            energyIndex.setName(daqTemplate.getName());
+            energyIndex.setUnitId(daqTemplate.getUnit());
+            energyIndex.setIndexType(IndexType.COLLECT);
+            energyIndex.setMeterId(meterId);
+            energyIndices.add(energyIndex);
+        });
+
+        energyIndexMapper.deleteIndexByMeterId(meterId);
+        energyIndexMapper.insertEnergyIndices(energyIndices);
+        return AjaxResult.success();
+    }
+
+    @Override
+    public List<EnergyIndex> getMeterIndex(String meterId) {
+        return energyIndexMapper.getMeterIndex(meterId);
+    }
+
+    @Override
+    public boolean modelHasConfig(String modelCode) {
+        int count = energyIndexMapper.modelHasConfig(modelCode);
+        return count > 0;
+    }
+
+    @Override
+    public List<EnergyIndex> selectCollectIndex(String deviceId) {
+        return energyIndexMapper.selectCollectIndex(deviceId);
+    }
+
+    @Override
+    public List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds) {
+        return energyIndexMapper.getEnergyIndexByIds(indexIds);
+    }
+
+    @Override
+    public List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes) {
+        if (indexCodes.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        return energyIndexMapper.getEnergyIndexByCodes(indexCodes);
+    }
+
+    @Override
+    public List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId) {
+        return energyIndexMapper.getIndexByNodeAndChildrenNode(nodeId);
+    }
+
+    @Override
+    public List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter) {
+        return energyIndexMapper.searchIndexByNodeAndChildrenNode(nodeId, filter);
+    }
+
+    @Override
+    public void removeNodeIndex(String nodeId, List<String> removeLink) {
+        energyIndexMapper.removeNodeIndex(nodeId, removeLink);
+    }
+
+    @Override
+    public AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport) {
+        List<String> codes = energyIndexList.stream().map(EnergyIndex::getCode)
+                .collect(Collectors.toList());
+        List<String> nodeCodes = energyIndexList.stream().map(EnergyIndex::getNodeId)
+                .collect(Collectors.toList());
+        List<EnergyIndex> indexList = energyIndexMapper.getEnergyIndexByCodes(codes);
+        List<ModelNode> modelNodes = modelNodeService.getModelNodeByNodeCodes(nodeCodes);
+        Map<String, String> nodeCodeToId = modelNodes.stream()
+                .collect(Collectors.toMap(ModelNode::getCode, ModelNode::getNodeId));
+        Set<String> cacheIndexCodes = indexList.stream().map(EnergyIndex::getCode)
+                .collect(Collectors.toSet());
+
+        List<EnergyIndex> insertData = new ArrayList<>();
+        List<EnergyIndex> updateData = new ArrayList<>();
+        List<String> errorNodeCode = new ArrayList<>();
+        List<String> insertIndexCode = new ArrayList<>();
+        AtomicBoolean existDuplicateCode = new AtomicBoolean(false);
+        energyIndexList.forEach(energyIndex -> {
+            if (cacheIndexCodes.contains(energyIndex.getCode())) {
+                updateData.add(energyIndex);
+            } else {
+                String nodeCode = energyIndex.getNodeId();
+                if (nodeCodeToId.containsKey(nodeCode)) {
+                    if (!insertIndexCode.contains(energyIndex.getCode())) {
+                        insertIndexCode.add(energyIndex.getCode());
+                        energyIndex.setIndexId(UUID.randomUUID().toString());
+                        energyIndex.setNodeId(nodeCodeToId.get(nodeCode));
+                        insertData.add(energyIndex);
+                    } else {
+                        existDuplicateCode.set(true);
+                    }
+                } else if (!errorNodeCode.contains(nodeCode)) {
+                    errorNodeCode.add(nodeCode);
+                }
+            }
+        });
+
+        if (updateSupport && !updateData.isEmpty()) {
+            updateData.forEach(energyIndexMapper::updateEnergyIndex);
+        }
+
+        if (!insertData.isEmpty()) {
+            energyIndexMapper.saveEnergyIndex(insertData);
+        }
+
+        String errMsg = "";
+        if (existDuplicateCode.get()) {
+            errMsg += "瀛樺湪閲嶅鐨勬寚鏍囩紪鐮侊紝宸茶嚜鍔ㄨ繃婊わ紒";
+        }
+
+        if (!errorNodeCode.isEmpty()) {
+            errMsg += String.join(",", errorNodeCode) + "娌℃湁鎵惧埌瀵瑰簲鐨勮妭鐐规暟鎹紝鍥犳鍏朵笅鐨勬墍鏈夋寚鏍囧鍏ュけ璐ワ紒";
+        }
+
+        if (StringUtils.isNotBlank(errMsg)) {
+            return AjaxResult.error(errMsg);
+        }
+        return AjaxResult.success("瀵煎叆鎴愬姛锛�");
+    }
+
+    @Override
+    public List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes) {
+        if (indexCodes.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        return energyIndexMapper.getEnergyIndexMeterByCodes(indexCodes);
+    }
+
+    /**
+     * @param query
+     * @param pageNum
+     * @param pageSize
+     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.zhitan.model.domain.EnergyIndex>
+     * @description: hmj 鍒嗛〉鏌ヨ
+     * @author: hmj
+     * @date: 2024/10/11 23:56
+     */
+    @Override
+    public Page<EnergyIndex> selectEnergyIndexPage(EnergyIndexQuery query, Long pageNum, Long pageSize) {
+        return energyIndexMapper.selectEnergyIndexPage(new Page<>(pageNum, pageSize), query);
+    }
+
+    @Override
+    public Page<EnergyIndex> getMeterIndexList(List<String> meterIndexIds, String code,
+                                               String name, Long pageNum, Long pageSize) {
+        LambdaQueryWrapper<EnergyIndex> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(EnergyIndex::getMeterId, meterIndexIds);
+        queryWrapper.like(StringUtils.isNotEmpty(code), EnergyIndex::getCode, code);
+        queryWrapper.like(StringUtils.isNotEmpty(name), EnergyIndex::getName, name);
+        return energyIndexMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper);
+    }
+
+    @Override
+    public List<EnergyIndex> getIndexByCode(String code, String nodeId) {
+        List<EnergyIndex> energyIndexList = energyIndexMapper.getIndexByCode(code, nodeId);
+
+        return energyIndexList;
+    }
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId    鑺傜偣id
+     * @param meterId   璁惧id
+     * @param indexCode 鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+     * @return
+     */
+    @Override
+    public EnergyIndex getDeviceIndexByCode(String nodeId, String meterId, String indexCode) {
+
+        List<EnergyIndex> energyIndexList = listDeviceIndexByCode(nodeId, meterId, indexCode);
+        EnergyIndex energyIndex = energyIndexList.stream().findFirst().orElse(null);
+        if (ObjectUtils.isEmpty(energyIndex)) {
+            energyIndex = new EnergyIndex();
+        }
+        return energyIndex;
+    }
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId    鑺傜偣id
+     * @param meterId   璁惧id
+     * @param indexCode 鐐逛綅缂栫爜鎴栬�呯偣浣嶇紪鐮佺殑涓�閮ㄥ垎
+     * @return
+     */
+    public List<EnergyIndex> listDeviceIndexByCode(String nodeId, String meterId, String indexCode) {
+        return energyIndexMapper.selectList(Wrappers.<EnergyIndex>lambdaQuery()
+                .eq(EnergyIndex::getNodeId, nodeId)
+                .eq(EnergyIndex::getMeterId, meterId)
+                .like(EnergyIndex::getCode, indexCode));
+    }
+
+    /**
+     * 鏍规嵁鐢ㄨ兘鍗曞厓id鍜岃澶噄d锛屼互鍙婄偣浣嶇紪鐮佽幏鍙栫偣浣�
+     *
+     * @param nodeId  鑺傜偣id
+     * @param meterId 璁惧id
+     * @return
+     */
+    @Override
+    public List<EnergyIndex> listDeviceIndex(String nodeId, String meterId) {
+        return energyIndexMapper.selectList(Wrappers.<EnergyIndex>lambdaQuery()
+                .eq(EnergyIndex::getNodeId, nodeId)
+                .eq(EnergyIndex::getMeterId, meterId));
+    }
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/peakvalley/service/IPeakValleyService.java b/zhitan-system/src/main/java/com/zhitan/peakvalley/service/IPeakValleyService.java
index 7dca861..13c86d5 100644
--- a/zhitan-system/src/main/java/com/zhitan/peakvalley/service/IPeakValleyService.java
+++ b/zhitan-system/src/main/java/com/zhitan/peakvalley/service/IPeakValleyService.java
@@ -41,6 +41,11 @@
      */
     PeakValleyHourVO segmentAnalysisHour(PeakValleyDTO dto);
 
+    /**
+     * 灏栧嘲骞宠胺鍒嗘椂缁熻瀵煎嚭
+     * @param dto
+     * @return
+     */
     List<PeakValleyHourDataVO> segmentAnalysisHourExport(PeakValleyDTO dto);
 
     PeakValleyDayVO segmentAnalysisDayCustomize(PeakValleyDTO dto);
diff --git a/zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java
index 051b89b..4753201 100644
--- a/zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java
@@ -134,14 +134,23 @@
         List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
         if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
             Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
-            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
+            // 鏍规嵁灏忔椂鏁版嵁璁$畻澶╃殑鏁版嵁
+            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, TimeType.HOUR.name());
 
             electricityDataMap = dataItemList.stream()
                     .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
         }
         while (!startTime.after(endTime)) {
-            String mapKey = DateUtil.formatDateTime(startTime);
-            List<ElectricityDataItem> dataItemList = electricityDataMap.get(mapKey);
+
+            Date nextTime = DateUtil.offsetDay(startTime, 1);
+            List<ElectricityDataItem> dataItemList = new ArrayList<>();
+            for (Map.Entry<String, List<ElectricityDataItem>> entry : electricityDataMap.entrySet()) {
+                String key = entry.getKey();
+                if ((DateUtils.parseDate(key).after(startTime) || DateUtils.parseDate(key).equals(startTime)) && DateUtils.parseDate(key).before(nextTime)) {
+                    List<ElectricityDataItem> list = entry.getValue();
+                    dataItemList.addAll(list);
+                }
+            }
 
             BigDecimal sharpFee = BigDecimal.ZERO;
             BigDecimal sharpPower = BigDecimal.ZERO;
@@ -157,45 +166,19 @@
                     String electricityType = electricityDataItem.getElectricityType();
 
                     if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) {
-//                        sharpFee = sharpFee.add(electricityDataItem.getCost());
-
+                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                         sharpPower = sharpPower.add(electricityDataItem.getElectricity());
                     } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) {
-//                        peakFee = peakFee.add(electricityDataItem.getCost());
+                        peakFee = peakFee.add(electricityDataItem.getCost());
                         peakPower = peakPower.add(electricityDataItem.getElectricity());
                     } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) {
-//                        flatFee = flatFee.add(electricityDataItem.getCost());
+                        flatFee = flatFee.add(electricityDataItem.getCost());
                         flatPower = flatPower.add(electricityDataItem.getElectricity());
                     } else {
-//                        valleyFee = valleyFee.add(electricityDataItem.getCost());
+                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                         valleyPower = valleyPower.add(electricityDataItem.getElectricity());
                     }
                 }
-                //2024-11-12鏂板
-                CostPriceRelevancyVo voS =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name());
-                if(voS!=null){
-                    sharpFee = voS.getPrice().multiply(sharpPower);
-                }
-                CostPriceRelevancyVo voP =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name());
-                if(voP!=null){
-                    peakFee = voP.getPrice().multiply(peakPower);
-                }
-                CostPriceRelevancyVo voF =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name());
-                if(voF!=null){
-                    flatFee = voF.getPrice().multiply(flatPower);
-                }
-                CostPriceRelevancyVo voV =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name());
-                if(voV!=null){
-                    valleyFee = voV.getPrice().multiply(valleyPower);
-                }
-//                CostPriceRelevancyVo voD =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.DEEP.name());
-//                if(voV!=null){
-//                    DeepFee = voV.getPrice().multiply(valleyPower);
-//                }
-
-
-
-
             }
             PeakValleyDayDataVO peakAndValleyReportVO = new PeakValleyDayDataVO(startTime, sharpFee, sharpPower,
                     peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower);
@@ -355,39 +338,19 @@
                     String electricityType = electricityDataItem.getElectricityType();
 
                     if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) {
-//                        sharpFee = sharpFee.add(electricityDataItem.getCost());
+                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                         sharpPower = sharpPower.add(electricityDataItem.getElectricity());
                     } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) {
-//                        peakFee = peakFee.add(electricityDataItem.getCost());
+                        peakFee = peakFee.add(electricityDataItem.getCost());
                         peakPower = peakPower.add(electricityDataItem.getElectricity());
                     } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) {
-//                        flatFee = flatFee.add(electricityDataItem.getCost());
+                        flatFee = flatFee.add(electricityDataItem.getCost());
                         flatPower = flatPower.add(electricityDataItem.getElectricity());
                     } else {
-//                        valleyFee = valleyFee.add(electricityDataItem.getCost());
+                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                         valleyPower = valleyPower.add(electricityDataItem.getElectricity());
                     }
                 }
-                //2024-11-12鏂板
-                CostPriceRelevancyVo voS =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name());
-                if(voS!=null){
-                    sharpFee = voS.getPrice().multiply(sharpPower);
-                }
-                CostPriceRelevancyVo voP =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name());
-                if(voP!=null){
-                    peakFee = voP.getPrice().multiply(peakPower);
-                }
-                CostPriceRelevancyVo voF =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name());
-                if(voF!=null){
-                    flatFee = voF.getPrice().multiply(flatPower);
-                }
-                CostPriceRelevancyVo voV =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name());
-                if(voV!=null){
-                    valleyFee = voV.getPrice().multiply(valleyPower);
-                }
-
-
-
             }
             PeakValleyHourDataVO peakAndValleyReportVO = new PeakValleyHourDataVO(startTime, sharpFee, sharpPower,
                     peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower);
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/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java
new file mode 100644
index 0000000..968c4d7
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/dto/FlowChartsDTO.java
@@ -0,0 +1,60 @@
+package com.zhitan.statisticalAnalysis.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.zhitan.common.enums.TimeType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsDTO {
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    @EnumValue
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+    private TimeType timeType;
+
+    /**
+     * 鏌ヨ鏃堕棿
+     */
+    @NotNull(message = "鏌ヨ鏃堕棿涓嶈兘涓虹┖")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿")
+    private LocalDate queryTime;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    @NotBlank(message = "鑳芥簮绫诲瀷涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+    private String energyType;
+
+    /**
+     * 鑺傜偣id
+     */
+    @ApiModelProperty(value = "鑺傜偣id")
+    private String nodeId;
+
+    @NotBlank(message = "妯″瀷缂栫爜涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "妯″瀷缂栫爜")
+    private String modelCode;
+
+    public TimeType getTimeType() {
+        if (ObjectUtils.isEmpty(timeType)) {
+            return TimeType.DAY;
+        }
+        return timeType;
+    }
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java
new file mode 100644
index 0000000..4696561
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsItemVO.java
@@ -0,0 +1,34 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsItemVO {
+
+    /**
+     * 婧愬ご
+     */
+    @ApiModelProperty(value = "婧愬ご")
+    private String source;
+
+    /**
+     * 鐩爣
+     */
+    @ApiModelProperty(value = "鐩爣")
+    private String target;
+
+    /**
+     * 鍊�
+     */
+    @NotBlank(message = "鍊�")
+    @ApiModelProperty(value = "鍊�")
+    private BigDecimal value;
+
+}
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java
new file mode 100644
index 0000000..a0bf88e
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/FlowChartsVO.java
@@ -0,0 +1,68 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 鑳芥祦鍥炬煡璇�
+ */
+@Data
+public class FlowChartsVO {
+
+    // 鎬荤疮绉噺
+    @ApiModelProperty(value = "鎬荤疮绉噺")
+    private BigDecimal totalAccumulatedAmount;
+
+    // 瀛愯妭鐐圭疮绉噺
+    @ApiModelProperty(value = "瀛愯妭鐐圭疮绉噺")
+    private BigDecimal childNodeAccumulatedAmount;
+
+    // 宸��
+    @ApiModelProperty(value = "宸��")
+    private BigDecimal difference;
+
+    // 鑳借�楁崯澶辨瘮渚�
+    @ApiModelProperty(value = "鑳借�楁崯澶辨瘮渚�")
+    private BigDecimal energyLossRatio;
+
+    private List<FlowChartsItemVO> itemVOList;
+
+    public BigDecimal getTotalAccumulatedAmount() {
+        if (totalAccumulatedAmount == null){
+            return BigDecimal.ZERO;
+        }
+        return totalAccumulatedAmount;
+    }
+
+    public BigDecimal getChildNodeAccumulatedAmount() {
+        if (childNodeAccumulatedAmount == null){
+            return BigDecimal.ZERO;
+        }
+        return childNodeAccumulatedAmount;
+    }
+
+    public BigDecimal getDifference() {
+        return difference = totalAccumulatedAmount.subtract(childNodeAccumulatedAmount);
+    }
+
+    public BigDecimal getEnergyLossRatio() {
+        if (BigDecimal.ZERO.compareTo(totalAccumulatedAmount) == 0
+                || BigDecimal.ZERO.compareTo(difference) == 0){
+            return BigDecimal.ZERO;
+        }
+        return energyLossRatio = difference.divide(totalAccumulatedAmount, 2, RoundingMode.HALF_UP);
+    }
+
+    public FlowChartsVO() {
+        this.totalAccumulatedAmount = BigDecimal.ZERO;
+        this.childNodeAccumulatedAmount = BigDecimal.ZERO;
+        this.difference = BigDecimal.ZERO;
+        this.energyLossRatio = BigDecimal.ZERO;
+        this.itemVOList = Collections.emptyList();
+    }
+}
diff --git a/zhitan-system/src/main/resources/mapper/comprehensivestatistics/DailyComprehensiveMapper.xml b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/DailyComprehensiveMapper.xml
index 0380045..99bdde1 100644
--- a/zhitan-system/src/main/resources/mapper/comprehensivestatistics/DailyComprehensiveMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/DailyComprehensiveMapper.xml
@@ -35,7 +35,7 @@
         <result column="value0" property="value0"/>
     </resultMap>
     <!--鍏ㄥ巶鑳借�楃粺璁�-->
-    <select id="getdailyComprehensiveList" resultMap="dataItemMap">
+    <select id="getDailyComprehensiveList" resultType="com.zhitan.comprehensivestatistics.domain.DailyComprehensive">
         SELECT
             aa.index_id,
             aa.index_name,
@@ -72,7 +72,7 @@
         ORDER BY aa.order_num ASC
     </select>
 
-    <select id="getListChart" resultMap="dataItemMap">
+    <select id="getListChart" resultType="com.zhitan.comprehensivestatistics.domain.DailyComprehensive">
         SELECT
             di.index_id,
             ci.name AS "index_name",
diff --git a/zhitan-system/src/main/resources/mapper/comprehensivestatistics/MonthlyComprehensiveMapper.xml b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/MonthlyComprehensiveMapper.xml
new file mode 100644
index 0000000..7de48b9
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/MonthlyComprehensiveMapper.xml
@@ -0,0 +1,101 @@
+<?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.comprehensivestatistics.mapper.MonthlyComprehensiveMapper">
+    <resultMap id="dataItemMap" type="com.zhitan.comprehensivestatistics.domain.MonthlyComprehensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getMonthlyComprehensiveList" resultMap="dataItemMap">
+        SELECT
+            aa.index_id,
+            aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+        </foreach>
+            aa.time_type,
+            aa.order_num orderNum
+        FROM
+        (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt;= #{endTime}
+                AND di.time_type = #{timeType}
+            <if test="indexStorageId !='' and indexStorageId !=null">
+                and ei.energy_id=#{indexStorageId}
+            </if>
+        ) aa
+        GROUP BY
+        aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt;= #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        ORDER BY
+            di.time_code;
+    </select>
+</mapper>
diff --git a/zhitan-system/src/main/resources/mapper/comprehensivestatistics/YearComprehensiveMapper.xml b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/YearComprehensiveMapper.xml
new file mode 100644
index 0000000..e36e03c
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/comprehensivestatistics/YearComprehensiveMapper.xml
@@ -0,0 +1,81 @@
+<?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.comprehensivestatistics.mapper.YearComprehensiveMapper">
+    <resultMap id="dataItemMap" type="com.zhitan.comprehensivestatistics.domain.YearComperhensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getYearComprehensiveList" resultMap="dataItemMap">
+        SELECT
+            aa.index_id,
+            aa.index_name,
+            <foreach item="item" index="index" collection="dataList">
+                COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+            </foreach>
+            aa.time_type,
+            aa.order_num orderNum
+        FROM
+        (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt;= #{endTime}
+                AND di.time_type = #{timeType}
+            <if test="indexStorageId !='' and indexStorageId !=null">
+                and ei.energy_id=#{indexStorageId}
+            </if>
+        ) aa
+        GROUP BY aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        ORDER BY
+            di.time_code;
+    </select>
+</mapper>
diff --git a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
index 01c8c59..f0fe5ef 100644
--- a/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
+++ b/zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
@@ -89,9 +89,9 @@
             resultType="com.zhitan.model.domain.EnergyIndex">
         select ei.index_id as indexId, code, name, index_type as indexType
         from energy_index ei
-                 left join node_index ni on ei.index_id = ni.index_id
+        left join node_index ni on ei.index_id = ni.index_id
         where ni.node_id = #{nodeId}
-          and ei.index_type = #{indexType}
+        and ei.index_type = #{indexType}
         <if test="code != null  and code != ''">
             and code like concat('%', #{code}, '%')
         </if>
@@ -332,11 +332,12 @@
                node_category nodeCategory
         FROM "model_node"
         WHERE model_code = #{indexCode}
-          AND parent_id IS NULL LIMIT 1;
+          AND parent_id IS NULL
+        LIMIT 1;
     </select>
     <select id="selectIndexByModelCodeAndNodeId"
             resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id nodeId,
+        SELECT mn.node_id  nodeId,
                mn."name",
                ni.index_id indexId
         FROM model_node mn
@@ -347,15 +348,15 @@
 
     <select id="getSettingDeviceIndex" resultType="com.zhitan.basicdata.domain.MeterImplement">
         SELECT distinct
-               m."id",
-               m.code,
-               m.meter_name AS meterName,
-               m.meter_type    meterType,
-               m.wire_diameter    wireDiameter,
-               m.max_allowable_power    maxAllowablePower
+        m."id",
+        m.code,
+        m.meter_name AS meterName,
+        m.meter_type meterType,
+        m.wire_diameter wireDiameter,
+        m.max_allowable_power maxAllowablePower
         FROM meter_implement m
-                 LEFT JOIN energy_index ei ON ei.meter_id = m."id"
-                 LEFT JOIN node_index ni ON ni.index_id = ei.index_id
+        LEFT JOIN energy_index ei ON ei.meter_id = m."id"
+        LEFT JOIN node_index ni ON ni.index_id = ei.index_id
         WHERE ni.node_id = #{nodeId}
         <if test="energyType!=null and energyType!=''">
             AND M.energy_type = #{energyType}
@@ -365,11 +366,12 @@
     <delete id="delIndexNodeIdAndIndexType">
         delete
         from node_index
-        where node_id = #{nodeId} and index_id in (
-            select ni.index_id
-            from node_index ni left join energy_index ei on ni.index_id = ei.index_id
-            where node_id = #{nodeId} and ei.index_type = #{indexType}
-        );
+        where node_id = #{nodeId}
+          and index_id in (select ni.index_id
+                           from node_index ni
+                                    left join energy_index ei on ni.index_id = ei.index_id
+                           where node_id = #{nodeId}
+                             and ei.index_type = #{indexType});
     </delete>
     <insert id="setIndexAndNodeId">
         <foreach collection="indexIds" item="indexId" separator=";">
@@ -379,11 +381,11 @@
     </insert>
 
     <select id="getModelNodeIndexIdByNodeId" resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id  nodeId,
-               mn."name"   "name",
-               ni.index_id indexId,
-               ei.energy_id energyId,
-               ei.index_type indexType
+        SELECT mn.node_id nodeId,
+        mn."name" "name",
+        ni.index_id indexId,
+        ei.energy_id energyId,
+        ei.index_type indexType
         FROM "model_node" mn
         LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
         LEFT JOIN energy_index ei on ni.index_id = ei.index_id
@@ -400,16 +402,17 @@
         FROM "model_node" mn
                  LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
                  left join energy_index ei on ni.index_id = ei.index_id
-        WHERE mn.parent_id = #{parentId} and ei.index_type = 'STATISTIC'
+        WHERE mn.parent_id = #{parentId}
+          and ei.index_type = 'STATISTIC'
     </select>
     <select id="getFirstModeNodeInfo" resultType="com.zhitan.model.domain.ModelNode">
         <include refid="selectModelNodeVo"/>
-        where model_code = #{modelCode}  AND parent_id is null
+        where model_code = #{modelCode} AND parent_id is null
         order by order_num
     </select>
     <select id="selectIndexByNodeIds" resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfor">
-        SELECT mn.node_id  nodeId,
-        mn."name"   "name",
+        SELECT mn.node_id nodeId,
+        mn."name" "name",
         ni.index_id indexId,
         ei.energy_id
         FROM "model_node" mn
@@ -417,15 +420,49 @@
         left join energy_index ei on ni.index_id = ei.index_id
         <where>
             mn.model_code = #{modelCode}
-          AND mn.node_id in
-        <foreach collection="nodeIds" index="index" item="item" open="(" separator="," close=")">
-            #{item}
-        </foreach>
-        <if test="modelCode!=null and modelCode!='' and nodeIds.size>0">
-            and ei.index_type='STATISTIC'
-        </if>
+            AND mn.node_id in
+            <foreach collection="nodeIds" index="index" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            <if test="modelCode!=null and modelCode!='' and nodeIds.size>0">
+                and ei.index_type='STATISTIC'
+            </if>
 
         </where>
 
     </select>
+
+    <select id="getDataItemByParentNodeId" resultType="com.zhitan.dataitem.domain.vo.NodeIndexValueVO">
+        SELECT mn.node_id  nodeId,
+               mn."name"   nodeName,
+               di.index_id indexId,
+               di."value"  value
+        FROM model_node mn
+                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+                 LEFT JOIN "energy_index" ei ON ei.index_id = ni.index_id
+                 LEFT JOIN "data_item" di ON ei.index_id = di.index_id
+        WHERE mn.parent_id = #{parentId}
+          AND ei.energy_id = #{energyType}
+          AND ei.index_type = 'STATISTIC'
+          AND di.time_type = #{timeType.name}
+          AND di.data_time >= #{dateTimeMap.startTime}
+          AND di.data_time &lt;= #{dateTimeMap.endTime}
+    </select>
+
+    <select id="getDataItemByNodeId" resultType="com.zhitan.dataitem.domain.vo.NodeIndexValueVO">
+        SELECT mn.node_id  nodeId,
+               mn."name"   nodeName,
+               di.index_id indexId,
+               di."value"  value
+        FROM "model_node" mn
+                 LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+                 LEFT JOIN "energy_index" ei ON ei.index_id = ni.index_id
+                 LEFT JOIN "data_item" di ON ei.index_id = di.index_id
+        WHERE mn.node_id = #{nodeId}
+          AND ei.energy_id = #{energyType}
+          AND ei.index_type = 'STATISTIC'
+          AND di.time_type = #{timeType.name}
+          AND di.data_time >= #{dateTimeMap.startTime}
+          AND di.data_time &lt;= #{dateTimeMap.endTime}
+    </select>
 </mapper>
diff --git a/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml b/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml
new file mode 100644
index 0000000..71e9b64
--- /dev/null
+++ b/zhitan-system/src/main/resources/mapper/model/NodeIndexMapper.xml
@@ -0,0 +1,10 @@
+<?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.model.mapper.NodeIndexMapper">
+
+    <resultMap type="com.zhitan.model.domain.NodeIndex" id="NodeIndexMap">
+        <result property="nodeId" column="node_id" jdbcType="VARCHAR"/>
+        <result property="indexId" column="index_id" jdbcType="VARCHAR"/>
+    </resultMap>
+</mapper>
+
diff --git a/zhitan-vue/index.html b/zhitan-vue/index.html
index 3b22332..756ed87 100644
--- a/zhitan-vue/index.html
+++ b/zhitan-vue/index.html
@@ -1,215 +1,214 @@
 <!DOCTYPE html>
 <html>
-
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="renderer" content="webkit">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-  <link rel="icon" href="/favicon.ico">
-  <title>绠$悊绯荤粺</title>
-  <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
-  <style>
-    html,
-    body,
-    #app {
-      height: 100%;
-      margin: 0px;
-      padding: 0px;
-    }
-
-    .chromeframe {
-      margin: 0.2em 0;
-      background: #ccc;
-      color: #000;
-      padding: 0.2em 0;
-    }
-
-    #loader-wrapper {
-      position: fixed;
-      top: 0;
-      left: 0;
-      width: 100%;
-      height: 100%;
-      z-index: 999999;
-    }
-
-    #loader {
-      display: block;
-      position: relative;
-      left: 50%;
-      top: 50%;
-      width: 150px;
-      height: 150px;
-      margin: -75px 0 0 -75px;
-      border-radius: 50%;
-      border: 3px solid transparent;
-      border-top-color: #FFF;
-      -webkit-animation: spin 2s linear infinite;
-      -ms-animation: spin 2s linear infinite;
-      -moz-animation: spin 2s linear infinite;
-      -o-animation: spin 2s linear infinite;
-      animation: spin 2s linear infinite;
-      z-index: 1001;
-    }
-
-    #loader:before {
-      content: "";
-      position: absolute;
-      top: 5px;
-      left: 5px;
-      right: 5px;
-      bottom: 5px;
-      border-radius: 50%;
-      border: 3px solid transparent;
-      border-top-color: #FFF;
-      -webkit-animation: spin 3s linear infinite;
-      -moz-animation: spin 3s linear infinite;
-      -o-animation: spin 3s linear infinite;
-      -ms-animation: spin 3s linear infinite;
-      animation: spin 3s linear infinite;
-    }
-
-    #loader:after {
-      content: "";
-      position: absolute;
-      top: 15px;
-      left: 15px;
-      right: 15px;
-      bottom: 15px;
-      border-radius: 50%;
-      border: 3px solid transparent;
-      border-top-color: #FFF;
-      -moz-animation: spin 1.5s linear infinite;
-      -o-animation: spin 1.5s linear infinite;
-      -ms-animation: spin 1.5s linear infinite;
-      -webkit-animation: spin 1.5s linear infinite;
-      animation: spin 1.5s linear infinite;
-    }
-
-
-    @-webkit-keyframes spin {
-      0% {
-        -webkit-transform: rotate(0deg);
-        -ms-transform: rotate(0deg);
-        transform: rotate(0deg);
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+    <meta name="renderer" content="webkit" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
+    <link rel="icon" href="/logo.png" />
+    <title>绠$悊绯荤粺</title>
+    <!--[if lt IE 11
+      ]><script>
+        window.location.href = "/html/ie.html"
+      </script><!
+    [endif]-->
+    <style>
+      html,
+      body,
+      #app {
+        height: 100%;
+        margin: 0px;
+        padding: 0px;
       }
 
-      100% {
-        -webkit-transform: rotate(360deg);
-        -ms-transform: rotate(360deg);
-        transform: rotate(360deg);
-      }
-    }
-
-    @keyframes spin {
-      0% {
-        -webkit-transform: rotate(0deg);
-        -ms-transform: rotate(0deg);
-        transform: rotate(0deg);
+      .chromeframe {
+        margin: 0.2em 0;
+        background: #ccc;
+        color: #000;
+        padding: 0.2em 0;
       }
 
-      100% {
-        -webkit-transform: rotate(360deg);
-        -ms-transform: rotate(360deg);
-        transform: rotate(360deg);
+      #loader-wrapper {
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        z-index: 999999;
       }
-    }
 
+      #loader {
+        display: block;
+        position: relative;
+        left: 50%;
+        top: 50%;
+        width: 150px;
+        height: 150px;
+        margin: -75px 0 0 -75px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -webkit-animation: spin 2s linear infinite;
+        -ms-animation: spin 2s linear infinite;
+        -moz-animation: spin 2s linear infinite;
+        -o-animation: spin 2s linear infinite;
+        animation: spin 2s linear infinite;
+        z-index: 1001;
+      }
 
-    #loader-wrapper .loader-section {
-      position: fixed;
-      top: 0;
-      width: 51%;
-      height: 100%;
-      background: #7171C6;
-      z-index: 1000;
-      -webkit-transform: translateX(0);
-      -ms-transform: translateX(0);
-      transform: translateX(0);
-    }
+      #loader:before {
+        content: "";
+        position: absolute;
+        top: 5px;
+        left: 5px;
+        right: 5px;
+        bottom: 5px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -webkit-animation: spin 3s linear infinite;
+        -moz-animation: spin 3s linear infinite;
+        -o-animation: spin 3s linear infinite;
+        -ms-animation: spin 3s linear infinite;
+        animation: spin 3s linear infinite;
+      }
 
-    #loader-wrapper .loader-section.section-left {
-      left: 0;
-    }
+      #loader:after {
+        content: "";
+        position: absolute;
+        top: 15px;
+        left: 15px;
+        right: 15px;
+        bottom: 15px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -moz-animation: spin 1.5s linear infinite;
+        -o-animation: spin 1.5s linear infinite;
+        -ms-animation: spin 1.5s linear infinite;
+        -webkit-animation: spin 1.5s linear infinite;
+        animation: spin 1.5s linear infinite;
+      }
 
-    #loader-wrapper .loader-section.section-right {
-      right: 0;
-    }
+      @-webkit-keyframes spin {
+        0% {
+          -webkit-transform: rotate(0deg);
+          -ms-transform: rotate(0deg);
+          transform: rotate(0deg);
+        }
 
+        100% {
+          -webkit-transform: rotate(360deg);
+          -ms-transform: rotate(360deg);
+          transform: rotate(360deg);
+        }
+      }
 
-    .loaded #loader-wrapper .loader-section.section-left {
-      -webkit-transform: translateX(-100%);
-      -ms-transform: translateX(-100%);
-      transform: translateX(-100%);
-      -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-      transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-    }
+      @keyframes spin {
+        0% {
+          -webkit-transform: rotate(0deg);
+          -ms-transform: rotate(0deg);
+          transform: rotate(0deg);
+        }
 
-    .loaded #loader-wrapper .loader-section.section-right {
-      -webkit-transform: translateX(100%);
-      -ms-transform: translateX(100%);
-      transform: translateX(100%);
-      -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-      transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
-    }
+        100% {
+          -webkit-transform: rotate(360deg);
+          -ms-transform: rotate(360deg);
+          transform: rotate(360deg);
+        }
+      }
 
-    .loaded #loader {
-      opacity: 0;
-      -webkit-transition: all 0.3s ease-out;
-      transition: all 0.3s ease-out;
-    }
+      #loader-wrapper .loader-section {
+        position: fixed;
+        top: 0;
+        width: 51%;
+        height: 100%;
+        background: #7171c6;
+        z-index: 1000;
+        -webkit-transform: translateX(0);
+        -ms-transform: translateX(0);
+        transform: translateX(0);
+      }
 
-    .loaded #loader-wrapper {
-      visibility: hidden;
-      -webkit-transform: translateY(-100%);
-      -ms-transform: translateY(-100%);
-      transform: translateY(-100%);
-      -webkit-transition: all 0.3s 1s ease-out;
-      transition: all 0.3s 1s ease-out;
-    }
+      #loader-wrapper .loader-section.section-left {
+        left: 0;
+      }
 
-    .no-js #loader-wrapper {
-      display: none;
-    }
+      #loader-wrapper .loader-section.section-right {
+        right: 0;
+      }
 
-    .no-js h1 {
-      color: #222222;
-    }
+      .loaded #loader-wrapper .loader-section.section-left {
+        -webkit-transform: translateX(-100%);
+        -ms-transform: translateX(-100%);
+        transform: translateX(-100%);
+        -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+        transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+      }
 
-    #loader-wrapper .load_title {
-      font-family: 'Open Sans';
-      color: #FFF;
-      font-size: 19px;
-      width: 100%;
-      text-align: center;
-      z-index: 9999999999999;
-      position: absolute;
-      top: 60%;
-      opacity: 1;
-      line-height: 30px;
-    }
+      .loaded #loader-wrapper .loader-section.section-right {
+        -webkit-transform: translateX(100%);
+        -ms-transform: translateX(100%);
+        transform: translateX(100%);
+        -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+        transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+      }
 
-    #loader-wrapper .load_title span {
-      font-weight: normal;
-      font-style: italic;
-      font-size: 13px;
-      color: #FFF;
-      opacity: 0.5;
-    }
-  </style>
-</head>
+      .loaded #loader {
+        opacity: 0;
+        -webkit-transition: all 0.3s ease-out;
+        transition: all 0.3s ease-out;
+      }
 
-<body>
-  <div id="app">
-    <div id="loader-wrapper">
-      <div id="loader"></div>
-      <div class="loader-section section-left"></div>
-      <div class="loader-section section-right"></div>
-      <div class="load_title">姝e湪鍔犺浇,璇疯�愬績绛夊緟</div>
+      .loaded #loader-wrapper {
+        visibility: hidden;
+        -webkit-transform: translateY(-100%);
+        -ms-transform: translateY(-100%);
+        transform: translateY(-100%);
+        -webkit-transition: all 0.3s 1s ease-out;
+        transition: all 0.3s 1s ease-out;
+      }
+
+      .no-js #loader-wrapper {
+        display: none;
+      }
+
+      .no-js h1 {
+        color: #222222;
+      }
+
+      #loader-wrapper .load_title {
+        font-family: "Open Sans";
+        color: #fff;
+        font-size: 19px;
+        width: 100%;
+        text-align: center;
+        z-index: 9999999999999;
+        position: absolute;
+        top: 60%;
+        opacity: 1;
+        line-height: 30px;
+      }
+
+      #loader-wrapper .load_title span {
+        font-weight: normal;
+        font-style: italic;
+        font-size: 13px;
+        color: #fff;
+        opacity: 0.5;
+      }
+    </style>
+  </head>
+
+  <body>
+    <div id="app">
+      <div id="loader-wrapper">
+        <div id="loader"></div>
+        <div class="loader-section section-left"></div>
+        <div class="loader-section section-right"></div>
+        <div class="load_title">姝e湪鍔犺浇,璇疯�愬績绛夊緟</div>
+      </div>
     </div>
-  </div>
-  <script type="module" src="/src/main.js"></script>
-</body>
-
-</html>
\ No newline at end of file
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>
diff --git a/zhitan-vue/package.json b/zhitan-vue/package.json
index c9e26a4..1f3c3cb 100644
--- a/zhitan-vue/package.json
+++ b/zhitan-vue/package.json
@@ -7,7 +7,7 @@
   "type": "module",
   "scripts": {
     "dev": "vite",
-    "build:prod": "vite build",
+    "build": "vite build",
     "build:stage": "vite build --mode staging",
     "preview": "vite preview"
   },
diff --git a/zhitan-vue/public/logo.png b/zhitan-vue/public/logo.png
new file mode 100644
index 0000000..2e6aab6
--- /dev/null
+++ b/zhitan-vue/public/logo.png
Binary files differ
diff --git a/zhitan-vue/src/api/comprehensiveStatistics/comprehensive.js b/zhitan-vue/src/api/comprehensiveStatistics/comprehensive.js
new file mode 100644
index 0000000..bd8dbb5
--- /dev/null
+++ b/zhitan-vue/src/api/comprehensiveStatistics/comprehensive.js
@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁�
+export function getDataList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+export function getlistChart(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/listChart',
+    method: 'get',
+    params: query
+  })
+}
+export function exportList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/export',
+    method: 'get',
+    params: query
+  })
+}
+export function getEnergyList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getList',
+    method: 'get',
+    params: query
+  })
+}
+//閲嶇偣璁惧鑳借�楁帓鍚�
+export function energyList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/energyList',
+    method: 'get',
+    params: query
+  })
+}
+//璁惧
+export function getFacilityArchives() {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getFacilityArchives',
+    method: 'get'
+  })
+}
+//閲嶇偣璁惧
+export function getPointFacility() {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getPointFacility',
+    method: 'get'
+  })
+}
+export function getDeviceList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getDeviceList',
+    method: 'get',
+    params: query
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑鑳芥簮鍝佺
+export function energyDevice(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/energyDevice',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/zhitan-vue/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js b/zhitan-vue/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js
new file mode 100644
index 0000000..701aa46
--- /dev/null
+++ b/zhitan-vue/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js
@@ -0,0 +1,26 @@
+import request from "@/utils/request"
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: "/comprehensive/dailyComprehensive/list",
+    method: "get",
+    params: query,
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: "/comprehensive/dailyComprehensive/listChart",
+    method: "get",
+    params: query,
+  })
+}
+
+// 瀵煎嚭缁煎悎鎶ヨ〃
+export function exportList(query) {
+  return request({
+    url: "/report/dailyReport/export",
+    method: "get",
+    params: query,
+  })
+}
diff --git a/zhitan-vue/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js b/zhitan-vue/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js
new file mode 100644
index 0000000..b3a5668
--- /dev/null
+++ b/zhitan-vue/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/zhitan-vue/src/api/comprehensiveStatistics/processEnergyConsumption.js b/zhitan-vue/src/api/comprehensiveStatistics/processEnergyConsumption.js
new file mode 100644
index 0000000..38858e5
--- /dev/null
+++ b/zhitan-vue/src/api/comprehensiveStatistics/processEnergyConsumption.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁�
+export function getDataList(query) {
+  return request({
+    url: '/statisticalData/processEnergyConsumption/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+export function getlistChart(query) {
+  return request({
+    url: '/statisticalData/processEnergyConsumption/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/zhitan-vue/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js b/zhitan-vue/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js
new file mode 100644
index 0000000..03cb827
--- /dev/null
+++ b/zhitan-vue/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/comprehensive/yearComprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/comprehensive/yearComprehensive/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/zhitan-vue/src/api/svg/equipmentfile.js b/zhitan-vue/src/api/svg/equipmentfile.js
new file mode 100644
index 0000000..ecdeb36
--- /dev/null
+++ b/zhitan-vue/src/api/svg/equipmentfile.js
@@ -0,0 +1,40 @@
+import request from "@/utils/request"
+
+// 淇敼缁勬�佸浘
+export function updateEquipmentfile(data) {
+  return request({
+    url: "/basicSetup/equipmentfile",
+    method: "put",
+    data: data,
+  })
+}
+
+export function getAllCollectTag(data) {
+  return request({
+    url: "/basicsetting/energyindex/filter",
+    method: "get",
+    params: data,
+  })
+}
+
+export function saveSettingApi(nodeId, data) {
+  return request({
+    url: "/basicSetup/equipmentfile/setting/" + nodeId,
+    method: "put",
+    data: data,
+  })
+}
+
+export function getConfigure(nodeId) {
+  return request({
+    url: "/basicSetup/equipmentfile/configure/" + nodeId,
+    method: "get",
+  })
+}
+
+export function getLiveData(tagCodes) {
+  return request({
+    url: "/rtdb/retrieve/" + tagCodes,
+    method: "get",
+  })
+}
diff --git a/zhitan-vue/src/assets/images/login-background.jpg b/zhitan-vue/src/assets/images/login-background.jpg
new file mode 100644
index 0000000..9194e14
--- /dev/null
+++ b/zhitan-vue/src/assets/images/login-background.jpg
Binary files differ
diff --git a/zhitan-vue/src/assets/images/login-background.png b/zhitan-vue/src/assets/images/login-background.png
deleted file mode 100644
index b27391b..0000000
--- a/zhitan-vue/src/assets/images/login-background.png
+++ /dev/null
Binary files differ
diff --git a/zhitan-vue/src/assets/images/login-bg.jpg b/zhitan-vue/src/assets/images/login-bg.jpg
deleted file mode 100644
index d3ab6e6..0000000
--- a/zhitan-vue/src/assets/images/login-bg.jpg
+++ /dev/null
Binary files differ
diff --git a/zhitan-vue/src/assets/styles/ruoyi.scss b/zhitan-vue/src/assets/styles/ruoyi.scss
index d83440a..505048c 100644
--- a/zhitan-vue/src/assets/styles/ruoyi.scss
+++ b/zhitan-vue/src/assets/styles/ruoyi.scss
@@ -312,6 +312,10 @@
       // tr:hover > td {
       // 	background-color: #141E4A;
       // }
+
+      .el-table-fixed-column--left {
+        background-color: #110f2e !important;
+      }
     }
   }
 
@@ -858,6 +862,9 @@
       // tr:hover > td {
       // 	background-color: #141E4A;
       // }
+      .el-table-fixed-column--left {
+        background-color: #fff;
+      }
     }
   }
 
diff --git a/zhitan-vue/src/components/FileUpload/index.vue b/zhitan-vue/src/components/FileUpload/index.vue
index 044aeda..a1746dd 100644
--- a/zhitan-vue/src/components/FileUpload/index.vue
+++ b/zhitan-vue/src/components/FileUpload/index.vue
@@ -13,9 +13,14 @@
       :headers="headers"
       class="upload-file-uploader"
       ref="fileUpload"
+      :drag="draggable"
     >
       <!-- 涓婁紶鎸夐挳 -->
-      <el-button type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button v-if="!draggable" type="primary">閫夊彇鏂囦欢</el-button>
+      <div v-else>
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+      </div>
     </el-upload>
     <!-- 涓婁紶鎻愮ず -->
     <div class="el-upload__tip" v-if="showTip">
@@ -66,6 +71,11 @@
     type: Boolean,
     default: true,
   },
+  // 鏄惁鎷栨嫿涓婁紶
+  draggable: {
+    type: Boolean,
+    default: false,
+  },
 })
 
 const { proxy } = getCurrentInstance()
diff --git a/zhitan-vue/src/utils/ruoyi.js b/zhitan-vue/src/utils/ruoyi.js
index 4efca08..74f7c30 100644
--- a/zhitan-vue/src/utils/ruoyi.js
+++ b/zhitan-vue/src/utils/ruoyi.js
@@ -1,5 +1,3 @@
-
-
 /**
  * 閫氱敤js鏂规硶灏佽澶勭悊
  * Copyright (c) 2019 ruoyi
@@ -10,17 +8,20 @@
   if (arguments.length === 0 || !time) {
     return null
   }
-  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+  const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}"
   let date
-  if (typeof time === 'object') {
+  if (typeof time === "object") {
     date = time
   } else {
-    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
       time = parseInt(time)
-    } else if (typeof time === 'string') {
-      time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
+    } else if (typeof time === "string") {
+      time = time
+        .replace(new RegExp(/-/gm), "/")
+        .replace("T", " ")
+        .replace(new RegExp(/\.[\d]{3}/gm), "")
     }
-    if ((typeof time === 'number') && (time.toString().length === 10)) {
+    if (typeof time === "number" && time.toString().length === 10) {
       time = time * 1000
     }
     date = new Date(time)
@@ -32,14 +33,16 @@
     h: date.getHours(),
     i: date.getMinutes(),
     s: date.getSeconds(),
-    a: date.getDay()
+    a: date.getDay(),
   }
   const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
     let value = formatObj[key]
     // Note: getDay() returns 0 on Sunday
-    if (key === 'a') { return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value] }
+    if (key === "a") {
+      return ["鏃�", "涓�", "浜�", "涓�", "鍥�", "浜�", "鍏�"][value]
+    }
     if (result.length > 0 && value < 10) {
-      value = '0' + value
+      value = "0" + value
     }
     return value || 0
   })
@@ -49,89 +52,92 @@
 // 琛ㄥ崟閲嶇疆
 export function resetForm(refName) {
   if (this.$refs[refName]) {
-    this.$refs[refName].resetFields();
+    this.$refs[refName].resetFields()
   }
 }
 
 // 娣诲姞鏃ユ湡鑼冨洿
 export function addDateRange(params, dateRange, propName) {
-  let search = params;
-  search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
-  dateRange = Array.isArray(dateRange) ? dateRange : [];
-  if (typeof (propName) === 'undefined') {
-    search.params['beginTime'] = dateRange[0];
-    search.params['endTime'] = dateRange[1];
+  let search = params
+  search.params =
+    typeof search.params === "object" && search.params !== null && !Array.isArray(search.params) ? search.params : {}
+  dateRange = Array.isArray(dateRange) ? dateRange : []
+  if (typeof propName === "undefined") {
+    search.params["beginTime"] = dateRange[0]
+    search.params["endTime"] = dateRange[1]
   } else {
-    search.params['begin' + propName] = dateRange[0];
-    search.params['end' + propName] = dateRange[1];
+    search.params["begin" + propName] = dateRange[0]
+    search.params["end" + propName] = dateRange[1]
   }
-  return search;
+  return search
 }
 
 // 鍥炴樉鏁版嵁瀛楀吀
 export function selectDictLabel(datas, value) {
   if (value === undefined) {
-    return "";
+    return ""
   }
-  var actions = [];
+  var actions = []
   Object.keys(datas).some((key) => {
-    if (datas[key].value == ('' + value)) {
-      actions.push(datas[key].label);
-      return true;
+    if (datas[key].value == "" + value) {
+      actions.push(datas[key].label)
+      return true
     }
   })
   if (actions.length === 0) {
-    actions.push(value);
+    actions.push(value)
   }
-  return actions.join('');
+  return actions.join("")
 }
 
 // 鍥炴樉鏁版嵁瀛楀吀锛堝瓧绗︿覆鏁扮粍锛�
 export function selectDictLabels(datas, value, separator) {
-  if (value === undefined || value.length ===0) {
-    return "";
+  if (value === undefined || value.length === 0) {
+    return ""
   }
   if (Array.isArray(value)) {
-    value = value.join(",");
+    value = value.join(",")
   }
-  var actions = [];
-  var currentSeparator = undefined === separator ? "," : separator;
-  var temp = value.split(currentSeparator);
+  var actions = []
+  var currentSeparator = undefined === separator ? "," : separator
+  var temp = value.split(currentSeparator)
   Object.keys(value.split(currentSeparator)).some((val) => {
-    var match = false;
+    var match = false
     Object.keys(datas).some((key) => {
-      if (datas[key].value == ('' + temp[val])) {
-        actions.push(datas[key].label + currentSeparator);
-        match = true;
+      if (datas[key].value == "" + temp[val]) {
+        actions.push(datas[key].label + currentSeparator)
+        match = true
       }
     })
     if (!match) {
-      actions.push(temp[val] + currentSeparator);
+      actions.push(temp[val] + currentSeparator)
     }
   })
-  return actions.join('').substring(0, actions.join('').length - 1);
+  return actions.join("").substring(0, actions.join("").length - 1)
 }
 
 // 瀛楃涓叉牸寮忓寲(%s )
 export function sprintf(str) {
-  var args = arguments, flag = true, i = 1;
+  var args = arguments,
+    flag = true,
+    i = 1
   str = str.replace(/%s/g, function () {
-    var arg = args[i++];
-    if (typeof arg === 'undefined') {
-      flag = false;
-      return '';
+    var arg = args[i++]
+    if (typeof arg === "undefined") {
+      flag = false
+      return ""
     }
-    return arg;
-  });
-  return flag ? str : '';
+    return arg
+  })
+  return flag ? str : ""
 }
 
 // 杞崲瀛楃涓诧紝undefined,null绛夎浆鍖栦负""
 export function parseStrEmpty(str) {
   if (!str || str == "undefined" || str == "null") {
-    return "";
+    return ""
   }
-  return str;
+  return str
 }
 
 // 鏁版嵁鍚堝苟
@@ -139,16 +145,16 @@
   for (var p in target) {
     try {
       if (target[p].constructor == Object) {
-        source[p] = mergeRecursive(source[p], target[p]);
+        source[p] = mergeRecursive(source[p], target[p])
       } else {
-        source[p] = target[p];
+        source[p] = target[p]
       }
     } catch (e) {
-      source[p] = target[p];
+      source[p] = target[p]
     }
   }
-  return source;
-};
+  return source
+}
 
 /**
  * 鏋勯�犳爲鍨嬬粨鏋勬暟鎹�
@@ -159,88 +165,105 @@
  */
 export function handleTree(data, id, parentId, children) {
   let config = {
-    id: id || 'id',
-    parentId: parentId || 'parentId',
-    childrenList: children || 'children'
-  };
+    id: id || "id",
+    parentId: parentId || "parentId",
+    childrenList: children || "children",
+  }
 
-  var childrenListMap = {};
-  var nodeIds = {};
-  var tree = [];
+  var childrenListMap = {}
+  var nodeIds = {}
+  var tree = []
 
   for (let d of data) {
-    let parentId = d[config.parentId];
+    let parentId = d[config.parentId]
     if (childrenListMap[parentId] == null) {
-      childrenListMap[parentId] = [];
+      childrenListMap[parentId] = []
     }
-    nodeIds[d[config.id]] = d;
-    childrenListMap[parentId].push(d);
+    nodeIds[d[config.id]] = d
+    childrenListMap[parentId].push(d)
   }
 
   for (let d of data) {
-    let parentId = d[config.parentId];
+    let parentId = d[config.parentId]
     if (nodeIds[parentId] == null) {
-      tree.push(d);
+      tree.push(d)
     }
   }
 
   for (let t of tree) {
-    adaptToChildrenList(t);
+    adaptToChildrenList(t)
   }
 
   function adaptToChildrenList(o) {
     if (childrenListMap[o[config.id]] !== null) {
-      o[config.childrenList] = childrenListMap[o[config.id]];
+      o[config.childrenList] = childrenListMap[o[config.id]]
     }
     if (o[config.childrenList]) {
       for (let c of o[config.childrenList]) {
-        adaptToChildrenList(c);
+        adaptToChildrenList(c)
       }
     }
   }
-  return tree;
+  return tree
 }
 
 /**
-* 鍙傛暟澶勭悊
-* @param {*} params  鍙傛暟
-*/
+ * 鍙傛暟澶勭悊
+ * @param {*} params  鍙傛暟
+ */
 export function tansParams(params) {
-  let result = ''
+  let result = ""
   for (const propName of Object.keys(params)) {
-    const value = params[propName];
-    var part = encodeURIComponent(propName) + "=";
-    if (value !== null && value !== "" && typeof (value) !== "undefined") {
-      if (typeof value === 'object') {
+    const value = params[propName]
+    var part = encodeURIComponent(propName) + "="
+    if (value !== null && value !== "" && typeof value !== "undefined") {
+      if (typeof value === "object") {
         for (const key of Object.keys(value)) {
-          if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
-            let params = propName + '[' + key + ']';
-            var subPart = encodeURIComponent(params) + "=";
-            result += subPart + encodeURIComponent(value[key]) + "&";
+          if (value[key] !== null && value[key] !== "" && typeof value[key] !== "undefined") {
+            let params = propName + "[" + key + "]"
+            var subPart = encodeURIComponent(params) + "="
+            result += subPart + encodeURIComponent(value[key]) + "&"
           }
         }
       } else {
-        result += part + encodeURIComponent(value) + "&";
+        result += part + encodeURIComponent(value) + "&"
       }
     }
   }
   return result
 }
 
-
 // 杩斿洖椤圭洰璺緞
 export function getNormalPath(p) {
-  if (p.length === 0 || !p || p == 'undefined') {
+  if (p.length === 0 || !p || p == "undefined") {
     return p
-  };
-  let res = p.replace('//', '/')
-  if (res[res.length - 1] === '/') {
+  }
+  let res = p.replace("//", "/")
+  if (res[res.length - 1] === "/") {
     return res.slice(0, res.length - 1)
   }
-  return res;
+  return res
 }
 
 // 楠岃瘉鏄惁涓篵lob鏍煎紡
 export function blobValidate(data) {
-  return data.type !== 'application/json'
+  return data.type !== "application/json"
+}
+
+// 閫氱敤涓嬭浇鏂规硶
+const baseURL = import.meta.env.VITE_APP_BASE_API
+export function download(fileName) {
+  window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true
+}
+
+// 閫氱敤涓嬭浇鏂规硶 showfileName锛氫笅杞藉悗鐨勬枃浠跺悕绉板甫鎵╁睍鍚�;filePath:瑕佷笅杞芥枃浠剁殑缁濆璺緞,甯︾潃鏂囦欢鍚嶅拰鎵╁睍鍚嶏紱deleteflage涓嬭浇瀹屾垚鍚庢槸鍚﹀垹闄ゆ枃浠�
+export function fileDownload(showfileName, filePath, deleteflage) {
+  window.location.href =
+    baseURL +
+    "/common/downloadAssign?showFileName=" +
+    encodeURI(showfileName) +
+    "&filePath=" +
+    encodeURI(filePath) +
+    "&delete=" +
+    deleteflage
 }
diff --git a/zhitan-vue/src/views/alarmmanage/energyconsumption/energyConsumption.vue b/zhitan-vue/src/views/alarmmanage/energyconsumption/energyConsumption.vue
index 38a308a..4a3a835 100644
--- a/zhitan-vue/src/views/alarmmanage/energyconsumption/energyConsumption.vue
+++ b/zhitan-vue/src/views/alarmmanage/energyconsumption/energyConsumption.vue
@@ -8,16 +8,28 @@
         <div class="form-card">
           <el-form :model="form" ref="queryRef" :inline="true" label-width="85px">
             <el-form-item label="鏈熼棿" prop="timeType">
-              <el-select v-model="queryParams.timeType" placeholder="鏈熼棿" clearable style="width: 100%"
-                @change="handleTimeType">
+              <el-select
+                v-model="queryParams.timeType"
+                placeholder="鏈熼棿"
+                clearable
+                style="width: 100%"
+                @change="handleTimeType"
+              >
                 <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="鏃堕棿">
-              <el-date-picker v-model="queryParams.dataTime" :clearable="false"
+              <el-date-picker
+                v-model="queryParams.dataTime"
+                :clearable="false"
                 :type="queryParams.timeType == 'YEAR' ? 'year' : queryParams.timeType == 'MONTH' ? 'month' : 'date'"
-                :format="queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD'"
-                value-format="YYYY-MM-DD" placeholder="鏃堕棿" style="width: 100%" />
+                :format="
+                  queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD'
+                "
+                value-format="YYYY-MM-DD"
+                placeholder="鏃堕棿"
+                style="width: 100%"
+              />
             </el-form-item>
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
@@ -55,70 +67,69 @@
 </template>
 
 <script setup>
-import * as echarts from 'echarts';
-import { onMounted, reactive, ref } from 'vue';
-import { listEnergyTypeList } from "@/api/modelConfiguration/energyType";
-const { proxy } = getCurrentInstance();
-const { period } = proxy.useDict("period");
-let { alarm_record_category } = proxy.useDict("alarm_record_category");
+import * as echarts from "echarts"
+import { onMounted, reactive, ref } from "vue"
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType"
+const { proxy } = getCurrentInstance()
+const { period } = proxy.useDict("period")
+let { alarm_record_category } = proxy.useDict("alarm_record_category")
 let energyTypeList = ref([])
 function getEnergyTypeList() {
   listEnergyTypeList().then((res) => {
-    energyTypeList.value = res.data;
-  });
+    energyTypeList.value = res.data
+  })
 }
 getEnergyTypeList()
 function formatterLabel(list, value) {
-  console.log(list, value);
+  console.log(list, value)
 
-  let dict = list.find(item => item.enersno == value)
-  return dict ? dict.enername : ''
+  let dict = list.find((item) => item.enersno == value)
+  return dict ? dict.enername : ""
 }
-
 
 let queryParams = ref({
   timeType: null,
   dataTime: null,
-  nodeId: null
+  nodeId: null,
 })
 
-import { getByNodeId, getCountInfo } from "@/api/alarmManage/alarmManage";
-import { el } from 'element-plus/es/locales.mjs';
-let form = ref({});
+import { getByNodeId, getCountInfo } from "@/api/alarmManage/alarmManage"
+import { el } from "element-plus/es/locales.mjs"
+let form = ref({})
 let currentNode = ref()
 
 function handleTimeType(e) {
-  queryParams.value.timeType = e;
-  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD");
+  queryParams.value.timeType = e
+  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")
 }
 function handleNodeClick(e) {
   currentNode.value = e
   queryParams.value.nodeId = e.id
-  handleTimeType('YEAR')
+  handleTimeType("YEAR")
   getByNodeIdFun()
 }
 
 function getByNodeIdFun() {
-  getByNodeId(queryParams.value).then(res => {
+  getByNodeId(queryParams.value).then((res) => {
     let alarmList = []
     let energyList = []
     let alarmNumberList = {
       data: [],
-      xAxisData: []
+      xAxisData: [],
     }
-    console.log(111, res);
+    console.log(111, res)
     if (res.code == 200) {
       let { data } = res
-      alarmList = data.alarmProportion.map(item => {
+      alarmList = data.alarmProportion.map((item) => {
         return {
           name: proxy.selectDictLabel(alarm_record_category.value, item.energyName),
-          value: item.percentage
+          value: item.percentage,
         }
       })
-      energyList = data.energyProportion.map(item => {
+      energyList = data.energyProportion.map((item) => {
         return {
           name: formatterLabel(energyTypeList.value, item.energyName),
-          value: item.percentage
+          value: item.percentage,
         }
       })
       for (const item of data.chartDataList) {
@@ -126,9 +137,9 @@
         alarmNumberList.data.push(item.yvalue)
       }
 
-      pieChart('Chart1', alarmList, '鎶ヨ绫诲瀷鍗犳瘮')
-      pieChart('Chart2', energyList, '鑳芥簮绫诲瀷鍗犳瘮')
-      getChart('Chart3', alarmNumberList)
+      pieChart("Chart1", alarmList, "鎶ヨ绫诲瀷鍗犳瘮")
+      pieChart("Chart2", energyList, "鑳芥簮绫诲瀷鍗犳瘮")
+      getChart("Chart3", alarmNumberList)
     }
   })
 }
@@ -138,227 +149,233 @@
   getByNodeIdFun()
 }
 function resetQuery() {
-  handleTimeType('YEAR')
+  handleTimeType("YEAR")
   getByNodeIdFun()
 }
 
-
 function pieChart(Id, data, name) {
-  let total = 0;
+  let total = 0
   data.forEach(function (val, idx, arr) {
-    total += val.value;
+    total += val.value
   })
-  const myChart = echarts.init(document.getElementById(Id));
+  const myChart = echarts.init(document.getElementById(Id))
   myChart.setOption({
-    color: ['#4D94FF', '#00C27C', '#F0142F', '#F2D261', '#0E7CE2', '#FF8352', '#E271DE', '#F8456B', '#00FFFF', '#4AEAB0'],
+    color: [
+      "#4D94FF",
+      "#00C27C",
+      "#F0142F",
+      "#F2D261",
+      "#0E7CE2",
+      "#FF8352",
+      "#E271DE",
+      "#F8456B",
+      "#00FFFF",
+      "#4AEAB0",
+    ],
     grid: {
-      top: '20%',
-      left: '1%',
-      right: '1%',
-      bottom: '0%',
-      containLabel: true
+      top: "20%",
+      left: "1%",
+      right: "1%",
+      bottom: "0%",
+      containLabel: true,
     },
     tooltip: {
-      trigger: 'item'
+      trigger: "item",
     },
     legend: {
-      orient: 'vertical',
-      top: 'center',
-      icon: 'circle',
+      orient: "vertical",
+      top: "center",
+      icon: "circle",
       itemWidth: 14,
       itemHeight: 14,
-      right: '2%',
+      right: "2%",
       itemGap: 10,
       textStyle: {
-        align: 'left',
-        verticalAlign: 'middle',
+        align: "left",
+        verticalAlign: "middle",
         rich: {
           name: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
           value: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
           rate: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
         },
       },
       formatter: (name) => {
         if (data.length) {
-          let target, percent;
+          let target, percent
           for (let i = 0; i < data.length; i++) {
             if (data[i].name === name) {
-              target = data[i].value;
-              percent = ((target / total) * 100).toFixed(2);
+              target = data[i].value
+              percent = ((target / total) * 100).toFixed(2)
             }
           }
-          return `{name|${name}  }{value| ${target}} {rate| ${percent}%}`;
-
+          return `{name|${name}  }{value| ${target}} {rate| ${percent}%}`
         } else {
-          return `{name|${name}  }{value| ${0}} {rate| ${0}%}`;
-
+          return `{name|${name}  }{value| ${0}} {rate| ${0}%}`
         }
       },
     },
-    series: [{
-      name,
-      type: 'pie',
-      radius: ['45%', '70%'],
-      center: ['35%', '50%'],
-      avoidLabelOverlap: false,
-      label: {
-        show: false,
-        overflow: 'none',
-        formatter: '{b} {d}%  \n {c} tce',
+    series: [
+      {
+        name,
+        type: "pie",
+        radius: ["45%", "70%"],
+        center: ["35%", "50%"],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          overflow: "none",
+          formatter: "{b} {d}%  \n {c} tce",
+        },
+        data,
       },
-      data,
-    }]
+    ],
   })
 }
 function getChart(Id, dataList) {
-  const myChart3 = echarts.init(document.getElementById(Id));
-  myChart3.setOption(
-    {
-
-      grid: {
-        left: '3%',
-        right: '2%',
-        bottom: '2%',
-        containLabel: true
+  const myChart3 = echarts.init(document.getElementById(Id))
+  myChart3.setOption({
+    grid: {
+      left: "3%",
+      right: "2%",
+      bottom: "2%",
+      containLabel: true,
+    },
+    tooltip: {
+      trigger: "axis",
+    },
+    xAxis: {
+      type: "category",
+      // boundaryGap: false,
+      data: dataList.xAxisData,
+      axisPointer: {
+        type: "shadow",
       },
-      tooltip: {
-        trigger: 'axis',
-
+      axisTick: {
+        show: false,
+        alignWithLabel: true,
+        length: 5,
       },
-      xAxis: {
-        type: 'category',
-        // boundaryGap: false,
-        data: dataList.xAxisData,
-        axisPointer: {
-          type: 'shadow'
+      // 鍧愭爣杞村埢搴︾嚎鏍峰紡
+      axisTick: {
+        show: false,
+        length: 5,
+        lineStyle: {
+          color: "#ddd",
         },
-        axisTick: {
-          show: false,
-          alignWithLabel: true,
-          length: 5
-        },
-        // 鍧愭爣杞村埢搴︾嚎鏍峰紡
-        axisTick: {
-          show: false,
-          length: 5,
-          lineStyle: {
-            color: '#ddd'
-          }
-        },
-
-        // 鍒嗗壊绾�
-        splitLine: {
-          show: false,
-          lineStyle: {
-            type: 'dashed',
-            color: 'rgba(220,222,226,0.4)'
-          }
-        },
-        axisLabel: {
-          color: '#999',
-          fontSize: 14,
-          padding: [5, 0, 0, 0],
-          //   formatter: '{value} ml'
-        }
       },
-      yAxis: {
-        type: 'value',
-        name: '锛堟锛�',
-        // 璁剧疆鍚嶇О鏍峰紡
-        nameTextStyle: {
-          color: ' #CEE3FF',
-          fontSize: 14,
-          padding: [0, 0, 5, 0],
-        },
-        // 鍧愭爣杞村埢搴�
-        axisTick: {
-          show: false,
-          alignWithLabel: true,
-          length: 5
-        },
-        // 鍧愭爣杞村埢搴︾嚎鏍峰紡
-        axisTick: {
-          show: false,
-          length: 5,
-          lineStyle: {
-            color: ''
-          }
-        },
 
-        // 鍒嗗壊绾�
-        splitLine: {
-          show: true,
-          lineStyle: {
-            type: 'dashed',
-            color: 'rgba(220,222,226,0.4)'
-          }
+      // 鍒嗗壊绾�
+      splitLine: {
+        show: false,
+        lineStyle: {
+          type: "dashed",
+          color: "rgba(220,222,226,0.4)",
         },
-
-        // 鍧愭爣杞村埢搴﹂棿闅�
-        // interval: '50',
-        // // 鍧愭爣杞存渶灏忓��
-        // min: 'dataMin',
-        // // 鍧愭爣杞存渶澶у��
-        // max: 'dataMax',
-        // // 鍧愭爣杞村皬鏁扮偣绮惧害
-        // precision: 0,
-        // // 鍧愭爣杞村埢搴︽枃鏈殑甯冨眬鏈濆悜
-        // position: 'left'
-        axisLabel: {
-          color: '#B2B8C2',
-          fontSize: 14,
-          //   formatter: '{value} ml'
-        }
       },
-      series: [
-        {
-          name: "鎶ヨ娆℃暟",
-          type: "bar",
-          barWidth: '17',
-          stack: 'number',
-          data: dataList.data,
-          tooltip: {
-            show: false,
-          }
+      axisLabel: {
+        color: "#999",
+        fontSize: 14,
+        padding: [5, 0, 0, 0],
+        //   formatter: '{value} ml'
+      },
+    },
+    yAxis: {
+      type: "value",
+      name: "锛堟锛�",
+      // 璁剧疆鍚嶇О鏍峰紡
+      nameTextStyle: {
+        color: " #CEE3FF",
+        fontSize: 14,
+        padding: [0, 0, 5, 0],
+      },
+      // 鍧愭爣杞村埢搴�
+      axisTick: {
+        show: false,
+        alignWithLabel: true,
+        length: 5,
+      },
+      // 鍧愭爣杞村埢搴︾嚎鏍峰紡
+      axisTick: {
+        show: false,
+        length: 5,
+        lineStyle: {
+          color: "",
         },
-        {
-          name: '鎶ヨ娆℃暟',
-          type: 'line',
-          symbol: 'none', // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
-          lineStyle: {
-            color: '#EE0303'
-          },
-          data: dataList.data,
-        },
-      ]
-    })
+      },
 
-  window.addEventListener("resize", () => {
-    myChart1.resize();
-    myChart2.resize();
-    myChart3.resize();
-  }, { passive: true });
+      // 鍒嗗壊绾�
+      splitLine: {
+        show: true,
+        lineStyle: {
+          type: "dashed",
+          color: "rgba(220,222,226,0.4)",
+        },
+      },
+
+      // 鍧愭爣杞村埢搴﹂棿闅�
+      // interval: '50',
+      // // 鍧愭爣杞存渶灏忓��
+      // min: 'dataMin',
+      // // 鍧愭爣杞存渶澶у��
+      // max: 'dataMax',
+      // // 鍧愭爣杞村皬鏁扮偣绮惧害
+      // precision: 0,
+      // // 鍧愭爣杞村埢搴︽枃鏈殑甯冨眬鏈濆悜
+      // position: 'left'
+      axisLabel: {
+        color: "#B2B8C2",
+        fontSize: 14,
+        //   formatter: '{value} ml'
+      },
+    },
+    series: [
+      {
+        name: "鎶ヨ娆℃暟",
+        type: "bar",
+        barWidth: "12",
+        stack: "number",
+        data: dataList.data,
+        tooltip: {
+          show: false,
+        },
+      },
+      {
+        name: "鎶ヨ娆℃暟",
+        type: "line",
+        symbol: "none", // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
+        lineStyle: {
+          color: "#EE0303",
+        },
+        data: dataList.data,
+      },
+    ],
+  })
+
+  window.addEventListener(
+    "resize",
+    () => {
+      myChart1.resize()
+      myChart2.resize()
+      myChart3.resize()
+    },
+    { passive: true }
+  )
 }
-
-
-
-
 </script>
 
 <style scoped lang="scss">
 @import "@/assets/styles/page.scss";
 
-
 .chart-box {
-  height: calc((100vh - 410px)/2) !important;
+  height: calc((100vh - 410px) / 2) !important;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/zhitan-vue/src/views/alarmmanage/measuremen/measuremen.vue b/zhitan-vue/src/views/alarmmanage/measuremen/measuremen.vue
index b46e7a2..cbd3852 100644
--- a/zhitan-vue/src/views/alarmmanage/measuremen/measuremen.vue
+++ b/zhitan-vue/src/views/alarmmanage/measuremen/measuremen.vue
@@ -8,16 +8,28 @@
         <div class="form-card">
           <el-form :model="form" ref="queryRef" :inline="true" label-width="85px">
             <el-form-item label="鏈熼棿" prop="timeType">
-              <el-select v-model="queryParams.timeType" placeholder="鏈熼棿" clearable style="width: 120px"
-                @change="handleTimeType">
+              <el-select
+                v-model="queryParams.timeType"
+                placeholder="鏈熼棿"
+                clearable
+                style="width: 120px"
+                @change="handleTimeType"
+              >
                 <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="鏃堕棿">
-              <el-date-picker v-model="queryParams.dataTime" :clearable="false"
+              <el-date-picker
+                v-model="queryParams.dataTime"
+                :clearable="false"
                 :type="queryParams.timeType == 'YEAR' ? 'year' : queryParams.timeType == 'MONTH' ? 'month' : 'date'"
-                :format="queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD'"
-                value-format="YYYY-MM-DD" placeholder="鏃堕棿" style="width: 100%" />
+                :format="
+                  queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD'
+                "
+                value-format="YYYY-MM-DD"
+                placeholder="鏃堕棿"
+                style="width: 100%"
+              />
             </el-form-item>
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
@@ -27,8 +39,10 @@
         </div>
 
         <div class="mt20 mb20 text-center data-item">
-          鏈敤鑳藉崟鍏冩寚鏍�<span>{{ dataArray.indexCount }}</span>涓紝
-          鏈勾搴︽姤璀�<span>{{ dataArray.yearCount }}</span>娆★紝鏈湀<span>{{ dataArray.monthCount }}</span>娆�
+          鏈敤鑳藉崟鍏冩寚鏍�<span>{{ dataArray.indexCount }}</span
+          >涓紝 鏈勾搴︽姤璀�<span>{{ dataArray.yearCount }}</span
+          >娆★紝鏈湀<span>{{ dataArray.monthCount }}</span
+          >娆�
         </div>
         <el-row :gutter="24" class="mb20">
           <el-col :span="12">
@@ -60,71 +74,70 @@
 </template>
 
 <script setup>
-import * as echarts from 'echarts';
-import { onMounted, reactive, ref } from 'vue';
-import { listEnergyTypeList } from "@/api/modelConfiguration/energyType";
-const { proxy } = getCurrentInstance();
-const { period } = proxy.useDict("period");
-let { alarm_record_category } = proxy.useDict("alarm_record_category");
+import * as echarts from "echarts"
+import { onMounted, reactive, ref } from "vue"
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType"
+const { proxy } = getCurrentInstance()
+const { period } = proxy.useDict("period")
+let { alarm_record_category } = proxy.useDict("alarm_record_category")
 let energyTypeList = ref([])
 function getEnergyTypeList() {
   listEnergyTypeList().then((res) => {
-    energyTypeList.value = res.data;
-    queryParams.value.energyType = energyTypeList.value[0].enersno;
-  });
+    energyTypeList.value = res.data
+    queryParams.value.energyType = energyTypeList.value[0].enersno
+  })
 }
 getEnergyTypeList()
 function formatterLabel(list, value) {
-  let dict = list.find(item => item.enersno == value)
-  return dict ? dict.enername : ''
+  let dict = list.find((item) => item.enersno == value)
+  return dict ? dict.enername : ""
 }
-
 
 let queryParams = ref({
   timeType: null,
   dataTime: null,
-  nodeId: null
+  nodeId: null,
 })
 
-import { getByNodeId, getCountInfo } from "@/api/alarmManage/alarmManage";
-import { el } from 'element-plus/es/locales.mjs';
-let form = ref({});
+import { getByNodeId, getCountInfo } from "@/api/alarmManage/alarmManage"
+import { el } from "element-plus/es/locales.mjs"
+let form = ref({})
 let currentNode = ref()
 
 function handleTimeType(e) {
-  queryParams.value.timeType = e;
-  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD");
+  queryParams.value.timeType = e
+  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")
 }
 function handleNodeClick(e) {
   currentNode.value = e
   queryParams.value.nodeId = e.id
-  handleTimeType(period.value[0].value);
+  handleTimeType(period.value[0].value)
 
   getByNodeIdFun()
 }
 
 function getByNodeIdFun() {
-  getByNodeId(queryParams.value).then(res => {
+  getByNodeId(queryParams.value).then((res) => {
     let alarmList = []
     let energyList = []
     let alarmNumberList = {
       data: [],
-      xAxisData: []
+      xAxisData: [],
     }
     if (res.code == 200) {
       let { data } = res
-      alarmList = data.alarmProportion.map(item => {
+      alarmList = data.alarmProportion.map((item) => {
         return {
           name: proxy.selectDictLabel(alarm_record_category.value, item.energyName),
           value: item.count,
-          percentage: item.percentage
+          percentage: item.percentage,
         }
       })
-      energyList = data.energyProportion.map(item => {
+      energyList = data.energyProportion.map((item) => {
         return {
           name: formatterLabel(energyTypeList.value, item.energyName),
           value: item.count,
-          percentage: item.percentage
+          percentage: item.percentage,
         }
       })
       for (const item of data.chartDataList) {
@@ -132,9 +145,9 @@
         alarmNumberList.data.push(item.yvalue)
       }
 
-      pieChart('Chart1', alarmList, '鎶ヨ绫诲瀷鍗犳瘮')
-      pieChart('Chart2', energyList, '鑳芥簮绫诲瀷鍗犳瘮')
-      getChart('Chart3', alarmNumberList)
+      pieChart("Chart1", alarmList, "鎶ヨ绫诲瀷鍗犳瘮")
+      pieChart("Chart2", energyList, "鑳芥簮绫诲瀷鍗犳瘮")
+      getChart("Chart3", alarmNumberList)
     }
   })
 }
@@ -144,16 +157,16 @@
   getByNodeIdFun()
 }
 function resetQuery() {
-  handleTimeType('YEAR')
+  handleTimeType("YEAR")
   getByNodeIdFun()
 }
 let dataArray = ref({
   indexCount: 0,
   yearCount: 0,
-  monthCount: 0
+  monthCount: 0,
 })
 function getCountInfoFun() {
-  getCountInfo(queryParams.value).then(res => {
+  getCountInfo(queryParams.value).then((res) => {
     if (res.code == 200) {
       dataArray.value = res.data
     }
@@ -163,45 +176,56 @@
 getCountInfoFun()
 function pieChart(Id, data, name) {
   console.log(data)
-  let total = 0;
+  let total = 0
   data.forEach(function (val, idx, arr) {
-    total += val.value;
+    total += val.value
   })
-  const myChart = echarts.init(document.getElementById(Id));
+  const myChart = echarts.init(document.getElementById(Id))
   myChart.setOption({
-    color: ['#4D94FF', '#00C27C', '#F0142F', '#F2D261', '#0E7CE2', '#FF8352', '#E271DE', '#F8456B', '#00FFFF', '#4AEAB0'],
+    color: [
+      "#4D94FF",
+      "#00C27C",
+      "#F0142F",
+      "#F2D261",
+      "#0E7CE2",
+      "#FF8352",
+      "#E271DE",
+      "#F8456B",
+      "#00FFFF",
+      "#4AEAB0",
+    ],
     grid: {
-      top: '20%',
-      left: '1%',
-      right: '1%',
-      bottom: '0%',
-      containLabel: true
+      top: "20%",
+      left: "1%",
+      right: "1%",
+      bottom: "0%",
+      containLabel: true,
     },
     tooltip: {
-      trigger: 'item'
+      trigger: "item",
     },
     legend: {
-      orient: 'vertical',
-      top: 'center',
-      icon: 'circle',
+      orient: "vertical",
+      top: "center",
+      icon: "circle",
       itemWidth: 14,
       itemHeight: 14,
-      right: '2%',
+      right: "2%",
       itemGap: 10,
       textStyle: {
-        align: 'left',
-        verticalAlign: 'middle',
+        align: "left",
+        verticalAlign: "middle",
         rich: {
           name: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
           value: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
           rate: {
-            color: '#999',
+            color: "#999",
             fontSize: 14,
           },
         },
@@ -209,167 +233,165 @@
       formatter: (name) => {
         for (let i = 0; i < data.length; i++) {
           if (data[i].name === name) {
-            return `{name|${data[i].name}  }{value| ${data[i].value}} {rate| ${data[i].percentage}%}`;
+            return `{name|${data[i].name}  }{value| ${data[i].value}} {rate| ${data[i].percentage}%}`
           }
         }
       },
     },
-    series: [{
-      name,
-      type: 'pie',
-      radius: ['45%', '70%'],
-      center: ['35%', '50%'],
-      avoidLabelOverlap: false,
-      label: {
-        show: false,
-        overflow: 'none',
-        formatter: '{b} {d}%  \n {c} tce',
+    series: [
+      {
+        name,
+        type: "pie",
+        radius: ["45%", "70%"],
+        center: ["35%", "50%"],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          overflow: "none",
+          formatter: "{b} {d}%  \n {c} tce",
+        },
+        data,
       },
-      data,
-    }]
+    ],
   })
 }
 function getChart(Id, dataList) {
-  const myChart3 = echarts.init(document.getElementById(Id));
-  myChart3.setOption(
-    {
-
-      grid: {
-        left: '3%',
-        right: '2%',
-        bottom: '2%',
-        containLabel: true
+  const myChart3 = echarts.init(document.getElementById(Id))
+  myChart3.setOption({
+    grid: {
+      left: "3%",
+      right: "2%",
+      bottom: "2%",
+      containLabel: true,
+    },
+    tooltip: {
+      trigger: "axis",
+    },
+    xAxis: {
+      type: "category",
+      // boundaryGap: false,
+      data: dataList.xAxisData,
+      axisPointer: {
+        type: "shadow",
       },
-      tooltip: {
-        trigger: 'axis',
-
+      axisTick: {
+        show: false,
+        alignWithLabel: true,
+        length: 5,
       },
-      xAxis: {
-        type: 'category',
-        // boundaryGap: false,
-        data: dataList.xAxisData,
-        axisPointer: {
-          type: 'shadow'
+      // 鍧愭爣杞村埢搴︾嚎鏍峰紡
+      axisTick: {
+        show: false,
+        length: 5,
+        lineStyle: {
+          color: "#ddd",
         },
-        axisTick: {
-          show: false,
-          alignWithLabel: true,
-          length: 5
-        },
-        // 鍧愭爣杞村埢搴︾嚎鏍峰紡
-        axisTick: {
-          show: false,
-          length: 5,
-          lineStyle: {
-            color: '#ddd'
-          }
-        },
-
-        // 鍒嗗壊绾�
-        splitLine: {
-          show: false,
-          lineStyle: {
-            type: 'dashed',
-            color: 'rgba(220,222,226,0.4)'
-          }
-        },
-        axisLabel: {
-          color: '#999',
-          fontSize: 14,
-          padding: [5, 0, 0, 0],
-          //   formatter: '{value} ml'
-        }
       },
-      yAxis: {
-        type: 'value',
-        name: '锛堟锛�',
-        // 璁剧疆鍚嶇О鏍峰紡
-        nameTextStyle: {
-          color: ' #CEE3FF',
-          fontSize: 14,
-          padding: [0, 0, 5, 0],
-        },
-        // 鍧愭爣杞村埢搴�
-        axisTick: {
-          show: false,
-          alignWithLabel: true,
-          length: 5
-        },
-        // 鍧愭爣杞村埢搴︾嚎鏍峰紡
-        axisTick: {
-          show: false,
-          length: 5,
-          lineStyle: {
-            color: ''
-          }
-        },
 
-        // 鍒嗗壊绾�
-        splitLine: {
-          show: true,
-          lineStyle: {
-            type: 'dashed',
-            color: 'rgba(220,222,226,0.4)'
-          }
+      // 鍒嗗壊绾�
+      splitLine: {
+        show: false,
+        lineStyle: {
+          type: "dashed",
+          color: "rgba(220,222,226,0.4)",
         },
-
-        // 鍧愭爣杞村埢搴﹂棿闅�
-        // interval: '50',
-        // // 鍧愭爣杞存渶灏忓��
-        // min: 'dataMin',
-        // // 鍧愭爣杞存渶澶у��
-        // max: 'dataMax',
-        // // 鍧愭爣杞村皬鏁扮偣绮惧害
-        // precision: 0,
-        // // 鍧愭爣杞村埢搴︽枃鏈殑甯冨眬鏈濆悜
-        // position: 'left'
-        axisLabel: {
-          color: '#B2B8C2',
-          fontSize: 14,
-          //   formatter: '{value} ml'
-        }
       },
-      series: [
-        {
-          name: "鎶ヨ娆℃暟",
-          type: "bar",
-          barWidth: '17',
-          stack: 'number',
-          data: dataList.data,
-          tooltip: {
-            show: false,
-          }
+      axisLabel: {
+        color: "#999",
+        fontSize: 14,
+        padding: [5, 0, 0, 0],
+        //   formatter: '{value} ml'
+      },
+    },
+    yAxis: {
+      type: "value",
+      name: "锛堟锛�",
+      // 璁剧疆鍚嶇О鏍峰紡
+      nameTextStyle: {
+        color: " #CEE3FF",
+        fontSize: 14,
+        padding: [0, 0, 5, 0],
+      },
+      // 鍧愭爣杞村埢搴�
+      axisTick: {
+        show: false,
+        alignWithLabel: true,
+        length: 5,
+      },
+      // 鍧愭爣杞村埢搴︾嚎鏍峰紡
+      axisTick: {
+        show: false,
+        length: 5,
+        lineStyle: {
+          color: "",
         },
-        {
-          name: '鎶ヨ娆℃暟',
-          type: 'line',
-          symbol: 'none', // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
-          lineStyle: {
-            color: '#EE0303'
-          },
-          data: dataList.data,
-        },
-      ]
-    })
+      },
 
-  window.addEventListener("resize", () => {
-    myChart1.resize();
-    myChart2.resize();
-    myChart3.resize();
-  }, { passive: true });
+      // 鍒嗗壊绾�
+      splitLine: {
+        show: true,
+        lineStyle: {
+          type: "dashed",
+          color: "rgba(220,222,226,0.4)",
+        },
+      },
+
+      // 鍧愭爣杞村埢搴﹂棿闅�
+      // interval: '50',
+      // // 鍧愭爣杞存渶灏忓��
+      // min: 'dataMin',
+      // // 鍧愭爣杞存渶澶у��
+      // max: 'dataMax',
+      // // 鍧愭爣杞村皬鏁扮偣绮惧害
+      // precision: 0,
+      // // 鍧愭爣杞村埢搴︽枃鏈殑甯冨眬鏈濆悜
+      // position: 'left'
+      axisLabel: {
+        color: "#B2B8C2",
+        fontSize: 14,
+        //   formatter: '{value} ml'
+      },
+    },
+    series: [
+      {
+        name: "鎶ヨ娆℃暟",
+        type: "bar",
+        barWidth: "12",
+        stack: "number",
+        data: dataList.data,
+        tooltip: {
+          show: false,
+        },
+      },
+      {
+        name: "鎶ヨ娆℃暟",
+        type: "line",
+        symbol: "none", // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
+        lineStyle: {
+          color: "#EE0303",
+        },
+        data: dataList.data,
+      },
+    ],
+  })
+
+  window.addEventListener(
+    "resize",
+    () => {
+      myChart1.resize()
+      myChart2.resize()
+      myChart3.resize()
+    },
+    { passive: true }
+  )
 }
-
-
-
-
 </script>
 
 <style scoped lang="scss">
 @import "@/assets/styles/page.scss";
 
-
 .chart-box {
-  height: calc((100vh - 410px)/2) !important;
+  height: calc((100vh - 410px) / 2) !important;
 }
 
 .data-item {
@@ -378,7 +400,7 @@
   font-weight: bold;
 
   span {
-    color: #397AEE;
+    color: #397aee;
     margin: 0 5px;
   }
 }
@@ -390,10 +412,9 @@
     font-weight: bold;
 
     span {
-      color: #397AEE;
+      color: #397aee;
       margin: 0 5px;
     }
   }
-
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/zhitan-vue/src/views/carbonemission/carbonEmission.vue b/zhitan-vue/src/views/carbonemission/carbonEmission.vue
index 8d49140..550abd7 100644
--- a/zhitan-vue/src/views/carbonemission/carbonEmission.vue
+++ b/zhitan-vue/src/views/carbonemission/carbonEmission.vue
@@ -8,42 +8,40 @@
         <div class="form-card">
           <el-form :model="queryParams" ref="queryRef" :inline="true">
             <el-form-item label="鏈熼棿" prop="timeType">
-              <el-select v-model="queryParams.timeType" placeholder="鏈熼棿" clearable style="width: 120px"
-                @change="handleTimeType">
+              <el-select
+                v-model="queryParams.timeType"
+                placeholder="鏈熼棿"
+                clearable
+                style="width: 120px"
+                @change="handleTimeType"
+              >
                 <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="鏃堕棿">
-              <el-date-picker v-model="queryParams.dataTime" :type="queryParams.timeType == 'YEAR'
-                ? 'year'
-                : queryParams.timeType == 'MONTH'
-                  ? 'month'
-                  : 'date'
-                " :format="queryParams.timeType == 'YEAR'
-                  ? 'YYYY'
-                  : queryParams.timeType == 'MONTH'
-                    ? 'YYYY-MM'
-                    : 'YYYY-MM-DD'
-                  " value-format="YYYY-MM-DD" placeholder="鏃堕棿" style="width: 100%" />
+              <el-date-picker
+                v-model="queryParams.dataTime"
+                :type="queryParams.timeType == 'YEAR' ? 'year' : queryParams.timeType == 'MONTH' ? 'month' : 'date'"
+                :format="
+                  queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD'
+                "
+                value-format="YYYY-MM-DD"
+                placeholder="鏃堕棿"
+                style="width: 100%"
+              />
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">
-                鎼滅储
-              </el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery"> 鎼滅储 </el-button>
               <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Download" @click="handleExport">
-                瀵煎嚭
-              </el-button>
+              <el-button type="primary" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
             </el-form-item>
           </el-form>
         </div>
-        <div style="
-            height: calc(100vh - 220px) !important;
-            max-height: calc(100vh - 220px) !important;
-            overflow-y: auto;
-          ">
+        <div
+          style="height: calc(100vh - 220px) !important; max-height: calc(100vh - 220px) !important; overflow-y: auto"
+        >
           <div class="card-list" v-if="listTop.length > 1">
             <el-button @click="dialogVisible = true"> 鏌ョ湅鏇村 </el-button>
           </div>
@@ -52,9 +50,12 @@
               <template v-for="(item, index) in row" :key="index">
                 <div class="card-list-item">
                   <div class="item-top">
-                    <div class="top-icon" :style="{
-                      backgroundImage: 'url(' + bgList[index].icon + ')',
-                    }" />
+                    <div
+                      class="top-icon"
+                      :style="{
+                        backgroundImage: 'url(' + bgList[index].icon + ')',
+                      }"
+                    />
                     <div class="top-right">
                       {{ item.allEneryType }}
                     </div>
@@ -69,12 +70,10 @@
                     <div class="bottom-left">鍚屾瘮</div>
                     <div class="bottom-right" :style="{ color: bgList[index].color }">
                       {{ Math.abs(item.yoyEnery) }}%
-                      <el-icon v-if="!!item.yoyEnery" :color="item.yoyEnery > 0
-                        ? 'green'
-                        : item.yoyEnery < 0
-                          ? 'red'
-                          : ''
-                        ">
+                      <el-icon
+                        v-if="!!item.yoyEnery"
+                        :color="item.yoyEnery > 0 ? 'green' : item.yoyEnery < 0 ? 'red' : ''"
+                      >
                         <Top v-if="item.yoyEnery > 0" />
                         <Bottom v-if="item.yoyEnery < 0" />
                       </el-icon>
@@ -84,25 +83,23 @@
               </template>
             </div>
           </template>
-          <BaseCard :title="queryParams.nodeName +
-            '-纰虫帓鏀鹃噺鍚岀幆姣�(' +
-            queryParams.dataTime +
-            ')'
-            ">
+          <BaseCard :title="queryParams.nodeName + '-纰虫帓鏀鹃噺鍚岀幆姣�(' + queryParams.dataTime + ')'">
             <div class="chart-box" v-loading="loading">
               <div id="Chart1" />
             </div>
           </BaseCard>
-          <BaseCard :title="queryParams.nodeName +
-            '-纰虫帓鏀鹃噺缁熻鍒嗘瀽琛�(' +
-            queryParams.dataTime +
-            ')'
-            ">
+          <BaseCard :title="queryParams.nodeName + '-纰虫帓鏀鹃噺缁熻鍒嗘瀽琛�(' + queryParams.dataTime + ')'">
             <div class="table-box">
               <el-table :data="listBottom" v-loading="loading">
                 <el-table-column label="鏃堕棿" align="center" key="xaxis" prop="xaxis" :show-overflow-tooltip="true" />
-                <el-table-column label="鐮存帓鏀鹃噺(tCO鈧俥)
-                  " align="center" key="yaxis" prop="yaxis" :show-overflow-tooltip="true" />
+                <el-table-column
+                  label="鐮存帓鏀鹃噺(tCO鈧俥)
+                  "
+                  align="center"
+                  key="yaxis"
+                  prop="yaxis"
+                  :show-overflow-tooltip="true"
+                />
                 <el-table-column label="鍚屾瘮" align="center" key="yoy" prop="yoy" :show-overflow-tooltip="true" />
                 <el-table-column label="鐜瘮" align="center" key="qoq" prop="qoq" :show-overflow-tooltip="true" />
               </el-table>
@@ -117,9 +114,12 @@
           <template v-for="(item, index) in row" :key="index">
             <div class="card-list-item">
               <div class="item-top">
-                <div class="top-icon" :style="{
-                  backgroundImage: 'url(' + bgList[index].icon + ')',
-                }" />
+                <div
+                  class="top-icon"
+                  :style="{
+                    backgroundImage: 'url(' + bgList[index].icon + ')',
+                  }"
+                />
                 <div class="top-right">
                   {{ item.allEneryType }}
                 </div>
@@ -134,12 +134,7 @@
                 <div class="bottom-left">鍚屾瘮</div>
                 <div class="bottom-right" :style="{ color: bgList[index].color }">
                   {{ Math.abs(item.yoyEnery) }}%
-                  <el-icon v-if="!!item.yoyEnery" :color="item.yoyEnery > 0
-                    ? 'green'
-                    : item.yoyEnery < 0
-                      ? 'red'
-                      : ''
-                    ">
+                  <el-icon v-if="!!item.yoyEnery" :color="item.yoyEnery > 0 ? 'green' : item.yoyEnery < 0 ? 'red' : ''">
                     <Top v-if="item.yoyEnery > 0" />
                     <Bottom v-if="item.yoyEnery < 0" />
                   </el-icon>
@@ -153,29 +148,26 @@
   </div>
 </template>
 <script setup name="carbonEmission">
-import {
-  listUpCarbonemission,
-  listMiddleCarbonemission,
-} from "@/api/carbonemission/carbonemission";
-import * as echarts from "echarts";
-const { proxy } = getCurrentInstance();
-import { useRoute } from "vue-router";
-const { period } = proxy.useDict("period");
-import useSettingsStore from "@/store/modules/settings";
-const settingsStore = useSettingsStore();
+import { listUpCarbonemission, listMiddleCarbonemission } from "@/api/carbonemission/carbonemission"
+import * as echarts from "echarts"
+const { proxy } = getCurrentInstance()
+import { useRoute } from "vue-router"
+const { period } = proxy.useDict("period")
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
 watch(
   () => settingsStore.sideTheme,
   (val) => {
-    getList();
+    getList()
   }
-);
-const loading = ref(false);
-const dialogVisible = ref(false);
-import icon1 from "@/assets/images/period/icon1.png";
-import icon2 from "@/assets/images/period/icon2.png";
-import icon3 from "@/assets/images/period/icon3.png";
-import icon4 from "@/assets/images/period/icon4.png";
-import icon5 from "@/assets/images/period/icon5.png";
+)
+const loading = ref(false)
+const dialogVisible = ref(false)
+import icon1 from "@/assets/images/period/icon1.png"
+import icon2 from "@/assets/images/period/icon2.png"
+import icon3 from "@/assets/images/period/icon3.png"
+import icon4 from "@/assets/images/period/icon4.png"
+import icon5 from "@/assets/images/period/icon5.png"
 const bgList = ref([
   {
     icon: icon1,
@@ -197,9 +189,9 @@
     icon: icon5,
     color: "#78e801",
   },
-]);
-const listTop = ref([]);
-const listBottom = ref([]);
+])
+const listTop = ref([])
+const listBottom = ref([])
 const data = reactive({
   queryParams: {
     nodeId: null,
@@ -208,23 +200,23 @@
     dataTime: null,
   },
   query: { ...useRoute().query },
-});
-const { queryParams, query } = toRefs(data);
+})
+const { queryParams, query } = toRefs(data)
 /** 鑺傜偣鍗曞嚮浜嬩欢 */
 function handleNodeClick(data) {
-  queryParams.value.nodeId = data.id;
-  queryParams.value.nodeName = data.label;
-  handleTimeType(period.value[0].value);
-  handleQuery();
+  queryParams.value.nodeId = data.id
+  queryParams.value.nodeName = data.label
+  handleTimeType(period.value[0].value)
+  handleQuery()
 }
 function handleTimeType(e) {
-  queryParams.value.timeType = e;
-  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD");
+  queryParams.value.timeType = e
+  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")
 }
 // 纰虫帓鏀剧鐞�-纰虫帓鏀鹃噺鏍哥畻-鍒楄〃
 function getList() {
-  loading.value = true;
-  listTop.value = [];
+  loading.value = true
+  listTop.value = []
   listUpCarbonemission(
     proxy.addDateRange({
       ...queryParams.value,
@@ -233,15 +225,15 @@
   ).then((res) => {
     res.data.upData.map((item, index) => {
       if (index % 5 === 0) {
-        listTop.value.push(res.data.upData.slice(index, index + 5));
+        listTop.value.push(res.data.upData.slice(index, index + 5))
       }
-    });
-  });
+    })
+  })
   // 鍦ㄥ垵濮嬪寲涔嬪墠锛屽厛dispose鏃х殑瀹炰緥
   if (echarts.getInstanceByDom(document.getElementById("Chart1"))) {
-    echarts.dispose(document.getElementById("Chart1"));
+    echarts.dispose(document.getElementById("Chart1"))
   }
-  const myChart1 = echarts.init(document.getElementById("Chart1"));
+  const myChart1 = echarts.init(document.getElementById("Chart1"))
   listMiddleCarbonemission(
     proxy.addDateRange({
       emissionType: "allType",
@@ -250,19 +242,19 @@
     })
   ).then((res) => {
     if (!!res.code && res.code == 200) {
-      loading.value = false;
-      let xaxis = [];
-      let yaxis = [];
-      let yoy = [];
-      let qoq = [];
+      loading.value = false
+      let xaxis = []
+      let yaxis = []
+      let yoy = []
+      let qoq = []
       if (!!res.data) {
         res.data.map((item) => {
-          xaxis.push(item.xaxis);
-          yaxis.push(!!item.yaxis ? item.yaxis : 0);
-          yoy.push(!!item.yoy ? item.yoy : 0);
-          qoq.push(!!item.qoq ? item.qoq : 0);
-        });
-        listBottom.value = res.data;
+          xaxis.push(item.xaxis)
+          yaxis.push(!!item.yaxis ? item.yaxis : 0)
+          yoy.push(!!item.yoy ? item.yoy : 0)
+          qoq.push(!!item.qoq ? item.qoq : 0)
+        })
+        listBottom.value = res.data
       }
       setTimeout(() => {
         myChart1.setOption({
@@ -273,10 +265,7 @@
               type: "shadow",
               textStyle: {
                 fontSize: 14,
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
           },
@@ -292,8 +281,7 @@
             itemWidth: 14,
             itemHeight: 10,
             textStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
             },
           },
           xAxis: {
@@ -304,10 +292,7 @@
             axisLine: {
               show: true,
               lineStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -320,8 +305,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [5, 0, 0, 0],
               //   formatter: '{value} ml'
@@ -333,10 +317,7 @@
               name: "tCO鈧俥",
               type: "value",
               nameTextStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 fontSize: 14,
                 padding: [0, 0, 5, 0],
               },
@@ -347,10 +328,7 @@
                 show: true,
                 lineStyle: {
                   type: "dashed",
-                  color:
-                    settingsStore.sideTheme == "theme-dark"
-                      ? "#FFFFFF"
-                      : "#222222",
+                  color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 },
               },
               axisTick: {
@@ -360,10 +338,7 @@
                 show: false,
               },
               axisLabel: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 fontSize: 14,
               },
             },
@@ -372,10 +347,7 @@
               name: "%",
               alignTicks: true,
               nameTextStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 fontSize: 14,
                 padding: [0, 0, 5, 0],
               },
@@ -389,20 +361,14 @@
                 show: true,
                 lineStyle: {
                   type: "dashed",
-                  color:
-                    settingsStore.sideTheme == "theme-dark"
-                      ? "#FFFFFF"
-                      : "#222222",
+                  color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 },
               },
               splitArea: {
                 show: false,
               },
               axisLabel: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
                 fontSize: 14,
               },
             },
@@ -411,7 +377,7 @@
             {
               name: "纰虫帓鏀鹃噺",
               type: "bar",
-              barWidth: "27",
+              barWidth: "12",
               itemStyle: {
                 borderRadius: [15, 15, 0, 0],
               },
@@ -438,29 +404,29 @@
               data: qoq,
             },
           ],
-        });
-      }, 100);
+        })
+      }, 100)
       window.addEventListener(
         "resize",
         () => {
-          myChart1.resize();
+          myChart1.resize()
         },
         { passive: true }
-      );
+      )
     }
-  });
+  })
 }
 // 纰虫帓鏀剧鐞�-纰虫帓鏀鹃噺鏍哥畻-鎼滅储
 function handleQuery() {
-  getList();
+  getList()
 }
 // 纰虫帓鏀剧鐞�-纰虫帓鏀鹃噺鏍哥畻-閲嶇疆
 function resetQuery() {
-  proxy.resetForm("queryRef");
-  queryParams.value.timeType = null;
-  queryParams.value.dataTime = null;
-  handleTimeType(period.value[0].value);
-  handleQuery();
+  proxy.resetForm("queryRef")
+  queryParams.value.timeType = null
+  queryParams.value.dataTime = null
+  handleTimeType(period.value[0].value)
+  handleQuery()
 }
 // 纰虫帓鏀剧鐞�-纰虫帓鏀鹃噺鏍哥畻-瀵煎嚭
 function handleExport() {
@@ -472,7 +438,7 @@
       ...query.value,
     },
     `${queryParams.value.nodeName}-纰虫帓鏀鹃噺鏍哥畻_${new Date().getTime()}.xlsx`
-  );
+  )
 }
 </script>
 <style scoped lang="scss">
diff --git a/zhitan-vue/src/views/comprehensive/comps/LineChart.vue b/zhitan-vue/src/views/comprehensive/comps/LineChart.vue
new file mode 100644
index 0000000..e9cc744
--- /dev/null
+++ b/zhitan-vue/src/views/comprehensive/comps/LineChart.vue
@@ -0,0 +1,173 @@
+<template>
+  <div class="chart-box">
+    <div id="ChartDom" style="width: 100%; height: 100%"></div>
+  </div>
+</template>
+
+<script setup>
+import * as echarts from "echarts"
+const { proxy } = getCurrentInstance()
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
+const emit = defineEmits()
+const props = defineProps({
+  chartData: {
+    type: Object,
+    default: () => {},
+  },
+})
+
+watch(
+  () => props.chartData,
+  (val) => {
+    console.log("watch", val)
+    initChart()
+  }
+)
+watch(
+  () => settingsStore.sideTheme,
+  (val) => {
+    initChart()
+  }
+)
+
+function initChart(value) {
+  const chartDom = document.getElementById("ChartDom")
+  if (echarts.getInstanceByDom(chartDom)) {
+    echarts.dispose(chartDom)
+  }
+  const myChart = echarts.init(chartDom)
+  let option = {
+    title: {
+      text: props.chartData.title,
+      left: "40",
+      textStyle: {
+        color: "#2979ff",
+      },
+    },
+    color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+    tooltip: {
+      trigger: "axis",
+      axisPointer: {
+        type: "shadow",
+      },
+    },
+    legend: {
+      icon: "rect",
+      itemWidth: 14,
+      itemHeight: 10,
+      textStyle: {
+        color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+      },
+    },
+    grid: {
+      top: "40",
+      left: "50",
+      right: "40",
+      bottom: "20",
+      containLabel: true,
+    },
+    xAxis: {
+      type: "category",
+      axisPointer: {
+        type: "shadow",
+      },
+      axisLine: {
+        show: true,
+        lineStyle: {
+          color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+        },
+      },
+      axisTick: {
+        show: false,
+      },
+      splitArea: {
+        show: false,
+      },
+      splitLine: {
+        show: false,
+      },
+      axisLabel: {
+        color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+        fontSize: 14,
+        padding: [5, 0, 0, 0],
+        //   formatter: '{value} ml'
+      },
+      data: props.chartData.xData,
+    },
+    yAxis: [
+      {
+        type: "value",
+        nameTextStyle: {
+          color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+          fontSize: 14,
+          padding: [0, 0, 5, 0],
+        },
+        axisLine: {
+          show: false,
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            type: "dashed",
+            color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+          },
+        },
+        axisTick: {
+          show: false,
+        },
+        splitArea: {
+          show: false,
+        },
+        axisLabel: {
+          color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+          fontSize: 14,
+        },
+      },
+    ],
+    series: [
+      {
+        name: props.chartData.title,
+        type: "bar",
+        barWidth: "16",
+        // tooltip: {
+        //   valueFormatter: function (value) {
+        //     return value + "tce"
+        //   },
+        // },
+        itemStyle: {
+          borderRadius: [15, 15, 0, 0],
+        },
+        data: props.chartData.yData,
+        markPoint: {
+          data: [
+            { type: "max", name: "Max" },
+            { type: "min", name: "Min" },
+          ],
+        },
+      },
+    ],
+  }
+  setTimeout(() => {
+    myChart.setOption(option)
+  }, 200)
+
+  window.addEventListener(
+    "resize",
+    () => {
+      myChart.resize()
+    },
+    { passive: true }
+  )
+}
+</script>
+
+<style lang="scss" scoped>
+.chart-box {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #eaeaea;
+  margin-top: 20px;
+  padding-top: 20px;
+}
+</style>
diff --git a/zhitan-vue/src/views/comprehensive/dailyComprehensive/index.vue b/zhitan-vue/src/views/comprehensive/dailyComprehensive/index.vue
new file mode 100644
index 0000000..a3d5183
--- /dev/null
+++ b/zhitan-vue/src/views/comprehensive/dailyComprehensive/index.vue
@@ -0,0 +1,245 @@
+<template>
+  <div class="page">
+    <div class="form-card">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
+        <el-form-item label="鑳芥簮绫诲瀷" prop="energyType">
+          <el-select v-model="queryParams.energyType" placeholder="璇烽�夋嫨鑳芥簮绫诲瀷">
+            <el-option
+              :label="item.enername"
+              :value="item.enersno"
+              v-for="item in energyTypeList"
+              :key="item.enersno"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="缁熻鏃堕棿">
+          <el-date-picker
+            v-model="queryParams.dataTime"
+            type="date"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            placeholder="閫夋嫨鏃ユ湡"
+            style="width: 100%"
+            :clearable="false"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+          <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-button type="warning" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
+        </el-form-item> -->
+      </el-form>
+    </div>
+
+    <div class="table-bg-style">
+      <div class="table-box">
+        <el-table :data="energyList" v-loading="loading" border max-height="380px">
+          <el-table-column fixed prop="indexName" label="鎸囨爣鍚嶇О" width="210px">
+            <template #default="scope">
+              <div style="width: 100%; text-align: left">
+                <el-button
+                  v-if="scope.row.indexId == queryParams.indexId"
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="color: #fff; background: #409eff; margin-right: 8px"
+                ></el-button>
+                <el-button
+                  v-else
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="margin-right: 8px"
+                ></el-button>
+                <el-tooltip
+                  v-if="scope.row.indexName.length > 9"
+                  class="item"
+                  effect="dark"
+                  :content="scope.row.indexName"
+                  placement="top-end"
+                >
+                  <span>
+                    {{ scope.row.indexName.substr(0, 9) + "..." }}
+                  </span>
+                </el-tooltip>
+                <span v-else>{{ scope.row.indexName }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column v-for="index in 24" :key="index" :label="index - 1 + '鏃�'" align="center" min-width="100">
+            <template #default="scope">{{ numFilter(scope.row[`value${index - 1}`]) }}</template>
+          </el-table-column>
+        </el-table>
+
+        <div>
+          <line-chart ref="LineChartRef" :chartData="lineChartData" />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {
+  getDataList,
+  getlistChart,
+  exportList,
+} from "@/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive"
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType"
+import LineChart from "../comps/LineChart.vue"
+let { proxy } = getCurrentInstance()
+const energyTypeList = ref()
+function getEnergyTypeList() {
+  listEnergyTypeList().then((res) => {
+    energyTypeList.value = res.data
+    // form.value.indexType = alarm_record_category.value[0].value
+    // form.value.energyType = energyTypeList.value[0].enersno
+    getList()
+  })
+}
+getEnergyTypeList()
+function numFilter(value) {
+  // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+  let realVal = ""
+  if (!isNaN(value) && value !== "" && value !== null) {
+    realVal = parseFloat(value).toFixed(2)
+  } else {
+    realVal = "--"
+  }
+  return realVal
+}
+let loading = ref(false)
+let total = ref(0)
+let queryParams = ref({
+  indexStorageId: "",
+  indexCode: "",
+  pageNum: 1,
+  pageSize: 10,
+  dataTime: "",
+})
+
+const energyList = ref([])
+const lineChartData = ref({})
+function getList() {
+  queryParams.value.indexCode = proxy.$route.query.modelCode
+  getDataList({
+    ...queryParams.value,
+    timeType: "HOUR",
+  }).then((response) => {
+    energyList.value = response.data
+    if (response.data && response.data.length !== 0) {
+      selectChange(response.data[0])
+    }
+  })
+}
+
+const LineChartRef = ref()
+function selectChange(row) {
+  queryParams.value.indexId = row ? row.indexId : undefined
+  queryParams.value.timeType = "HOUR"
+  getlistChart(queryParams.value).then((response) => {
+    let actualData = []
+    let expectedData = []
+    let title = ""
+    response.data.forEach((item) => {
+      expectedData.push(numFilter(item.value))
+      actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏃�")
+      title = item.indexName + "(" + (item.unitId || "") + ")"
+    })
+
+    console.log(response)
+    console.log(actualData)
+    console.log(expectedData)
+
+    lineChartData.value = {
+      // xData: [
+      //   "0鏃�",
+      //   "1鏃�",
+      //   "2鏃�",
+      //   "3鏃�",
+      //   "4鏃�",
+      //   "5鏃�",
+      //   "6鏃�",
+      //   "7鏃�",
+      //   "8鏃�",
+      //   "9鏃�",
+      //   "10鏃�",
+      //   "11鏃�",
+      //   "12鏃�",
+      //   "13鏃�",
+      //   "14鏃�",
+      //   "15鏃�",
+      //   "16鏃�",
+      //   "17鏃�",
+      //   "18鏃�",
+      //   "19鏃�",
+      //   "20鏃�",
+      //   "21鏃�",
+      //   "22鏃�",
+      //   "23鏃�",
+      // ],
+      xData: actualData,
+      yData: expectedData,
+      title,
+    }
+    // LineChartRef.value.initChart()
+    // this.lineChartData.actualData = actualData;
+    // this.lineChartData.expectedData = expectedData;
+    // this.lineChartData.title = title;
+    // this.$refs.LineChart.initChart(this.lineChartData);
+    // this.$refs.BarChart.initChart(this.lineChartData);
+  })
+}
+
+function getTime() {
+  var date = new Date()
+  var year = date.getFullYear()
+  var month = date.getMonth() + 1
+  var date = date.getDate()
+  month = month < 10 ? "0" + month : month
+  date = date < 10 ? "0" + date : date
+  queryParams.value.dataTime = year + "-" + month + "-" + date
+}
+getTime()
+
+// 瀵煎嚭鎸夐挳鎿嶄綔
+function handleExport() {
+  exportList(queryParams.value).then((response) => {
+    console.log(response)
+    // download(response.msg);
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  queryParams.value = {
+    limitName: "",
+    pageNum: 1,
+    pageSize: 10,
+    dataTime: null,
+  }
+  getTime()
+  getList()
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/page.scss";
+
+.header-box {
+  :deep .el-form-item__content {
+    color: #fff;
+    font-size: 16px;
+  }
+}
+
+:deep .el-table--fit {
+  border-bottom: 1px solid #eaeaea;
+}
+</style>
diff --git a/zhitan-vue/src/views/comprehensive/monthlyComprehensive/index.vue b/zhitan-vue/src/views/comprehensive/monthlyComprehensive/index.vue
new file mode 100644
index 0000000..c63c0fe
--- /dev/null
+++ b/zhitan-vue/src/views/comprehensive/monthlyComprehensive/index.vue
@@ -0,0 +1,241 @@
+<template>
+  <div class="page">
+    <div class="form-card">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
+        <el-form-item label="鑳芥簮绫诲瀷" prop="energyType">
+          <el-select v-model="queryParams.energyType" placeholder="璇烽�夋嫨鑳芥簮绫诲瀷">
+            <el-option
+              :label="item.enername"
+              :value="item.enersno"
+              v-for="item in energyTypeList"
+              :key="item.enersno"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="缁熻鏃堕棿">
+          <el-date-picker
+            style="width: 100%"
+            v-model="queryParams.dataTime"
+            type="month"
+            :clearable="false"
+            value-format="yyyy-MM"
+            placeholder="閫夋嫨鏃ユ湡"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+          <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-button type="warning" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
+        </el-form-item> -->
+      </el-form>
+    </div>
+
+    <div class="table-bg-style">
+      <div class="table-box">
+        <el-table :data="energyList" v-loading="loading" border max-height="380px">
+          <el-table-column fixed prop="indexName" label="鎸囨爣鍚嶇О" width="210px">
+            <template #default="scope">
+              <div style="width: 100%; text-align: left">
+                <el-button
+                  v-if="scope.row.indexId == queryParams.indexId"
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="color: #fff; background: #409eff; margin-right: 8px"
+                ></el-button>
+                <el-button
+                  v-else
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="margin-right: 8px"
+                ></el-button>
+                <el-tooltip
+                  v-if="scope.row.indexName.length > 9"
+                  class="item"
+                  effect="dark"
+                  :content="scope.row.indexName"
+                  placement="top-end"
+                >
+                  <span>
+                    {{ scope.row.indexName.substr(0, 9) + "..." }}
+                  </span>
+                </el-tooltip>
+                <span v-else>{{ scope.row.indexName }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column v-for="index in 31" :key="index" :label="index + '鏃�'" align="center" min-width="100">
+            <template #default="scope">{{ numFilter(scope.row[`value${index - 1}`]) }}</template>
+          </el-table-column>
+        </el-table>
+
+        <div>
+          <line-chart ref="LineChartRef" :chartData="lineChartData" />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { getDataList, getlistChart } from "@/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive"
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType"
+import LineChart from "../comps/LineChart.vue"
+let { proxy } = getCurrentInstance()
+const energyTypeList = ref()
+function getEnergyTypeList() {
+  listEnergyTypeList().then((res) => {
+    energyTypeList.value = res.data
+    // form.value.indexType = alarm_record_category.value[0].value
+    // form.value.energyType = energyTypeList.value[0].enersno
+    getList()
+  })
+}
+getEnergyTypeList()
+function numFilter(value) {
+  // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+  let realVal = ""
+  if (!isNaN(value) && value !== "" && value !== null) {
+    realVal = parseFloat(value).toFixed(2)
+  } else {
+    realVal = "--"
+  }
+  return realVal
+}
+let loading = ref(false)
+let total = ref(0)
+let queryParams = ref({
+  indexStorageId: "",
+  indexCode: "",
+  pageNum: 1,
+  pageSize: 10,
+  dataTime: "",
+  timeType: "DAY",
+})
+
+const energyList = ref([])
+const lineChartData = ref({})
+function getList() {
+  queryParams.value.indexCode = proxy.$route.query.modelCode
+  getDataList({
+    ...queryParams.value,
+  }).then((response) => {
+    energyList.value = response.data.tabledata
+    if (energyList.value && energyList.value.length !== 0) {
+      selectChange(energyList.value[0])
+    }
+  })
+}
+
+const LineChartRef = ref()
+function selectChange(row) {
+  queryParams.value.indexId = row ? row.indexId : undefined
+  getlistChart(queryParams.value).then((response) => {
+    let actualData = []
+    let expectedData = []
+    let title = ""
+    response.data.forEach((item) => {
+      expectedData.push(numFilter(item.value))
+      actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏃�")
+      title = item.indexName + "(" + (item.unitId || "") + ")"
+    })
+
+    console.log(response)
+    console.log(actualData)
+    console.log(expectedData)
+
+    lineChartData.value = {
+      // xData: [
+      //   "0鏃�",
+      //   "1鏃�",
+      //   "2鏃�",
+      //   "3鏃�",
+      //   "4鏃�",
+      //   "5鏃�",
+      //   "6鏃�",
+      //   "7鏃�",
+      //   "8鏃�",
+      //   "9鏃�",
+      //   "10鏃�",
+      //   "11鏃�",
+      //   "12鏃�",
+      //   "13鏃�",
+      //   "14鏃�",
+      //   "15鏃�",
+      //   "16鏃�",
+      //   "17鏃�",
+      //   "18鏃�",
+      //   "19鏃�",
+      //   "20鏃�",
+      //   "21鏃�",
+      //   "22鏃�",
+      //   "23鏃�",
+      // ],
+      xData: actualData,
+      yData: expectedData,
+      title,
+    }
+    // LineChartRef.value.initChart()
+    // this.lineChartData.actualData = actualData;
+    // this.lineChartData.expectedData = expectedData;
+    // this.lineChartData.title = title;
+    // this.$refs.LineChart.initChart(this.lineChartData);
+    // this.$refs.BarChart.initChart(this.lineChartData);
+  })
+}
+
+function getTime() {
+  var date = new Date()
+  var year = date.getFullYear()
+  var month = date.getMonth() + 1
+  var date = date.getDate()
+  month = month < 10 ? "0" + month : month
+  date = date < 10 ? "0" + date : date
+  queryParams.value.dataTime = year + "-" + month
+}
+getTime()
+
+// 瀵煎嚭鎸夐挳鎿嶄綔
+function handleExport() {
+  exportList(queryParams.value).then((response) => {
+    console.log(response)
+    // download(response.msg);
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  queryParams.value = {
+    limitName: "",
+    pageNum: 1,
+    pageSize: 10,
+    dataTime: null,
+    timeType: "DAY",
+  }
+  getTime()
+  getList()
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/page.scss";
+
+.header-box {
+  :deep .el-form-item__content {
+    color: #fff;
+    font-size: 16px;
+  }
+}
+
+:deep .el-table--fit {
+  border-bottom: 1px solid #eaeaea;
+}
+</style>
diff --git a/zhitan-vue/src/views/comprehensive/yearComprehensive/index.vue b/zhitan-vue/src/views/comprehensive/yearComprehensive/index.vue
new file mode 100644
index 0000000..494e37a
--- /dev/null
+++ b/zhitan-vue/src/views/comprehensive/yearComprehensive/index.vue
@@ -0,0 +1,245 @@
+<template>
+  <div class="page">
+    <div class="form-card">
+      <el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
+        <el-form-item label="鑳芥簮绫诲瀷" prop="energyType">
+          <el-select v-model="queryParams.energyType" placeholder="璇烽�夋嫨鑳芥簮绫诲瀷">
+            <el-option
+              :label="item.enername"
+              :value="item.enersno"
+              v-for="item in energyTypeList"
+              :key="item.enersno"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="缁熻鏃堕棿">
+          <el-date-picker
+            style="width: 100%"
+            v-model="queryParams.dataTime"
+            type="year"
+            :clearable="false"
+            value-format="YYYY"
+            placeholder="閫夋嫨鏃ユ湡"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+          <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-button type="warning" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
+        </el-form-item> -->
+      </el-form>
+    </div>
+
+    <div class="table-bg-style">
+      <div class="table-box">
+        <el-table :data="energyList" v-loading="loading" border max-height="380px">
+          <el-table-column fixed prop="indexName" label="鎸囨爣鍚嶇О" width="210px">
+            <template #default="scope">
+              <div style="width: 100%; text-align: left">
+                <el-button
+                  v-if="scope.row.indexId == queryParams.indexId"
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="color: #fff; background: #409eff; margin-right: 8px"
+                ></el-button>
+                <el-button
+                  v-else
+                  icon="search"
+                  circle
+                  @click="selectChange(scope.row)"
+                  style="margin-right: 8px"
+                ></el-button>
+                <el-tooltip
+                  v-if="scope.row.indexName.length > 9"
+                  class="item"
+                  effect="dark"
+                  :content="scope.row.indexName"
+                  placement="top-end"
+                >
+                  <span>
+                    {{ scope.row.indexName.substr(0, 9) + "..." }}
+                  </span>
+                </el-tooltip>
+                <span v-else>{{ scope.row.indexName }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column v-for="index in 12" :key="index" :label="index + '鏈�'" align="center" min-width="100">
+            <template #default="scope">{{ numFilter(scope.row[`value${index - 1}`]) }}</template>
+          </el-table-column>
+        </el-table>
+
+        <div>
+          <line-chart ref="LineChartRef" :chartData="lineChartData" />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { getDataList, getlistChart } from "@/api/comprehensiveStatistics/yearComprehensive/yearComprehensive"
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType"
+import LineChart from "../comps/LineChart.vue"
+let { proxy } = getCurrentInstance()
+const energyTypeList = ref()
+function getEnergyTypeList() {
+  listEnergyTypeList().then((res) => {
+    energyTypeList.value = res.data
+    // form.value.indexType = alarm_record_category.value[0].value
+    // form.value.energyType = energyTypeList.value[0].enersno
+    getList()
+  })
+}
+getEnergyTypeList()
+function numFilter(value) {
+  // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+  let realVal = ""
+  if (!isNaN(value) && value !== "" && value !== null) {
+    realVal = parseFloat(value).toFixed(2)
+  } else {
+    realVal = "--"
+  }
+  return realVal
+}
+let loading = ref(false)
+let queryParams = ref({
+  indexStorageId: "",
+  indexCode: "",
+  pageNum: 1,
+  pageSize: 10,
+  dataTime: "2025-01-0",
+  timeType: "MONTH",
+})
+
+const energyList = ref([])
+const lineChartData = ref({})
+function getList() {
+  queryParams.value.indexCode = proxy.$route.query.modelCode
+  getDataList({
+    ...queryParams.value,
+    dataTime: queryParams.value.dataTime ? queryParams.value.dataTime + "-01" : "",
+  }).then((response) => {
+    energyList.value = response.data
+    if (response.data && response.data.length !== 0) {
+      selectChange(response.data[0])
+    }
+  })
+}
+
+const LineChartRef = ref()
+function selectChange(row) {
+  queryParams.value.indexId = row ? row.indexId : undefined
+  getlistChart({
+    ...queryParams.value,
+    dataTime: queryParams.value.dataTime ? queryParams.value.dataTime + "-01" : "",
+  }).then((response) => {
+    let actualData = []
+    let expectedData = []
+    let title = ""
+    response.data.forEach((item) => {
+      expectedData.push(numFilter(item.value))
+      actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏃�")
+      title = item.indexName + "(" + (item.unitId || "") + ")"
+    })
+
+    console.log(response)
+    console.log(actualData)
+    console.log(expectedData)
+
+    lineChartData.value = {
+      // xData: [
+      //   "0鏃�",
+      //   "1鏃�",
+      //   "2鏃�",
+      //   "3鏃�",
+      //   "4鏃�",
+      //   "5鏃�",
+      //   "6鏃�",
+      //   "7鏃�",
+      //   "8鏃�",
+      //   "9鏃�",
+      //   "10鏃�",
+      //   "11鏃�",
+      //   "12鏃�",
+      //   "13鏃�",
+      //   "14鏃�",
+      //   "15鏃�",
+      //   "16鏃�",
+      //   "17鏃�",
+      //   "18鏃�",
+      //   "19鏃�",
+      //   "20鏃�",
+      //   "21鏃�",
+      //   "22鏃�",
+      //   "23鏃�",
+      // ],
+      xData: actualData,
+      yData: expectedData,
+      title,
+    }
+    // LineChartRef.value.initChart()
+    // this.lineChartData.actualData = actualData;
+    // this.lineChartData.expectedData = expectedData;
+    // this.lineChartData.title = title;
+    // this.$refs.LineChart.initChart(this.lineChartData);
+    // this.$refs.BarChart.initChart(this.lineChartData);
+  })
+}
+
+function getTime() {
+  var date = new Date()
+  var year = date.getFullYear()
+  var month = date.getMonth() + 1
+  var date = date.getDate()
+  month = month < 10 ? "0" + month : month
+  date = date < 10 ? "0" + date : date
+  queryParams.value.dataTime = year + ""
+}
+
+// 瀵煎嚭鎸夐挳鎿嶄綔
+function handleExport() {
+  exportList(queryParams.value).then((response) => {
+    console.log(response)
+    // download(response.msg);
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  queryParams.value = {
+    limitName: "",
+    pageNum: 1,
+    pageSize: 10,
+    dataTime: null,
+    timeType: "MONTH",
+  }
+  getTime()
+  getList()
+}
+
+getTime()
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/page.scss";
+
+.header-box {
+  :deep .el-form-item__content {
+    color: #fff;
+    font-size: 16px;
+  }
+}
+
+:deep .el-table--fit {
+  border-bottom: 1px solid #eaeaea;
+}
+</style>
diff --git a/zhitan-vue/src/views/index.vue b/zhitan-vue/src/views/index.vue
index 8c988a0..2474cd7 100644
--- a/zhitan-vue/src/views/index.vue
+++ b/zhitan-vue/src/views/index.vue
@@ -379,7 +379,7 @@
             right: "5%",
             itemWidth: 14,
             itemHeight: 14,
-            itemGap: 60,
+            itemGap: 16,
             textStyle: {
               align: "left",
               verticalAlign: "middle",
@@ -777,7 +777,7 @@
             right: "10%",
             itemWidth: 14,
             itemHeight: 14,
-            itemGap: 50,
+            itemGap: 16,
             textStyle: {
               align: "left",
               verticalAlign: "middle",
diff --git a/zhitan-vue/src/views/login copy.vue b/zhitan-vue/src/views/login copy.vue
deleted file mode 100644
index d9b0c13..0000000
--- a/zhitan-vue/src/views/login copy.vue
+++ /dev/null
@@ -1,293 +0,0 @@
-<template>
-  <div class="login">
-    <!-- <div
-      class="login-logo-bg"
-      v-if="systemInfo && systemInfo.homeLogo"
-      :style="{ backgroundImage: 'url(' + systemInfo.homeLogo + ')', backgroundSize: '100% 100%' }"
-    ></div> -->
-    <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" />
-    <div class="login-font" v-else>{{ systemInfo.systemName || "鑳芥簮绠$悊绯荤粺" }}</div>
-    <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-      <!-- <h3 class="title">鍏呯數妗╁悗鍙扮鐞嗙郴缁�</h3> -->
-      <el-form-item prop="username">
-        <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="璐﹀彿">
-          <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="password">
-        <el-input
-          v-model="loginForm.password"
-          type="password"
-          size="large"
-          auto-complete="off"
-          placeholder="瀵嗙爜"
-          show-password
-          @keyup.enter="handleLogin"
-        >
-          <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="code" v-if="captchaEnabled">
-        <el-input
-          v-model="loginForm.code"
-          size="large"
-          auto-complete="off"
-          placeholder="楠岃瘉鐮�"
-          style="width: 63%"
-          @keyup.enter="handleLogin"
-        >
-          <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
-        </el-input>
-        <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img" />
-        </div>
-      </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">璁颁綇瀵嗙爜</el-checkbox>
-      <el-form-item style="width: 100%">
-        <el-button
-          :loading="loading"
-          size="large"
-          type="primary"
-          style="width: 100%"
-          color="#626aef"
-          :dark="isDark"
-          @click.prevent="handleLogin"
-        >
-          <span v-if="!loading">鐧� 褰�</span>
-          <span v-else>鐧� 褰� 涓�...</span>
-        </el-button>
-      </el-form-item>
-    </el-form>
-    <!--  搴曢儴  -->
-    <div class="el-login-footer">
-      <!-- <span>Copyright 漏 2021-2024 ZhiTanCloud All Rights Reserved.</span> -->
-      <span>{{ systemInfo.copyRight || "Copyright 漏 2017-2024 ZhiTanCloud All Rights Reserved." }}</span>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { getCodeImg } from "@/api/login"
-import Cookies from "js-cookie"
-import { encrypt, decrypt } from "@/utils/jsencrypt"
-import useUserStore from "@/store/modules/user"
-
-const userStore = useUserStore()
-const route = useRoute()
-const router = useRouter()
-const { proxy } = getCurrentInstance()
-const systemInfo1 = JSON.parse(Cookies.get("SystemInfo") || "{}")
-const systemInfo = {
-  ...systemInfo1,
-  homeLogo: systemInfo1.homeLogo
-    ? systemInfo1.homeLogo.includes("http")
-      ? systemInfo1.homeLogo
-      : "https://demo-ems.zhitancloud.com" + systemInfo1.homeLogo
-    : "",
-}
-console.log(systemInfo)
-
-const loginForm = ref({
-  username: "admin",
-  password: "admin123",
-  rememberMe: false,
-  code: "",
-  uuid: "",
-})
-
-const loginRules = {
-  username: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }],
-  password: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }],
-  code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
-}
-
-const codeUrl = ref("")
-const loading = ref(false)
-// 楠岃瘉鐮佸紑鍏�
-const captchaEnabled = ref(true)
-// 娉ㄥ唽寮�鍏�
-const register = ref(false)
-const redirect = ref(undefined)
-
-watch(
-  route,
-  (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect
-  },
-  { immediate: true }
-)
-
-function handleLogin() {
-  proxy.$refs.loginRef.validate((valid) => {
-    if (valid) {
-      loading.value = true
-      // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪 cookie 涓缃浣忕敤鎴峰悕鍜屽瘑鐮�
-      if (loginForm.value.rememberMe) {
-        Cookies.set("username", loginForm.value.username, { expires: 30 })
-        Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
-        Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
-      } else {
-        // 鍚﹀垯绉婚櫎
-        Cookies.remove("username")
-        Cookies.remove("password")
-        Cookies.remove("rememberMe")
-      }
-      // 璋冪敤action鐨勭櫥褰曟柟娉�
-      userStore
-        .login(loginForm.value)
-        .then(() => {
-          const query = route.query
-          const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
-            if (cur !== "redirect") {
-              acc[cur] = query[cur]
-            }
-            return acc
-          }, {})
-          router.push({ path: redirect.value || "/", query: otherQueryParams })
-        })
-        .catch(() => {
-          loading.value = false
-          // 閲嶆柊鑾峰彇楠岃瘉鐮�
-          if (captchaEnabled.value) {
-            getCode()
-          }
-        })
-    }
-  })
-}
-
-function getCode() {
-  getCodeImg().then((res) => {
-    captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
-    if (captchaEnabled.value) {
-      codeUrl.value = "data:image/gif;base64," + res.img
-      loginForm.value.uuid = res.uuid
-    }
-  })
-}
-
-function getCookie() {
-  const username = Cookies.get("username")
-  const password = Cookies.get("password")
-  const rememberMe = Cookies.get("rememberMe")
-  loginForm.value = {
-    username: username === undefined ? loginForm.value.username : username,
-    password: password === undefined ? loginForm.value.password : decrypt(password),
-    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
-  }
-}
-
-getCode()
-getCookie()
-</script>
-
-<style lang="scss" scoped>
-.login {
-  display: flex;
-  align-items: center;
-  height: 100%;
-  background-image: url("@/assets/images/login-bg.jpg");
-  background-size: 100% 100%;
-  flex-direction: column;
-  position: relative;
-  min-width: 700px;
-  min-height: 700px;
-}
-
-.title {
-  margin: 0px auto 30px auto;
-  text-align: center;
-  color: #707070;
-}
-
-.login-form {
-  position: absolute;
-  left: 50%;
-  top: 60%;
-  transform: translate(-50%, -50%);
-  border-radius: 6px;
-  // background: #ffffff;
-  width: 400px;
-  padding: 25px 25px 5px 25px;
-
-  .el-input {
-    height: 40px;
-
-    input {
-      height: 40px;
-    }
-  }
-
-  .input-icon {
-    height: 39px;
-    width: 14px;
-    margin-left: 0px;
-  }
-}
-
-.login-tip {
-  font-size: 13px;
-  text-align: center;
-  color: #bfbfbf;
-}
-
-.login-code {
-  width: 33%;
-  height: 40px;
-  float: right;
-
-  img {
-    cursor: pointer;
-    vertical-align: middle;
-  }
-}
-
-.el-login-footer {
-  height: 40px;
-  line-height: 40px;
-  position: fixed;
-  bottom: 0;
-  width: 100%;
-  text-align: center;
-  color: #fff;
-  font-family: Arial;
-  font-size: 12px;
-  letter-spacing: 1px;
-}
-
-.login-code-img {
-  height: 40px;
-  padding-left: 12px;
-}
-
-.login-logo-bg {
-  width: 514px;
-  height: 177px;
-  // background-image: url('@/assets/images/login-logo.png');
-  // background-size: 100% 100%;
-  position: absolute;
-  left: 50%;
-  top: 22%;
-  transform: translate(-50%, -50%);
-}
-.login-logo-img {
-  // width: 100%;
-  // height: 100%;
-  // transform: translate(-50%, -50%);
-  max-height: 200px;
-  margin: 0 auto;
-  position: absolute;
-  top: 17%;
-}
-
-.login-font {
-  font-size: 50px;
-  color: #fff;
-  top: 32%;
-  position: absolute;
-  left: 50%;
-  width: 514px;
-  text-align: center;
-  transform: translate(-50%, -50%);
-}
-</style>
diff --git a/zhitan-vue/src/views/login.vue b/zhitan-vue/src/views/login.vue
index 3e8b868..2fe18dd 100644
--- a/zhitan-vue/src/views/login.vue
+++ b/zhitan-vue/src/views/login.vue
@@ -11,8 +11,8 @@
     <div class="middle-view">
       <div class="left-wrapper">
         <div class="login-font">{{ systemInfo.systemName || "" }}</div>
-        <img src="@/assets/images/font01.png" alt="" style="width: 406px" />
-        <img src="@/assets/images/img_logo.png" alt="" style="width: 200px; margin-top: 20px" />
+        <img src="@/assets/images/font01.png" alt="" style="width: 380px" />
+        <img src="@/assets/images/img_logo.png" alt="" style="width: 180px; margin-top: 20px" />
       </div>
       <div class="right-wrapper">
         <div class="header">
@@ -44,7 +44,7 @@
               size="large"
               auto-complete="off"
               placeholder="楠岃瘉鐮�"
-              style="width: 266px"
+              style="width: 230px"
               @keyup.enter="handleLogin"
             >
               <!-- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> -->
@@ -202,7 +202,7 @@
   display: flex;
   align-items: center;
   height: 100%;
-  background-image: url("@/assets/images/login-background.png");
+  background-image: url("@/assets/images/login-background.jpg");
   background-repeat: no-repeat;
   background-size: cover;
   flex-direction: column;
@@ -223,31 +223,31 @@
     flex-direction: column;
   }
   .login-font {
-    font-size: 34px;
+    font-size: 32px;
     font-weight: 700;
     color: #d5f8ff;
-    margin-bottom: 12px;
+    margin-bottom: 10px;
   }
 }
 
 .right-wrapper {
   border-radius: 23px;
   background: #ffffff;
-  width: 480px;
+  width: 410px;
   position: relative;
   .header {
-    height: 70px;
-    line-height: 70px;
+    height: 56px;
+    line-height: 56px;
     border-bottom: 1px solid #f1f1f1;
     color: #3b3b3b;
-    font-size: 22px;
+    font-size: 18px;
     margin-bottom: 22px;
     span {
       display: inline-block;
-      height: 70px;
-      line-height: 70px;
-      border-bottom: 6px solid #3a83fc;
-      margin-left: 50px;
+      height: 56px;
+      line-height: 62px;
+      border-bottom: 4px solid #3a83fc;
+      margin-left: 32px;
     }
   }
 }
@@ -277,14 +277,14 @@
 }
 
 .login-form {
-  padding: 0 50px 30px;
+  padding: 0 32px 20px;
 
   .submit-btn {
-    width: 382px;
-    height: 54px;
+    width: 360px;
+    height: 44px;
     background: #3a83fc;
     border-radius: 3px;
-    font-size: 20px;
+    font-size: 18px;
     box-shadow: 1px 2px 5px #3a83fc;
     border: none;
     border-radius: 6px;
@@ -342,7 +342,7 @@
   text-align: center;
   color: #fff;
   font-family: Arial;
-  font-size: 16px;
+  font-size: 14px;
   letter-spacing: 1px;
 }
 </style>
diff --git a/zhitan-vue/src/views/peakvalley/period/period.vue b/zhitan-vue/src/views/peakvalley/period/period.vue
index c550828..749fa2e 100644
--- a/zhitan-vue/src/views/peakvalley/period/period.vue
+++ b/zhitan-vue/src/views/peakvalley/period/period.vue
@@ -6,11 +6,7 @@
       </div>
       <div class="page-container-right">
         <div class="form-card">
-          <el-form
-            :model="queryParams"
-            ref="queryRef"
-            :inline="true"
-          >
+          <el-form :model="queryParams" ref="queryRef" :inline="true">
             <el-form-item label="鏃堕棿" prop="queryTime">
               <el-date-picker
                 v-model="queryParams.queryTime"
@@ -22,39 +18,22 @@
               />
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">
-                鎼滅储
-              </el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery"> 鎼滅储 </el-button>
               <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
             </el-form-item>
           </el-form>
         </div>
         <div
-          style="
-            height: calc(100vh - 205px) !important;
-            max-height: calc(100vh - 205px) !important;
-            overflow-y: auto;
-          "
+          style="height: calc(100vh - 205px) !important; max-height: calc(100vh - 205px) !important; overflow-y: auto"
           v-loading="loading"
         >
           <div class="card-list">
-            <div
-              class="card-list-item"
-              v-for="item in periodList"
-              :key="item.title"
-            >
+            <div class="card-list-item" v-for="item in periodList" :key="item.title">
               <div class="item-top">
-                <div
-                  class="icon"
-                  :style="{ backgroundImage: 'url(' + item.icon + ')' }"
-                ></div>
+                <div class="icon" :style="{ backgroundImage: 'url(' + item.icon + ')' }"></div>
                 <div class="name">{{ item.title }}</div>
               </div>
-              <div
-                class="item-bottom"
-                v-for="(node, nodeIndex) in item.data"
-                :key="nodeIndex"
-              >
+              <div class="item-bottom" v-for="(node, nodeIndex) in item.data" :key="nodeIndex">
                 <div class="bottom-left">{{ node.label }}</div>
                 <div class="bottom-right" :style="{ color: item.color }">
                   {{ node.value }}
@@ -62,12 +41,12 @@
               </div>
             </div>
           </div>
-          <BaseCard :title="queryParams.nodeName+'-灏栧嘲骞宠胺鐢甸噺鍥�'">
+          <BaseCard :title="queryParams.nodeName + '-灏栧嘲骞宠胺鐢甸噺鍥�'">
             <div class="chart-box">
               <div id="Chart1" />
             </div>
           </BaseCard>
-          <BaseCard :title="queryParams.nodeName+'-灏栧嘲骞宠胺鐢佃垂鍥�'">
+          <BaseCard :title="queryParams.nodeName + '-灏栧嘲骞宠胺鐢佃垂鍥�'">
             <div class="chart-box">
               <div id="Chart2" />
             </div>
@@ -78,24 +57,24 @@
   </div>
 </template>
 <script setup name="period">
-import { listPeriod } from "@/api/peakValley/period";
-import * as echarts from "echarts";
-const { proxy } = getCurrentInstance();
-import { useRoute } from "vue-router";
-import useSettingsStore from "@/store/modules/settings";
-const settingsStore = useSettingsStore();
+import { listPeriod } from "@/api/peakValley/period"
+import * as echarts from "echarts"
+const { proxy } = getCurrentInstance()
+import { useRoute } from "vue-router"
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
 watch(
   () => settingsStore.sideTheme,
   (val) => {
-    getList();
+    getList()
   }
-);
-const loading = ref(false);
-import icon1 from "@/assets/images/period/icon1.png";
-import icon2 from "@/assets/images/period/icon2.png";
-import icon3 from "@/assets/images/period/icon3.png";
-import icon4 from "@/assets/images/period/icon4.png";
-import icon5 from "@/assets/images/period/icon5.png";
+)
+const loading = ref(false)
+import icon1 from "@/assets/images/period/icon1.png"
+import icon2 from "@/assets/images/period/icon2.png"
+import icon3 from "@/assets/images/period/icon3.png"
+import icon4 from "@/assets/images/period/icon4.png"
+import icon5 from "@/assets/images/period/icon5.png"
 const periodList = ref([
   {
     icon: icon1,
@@ -204,7 +183,7 @@
       },
     ],
   },
-]);
+])
 const data = reactive({
   queryParams: {
     nodeId: null,
@@ -213,121 +192,90 @@
     queryTime: null,
   },
   query: { ...useRoute().query },
-});
-const { queryParams, query } = toRefs(data);
+})
+const { queryParams, query } = toRefs(data)
 /** 鑺傜偣鍗曞嚮浜嬩欢 */
 function handleNodeClick(data) {
-  queryParams.value.nodeId = data.id;
-  queryParams.value.nodeName = data.label;
-  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM");
-  handleQuery();
+  queryParams.value.nodeId = data.id
+  queryParams.value.nodeName = data.label
+  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM")
+  handleQuery()
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋锋椂娈电粺璁�-鍒楄〃
 function getList() {
-  loading.value = true;
+  loading.value = true
   listPeriod(
     proxy.addDateRange({
       ...queryParams.value,
       ...query.value,
     })
   ).then((res) => {
-    loading.value = false;
+    loading.value = false
     if (!!res.code && res.code == 200) {
       if (!!res.data.totalVO) {
-        periodList.value[0].data[0].value = !!res.data.totalVO
-          .totalPowerConsumption
+        periodList.value[0].data[0].value = !!res.data.totalVO.totalPowerConsumption
           ? res.data.totalVO.totalPowerConsumption
-          : 0;
-        periodList.value[0].data[1].value = !!res.data.totalVO.totalCost
-          ? res.data.totalVO.totalCost
-          : 0;
+          : 0
+        periodList.value[0].data[1].value = !!res.data.totalVO.totalCost ? res.data.totalVO.totalCost : 0
 
-        periodList.value[1].data[0].value = !!res.data.totalVO
-          .tipPowerConsumption
+        periodList.value[1].data[0].value = !!res.data.totalVO.tipPowerConsumption
           ? res.data.totalVO.tipPowerConsumption
-          : 0;
+          : 0
         periodList.value[1].data[1].value =
-          (!!res.data.totalVO.tipPowerProportion
-            ? res.data.totalVO.tipPowerProportion
-            : 0) + "%";
-        periodList.value[1].data[2].value = !!res.data.totalVO.tipPowerCost
-          ? res.data.totalVO.tipPowerCost
-          : 0;
+          (!!res.data.totalVO.tipPowerProportion ? res.data.totalVO.tipPowerProportion : 0) + "%"
+        periodList.value[1].data[2].value = !!res.data.totalVO.tipPowerCost ? res.data.totalVO.tipPowerCost : 0
         periodList.value[1].data[3].value =
-          (!!res.data.totalVO.tipPowerCostProportion
-            ? res.data.totalVO.tipPowerCostProportion
-            : 0) + "%";
+          (!!res.data.totalVO.tipPowerCostProportion ? res.data.totalVO.tipPowerCostProportion : 0) + "%"
 
-        periodList.value[2].data[0].value = !!res.data.totalVO
-          .peakPowerConsumption
+        periodList.value[2].data[0].value = !!res.data.totalVO.peakPowerConsumption
           ? res.data.totalVO.peakPowerConsumption
-          : 0;
+          : 0
         periodList.value[2].data[1].value =
-          (!!res.data.totalVO.peakPowerProportion
-            ? res.data.totalVO.peakPowerProportion
-            : 0) + "%";
-        periodList.value[2].data[2].value = !!res.data.totalVO.peakPowerCost
-          ? res.data.totalVO.peakPowerCost
-          : 0;
+          (!!res.data.totalVO.peakPowerProportion ? res.data.totalVO.peakPowerProportion : 0) + "%"
+        periodList.value[2].data[2].value = !!res.data.totalVO.peakPowerCost ? res.data.totalVO.peakPowerCost : 0
         periodList.value[2].data[3].value =
-          (!!res.data.totalVO.peakPowerCostProportion
-            ? res.data.totalVO.peakPowerCostProportion
-            : 0) + "%";
+          (!!res.data.totalVO.peakPowerCostProportion ? res.data.totalVO.peakPowerCostProportion : 0) + "%"
 
-        periodList.value[3].data[0].value = !!res.data.totalVO
-          .flatPowerConsumption
+        periodList.value[3].data[0].value = !!res.data.totalVO.flatPowerConsumption
           ? res.data.totalVO.flatPowerConsumption
-          : 0;
+          : 0
         periodList.value[3].data[1].value =
-          (!!res.data.totalVO.flatPowerProportion
-            ? res.data.totalVO.flatPowerProportion
-            : 0) + "%";
-        periodList.value[3].data[2].value = !!res.data.totalVO.flatPowerCost
-          ? res.data.totalVO.flatPowerCost
-          : 0;
+          (!!res.data.totalVO.flatPowerProportion ? res.data.totalVO.flatPowerProportion : 0) + "%"
+        periodList.value[3].data[2].value = !!res.data.totalVO.flatPowerCost ? res.data.totalVO.flatPowerCost : 0
         periodList.value[3].data[3].value =
-          (!!res.data.totalVO.flatPowerCostProportion
-            ? res.data.totalVO.flatPowerCostProportion
-            : 0) + "%";
+          (!!res.data.totalVO.flatPowerCostProportion ? res.data.totalVO.flatPowerCostProportion : 0) + "%"
 
-        periodList.value[4].data[0].value = !!res.data.totalVO
-          .troughPowerConsumption
+        periodList.value[4].data[0].value = !!res.data.totalVO.troughPowerConsumption
           ? res.data.totalVO.troughPowerConsumption
-          : 0;
+          : 0
         periodList.value[4].data[1].value =
-          (!!res.data.totalVO.troughPowerProportion
-            ? res.data.totalVO.troughPowerProportion
-            : 0) + "%";
-        periodList.value[4].data[2].value = !!res.data.totalVO.troughPowerCost
-          ? res.data.totalVO.troughPowerCost
-          : 0;
+          (!!res.data.totalVO.troughPowerProportion ? res.data.totalVO.troughPowerProportion : 0) + "%"
+        periodList.value[4].data[2].value = !!res.data.totalVO.troughPowerCost ? res.data.totalVO.troughPowerCost : 0
         periodList.value[4].data[3].value =
-          (!!res.data.totalVO.troughPowerCostProportion
-            ? res.data.totalVO.troughPowerCostProportion
-            : 0) + "%";
+          (!!res.data.totalVO.troughPowerCostProportion ? res.data.totalVO.troughPowerCostProportion : 0) + "%"
       }
       // 鍦ㄥ垵濮嬪寲涔嬪墠锛屽厛dispose鏃х殑瀹炰緥
       if (echarts.getInstanceByDom(document.getElementById("Chart1"))) {
-        echarts.dispose(document.getElementById("Chart1"));
+        echarts.dispose(document.getElementById("Chart1"))
       }
       if (echarts.getInstanceByDom(document.getElementById("Chart2"))) {
-        echarts.dispose(document.getElementById("Chart2"));
+        echarts.dispose(document.getElementById("Chart2"))
       }
-      const myChart1 = echarts.init(document.getElementById("Chart1"));
-      const myChart2 = echarts.init(document.getElementById("Chart2"));
+      const myChart1 = echarts.init(document.getElementById("Chart1"))
+      const myChart2 = echarts.init(document.getElementById("Chart2"))
       if (!!res.data.powerConsumptionList) {
-        let xdata = [];
-        let ytip = [];
-        let ypeak = [];
-        let yflat = [];
-        let ytrough = [];
+        let xdata = []
+        let ytip = []
+        let ypeak = []
+        let yflat = []
+        let ytrough = []
         res.data.powerConsumptionList.map((item) => {
-          xdata.push(Number(item.xdata.slice(-2)) + "鏃�");
-          ytip.push(!!item.ytip ? item.ytip : 0);
-          ypeak.push(!!item.ypeak ? item.ypeak : 0);
-          yflat.push(!!item.yflat ? item.yflat : 0);
-          ytrough.push(!!item.ytrough ? item.ytrough : 0);
-        });
+          xdata.push(Number(item.xdata.slice(-2)) + "鏃�")
+          ytip.push(!!item.ytip ? item.ytip : 0)
+          ypeak.push(!!item.ypeak ? item.ypeak : 0)
+          yflat.push(!!item.yflat ? item.yflat : 0)
+          ytrough.push(!!item.ytrough ? item.ytrough : 0)
+        })
         myChart1.setOption({
           color: ["#f52528", "#ff6200", "#ffce0c", "#78e801"],
           tooltip: {
@@ -336,10 +284,7 @@
               type: "shadow",
               textStyle: {
                 fontSize: 14,
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
           },
@@ -356,8 +301,7 @@
             itemHeight: 10,
             // right: 0,
             textStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
             },
           },
           xAxis: {
@@ -365,10 +309,7 @@
             axisLine: {
               show: true,
               lineStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -381,8 +322,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [5, 0, 0, 0],
               //   formatter: '{value} ml'
@@ -393,8 +333,7 @@
             name: "鑰楃數閲�(KWH)",
             type: "value",
             nameTextStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [0, 0, 5, 0],
             },
@@ -405,10 +344,7 @@
               show: true,
               lineStyle: {
                 type: "dashed",
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -418,8 +354,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               //   formatter: '{value} ml'
             },
@@ -429,46 +364,46 @@
               name: "灏�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ytip,
             },
             {
               name: "宄�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ypeak,
             },
             {
               name: "骞�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: yflat,
             },
             {
               name: "璋�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ytrough,
             },
           ],
-        });
+        })
       }
       if (!!res.data.costList) {
-        let xdata = [];
-        let ytip = [];
-        let ypeak = [];
-        let yflat = [];
-        let ytrough = [];
+        let xdata = []
+        let ytip = []
+        let ypeak = []
+        let yflat = []
+        let ytrough = []
         res.data.costList.map((item) => {
-          xdata.push(Number(item.xdata.slice(-2)) + "鏃�");
-          ytip.push(!!item.ytip ? item.ytip : 0);
-          ypeak.push(!!item.ypeak ? item.ypeak : 0);
-          yflat.push(!!item.yflat ? item.yflat : 0);
-          ytrough.push(!!item.ytrough ? item.ytrough : 0);
-        });
+          xdata.push(Number(item.xdata.slice(-2)) + "鏃�")
+          ytip.push(!!item.ytip ? item.ytip : 0)
+          ypeak.push(!!item.ypeak ? item.ypeak : 0)
+          yflat.push(!!item.yflat ? item.yflat : 0)
+          ytrough.push(!!item.ytrough ? item.ytrough : 0)
+        })
         myChart2.setOption({
           color: ["#f52528", "#ff6200", "#ffce0c", "#78e801"],
           tooltip: {
@@ -477,10 +412,7 @@
               type: "shadow",
               textStyle: {
                 fontSize: 14,
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
           },
@@ -497,8 +429,7 @@
             itemHeight: 10,
             // right: 0,
             textStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
             },
           },
           xAxis: {
@@ -506,10 +437,7 @@
             axisLine: {
               show: true,
               lineStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -522,8 +450,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [5, 0, 0, 0],
               //   formatter: '{value} ml'
@@ -534,8 +461,7 @@
             name: "鐢佃垂(鍏�)",
             type: "value",
             nameTextStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [0, 0, 5, 0],
             },
@@ -546,10 +472,7 @@
               show: true,
               lineStyle: {
                 type: "dashed",
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -559,8 +482,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               //   formatter: '{value} ml'
             },
@@ -570,49 +492,53 @@
               name: "灏�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ytip,
             },
             {
               name: "宄�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ypeak,
             },
             {
               name: "骞�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: yflat,
             },
             {
               name: "璋�",
               type: "bar",
               stack: "total",
-              barWidth: "27",
+              barWidth: "12",
               data: ytrough,
             },
           ],
-        });
+        })
       }
-      window.addEventListener("resize", () => {
-        myChart1.resize();
-        myChart2.resize();
-      },{passive: true});
+      window.addEventListener(
+        "resize",
+        () => {
+          myChart1.resize()
+          myChart2.resize()
+        },
+        { passive: true }
+      )
     }
-  });
+  })
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋锋椂娈电粺璁�-鎼滅储
 function handleQuery() {
-  getList();
+  getList()
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋锋椂娈电粺璁�-閲嶇疆
 function resetQuery() {
-  proxy.resetForm("queryRef");
-  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM");
-  handleQuery();
+  proxy.resetForm("queryRef")
+  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM")
+  handleQuery()
 }
 </script>
 <style scoped lang="scss">
diff --git a/zhitan-vue/src/views/peakvalley/timeSharing/timeSharing.vue b/zhitan-vue/src/views/peakvalley/timeSharing/timeSharing.vue
index 7acba9e..091d88f 100644
--- a/zhitan-vue/src/views/peakvalley/timeSharing/timeSharing.vue
+++ b/zhitan-vue/src/views/peakvalley/timeSharing/timeSharing.vue
@@ -17,24 +17,16 @@
               />
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">
-                鎼滅储
-              </el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery"> 鎼滅储 </el-button>
               <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" icon="Download" @click="handleExport">
-                瀵煎嚭
-              </el-button>
+              <el-button type="primary" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
             </el-form-item>
           </el-form>
         </div>
         <div
-          style="
-            height: calc(100vh - 205px) !important;
-            max-height: calc(100vh - 205px) !important;
-            overflow-y: auto;
-          "
+          style="height: calc(100vh - 205px) !important; max-height: calc(100vh - 205px) !important; overflow-y: auto"
           v-loading="loading"
         >
           <el-row>
@@ -55,16 +47,8 @@
             <el-col :span="24">
               <BaseCard :title="queryParams.nodeName + '-宄板钩璋峰垎鏃剁粺璁�'">
                 <div class="table-box">
-                  <el-table
-                    :data="timeSharingList"
-                    style="width: 100%"
-                    show-summary
-                  >
-                    <el-table-column
-                      label="鏃堕棿"
-                      align="center"
-                      show-overflow-tooltip
-                    >
+                  <el-table :data="timeSharingList" style="width: 100%" show-summary>
+                    <el-table-column label="鏃堕棿" align="center" show-overflow-tooltip>
                       <template #default="scope">
                         {{ proxy.dayjs(scope.row.time).format("HH鏃�") }}
                       </template>
@@ -77,12 +61,7 @@
                         show-overflow-tooltip
                         width="120"
                       />
-                      <el-table-column
-                        prop="sharpFee"
-                        label="鐢佃垂(鍏�)"
-                        align="center"
-                        show-overflow-tooltip
-                      />
+                      <el-table-column prop="sharpFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip />
                     </el-table-column>
                     <el-table-column label="宄�" align="center">
                       <el-table-column
@@ -92,12 +71,7 @@
                         show-overflow-tooltip
                         width="120"
                       />
-                      <el-table-column
-                        prop="peakFee"
-                        label="鐢佃垂(鍏�)"
-                        align="center"
-                        show-overflow-tooltip
-                      />
+                      <el-table-column prop="peakFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip />
                     </el-table-column>
                     <el-table-column label="骞�" align="center">
                       <el-table-column
@@ -107,12 +81,7 @@
                         show-overflow-tooltip
                         width="120"
                       />
-                      <el-table-column
-                        prop="flatFee"
-                        label="鐢佃垂(鍏�)"
-                        align="center"
-                        show-overflow-tooltip
-                      />
+                      <el-table-column prop="flatFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip />
                     </el-table-column>
                     <el-table-column label="璋�" align="center">
                       <el-table-column
@@ -122,12 +91,7 @@
                         show-overflow-tooltip
                         width="120"
                       />
-                      <el-table-column
-                        prop="valleyFee"
-                        label="鐢佃垂(鍏�)"
-                        align="center"
-                        show-overflow-tooltip
-                      />
+                      <el-table-column prop="valleyFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip />
                     </el-table-column>
                     <el-table-column label="鍚堣" align="center">
                       <el-table-column
@@ -137,12 +101,7 @@
                         show-overflow-tooltip
                         width="120"
                       />
-                      <el-table-column
-                        prop="totalFee"
-                        label="鎬荤數璐�(鍏�)"
-                        align="center"
-                        show-overflow-tooltip
-                      />
+                      <el-table-column prop="totalFee" label="鎬荤數璐�(鍏�)" align="center" show-overflow-tooltip />
                     </el-table-column>
                     <!-- <el-table-column label="鎿嶄綔" align="center">
                     <template #default="scope">
@@ -159,84 +118,27 @@
         </div>
       </div>
     </div>
-    <el-dialog
-      v-model="timeSharingDialogTableVisible"
-      title="鏌ョ湅鍒嗘椂缁熻璇︽儏"
-      width="1300"
-    >
+    <el-dialog v-model="timeSharingDialogTableVisible" title="鏌ョ湅鍒嗘椂缁熻璇︽儏" width="1300">
       <div class="table-box">
         <el-table :data="viewTimeSharingList" style="width: 100%" height="420">
-          <el-table-column
-            label="鏃堕棿"
-            align="center"
-            show-overflow-tooltip
-            width="200"
-          >
+          <el-table-column label="鏃堕棿" align="center" show-overflow-tooltip width="200">
             <template #default="scope"> {{ scope.row.time }}鏃� </template>
           </el-table-column>
           <el-table-column label="灏�" align="center">
-            <el-table-column
-              prop="sharpPower"
-              label="鑰楃數閲�(kWh)"
-              align="center"
-              show-overflow-tooltip
-              width="120"
-            />
-            <el-table-column
-              prop="sharpFee"
-              label="鐢佃垂(鍏�)"
-              align="center"
-              show-overflow-tooltip
-              width="90"
-            />
+            <el-table-column prop="sharpPower" label="鑰楃數閲�(kWh)" align="center" show-overflow-tooltip width="120" />
+            <el-table-column prop="sharpFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip width="90" />
           </el-table-column>
           <el-table-column label="宄�" align="center">
-            <el-table-column
-              prop="peakPower"
-              label="鑰楃數閲�(kWh)"
-              align="center"
-              show-overflow-tooltip
-              width="120"
-            />
-            <el-table-column
-              prop="peakFee"
-              label="鐢佃垂(鍏�)"
-              align="center"
-              show-overflow-tooltip
-              width="90"
-            />
+            <el-table-column prop="peakPower" label="鑰楃數閲�(kWh)" align="center" show-overflow-tooltip width="120" />
+            <el-table-column prop="peakFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip width="90" />
           </el-table-column>
           <el-table-column label="骞�" align="center">
-            <el-table-column
-              prop="flatPower"
-              label="鑰楃數閲�(kWh)"
-              align="center"
-              show-overflow-tooltip
-              width="120"
-            />
-            <el-table-column
-              prop="flatFee"
-              label="鐢佃垂(鍏�)"
-              align="center"
-              show-overflow-tooltip
-              width="90"
-            />
+            <el-table-column prop="flatPower" label="鑰楃數閲�(kWh)" align="center" show-overflow-tooltip width="120" />
+            <el-table-column prop="flatFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip width="90" />
           </el-table-column>
           <el-table-column label="璋�" align="center">
-            <el-table-column
-              prop="valleyPower"
-              label="鑰楃數閲�(kWh)"
-              align="center"
-              show-overflow-tooltip
-              width="120"
-            />
-            <el-table-column
-              prop="valleyFee"
-              label="鐢佃垂(鍏�)"
-              align="center"
-              show-overflow-tooltip
-              width="90"
-            />
+            <el-table-column prop="valleyPower" label="鑰楃數閲�(kWh)" align="center" show-overflow-tooltip width="120" />
+            <el-table-column prop="valleyFee" label="鐢佃垂(鍏�)" align="center" show-overflow-tooltip width="90" />
           </el-table-column>
           <el-table-column label="鍚堣" align="center">
             <el-table-column
@@ -247,38 +149,16 @@
               width="120"
             >
               <template #default="scope">
-                {{
-                  scope.row.sharpPower +
-                  scope.row.peakPower +
-                  scope.row.flatPower +
-                  scope.row.valleyPower
-                }}
+                {{ scope.row.sharpPower + scope.row.peakPower + scope.row.flatPower + scope.row.valleyPower }}
               </template>
             </el-table-column>
-            <el-table-column
-              prop="totalCost"
-              label="鎬荤數璐�(鍏�)"
-              align="center"
-              show-overflow-tooltip
-              width="100"
-            >
+            <el-table-column prop="totalCost" label="鎬荤數璐�(鍏�)" align="center" show-overflow-tooltip width="100">
               <template #default="scope">
-                {{
-                  scope.row.sharpFee +
-                  scope.row.peakFee +
-                  scope.row.flatFee +
-                  scope.row.valleyFee
-                }}
+                {{ scope.row.sharpFee + scope.row.peakFee + scope.row.flatFee + scope.row.valleyFee }}
               </template>
             </el-table-column>
           </el-table-column>
-          <el-table-column
-            prop="nodeName"
-            label="鐢ㄨ兘鍗曞厓"
-            align="center"
-            show-overflow-tooltip
-            width="200"
-          />
+          <el-table-column prop="nodeName" label="鐢ㄨ兘鍗曞厓" align="center" show-overflow-tooltip width="200" />
         </el-table>
       </div>
     </el-dialog>
@@ -286,23 +166,23 @@
 </template>
 
 <script setup name="timeSharing">
-import { listTimeSharing } from "@/api/peakValley/timeSharing";
-import * as echarts from "echarts";
-const { proxy } = getCurrentInstance();
-import { useRoute } from "vue-router";
-import useSettingsStore from "@/store/modules/settings";
-const settingsStore = useSettingsStore();
+import { listTimeSharing } from "@/api/peakValley/timeSharing"
+import * as echarts from "echarts"
+const { proxy } = getCurrentInstance()
+import { useRoute } from "vue-router"
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
 watch(
   () => settingsStore.sideTheme,
   (val) => {
-    getList();
+    getList()
   }
-);
-const loading = ref(false);
-const timeSharingList = ref([]);
-const timeSharingDialogTableVisible = ref(false);
-const viewTimeSharingList = ref([]);
-const nodeOptions = ref(undefined);
+)
+const loading = ref(false)
+const timeSharingList = ref([])
+const timeSharingDialogTableVisible = ref(false)
+const viewTimeSharingList = ref([])
+const nodeOptions = ref(undefined)
 const data = reactive({
   queryParams: {
     nodeId: null,
@@ -311,52 +191,52 @@
     queryTime: null,
   },
   query: { ...useRoute().query },
-});
-const { queryParams, query } = toRefs(data);
+})
+const { queryParams, query } = toRefs(data)
 /** 閫氳繃鏉′欢杩囨护鑺傜偣  */
 const filterNode = (value, data) => {
-  if (!value) return true;
-  return data.label.indexOf(value) !== -1;
-};
+  if (!value) return true
+  return data.label.indexOf(value) !== -1
+}
 function handleNodeClick(data) {
-  queryParams.value.nodeId = data.id;
-  queryParams.value.nodeName = data.label;
-  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM-DD");
-  handleQuery();
+  queryParams.value.nodeId = data.id
+  queryParams.value.nodeName = data.label
+  queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")
+  handleQuery()
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋峰垎鏃剁粺璁�-鍒楄〃
 function getList() {
-  loading.value = true;
+  loading.value = true
   listTimeSharing(
     proxy.addDateRange({
       ...queryParams.value,
       ...query.value,
     })
   ).then((res) => {
-    loading.value = false;
+    loading.value = false
     if (!!res.code && res.code == 200) {
       // 鍦ㄥ垵濮嬪寲涔嬪墠锛屽厛dispose鏃х殑瀹炰緥
       if (echarts.getInstanceByDom(document.getElementById("Chart1"))) {
-        echarts.dispose(document.getElementById("Chart1"));
+        echarts.dispose(document.getElementById("Chart1"))
       }
       if (echarts.getInstanceByDom(document.getElementById("Chart2"))) {
-        echarts.dispose(document.getElementById("Chart2"));
+        echarts.dispose(document.getElementById("Chart2"))
       }
-      const myChart1 = echarts.init(document.getElementById("Chart1"));
-      const myChart2 = echarts.init(document.getElementById("Chart2"));
+      const myChart1 = echarts.init(document.getElementById("Chart1"))
+      const myChart2 = echarts.init(document.getElementById("Chart2"))
       if (!!res.data.lineChat) {
-        let xdata = [];
-        let ytip = [];
-        let ypeak = [];
-        let yflat = [];
-        let ytrough = [];
+        let xdata = []
+        let ytip = []
+        let ypeak = []
+        let yflat = []
+        let ytrough = []
         res.data.lineChat.map((item) => {
-          xdata.push(Number(item.xdata.slice(-8).substring(0, 2)) + "鏃�");
-          ytip.push(!!item.ytip ? item.ytip : 0);
-          ypeak.push(!!item.ypeak ? item.ypeak : 0);
-          yflat.push(!!item.yflat ? item.yflat : 0);
-          ytrough.push(!!item.ytrough ? item.ytrough : 0);
-        });
+          xdata.push(Number(item.xdata.slice(-8).substring(0, 2)) + "鏃�")
+          ytip.push(!!item.ytip ? item.ytip : 0)
+          ypeak.push(!!item.ypeak ? item.ypeak : 0)
+          yflat.push(!!item.yflat ? item.yflat : 0)
+          ytrough.push(!!item.ytrough ? item.ytrough : 0)
+        })
         myChart1.setOption({
           color: ["#f52528", "#ff6200", "#ffce0c", "#78e801"],
           grid: {
@@ -378,8 +258,7 @@
             itemHeight: 10,
             // right: 0,
             textStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
             },
             // data: ['灏�', '宄�', '骞�', '璋�']
           },
@@ -388,10 +267,7 @@
             axisLine: {
               show: true,
               lineStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -404,8 +280,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [5, 0, 0, 0],
               //   formatter: '{value} ml'
@@ -416,8 +291,7 @@
             name: "鑰楃數閲�(KWH)",
             type: "value",
             nameTextStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               padding: [0, 0, 5, 0],
             },
@@ -428,10 +302,7 @@
               show: true,
               lineStyle: {
                 type: "dashed",
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
             },
             axisTick: {
@@ -441,8 +312,7 @@
               show: false,
             },
             axisLabel: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               fontSize: 14,
               //   formatter: '{value} ml'
             },
@@ -451,33 +321,33 @@
             {
               name: "灏�", // ytip
               type: "bar",
-              barWidth: "27",
+              barWidth: "12",
               stack: "total",
               data: ytip,
             },
             {
               name: "宄�", // ypeak
               type: "bar",
-              barWidth: "27",
+              barWidth: "12",
               stack: "total",
               data: ypeak,
             },
             {
               name: "骞�", // yflat
               type: "bar",
-              barWidth: "27",
+              barWidth: "12",
               stack: "total",
               data: yflat,
             },
             {
               name: "璋�", // ytrough
               type: "bar",
-              barWidth: "27",
+              barWidth: "12",
               stack: "total",
               data: ytrough,
             },
           ],
-        });
+        })
       }
       if (!!res.data.pieChat) {
         myChart2.setOption({
@@ -492,8 +362,7 @@
             itemGap: 10,
             // right: 0,
             textStyle: {
-              color:
-                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
             },
           },
           series: [
@@ -505,70 +374,58 @@
               label: {
                 overflow: "none",
                 formatter: "{b} {c}%  ",
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
               },
               data: [
                 {
-                  value: !!res.data.pieChat.tip
-                    ? Number(res.data.pieChat.tip)
-                    : 0,
+                  value: !!res.data.pieChat.tip ? Number(res.data.pieChat.tip) : 0,
                   name: "灏�",
                 },
                 {
-                  value: !!res.data.pieChat.peak
-                    ? Number(res.data.pieChat.peak)
-                    : 0,
+                  value: !!res.data.pieChat.peak ? Number(res.data.pieChat.peak) : 0,
                   name: "宄�",
                 },
                 {
-                  value: !!res.data.pieChat.flat
-                    ? Number(res.data.pieChat.flat)
-                    : 0,
+                  value: !!res.data.pieChat.flat ? Number(res.data.pieChat.flat) : 0,
                   name: "骞�",
                 },
                 {
-                  value: !!res.data.pieChat.trough
-                    ? Number(res.data.pieChat.trough)
-                    : 0,
+                  value: !!res.data.pieChat.trough ? Number(res.data.pieChat.trough) : 0,
                   name: "璋�",
                 },
               ],
             },
           ],
-        });
+        })
       }
       if (!!res.data.dataList) {
-        timeSharingList.value = !!res.data.dataList ? res.data.dataList : [];
+        timeSharingList.value = !!res.data.dataList ? res.data.dataList : []
       }
       window.addEventListener(
         "resize",
         () => {
-          myChart1.resize();
-          myChart2.resize();
+          myChart1.resize()
+          myChart2.resize()
         },
         { passive: true }
-      );
+      )
     }
-  });
+  })
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋峰垎鏃剁粺璁�-鏌ョ湅
 function handleView(row) {
-  queryParams.value.key = row.timeStr;
-  timeSharingDialogTableVisible.value = true;
-  viewTimeSharingList.value = [row];
+  queryParams.value.key = row.timeStr
+  timeSharingDialogTableVisible.value = true
+  viewTimeSharingList.value = [row]
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋峰垎鏃剁粺璁�-鎼滅储
 function handleQuery() {
-  getList();
+  getList()
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋峰垎鏃剁粺璁�-閲嶇疆
 function resetQuery() {
-  proxy.resetForm("queryRef");
-  (queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")),
-    handleQuery();
+  proxy.resetForm("queryRef")
+  ;(queryParams.value.queryTime = proxy.dayjs(new Date()).format("YYYY-MM-DD")), handleQuery()
 }
 // 宄板钩璋疯兘鑰楀垎鏋�-宄板钩璋峰垎鏃剁粺璁�-瀵煎嚭
 function handleExport() {
@@ -579,7 +436,7 @@
       ...query.value,
     },
     `${queryParams.value.nodeName}_宄板钩璋峰垎鏃剁粺璁${new Date().getTime()}.xlsx`
-  );
+  )
 }
 </script>
 <style scoped lang="scss">
diff --git a/zhitan-vue/src/views/realtimemonitor/realtimemonitor/components/chart-modal.vue b/zhitan-vue/src/views/realtimemonitor/realtimemonitor/components/chart-modal.vue
index c1fde4f..1c4a4ab 100644
--- a/zhitan-vue/src/views/realtimemonitor/realtimemonitor/components/chart-modal.vue
+++ b/zhitan-vue/src/views/realtimemonitor/realtimemonitor/components/chart-modal.vue
@@ -4,19 +4,20 @@
       <div class="page">
         <el-form :model="queryParams" ref="queryRef" :inline="true" label-width="80px">
           <el-form-item label="鏃ユ湡绛涢��" prop="dataTime">
-            <el-date-picker v-model="queryParams.dataTime" value-format="YYYY-MM-DD 00:00:00" type="date"
-              placeholder="鏃ユ湡绛涢��" style="width: 100%" />
+            <el-date-picker
+              v-model="queryParams.dataTime"
+              value-format="YYYY-MM-DD 00:00:00"
+              type="date"
+              placeholder="鏃ユ湡绛涢��"
+              style="width: 100%"
+            />
           </el-form-item>
           <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleQuery">
-              鎼滅储
-            </el-button>
+            <el-button type="primary" icon="Search" @click="handleQuery"> 鎼滅储 </el-button>
             <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
           </el-form-item>
           <el-form-item>
-            <el-button type="primary" icon="Download" @click="handleExport">
-              瀵煎嚭
-            </el-button>
+            <el-button type="primary" icon="Download" @click="handleExport"> 瀵煎嚭 </el-button>
           </el-form-item>
         </el-form>
         <div class="chart-box" v-loading="loading">
@@ -28,173 +29,148 @@
 </template>
 
 <script setup name="chartModal">
-import * as echarts from "echarts";
-import { getEnergyRealTimeMonitor } from "@/api/realTimeMonitor/realTimeMonitor";
-const { proxy } = getCurrentInstance();
-import useSettingsStore from "@/store/modules/settings";
-const settingsStore = useSettingsStore();
-const dialogTableVisible = ref(false);
+import * as echarts from "echarts"
+import { getEnergyRealTimeMonitor } from "@/api/realTimeMonitor/realTimeMonitor"
+const { proxy } = getCurrentInstance()
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
+const dialogTableVisible = ref(false)
 const data = reactive({
   title: null,
   queryParams: {
     tagCode: null,
     dataTime: null,
   },
-});
-const { queryParams, title } = toRefs(data);
-const loading = ref(false);
-defineExpose({ handleOpen });
+})
+const { queryParams, title } = toRefs(data)
+const loading = ref(false)
+defineExpose({ handleOpen })
 function handleOpen(row) {
-  title.value = row.name;
-  dialogTableVisible.value = true;
-  queryParams.value.nodeName = row.nodeName;
-  queryParams.value.tagCode = row.indexCode;
-  queryParams.value.unit = row.unit;
-  queryParams.value.name = row.name;
-  queryParams.value.dataTime = proxy
-    .dayjs(new Date())
-    .format("YYYY-MM-DD 00:00:00");
-  getList();
+  title.value = row.name
+  dialogTableVisible.value = true
+  queryParams.value.nodeName = row.nodeName
+  queryParams.value.tagCode = row.indexCode
+  queryParams.value.unit = row.unit
+  queryParams.value.name = row.name
+  queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD 00:00:00")
+  getList()
 }
 function handleClose() {
-  dialogTableVisible.value = false;
+  dialogTableVisible.value = false
 }
 // 鑳芥簮瀹炴椂鐩戞帶-鑳芥簮瀹炴椂鐩戞帶-鍒楄〃
 function getList() {
-  loading.value = true;
-  getEnergyRealTimeMonitor(proxy.addDateRange(queryParams.value)).then(
-    (res) => {
-      const myChart1 = echarts.init(document.getElementById("Chart1"));
-      if (!!res.code && res.code == 200) {
-        if (!!res.data) {
-          let xdata = [];
-          let ydata = [];
-          res.data.map((item) => {
-            xdata.push(proxy.dayjs(item.name).format("HH:mm"));
-            ydata.push(!!item.value ? item.value : 0);
-          });
-          loading.value = false;
-          myChart1.setOption({
-            color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
-            grid: {
-              top: "45",
-              left: "6%",
-              right: "5%",
-              bottom: "10",
-              containLabel: true,
-            },
-            tooltip: {
-              trigger: "axis",
-              axisPointer: {
-                type: "shadow",
-              },
-            },
-            xAxis: {
-              type: "category",
-              axisLine: {
-                show: true,
-                lineStyle: {
-                  color:
-                    settingsStore.sideTheme == "theme-dark"
-                      ? "#FFFFFF"
-                      : "#222222",
-                },
-              },
-              axisTick: {
-                show: false,
-              },
-              splitArea: {
-                show: false,
-              },
-              splitLine: {
-                show: false,
-              },
-              axisLabel: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
-                fontSize: 14,
-                padding: [5, 0, 0, 0],
-                //   formatter: '{value} ml'
-              },
-              data: xdata,
-            },
-            yAxis: {
-              type: "value",
-              name:
-                queryParams.value.name +
-                (!!queryParams.value.unit
-                  ? "(" + queryParams.value.unit + ")"
-                  : ""),
-              nameTextStyle: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
-                fontSize: 14,
-                padding: [0, 0, 5, 0],
-              },
-              axisLine: {
-                show: false,
-              },
-              splitLine: {
-                show: true,
-                lineStyle: {
-                  type: "dashed",
-                  color:
-                    settingsStore.sideTheme == "theme-dark"
-                      ? "#FFFFFF"
-                      : "#222222",
-                },
-              },
-              axisTick: {
-                show: false,
-              },
-              splitArea: {
-                show: false,
-              },
-              axisLabel: {
-                color:
-                  settingsStore.sideTheme == "theme-dark"
-                    ? "#FFFFFF"
-                    : "#222222",
-                fontSize: 14,
-              },
-            },
-            series: [
-              {
-                name: title.value + "鍘嗗彶鏁版嵁鏌ヨ", // ytip
-                type: "line",
-                barWidth: "27",
-                stack: "total",
-                data: ydata,
-              },
-            ],
-          });
-        }
-        window.addEventListener(
-          "resize",
-          () => {
-            myChart1.resize();
+  loading.value = true
+  getEnergyRealTimeMonitor(proxy.addDateRange(queryParams.value)).then((res) => {
+    const myChart1 = echarts.init(document.getElementById("Chart1"))
+    if (!!res.code && res.code == 200) {
+      if (!!res.data) {
+        let xdata = []
+        let ydata = []
+        res.data.map((item) => {
+          xdata.push(proxy.dayjs(item.name).format("HH:mm"))
+          ydata.push(!!item.value ? item.value : 0)
+        })
+        loading.value = false
+        myChart1.setOption({
+          color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+          grid: {
+            top: "45",
+            left: "6%",
+            right: "5%",
+            bottom: "10",
+            containLabel: true,
           },
-          { passive: true }
-        );
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              type: "shadow",
+            },
+          },
+          xAxis: {
+            type: "category",
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            splitArea: {
+              show: false,
+            },
+            splitLine: {
+              show: false,
+            },
+            axisLabel: {
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              fontSize: 14,
+              padding: [5, 0, 0, 0],
+              //   formatter: '{value} ml'
+            },
+            data: xdata,
+          },
+          yAxis: {
+            type: "value",
+            name: queryParams.value.name + (!!queryParams.value.unit ? "(" + queryParams.value.unit + ")" : ""),
+            nameTextStyle: {
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              fontSize: 14,
+              padding: [0, 0, 5, 0],
+            },
+            axisLine: {
+              show: false,
+            },
+            splitLine: {
+              show: true,
+              lineStyle: {
+                type: "dashed",
+                color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            splitArea: {
+              show: false,
+            },
+            axisLabel: {
+              color: settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              fontSize: 14,
+            },
+          },
+          series: [
+            {
+              name: title.value + "鍘嗗彶鏁版嵁鏌ヨ", // ytip
+              type: "line",
+              barWidth: "12",
+              stack: "total",
+              data: ydata,
+            },
+          ],
+        })
       }
+      window.addEventListener(
+        "resize",
+        () => {
+          myChart1.resize()
+        },
+        { passive: true }
+      )
     }
-  );
+  })
 }
 // 鑳芥簮瀹炴椂鐩戞帶-鑳芥簮瀹炴椂鐩戞帶-鎼滅储
 function handleQuery() {
-  getList();
+  getList()
 }
 // 鑳芥簮瀹炴椂鐩戞帶-鑳芥簮瀹炴椂鐩戞帶-閲嶇疆
 function resetQuery() {
-  proxy.resetForm("queryRef");
-  (queryParams.value.dataTime = proxy
-    .dayjs(new Date())
-    .format("YYYY-MM-DD 00:00:00")),
-    handleNodeClick(nodeOptions.value[0]);
+  proxy.resetForm("queryRef")
+  ;(queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD 00:00:00")),
+    handleNodeClick(nodeOptions.value[0])
 }
 // 鑳芥簮瀹炴椂鐩戞帶-鑳芥簮瀹炴椂鐩戞帶-瀵煎嚭
 function handleExport() {
@@ -202,7 +178,7 @@
     "rtdb/realtimeTrend/export",
     queryParams.value,
     `${queryParams.value.nodeName}-${queryParams.value.name}_鑳芥簮瀹炴椂鐩戞帶_${new Date().getTime()}.xlsx`
-  );
+  )
 }
 </script>
 <style scoped lang="scss">
diff --git a/zhitan-vue/src/views/svg/components/configure.vue b/zhitan-vue/src/views/svg/components/configure.vue
new file mode 100644
index 0000000..3b4820b
--- /dev/null
+++ b/zhitan-vue/src/views/svg/components/configure.vue
@@ -0,0 +1,204 @@
+<template>
+  <div>
+    <div slot="header" class="clearfix">
+      <el-button
+        style="float: right; padding: 8px; margin-left: 8px"
+        type="text"
+        icon="el-icon-setting"
+        @click="saveSetting"
+      >
+        淇濆瓨閰嶇疆
+      </el-button>
+      <el-button
+        style="float: right; padding: 8px; margin-left: 8px"
+        type="text"
+        icon="el-icon-setting"
+        @click="reset()"
+      >
+        閲嶆柊閫夋嫨搴曞浘
+      </el-button>
+    </div>
+    <el-row>
+      <el-col :span="18">
+        <!-- v-if="filePath === '绌鸿妭鐐�'" -->
+        <div style="text-align: center; margin-left: 12px" v-if="filePath === '绌鸿妭鐐�'">
+          <FileUpload
+            :modelValue="fileList"
+            @update:modelValue="fileUploadChange"
+            :isShowTip="false"
+            :limit="1"
+            :fileSize="20"
+            :fileType="[]"
+            :draggable="true"
+          />
+        </div>
+
+        <div id="svgHtml" v-if="filePath !== '绌鸿妭鐐�'">
+          <div v-html="svgHtml" />
+        </div>
+      </el-col>
+      <el-col :span="6" style="height: calc(100vh - 165px); overflow: auto">
+        <el-table :data="tags" border>
+          <el-table-column label="鍙傛暟" align="center" prop="param" />
+          <el-table-column label="閲囬泦鐐�" align="center" prop="tag">
+            <template #default="scope">
+              <el-autocomplete
+                popper-class="my-autocomplete"
+                v-model="scope.row['tag']"
+                :fetch-suggestions="querySearch"
+                placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"
+                placement="bottom-end"
+              >
+                <template #default="{ item }">
+                  <div class="">{{ item.value }}</div>
+                  <span class="" style="color: #409eff; display: block">{{ item.name }}</span>
+                </template>
+              </el-autocomplete>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import { getAllCollectTag, getConfigure, saveSettingApi, updateEquipmentfile } from "@/api/svg/equipmentfile"
+const { proxy } = getCurrentInstance()
+let props = defineProps(["types"])
+const emit = defineEmits(["getList"])
+const currentNode = ref({})
+const filePath = ref("绌鸿妭鐐�")
+const svgHtml = ref("")
+const form = ref({
+  nodeId: "",
+  fileName: "",
+  svgType: "",
+})
+const tags = ref([])
+const fileList = ref([])
+
+function changeModelNode(modelNode) {
+  currentNode.value = modelNode
+  filePath.value = "绌鸿妭鐐�"
+  getConfigure(modelNode.id).then((response) => {
+    tags.value = []
+    svgHtml.value = ""
+    if (response.code === 200) {
+      if (response.data) {
+        filePath.value = response.data.filePath
+        tags.value = response.data.infoList
+        getSvg()
+      }
+    } else {
+      proxy.$modal.msgError(response.msg)
+    }
+  })
+}
+// 鍒濆鍖杝vg
+function getSvg() {
+  /* 鍒涘缓xhr瀵硅薄 */
+  const xhr = new XMLHttpRequest()
+  xhr.open("GET", filePath.value, true)
+  xhr.send()
+  /* 鐩戝惉xhr瀵硅薄 */
+  xhr.addEventListener("load", () => {
+    svgHtml.value = xhr.responseText
+    let values = xhr.responseXML.getElementsByTagName("text")
+    let tagTemps = []
+    for (let i = 0; i < values.length; i++) {
+      if (values[i].getAttribute("id") != undefined)
+        tagTemps.push({
+          param: values[i].textContent,
+          tag: "",
+          tagType: "COLLECT",
+        })
+    }
+    console.log(tags.value.length, tagTemps.length)
+    if (tags.value.length === 0 || tags.value.length != tagTemps.length) {
+      tags.value = []
+      tags.value = tagTemps
+      console.log("222", tags.value.length, tagTemps.length)
+    }
+  })
+}
+//涓婁紶鎴愬姛鍚�
+function fileUploadChange(val) {
+  if (val.length) {
+    // this.$refs.upload.clearFiles()
+    form.value.nodeId = currentNode.value.id
+    form.value.filePath = val[0].fullUrl
+    form.value.svgType = "COLLECT"
+    updateEquipmentfile(form.value).then((result) => {
+      if (result.code === 200) {
+        filePath.value = val[0].fullUrl
+        tags.value = []
+        getSvg()
+      } else {
+        proxy.$modal.msgError(result.msg)
+      }
+    })
+  } else {
+    proxy.$modal.msgError(result.msg)
+  }
+}
+
+function querySearch(queryString, cb) {
+  if (queryString) {
+    getAllCollectTag({
+      codeOrName: queryString,
+      indexType: "COLLECT",
+    }).then((response) => {
+      // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹�
+      let result = response.data
+      let values = []
+      result.forEach((item) => {
+        values.push({
+          value: item.code,
+          name: item.name,
+        })
+      })
+      cb(values)
+    })
+  }
+}
+function saveSetting() {
+  saveSettingApi(currentNode.value.id, tags.value).then((response) => {
+    if (response.code === 200) {
+      proxy.$modal.msgSuccess(response.msg)
+    } else {
+      proxy.$modal.msgError(response.msg)
+    }
+  })
+}
+function reset() {
+  filePath.value = "绌鸿妭鐐�"
+}
+
+defineExpose({ changeModelNode })
+</script>
+
+<style lang="scss" scoped>
+.el-autocomplete {
+  width: 100%;
+}
+
+.my-autocomplete li {
+  line-height: normal;
+  padding: 7px;
+}
+
+.my-autocomplete li .name {
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+
+.my-autocomplete li .addr {
+  font-size: 12px;
+  color: #b4b4b4;
+}
+
+.my-autocomplete li .highlighted .addr {
+  color: #ddd;
+}
+</style>
diff --git a/zhitan-vue/src/views/svg/components/configureView.vue b/zhitan-vue/src/views/svg/components/configureView.vue
new file mode 100644
index 0000000..46eed3f
--- /dev/null
+++ b/zhitan-vue/src/views/svg/components/configureView.vue
@@ -0,0 +1,124 @@
+<template>
+  <div>
+    <div v-if="filePath" v-html="svgHtml" />
+    <div v-else>鏆傛湭涓婁紶</div>
+  </div>
+</template>
+
+<script setup>
+import { getConfigure, getLiveData } from "@/api/svg/equipmentfile"
+import { onMounted } from "vue"
+const { proxy } = getCurrentInstance()
+let props = defineProps(["nodeId"])
+const emit = defineEmits(["getList"])
+const currentNode = ref({})
+const filePath = ref("")
+const svgHtml = ref("")
+const form = ref({
+  nodeId: "",
+  fileName: "",
+  svgType: "",
+})
+const tags = ref([])
+const tagCodes = ref([])
+const valueItems = ref(null)
+const timer = ref(null)
+
+function show(nodeId) {
+  console.log(nodeId)
+  tagCodes.value = []
+  filePath.value = ""
+  getConfigure(nodeId).then((response) => {
+    tags.value = []
+    svgHtml.value = ""
+    if (response.code === 200) {
+      if (response.data) {
+        filePath.value = response.data.filePath
+        tags.value = response.data.infoList
+        getSvg()
+        refresh()
+      }
+    } else {
+      proxy.$modal.msgError(response.msg)
+    }
+  })
+}
+
+function refresh() {
+  if (tagCodes.value.length === 0) {
+    return
+  }
+  getLiveData(tagCodes.value).then((response) => {
+    if (response.code === 200) {
+      if (response.data) {
+        response.data.forEach((tagValue) => {
+          let value = ""
+          if (tagValue.value) {
+            value = parseFloat(tagValue.value).toFixed(2)
+          } else {
+            value = "0"
+          }
+
+          let el = document.getElementById(tagValue.tagCode)
+          if (el) {
+            el.textContent = value
+          }
+        })
+        //杩欏潡鏄崟鐙姞鐨� 鐢ㄦ潵澶勭悊 娌℃湁鎸囨爣鎴栬�呮寚鏍囨病鏈夌粨鏋滅殑 閮借缃�0
+        let allText = document.getElementsByTagName("text")
+        for (let i = 0; i < allText.length; i++) {
+          // console.log(i + "textContent=" + allText[i].textContent);
+          if (allText[i].textContent == null || allText[i].textContent == "") {
+            allText[i].textContent = "0"
+          }
+        }
+      }
+    }
+  })
+}
+
+function refreshData() {
+  timer.value = setInterval(() => {
+    refresh()
+  }, 3000)
+}
+
+onMounted(() => {
+  refreshData()
+})
+
+onBeforeUnmount(() => {
+  clearInterval(timer.value)
+})
+
+// 鍒濆鍖杝vg
+function getSvg() {
+  /* 鍒涘缓xhr瀵硅薄 */
+  const xhr = new XMLHttpRequest()
+  xhr.open("GET", filePath.value, true)
+  xhr.send()
+  /* 鐩戝惉xhr瀵硅薄 */
+  xhr.addEventListener("load", () => {
+    const resXML = xhr.responseXML
+    let svgDom = resXML.documentElement.cloneNode(true)
+    let values = svgDom.getElementsByTagName("text")
+    for (let i = 0; i < values.length; i++) {
+      let tag = tags.value.filter((f) => f.param === values[i].textContent)
+      if (tag && tag.length > 0) {
+        let tagCode = tag[0].tag
+        values[i].textContent = ""
+        if (tagCode) {
+          values[i].setAttribute("id", tagCode)
+          tagCodes.value.push(tagCode)
+        }
+      }
+    }
+    let oSerializer = new XMLSerializer()
+    svgHtml.value = oSerializer.serializeToString(svgDom)
+  })
+}
+
+defineExpose({ show })
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/zhitan-vue/src/views/svg/equipmentfile/chartView.vue b/zhitan-vue/src/views/svg/equipmentfile/chartView.vue
new file mode 100644
index 0000000..44c9b44
--- /dev/null
+++ b/zhitan-vue/src/views/svg/equipmentfile/chartView.vue
@@ -0,0 +1,314 @@
+<template>
+  <div class="page">
+    <div class="page-container">
+      <div class="page-container-left">
+        <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" />
+      </div>
+      <div class="page-container-right">
+        <BaseCard :title="queryParams.nodeName">
+          <ConfigureChartView ref="ConfigureChartViewRef" />
+        </BaseCard>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup name="energy-real-time-monitor">
+import ConfigureChartView from "../components/configureView.vue"
+import { listEnergyRealTimeMonitor } from "@/api/realTimeMonitor/realTimeMonitor"
+import { getConfigure } from "@/api/svg/equipmentfile"
+const { proxy } = getCurrentInstance()
+import { useRoute } from "vue-router"
+import useSettingsStore from "@/store/modules/settings"
+const settingsStore = useSettingsStore()
+watch(
+  () => settingsStore.sideTheme,
+  (val) => {
+    // getList()
+  }
+)
+const loading = ref(false)
+const data = reactive({
+  queryParams: {
+    nodeId: null,
+    nodeName: null,
+    energyType: null,
+  },
+  query: { ...useRoute().query },
+})
+const { queryParams, query } = toRefs(data)
+const ConfigureChartViewRef = ref()
+/** 鑺傜偣鍗曞嚮浜嬩欢 */
+function handleNodeClick(data) {
+  queryParams.value.nodeId = data.id
+  queryParams.value.nodeName = data.label
+  if (!data.id) {
+    return
+  }
+  getConfigure(data.id).then((response) => {
+    if (response.code === 200) {
+      let tagCodes = []
+      if (response.data) {
+        response.data.infoList.forEach((tag) => {
+          tagCodes.push(tag.tag)
+        })
+      } else {
+        tagCodes = []
+      }
+      ConfigureChartViewRef.value.show(data.id)
+    } else {
+      proxy.$modal.msgError(response.msg)
+    }
+  })
+}
+</script>
+<style scoped lang="scss">
+@import "@/assets/styles/page.scss";
+
+.themeDark {
+  .card-box {
+    margin: 0 18px;
+    padding: 10px 18px;
+    box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12);
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid #22408c;
+    margin-bottom: 20px;
+
+    &-title {
+      // margin: 10px 0 10px;
+      color: rgba(255, 255, 255, 0.8);
+      text-align: left;
+      font-weight: bold;
+      font-family: OPPOSans, OPPOSans;
+      font-weight: 500;
+      font-size: 16px;
+      font-style: normal;
+      text-transform: none;
+    }
+
+    &-ul {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &-li {
+      width: 18%;
+      margin: 1%;
+      border-radius: 5px;
+      border: 1px solid #22408c;
+      margin-bottom: 5px;
+      background: #1a235d;
+      box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12);
+      border-radius: 8px 8px 8px 8px;
+      padding: 0 10px;
+
+      .title {
+        font-size: 14px;
+        color: rgba(255, 255, 255, 0.8);
+        font-family: OPPOSans, OPPOSans;
+        font-weight: 500;
+        font-size: 16px;
+        line-height: 19px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+
+      .num {
+        font-size: 22px;
+        color: #36d3ff;
+        font-family: OPPOSans, OPPOSans;
+        font-weight: 800;
+        font-size: 32px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+
+      .time {
+        color: rgba(255, 253, 253, 0.7);
+        font-family: Poppins, Poppins;
+        font-weight: 400;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+    }
+
+    dd {
+      padding: 0;
+      margin-left: 5px;
+      margin-bottom: 10px;
+    }
+  }
+
+  .hamburger {
+    display: inline-block;
+    vertical-align: middle;
+    width: 20px;
+    height: 20px;
+  }
+
+  .hamburger.is-active {
+    transform: rotate(180deg);
+  }
+
+  .item-box {
+    display: flex;
+    justify-items: center;
+    align-items: center;
+    flex-wrap: wrap;
+    margin: 10px 18px;
+
+    .item-tag {
+      // width: 13%;
+      text-align: center;
+      margin: 5px 8px;
+      border-radius: 8px;
+      padding: 7px 10px;
+      font-family: OPPOSans, OPPOSans;
+      font-weight: 500;
+      font-size: 16px;
+      color: #ffffff;
+    }
+  }
+}
+
+.themeLight {
+  .card-box {
+    margin: 0 18px;
+    padding: 10px 18px;
+    box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12);
+    border-radius: 8px 8px 8px 8px;
+    margin-bottom: 20px;
+
+    &-title {
+      // margin: 10px 0 10px;
+      text-align: left;
+      font-weight: bold;
+      font-family: OPPOSans, OPPOSans;
+      font-weight: 500;
+      font-size: 16px;
+      font-style: normal;
+      text-transform: none;
+    }
+
+    &-ul {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &-li {
+      width: 240px;
+      margin-right: 10px;
+      margin-top: 16px;
+      border-radius: 5px;
+      border: 1px solid #ebebeb;
+      margin-bottom: 5px;
+      background: #fff;
+      // box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12);
+      border-radius: 8px 8px 8px 8px;
+      padding: 0 10px;
+
+      .title {
+        font-size: 14px;
+        color: #676767;
+        font-family: OPPOSans, OPPOSans;
+        font-weight: 500;
+        font-size: 16px;
+        line-height: 19px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+
+      .num {
+        font-size: 22px;
+        color: #3271eb;
+        font-family: OPPOSans, OPPOSans;
+        font-weight: 800;
+        font-size: 32px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+
+      .time {
+        color: #676767;
+        font-family: Poppins, Poppins;
+        font-weight: 400;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+      }
+    }
+
+    dd {
+      padding: 0;
+      margin-left: 5px;
+      margin-bottom: 10px;
+    }
+  }
+
+  .hamburger {
+    display: inline-block;
+    vertical-align: middle;
+    width: 20px;
+    height: 20px;
+  }
+
+  .hamburger.is-active {
+    transform: rotate(180deg);
+  }
+
+  .item-box {
+    display: flex;
+    justify-items: center;
+    align-items: center;
+    flex-wrap: wrap;
+    margin: 10px 18px;
+
+    .item-tag {
+      // width: 13%;
+      text-align: center;
+      margin: 5px 8px;
+      border-radius: 8px;
+      padding: 7px 3px;
+      font-family: OPPOSans, OPPOSans;
+      font-weight: 500;
+      font-size: 16px;
+      color: #ffffff;
+    }
+  }
+}
+
+.scrollbar-flex-content {
+  display: flex;
+  margin: 10px 18px;
+}
+.scrollbar-demo-item {
+  flex-shrink: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  // width: 100px;
+  // height: 50px;
+  // margin: 10px;
+  text-align: center;
+  border-radius: 4px;
+  background: var(--el-color-danger-light-9);
+  color: var(--el-color-danger);
+}
+
+.item-tag {
+  // width: 13%;
+  text-align: center;
+  margin: 5px 8px;
+  border-radius: 8px;
+  padding: 7px 10px;
+  font-family: OPPOSans, OPPOSans;
+  font-weight: 500;
+  font-size: 16px;
+  color: #ffffff;
+  cursor: pointer;
+}
+</style>
diff --git a/zhitan-vue/src/views/svg/equipmentfile/index.vue b/zhitan-vue/src/views/svg/equipmentfile/index.vue
new file mode 100644
index 0000000..b689a8d
--- /dev/null
+++ b/zhitan-vue/src/views/svg/equipmentfile/index.vue
@@ -0,0 +1,243 @@
+<template>
+  <div class="page">
+    <div class="page-container">
+      <div class="page-container-left">
+        <div class="tree page-box">
+          <div class="select-box mb20">
+            鏁版嵁妯″瀷锛�
+            <el-select
+              style="width: 180px"
+              v-model="modelData"
+              placeholder="璇烽�夋嫨妯″瀷"
+              filterable
+              @change="changeModel"
+            >
+              <el-option
+                v-for="model in modelInfoOptions"
+                :key="model.modelCode"
+                :label="model.modelName"
+                :value="model.modelCode"
+              />
+            </el-select>
+          </div>
+          <div class="tree-box" v-loading="treeLoading">
+            <el-tree
+              ref="treeRef"
+              :props="defaultProps"
+              :data="treeData"
+              node-key="id"
+              highlight-current
+              :filter-node-method="filterNode"
+              :default-expanded-keys="treeExpandData"
+              :expand-on-click-node="false"
+              @node-click="changeNode"
+              accordion
+            >
+              <template #default="{ node, data }">
+                <span>
+                  <el-tooltip
+                    v-if="node.label.length > 16"
+                    class="item"
+                    effect="dark"
+                    :content="node.label"
+                    placement="top-end"
+                  >
+                    <span>{{ node.label.slice(0, 16) + "..." }}</span>
+                  </el-tooltip>
+                  <span v-else id="b">{{ node.label }}</span>
+                </span>
+              </template>
+            </el-tree>
+          </div>
+        </div>
+      </div>
+      <div class="page-container-right">
+        <BaseCard :title="currentNode ? currentNode.label + '--鑺傜偣閰嶇疆' : '鏆傛棤鑺傜偣閰嶇疆'">
+          <div class="content-box">
+            <ConfigureView ref="configureViewRef" />
+          </div>
+        </BaseCard>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { listModel } from "@/api/modelConfiguration/businessModel"
+import { treeList } from "@/api/modelConfiguration/indexWarehouse"
+import ConfigureView from "../components/configure.vue"
+import { nextTick } from "vue"
+import { useRoute } from "vue-router"
+let { proxy } = getCurrentInstance()
+let treeLoading = ref(true)
+let modelData = ref(null)
+let modelInfoOptions = ref([]) //涓嬫媺鍒楄〃
+const configureViewRef = ref()
+//鑾峰彇涓嬫媺鍒楄〃
+function searchList(flag) {
+  listModel({ isShow: 1 }).then((response) => {
+    modelInfoOptions.value = response.data
+    if (flag) {
+      if (modelInfoOptions.value.length > 0) {
+        if (proxy.$route.query.modelCode) {
+          modelData.value = proxy.$route.query.modelCode
+        } else {
+          modelData.value = modelInfoOptions.value[0].modelCode
+        }
+        getTreeList(modelData.value)
+      }
+    }
+  })
+}
+
+searchList(true)
+
+//涓嬫媺閫変腑瑙﹀彂鏍戝垪琛�
+function changeModel(item) {
+  // console.log('changeModel', item)
+  getTreeList(item)
+}
+
+let treeRef = ref(null)
+let treeData = ref([])
+
+const defaultProps = ref({
+  children: "children",
+  label: "label",
+})
+
+//妫�绱㈡爲
+let filterText = ref("")
+
+const filterNode = (value, data) => {
+  if (!value) return true
+  return data.label.includes(value)
+}
+watch(filterText, (val) => {
+  // 妫�鏌reeRef.value鏄惁鏄竴涓湁鏁堢殑ElTree瀹炰緥
+  if (treeRef.value && typeof treeRef.value.filter === "function") {
+    // 璋冪敤filter鏂规硶
+    treeRef.value.filter(val)
+  } else {
+    // treeRef.value鏃犳晥锛屽鐞嗛敊璇�
+    console.error("error")
+  }
+})
+
+let currentNode = ref(null)
+let treeExpandData = ref([])
+let isFirstLeafNode = ref(false)
+let deviceConfigRef = ref(null)
+let collectIndicatorsRef = ref(null)
+let statisticalIndicatorsRef = ref(null)
+
+//鑾峰彇鏍戝垪琛�
+function getTreeList(modelCode) {
+  treeLoading.value = true
+  treeList({ modelCode }).then((res) => {
+    treeLoading.value = false
+    let { data } = res
+    treeData.value = data
+    let chooseNode = null
+    if (data.length > 0) {
+      if (data[0].children && data[0].children.length !== 0 && isFirstLeafNode.value) {
+        if (data[0].children[0].children && data[0].children[0].children.length !== 0) {
+          chooseNode = data[0].children[0].children[0]
+        } else {
+          chooseNode = data[0].children[0]
+        }
+      } else {
+        chooseNode = data[0]
+      }
+      currentNode.value = chooseNode
+      changeNode(currentNode.value)
+      treeExpandData.value.push(chooseNode.id)
+      nextTick(() => {
+        treeRef.value.setCurrentKey(chooseNode.id)
+      })
+    }
+  })
+}
+//鏍戠偣鍑�
+function changeNode(data, node, ev) {
+  console.log("鏍戠偣鍑�", data)
+  currentNode.value = data
+  configureViewRef.value.changeModelNode(data)
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/page.scss";
+
+.page-box {
+  height: calc(100vh - 145px);
+  padding-top: 12px;
+
+  .tree-box {
+    height: calc(100% - 70px);
+    overflow-y: auto !important;
+  }
+
+  .select-box {
+    display: flex;
+    align-items: center;
+    color: #3371eb;
+    margin-left: 10px;
+
+    :deep .el-icon {
+      color: #fff;
+      margin: 0 10px 0 15px;
+      font-size: 14px;
+    }
+  }
+
+  .node-opt {
+    flex: 1;
+    text-align: right;
+    margin-right: 5px;
+
+    :deep .el-icon {
+      color: #fff;
+      margin-right: 5px;
+    }
+  }
+}
+
+:deep .el-tabs__nav-wrap:after {
+  background: transparent;
+}
+
+:deep .el-tabs__item {
+  color: #fff;
+  font-size: 20px;
+  padding: 0 20px;
+
+  &.is-active,
+  &:hover {
+    color: #999 !important;
+  }
+}
+
+.tab-box {
+  display: flex;
+  align-items: center;
+  color: #fff;
+  border-bottom: 1px solid #3371eb;
+  margin-right: 20px;
+
+  .tab-li {
+    cursor: pointer;
+    border: 1px solid #3371eb;
+    padding: 10px 25px;
+    border-radius: 5px 5px 0 0;
+  }
+
+  .is-tab {
+    background: #3371eb;
+  }
+}
+
+.content-box {
+  height: calc(100vh - 206px) !important;
+}
+</style>

--
Gitblit v1.9.3