package com.moral.service.impl;
|
|
import java.math.BigDecimal;
|
import java.text.DecimalFormat;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
import com.moral.entity.MachineActivate;
|
import com.moral.mapper.HistoryMapper;
|
import com.moral.util.AQICalculation;
|
import com.moral.util.AQICalculation2;
|
import io.swagger.models.auth.In;
|
import org.apache.commons.collections.MapUtils;
|
import org.springframework.stereotype.Service;
|
|
import com.moral.entity.Device;
|
import com.moral.entity.Point;
|
import com.moral.entity.Sensor;
|
import com.moral.mapper.HistoryHourlyMapper;
|
import com.moral.mapper.SensorMapper;
|
import com.moral.service.DeviceService;
|
import com.moral.service.HistoryHourlyService;
|
import com.moral.service.SensorService;
|
|
import javax.annotation.Resource;
|
|
@Service
|
public class HistoryHourlyServiceImpl implements HistoryHourlyService {
|
@Resource
|
private HistoryHourlyMapper historyHourlyMapper;
|
|
@Resource
|
private HistoryMapper historyMapper;
|
|
@Resource
|
private DeviceService deviceService;
|
|
@Resource
|
private SensorService sensorService;
|
|
@Resource
|
private SensorMapper sensorMapper;
|
|
@Override
|
public Map<String, Object> getPollutionSourceData(Map<String, Object> parameters) throws Exception {
|
List<Sensor> sensors = sensorMapper.getSensorsByMac(parameters);
|
List<String> sensorKeys = new ArrayList<>();
|
for (Sensor sensor : sensors) {
|
sensorKeys.add(sensor.getSensorKey());
|
}
|
parameters.put("sensorKeys", sensorKeys);
|
Map<String, Object> pollutionSourceData = historyHourlyMapper.getPollutionSourceData(parameters);
|
if (MapUtils.isNotEmpty(pollutionSourceData)) {
|
Map<String, String> sensorsMap = sensorService.getSensorsMap(parameters);
|
String selectSensorKey = parameters.get("sensorKey").toString();
|
for (Map.Entry<String, String> s : sensorsMap.entrySet()) {
|
if (selectSensorKey.equals(s.getKey())) {
|
selectSensorKey = s.getValue();
|
}
|
}
|
pollutionSourceData.put("selectSensorKey", selectSensorKey);
|
}
|
return pollutionSourceData;
|
}
|
|
@Override
|
public Map<String, Object> getPollutionSourceDataByHour(Map<String, Object> parameters) throws Exception {
|
List<Sensor> sensors = sensorMapper.getSensorsByMac(parameters);
|
List<String> sensorKeys = new ArrayList<>();
|
for (Sensor sensor : sensors) {
|
sensorKeys.add(sensor.getSensorKey());
|
}
|
parameters.put("sensorKeys", sensorKeys);
|
Map<String, Object> pollutionSourceData = historyHourlyMapper.getPollutionSourceDataByHour(parameters);
|
if (MapUtils.isNotEmpty(pollutionSourceData)) {
|
Map<String, String> sensorsMap = sensorService.getSensorsMap(parameters);
|
String selectSensorKey = parameters.get("sensorKey").toString();
|
for (Map.Entry<String, String> s : sensorsMap.entrySet()) {
|
if (selectSensorKey.equals(s.getKey())) {
|
selectSensorKey = s.getValue();
|
}
|
}
|
pollutionSourceData.put("selectSensorKey", selectSensorKey);
|
}
|
return pollutionSourceData;
|
}
|
|
@Override
|
public Map<String, Object> getPollutionSourceDataAll(Map<String, Object> parameters) throws Exception {
|
List<Sensor> sensors = sensorMapper.getSensorsByMac(parameters);
|
List<String> sensorKeys = new ArrayList<>();
|
for (Sensor sensor : sensors) {
|
sensorKeys.add(sensor.getSensorKey());
|
}
|
parameters.put("sensorKeys", sensorKeys);
|
Map<String, Object> pollutionSourceData = historyHourlyMapper.getPollutionSourceDataAll(parameters);
|
if (MapUtils.isNotEmpty(pollutionSourceData)) {
|
Map<String, String> sensorsMap = sensorService.getSensorsMap(parameters);
|
String selectSensorKey = parameters.get("sensorKey").toString();
|
for (Map.Entry<String, String> s : sensorsMap.entrySet()) {
|
if (selectSensorKey.equals(s.getKey())) {
|
selectSensorKey = s.getValue();
|
}
|
}
|
pollutionSourceData.put("selectSensorKey", selectSensorKey);
|
}
|
return pollutionSourceData;
|
}
|
|
@Override
|
public String getTVOCByMac(String mac,String time,String sensor) {
|
return historyHourlyMapper.getTVOCByMac(mac,time,sensor);
|
}
|
|
@Override
|
public String getPressureByMac(String mac, String time) {
|
return historyHourlyMapper.getPressureByMac(mac,time);
|
}
|
|
@Override
|
public Map<String,Object> getDataByMac(String mac, String time) {
|
return historyHourlyMapper.getDataByMac(mac,time);
|
}
|
|
@Override
|
public List<Map<String, Object>> getDataByTimeSlot(String mac, String startTime, String endTime) throws Exception {
|
List<Map<String, Object>> resultMap = historyHourlyMapper.getDataByTimeSlot(mac,startTime,endTime);
|
return resultMap;
|
}
|
|
@Override
|
public List<Map> getDataByMacAndTime(Map param) {
|
String mac = param.get("mac").toString();
|
String sensor = param.get("sensor").toString();
|
String time = param.get("time").toString();
|
String[] times = time.split("、");
|
|
String time1=times[0].substring(0,8);
|
for (int i = 0; i <times.length ; i++) {
|
if (i!=0){
|
times[i]=time1+""+times[i];
|
}
|
}
|
List<List> lists = new ArrayList<List>();
|
List<Map> perList = new ArrayList<Map>();
|
try {
|
for (String perTime : times) {
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM
|
Date date = simpleDateFormat.parse(perTime);
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(date);
|
calendar.add(Calendar.DATE, 1);
|
Date date1 = calendar.getTime();
|
String date2 = simpleDateFormat.format(date1);
|
List<Map> list = historyHourlyMapper.getDataByMacAndTime(mac, sensor, perTime, date2);
|
List<Map> newList = new ArrayList<Map>();
|
for (int i = 0; i < 24; i++) {
|
Map map=new HashMap();
|
if (i < 10) {
|
map.put("time","0"+i);
|
map.put(sensor,"");
|
newList.add(map);
|
}else {
|
map.put("time",""+i);
|
map.put(sensor,"");
|
newList.add(map);
|
}
|
}
|
if (list.size() <= 24 && list.size() >= 0) {
|
for (int i = 0; i <list.size() ; i++) {
|
String timeS = list.get(i).get("time").toString().substring(11, 13);
|
for (Map map : newList) {
|
if (timeS.equals(map.get("time"))){
|
map.replace(sensor,"",list.get(i).get(sensor));
|
}
|
}
|
}
|
}
|
lists.add(newList);
|
}
|
|
for (int i = 0; i < 24; i++) {
|
Map<String, Object> map = new HashMap<>();
|
List iList = new ArrayList();
|
for (List<Map> list : lists) {
|
String timeS = list.get(i).get("time").toString();
|
if (i < 10) {
|
if (timeS.equals("0" + i)) {
|
iList.add(list.get(i).get(sensor));
|
} else {
|
iList.add("");
|
}
|
} else {
|
if (timeS.equals(i + "")) {
|
iList.add(list.get(i).get(sensor));
|
} else {
|
iList.add("");
|
}
|
}
|
}
|
map.put("values", iList);
|
map.put("time", i);
|
perList.add(map);
|
}
|
|
} catch (ParseException e) {
|
e.printStackTrace();
|
}
|
for (int i = 0; i <perList.size() ; i++) {
|
perList.get(i).replace("time",perList.get(i).get("time"),(Integer) perList.get(i).get("time")+1);
|
}
|
int j=0;
|
for (int i = 0; i <perList.size() ; i++) {
|
if (!((List)perList.get(i).get("values")).get(0).equals("")){
|
j=1;
|
}
|
}
|
if (j==0){
|
perList.clear();
|
}
|
return perList;
|
}
|
|
@Override
|
public List<Map> getDataAvbByMIdAndTime(String mId, String startTime, String endTime) {
|
List<Device> devicesByMonitorPointId = deviceService.getDevicesByMonitorPointId(Integer.valueOf(mId));
|
List<List> lists = new ArrayList<>();
|
List<List<Map<String,String>>> listArrayList = new ArrayList<>();
|
List<Map<String, Object>> dataAvbByMIdAndTime = historyHourlyMapper.getDataAvbByMIdAndTime(mId, startTime, endTime);
|
List<Map> mapList = new ArrayList<>();
|
for (Map<String, Object> stringStringMap : dataAvbByMIdAndTime) {
|
Map<String,String> map = new HashMap();
|
String s = stringStringMap.get("O3").toString();
|
Object time = stringStringMap.get("time");
|
map.put("O3",s);
|
map.put("time",time.toString());
|
mapList.add(map);
|
}
|
if (mapList.size()>=8){
|
List<Map<String,String>> mapList1 = new ArrayList<>();
|
for (int i = 7; i <=mapList.size()-1 ; i++) {
|
if (mapList.get(i).get("O3")!=null){
|
List<Integer> numList = new ArrayList();
|
Map<String,String> O3_8 = new HashMap<>();
|
for (int j =i; j<= mapList.size(); j--) {
|
if (j<0){
|
break;
|
}
|
numList.add(j);
|
if (numList.size()==8){
|
List e15 = new ArrayList();
|
for (int k = 0; k <numList.size() ; k++) {
|
String value = mapList.get(Integer.valueOf(numList.get(k))).get("O3").toString();
|
e15.add(value);
|
}
|
double sum =0;
|
for (Object o : e15) {
|
sum=sum+Double.parseDouble(o.toString());
|
}
|
Double avg1 = sum/e15.size();
|
int timeOfHour = numList.get(0);
|
if (timeOfHour==23){
|
timeOfHour=0;
|
}else {
|
timeOfHour=timeOfHour+1;
|
}
|
O3_8.put("time", String.valueOf(timeOfHour));
|
O3_8.put("O3-8h", String.valueOf(avg1));
|
mapList1.add(O3_8);
|
}else {
|
continue;
|
}
|
}
|
}
|
listArrayList.add(mapList1);
|
}
|
}
|
Double maxO3=0.0;
|
if(listArrayList.size()>0){
|
List<Map<String, String>> mapList1 = listArrayList.get(0);
|
List<Double> O3List = new ArrayList();
|
for (Map<String, String> stringStringMap : mapList1) {
|
O3List.add(Double.parseDouble(stringStringMap.get("O3-8h")));
|
}
|
|
maxO3 = Collections.max(O3List);
|
for (int i = 0; i <dataAvbByMIdAndTime.size() ; i++) {
|
dataAvbByMIdAndTime.get(i).put("O3-8h",null);
|
int time = Integer.parseInt(((Object)dataAvbByMIdAndTime.get(i).get("time")).toString().substring(11,13)) ;
|
for (int j = 0; j <mapList1.size() ; j++) {
|
int time1 = Integer.parseInt(mapList1.get(j).get("time").toString()) ;
|
if (time==time1){
|
Double O3_8h = Double.parseDouble(mapList1.get(j).get("O3-8h").toString());
|
dataAvbByMIdAndTime.get(i).put("O3-8h",new BigDecimal(O3_8h).setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue());
|
}
|
}
|
}
|
}
|
Map<String, Object> dailyAvgData = historyMapper.getDailyAvgData(mId, startTime);
|
if (dailyAvgData!=null){
|
dailyAvgData.put("maxO3-8h",new BigDecimal(maxO3).setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue());
|
dailyAvgData.put("time",startTime);
|
}
|
if (dataAvbByMIdAndTime.size()>24){
|
for (int i = 0; i <dataAvbByMIdAndTime.size()-1 ; i++) {
|
Map<String, Object> map =dataAvbByMIdAndTime.get(i);
|
Map<String, Object> map1 = AQICalculation2.hourlyAQI(map);
|
dataAvbByMIdAndTime.get(i).put("AQI",Double.parseDouble(map1.get("AQI").toString()));
|
if (Double.parseDouble(map1.get("AQI").toString())>=50){
|
String name = map1.get("maxSensor").toString();
|
dataAvbByMIdAndTime.get(i).put("首要污染物",name);
|
}else {
|
dataAvbByMIdAndTime.get(i).put("首要污染物","-");
|
}
|
}
|
}else {
|
for (int i = 0; i <dataAvbByMIdAndTime.size() ; i++) {
|
Map<String, Object> map =dataAvbByMIdAndTime.get(i);
|
Map<String, Object> map1 = AQICalculation2.hourlyAQI(map);
|
dataAvbByMIdAndTime.get(i).put("AQI",Double.parseDouble(map1.get("AQI").toString()));
|
if (Double.parseDouble(map1.get("AQI").toString())>=50){
|
String name = map1.get("maxSensor").toString();
|
dataAvbByMIdAndTime.get(i).put("首要污染物",name);
|
}else {
|
dataAvbByMIdAndTime.get(i).put("首要污染物","-");
|
}
|
}
|
}
|
Map<String, Object> dayAQI = AQICalculation2.dayAQI(dailyAvgData);
|
dailyAvgData.put("首要污染物",dayAQI.get("maxSensor"));
|
dailyAvgData.put("AQI",dayAQI.get("AQI"));
|
dataAvbByMIdAndTime.add(dataAvbByMIdAndTime.size(),dailyAvgData);
|
|
List<Map> finalList = new ArrayList<>();
|
for (int i = 0; i <dataAvbByMIdAndTime.size() ; i++) {
|
Map timeAndDate = new HashMap();
|
if (i!=dataAvbByMIdAndTime.size()-1){
|
String time = dataAvbByMIdAndTime.get(i).get("time").toString().substring(11,13);
|
dataAvbByMIdAndTime.get(i).remove("time");
|
timeAndDate.put("time",time);
|
timeAndDate.put("data",dataAvbByMIdAndTime.get(i));
|
finalList.add(timeAndDate);
|
}else {
|
String time = dataAvbByMIdAndTime.get(i).get("time").toString().substring(0,11);
|
dataAvbByMIdAndTime.get(i).remove("time");
|
timeAndDate.put("time",time);
|
timeAndDate.put("data",dataAvbByMIdAndTime.get(i));
|
finalList.add(timeAndDate);
|
}
|
}
|
return finalList;
|
}
|
|
@Override
|
public Point getDirPoint(Map<String, Object> parameters) throws Exception {
|
Map<String, Object> pollutionSourceData = getPollutionSourceDataByHour(parameters);
|
if (MapUtils.isEmpty(pollutionSourceData)) {
|
pollutionSourceData = getPollutionSourceDataAll(parameters);
|
}
|
String mac = parameters.get("mac").toString();
|
Device device = deviceService.getDeviceByMac(mac, false);
|
Point pointEnd = new Point();
|
if (MapUtils.isNotEmpty(pollutionSourceData)) {
|
if (pollutionSourceData.get("e18") != null && pollutionSourceData.get("e23") != null) {
|
double windSpeed = Double.valueOf(pollutionSourceData.get("e18").toString());
|
double winDir = Double.valueOf(pollutionSourceData.get("e23").toString());
|
double distance = windSpeed * 3600;
|
double long1 = device.getLongitude();
|
double lat1 = device.getLatitude();
|
String[] result = calLocationByDistanceAndLocationAndDirection(winDir, long1, lat1, distance);
|
pointEnd.setLng(Double.valueOf(result[0]));
|
pointEnd.setLat(Double.valueOf(result[1]));
|
}
|
}
|
return pointEnd;
|
}
|
|
|
/**
|
* 根据一点的坐标与距离,以及方向,计算另外一点的位置
|
*
|
* @param angle 角度,从正北顺时针方向开始计算
|
* @param startLong 起始点经度
|
* @param startLat 起始点纬度
|
* @param distance 距离,单位m
|
* @return
|
*/
|
private String[] calLocationByDistanceAndLocationAndDirection(double angle, double startLong, double startLat, double distance) {
|
/** 地球半径 **/
|
final double R = 6371e3;
|
/** 180° **/
|
final DecimalFormat df = new DecimalFormat("0.000000");
|
String[] result = new String[2];
|
//将距离转换成经度的计算公式
|
double δ = distance / R;
|
// 转换为radian,否则结果会不正确
|
angle = Math.toRadians(angle);
|
startLong = Math.toRadians(startLong);
|
startLat = Math.toRadians(startLat);
|
double lat = Math.asin(Math.sin(startLat) * Math.cos(δ) + Math.cos(startLat) * Math.sin(δ) * Math.cos(angle));
|
double lng = startLong + Math.atan2(Math.sin(angle) * Math.sin(δ) * Math.cos(startLat), Math.cos(δ) - Math.sin(startLat) * Math.sin(lat));
|
// 转为正常的10进制经纬度
|
lng = Math.toDegrees(lng);
|
lat = Math.toDegrees(lat);
|
result[0] = df.format(lng);
|
result[1] = df.format(lat);
|
return result;
|
}
|
|
}
|