四全-水库溢洪

master
yangzhe123 2025-09-05 10:55:00 +08:00
parent 5d234dc250
commit ed19e7e57d
2 changed files with 102 additions and 24 deletions

View File

@ -16,19 +16,23 @@ import java.util.Date;
public class StZqrlBCountVo {
private String stcd;
private BigDecimal val;
private BigDecimal val; //溢洪流量
private BigDecimal currDayValSum;
private BigDecimal currDayValSum; //当日溢洪流量
@JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8")
private Date createTime;
private BigDecimal currMonthSum;
private BigDecimal currMonthSum;// 当月溢洪流量
private BigDecimal currYearSum;
private BigDecimal currYearSum; // 当年溢洪流量
private Long currYearCount; // 本年溢洪次数
private BigDecimal currYearMaxVal; // 本年单次最大溢洪量
private String maxOverflowPeriod; // 最大溢洪量时间段
private Long currYearCount;
private BigDecimal currYearMaxVal;
}

View File

@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
@ -192,7 +193,7 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
StZqrlBCountVo vo = new StZqrlBCountVo();
vo.setStcd(stcd.toString());
//取出当月的水位
//取出当月的时间 20xx-xx-01 00:00:00
Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime();
calendar.set(Calendar.DAY_OF_MONTH, 1);
@ -200,13 +201,35 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date monthStart = calendar.getTime();
//取本年的时间 20xx-01-01 00:00:00
calendar.set(Calendar.MONTH,0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date yearStart = calendar.getTime();
calendar.setTime(now);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date dayStart = calendar.getTime();
//查询当年水位数据
List<StRsvrR> rsvrList = rsvrRService.lambdaQuery()
.eq(StRsvrR::getStcd, stcd)
.between(StRsvrR::getTm, calendar.getTime(), now)
.between(StRsvrR::getTm, yearStart, now)
.orderByAsc(true, StRsvrR::getTm)
.list();
//获取水位流量关系
List<StZqrlB> zqrlList = stZqrlBService.list();
zqrlList.sort(Comparator.comparing(StZqrlB::getZ));
List<RsvrComplexVo> complexList = new ArrayList<>();
int idx = 0;
@ -216,14 +239,19 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
complex.setRz(rz);
complex.setTm(rsvr.getTm());
BigDecimal q = stZqrlBService.getQFromZqrl(rz, zqrlList);
//TODO 这里需要重新计算水位-流量对应数据
//BigDecimal q = stZqrlBService.getQFromZqrl(rz, zqrlList);
BigDecimal q = stZqrlBService.getQByZqrl(zqrlList,rz);
complex.setQ(q);
if (idx == 0) {
complex.setSv(BigDecimal.ZERO);
} else {
RsvrComplexVo complexPrev = complexList.get(idx - 1);
complex.setSv(complexPrev.getSv().add(complexPrev.getQ().multiply(BigDecimal.valueOf(60 * 60))));
}
//计算当前时间段溢洪量
complex.setSv(complex.getQ().multiply(BigDecimal.valueOf(60 * 60)));
// if (idx == 0) {
// complex.setSv(BigDecimal.ZERO);
// } else {
// //计算溢洪量
// RsvrComplexVo complexPrev = complexList.get(idx - 1);
// complex.setSv(complexPrev.getSv().add(complex.getQ().multiply(BigDecimal.valueOf(60 * 60))));
// }
complexList.add(complex);
idx++;
@ -233,22 +261,68 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
vo.setVal(complexList.getLast().getQ());
vo.setCreateTime(complexList.getLast().getTm());
calendar.setTime(now);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date today = calendar.getTime();
//今日sv的和
BigDecimal sumToday = complexList.stream().filter(complex -> complex.getTm().after(today))
BigDecimal sumToday = complexList.stream().filter(complex -> complex.getTm().after(dayStart))
.map(RsvrComplexVo::getSv)
.reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setCurrDayValSum(sumToday);
//当月sv的和
BigDecimal sumMonth = complexList.stream().map(RsvrComplexVo::getSv)
// 当月溢洪量总和(筛选本月数据)
BigDecimal sumMonth = complexList.stream()
.filter(complex -> (complex.getTm().after(monthStart) || complex.getTm().equals(monthStart))
&& complex.getTm().before(now) || complex.getTm().equals(now))
.map(RsvrComplexVo::getSv)
.reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setCurrMonthSum(sumMonth);
// 当年溢洪量总和(所有数据都是当年的,直接求和)
BigDecimal sumYear = complexList.stream()
.map(RsvrComplexVo::getSv)
.reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setCurrYearSum(sumYear);
// 计算本年溢洪次数(溢洪量>0
long overflowCount = complexList.stream()
.filter(complex -> complex.getSv().compareTo(BigDecimal.ZERO) > 0)
.count();
vo.setCurrYearCount(overflowCount);
// 本年单次最大溢洪量
Optional<RsvrComplexVo> maxOverflowComplex = complexList.stream()
.max(Comparator.comparing(RsvrComplexVo::getSv));
if (maxOverflowComplex.isPresent()) {
RsvrComplexVo maxComplex = maxOverflowComplex.get();
vo.setCurrYearMaxVal(maxComplex.getSv());
// 假设最大溢洪量持续了一段时间(这里需要根据业务逻辑确定)
// 简单处理:显示发生时间
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
// 如果需要更复杂的时间段计算,可以根据前后数据点来判断
int maxIndex = complexList.indexOf(maxComplex);
if (maxIndex < complexList.size() - 1) {
// 可以取前后时间点作为时间段的参考
Date startTime = complexList.get(maxIndex).getTm();
Date endTime = complexList.get(maxIndex + 1).getTm();
String period = sdf.format(startTime) + " ~ " + sdf.format(endTime);
vo.setMaxOverflowPeriod(period);
}else{
Date startTime = complexList.get(maxIndex).getTm();
String period = sdf.format(startTime) + " ~ " + sdf.format(now);
vo.setMaxOverflowPeriod(period);
}
} else {
vo.setCurrYearMaxVal(BigDecimal.ZERO);
vo.setMaxOverflowPeriod("无溢洪记录");
}
// BigDecimal maxOverflow = complexList.stream()
// .map(RsvrComplexVo::getSv)
// .max(Comparator.naturalOrder())
// .orElse(BigDecimal.ZERO);
// vo.setCurrYearMaxVal(maxOverflow);
return vo;
}