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