diff --git a/src/main/java/com/gunshi/project/hsz/entity/vo/StZqrlBCountVo.java b/src/main/java/com/gunshi/project/hsz/entity/vo/StZqrlBCountVo.java index 638fbdc..fe610cc 100644 --- a/src/main/java/com/gunshi/project/hsz/entity/vo/StZqrlBCountVo.java +++ b/src/main/java/com/gunshi/project/hsz/entity/vo/StZqrlBCountVo.java @@ -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; } diff --git a/src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java b/src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java index dd3ec37..3071b5a 100644 --- a/src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java +++ b/src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java @@ -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 { 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 { 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 rsvrList = rsvrRService.lambdaQuery() .eq(StRsvrR::getStcd, stcd) - .between(StRsvrR::getTm, calendar.getTime(), now) + .between(StRsvrR::getTm, yearStart, now) .orderByAsc(true, StRsvrR::getTm) .list(); + //获取水位流量关系 List zqrlList = stZqrlBService.list(); + zqrlList.sort(Comparator.comparing(StZqrlB::getZ)); List complexList = new ArrayList<>(); int idx = 0; @@ -216,14 +239,19 @@ public class StStbprpBService extends ServiceImpl { 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 { 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 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; }