四全-水库溢洪

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 { public class StZqrlBCountVo {
private String stcd; 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") @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8")
private Date createTime; 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.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -192,7 +193,7 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
StZqrlBCountVo vo = new StZqrlBCountVo(); StZqrlBCountVo vo = new StZqrlBCountVo();
vo.setStcd(stcd.toString()); vo.setStcd(stcd.toString());
//取出当月的水位 //取出当月的时间 20xx-xx-01 00:00:00
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
Date now = calendar.getTime(); Date now = calendar.getTime();
calendar.set(Calendar.DAY_OF_MONTH, 1); 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.MINUTE, 0);
calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 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() List<StRsvrR> rsvrList = rsvrRService.lambdaQuery()
.eq(StRsvrR::getStcd, stcd) .eq(StRsvrR::getStcd, stcd)
.between(StRsvrR::getTm, calendar.getTime(), now) .between(StRsvrR::getTm, yearStart, now)
.orderByAsc(true, StRsvrR::getTm) .orderByAsc(true, StRsvrR::getTm)
.list(); .list();
//获取水位流量关系
List<StZqrlB> zqrlList = stZqrlBService.list(); List<StZqrlB> zqrlList = stZqrlBService.list();
zqrlList.sort(Comparator.comparing(StZqrlB::getZ));
List<RsvrComplexVo> complexList = new ArrayList<>(); List<RsvrComplexVo> complexList = new ArrayList<>();
int idx = 0; int idx = 0;
@ -216,14 +239,19 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
complex.setRz(rz); complex.setRz(rz);
complex.setTm(rsvr.getTm()); 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); complex.setQ(q);
if (idx == 0) { //计算当前时间段溢洪量
complex.setSv(BigDecimal.ZERO); complex.setSv(complex.getQ().multiply(BigDecimal.valueOf(60 * 60)));
} else { // if (idx == 0) {
RsvrComplexVo complexPrev = complexList.get(idx - 1); // complex.setSv(BigDecimal.ZERO);
complex.setSv(complexPrev.getSv().add(complexPrev.getQ().multiply(BigDecimal.valueOf(60 * 60)))); // } else {
} // //计算溢洪量
// RsvrComplexVo complexPrev = complexList.get(idx - 1);
// complex.setSv(complexPrev.getSv().add(complex.getQ().multiply(BigDecimal.valueOf(60 * 60))));
// }
complexList.add(complex); complexList.add(complex);
idx++; idx++;
@ -233,22 +261,68 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
vo.setVal(complexList.getLast().getQ()); vo.setVal(complexList.getLast().getQ());
vo.setCreateTime(complexList.getLast().getTm()); 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的和 //今日sv的和
BigDecimal sumToday = complexList.stream().filter(complex -> complex.getTm().after(today)) BigDecimal sumToday = complexList.stream().filter(complex -> complex.getTm().after(dayStart))
.map(RsvrComplexVo::getSv) .map(RsvrComplexVo::getSv)
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setCurrDayValSum(sumToday); 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); .reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setCurrMonthSum(sumMonth); 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; return vo;
} }