kaiyu
2021-09-27 2a781bbf1d42191c3b8225a9973bf3d0ecccd66b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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);
 
 
        });
    }
 
 
 
}