From efdd8ac871cb434e39a5f28d35982656f4ed3dd5 Mon Sep 17 00:00:00 2001 From: lyf66 Date: Tue, 8 Apr 2025 17:59:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE4=E6=9C=888=E6=97=A5=E7=9A=84?= =?UTF-8?q?=E7=A6=85=E9=81=93=E9=97=AE=E9=A2=98=E5=81=9A=E5=87=BA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/xyt/entity/vo/RsvrComplexVo.java | 32 +++++++ .../project/xyt/mapper/AttResBaseMapper.java | 14 +-- .../project/xyt/mapper/RealRainMapper.java | 68 ++++++++------- .../xyt/service/RainBasinDivisionService.java | 6 +- .../project/xyt/service/StStbprpBService.java | 40 +++------ .../project/xyt/service/StZqrlBService.java | 86 ++++++++++++++++++- 6 files changed, 174 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/gunshi/project/xyt/entity/vo/RsvrComplexVo.java diff --git a/src/main/java/com/gunshi/project/xyt/entity/vo/RsvrComplexVo.java b/src/main/java/com/gunshi/project/xyt/entity/vo/RsvrComplexVo.java new file mode 100644 index 0000000..2b6594b --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/vo/RsvrComplexVo.java @@ -0,0 +1,32 @@ +package com.gunshi.project.xyt.entity.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author lyf + * @since 2025-04-08 + */ +@Data +@NoArgsConstructor +@RequiredArgsConstructor(staticName = "of") +public class RsvrComplexVo { + @NonNull + public BigDecimal rz; + @NonNull + public Date tm; + public BigDecimal q; + /** + * spilled volume 溢洪量 + */ + public BigDecimal sv; + + public RsvrComplexVo(String rz, Date tm) { + + } +} diff --git a/src/main/java/com/gunshi/project/xyt/mapper/AttResBaseMapper.java b/src/main/java/com/gunshi/project/xyt/mapper/AttResBaseMapper.java index 2d7777c..f87eaf3 100644 --- a/src/main/java/com/gunshi/project/xyt/mapper/AttResBaseMapper.java +++ b/src/main/java/com/gunshi/project/xyt/mapper/AttResBaseMapper.java @@ -26,18 +26,18 @@ import java.util.List; public interface AttResBaseMapper extends BaseMapper { @Select(""" """) @@ -45,7 +45,7 @@ public interface AttResBaseMapper extends BaseMapper { @Select(""" """) List queryListV2(); @@ -178,8 +178,8 @@ public interface AttResBaseMapper extends BaseMapper { @Select(""" """) List getRealRainList(@Param("stm") String stm, @Param("etm") String etm); diff --git a/src/main/java/com/gunshi/project/xyt/service/RainBasinDivisionService.java b/src/main/java/com/gunshi/project/xyt/service/RainBasinDivisionService.java index 389fbac..e3ca449 100644 --- a/src/main/java/com/gunshi/project/xyt/service/RainBasinDivisionService.java +++ b/src/main/java/com/gunshi/project/xyt/service/RainBasinDivisionService.java @@ -430,10 +430,10 @@ public class RainBasinDivisionService { map.put("maxDrp", maxDrp); map.put("maxDrpTime", maxDrpTime); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq(StStbprpB.COL_STCD,stcd); +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq(StStbprpB.COL_STCD,stcd); - StStbprpB stStbprpB = stStbprpBAutoDao.getOne(queryWrapper); +// StStbprpB stStbprpB = stStbprpBAutoDao.getOne(queryWrapper); StPptnRD stPptnRD = realRainMapper.getMaxOfYear(stcd,now.getYear() + 1900); if (stPptnRD == null){ return map; diff --git a/src/main/java/com/gunshi/project/xyt/service/StStbprpBService.java b/src/main/java/com/gunshi/project/xyt/service/StStbprpBService.java index b66f2fe..d621f88 100644 --- a/src/main/java/com/gunshi/project/xyt/service/StStbprpBService.java +++ b/src/main/java/com/gunshi/project/xyt/service/StStbprpBService.java @@ -229,35 +229,24 @@ public class StStbprpBService extends ServiceImpl { public StZqrlBCount24Vo count24(Serializable stcd) { StZqrlBCount24Vo vo = new StZqrlBCount24Vo(); vo.setStcd(stcd.toString()); - String stcdstr = stcd.toString(); -// LambdaQueryWrapper qw = new LambdaQueryWrapper(); -// qw.eq(StZqrlB::getStcd,stcdstr).orderByDesc(StZqrlB::getModitime).last(" limit 1"); -// StZqrlB bean = stZqrlBService.getOne(qw); -// vo.setCurrWaterLevel(bean.getZ()); -// vo.setFlowNum(bean.getQ()); -// vo.setCreateTime(bean.getModitime()); - - //24小时溢洪量 - // 获取当前时间 - LocalDateTime now = LocalDateTime.now(); - // 获取24小时前的时间 - LocalDateTime before24 = now.minusHours(24); - List list = getList(stcdstr, before24, now); - if (CollectionUtil.isEmpty(list)) { + StRsvrR rsvrLatest = rsvrRService.lambdaQuery().eq(StRsvrR::getStcd, stcd).orderByDesc(StRsvrR::getTm).last("limit 1").one(); + if (rsvrLatest == null) { return vo; } - StZqrlB stZqrlB = list.stream() - .max(Comparator.comparing(StZqrlB::getModitimeAsLocalDateTime)) - .orElse(new StZqrlB()); - vo.setCurrWaterLevel(stZqrlB.getZ()); - vo.setFlowNum(stZqrlB.getQ()); - vo.setCreateTime(stZqrlB.getModitime()); + BigDecimal rzLatest = new BigDecimal(rsvrLatest.getRz()); + BigDecimal qLatest = stZqrlBService.getQFromZqrl(rzLatest); + vo.setCurrWaterLevel(rzLatest); + vo.setFlowNum(qLatest); + vo.setCreateTime(rsvrLatest.getTm()); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime before24 = now.minusHours(24); + List rsvrList = rsvrRService.lambdaQuery().ge(StRsvrR::getTm, before24).le(StRsvrR::getTm, now).orderByAsc(StRsvrR::getTm).list(); + List rsvrComplexVos = stZqrlBService.calculateSpilledVolumeList(rsvrList); + BigDecimal totalSv = rsvrComplexVos.stream().map(RsvrComplexVo::getSv).reduce(BigDecimal.ZERO, BigDecimal::add); + vo.setSum24(totalSv); - list = calculateQtotal(list); - BigDecimal reduce = list.stream().map(StZqrlB::getQ).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); - vo.setSum24(reduce); return vo; } @@ -288,9 +277,6 @@ public class StStbprpBService extends ServiceImpl { private List getList(String stcd, LocalDateTime start, LocalDateTime end) { LambdaQueryWrapper qw = new LambdaQueryWrapper(); - qw.eq(StZqrlB::getStcd, stcd); - qw.ge(StZqrlB::getModitime, start); - qw.le(StZqrlB::getModitime, end); List list = stZqrlBService.list(qw); return list; } diff --git a/src/main/java/com/gunshi/project/xyt/service/StZqrlBService.java b/src/main/java/com/gunshi/project/xyt/service/StZqrlBService.java index 769d18d..ff36ff7 100644 --- a/src/main/java/com/gunshi/project/xyt/service/StZqrlBService.java +++ b/src/main/java/com/gunshi/project/xyt/service/StZqrlBService.java @@ -1,13 +1,18 @@ package com.gunshi.project.xyt.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gunshi.project.xyt.entity.vo.RsvrComplexVo; import com.gunshi.project.xyt.mapper.StZqrlBMapper; +import com.gunshi.project.xyt.model.StRsvrR; import com.gunshi.project.xyt.model.StZqrlB; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; /** * 描述: 水位流量关系曲线表 @@ -17,8 +22,83 @@ import java.util.Date; @Service @Slf4j @Transactional(rollbackFor = Exception.class) -public class StZqrlBService extends ServiceImpl -{ +public class StZqrlBService extends ServiceImpl { + + /** + * 计算溢洪量 + * @param rz 计算溢洪的起始水位 + * @param seconds 溢洪时间,是两条水位数据的时间差,单位秒 + * @param zqrlList 水位流量关系曲线 + * @return 溢洪量 + * @author lyf + */ + public BigDecimal calculateSpilledVolume(BigDecimal rz, long seconds, List zqrlList) { + return getQFromZqrl(rz, zqrlList).multiply(BigDecimal.valueOf(seconds)); + } + + /** + * 计算溢洪量 + * @param rz 计算溢洪的起始水位 + * @param seconds 溢洪时间,是两条水位数据的时间差,单位秒 + * @return 溢洪量 + * @author lyf + */ + public BigDecimal calculateSpilledVolume(BigDecimal rz, long seconds) { + return calculateSpilledVolume(rz, seconds, list()); + } + + /** + * 批量计算溢洪量 + * @param rsvrList 要计算的水位数据 + * @param zqrlList 水位流量关系曲线 + * @return 计算后的水位数据(时间倒序),含每条水位对应的流量和与上一条水位对应的溢洪量 + */ + public List calculateSpilledVolumeList(List rsvrList, List zqrlList) { + rsvrList.sort(Comparator.comparing(StRsvrR::getTm).reversed()); + List ret = new ArrayList<>(); + for (int i = 0; i < rsvrList.size(); i++) { + StRsvrR rsvr = rsvrList.get(i); + BigDecimal rz = new BigDecimal(rsvr.getRz()); + Date tm = rsvr.getTm(); + RsvrComplexVo vo = RsvrComplexVo.of(rz, tm); + + if (i == 0) { + vo.setQ(getQFromZqrl(rz, zqrlList)); + vo.setSv(BigDecimal.ZERO); + } else { + StRsvrR rsvrPrev = rsvrList.get(i - 1); + Date tmPrev = rsvrPrev.getTm(); + long seconds = tm.getTime() - tmPrev.getTime(); + vo.setQ(getQFromZqrl(rz, zqrlList)); + vo.setSv(calculateSpilledVolume(rz, seconds)); + } + ret.add(vo); + } + return ret; + } + + /** + * 批量计算溢洪量 + * @param rsvrList 要计算的水位数据 + * @return 计算后的水位数据(时间倒序),含每条水位对应的流量和与上一条水位对应的溢洪量 + */ + public List calculateSpilledVolumeList(List rsvrList) { + return calculateSpilledVolumeList(rsvrList, list()); + } + + public BigDecimal getQFromZqrl(BigDecimal rz) { + return getQFromZqrl(rz, list()); + } + + public BigDecimal getQFromZqrl(BigDecimal rz, List zqrlList) { + return toMap(zqrlList).getOrDefault(rz.setScale(3, RoundingMode.DOWN), BigDecimal.ZERO); + } + + private Map toMap(List zqrlList) { + return zqrlList.stream() + .map(item -> Map.entry(item.getZ().setScale(3, RoundingMode.DOWN), item.getQ())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } }