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 devices = deviceService.getDevicesByMonitorPointId(monitorPointId); Map deviceMap = new HashMap<>(); List macs = new ArrayList<>(); devices.forEach(value -> { macs.add(value.getMac()); deviceMap.put(value.getMac(), value); }); //如果报表类型是null,则为自定义。用开始结束时间查询日表 if (reportType == null) { Map> macDataMap = new HashMap<>();//key为mac macs.forEach(value -> { List 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> macDataMap, Map deviceMap, Date startDate, Date endDate) { List dtos = new ArrayList<>(); macDataMap.forEach((key, value) -> { MonitorPointDataDisplayDTO dto = new MonitorPointDataDisplayDTO(); //获取设备名称 String deviceName = deviceMap.get(key).getName(); //获取组织名称 String orgName = organizationService.getOrganizationById(deviceMap.get(key).getOrganizationId()).getName(); //拼接时间 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 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); dto.setDeviceName(deviceName); dto.setTime(time); dto.setOrganizationName(orgName); }); } }