710 lines
25 KiB
Java
710 lines
25 KiB
Java
package com.gunshi.project.ss.service;
|
||
|
||
import cn.hutool.core.bean.BeanUtil;
|
||
import com.gunshi.project.ss.common.util.LocalDateTimeConverter;
|
||
import com.gunshi.project.ss.entity.so.StPptnSo;
|
||
import com.gunshi.project.ss.entity.so.WeatherSo;
|
||
import com.gunshi.project.ss.entity.vo.*;
|
||
import com.gunshi.project.ss.mapper.RealRainMapper;
|
||
import com.gunshi.project.ss.common.mapper.StPptnRMapper;
|
||
import com.gunshi.project.ss.model.StPptnRD;
|
||
import com.gunshi.project.ss.common.model.StPptnRReal;
|
||
import jakarta.annotation.Resource;
|
||
import lombok.SneakyThrows;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.text.SimpleDateFormat;
|
||
import java.time.LocalDateTime;
|
||
import java.time.ZoneId;
|
||
import java.time.temporal.ChronoUnit;
|
||
import java.util.*;
|
||
import java.util.stream.Collectors;
|
||
import java.util.stream.IntStream;
|
||
|
||
/**
|
||
* Description:
|
||
* Created by wanyan on 2024/7/8
|
||
*
|
||
* @author wanyan
|
||
* @version 1.0
|
||
*/
|
||
@Service
|
||
@Slf4j
|
||
public class RainBasinDivisionService {
|
||
|
||
@Autowired
|
||
private RealRainMapper realRainMapper;
|
||
|
||
@Autowired
|
||
private StPptnRMapper stPptnRMapper;
|
||
|
||
@Resource
|
||
private StStbprpBService stStbprpBAutoDao;
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每小时的雨量
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public List<StPptnVo> queryStPptnPerHourByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
String stcd = stPptnSo.getStcd();
|
||
List<StPptnVo> stPptnVos = realRainMapper.queryStPptnPerHourByStcdAndStartTimeAndEndTime(stcd, stPptnSo.getStartTime(), stPptnSo.getEndTime());
|
||
SimpleDateFormat df = new SimpleDateFormat("MM-dd HH:mm");
|
||
for (StPptnVo stPptnVo : stPptnVos) {
|
||
Date time = stPptnVo.getTime();
|
||
stPptnVo.setTimeStr(df.format(time));
|
||
}
|
||
return stPptnVos;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每小时的雨量统计
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public CartogramVo queryStPptnPerHourChartByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
//实测
|
||
List<StPptnVo> stPptnVos1 = queryStPptnPerHourNowByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
//累计
|
||
List<StPptnVo> stPptnVos2 = queryStPptnPerHourSumByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
|
||
CartogramVo cartogramVo = new CartogramVo();
|
||
List<String> time = new ArrayList<>();
|
||
List<BigDecimal> actual = new ArrayList<>();
|
||
List<BigDecimal> total = new ArrayList<>();
|
||
for (StPptnVo stPptnVo : stPptnVos1) {
|
||
time.add(stPptnVo.getTimeStr());
|
||
actual.add(stPptnVo.getSumDrp());
|
||
}
|
||
for (StPptnVo stPptnVo : stPptnVos2) {
|
||
total.add(stPptnVo.getSumDrp());
|
||
}
|
||
cartogramVo.setTime(time);
|
||
cartogramVo.setActual(actual);
|
||
cartogramVo.setTotal(total);
|
||
return cartogramVo;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每小时的实测雨量
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public List<StPptnVo> queryStPptnPerHourNowByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
List<StPptnVo> stPptnVos = queryStPptnPerHourByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
Collections.reverse(stPptnVos);
|
||
return stPptnVos;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每小时的累计雨量
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public List<StPptnVo> queryStPptnPerHourSumByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
List<StPptnVo> stPptnVos = queryStPptnPerHourNowByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
BigDecimal sumdrp = BigDecimal.valueOf(0);
|
||
for (StPptnVo stPptnVo : stPptnVos) {
|
||
sumdrp = sumdrp.add(stPptnVo.getSumDrp());
|
||
stPptnVo.setSumDrp(sumdrp);
|
||
}
|
||
return stPptnVos;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每天的雨量
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
@SneakyThrows
|
||
public List<StPptnVo> queryStPptnPerDayByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
String stcd = stPptnSo.getStcd();
|
||
|
||
Date stm = stPptnSo.getStartTime();
|
||
Date etm = stPptnSo.getEndTime();
|
||
Date now = new Date();
|
||
if (etm.getTime() > now.getTime()) etm = now;
|
||
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
|
||
stm = df.parse(df.format(stm));
|
||
etm = df.parse(df.format(etm));
|
||
Calendar cal = Calendar.getInstance();
|
||
|
||
List<StPptnVo> stPptnVos = new ArrayList<>();
|
||
while (etm.getTime() >= stm.getTime()) {
|
||
cal.setTime(stm);
|
||
StPptnVo stPptnVo = new StPptnVo();
|
||
stPptnVo.setTime(stm);
|
||
stPptnVo.setTimeStr(df.format(stm));
|
||
int year = cal.get(Calendar.YEAR);
|
||
|
||
StPptnRD pptnrd = realRainMapper.getStPptnRD(
|
||
stcd, stm, year
|
||
);
|
||
if (pptnrd != null) {
|
||
stPptnVo.setSumDrp(pptnrd.getDrp());
|
||
}
|
||
stPptnVos.add(stPptnVo);
|
||
|
||
cal.add(Calendar.DAY_OF_MONTH, 1);
|
||
stm = cal.getTime();
|
||
}
|
||
return stPptnVos;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每天的雨量统计
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public CartogramVo queryStPptnPerDayChartChartByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
//实测
|
||
List<StPptnVo> stPptnVos1 = queryStPptnPerDayByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
//累计
|
||
List<StPptnVo> stPptnVos2 = queryStPptnPerDaySumByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
|
||
CartogramVo cartogramVo = new CartogramVo();
|
||
List<String> time = new ArrayList<>();
|
||
List<BigDecimal> actual = new ArrayList<>();
|
||
List<BigDecimal> total = new ArrayList<>();
|
||
for (StPptnVo stPptnVo : stPptnVos1) {
|
||
time.add(stPptnVo.getTimeStr());
|
||
actual.add(stPptnVo.getSumDrp());
|
||
}
|
||
for (StPptnVo stPptnVo : stPptnVos2) {
|
||
total.add(stPptnVo.getSumDrp());
|
||
}
|
||
cartogramVo.setTime(time);
|
||
cartogramVo.setActual(actual);
|
||
cartogramVo.setTotal(total);
|
||
return cartogramVo;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询时间段内每天的累计雨量
|
||
*
|
||
* @param stPptnSo 雨量站降雨量查询参数
|
||
* @return
|
||
*/
|
||
public List<StPptnVo> queryStPptnPerDaySumByStcdAndStartTimeAndEndTime(StPptnSo stPptnSo) {
|
||
List<StPptnVo> stPptnVos = queryStPptnPerDayByStcdAndStartTimeAndEndTime(stPptnSo);
|
||
BigDecimal sumdrp = BigDecimal.valueOf(0);
|
||
for (StPptnVo stPptnVo : stPptnVos) {
|
||
if (stPptnVo.getSumDrp() != null){
|
||
sumdrp = sumdrp.add(stPptnVo.getSumDrp());
|
||
}
|
||
stPptnVo.setSumDrp(sumdrp);
|
||
}
|
||
return stPptnVos;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码查询详细雨量情况
|
||
*
|
||
* @param stcd 测站编码
|
||
* @return
|
||
*/
|
||
public StPptnDetailsVo queryStPptnDetailsByStcd(String stcd) {
|
||
// StPptnRStat stPptnRStat = stPptnRStatMapper.queryStPptnRStatByStcd(stcd);
|
||
StPptnRReal stPptnRReal = realRainMapper.queryPptnByStcd(stcd);
|
||
|
||
StPptnDetailsVo stPptnDetailsVo = new StPptnDetailsVo();
|
||
if (stPptnRReal != null){
|
||
BeanUtil.copyProperties(stPptnRReal, stPptnDetailsVo);
|
||
Date tm = stPptnRReal.getTm();
|
||
LocalDateTime nowTime = LocalDateTime.now();
|
||
LocalDateTime latestTime = LocalDateTime.ofInstant(tm.toInstant(), ZoneId.systemDefault());
|
||
|
||
boolean isToday = latestTime.toLocalDate().equals(nowTime.toLocalDate());
|
||
|
||
if(!isToday){
|
||
stPptnDetailsVo.setH1(null);
|
||
stPptnDetailsVo.setH3(null);
|
||
stPptnDetailsVo.setH6(null);
|
||
stPptnDetailsVo.setH12(null);
|
||
stPptnDetailsVo.setH24(null);
|
||
stPptnDetailsVo.setH48(null);
|
||
stPptnDetailsVo.setDrp(null);
|
||
stPptnDetailsVo.setToday(null);
|
||
}
|
||
}else {
|
||
stPptnDetailsVo.setStcd(stcd);
|
||
}
|
||
Date date = new Date();
|
||
|
||
// //今日雨量
|
||
BigDecimal todayDrp = queryTodayDrpByStcdAndTime(stcd, date);
|
||
if (todayDrp == null) {
|
||
stPptnDetailsVo.setTodayDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setTodayDrp(todayDrp);
|
||
}
|
||
|
||
//昨日雨量
|
||
BigDecimal yesterdayDrp = queryYesterdayDrpByStcdAndTime(stcd, date);
|
||
if (yesterdayDrp == null) {
|
||
stPptnDetailsVo.setYesterdayDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setYesterdayDrp(yesterdayDrp);
|
||
}
|
||
|
||
//本月降雨量
|
||
BigDecimal monthDay = queryMonthDrpByStcdAndTime(stcd, date);
|
||
if (monthDay == null) {
|
||
stPptnDetailsVo.setMonthDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setMonthDrp(monthDay);
|
||
}
|
||
|
||
//本年降雨量
|
||
BigDecimal yearDrp = queryYearDrpByStcdAndTime(stcd, date);
|
||
if (yearDrp == null) {
|
||
stPptnDetailsVo.setYearDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setYearDrp(yearDrp);
|
||
}
|
||
|
||
//本年天数
|
||
Long yearDay = countYearDay(date);
|
||
stPptnDetailsVo.setYearDay(yearDay);
|
||
|
||
Map<String, Object> map = queryYearDrpDayAndMaxDrpAndMaxDrpTimeByStcdAndTime(stcd, date);
|
||
|
||
//本年降雨天数
|
||
Long yearDrpDay = (Long) map.get("count");
|
||
stPptnDetailsVo.setYearDrpDay(yearDrpDay);
|
||
|
||
//本年最大日雨量
|
||
BigDecimal maxDrp = (BigDecimal) map.get("maxDrp");
|
||
stPptnDetailsVo.setMaxDrp(maxDrp);
|
||
|
||
//本年最大日雨量时间
|
||
Date maxDrpTime =(Date) map.get("maxDrpTime");
|
||
stPptnDetailsVo.setMaxDrpTime(maxDrpTime);
|
||
return stPptnDetailsVo;
|
||
}
|
||
|
||
@Autowired
|
||
private StStbprpBService stStbprpBService;
|
||
|
||
@Autowired
|
||
private ForecastService forecastService;
|
||
|
||
public List<StPptnDetailsVo> queryStPptnDetailsByStcdList() {
|
||
List<StStatusVo> stStatusVos = stStbprpBService.rainList();
|
||
List<StPptnDetailsVo> res = new ArrayList<>();
|
||
for (StStatusVo stStatusVo : stStatusVos) {
|
||
String stcd = stStatusVo.getStcd();
|
||
StPptnRReal stPptnRReal = realRainMapper.queryPptnByStcd(stcd);
|
||
|
||
StPptnDetailsVo stPptnDetailsVo = new StPptnDetailsVo();
|
||
if (stPptnRReal != null){
|
||
BeanUtil.copyProperties(stPptnRReal, stPptnDetailsVo);
|
||
Date tm = stPptnRReal.getTm();
|
||
LocalDateTime nowTime = LocalDateTime.now();
|
||
LocalDateTime latestTime = LocalDateTime.ofInstant(tm.toInstant(), ZoneId.systemDefault());
|
||
|
||
boolean isToday = latestTime.toLocalDate().equals(nowTime.toLocalDate());
|
||
|
||
if(!isToday){
|
||
stPptnDetailsVo.setH1(null);
|
||
stPptnDetailsVo.setH3(null);
|
||
stPptnDetailsVo.setH6(null);
|
||
stPptnDetailsVo.setH12(null);
|
||
stPptnDetailsVo.setH24(null);
|
||
stPptnDetailsVo.setH48(null);
|
||
stPptnDetailsVo.setDrp(null);
|
||
stPptnDetailsVo.setToday(null);
|
||
}
|
||
}else {
|
||
stPptnDetailsVo.setStcd(stcd);
|
||
}
|
||
Date date = new Date();
|
||
|
||
// //今日雨量
|
||
BigDecimal todayDrp = queryTodayDrpByStcdAndTime(stcd, date);
|
||
if (todayDrp == null) {
|
||
stPptnDetailsVo.setTodayDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setTodayDrp(todayDrp);
|
||
}
|
||
|
||
//昨日雨量
|
||
BigDecimal yesterdayDrp = queryYesterdayDrpByStcdAndTime(stcd, date);
|
||
if (yesterdayDrp == null) {
|
||
stPptnDetailsVo.setYesterdayDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setYesterdayDrp(yesterdayDrp);
|
||
}
|
||
|
||
//本月降雨量
|
||
BigDecimal monthDay = queryMonthDrpByStcdAndTime(stcd, date);
|
||
if (monthDay == null) {
|
||
stPptnDetailsVo.setMonthDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setMonthDrp(monthDay);
|
||
}
|
||
|
||
//本年降雨量
|
||
BigDecimal yearDrp = queryYearDrpByStcdAndTime(stcd, date);
|
||
if (yearDrp == null) {
|
||
stPptnDetailsVo.setYearDrp(null);
|
||
} else {
|
||
stPptnDetailsVo.setYearDrp(yearDrp);
|
||
}
|
||
|
||
//本年天数
|
||
Long yearDay = countYearDay(date);
|
||
stPptnDetailsVo.setYearDay(yearDay);
|
||
|
||
Map<String, Object> map = queryYearDrpDayAndMaxDrpAndMaxDrpTimeByStcdAndTime(stcd, date);
|
||
|
||
//本年降雨天数
|
||
Long yearDrpDay = (Long) map.get("count");
|
||
stPptnDetailsVo.setYearDrpDay(yearDrpDay);
|
||
|
||
//本年最大日雨量
|
||
BigDecimal maxDrp = (BigDecimal) map.get("maxDrp");
|
||
stPptnDetailsVo.setMaxDrp(maxDrp);
|
||
|
||
//本年最大日雨量时间
|
||
Date maxDrpTime =(Date) map.get("maxDrpTime");
|
||
stPptnDetailsVo.setMaxDrpTime(maxDrpTime);
|
||
|
||
//降雨预测数据
|
||
WeatherSo weatherSo = new WeatherSo();
|
||
String tm;
|
||
LocalDateTime now = LocalDateTime.now();
|
||
int hour = now.getHour();
|
||
if(hour < 8){
|
||
// 使用昨日20时的tm
|
||
LocalDateTime yesterday20 = now.minusDays(1).withHour(20).withMinute(0).withSecond(0);
|
||
tm = formatTm(yesterday20);
|
||
}else if(hour > 8 && hour < 20){
|
||
// 使用今日08时的tm
|
||
LocalDateTime today08 = now.withHour(8).withMinute(0).withSecond(0);
|
||
tm = formatTm(today08);
|
||
}else{
|
||
// 使用今日20时的tm
|
||
LocalDateTime today20 = now.withHour(20).withMinute(0).withSecond(0);
|
||
tm = formatTm(today20);
|
||
}
|
||
weatherSo.setTm(tm);
|
||
try {
|
||
List<ForeRainVo> fore = forecastService.fore(weatherSo);
|
||
if(fore != null && !fore.isEmpty()){
|
||
fore.stream().forEach(o ->{
|
||
if(o.getStcd().equals(stcd)){
|
||
Double h24 = o.getH24();
|
||
stPptnDetailsVo.setForce24hDrp(h24 == null?null:new BigDecimal(h24.toString()));
|
||
}
|
||
});
|
||
}
|
||
} catch (Exception e) {
|
||
//接口不知道是好的还是坏的,反正这个接口坏了别影响其它的接口
|
||
e.printStackTrace();
|
||
}
|
||
|
||
res.add(stPptnDetailsVo);
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* 格式化时间为YYYYMMDDHH格式
|
||
*/
|
||
private String formatTm(LocalDateTime dateTime) {
|
||
return String.format("%04d%02d%02d%02d",
|
||
dateTime.getYear(),
|
||
dateTime.getMonthValue(),
|
||
dateTime.getDayOfMonth(),
|
||
dateTime.getHour());
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码和时间查看今日降雨量
|
||
*
|
||
* @param stcd 测站编码
|
||
* @param time 当前时间
|
||
* @return 今日降雨量
|
||
*/
|
||
public BigDecimal queryTodayDrpByStcdAndTime(String stcd, Date time) {
|
||
LocalDateTime now = LocalDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault());
|
||
LocalDateTime startTime;
|
||
LocalDateTime endTime;
|
||
|
||
// 如果当前时间大于等于8:00,则从今日8:00开始计算
|
||
if (now.getHour() >= 8) {
|
||
startTime = LocalDateTime.of(
|
||
now.getYear(),
|
||
now.getMonthValue(),
|
||
now.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
endTime = now;
|
||
} else {
|
||
// 如果当前时间小于8:00,则从昨日8:00开始计算到今日8:00
|
||
// 因为今日8:00之前的降雨量实际上属于昨日的统计
|
||
LocalDateTime yesterday = now.minusDays(1);
|
||
startTime = LocalDateTime.of(
|
||
yesterday.getYear(),
|
||
yesterday.getMonthValue(),
|
||
yesterday.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
endTime = LocalDateTime.of(
|
||
now.getYear(),
|
||
now.getMonthValue(),
|
||
now.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
}
|
||
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(
|
||
stcd,
|
||
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
|
||
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant())
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码和时间查看昨日降雨量
|
||
*
|
||
* @param stcd 测站编码
|
||
* @param time 当前时间
|
||
* @return 昨日降雨量
|
||
*/
|
||
public BigDecimal queryYesterdayDrpByStcdAndTime(String stcd, Date time) {
|
||
LocalDateTime now = LocalDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault());
|
||
LocalDateTime startTime;
|
||
LocalDateTime endTime;
|
||
LocalDateTime yesterday = now.minusDays(1);
|
||
if (now.getHour() >= 8) {
|
||
startTime = LocalDateTime.of(
|
||
yesterday.getYear(),
|
||
yesterday.getMonthValue(),
|
||
yesterday.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
endTime = LocalDateTime.of(
|
||
now.getYear(),
|
||
now.getMonthValue(),
|
||
now.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
} else {
|
||
endTime = endTime = LocalDateTime.of(
|
||
yesterday.getYear(),
|
||
yesterday.getMonthValue(),
|
||
yesterday.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
yesterday = yesterday.minusDays(1);
|
||
startTime = LocalDateTime.of(
|
||
yesterday.getYear(),
|
||
yesterday.getMonthValue(),
|
||
yesterday.getDayOfMonth(),
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
}
|
||
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(
|
||
stcd,
|
||
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
|
||
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant())
|
||
);
|
||
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码和时间查看本月降雨量
|
||
*
|
||
* @param stcd 测站编码
|
||
* @param time 当前时间
|
||
* @return 本月降雨量
|
||
*/
|
||
public BigDecimal queryMonthDrpByStcdAndTime(String stcd, Date time) {
|
||
LocalDateTime now = LocalDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault());
|
||
LocalDateTime startTime;
|
||
LocalDateTime endTime;
|
||
if (now.getHour() >= 8 || (now.getHour() < 8 && now.getDayOfMonth() > 1)) {
|
||
startTime = LocalDateTime.of(
|
||
now.getYear(),
|
||
now.getMonthValue(),
|
||
1,
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
endTime = now;
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(
|
||
stcd,
|
||
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
|
||
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant())
|
||
);
|
||
|
||
}
|
||
BigDecimal monthdrp = BigDecimal.valueOf(0);
|
||
return monthdrp;
|
||
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码和时间查看本年降雨量
|
||
*
|
||
* @param stcd 测站编码
|
||
* @param time 当前时间
|
||
* @return 本年降雨量
|
||
*/
|
||
public BigDecimal queryYearDrpByStcdAndTime(String stcd, Date time) {
|
||
LocalDateTime now = LocalDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault());
|
||
LocalDateTime startTime;
|
||
LocalDateTime endTime;
|
||
if (now.getHour() >= 8 || (now.getHour() < 8 && now.getMonthValue() > 1) || (now.getHour() < 8 && now.getMonthValue() == 1 && now.getDayOfMonth() >= 1)) {
|
||
startTime = LocalDateTime.of(
|
||
now.getYear(),
|
||
1,
|
||
1,
|
||
8,
|
||
0,
|
||
0
|
||
);
|
||
endTime = now;
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(
|
||
stcd,
|
||
Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
|
||
Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant())
|
||
);
|
||
}
|
||
BigDecimal monthDrp = BigDecimal.valueOf(0);
|
||
return monthDrp;
|
||
}
|
||
|
||
/**
|
||
* 根据测站编码和时间查询本年降雨天数、本年最大日雨量、本年最大日雨量时间
|
||
*
|
||
* @param stcd 测站编码
|
||
* @param time 当前时间
|
||
* @return 本年降雨天数、本年最大日雨量、本年最大日雨量时间
|
||
*/
|
||
public Map<String, Object> queryYearDrpDayAndMaxDrpAndMaxDrpTimeByStcdAndTime(String stcd, Date time) {
|
||
Date now = new Date();
|
||
Date startTime = new Date(now.getYear(), 0, 1, 8, 0, 0);
|
||
|
||
BigDecimal maxDrp = BigDecimal.valueOf(0);
|
||
Date maxDrpTime = startTime;
|
||
Long count = 0L;
|
||
Map<String, Object> map = new HashMap<>();
|
||
map.put("count", count);
|
||
map.put("maxDrp", maxDrp);
|
||
map.put("maxDrpTime", maxDrpTime);
|
||
|
||
// QueryWrapper<StStbprpB> queryWrapper = new QueryWrapper<>();
|
||
// queryWrapper.eq(StStbprpB.COL_STCD,stcd);
|
||
|
||
// StStbprpB stStbprpB = stStbprpBAutoDao.getOne(queryWrapper);
|
||
StPptnRD stPptnRD = realRainMapper.getMaxOfYear(stcd,now.getYear() + 1900);
|
||
if (stPptnRD == null){
|
||
return map;
|
||
}
|
||
|
||
count = realRainMapper.getRainOfDayInYear(stcd, now.getYear()+1900);
|
||
map.put("count", count);
|
||
map.put("maxDrp", stPptnRD.getDrp());
|
||
map.put("maxDrpTime", stPptnRD.getTm());
|
||
return map;
|
||
}
|
||
|
||
/**
|
||
* 计算本年天数
|
||
*
|
||
* @param time 当前时间
|
||
* @return 本年天数
|
||
*/
|
||
public Long countYearDay(Date time) {
|
||
LocalDateTime now = LocalDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault());
|
||
LocalDateTime startTime = LocalDateTime.of(now.getYear(), 1, 1, 8, 0, 0);
|
||
long count = ChronoUnit.DAYS.between(startTime, now);
|
||
return count + 1;
|
||
}
|
||
|
||
public StPptnRReal maxRain(StPptnSo stPptnSo) {
|
||
StPptnRReal stPptnRReal = new StPptnRReal();
|
||
List<StPptnVo> stPptnVos = realRainMapper.queryStPptnPerHourByStcdAndStartTimeAndEndTime(stPptnSo.getStcd(), stPptnSo.getStartTime(), stPptnSo.getEndTime());
|
||
if (stPptnVos == null || stPptnVos.isEmpty()) {
|
||
return null;
|
||
}
|
||
stPptnRReal.setH1(stPptnVos.stream().max(Comparator.comparing(StPptnVo::getSumDrp)).get().getSumDrp());
|
||
Collections.reverse(stPptnVos);
|
||
List<Integer> list = Arrays.asList(3, 6, 12);
|
||
for(Integer num : list){
|
||
BigDecimal data = calcMaxData(num,stPptnVos);
|
||
if(num == 3){
|
||
stPptnRReal.setH3(data);
|
||
}
|
||
if(num == 6){
|
||
stPptnRReal.setH6(data);
|
||
}
|
||
if(num == 12){
|
||
stPptnRReal.setH12(data);
|
||
}
|
||
}
|
||
return stPptnRReal;
|
||
}
|
||
|
||
private BigDecimal calcMaxData(Integer num, List<StPptnVo> stPptnVos) {
|
||
List<BigDecimal> list = stPptnVos.stream().map(StPptnVo::getSumDrp).collect(Collectors.toList());
|
||
return IntStream.range(0, list.size() - num -1)
|
||
.mapToObj(i -> list.subList(i, Math.min(i + num, list.size()))) // 获取每几个数的子列表
|
||
.map(sublist -> sublist.stream().reduce(BigDecimal.ZERO, BigDecimal::add))
|
||
.max(BigDecimal::compareTo)
|
||
.orElse(BigDecimal.ZERO);
|
||
}
|
||
|
||
public StPptnRReal queryStPptnRealByStcd(String stcd) {
|
||
return realRainMapper.queryPptnByStcd(stcd);
|
||
}
|
||
|
||
|
||
public BigDecimal queryLast24HoursDrpByStcdAndTime(String stcd, Date date) {
|
||
LocalDateTime end = LocalDateTimeConverter.fromDate(date);
|
||
LocalDateTime start = end.minusDays(1);
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(stcd,LocalDateTimeConverter.toDate(start),LocalDateTimeConverter.toDate(end));
|
||
}
|
||
|
||
public BigDecimal queryLast48HoursDrpByStcdAndTime(String stcd, Date date) {
|
||
LocalDateTime end = LocalDateTimeConverter.fromDate(date);
|
||
LocalDateTime start = end.minusDays(2);
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(stcd,LocalDateTimeConverter.toDate(start),LocalDateTimeConverter.toDate(end));
|
||
}
|
||
|
||
public BigDecimal queryLast72HoursDrpByStcdAndTime(String stcd, Date date) {
|
||
LocalDateTime end = LocalDateTimeConverter.fromDate(date);
|
||
LocalDateTime start = end.minusDays(3);
|
||
return stPptnRMapper.queryStPptnTimeQuantumByStcdAndTime(stcd,LocalDateTimeConverter.toDate(start),LocalDateTimeConverter.toDate(end));
|
||
}
|
||
}
|