根据4月8日的禅道问题做出修改
parent
4ebd0f5f1c
commit
efdd8ac871
|
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,18 +26,18 @@ import java.util.List;
|
||||||
public interface AttResBaseMapper extends BaseMapper<AttResBase> {
|
public interface AttResBaseMapper extends BaseMapper<AttResBase> {
|
||||||
@Select("""
|
@Select("""
|
||||||
<script>
|
<script>
|
||||||
select t.stcd,t.stnm,COALESCE(t.clgtd,t.lgtd) lgtd,COALESCE(t.clttd,t.lttd) lttd,t.source,t.sttp,t.stlc,t.adcd,t.esstym,s.res_code,s.fl_low_lim_lev,
|
select t.stcd,t.stnm,t.lgtd lgtd,t.lttd lttd,t.source,t.sttp,t.stlc,t.adcd,t.esstym,s.res_code,s.fl_low_lim_lev,
|
||||||
s.tot_cap,s.ben_res_cap,s.norm_wat_lev,s.crest_elev,s.des_flood_lev,s.dead_lev,s.cal_flood_lev,s.wat_shed_area,s.dead_cap,sad.adnm,
|
s.tot_cap,s.ben_res_cap,s.norm_wat_lev,s.crest_elev,s.des_flood_lev,s.dead_lev,s.cal_flood_lev,s.wat_shed_area,s.dead_cap,sad.adnm,
|
||||||
m.tm,m.rz,(m.rz-s.fl_low_lim_lev) as aFsltdz,sprr.tm as drpTm,sprr.h1,sprr.h3,sprr.h6,sprr.h12,sprr.h24,sprr.today,
|
m.tm,m.rz,(m.rz-s.fl_low_lim_lev) as aFsltdz,sprr.tm as drpTm,sprr.h1,sprr.h3,sprr.h6,sprr.h12,sprr.h24,sprr.today,
|
||||||
case when s.cal_flood_lev is not null and m.rz-s.cal_flood_lev > 0 then 1 else 0 end as calState,
|
case when s.cal_flood_lev is not null and m.rz-s.cal_flood_lev > 0 then 1 else 0 end as calState,
|
||||||
case when s.des_flood_lev is not null and m.rz-s.des_flood_lev > 0 then 1 else 0 end as desState,
|
case when s.des_flood_lev is not null and m.rz-s.des_flood_lev > 0 then 1 else 0 end as desState,
|
||||||
case when s.fl_low_lim_lev is not null and m.rz-s.fl_low_lim_lev > 0 then 1 else 0 end as flState
|
case when s.fl_low_lim_lev is not null and m.rz-s.fl_low_lim_lev > 0 then 1 else 0 end as flState
|
||||||
from public.st_stbprp_b t
|
from public.st_stbprp_b t
|
||||||
left join public.att_res_base s on t.stcd = s.stcd
|
left join public.att_res_base s on 1=1
|
||||||
left join public.st_addvcd_d sad on t.adcd = sad.adcd
|
left join public.st_addvcd_d sad on t.adcd = sad.adcd
|
||||||
left join public.st_rsvr_r_real m on t.stcd = m.stcd
|
left join public.st_rsvr_r_real m on t.stcd = m.stcd
|
||||||
left join public.st_pptn_r_real sprr on t.stcd = sprr.stcd
|
left join public.st_pptn_r_real sprr on t.stcd = sprr.stcd
|
||||||
where t.sttp = 'RR' and s.res_code = '42112230001'
|
where t.sttp = 'RR' and s.res_code = '42112230001' and t.stcd='10196'
|
||||||
order by aFsltdz desc nulls last
|
order by aFsltdz desc nulls last
|
||||||
</script>
|
</script>
|
||||||
""")
|
""")
|
||||||
|
|
@ -45,7 +45,7 @@ public interface AttResBaseMapper extends BaseMapper<AttResBase> {
|
||||||
|
|
||||||
@Select("""
|
@Select("""
|
||||||
<script>
|
<script>
|
||||||
select t.stcd,t.stnm,COALESCE(t.clgtd,t.lgtd) lgtd,COALESCE(t.clttd,t.lttd) lttd,t.source,t.sttp,t.stlc,t.adcd,t.esstym,s.res_code,s.fl_low_lim_lev,
|
select t.stcd,t.stnm,t.lgtd lgtd,t.lttd lttd,t.source,t.sttp,t.stlc,t.adcd,t.esstym,s.res_code,s.fl_low_lim_lev,
|
||||||
s.tot_cap,s.ben_res_cap,s.norm_wat_lev,s.crest_elev,s.des_flood_lev,s.dead_lev,s.cal_flood_lev,s.wat_shed_area,s.dead_cap,sad.adnm,
|
s.tot_cap,s.ben_res_cap,s.norm_wat_lev,s.crest_elev,s.des_flood_lev,s.dead_lev,s.cal_flood_lev,s.wat_shed_area,s.dead_cap,sad.adnm,
|
||||||
m.tm,m.rz,(m.rz-s.fl_low_lim_lev) as aFsltdz,sprr.tm as drpTm,sprr.h1,sprr.h3,sprr.h6,sprr.h12,sprr.h24,sprr.today,
|
m.tm,m.rz,(m.rz-s.fl_low_lim_lev) as aFsltdz,sprr.tm as drpTm,sprr.h1,sprr.h3,sprr.h6,sprr.h12,sprr.h24,sprr.today,
|
||||||
case when s.cal_flood_lev is not null and m.rz-s.cal_flood_lev > 0 then 1 else 0 end as calState,
|
case when s.cal_flood_lev is not null and m.rz-s.cal_flood_lev > 0 then 1 else 0 end as calState,
|
||||||
|
|
@ -57,7 +57,7 @@ public interface AttResBaseMapper extends BaseMapper<AttResBase> {
|
||||||
left join public.st_rsvr_r_real m on t.stcd = m.stcd
|
left join public.st_rsvr_r_real m on t.stcd = m.stcd
|
||||||
left join public.st_pptn_r_real sprr on t.stcd = sprr.stcd
|
left join public.st_pptn_r_real sprr on t.stcd = sprr.stcd
|
||||||
where t.sttp = 'RR'
|
where t.sttp = 'RR'
|
||||||
order by aFsltdz desc nulls last
|
order by _order asc nulls last
|
||||||
</script>
|
</script>
|
||||||
""")
|
""")
|
||||||
List<AttResBaseVo> queryListV2();
|
List<AttResBaseVo> queryListV2();
|
||||||
|
|
@ -178,8 +178,8 @@ public interface AttResBaseMapper extends BaseMapper<AttResBase> {
|
||||||
|
|
||||||
@Select("""
|
@Select("""
|
||||||
<script>
|
<script>
|
||||||
select t.stcd,t.stnm,COALESCE(t.clgtd,t.lgtd) as lgtd,
|
select t.stcd,t.stnm,t.lgtd as lgtd,
|
||||||
COALESCE(t.clttd,t.lttd) as lttd,t.sttp,t.adcd,t.rvnm,t.stlc,t.source,t.esstym,s.tm,s.z,s.q,sad.adnm,
|
t.lttd as lttd,t.sttp,t.adcd,t.rvnm,t.stlc,t.source,t.esstym,s.tm,s.z,s.q,sad.adnm,
|
||||||
srb.wrz,srb.grz,srb.invrz,srb.invrztm
|
srb.wrz,srb.grz,srb.invrz,srb.invrztm
|
||||||
from public.st_stbprp_b t
|
from public.st_stbprp_b t
|
||||||
left join public.st_river_r_real s on t.stcd = s.stcd
|
left join public.st_river_r_real s on t.stcd = s.stcd
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ import java.util.List;
|
||||||
public interface RealRainMapper {
|
public interface RealRainMapper {
|
||||||
@Select("""
|
@Select("""
|
||||||
<script>
|
<script>
|
||||||
with m1 as (select t1.stcd,
|
with m1 as (
|
||||||
|
select t1.stcd,
|
||||||
t1.sttp,
|
t1.sttp,
|
||||||
s1.adcd,
|
s1.adcd,
|
||||||
t1.stlc,
|
t1.stlc,
|
||||||
|
|
@ -31,11 +32,14 @@ public interface RealRainMapper {
|
||||||
left join att_res_base t3 on t3.stcd = t1.stcd
|
left join att_res_base t3 on t3.stcd = t1.stcd
|
||||||
left join st_addvcd_d s1 on s1.adcd = t1.adcd
|
left join st_addvcd_d s1 on s1.adcd = t1.adcd
|
||||||
left join st_stbprp_b_elem s2 on s2.stcd = t1.stcd
|
left join st_stbprp_b_elem s2 on s2.stcd = t1.stcd
|
||||||
where s2.elem = 'drp' ),
|
where s2.elem = 'drp'
|
||||||
m2 as (select t1.stcd, sum(t1.drp) drp
|
),
|
||||||
|
m2 as (
|
||||||
|
select t1.stcd, sum(t1.drp) drp
|
||||||
from public.st_pptn_r t1
|
from public.st_pptn_r t1
|
||||||
WHERE t1.tm > #{stm}::timestamp and t1.tm <= #{etm}::timestamp
|
WHERE t1.tm > #{stm}::timestamp and t1.tm <= #{etm}::timestamp
|
||||||
GROUP BY t1.stcd)
|
GROUP BY t1.stcd
|
||||||
|
)
|
||||||
select m1.stcd,
|
select m1.stcd,
|
||||||
m1.sttp,
|
m1.sttp,
|
||||||
m1.stnm,
|
m1.stnm,
|
||||||
|
|
|
||||||
|
|
@ -430,10 +430,10 @@ public class RainBasinDivisionService {
|
||||||
map.put("maxDrp", maxDrp);
|
map.put("maxDrp", maxDrp);
|
||||||
map.put("maxDrpTime", maxDrpTime);
|
map.put("maxDrpTime", maxDrpTime);
|
||||||
|
|
||||||
QueryWrapper<StStbprpB> queryWrapper = new QueryWrapper<>();
|
// QueryWrapper<StStbprpB> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq(StStbprpB.COL_STCD,stcd);
|
// queryWrapper.eq(StStbprpB.COL_STCD,stcd);
|
||||||
|
|
||||||
StStbprpB stStbprpB = stStbprpBAutoDao.getOne(queryWrapper);
|
// StStbprpB stStbprpB = stStbprpBAutoDao.getOne(queryWrapper);
|
||||||
StPptnRD stPptnRD = realRainMapper.getMaxOfYear(stcd,now.getYear() + 1900);
|
StPptnRD stPptnRD = realRainMapper.getMaxOfYear(stcd,now.getYear() + 1900);
|
||||||
if (stPptnRD == null){
|
if (stPptnRD == null){
|
||||||
return map;
|
return map;
|
||||||
|
|
|
||||||
|
|
@ -229,35 +229,24 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
|
||||||
public StZqrlBCount24Vo count24(Serializable stcd) {
|
public StZqrlBCount24Vo count24(Serializable stcd) {
|
||||||
StZqrlBCount24Vo vo = new StZqrlBCount24Vo();
|
StZqrlBCount24Vo vo = new StZqrlBCount24Vo();
|
||||||
vo.setStcd(stcd.toString());
|
vo.setStcd(stcd.toString());
|
||||||
String stcdstr = stcd.toString();
|
|
||||||
|
|
||||||
// LambdaQueryWrapper<StZqrlB> qw = new LambdaQueryWrapper();
|
StRsvrR rsvrLatest = rsvrRService.lambdaQuery().eq(StRsvrR::getStcd, stcd).orderByDesc(StRsvrR::getTm).last("limit 1").one();
|
||||||
// qw.eq(StZqrlB::getStcd,stcdstr).orderByDesc(StZqrlB::getModitime).last(" limit 1");
|
if (rsvrLatest == null) {
|
||||||
// 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<StZqrlB> list = getList(stcdstr, before24, now);
|
|
||||||
if (CollectionUtil.isEmpty(list)) {
|
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
StZqrlB stZqrlB = list.stream()
|
BigDecimal rzLatest = new BigDecimal(rsvrLatest.getRz());
|
||||||
.max(Comparator.comparing(StZqrlB::getModitimeAsLocalDateTime))
|
BigDecimal qLatest = stZqrlBService.getQFromZqrl(rzLatest);
|
||||||
.orElse(new StZqrlB());
|
vo.setCurrWaterLevel(rzLatest);
|
||||||
vo.setCurrWaterLevel(stZqrlB.getZ());
|
vo.setFlowNum(qLatest);
|
||||||
vo.setFlowNum(stZqrlB.getQ());
|
vo.setCreateTime(rsvrLatest.getTm());
|
||||||
vo.setCreateTime(stZqrlB.getModitime());
|
|
||||||
|
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
LocalDateTime before24 = now.minusHours(24);
|
||||||
|
List<StRsvrR> rsvrList = rsvrRService.lambdaQuery().ge(StRsvrR::getTm, before24).le(StRsvrR::getTm, now).orderByAsc(StRsvrR::getTm).list();
|
||||||
|
List<RsvrComplexVo> 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;
|
return vo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -288,9 +277,6 @@ public class StStbprpBService extends ServiceImpl<StStbprpBMapper, StStbprpB> {
|
||||||
|
|
||||||
private List<StZqrlB> getList(String stcd, LocalDateTime start, LocalDateTime end) {
|
private List<StZqrlB> getList(String stcd, LocalDateTime start, LocalDateTime end) {
|
||||||
LambdaQueryWrapper<StZqrlB> qw = new LambdaQueryWrapper();
|
LambdaQueryWrapper<StZqrlB> qw = new LambdaQueryWrapper();
|
||||||
qw.eq(StZqrlB::getStcd, stcd);
|
|
||||||
qw.ge(StZqrlB::getModitime, start);
|
|
||||||
qw.le(StZqrlB::getModitime, end);
|
|
||||||
List<StZqrlB> list = stZqrlBService.list(qw);
|
List<StZqrlB> list = stZqrlBService.list(qw);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,18 @@
|
||||||
package com.gunshi.project.xyt.service;
|
package com.gunshi.project.xyt.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.mapper.StZqrlBMapper;
|
||||||
|
import com.gunshi.project.xyt.model.StRsvrR;
|
||||||
import com.gunshi.project.xyt.model.StZqrlB;
|
import com.gunshi.project.xyt.model.StZqrlB;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
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
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public class StZqrlBService extends ServiceImpl<StZqrlBMapper, StZqrlB>
|
public class StZqrlBService extends ServiceImpl<StZqrlBMapper, StZqrlB> {
|
||||||
{
|
|
||||||
|
/**
|
||||||
|
* 计算溢洪量
|
||||||
|
* @param rz 计算溢洪的起始水位
|
||||||
|
* @param seconds 溢洪时间,是两条水位数据的时间差,单位秒
|
||||||
|
* @param zqrlList 水位流量关系曲线
|
||||||
|
* @return 溢洪量
|
||||||
|
* @author lyf
|
||||||
|
*/
|
||||||
|
public BigDecimal calculateSpilledVolume(BigDecimal rz, long seconds, List<StZqrlB> 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<RsvrComplexVo> calculateSpilledVolumeList(List<StRsvrR> rsvrList, List<StZqrlB> zqrlList) {
|
||||||
|
rsvrList.sort(Comparator.comparing(StRsvrR::getTm).reversed());
|
||||||
|
List<RsvrComplexVo> 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<RsvrComplexVo> calculateSpilledVolumeList(List<StRsvrR> rsvrList) {
|
||||||
|
return calculateSpilledVolumeList(rsvrList, list());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getQFromZqrl(BigDecimal rz) {
|
||||||
|
return getQFromZqrl(rz, list());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getQFromZqrl(BigDecimal rz, List<StZqrlB> zqrlList) {
|
||||||
|
return toMap(zqrlList).getOrDefault(rz.setScale(3, RoundingMode.DOWN), BigDecimal.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<BigDecimal, BigDecimal> toMap(List<StZqrlB> 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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue