From 73c9bf4f63aaa04c60bde8174d590169b3ae8aa7 Mon Sep 17 00:00:00 2001 From: lizijie <lzjiiie@163.com> Date: Fri, 12 Nov 2021 15:47:41 +0800 Subject: [PATCH] 判断时间,修改臭氧8小时滑动平均值 --- screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 277 insertions(+), 9 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java index 0ee5973..da4cbef 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java @@ -1,25 +1,35 @@ package com.moral.api.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.ISqlSegment; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList; +import com.moral.api.config.mybatis.MybatisPlusConfig; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; +import com.moral.api.entity.HistoryHourly; import com.moral.api.entity.MonitorPoint; import com.moral.api.mapper.HistoryFiveMinutelyMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.pojo.dto.Wind.WindData; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.api.service.MonitorPointService; import com.moral.constant.RedisConstants; +import com.moral.constant.SeparateTableType; +import com.moral.util.DateUtils; +import com.moral.util.MybatisPLUSUtils; +import io.lettuce.core.GeoCoordinates; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * <p> @@ -36,6 +46,8 @@ MonitorPointService monitorPointService; @Autowired RedisTemplate redisTemplate; + @Autowired + HistoryFiveMinutelyMapper historyFiveMinutelyMapper; @Override public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) { @@ -56,17 +68,273 @@ for (Device device : devices) { DeviceAndFiveMinuteDataDTO dto = new DeviceAndFiveMinuteDataDTO(); String mac = device.getMac(); + //������������������ Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac); - Map<String,Object> value = new HashMap<>(); - if (sensorValues!=null&&sensorValues.get(sensorCode) != null) - value.put(sensorCode,sensorValues.get(sensorCode)); + //������������������������������������ + if (ObjectUtils.isEmpty(sensorValues)) { + HistoryFiveMinutely dbHistoryFiveMinutely = queryLastDataByMac(mac); + if (ObjectUtils.isEmpty(dbHistoryFiveMinutely)) + continue; + else + sensorValues = JSON.parseObject(dbHistoryFiveMinutely.getValue(),Map.class); + } + String dbDataStr = JSON.toJSONString(sensorValues); + sensorValues = JSON.parseObject(dbDataStr, HashMap.class); + Map<String, Object> sensorValue = new HashMap<>(); + if (sensorValues != null && sensorValues.get(sensorCode) != null) + sensorValue.put(sensorCode, sensorValues.get(sensorCode)); else - value.put(sensorCode,null); + sensorValue.put(sensorCode, null); dto.setDevice(device); - dto.setSensorValue(value); + dto.setSensorValue(sensorValue); dtos.add(dto); } return dtos; } + @Override + public HistoryFiveMinutely queryLastDataByMac(String mac) { + QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mac", mac); + queryWrapper.orderByDesc("time"); + queryWrapper.last("limit 0,1"); + //��������������������� + Date date = new Date(); + List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(date, date, SeparateTableType.MONTH); + List<HistoryFiveMinutely> datas = multiTableQuery(queryWrapper, tableNames); + if (ObjectUtils.isEmpty(datas)) + return null; + return datas.get(0); + } + + + @Override + public List<Object> getAreaWindData(Map<String, Object> params) { + String timeUnits = DateUtils.dateToDateString(new Date(), DateUtils.yyyyMM_EN); + params.put("timeUnits", timeUnits); + //������������ + List<WindData> windData = historyFiveMinutelyMapper.getAreaWindData(params); + return getWindData(windData); + } + + + /** + * ������������������������������������������ + * + * @param geoCoordinateList + * @return + */ + public Map<String, Double> getCenterPoint(List<GeoCoordinates> geoCoordinateList) { + int total = geoCoordinateList.size(); + double X = 0, Y = 0, Z = 0; + for (GeoCoordinates g : geoCoordinateList) { + double lat, lon, x, y, z; + lat = (double) g.getY() * Math.PI / 180; + lon = (double) g.getX() * Math.PI / 180; + x = Math.cos(lat) * Math.cos(lon); + y = Math.cos(lat) * Math.sin(lon); + z = Math.sin(lat); + X += x; + Y += y; + Z += z; + } + + X = X / total; + Y = Y / total; + Z = Z / total; + double Lon = Math.atan2(Y, X); + double Hyp = Math.sqrt(X * X + Y * Y); + double Lat = Math.atan2(Z, Hyp); + + Map<String, Double> map = new HashMap<>(); + map.put("lng", Lon * 180 / Math.PI); + map.put("lat", Lat * 180 / Math.PI); + return map; + } + + public List<Object> getWindData(List<WindData> windData) { + List<GeoCoordinates> points = new ArrayList<>(); + int length = 2000; + int perdlen = 200; + Double loma = 0d; + Double lomi = 0d; + Double lama = 0d; + Double lami = 0d; + List<Double> loList = new ArrayList<>(); + List<Double> laList = new ArrayList<>(); + Double U; + Double V; + //��������� + List<Object> list = new ArrayList<>(); + List<Map<String, Object>> mapList = new ArrayList<>(); + for (WindData data : windData) { + Double longitude = data.getLongitude(); + Double latitude = data.getLatitude(); + GeoCoordinates geoCoordinates = GeoCoordinates.create(longitude, latitude); + points.add(geoCoordinates); + loList.add(longitude); + laList.add(latitude); + + Map<String, Object> map = new HashMap<>(); + Double windDir = data.getWindDir(); + Double windSpeed = data.getWindSpeed(); + if (windDir == null) { + windDir = 0d; + windSpeed = 0d; + } + double dir = (360.0 - (windDir + 180.0) * Math.PI / 180.0); + U = windSpeed * Math.cos(dir); + V = windSpeed * Math.sin(dir); + map.put("lo", longitude); + map.put("la", latitude); + map.put("U", U); + map.put("V", V); + mapList.add(map); + } + + //������������������������������������������������ + Map<String, Double> centerPoint = getCenterPoint(points); + + if (loList.size() > 0) { + loma = Collections.max(loList); + lomi = Collections.min(loList); + } + if (laList.size() > 0) { + lama = Collections.max(laList); + lami = Collections.min(laList); + } + Map<String, Object> laLaMap = new HashMap<>(); + laLaMap.put("maxLo", loma); + laLaMap.put("minLo", lomi); + laLaMap.put("maxLa", lama); + laLaMap.put("minLa", lami); + + Double lo1 = lomi - length * 0.00001141; + Double lo2 = loma + length * 0.00001141; + Double la2 = lami - length * 0.00000899; + Double la1 = lama + length * 0.00000899; + + double dx = 0.00001141 * perdlen; + double dy = 0.00000899 * perdlen; + int nx = (int) Math.floor((lo2 - lo1) / dx); + int ny = (int) Math.floor((la1 - la2) / dy); + + + List<Double> uList = new ArrayList<>(); + List<Double> vList = new ArrayList<>(); + int x; + int y; + + for (int i = 0; i < mapList.size(); i++) { + Double lo = (Double) mapList.get(i).get("lo"); + Double la = (Double) mapList.get(i).get("la"); + x = (int) Math.floor((lo - lo1) / dx); + y = Math.abs((int) Math.floor((la - la1) / dy)); + U = (Double) mapList.get(i).get("U"); + V = (Double) mapList.get(i).get("V"); + if (i == 0) { + for (int j = 0; j < nx * ny; j++) { + uList.add(0.0); + vList.add(0.0); + } + } + for (int j = 0; j < nx * ny; j++) { + if (i == 0) { + if ((y >= 2 && j == (y) * nx + x)) { + int k; + for (k = j - 2 * nx; k <= j + 2 * nx; k = k + nx) { + uList.set(k, U); + uList.set(k - 1, U); + uList.set(k - 2, U); + uList.set(k + 1, U); + uList.set(k + 2, U); + vList.set(k, V); + vList.set(k - 1, V); + vList.set(k - 2, V); + vList.set(k + 1, V); + vList.set(k + 2, V); + } + } + } else { + if (y >= 1 && j == y * nx + x) { + int k; + for (k = j - 2 * nx; k <= j + 2 * nx; ) { + uList.set(k - 1, U); + uList.set(k - 2, U); + uList.set(k + 1, U); + uList.set(k + 2, U); + vList.set(k - 1, V); + vList.set(k - 2, V); + vList.set(k + 1, V); + vList.set(k + 2, V); + k = k + nx; + } + uList.set(j, U); + vList.set(j, V); + } + } + } + } + String uData = "\"" + "data" + "\"" + ": " + uList; + String vData = "\"" + "data" + "\"" + ": " + vList; + + String header1 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 2 + + ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy + + ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 + + ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 + + ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; + + String header2 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 3 + + ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy + + ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 + + ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 + + ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; + + + String s1 = "[" + "{" + header1 + ", " + uData + "}" + ", " + "{" + header2 + ", " + vData + "}" + "]"; + JSONArray jsonArray = JSONArray.parseArray(s1); + + list.add(jsonArray); + list.add(centerPoint.get("lng")); + list.add(centerPoint.get("lat")); + list.add(laLaMap); + return list; + } + + /** + * @Description: ���������������������������mac��������� + * @Param: [mac, startDate, endDate] + * @return: java.util.List<com.moral.api.entity.HistoryHourly> + * @Author: ��������� + * @Date: 2021/9/23 + */ + public List<HistoryFiveMinutely> getValueByMacAndTime(String mac, Date startDate, Date endDate) { + QueryWrapper<HistoryFiveMinutely> wrapper = new QueryWrapper<>(); + wrapper.eq("mac", mac); + wrapper.between("time", startDate, endDate); + List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(startDate, endDate, SeparateTableType.MONTH); + List<HistoryFiveMinutely> datas = multiTableQuery(wrapper, tableNames); + return datas; + } + + + /** + * @Description: ������������������������������������������������wrapper��������������� + * @Param: [wrapper, tableNames] + * @return: java.util.List<com.moral.api.entity.HistoryHourly> + * @Author: ��������� + * @Date: 2021/9/23 + */ + private List<HistoryFiveMinutely> multiTableQuery(QueryWrapper<HistoryFiveMinutely> wrapper, List<String> tableNames) { + List<HistoryFiveMinutely> result = new ArrayList<>(); + for (String tableName : tableNames) { + MybatisPlusConfig.tableName.set(tableName); + List<HistoryFiveMinutely> datas = historyFiveMinutelyMapper.selectList(wrapper); + result.addAll(datas); + } + MybatisPlusConfig.tableName.remove(); + return result; + } + + } -- Gitblit v1.8.0