| | |
| | | /* |
| | | * 风向code |
| | | * */ |
| | | public static final String SENSOR_CODE_WIND_DIR = "a01008"; |
| | | public static final String SENSOR_CODE_WIND_DIR = "a01007"; |
| | | |
| | | /* |
| | | * 风速code |
| | |
| | | /* |
| | | * 一氧化碳code |
| | | * */ |
| | | public static final String SENSOR_CODE_CO= "a21005"; |
| | | public static final String SENSOR_CODE_CO = "a21005"; |
| | | |
| | | /* |
| | | * PM2.5 code |
| | | * */ |
| | | public static final String SENSOR_CODE_PM25= "a34004"; |
| | | public static final String SENSOR_CODE_PM25 = "a34004"; |
| | | |
| | | /* |
| | | * PM10 code |
| | | * */ |
| | | public static final String SENSOR_CODE_PM10= "a34002"; |
| | | public static final String SENSOR_CODE_PM10 = "a34002"; |
| | | |
| | | /* |
| | | * SO2 code |
| | | * */ |
| | | public static final String SENSOR_CODE_SO2= "a21026"; |
| | | public static final String SENSOR_CODE_SO2 = "a21026"; |
| | | |
| | | /* |
| | | * NO2 code |
| | | * */ |
| | | public static final String SENSOR_CODE_NO2= "a21004"; |
| | | public static final String SENSOR_CODE_NO2 = "a21004"; |
| | | |
| | | /** The Constant NULL_VALUE. */ |
| | | /** |
| | | * The Constant NULL_VALUE. |
| | | */ |
| | | public static final String NULL_VALUE = "N/V"; |
| | | |
| | | //数据有效的标记位,有效 |
| | | public static final String MARKER_BIT_TRUE = "N"; |
| | | |
| | | //数据有效的标记位,有效性不足 |
| | | public static final String MARKER_BIT_FALSE = "H"; |
| | | |
| | | //数据中各个传感器代表标记位的key后缀 |
| | | public static final String MARKER_BIT_KEY = "-Flag"; |
| | | |
| | | |
| | | } |
| | |
| | | package com.moral.util; |
| | | |
| | | import org.springframework.util.ObjectUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * @param list 参数,[value={"O3":12},.....] |
| | | * @param params 参数,包含数据data,类型type,下限upper,上限lower |
| | | * @return 功能:臭氧日均值计算 |
| | | */ |
| | | public static Object getO3AvgOfDay(List<Map<String, Object>> list) { |
| | | public static Map<String, Object> getO3AvgOfDay(Map<String, Object> params) { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | List<Map<String, Object>> list = (List<Map<String, Object>>) params.get("data"); |
| | | Object upper = params.get("o3Upper"); |
| | | Object lower = params.get("o3Lower"); |
| | | double max; |
| | | List<Double> avgs = new ArrayList<>(); |
| | | for (int i = 8; i <= 24; i++) { |
| | |
| | | for (Map<String, Object> dataMap : list) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | Double o3 = Double.parseDouble(dataValue.get(Constants.SENSOR_CODE_O3).toString()); |
| | | |
| | | //O3数据标记位 |
| | | Object flag = dataValue.get(Constants.SENSOR_CODE_O3 + Constants.MARKER_BIT_KEY); |
| | | //剔除有效性不足的数据 |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | continue; |
| | | } |
| | | |
| | | //剔除超过上下限的数据 |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (o3 < (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (o3 > (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | int hour = DateUtils.getHour((Date) dataMap.get("time")); |
| | | if (hour == 0) { |
| | | hour = 24; |
| | |
| | | max = avgs.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getMax(); |
| | | if (avgs.size() < 14) { |
| | | if (max < 160d) { |
| | | return null; |
| | | return result; |
| | | } |
| | | } |
| | | return sciCal(max, 4); |
| | | result.put(Constants.SENSOR_CODE_O3, sciCal(max, 4)); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * @param list 参数,[value={"风速":12,”风向“:200},.....] |
| | | * @param params 参数 |
| | | * @return 功能:风向均值计算 |
| | | */ |
| | | public static Object getWindDirAvg(List<Map<String, Object>> list) { |
| | | public static Map<String, Object> getWindDirAvg(Map<String, Object> params) { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | List<Map<String, Object>> data = (List<Map<String, Object>>) params.get("data"); |
| | | String type = params.get("type").toString(); |
| | | Object windDirUpper = params.get("windDirUpper"); |
| | | Object windDirLower = params.get("windDirLower"); |
| | | Object windSpeedUpper = params.get("windSpeedUpper"); |
| | | Object windSpeedLower = params.get("windSpeedLower"); |
| | | |
| | | double avgDir; |
| | | double sumSin = 0d; |
| | | double sumCos = 0d; |
| | | int size = 0; |
| | | for (Map<String, Object> map : list) { |
| | | for (Map<String, Object> map : data) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) map.get("value"), Map.class); |
| | | Object wind = dataValue.get(Constants.SENSOR_CODE_WIND_DIR); |
| | | Object speed = dataValue.get(Constants.SENSOR_CODE_WIND_SPEED); |
| | | if (wind == null || speed == null) { |
| | | Object flagDir = dataValue.get(Constants.SENSOR_CODE_WIND_DIR + Constants.MARKER_BIT_KEY); |
| | | Object flagSpeed = dataValue.get(Constants.SENSOR_CODE_WIND_SPEED + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flagDir) || !Constants.MARKER_BIT_TRUE.equals(flagSpeed)) { |
| | | continue; |
| | | } |
| | | size++; |
| | | |
| | | if (ObjectUtils.isEmpty(wind) || ObjectUtils.isEmpty(speed)) { |
| | | continue; |
| | | } |
| | | double windDir = Double.parseDouble(wind.toString()); |
| | | double windSpeed = Double.parseDouble(speed.toString()); |
| | | |
| | | //剔除风速和风向超过上下限范围的数据 |
| | | if (!ObjectUtils.isEmpty(windDirUpper)) { |
| | | if (windDir < (Double) windDirUpper) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | if (!ObjectUtils.isEmpty(windDirLower)) { |
| | | if (windDir > (Double) windDirLower) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | if (!ObjectUtils.isEmpty(windSpeedUpper)) { |
| | | if (windSpeed < (Double) windSpeedUpper) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | if (!ObjectUtils.isEmpty(windSpeedLower)) { |
| | | if (windSpeed > (Double) windSpeedLower) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | size++; |
| | | double sin = windSpeed * Math.sin(windDir / 180d) * Math.PI; |
| | | double cos = windSpeed * Math.cos(windDir / 180d) * Math.PI; |
| | | sumSin += sin; |
| | | sumCos += cos; |
| | | } |
| | | if (size == 0) { |
| | | return null; |
| | | return result; |
| | | } |
| | | |
| | | double avgSin = sumSin / size; |
| | | double avgCos = sumCos / size; |
| | | if (avgSin > 0 && avgCos > 0) { |
| | |
| | | } else { |
| | | avgDir = Math.atan(avgSin / avgCos) * 180 / Math.PI + 360; |
| | | } |
| | | return sciCal(avgDir, 4); |
| | | double v = sciCal(avgDir, 4); |
| | | result.put(Constants.SENSOR_CODE_WIND_DIR, v); |
| | | if ("hour".equals(type)) { |
| | | //有效值>=45个,打标记位 N,<45打H H:有效性不足 |
| | | if (size >= 45) { |
| | | result.put(Constants.SENSOR_CODE_WIND_DIR + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_TRUE); |
| | | } else { |
| | | result.put(Constants.SENSOR_CODE_WIND_DIR + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_FALSE); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | //一氧化碳周月均值计算 |
| | | public static Object getCOAvgOfWeekOrMonth(List<Map<String, Object>> list) { |
| | | public static Map<String, Object> getCOAvgOfWeekOrMonth(Map<String, Object> params) { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | List<Map<String, Object>> list = (List<Map<String, Object>>) params.get("data"); |
| | | Object upper = params.get("coUpper"); |
| | | Object lower = params.get("coLower"); |
| | | |
| | | List<Double> data = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : list) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | Object o = dataValue.get(Constants.SENSOR_CODE_CO); |
| | | if (o == null) { |
| | | Object flag = dataValue.get(Constants.SENSOR_CODE_CO + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | continue; |
| | | } |
| | | if (ObjectUtils.isEmpty(o)) { |
| | | continue; |
| | | } |
| | | Double co = Double.parseDouble(o.toString()); |
| | | //剔除超过上下限的数据 |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (co < (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (co > (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | data.add(co); |
| | | } |
| | | if (data.size() == 0) { |
| | | return null; |
| | | return result; |
| | | } |
| | | return percentile(data, 95); |
| | | result.put(Constants.SENSOR_CODE_CO, percentile(data, 95)); |
| | | return result; |
| | | } |
| | | |
| | | //臭氧周月均值计算 |
| | | public static Object getO3AvgOfWeekOrMonth(List<Map<String, Object>> list) { |
| | | public static Map<String, Object> getO3AvgOfWeekOrMonth(Map<String, Object> params) { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | List<Map<String, Object>> list = (List<Map<String, Object>>) params.get("data"); |
| | | Object upper = params.get("o3Upper"); |
| | | Object lower = params.get("o3Lower"); |
| | | List<Double> data = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : list) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | Object o = dataValue.get(Constants.SENSOR_CODE_O3); |
| | | if (o == null) { |
| | | Object flag = dataValue.get(Constants.SENSOR_CODE_O3 + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | continue; |
| | | } |
| | | if (ObjectUtils.isEmpty(o)) { |
| | | continue; |
| | | } |
| | | Double o3 = Double.parseDouble(o.toString()); |
| | | //剔除超过上下限的数据 |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (o3 < (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (o3 > (Double) upper) { |
| | | continue; |
| | | } |
| | | } |
| | | data.add(o3); |
| | | } |
| | | if (data.size() == 0) { |
| | | return null; |
| | | return result; |
| | | } |
| | | return percentile(data, 90); |
| | | result.put(Constants.SENSOR_CODE_O3, percentile(data, 90)); |
| | | return result; |
| | | } |
| | | } |
| | |
| | | Date end = DateUtils.dataToTimeStampTime(now, format); |
| | | //因子 |
| | | QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); |
| | | sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper); |
| | | sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Sensor> sensors = sensorService.list(sensorQueryWrapper); |
| | | |
| | | //获取所有设备小时数据 |
| | | QueryWrapper<HistoryHourly> historyHourlyQueryWrapper = new QueryWrapper<>(); |
| | |
| | | //中间变量,用于计算除臭氧外其它因子 |
| | | List<Map<String, Object>> tempValue = new ArrayList<>(value); |
| | | |
| | | //移除第一天数据(0点的),O3滑动值第一天数据是从1点-8点 |
| | | value.removeIf(map -> ((Date) map.get("time")).getTime() == start.getTime()); |
| | | |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("data", value); |
| | | params.put("type", "day"); |
| | | for (Sensor sensor : sensors) { |
| | | String sensorCode = sensor.getCode(); |
| | | |
| | | //O3上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_O3)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("o3Upper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("o3Lower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | //风向上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windDirUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windDirLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | //风速上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windSpeedUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windSpeedLower", sensor.getLower()); |
| | | } |
| | | } |
| | | } |
| | | //臭氧8小时滑动平均值计算并修约 |
| | | Object o3AvgOfDay = AmendUtils.getO3AvgOfDay(value); |
| | | if (o3AvgOfDay != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_O3, o3AvgOfDay); |
| | | Map<String, Object> o3AvgOfDay = AmendUtils.getO3AvgOfDay(params); |
| | | if (!ObjectUtils.isEmpty(o3AvgOfDay)) { |
| | | jsonMap.putAll(o3AvgOfDay); |
| | | } |
| | | //除臭氧外其他因子均值计算 |
| | | tempValue.removeIf(map -> ((Date) map.get("time")).getTime() == end.getTime()); |
| | | tempValue.removeIf(o -> ((Date) o.get("time")).getTime() == end.getTime()); |
| | | |
| | | //风向均值计算并修约 |
| | | Object windDirAvg = AmendUtils.getWindDirAvg(value); |
| | | if (windDirAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg); |
| | | params.put("data", tempValue); |
| | | |
| | | Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(params); |
| | | if (!ObjectUtils.isEmpty(windDirAvg)) { |
| | | jsonMap.putAll(windDirAvg); |
| | | } |
| | | |
| | | sensorCodes.forEach(sensorCode -> { |
| | | sensors.forEach(sensor -> { |
| | | String sensorCode = sensor.getCode(); |
| | | Double upper = sensor.getUpper(); |
| | | Double lower = sensor.getLower(); |
| | | OptionalDouble optionalDouble = tempValue.parallelStream() |
| | | .flatMapToDouble(v -> { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); |
| | | Object sensorValue = dataValue.get(sensorCode.toString()); |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | Object sensorValue = dataValue.get(sensorCode); |
| | | //数据有效性标记位 |
| | | Object flag = dataValue.get(sensorCode + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | return null; |
| | | } |
| | | |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | System.out.println(456); |
| | | return null; |
| | | } |
| | | |
| | | //O3单独计算 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_O3)) { |
| | | return null; |
| | | } |
| | | return DoubleStream.of(Double.parseDouble(sensorValue.toString())); |
| | | |
| | | //剔除数据超过上下限的数据 |
| | | double aDouble = Double.parseDouble(sensorValue.toString()); |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (aDouble < upper) { |
| | | return null; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (aDouble > lower) { |
| | | return null; |
| | | } |
| | | } |
| | | if ("a00e12".equals(sensorCode)) { |
| | | System.out.println(key + "==" + sensorCode + "==" + v.get("time") + "==" + aDouble); |
| | | } |
| | | |
| | | return DoubleStream.of(aDouble); |
| | | }).average(); |
| | | if (optionalDouble.isPresent()) { |
| | | //银行家算法修约 |
| | | double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode.toString(), sciCal); |
| | | jsonMap.put(sensorCode, sciCal); |
| | | } |
| | | }); |
| | | dataMap.put("value", JSONObject.toJSONString(jsonMap)); |
| | |
| | | //时间格式化:yyyy-MM-dd HH:mm |
| | | String format = DateUtils.yyyy_MM_dd_HH_mm_EN; |
| | | Date now = new Date(); |
| | | //从数据库获取数据参数 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | //开始时间 |
| | | Date start = DateUtils.dataToTimeStampTime(DateUtils.getDateOfMin(now, -5), format); |
| | |
| | | params.put("timeUnits", timeUnits); |
| | | |
| | | //因子 |
| | | QueryWrapper<Sensor> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Object> sensorCodes = sensorService.listObjs(queryWrapper); |
| | | QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); |
| | | sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Sensor> sensors = sensorService.list(sensorQueryWrapper); |
| | | |
| | | //获取所有设备的5分钟内的数据 |
| | | List<Map<String, Object>> fiveMinutelyData = historyMinutelyMapper.getHistoryMinutelyData(params); |
| | |
| | | dataMap.put("time", end); |
| | | Map<String, Object> jsonMap = new HashMap<>(); |
| | | |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("data", value); |
| | | map.put("type", "fiveMinutes"); |
| | | for (Sensor sensor : sensors) { |
| | | String sensorCode = sensor.getCode(); |
| | | |
| | | //风向上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) { |
| | | if (sensor.getUpper() != null) { |
| | | map.put("windDirUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | map.put("windDirLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | //风速上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) { |
| | | if (sensor.getUpper() != null) { |
| | | map.put("windSpeedUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | map.put("windSpeedLower", sensor.getLower()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //风向均值计算并修约 |
| | | Object windDirAvg = AmendUtils.getWindDirAvg(value); |
| | | if (windDirAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg); |
| | | Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(map); |
| | | if (!ObjectUtils.isEmpty(windDirAvg)) { |
| | | jsonMap.putAll(windDirAvg); |
| | | } |
| | | |
| | | //除风向外其他因子均值计算 |
| | | sensorCodes.forEach(sensorCode -> { |
| | | OptionalDouble optionalDouble = value.parallelStream() |
| | | sensors.forEach(sensor -> { |
| | | String sensorCode = sensor.getCode(); |
| | | Double upper = sensor.getUpper(); |
| | | Double lower = sensor.getLower(); |
| | | DoubleStream optionalDouble = value.parallelStream() |
| | | .flatMapToDouble(v -> { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); |
| | | Object sensorValue = dataValue.get(sensorCode.toString()); |
| | | Object sensorValue = dataValue.get(sensorCode); |
| | | //数据有效性标记位 |
| | | Object flag = dataValue.get(sensorCode + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | return null; |
| | | } |
| | | |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | return null; |
| | | } |
| | | //风向另外计算 |
| | | //风向单独计算 |
| | | if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | return DoubleStream.of(Double.parseDouble(sensorValue.toString())); |
| | | }).average(); |
| | | if (optionalDouble.isPresent()) { |
| | | //剔除数据超过上下限的数据 |
| | | double aDouble = Double.parseDouble(sensorValue.toString()); |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (aDouble < upper) { |
| | | return null; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (aDouble > lower) { |
| | | return null; |
| | | } |
| | | } |
| | | return DoubleStream.of(aDouble); |
| | | }); |
| | | |
| | | OptionalDouble average = optionalDouble.average(); |
| | | if (average.isPresent()) { |
| | | //银行家算法修约 |
| | | double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode.toString(), sciCal); |
| | | double sciCal = AmendUtils.sciCal(average.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode, sciCal); |
| | | } |
| | | |
| | | }); |
| | | dataMap.put("value", JSONObject.toJSONString(jsonMap)); |
| | | //存入redis |
| | |
| | | import java.util.Map; |
| | | import java.util.OptionalDouble; |
| | | import java.util.Set; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.DoubleStream; |
| | | |
| | |
| | | }); |
| | | } |
| | | |
| | | Map<String, Object> params = new HashMap<>(); |
| | | |
| | | //开始时间 |
| | | String dateString = DateUtils.getDateStringOfHour(-1, format); |
| | | Date start = DateUtils.getDate(dateString, format); |
| | |
| | | |
| | | //因子 |
| | | QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); |
| | | sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper); |
| | | sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Sensor> sensors = sensorService.list(sensorQueryWrapper); |
| | | |
| | | //从数据库数据库获取数据的参数 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("timeUnits", timeUnits); |
| | | params.put("start", start); |
| | | params.put("end", end); |
| | |
| | | historyHourly.setTime(end); |
| | | Map<String, Object> jsonMap = new HashMap<>(); |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("data", value); |
| | | map.put("type", "hour"); |
| | | |
| | | for (Sensor sensor : sensors) { |
| | | String sensorCode = sensor.getCode(); |
| | | |
| | | //风向上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) { |
| | | if (sensor.getUpper() != null) { |
| | | map.put("windDirUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | map.put("windDirLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | //风速上下限 |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) { |
| | | if (sensor.getUpper() != null) { |
| | | map.put("windSpeedUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | map.put("windSpeedLower", sensor.getLower()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //风向均值计算并修约 |
| | | Object windDirAvg = AmendUtils.getWindDirAvg(value); |
| | | if (windDirAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg); |
| | | Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(map); |
| | | if (!ObjectUtils.isEmpty(windDirAvg)) { |
| | | jsonMap.putAll(windDirAvg); |
| | | } |
| | | |
| | | //除风向外其他因子均值计算 |
| | | sensorCodes.forEach(sensorCode -> { |
| | | OptionalDouble optionalDouble = value.parallelStream() |
| | | sensors.forEach(sensor -> { |
| | | String sensorCode = sensor.getCode(); |
| | | Double upper = sensor.getUpper(); |
| | | Double lower = sensor.getLower(); |
| | | AtomicInteger size = new AtomicInteger(); |
| | | DoubleStream optionalDouble = value.parallelStream() |
| | | .flatMapToDouble(v -> { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); |
| | | Object sensorValue = dataValue.get(sensorCode.toString()); |
| | | Object sensorValue = dataValue.get(sensorCode); |
| | | //数据有效性标记位 |
| | | Object flag = dataValue.get(sensorCode + Constants.MARKER_BIT_KEY); |
| | | if (!Constants.MARKER_BIT_TRUE.equals(flag)) { |
| | | return null; |
| | | } |
| | | |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | return null; |
| | | } |
| | | //风向另外计算 |
| | | |
| | | //风向单独计算 |
| | | if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | return DoubleStream.of(Double.parseDouble(sensorValue.toString())); |
| | | }).average(); |
| | | if (optionalDouble.isPresent()) { |
| | | |
| | | //剔除数据超过上下限的数据 |
| | | double aDouble = Double.parseDouble(sensorValue.toString()); |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (aDouble < upper) { |
| | | return null; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (aDouble > lower) { |
| | | return null; |
| | | } |
| | | } |
| | | size.getAndIncrement(); |
| | | return DoubleStream.of(aDouble); |
| | | }); |
| | | OptionalDouble average = optionalDouble.average(); |
| | | if (average.isPresent()) { |
| | | //银行家算法修约 |
| | | double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode.toString(), sciCal); |
| | | double sciCal = AmendUtils.sciCal(average.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode, sciCal); |
| | | //标志位 |
| | | if (size.get() >= 45) { |
| | | jsonMap.put(sensorCode + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_TRUE); |
| | | } else { |
| | | jsonMap.put(sensorCode + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_FALSE); |
| | | } |
| | | } |
| | | }); |
| | | historyHourly.setValue(JSONObject.toJSONString(jsonMap)); |
| | |
| | | Date end = DateUtils.addMonths(start, 1); |
| | | //因子 |
| | | QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); |
| | | sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper); |
| | | sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Sensor> sensors = sensorService.list(sensorQueryWrapper); |
| | | |
| | | //获取所有设备日数据 |
| | | QueryWrapper<HistoryDaily> historyDailyQueryWrapper = new QueryWrapper<>(); |
| | |
| | | dataMap.put("time", start); |
| | | |
| | | //风向均值计算并修约 |
| | | Object windDirAvg = AmendUtils.getWindDirAvg(value); |
| | | if (windDirAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg); |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("data", value); |
| | | params.put("type", "month"); |
| | | for (Sensor sensor : sensors) { |
| | | String sensorCode = sensor.getCode(); |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windDirUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windDirLower", sensor.getLower()); |
| | | } |
| | | } |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windSpeedUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windSpeedLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_CO)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("coUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("coLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_O3)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("o3Upper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("o3Lower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(params); |
| | | if (!ObjectUtils.isEmpty(windDirAvg)) { |
| | | jsonMap.putAll(windDirAvg); |
| | | } |
| | | |
| | | //CO 95百分位计算并修约 |
| | | Object coAvg = AmendUtils.getCOAvgOfWeekOrMonth(value); |
| | | if (coAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_CO, coAvg); |
| | | Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); |
| | | if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { |
| | | jsonMap.putAll(coAvgOfWeekOrMonth); |
| | | } |
| | | |
| | | //O3 90百分位计算并修约 |
| | | Object o3Avg = AmendUtils.getO3AvgOfWeekOrMonth(value); |
| | | if (o3Avg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_O3, o3Avg); |
| | | Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); |
| | | if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { |
| | | jsonMap.putAll(o3AvgOfWeekOrMonth); |
| | | } |
| | | |
| | | sensorCodes.forEach(sensorCode -> { |
| | | sensors.forEach(sensor -> { |
| | | String sensorCode = sensor.getCode(); |
| | | Double upper = sensor.getUpper(); |
| | | Double lower = sensor.getLower(); |
| | | OptionalDouble optionalDouble = value.parallelStream() |
| | | .flatMapToDouble(v -> { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); |
| | | Object sensorValue = dataValue.get(sensorCode.toString()); |
| | | Object sensorValue = dataValue.get(sensorCode); |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | return null; |
| | | } |
| | |
| | | if (Constants.SENSOR_CODE_O3.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | return DoubleStream.of(Double.parseDouble(sensorValue.toString())); |
| | | //剔除数据超过上下限的数据 |
| | | double aDouble = Double.parseDouble(sensorValue.toString()); |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (aDouble < upper) { |
| | | return null; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (aDouble > lower) { |
| | | return null; |
| | | } |
| | | } |
| | | return DoubleStream.of(aDouble); |
| | | }).average(); |
| | | if (optionalDouble.isPresent()) { |
| | | //银行家算法修约 |
| | | double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode.toString(), sciCal); |
| | | jsonMap.put(sensorCode, sciCal); |
| | | } |
| | | }); |
| | | dataMap.put("value", JSONObject.toJSONString(jsonMap)); |
| | |
| | | Date end = DateUtils.addDays(start, 7); |
| | | //因子 |
| | | QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); |
| | | sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper); |
| | | sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE); |
| | | List<Sensor> sensors = sensorService.list(sensorQueryWrapper); |
| | | |
| | | //获取所有设备日数据 |
| | | QueryWrapper<HistoryDaily> historyDailyQueryWrapper = new QueryWrapper<>(); |
| | |
| | | dataMap.put("time", start); |
| | | |
| | | //风向均值计算并修约 |
| | | Object windDirAvg = AmendUtils.getWindDirAvg(value); |
| | | if (windDirAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg); |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("data", value); |
| | | params.put("type", "week"); |
| | | for (Sensor sensor : sensors) { |
| | | String sensorCode = sensor.getCode(); |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windDirUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windDirLower", sensor.getLower()); |
| | | } |
| | | } |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("windSpeedUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("windSpeedLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_CO)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("coUpper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("coLower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | if (sensorCode.equals(Constants.SENSOR_CODE_O3)) { |
| | | if (sensor.getUpper() != null) { |
| | | params.put("o3Upper", sensor.getUpper()); |
| | | } |
| | | if (sensor.getLower() != null) { |
| | | params.put("o3Lower", sensor.getLower()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(params); |
| | | if (!ObjectUtils.isEmpty(windDirAvg)) { |
| | | jsonMap.putAll(windDirAvg); |
| | | } |
| | | |
| | | //CO 95百分位计算并修约 |
| | | Object coAvg = AmendUtils.getCOAvgOfWeekOrMonth(value); |
| | | if (coAvg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_CO, coAvg); |
| | | Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); |
| | | if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { |
| | | jsonMap.putAll(coAvgOfWeekOrMonth); |
| | | } |
| | | |
| | | //O3 90百分位计算并修约 |
| | | Object o3Avg = AmendUtils.getO3AvgOfWeekOrMonth(value); |
| | | if (o3Avg != null) { |
| | | jsonMap.put(Constants.SENSOR_CODE_O3, o3Avg); |
| | | Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); |
| | | if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { |
| | | jsonMap.putAll(o3AvgOfWeekOrMonth); |
| | | } |
| | | |
| | | sensorCodes.forEach(sensorCode -> { |
| | | sensors.forEach(sensor -> { |
| | | String sensorCode = sensor.getCode(); |
| | | Double upper = sensor.getUpper(); |
| | | Double lower = sensor.getLower(); |
| | | OptionalDouble optionalDouble = value.parallelStream() |
| | | .flatMapToDouble(v -> { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); |
| | | Object sensorValue = dataValue.get(sensorCode.toString()); |
| | | Object sensorValue = dataValue.get(sensorCode); |
| | | if (ObjectUtils.isEmpty(sensorValue)) { |
| | | return null; |
| | | } |
| | | //风向另外计算 |
| | | //风向单独计算 |
| | | if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | //CO另外计算 |
| | | //CO单独计算 |
| | | if (Constants.SENSOR_CODE_CO.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | //O3另外计算 |
| | | //O3单独计算 |
| | | if (Constants.SENSOR_CODE_O3.equals(sensorCode)) { |
| | | return null; |
| | | } |
| | | return DoubleStream.of(Double.parseDouble(sensorValue.toString())); |
| | | |
| | | //剔除数据超过上下限的数据 |
| | | double aDouble = Double.parseDouble(sensorValue.toString()); |
| | | if (!ObjectUtils.isEmpty(upper)) { |
| | | if (aDouble < upper) { |
| | | return null; |
| | | } |
| | | } |
| | | if (!ObjectUtils.isEmpty(lower)) { |
| | | if (aDouble > lower) { |
| | | return null; |
| | | } |
| | | } |
| | | return DoubleStream.of(aDouble); |
| | | }).average(); |
| | | if (optionalDouble.isPresent()) { |
| | | //银行家算法修约 |
| | | double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); |
| | | jsonMap.put(sensorCode.toString(), sciCal); |
| | | jsonMap.put(sensorCode, sciCal); |
| | | } |
| | | }); |
| | | dataMap.put("value", JSONObject.toJSONString(jsonMap)); |