From ee8bb47024e9ef5a585a5f4d61d1ab236c9d4341 Mon Sep 17 00:00:00 2001
From: cjl <909710561@qq.com>
Date: Tue, 23 Apr 2024 15:05:33 +0800
Subject: [PATCH] fix:因子相关性比较均值

---
 screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java    |  181 +++++++++++++++++++++++--
 screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml                      |   15 ++
 screen-api/src/main/java/com/moral/api/service/DataDisplayService.java             |    1 
 screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java      |   19 ++
 screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java            |    7 
 screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java  |   23 +++
 screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java         |    9 +
 screen-api/src/main/java/com/moral/api/pojo/vo/historyMonthly/HistoryResultVo.java |   43 ++++++
 screen-api/src/main/java/com/moral/api/service/DeviceService.java                  |    4 
 screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java            |   11 +
 screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java   |    5 
 screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java             |    3 
 screen-api/src/main/resources/mapper/HistoryDailyMapper.xml                        |   13 +
 screen-api/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java              |    4 
 screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java           |   10 +
 screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/MonitorPointsVO.java   |    8 +
 screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java       |    2 
 screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml                       |   13 +
 18 files changed, 346 insertions(+), 25 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java b/screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java
index 91ccf70..c4b0894 100644
--- a/screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java
@@ -60,7 +60,7 @@
         if (!params.containsKey("mac") || !params.containsKey("sensorCodes") || !params.containsKey("reportType") || !params.containsKey("times")) {
             return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
         }
-        List<SensorComparisonDisplayDTO> dtos = dataDisplayService.getSensorComparisonDisplayDataV2(params);
+        List<SensorComparisonDisplayDTO> dtos = dataDisplayService.getSensorComparisonDisplayDataV3(params);
         return  new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),dtos);
     }
 
diff --git a/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java b/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
index 7db2d85..895e4ef 100644
--- a/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
@@ -58,7 +58,7 @@
         List<MonitorPoint> monitorPoints = monitorPointService.queryByOrgIdAndRegionCode(form);
 
         //������������������
-        MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints,false);
+        MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints,false,false);
 
         return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo);
     }
@@ -73,7 +73,22 @@
         List<MonitorPoint> monitorPoints = monitorPointService.queryByOrgIdAndRegionCode(form);
 
         //������������������
-        MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints,true);
+        MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints,true,false);
+
+        return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo);
+    }
+
+    @GetMapping("queryMonitorPointsAvg")
+    public ResultMessage queryMonitorPointsAvg(MonitorPointQueryForm form) {
+        //������������������������
+        if (!form.valid())
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
+                    ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        //������������������
+        List<MonitorPoint> monitorPoints = monitorPointService.queryByOrgIdAndRegionCode(form);
+
+        //������������������
+        MonitorPointsVO vo = MonitorPointsVO.convert(monitorPoints,false,true);
 
         return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo);
     }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java
index 35614f0..c5c2e16 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java
@@ -1,9 +1,12 @@
 package com.moral.api.mapper;
 
+import java.util.List;
 import java.util.Map;
 
 import com.moral.api.entity.HistoryDaily;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -17,4 +20,5 @@
 
     Map<String, Object> getAvgByMac(Map<String, Object> params);
 
+    List<HistoryResultVo> listAvgResult(@Param("type") String type, @Param("macs") List<String> macs, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
index b4295db..d38ab72 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
@@ -5,6 +5,7 @@
 import com.moral.api.entity.HistoryMinutely;
 import com.moral.api.pojo.dto.Wind.WindData;
 
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -48,5 +49,7 @@
 
     List<HistoryHourly> listLikeResult(Map<String, Object> params);
 
+    List<HistoryResultVo> listAvgResult(Map<String, Object> params);
+
     List<HistoryMinutely> HistoryMinutelyQuery(Map<String, Object> params);
 }
diff --git a/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java b/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
index 4d498d0..fcd353b 100644
--- a/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
+++ b/screen-api/src/main/java/com/moral/api/mapper/HistoryMonthlyMapper.java
@@ -1,7 +1,11 @@
 package com.moral.api.mapper;
 
-import com.moral.api.entity.HistoryMonthly;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.moral.api.entity.HistoryMonthly;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,5 @@
  */
 public interface HistoryMonthlyMapper extends BaseMapper<HistoryMonthly> {
 
+    List<HistoryResultVo> listAll(@Param("type") String type, @Param("macs") List<String> macs, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/historyMonthly/HistoryResultVo.java b/screen-api/src/main/java/com/moral/api/pojo/vo/historyMonthly/HistoryResultVo.java
new file mode 100644
index 0000000..41b2966
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/historyMonthly/HistoryResultVo.java
@@ -0,0 +1,43 @@
+package com.moral.api.pojo.vo.historyMonthly;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-07-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="HistoryMonthlyVo - ���������VO������", description="HistoryMonthlyVo -���������VO������")
+public class HistoryResultVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������mac
+     */
+    private String mac;
+
+    /**
+     * ������
+     */
+    private String time;
+
+    /**
+     * ������
+     */
+    private BigDecimal value;
+
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/MonitorPointsVO.java b/screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/MonitorPointsVO.java
index d54852a..90233f2 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/MonitorPointsVO.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/monitorPoint/MonitorPointsVO.java
@@ -21,7 +21,7 @@
 
     private List<MonitorPointVO> monitorPoints;
 
-    public static MonitorPointsVO convert(List<MonitorPoint> monitorPoints,boolean type){
+    public static MonitorPointsVO convert(List<MonitorPoint> monitorPoints,boolean type, boolean code){
         MonitorPointsVO monitorPointsVO = new MonitorPointsVO();
         List<MonitorPointVO> monitorPointVOS = new ArrayList<>();
         for (MonitorPoint monitorPoint : monitorPoints) {
@@ -32,6 +32,12 @@
                 DeviceVO deviceVO = deviceConvert(device);
                 deviceVOS.add(deviceVO);
             }
+            if(code){
+                DeviceVO vo = new DeviceVO();
+                vo.setName(monitorPoint.getName()+"������");
+                vo.setMac(monitorPoint.getId()+",avg");
+                deviceVOS.add(vo);
+            }
             List<Device> resultState = devices.stream().filter(it->!it.getState().equals("0")).collect(Collectors.toList());
             monitorPointVO.setId(monitorPoint.getId());
             StringBuffer stringBuffer = new StringBuffer(monitorPoint.getName());
diff --git a/screen-api/src/main/java/com/moral/api/service/DataDisplayService.java b/screen-api/src/main/java/com/moral/api/service/DataDisplayService.java
index 20443b0..8276581 100644
--- a/screen-api/src/main/java/com/moral/api/service/DataDisplayService.java
+++ b/screen-api/src/main/java/com/moral/api/service/DataDisplayService.java
@@ -44,6 +44,7 @@
             */
     List<SensorComparisonDisplayDTO> getSensorComparisonDisplayDataV2(Map<String, Object> params);
 
+    List<SensorComparisonDisplayDTO> getSensorComparisonDisplayDataV3(Map<String, Object> params);
 
     List<HeatMapDTO> getHeatMapData(String code, String startTime, String type, String form);
 
diff --git a/screen-api/src/main/java/com/moral/api/service/DeviceService.java b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
index b5b3bd8..c231777 100644
--- a/screen-api/src/main/java/com/moral/api/service/DeviceService.java
+++ b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
@@ -43,6 +43,10 @@
     //���������������������������mac������
     List<String> getMacsByOrganizationId(Integer organizationId);
 
+    //���������������������������mac������
+    List<String> getMacMonitorPointId(Integer monitorPointId);
+
+
     //������������������,���������������������������mac������
     List getMacsByOrgIdAndRegionCode(Integer organizationId,Integer regionCode);
 
diff --git a/screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java b/screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java
index 0825277..97206e3 100644
--- a/screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java
+++ b/screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java
@@ -8,6 +8,8 @@
 import com.moral.api.entity.HistoryDaily;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.moral.api.entity.HistoryMinutely;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -52,6 +54,15 @@
     List<HistoryDaily> getHistoryDailyByMacAndTimeSlot(List<String> macs, Date startDate, Date endDate);
 
     /**
+     * ������������������������
+     * @param type
+     * @param macs
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<HistoryResultVo> listAvgResult(String type, List<String> macs, String startTime, String endTime);
+    /**
      *@Description: ������������id���������������������������������������
      *@Param: [map]
      *@return: java.util.Map<java.lang.String,java.lang.Object>
diff --git a/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java b/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java
index 3f2c42b..5d1f62f 100644
--- a/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java
+++ b/screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java
@@ -2,6 +2,7 @@
 
 import com.moral.api.entity.HistoryHourly;
 import com.moral.api.entity.HistoryMinutely;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
 import com.moral.api.vo.HistoryHourlyVo;
 
 import java.util.Date;
@@ -103,6 +104,15 @@
     List<HistoryHourly> getValueByMacAndTime(List<String> mac, Date startDate, Date endDate);
 
     /**
+     * @Description: ������mac���������������������������
+     * @Param: [mac, startDate, endDate]
+     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
+     * @Author: ���������
+     * @Date: 2021/9/28
+     */
+    List<HistoryResultVo> getAvgValueByMacAndTime(List<String> mac,String type, Date startDate, Date endDate);
+
+    /**
      * @param macs List<String>
      * @param time String ������2021-12-23
      * @description: ���������������������������������������
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java
index 12b96f5..909f5af 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java
@@ -11,8 +11,10 @@
 import com.moral.api.pojo.dto.dataDisplay.SensorComparisonDisplayDTO;
 import com.moral.api.pojo.form.dataDisplay.MonitorPointDataDisplayForm;
 import com.moral.api.pojo.form.dataDisplay.SensorComparisonDisplayForm;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
 import com.moral.api.service.*;
 import com.moral.api.utils.GetCenterPointFromListOfCoordinates;
+import com.moral.api.utils.StringUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.SeparateTableType;
 import com.moral.pojo.AQI;
@@ -250,6 +252,21 @@
         return dtos;
     }
 
+    public static void main(String[] args) {
+        List<String> sensors = new ArrayList<>();
+        sensors.add("a34004");
+        sensors.add("a34002");
+        sensors.add("a21026");
+        StringBuilder str = new StringBuilder();
+        for(String s : sensors){
+            str.append(" avg(JSON_EXTRACT( value, '$"+s+"' )) pm,");
+        }
+        str.deleteCharAt(str.length() - 1);
+        System.out.println(str.toString());
+
+    }
+
+
     @Override
     public List<SensorComparisonDisplayDTO> getSensorComparisonDisplayDataV2(Map<String, Object> params) {
         //������
@@ -260,31 +277,60 @@
         List<String> times = (List<String>) params.get("times");
         String startTime = times.get(0);
         String endTime = times.get(1);
-        String mac = params.get("mac").toString();
+        boolean type = subStr(params.get("mac").toString());
+        String mac = type?params.get("mac").toString().substring(0, params.get("mac").toString().indexOf(",avg")):params.get("mac").toString();
+        List<String> macList = new ArrayList<>();
+        if(type){
+            macList = deviceService.getMacMonitorPointId(Integer.parseInt(mac));
+        }else {
+            macList.add(mac);
+        }
+
         String reportType = params.get("reportType").toString();
         Map<String, String> timeValueMap = new LinkedHashMap<>();//key���time���value������������json
         //���������������
         if (reportType.equals(Constants.MONTHLY_REPORT)) {
+            //������������������
+            List<SensorComparisonDisplayDTO> dtos = new ArrayList<>();
+
             Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_EN);
             Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_EN);
-            //List<HistoryHourly> hourlies = historyHourlyService.getValueByMacAndTime(mac, startDate, endDate);
-            QueryWrapper<HistoryMonthly> historyMonthlyQueryWrapper = new QueryWrapper<>();
-            historyMonthlyQueryWrapper.eq("mac",mac);
-            historyMonthlyQueryWrapper.between("time",startTime.substring(0,7)+"-01 00:00:00",endTime.substring(0,7)+"-01 00:00:00");
-            List<HistoryMonthly> monthlies = historyMonthlyMapper.selectList(historyMonthlyQueryWrapper);
-            for (HistoryMonthly historyMonthly : monthlies) {
-                Date time = historyMonthly.getTime();
-                String dateStr = DateUtils.dateToDateString(time, "yyyy-MM");
-                String value = historyMonthly.getValue();
-                timeValueMap.put(dateStr, value);
+            for(String s : sensors){
+                SensorComparisonDisplayDTO dto = new SensorComparisonDisplayDTO();
+                if(s.equals("a00e12") || s.equals("a00e03")){
+                    dto.setCode("1");
+                }else if (s.equals("a01006")){
+                    dto.setCode("2");
+                }else if (s.equals("a99054") || s.equals("a21005")){
+                    dto.setCode("3");
+                }else {
+                    dto.setCode("0");
+                }
+                List<Map<String, Object>> dtoTimeValueList = new ArrayList<>();
+                String str = "  ROUND(avg(JSON_EXTRACT( value, '$."+s+"' )),2) value ";
+                List<HistoryResultVo> monthlies = historyMonthlyMapper.listAll(str.toString(),macList,startTime.substring(0,7)+"-01 00:00:00",endTime.substring(0,7)+"-01 00:00:00");
+                Map<String, List<HistoryResultVo>> prodMap= monthlies.stream().collect(Collectors.groupingBy(HistoryResultVo::getTime));
+                //���������������������
+                Date middleDate = startDate;
+                while (DateUtils.compareDateStr(DateUtils.dateToDateString(endDate,DateUtils.yyyy_MM_EN),DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN),DateUtils.yyyy_MM_EN)<=0){
+                    Map<String, Object> resultMap = new LinkedHashMap<>();
+                    resultMap.put("time",DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN));
+                    if (prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN)) == null){
+                        resultMap.put("value",null);
+                    }else {
+                        List<HistoryResultVo> resultList = prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN));
+                        resultMap.put("value", resultList.get(0).getValue());
+                    }
+                    dtoTimeValueList.add(resultMap);
+                    middleDate = DateUtils.addMonths(middleDate,1);
+                }
+
+                dto.setTimeValueList(dtoTimeValueList);
+                dtos.add(dto);
             }
-            //���������������������
-            Date middleDate = startDate;
-            while (DateUtils.compareDateStr(DateUtils.dateToDateString(endDate,DateUtils.yyyy_MM_EN),DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN),DateUtils.yyyy_MM_EN)<=0){
-                if (timeValueMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN)) == null)
-                    timeValueMap.put(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN), null);
-                middleDate = DateUtils.addMonths(middleDate,1);
-            }
+
+            return dtos;
+
         }
         //������������������
         else if (reportType.equals(Constants.HOURLY_REPORT)) {
@@ -389,6 +435,98 @@
             dtos.add(dto);
         }
         return dtos;
+    }
+    @Override
+    public List<SensorComparisonDisplayDTO> getSensorComparisonDisplayDataV3(Map<String, Object> params) {
+        //������
+        List<String> sensors = (List<String>) params.get("sensorCodes");
+        //������������
+        List<String> times = (List<String>) params.get("times");
+        String startTime = times.get(0);
+        String endTime = times.get(1);
+        boolean type = subStr(params.get("mac").toString());
+        String mac = type?params.get("mac").toString().substring(0, params.get("mac").toString().indexOf(",avg")):params.get("mac").toString();
+        List<String> macList = new ArrayList<>();
+        if(type){
+            macList = deviceService.getMacMonitorPointId(Integer.parseInt(mac));
+        }else {
+            macList.add(mac);
+        }
+        String reportType = params.get("reportType").toString();
+        List<SensorComparisonDisplayDTO> dtos = new ArrayList<>();
+        Date startDate = null;
+        Date endDate = null;
+        if (reportType.equals(Constants.MONTHLY_REPORT)) {
+            startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_EN);
+            endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_EN);
+        }  else if (reportType.equals(Constants.HOURLY_REPORT)) {
+            startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN);
+            endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN);
+        } else if (reportType.equals(Constants.DAILY_REPORT)) {
+            startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_EN);
+            endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_EN);
+        }
+        for(String s : sensors){
+            SensorComparisonDisplayDTO dto = new SensorComparisonDisplayDTO();
+            if(s.equals("a00e12") || s.equals("a00e03")){
+                dto.setCode("1");
+            }else if (s.equals("a01006")){
+                dto.setCode("2");
+            }else if (s.equals("a99054") || s.equals("a21005")){
+                dto.setCode("3");
+            }else {
+                dto.setCode("0");
+            }
+            List<Map<String, Object>> dtoTimeValueList = new ArrayList<>();
+            String str = "  ROUND(avg(JSON_EXTRACT( value, '$."+s+"' )),2) value ";
+            List<HistoryResultVo> historyResultVos = new ArrayList<>();
+            if (reportType.equals(Constants.MONTHLY_REPORT)) {
+                historyResultVos = historyMonthlyMapper.listAll(str,macList,startTime.substring(0,7)+"-01 00:00:00",endTime.substring(0,7)+"-01 00:00:00");
+            }  else if (reportType.equals(Constants.HOURLY_REPORT)) {
+                historyResultVos = historyHourlyService.getAvgValueByMacAndTime(macList,str, startDate, endDate);
+            } else if (reportType.equals(Constants.DAILY_REPORT)) {
+                historyResultVos = historyDailyService.listAvgResult(str,macList,DateUtils.dateToDateString(startDate,DateUtils.yyyy_MM_dd_EN) ,DateUtils.dateToDateString(endDate,DateUtils.yyyy_MM_dd_EN) );
+            }
+            Map<String, List<HistoryResultVo>> prodMap= historyResultVos.stream().collect(Collectors.groupingBy(HistoryResultVo::getTime));
+            Date middleDate = startDate;
+            while(DateUtils.isTimeBeforE(endDate,middleDate)){
+                Map<String, Object> resultMap = new LinkedHashMap<>();
+                if (reportType.equals(Constants.MONTHLY_REPORT)) {
+                    resultMap.put("time",DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN));
+                    if (prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN)) == null){
+                        resultMap.put("value",null);
+                    }else {
+                        List<HistoryResultVo> resultList = prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_EN));
+                        resultMap.put("value", resultList.get(0).getValue());
+                    }
+                    dtoTimeValueList.add(resultMap);
+                    middleDate = DateUtils.addMonths(middleDate,1);
+                }else if(reportType.equals(Constants.HOURLY_REPORT)) {
+                    resultMap.put("time",DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN));
+                    if (prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN)) == null){
+                        resultMap.put("value",null);
+                    }else {
+                        List<HistoryResultVo> resultList = prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN));
+                        resultMap.put("value", resultList.get(0).getValue());
+                    }
+                    dtoTimeValueList.add(resultMap);
+                    middleDate = DateUtils.addHours(middleDate,1);
+                }else if(reportType.equals(Constants.DAILY_REPORT)){
+                    resultMap.put("time",DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_EN));
+                    if (prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_EN)) == null){
+                        resultMap.put("value",null);
+                    }else {
+                        List<HistoryResultVo> resultList = prodMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_EN));
+                        resultMap.put("value", resultList.get(0).getValue());
+                    }
+                    dtoTimeValueList.add(resultMap);
+                    middleDate = DateUtils.addDays(middleDate,1);
+                }
+            }
+            dto.setTimeValueList(dtoTimeValueList);
+            dtos.add(dto);
+        }
+       return dtos;
     }
 
     /**
@@ -1028,6 +1166,11 @@
                 dto.setComIndex(comIndex);
         });
     }
-
+    private boolean subStr(String mac){
+       if(StringUtils.isNotEmpty(mac)&&mac.contains(",avg")){
+           return true;
+       }
+       return false;
+    }
 }
 
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
index 8763d27..201dcdd 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -538,6 +538,15 @@
     }
 
     @Override
+    public List getMacMonitorPointId(Integer monitorPointId) {
+        QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("mac")
+                .eq("monitor_point_id", monitorPointId)
+                .eq("is_delete", Constants.NOT_DELETE);
+        return deviceMapper.selectObjs(queryWrapper);
+    }
+
+    @Override
     public List getMacsByOrgIdAndRegionCode(Integer organizationId, Integer regionCode) {
         QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
         queryWrapper.select("mac")
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
index b1d5996..b88640b 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
@@ -3,6 +3,7 @@
 import com.moral.api.entity.*;
 import com.moral.api.mapper.ServicesScopeDeviceMapper;
 import com.moral.api.mapper.ServicesScopeMapper;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
@@ -120,6 +121,10 @@
         List<HistoryDaily> historyDailies = historyDailyMapper.selectList(wrapper);
         return historyDailies;
     }
+    @Override
+    public List<HistoryResultVo> listAvgResult(String type, List<String> macs, String startTime, String endTime) {
+        return historyDailyMapper.listAvgResult(type, macs, startTime, endTime);
+    }
 
     @Override
     public Map<String, Object> getThermodynamicDiagramDataByOrgIdSensorCodeTime(Map<String, Object> parameters) {
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
index 4dd56ea..b675bc2 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -5,6 +5,7 @@
 import com.moral.api.entity.*;
 import com.moral.api.mapper.ServicesScopeDeviceMapper;
 import com.moral.api.mapper.ServicesScopeMapper;
+import com.moral.api.pojo.vo.historyMonthly.HistoryResultVo;
 import com.moral.api.vo.HistoryHourlyVo;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -765,7 +766,17 @@
         List<HistoryHourly> datas = multiTableQuery(mapParams, tableNames);
         return datas;
     }
-
+    @Override
+    public List<HistoryResultVo> getAvgValueByMacAndTime(List<String> mac,String type, Date startDate, Date endDate) {
+        Map<String, Object> mapParams = new HashMap<>();
+        mapParams.put("startTime",startDate);
+        mapParams.put("endTime",endDate);
+        mapParams.put("type",type);
+        mapParams.put("macs",mac);
+        List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(startDate, endDate, SeparateTableType.MONTH);
+        List<HistoryResultVo> datas = multiTableQueryAvg(mapParams, tableNames);
+        return datas;
+    }
     @Override
     public List<HistoryHourly> getValueByMacs(List<String> macs, String time) {
         Map<String, Object> mapParams = new HashMap<>();
@@ -859,6 +870,16 @@
         return result;
     }
 
+    private List<HistoryResultVo> multiTableQueryAvg(Map<String, Object> params, List<String> tableNames) {
+        List<HistoryResultVo> result = new ArrayList<>();
+        for (String tableName : tableNames) {
+            params.put("table",tableName);
+            List<HistoryResultVo> datas = historyHourlyMapper.listAvgResult(params);
+            result.addAll(datas);
+        }
+        return result;
+    }
+
     /**
      * @Description: ������������������������������������������������wrapper���������������
      * @Param: [wrapper, tableNames]
diff --git a/screen-api/src/main/resources/mapper/HistoryDailyMapper.xml b/screen-api/src/main/resources/mapper/HistoryDailyMapper.xml
index a54c78b..503f162 100644
--- a/screen-api/src/main/resources/mapper/HistoryDailyMapper.xml
+++ b/screen-api/src/main/resources/mapper/HistoryDailyMapper.xml
@@ -18,4 +18,17 @@
         AND time <![CDATA[<=]]> #{end}
     </select>
 
+    <select id="listAvgResult" resultType="com.moral.api.pojo.vo.historyMonthly.HistoryResultVo">
+        select  DATE_FORMAT(time,'%Y-%m-%d') time,${type}
+        from history_daily
+        where date(time) <![CDATA[>=]]> #{startTime}
+        and date(time) <![CDATA[<=]]> #{endTime}
+        and mac in
+        <foreach collection="macs" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        group by time
+        order by time
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml
index 1d339df..3d978ce 100644
--- a/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml
+++ b/screen-api/src/main/resources/mapper/HistoryHourlyMapper.xml
@@ -129,6 +129,19 @@
         order by time desc
     </select>
 
+    <select id="listAvgResult" resultType="com.moral.api.pojo.vo.historyMonthly.HistoryResultVo">
+        select  DATE_FORMAT(time,'%Y-%m-%d %H') time,${type}
+        FROM history_hourly${table} WHERE 1 =1 and
+        time <![CDATA[>=]]> #{startTime}
+        and time <![CDATA[<=]]> #{endTime}
+        and mac in
+        <foreach collection="macs" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        group by time
+        order by time
+    </select>
+
     <select id="HistoryMinutelyQuery" resultType="com.moral.api.entity.HistoryMinutely">
         SELECT mac,time,value,version FROM history_minutely${table}
         WHERE 1 =1
diff --git a/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml b/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
index 942a9a0..4efcb36 100644
--- a/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
+++ b/screen-api/src/main/resources/mapper/HistoryMonthlyMapper.xml
@@ -9,4 +9,19 @@
         <result column="value" property="value"/>
     </resultMap>
 
+    <select id="listAll" resultType="com.moral.api.pojo.vo.historyMonthly.HistoryResultVo">
+        select  DATE_FORMAT(time,'%Y-%m') time,${type}
+        from history_monthly
+        where date(time) <![CDATA[>=]]> #{startTime}
+        and date(time) <![CDATA[<=]]> #{endTime}
+        and mac in
+        <foreach collection="macs" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        group by time
+        order by time
+    </select>
+
+
+
 </mapper>
\ No newline at end of file

--
Gitblit v1.8.0