|
|
@@ -1,11 +1,14 @@
|
|
|
package com.ruoyi.base.service.impl;
|
|
|
|
|
|
+import com.ruoyi.base.domain.Device;
|
|
|
import com.ruoyi.base.domain.WeatherDataStatistics;
|
|
|
import com.ruoyi.base.domain.WeatherRealtimeData;
|
|
|
+import com.ruoyi.base.mapper.DeviceMapper;
|
|
|
import com.ruoyi.base.mapper.WeatherRealtimeDataMapper;
|
|
|
import com.ruoyi.base.service.IWeatherRealtimeDataService;
|
|
|
import com.ruoyi.base.vo.WeatherDataStatisticsVo;
|
|
|
import com.ruoyi.common.core.utils.DateUtils;
|
|
|
+import com.ruoyi.common.core.utils.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.ObjectUtils;
|
|
|
@@ -29,6 +32,9 @@ public class WeatherRealtimeDataServiceImpl implements IWeatherRealtimeDataServi
|
|
|
@Autowired
|
|
|
private WeatherRealtimeDataMapper weatherRealtimeDataMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private DeviceMapper deviceMapper;
|
|
|
+
|
|
|
/**
|
|
|
* 查询气象站实时数据
|
|
|
*
|
|
|
@@ -279,6 +285,194 @@ public class WeatherRealtimeDataServiceImpl implements IWeatherRealtimeDataServi
|
|
|
return weatherDataStatisticsVo;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public WeatherDataStatisticsVo listWeatherJYHY(WeatherDataStatistics weatherRealtimeData) {
|
|
|
+ WeatherDataStatisticsVo vo = new WeatherDataStatisticsVo();
|
|
|
+ if (weatherRealtimeData == null
|
|
|
+ || weatherRealtimeData.getBeginCollectTime() == null
|
|
|
+ || weatherRealtimeData.getEndCollectTime() == null
|
|
|
+ || weatherRealtimeData.getParams() == null) {
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ Object plotIdObj = weatherRealtimeData.getParams().get("plotId");
|
|
|
+ if (StringUtils.isNull(plotIdObj) ) {
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+ Long plotId = Long.valueOf(plotIdObj.toString());
|
|
|
+
|
|
|
+ List<BigDecimal> maxTemp = new ArrayList<>();
|
|
|
+ List<BigDecimal> minTemp = new ArrayList<>();
|
|
|
+ List<Double> humidity = new ArrayList<>();
|
|
|
+ List<Double> rainfall = new ArrayList<>();
|
|
|
+ List<Double> wind = new ArrayList<>();
|
|
|
+ List<Double> soilN = new ArrayList<>();
|
|
|
+ List<Double> soilP = new ArrayList<>();
|
|
|
+ List<Double> soilK = new ArrayList<>();
|
|
|
+
|
|
|
+ // 时间处理
|
|
|
+ LocalDateTime startOfPreviousDay = LocalDateTime.of(
|
|
|
+ weatherRealtimeData.getBeginCollectTime().toLocalDate(),
|
|
|
+ LocalTime.MIDNIGHT
|
|
|
+ );
|
|
|
+ LocalDateTime endOfPreviousDay = LocalDateTime.of(
|
|
|
+ weatherRealtimeData.getEndCollectTime().toLocalDate(),
|
|
|
+ LocalTime.MAX);
|
|
|
+
|
|
|
+ weatherRealtimeData.setBeginCollectTime(startOfPreviousDay);
|
|
|
+ weatherRealtimeData.setEndCollectTime(endOfPreviousDay);
|
|
|
+
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M-d");
|
|
|
+ List<String> dateList = new ArrayList<>();
|
|
|
+ for (LocalDateTime date = startOfPreviousDay; !date.isAfter(endOfPreviousDay); date = date.plusDays(1)) {
|
|
|
+ dateList.add(date.format(formatter));
|
|
|
+ }
|
|
|
+ vo.setWeatherDate(dateList);
|
|
|
+
|
|
|
+
|
|
|
+ // 根据地块ID查出当前地块下的气象设备
|
|
|
+ List<Device> devices = deviceMapper.selectDeviceByField(plotId);
|
|
|
+
|
|
|
+ Optional<Device> weatherDeviceOpt = devices.stream()
|
|
|
+ .filter(d -> "4".equals(d.getDeviceTypeId()))
|
|
|
+ .findFirst();
|
|
|
+
|
|
|
+ if (!weatherDeviceOpt.isPresent()) {
|
|
|
+ return buildEmptyVo(vo, dateList.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ weatherRealtimeData.setDeviceId(weatherDeviceOpt.get().getDeviceId());
|
|
|
+
|
|
|
+ // 查询具体数据
|
|
|
+ List<WeatherDataStatistics> list =
|
|
|
+ weatherRealtimeDataMapper.selectWeatherStatisticsList(weatherRealtimeData);
|
|
|
+ Map<String, WeatherDataStatistics> map = list.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ s -> s.getDate().format(formatter),
|
|
|
+ s -> s,
|
|
|
+ (a, b) -> a
|
|
|
+ ));
|
|
|
+
|
|
|
+
|
|
|
+ // 填充数据
|
|
|
+ for (String date : dateList) {
|
|
|
+ WeatherDataStatistics data = map.get(date);
|
|
|
+
|
|
|
+ if (data == null) {
|
|
|
+ fillNull(maxTemp, minTemp, humidity, rainfall, wind, soilN, soilP, soilK);
|
|
|
+ } else {
|
|
|
+ maxTemp.add(data.getMaxTemperature());
|
|
|
+ minTemp.add(data.getMinTemperature());
|
|
|
+ humidity.add(data.getAvgHumidity());
|
|
|
+ rainfall.add(data.getAvgRainfall());
|
|
|
+ wind.add(data.getAvgWindSpeed());
|
|
|
+ soilN.add(data.getAvgSoilN());
|
|
|
+ soilP.add(data.getAvgSoilP());
|
|
|
+ soilK.add(data.getAvgSoilK());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal avgHumidityAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgHumidity)
|
|
|
+ .filter(d -> !Double.isNaN(d)) // 过滤掉无效值
|
|
|
+ .reduce(Double::sum)
|
|
|
+ .flatMap(sum -> !list.isEmpty() ?
|
|
|
+ Optional.of(BigDecimal.valueOf(sum / list.size())) : Optional.empty())
|
|
|
+ .map(avg -> avg.setScale(2, BigDecimal.ROUND_HALF_UP))
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+
|
|
|
+ BigDecimal avgTemperatureAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgTemperature) // 假设WeatherDataStatistics类中有getAvgTemperature方法
|
|
|
+ .filter(Objects::nonNull) // 过滤掉空值
|
|
|
+ .filter(temp -> temp.compareTo(BigDecimal.ZERO) >= 0) // 过滤掉无效值
|
|
|
+ .reduce(BigDecimal::add)
|
|
|
+ .flatMap(sum -> !list.isEmpty() ?
|
|
|
+ Optional.of(sum.divide(BigDecimal.valueOf(list.size()), 2, BigDecimal.ROUND_HALF_UP)) : Optional.empty())
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+
|
|
|
+ BigDecimal avgSoilNAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgSoilN)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(d -> !d.isNaN()) // 如果是Double类型
|
|
|
+ .map(BigDecimal::valueOf) // 转换为BigDecimal
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .divide(BigDecimal.valueOf(Math.max(1, list.size())), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal avgSoilPAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgSoilP)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(d -> !d.isNaN()) // 如果是Double类型
|
|
|
+ .map(BigDecimal::valueOf) // 转换为BigDecimal
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .divide(BigDecimal.valueOf(Math.max(1, list.size())), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ BigDecimal avgSoilKAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgSoilK)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(d -> !d.isNaN()) // 如果是Double类型
|
|
|
+ .map(BigDecimal::valueOf) // 转换为BigDecimal
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .divide(BigDecimal.valueOf(Math.max(1, list.size())), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ BigDecimal avgWindSpeedAverage = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getAvgWindSpeed)
|
|
|
+ .filter(d -> !Double.isNaN(d))
|
|
|
+ .reduce(Double::sum)
|
|
|
+ .flatMap(sum -> !list.isEmpty() ?
|
|
|
+ Optional.of(BigDecimal.valueOf(sum / list.size())) : Optional.empty())
|
|
|
+ .map(avg -> avg.setScale(2, BigDecimal.ROUND_HALF_UP))
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+
|
|
|
+ BigDecimal totalRainfallAccumulated = list.stream()
|
|
|
+ .map(WeatherDataStatistics::getDateRainfallA)
|
|
|
+ .filter(rainfalls -> rainfalls != null && rainfalls.compareTo(BigDecimal.ZERO) >= 0)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ WeatherRealtimeData weatherRealtimeDataVo = new WeatherRealtimeData();
|
|
|
+ weatherRealtimeDataVo.setHumidity(avgHumidityAverage);
|
|
|
+ weatherRealtimeDataVo.setTemperature(avgTemperatureAverage);
|
|
|
+ weatherRealtimeDataVo.setWindSpeed(avgWindSpeedAverage);
|
|
|
+ weatherRealtimeDataVo.setRainfallA(totalRainfallAccumulated);
|
|
|
+ weatherRealtimeDataVo.setSoilN(avgSoilNAverage);
|
|
|
+ weatherRealtimeDataVo.setSoilP(avgSoilPAverage);
|
|
|
+ weatherRealtimeDataVo.setSoilK(avgSoilKAverage);
|
|
|
+ vo.setWeatherRealtimeData(weatherRealtimeDataVo);
|
|
|
+
|
|
|
+
|
|
|
+ vo.setWeatherMaxTemperature(maxTemp);
|
|
|
+ vo.setWeatherMinTemperature(minTemp);
|
|
|
+ vo.setWeatherHumidity(humidity);
|
|
|
+ vo.setWeatherRainfall(rainfall);
|
|
|
+ vo.setWeatherWindSpeed(wind);
|
|
|
+ vo.setWeatherAvgSoilN(soilN);
|
|
|
+ vo.setWeatherAvgSoilP(soilP);
|
|
|
+ vo.setWeatherAvgSoilK(soilK);
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void fillNull(List<?>... lists) {
|
|
|
+ for (List list : lists) {
|
|
|
+ list.add(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private WeatherDataStatisticsVo buildEmptyVo(WeatherDataStatisticsVo vo, int size) {
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ fillNull(
|
|
|
+ vo.getWeatherMaxTemperature(),
|
|
|
+ vo.getWeatherMinTemperature(),
|
|
|
+ vo.getWeatherHumidity(),
|
|
|
+ vo.getWeatherRainfall(),
|
|
|
+ vo.getWeatherWindSpeed(),
|
|
|
+ vo.getWeatherAvgSoilN(),
|
|
|
+ vo.getWeatherAvgSoilP(),
|
|
|
+ vo.getWeatherAvgSoilK()
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
private WeatherDataStatisticsVo twentyFourHours(String deviceId) {
|
|
|
|
|
|
WeatherDataStatisticsVo weatherDataStatisticsVo = new WeatherDataStatisticsVo();
|