From 2a781bbf1d42191c3b8225a9973bf3d0ecccd66b Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Mon, 27 Sep 2021 14:33:36 +0800
Subject: [PATCH] screen-aqi            增加获取监测站数据显示接口

---
 screen-api/src/main/java/com/moral/api/pojo/form/dataDisplay/MonitorPointDataDisplayForm.java |   82 +++++
 screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java               |  173 ++++++++++++
 screen-common/src/main/java/com/moral/util/DateUtils.java                                     |  129 ++++++++
 screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java                |    5 
 screen-api/src/main/java/com/moral/api/service/DataDisplayService.java                        |   22 +
 screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java                       |  164 +++++++++++
 screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/MonitorPointDataDisplayDTO.java   |   25 +
 screen-api/src/main/java/com/moral/api/service/MonitorPointService.java                       |    7 
 screen-api/src/main/java/com/moral/api/service/HistoryDailyService.java                       |   29 ++
 screen-api/src/main/java/com/moral/api/service/OrganizationService.java                       |    9 
 screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java              |    5 
 screen-api/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java              |   36 ++
 screen-common/src/main/java/com/moral/constant/Constants.java                                 |   20 +
 screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java                  |   78 +++++
 14 files changed, 774 insertions(+), 10 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
new file mode 100644
index 0000000..4fd2b1d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/controller/DataDisplayController.java
@@ -0,0 +1,78 @@
+package com.moral.api.controller;
+
+import com.moral.api.pojo.dto.dataDisplay.MonitorPointDataDisplayDTO;
+import com.moral.api.pojo.form.dataDisplay.MonitorPointDataDisplayForm;
+import com.moral.constant.ResponseCodeEnum;
+import com.moral.constant.ResultMessage;
+import com.moral.util.DateUtils;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName DataDisplayController
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/9/26 9:59
+ * @Version TODO
+ **/
+@Slf4j
+@Api(tags = {"������������"})
+@RestController
+@CrossOrigin(origins = "*", maxAge = 3600)
+@RequestMapping("/dataDisplay")
+public class DataDisplayController {
+
+    @GetMapping("monitorPointDataDisplay")
+    public ResultMessage monitorPointDataDisplay(MonitorPointDataDisplayForm form){
+        //������������������������
+        if (!form.valid())
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
+                    ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+
+        MonitorPointDataDisplayDTO dto = new MonitorPointDataDisplayDTO();
+        MonitorPointDataDisplayDTO dto1 = new MonitorPointDataDisplayDTO();
+        MonitorPointDataDisplayDTO dto2 = new MonitorPointDataDisplayDTO();
+
+        dto.setDeviceName("������������1");
+        dto1.setDeviceName("������������2");
+        dto2.setDeviceName("������������3");
+
+        dto.setTime("yyyy-MM-dd HH:mm:ss");
+        dto1.setTime("yyyy-MM-dd HH:mm:ss");
+        dto2.setTime("yyyy-MM-dd HH:mm:ss");
+
+        dto.setOrganizationName("������������1");
+        dto1.setOrganizationName("������������2");
+        dto2.setOrganizationName("������������3");
+
+        Map<String,Object> valueMap = new HashMap<>();
+        valueMap.put("a21026",1);
+        valueMap.put("a21004",1);
+        valueMap.put("a34002",1);
+        valueMap.put("a34004",1);
+        valueMap.put("a21005",1);
+        valueMap.put("a05024",1);
+        valueMap.put("a99054",1);
+        valueMap.put("AQI",1);
+
+        dto.setValues(valueMap);
+        dto1.setValues(valueMap);
+        dto2.setValues(valueMap);
+
+        List<MonitorPointDataDisplayDTO> list = new ArrayList<>();
+        list.add(dto);
+        list.add(dto1);
+        list.add(dto2);
+        return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(),list);
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/MonitorPointDataDisplayDTO.java b/screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/MonitorPointDataDisplayDTO.java
new file mode 100644
index 0000000..db149f5
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/MonitorPointDataDisplayDTO.java
@@ -0,0 +1,25 @@
+package com.moral.api.pojo.dto.dataDisplay;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @ClassName DataDisplayDTO
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/9/26 16:53
+ * @Version TODO
+ **/
+@Data
+public class MonitorPointDataDisplayDTO {
+
+    private String deviceName;
+
+    private String organizationName;
+
+    private String time;
+
+    private Map<String,Object> values;
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/form/dataDisplay/MonitorPointDataDisplayForm.java b/screen-api/src/main/java/com/moral/api/pojo/form/dataDisplay/MonitorPointDataDisplayForm.java
new file mode 100644
index 0000000..21083f0
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/pojo/form/dataDisplay/MonitorPointDataDisplayForm.java
@@ -0,0 +1,82 @@
+package com.moral.api.pojo.form.dataDisplay;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.constant.Constants;
+import com.moral.util.DateUtils;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @ClassName MonitorPointDataDisplayForm
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/9/26 10:03
+ * @Version TODO
+ **/
+@Data
+public class MonitorPointDataDisplayForm {
+
+    /*
+     * ������id
+     * */
+    private Integer monitorPointId;
+
+    /*
+     * ������������
+     * */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date startTime;
+
+    /*
+     * ������������
+     * */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
+    /*
+     * ���������������������������������������
+     * */
+    private String reportType;
+
+    /*
+     * ������������������������
+     * */
+    public boolean valid() {
+        if (monitorPointId == null)
+            return false;
+        if (reportType == null) {
+            if (startTime == null || endTime == null)
+                return false;
+            reportType = Constants.DAILYREPORT;
+            //������������������������������������������
+            String endTimeStr = DateUtils.dateToDateString(endTime,"yyyy-MM-dd");
+            endTimeStr+=" 23:59:59";
+            endTime = DateUtils.getDate(endTimeStr,"yyyy-MM-dd HH:mm:ss");
+        } else {
+            if (reportType.equals(Constants.HOURYLYREPORT)) {
+                //������������������������������������������
+                Date previousHour = DateUtils.getDateOfMin(new Date(), -60);
+                startTime = DateUtils.getHourlyStartTime(previousHour);
+            } else if (reportType.equals(Constants.DAILYREPORT)) {
+                //������������������������������������
+                Date yesterday = DateUtils.getDateOfDay(new Date(),-1);
+                startTime = DateUtils.getDailyStartTime(yesterday);
+            } else if (reportType.equals(Constants.WEEKLYREPORT)) {
+                //������������������������������������
+                Date previous = DateUtils.getDateOfDay(new Date(),-7);
+                startTime = DateUtils.getWeeklyStartTime(previous);
+            } else if (reportType.equals(Constants.MONTHLYREPORT)) {
+                //������������������������������������
+                Date lastMonthFirstDay = DateUtils.getFirstDayOfLastMonth();
+                startTime = DateUtils.getMonthlyStartTime(lastMonthFirstDay);
+            } else
+                return false;
+        }
+        return true;
+    }
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java b/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
index c182c07..f0731ae 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/form/uav/UAVQueryTimeSlotForm.java
@@ -49,9 +49,8 @@
                 )
             return false;
         //������������������������������������
-        List<Date> dates = DateUtils.dateToStartAndEndTime(date);
-        startDate = dates.get(0);
-        endDate = dates.get(1);
+        startDate = DateUtils.getDailyStartTime(date);
+        endDate = DateUtils.getDailyEndTime(date);
         return true;
     }
 }
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
new file mode 100644
index 0000000..869e0a3
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/DataDisplayService.java
@@ -0,0 +1,22 @@
+package com.moral.api.service;
+
+import com.moral.api.pojo.form.dataDisplay.MonitorPointDataDisplayForm;
+
+/**
+* @Description: ���������������������������
+        * @Param:
+        * @return:
+        * @Author: ���������
+        * @Date: 2021/9/26
+        */
+public interface DataDisplayService {
+
+    /**
+    * @Description: ������������������������������
+            * @Param: [form]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    void getMonitorPointDisplayData(MonitorPointDataDisplayForm form);
+}
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 0af6948..a1bdd7b 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
@@ -1,5 +1,7 @@
 package com.moral.api.service;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 import com.moral.api.entity.HistoryDaily;
@@ -18,4 +20,31 @@
     //���������������������������������
     Map<String, Object> getMonthAvg(Map<String, Object> params);
 
+    /**
+    * @Description: ���������������������������������
+            * @Param: [mac, date]
+            * @return: com.moral.api.entity.HistoryDaily
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    HistoryDaily getHistoryDailyByMacAndDate(String mac,Date date);
+
+    /**
+    * @Description: ������������mac������������������������������,key���mac���value���������
+            * @Param: [mac, date]
+            * @return: java.util.Map<java.lang.String,com.moral.api.entity.HistoryDaily>
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    Map<String,HistoryDaily> getHistoryDailyByMacsAndDate(List<String> mac, Date date);
+
+    /**
+    * @Description: ������������mac���������������������������
+            * @Param: [mac, startDate, endDate]
+            * @return: java.util.Map<java.lang.String,com.moral.api.entity.HistoryDaily>
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    List<HistoryDaily> getHistoryDailyByMacAndTimeSlot( String mac, Date startDate,Date endDate);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
index 4d2668f..953a122 100644
--- a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
+++ b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
@@ -25,6 +25,13 @@
             */
     List<MonitorPoint> queryByOrgIdAndRegionCode(MonitorPointQueryForm form);
 
+    /**
+    * @Description: ������������id������������������������
+            * @Param: [organizationId]
+            * @return: java.util.List<com.moral.api.entity.MonitorPoint>
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
     List<MonitorPoint> queryAllMonitorPoints(Integer organizationId);
 
 
diff --git a/screen-api/src/main/java/com/moral/api/service/OrganizationService.java b/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
index ddb13eb..c7f33b8 100644
--- a/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
+++ b/screen-api/src/main/java/com/moral/api/service/OrganizationService.java
@@ -24,4 +24,13 @@
             */
     List<Organization> getChildrenOrganizationsById(Integer id);
 
+    /**
+    * @Description: ������id������������
+            * @Param: [id]
+            * @return: com.moral.api.entity.Organization
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    Organization getOrganizationById(Integer id);
+
 }
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
new file mode 100644
index 0000000..971a459
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DataDisplayServiceImpl.java
@@ -0,0 +1,173 @@
+package com.moral.api.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.moral.api.entity.Device;
+import com.moral.api.entity.HistoryDaily;
+import com.moral.api.pojo.dto.dataDisplay.MonitorPointDataDisplayDTO;
+import com.moral.api.pojo.form.dataDisplay.MonitorPointDataDisplayForm;
+import com.moral.api.service.DataDisplayService;
+import com.moral.api.service.DeviceService;
+import com.moral.api.service.HistoryDailyService;
+import com.moral.api.service.OrganizationService;
+import com.moral.util.AQIUtils;
+import com.moral.util.AmendUtils;
+import com.moral.util.DateUtils;
+import com.moral.util.MathUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.*;
+
+/**
+ * @ClassName DataDisplayServiceImpl
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/9/26 9:55
+ * @Version TODO
+ **/
+public class DataDisplayServiceImpl implements DataDisplayService {
+
+    @Autowired
+    DeviceService deviceService;
+    @Autowired
+    HistoryDailyService historyDailyService;
+    @Autowired
+    OrganizationService organizationService;
+
+
+    @Override
+    public void getMonitorPointDisplayData(MonitorPointDataDisplayForm form) {
+        //������
+        Integer monitorPointId = form.getMonitorPointId();
+        String reportType = form.getReportType();
+        Date startTime = form.getStartTime();
+        Date endTime = form.getEndTime();
+        //������������id������������������������������
+        List<Device> devices = deviceService.getDevicesByMonitorPointId(monitorPointId);
+        Map<String, Device> deviceMap = new HashMap<>();
+        List<String> macs = new ArrayList<>();
+        devices.forEach(value -> {
+            macs.add(value.getMac());
+            deviceMap.put(value.getMac(), value);
+        });
+        //���������������������null������������������������������������������������������
+        if (reportType == null) {
+            Map<String, List<HistoryDaily>> macDataMap = new HashMap<>();//key���mac
+            macs.forEach(value -> {
+                List<HistoryDaily> datas = historyDailyService.getHistoryDailyByMacAndTimeSlot(value, startTime, endTime);
+                macDataMap.put(value, datas);
+            });
+        }
+    }
+
+
+    /**
+     * @Description: ������������������������������
+     * @Param: [macDatasMap] key���mac,value������������������������������������
+     * @return: void
+     * @Author: ���������
+     * @Date: 2021/9/26
+     */
+    private void calculateCustomData(Map<String, List<HistoryDaily>> macDataMap, Map<String, Device> deviceMap, Date startDate, Date endDate) {
+        List<MonitorPointDataDisplayDTO> dtos = new ArrayList<>();
+        macDataMap.forEach((key, value) -> {
+            MonitorPointDataDisplayDTO dto = new MonitorPointDataDisplayDTO();
+            //������������������
+            String deviceName = deviceMap.get(key).getName();
+            //������������������
+            organizationService.getOrganizationById(deviceMap.get(key).getOrganizationId());
+            //������������
+            String startTime = DateUtils.dateToDateString(startDate, "yyyy-MM-dd");
+            String endTime = DateUtils.dateToDateString(endDate, "yyyy-MM-dd");
+            String time = startTime + " - " + endTime;
+            //������������������
+            Double AQINum = 0d;
+            Double PM25Num = 0d;
+            Double PM10Num = 0d;
+            Double SO2Num = 0d;
+            Double NO2Num = 0d;
+            Double CONum = 0d;
+            Double O3Num = 0d;
+            Double TVOCNum = 0d;
+            //������AQI,PM2.5,PM10,SO2,NO2,CO,O3,TVOC���������
+            Double AQISum = 0d;
+            Double PM25Sum = 0d;
+            Double PM10Sum = 0d;
+            Double SO2Sum = 0d;
+            Double NO2Sum = 0d;
+            Double COSum = 0d;
+            Double O3Sum = 0d;
+            Double TVOCSum = 0d;
+            for (HistoryDaily historyDaily : value) {
+                //������������map
+                Map<String, Object> valueMap = JSON.parseObject(historyDaily.getValue(), Map.class);
+                Object SO2 = valueMap.get("a21026");
+                Object NO2 = valueMap.get("a21004");
+                Object PM10 = valueMap.get("a34002");
+                Object PM25 = valueMap.get("a34004");
+                Object CO = valueMap.get("a21005");
+                Object O3 = valueMap.get("a05024");
+                Object TVOC = valueMap.get("a99054");
+                if (SO2 != null) {
+                    SO2Sum = MathUtils.add(SO2Sum, Double.valueOf(SO2.toString()));
+                    SO2Num++;
+                }
+                if (NO2 != null) {
+                    NO2Sum = MathUtils.add(NO2Sum, Double.valueOf(NO2.toString()));
+                    NO2Num++;
+                }
+                if (PM10 != null) {
+                    PM10Sum = MathUtils.add(PM10Sum, Double.valueOf(PM10.toString()));
+                    PM10Num++;
+                }
+                if (CO != null) {
+                    COSum = MathUtils.add(COSum, Double.valueOf(CO.toString()));
+                    CONum++;
+                }
+                if (PM25 != null) {
+                    PM25Sum = MathUtils.add(PM25Sum, Double.valueOf(PM25.toString()));
+                    PM25Num++;
+                }
+                if (O3 != null) {
+                    O3Sum = MathUtils.add(O3Sum, Double.valueOf(O3.toString()));
+                    O3Num++;
+                }
+                if (TVOC != null) {
+                    TVOCSum = MathUtils.add(TVOCSum, Double.valueOf(TVOC.toString()));
+                    TVOCNum++;
+                }
+                //���AQI
+                int aqi = AQIUtils.hourlyAqi(valueMap);
+                if (aqi != 0) {
+                    AQISum += Double.valueOf(aqi);
+                }
+            }
+            //������aqi������
+            double AQID = AmendUtils.sciCal(AQISum / AQINum, 0);
+            int AQIAvg = new Double(AQID).intValue();
+            //������PM2.5������
+            double PM25D = AmendUtils.sciCal(PM25Sum / PM25Num, 0);
+            int PM25Avg = new Double(PM25D).intValue();
+            //������PM10������
+            double PM10D = AmendUtils.sciCal(PM10Sum / PM10Num,0);
+            int PM10Avg = new Double(PM10D).intValue();
+            //������SO2������
+            double SO2D = AmendUtils.sciCal(SO2Sum / SO2Num,0);
+            int SO2Avg = new Double(SO2D).intValue();
+            //������NO2������
+            double NO2D = AmendUtils.sciCal(NO2Sum / NO2Num,0);
+            int NO2Avg = new Double(NO2D).intValue();
+            //������CO���������������������������
+            double COAvg = AmendUtils.sciCal(COSum / CONum,2);
+            //������O3������
+            double O3D = AmendUtils.sciCal(O3Sum / O3Num,0);
+            int O3Avg = new Double(O3D).intValue();
+            //������TVOC������,������������������
+            double TVOCAvg = AmendUtils.sciCal(TVOCSum / TVOCNum,2);
+
+
+        });
+    }
+
+
+
+}
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 5c1316e..4895d63 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
@@ -1,5 +1,6 @@
 package com.moral.api.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.HistoryDaily;
 import com.moral.api.mapper.HistoryDailyMapper;
 import com.moral.api.service.HistoryDailyService;
@@ -11,7 +12,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
+import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -41,4 +44,37 @@
         result.put("avg", data.get(params.get("sensorCode")));
         return result;
     }
+
+    @Override
+    public HistoryDaily getHistoryDailyByMacAndDate(String mac, Date date) {
+        QueryWrapper<HistoryDaily> wrapper = new QueryWrapper<>();
+        wrapper.eq("mac",mac);
+        wrapper.eq("time",date);
+        List<HistoryDaily> historyDailies = historyDailyMapper.selectList(wrapper);
+        return historyDailies.get(0);
+    }
+
+    @Override
+    public Map<String, HistoryDaily> getHistoryDailyByMacsAndDate(List<String> mac, Date date) {
+        QueryWrapper<HistoryDaily> wrapper = new QueryWrapper<>();
+        wrapper.in("mac",mac);
+        wrapper.eq("time",date);
+        List<HistoryDaily> historyDailies = historyDailyMapper.selectList(wrapper);
+        Map<String,HistoryDaily> map = new HashMap<>();
+        for (HistoryDaily historyDaily : historyDailies) {
+            map.put(historyDaily.getMac(),historyDaily);
+        }
+        return map;
+    }
+
+    @Override
+    public List<HistoryDaily> getHistoryDailyByMacAndTimeSlot(String mac, Date startDate, Date endDate) {
+        QueryWrapper<HistoryDaily> wrapper = new QueryWrapper<>();
+        wrapper.in("mac",mac);
+        wrapper.between("time",startDate,endDate);
+        List<HistoryDaily> historyDailies = historyDailyMapper.selectList(wrapper);
+        return historyDailies;
+    }
+
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
index ca4669a..0e406e1 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -35,6 +35,11 @@
         return childrenOrganization;
     }
 
+    @Override
+    public Organization getOrganizationById(Integer id) {
+        return organizationMapper.selectById(id);
+    }
+
 
     /**
     * @Description: ���������������������������������������������������children���
diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java
index 1d6250d..b780f74 100644
--- a/screen-common/src/main/java/com/moral/constant/Constants.java
+++ b/screen-common/src/main/java/com/moral/constant/Constants.java
@@ -219,5 +219,25 @@
      * */
     public static final String SPECIAL_DEVICE_UAV = "1";
 
+    /*
+    * ������
+    * */
+    public static final String HOURYLYREPORT = "0";
+
+    /*
+    * ������
+    * */
+    public static final String DAILYREPORT = "1";
+
+    /*
+    * ������
+    * */
+    public static final String WEEKLYREPORT = "2";
+
+    /*
+    * ������
+    * */
+    public static final String MONTHLYREPORT = "3";
+
     
 }
diff --git a/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java b/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
new file mode 100644
index 0000000..9f9b368
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
@@ -0,0 +1,164 @@
+package com.moral.util;
+
+import java.util.*;
+
+/**
+ * @ClassName ComprehensiveIndexUtils
+ * @Description ���������������������������
+ * @Author ���������
+ * @Date 2021/9/27 9:40
+ * @Version TODO
+ **/
+public class ComprehensiveIndexUtils {
+
+    /**
+     * @Description: ������������������������������������������������������map������������������
+     * @Param: [datas]
+     * @return: Double
+     * @Author: ���������
+     * @Date: 2021/9/27
+     */
+    public static Double monthData(List<Map<String, Object>> datas) {
+        //���������������������������������������
+        Map<String, Double> CValueMap = calCValue(datas);
+        if (CValueMap == null)
+            return null;
+        Double CSO2 = CValueMap.get("CSO2");
+        Double CNO2 = CValueMap.get("CNO2");
+        Double CPM25 = CValueMap.get("CPM25");
+        Double CPM10 = CValueMap.get("CPM10");
+        Double CCO = CValueMap.get("CCO");
+        Double CO3 = CValueMap.get("CO3");
+        //S���������������������������������������(���������������CO������������������������������������������������O3���������������������������������������)
+        //������������GB 3095-2012
+        Double SSO2 = 60d;
+        Double SNO2 = 40d;
+        Double SPM25 = 35d;
+        Double SPM10 = 70d;
+        Double SCO = 4d;
+        Double SO3 = 160d;
+        //���������������������������
+        Double ISO2 = CSO2 / SSO2;
+        Double INO2 = CNO2 / SNO2;
+        Double IPM25 = CPM25 / SPM25;
+        Double IPM10 = CPM10 / SPM10;
+        Double ICO = CCO / SCO;
+        Double IO3 = CO3 / SO3;
+        //������������������
+        Double ComprehensiveIndex = MathUtils.add(ISO2,INO2);
+        ComprehensiveIndex = MathUtils.add(ComprehensiveIndex,IPM25);
+        ComprehensiveIndex = MathUtils.add(ComprehensiveIndex,IPM10);
+        ComprehensiveIndex = MathUtils.add(ComprehensiveIndex,ICO);
+        ComprehensiveIndex = MathUtils.add(ComprehensiveIndex,IO3);
+        return ComprehensiveIndex;
+    }
+
+    /**
+     * @Description: ������������������������
+     * SO2 NO2 PM10 PM2.5������������������CO���������������������������������������O3���������������������������������������������
+     * @Param: [datas]
+     * @return: java.util.Map<java.lang.String   ,   java.lang.Object>
+     * @Author: ���������
+     * @Date: 2021/9/27
+     */
+    private static Map<String, Double> calCValue(List<Map<String, Object>> datas) {
+        //���������������
+        Double CSO2;//SO2������������������
+        Double CNO2;//NO2������������������
+        Double CPM10;//PM10������������������
+        Double CPM25;//PM25������������������
+        Double CCO;//CO������������������
+        Double CO3;//O3������������������
+        //������SO2 NO2 PM10 PM2.5���������
+        Double SO2Sum = 0d;
+        Double NO2Sum = 0d;
+        Double PM10Sum = 0d;
+        Double PM25Sum = 0d;
+        Double SO2Num = 0d;
+        Double NO2Num = 0d;
+        Double PM10Num = 0d;
+        Double PM25Num = 0d;
+        for (Map<String, Object> data : datas) {
+            Object SO2 = data.get("a21026");
+            Object NO2 = data.get("a21004");
+            Object PM10 = data.get("a34002");
+            Object PM25 = data.get("a34004");
+            if (SO2 != null) {
+                SO2Num++;
+                SO2Sum = MathUtils.add(SO2Sum, Double.valueOf(SO2.toString()));
+            }
+            if (NO2 != null) {
+                NO2Num++;
+                NO2Sum = MathUtils.add(NO2Sum, Double.valueOf(NO2.toString()));
+            }
+            if (PM10 != null) {
+                PM10Num++;
+                PM10Sum = MathUtils.add(PM10Sum, Double.valueOf(PM10.toString()));
+            }
+            if (PM25 != null) {
+                PM25Num++;
+                PM25Sum = MathUtils.add(PM25Sum, Double.valueOf(PM25.toString()));
+            }
+
+        }
+        CSO2 = SO2Sum / SO2Num;
+        CNO2 = NO2Sum / NO2Num;
+        CPM10 = PM10Sum / PM10Num;
+        CPM25 = PM25Sum / PM25Num;
+        if (CSO2 == 0d || CNO2 == 0d || CPM10 == 0d || CPM25 == 0d)
+            return null;
+
+        /*������CO������������������*/
+        //������CO���������������������������
+        List<Double> COs = getSensorAsc(datas, "a21005");
+        //������95���������
+        if (COs.size() == 0)
+            return null;
+        Double COIndexd = COs.size() * 0.95;
+        int COIndex = new Double(Math.ceil(COIndexd)).intValue();
+        CCO = COs.get(COIndex - 1);
+
+        /*������O3���������������*/
+        //������O3������������������������������������������������
+        List<Double> O3s = getSensorAsc(datas, "a05024");
+        //������90���������
+        if (O3s.size() == 0)
+            return null;
+        Double O3Indexd = O3s.size() * 0.9;
+        int O3Index = new Double(Math.ceil(O3Indexd)).intValue();
+        CO3 = O3s.get(O3Index - 1);
+
+        Map<String, Double> result = new HashMap<>();
+        result.put("CSO2", CSO2);
+        result.put("CNO2", CNO2);
+        result.put("CPM25", CPM25);
+        result.put("CPM10", CPM10);
+        result.put("CCO", CCO);
+        result.put("CO3", CO3);
+        return result;
+    }
+
+    /**
+     * @Description: ���������������������������������
+     * @Param: [datas]
+     * @return: java.util.List<java.lang.Double>
+     * @Author: ���������
+     * @Date: 2021/9/27
+     */
+    private static List<Double> getSensorAsc(List<Map<String, Object>> datas, String sensor) {
+        List<Double> result = new ArrayList<>();
+        datas.forEach(value -> {
+            Object o = value.get(sensor);
+            if (o != null)
+                result.add(Double.valueOf(o.toString()));
+        });
+        Collections.sort(result, new Comparator<Double>() {
+            @Override
+            public int compare(Double o1, Double o2) {
+                return new Double(o1 - o2).intValue();
+            }
+        });
+        return result;
+    }
+
+}
diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java
index a523879..d6a03cb 100644
--- a/screen-common/src/main/java/com/moral/util/DateUtils.java
+++ b/screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -92,25 +92,139 @@
 
 
     /**
-     * @Description: ������������������������������������������������
+    * @Description: ���������������������������������
+            * @Param: [date]
+            * @return: java.util.Date
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    public static Date getHourlyStartTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.MINUTE,0);
+        cal.set(Calendar.SECOND,0);
+        return cal.getTime();
+    }
+
+    /**
+     * @Description: ���������������������������������
+     * @Param: [date]
+     * @return: java.util.Date
+     * @Author: ���������
+     * @Date: 2021/9/26
+     */
+    public static Date getHourlyEndTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.MINUTE,59);
+        cal.set(Calendar.SECOND,59);
+        return cal.getTime();
+    }
+
+    /**
+     * @Description: ������������������������������������
      * @Param: [date]
      * @return: java.util.List<java.util.Date>
      * @Author: ���������
      * @Date: 2021/9/8
      */
-    public static List<Date> dateToStartAndEndTime(Date date) {
+    public static Date getDailyStartTime(Date date) {
         String dateStr = dateToDateString(date, "yyyy-MM-dd");
         String startDateStr = dateStr + " 00:00:00";
-        String endDateStr = dateStr + " 23:59:59";
         Date startDate = getDate(startDateStr, "yyyy-MM-dd HH:mm:ss");
+        return startDate;
+    }
+
+    /** 
+    * @Description: ���������������������������������������
+            * @Param: [date]
+            * @return: java.util.Date
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */ 
+    public static Date getDailyEndTime(Date date) {
+        String dateStr = dateToDateString(date, "yyyy-MM-dd");
+        String endDateStr = dateStr + " 23:59:59";
         Date endDate = getDate(endDateStr, "yyyy-MM-dd HH:mm:ss");
-        ArrayList<Date> dates = new ArrayList<>();
-        dates.add(startDate);
-        dates.add(endDate);
-        return dates;
+        return endDate;
     }
 
 
+    /**
+    * @Description: ���������������������������������������������������
+            * @Param: [date]
+            * @return: java.util.Date
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    public static Date getWeeklyStartTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (1 ==  cal.get(Calendar.DAY_OF_WEEK)) {
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+        }
+        cal.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);
+        cal.set(Calendar.HOUR_OF_DAY,0);
+        cal.set(Calendar.MINUTE,0);
+        cal.set(Calendar.SECOND,0);
+        return cal.getTime();
+    }
+
+    /**
+    * @Description: ���������������������������������������������������������
+            * @Param: [date]
+            * @return: java.util.Date
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    public static Date getWeeklyEndTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        if (1 !=  cal.get(Calendar.DAY_OF_WEEK)) {
+            cal.add(Calendar.DAY_OF_MONTH, 7);
+        }
+        cal.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
+        cal.set(Calendar.HOUR_OF_DAY,23);
+        cal.set(Calendar.MINUTE,59);
+        cal.set(Calendar.SECOND,59);
+        return cal.getTime();
+    }
+
+    /**
+    * @Description: ���������������������������������������������������
+            * @Param: [date]
+            * @return: java.util.Date
+            * @Author: ���������
+            * @Date: 2021/9/26
+            */
+    public static Date getMonthlyStartTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.DAY_OF_MONTH,cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+        cal.set(Calendar.HOUR_OF_DAY,0);
+        cal.set(Calendar.MINUTE,0);
+        cal.set(Calendar.SECOND,0);
+        return cal.getTime();
+    }
+
+    /**
+     * @Description: ���������������������������������������������������������
+     * @Param: [date]
+     * @return: java.util.Date
+     * @Author: ���������
+     * @Date: 2021/9/26
+     */
+    public static Date getMonthlyEndTime(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        cal.set(Calendar.HOUR_OF_DAY,23);
+        cal.set(Calendar.MINUTE,59);
+        cal.set(Calendar.SECOND,59);
+        return cal.getTime();
+    }
+
+    
     /**
      * @Description: Date���toString������������Date
      * @Param: []
@@ -482,6 +596,7 @@
         return dateToDateString(now.getTime(), formatStr);
     }
 
+
     /**
      * ������������������day���������������(formatStr)������������
      *

--
Gitblit v1.8.0