gunshi-project-ss/src/main/java/com/gunshi/project/xyt/service/ReservoirWaterService.java

238 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.gunshi.project.xyt.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gunshi.project.xyt.entity.so.DataQueryCommonSo;
import com.gunshi.project.xyt.entity.so.PicQuerySo;
import com.gunshi.project.xyt.entity.so.ReservoirWaterCommonSo;
import com.gunshi.project.xyt.entity.vo.*;
import com.gunshi.project.xyt.mapper.AttResBaseMapper;
import com.gunshi.project.xyt.mapper.StZvarlBMapper;
import com.gunshi.project.xyt.model.*;
import com.gunshi.project.xyt.util.DataHandleUtil;
import com.gunshi.project.xyt.util.DateUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
/**
* Description:
* Created by wanyan on 2024/7/8
*
* @author wanyan
* @version 1.0
*/
@Service
@Slf4j
public class ReservoirWaterService {
@Resource
private AttResBaseMapper attResBaseMapper;
@Resource
private StZvarlBMapper stZvarlBMapper;
@Resource
private RainBasinDivisionService rainBasinDivisionService;
public List<AttResBaseVo> list() {
List<AttResBaseVo> attResBaseVos = attResBaseMapper.queryList();
if(CollectionUtils.isEmpty(attResBaseVos)){
return attResBaseVos;
}
attResBaseVos.stream().map(o->{
if(o.getCalState() == 1){
o.setDesState(0);
o.setFlState(0);
}else if(o.getCalState() == 0 && o.getDesState() ==1){
o.setFlState(0);
}
return o;
}).collect(Collectors.toList());
//查询所有测站的库容曲线
List<StZvarlB> zvarlList = queryZval(attResBaseVos.stream().map(AttResBaseVo::getStcd).collect(Collectors.toList()));
Map<String, List<StZvarlB>> zvalMap = zvarlList.stream().collect(Collectors.groupingBy(StZvarlB::getStcd));
for(AttResBaseVo vo : attResBaseVos){
String stcd = vo.getStcd();
BigDecimal rz = vo.getRz();
//计算当前库容
List<StZvarlB> zvarlBS = zvalMap.get(stcd);
if(rz != null && CollectionUtils.isNotEmpty(zvarlBS)){
BigDecimal maxRz = zvarlBS.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz();
BigDecimal minRz = zvarlBS.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz();
if(rz.compareTo(minRz) < 0 || rz.compareTo(maxRz) > 0){
continue;
}
Map<BigDecimal, BigDecimal> stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
List<BigDecimal> list = zvarlBS.stream().map(StZvarlB::getRz).collect(Collectors.toList());
vo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list));
}
}
return attResBaseVos;
}
private List<StZvarlB> queryZval(List<String> stcdList) {
LambdaQueryWrapper<StZvarlB> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.in(StZvarlB::getStcd, stcdList);
return stZvarlBMapper.selectList(queryWrapper);
}
public List<StImgRReal> realImg(ReservoirWaterCommonSo reservoirWaterCommonSo) {
return attResBaseMapper.realImg(reservoirWaterCommonSo.getResCode());
}
public List<StZvarlB> zvarl(String stcd) {
LambdaQueryWrapper<StZvarlB> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(StZvarlB::getStcd, stcd)
.orderByAsc(StZvarlB::getPtno);
return stZvarlBMapper.selectList(queryWrapper);
}
public List<AttResMonitorVo> monitorData(DataQueryCommonSo dataQueryCommonSo) {
String stcd = dataQueryCommonSo.getStcd();
//雨量数据
List<AttResMonitorVo> drpData = attResBaseMapper.drpData(dataQueryCommonSo);
//水位数据
List<AttResMonitorVo> rzData = attResBaseMapper.rzData(dataQueryCommonSo);
//获取库容曲线关系,算出库容
List<StZvarlB> zvarl = zvarl(stcd);
if(CollectionUtils.isNotEmpty(zvarl)){
calcTqData(rzData,zvarl);
}
//根据监测时间合并雨量和水位数据
return bindData(stcd,drpData,rzData);
}
private void calcTqData(List<AttResMonitorVo> rzData, List<StZvarlB> zqrl) {
BigDecimal maxRz = zqrl.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz();
BigDecimal minRz = zqrl.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz();
Map<BigDecimal, BigDecimal> map = zqrl.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
/**
* 根据监测水位和库容曲线计算出当前库容
* 计算规则1.监测水位不在库容曲线范围内,无法计算当前库容
* 2.找出与监测水位最接近的一组水位值算出比例根据比例计算库容如监测水位为10最相近的一组水位值为9-11对应的库容为4-5
* 则计算公式为1/2 = x/1 x=0.5 当前库容=4+0.5=4.5
*/
List<BigDecimal> list = zqrl.stream().map(StZvarlB::getRz).collect(Collectors.toList());
for (AttResMonitorVo vo : rzData) {
BigDecimal rz = vo.getRz();
if (rz.compareTo(minRz) < 0 || rz.compareTo(maxRz) > 0) {
continue;
}
vo.setW(DataHandleUtil.calcData(rz, map, list));
}
}
private List<AttResMonitorVo> bindData(String stcd,List<AttResMonitorVo> drpData, List<AttResMonitorVo> rzData) {
HashSet<Date> strings = new HashSet<>();
drpData.stream().forEach(v1 -> strings.add(v1.getTm()));
rzData.stream().forEach(v1 -> strings.add(v1.getTm()));
ArrayList<AttResMonitorVo> result = new ArrayList<>();
strings.stream().forEach(v1 -> result.add(AttResMonitorVo.builder().stcd(stcd).tm(v1).build()));
List<AttResMonitorVo> list = result.stream().map(v1 -> {
drpData.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> {
v1.setDrp(v2.getDrp());
});
rzData.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> {
v1.setRz(v2.getRz());
v1.setW(v2.getW());
});
return v1;
}).collect(Collectors.toList());
return list.stream().sorted(Comparator.comparing(AttResMonitorVo::getTm).reversed()).collect(Collectors.toList());
}
public StRsvrVo rz(ReservoirWaterCommonSo reservoirWaterCommonSo) {
StRsvrVo vo = new StRsvrVo();
String resCode = reservoirWaterCommonSo.getResCode();
AttResBase attResBase = attResBaseMapper.selectById(resCode);
vo.setFlLowLimLev(attResBase.getFlLowLimLev());
//默认查询近一周水位
String endTime = DateUtil.convertDateToMDSString(new Date());
String startTime = DateUtil.getMinusTime(endTime, 7 * 24);
vo.setList(attResBaseMapper.queryRzList(attResBase.getStcd(),startTime,endTime));
return vo;
}
public AttRvMonitorDetailVo detail(String stcd) {
AttRvMonitorDetailVo vo = new AttRvMonitorDetailVo();
StPptnDetailsVo stPptnDetailsVo = rainBasinDivisionService.queryStPptnDetailsByStcd(stcd);
BeanUtils.copyProperties(stPptnDetailsVo,vo,AttRvMonitorDetailVo.class);
//最新水位
AttResMonitorVo monitorVo = attResBaseMapper.latestRz(stcd);
if(monitorVo == null){
return vo;
}
Date tm = monitorVo.getTm();
BigDecimal rz = monitorVo.getRz();
//最新水位时间往前推24小时水位
LocalDateTime now = LocalDateTime.ofInstant(tm.toInstant(), ZoneId.systemDefault());
LocalDateTime dateTime = now.minusDays(1);
BigDecimal oldRz = attResBaseMapper.oldRz(stcd,Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()));
if(oldRz == null){
return vo;
}
vo.setRzDiff(rz.subtract(oldRz));
//本年最高水位
BigDecimal maxYearRz = queryYearRzByStcdAndTime(stcd);
vo.setMaxRz(maxYearRz);
return vo;
}
private BigDecimal queryYearRzByStcdAndTime(String stcd) {
LocalDateTime now = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
LocalDateTime startTime;
LocalDateTime endTime;
if (now.getHour() >= 8 || (now.getHour() < 8 && now.getMonthValue() > 1) || (now.getHour() < 8 && now.getMonthValue() == 1 && now.getDayOfMonth() >= 1)){
startTime = LocalDateTime.of(
now.getYear(),
1,
1,
8,
0,
0
);
endTime = now;
return attResBaseMapper.queryMaxRzByStcdAndTime(stcd,Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()), Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
}
return new BigDecimal(0);
}
public List<StStbprpB> channel(String resCode) {
return attResBaseMapper.channel(resCode);
}
public Page<StImgR> imageInfo(PicQuerySo picQuerySo) {
return attResBaseMapper.imageInfo(picQuerySo.getPageSo().toPage(),picQuerySo);
}
public List<AttResMonitorVo> data(DataQueryCommonSo dataQueryCommonSo) {
String stcd = dataQueryCommonSo.getStcd();
//水位数据
List<AttResMonitorVo> rzData = attResBaseMapper.rzData(dataQueryCommonSo);
//获取库容曲线关系,算出库容
List<StZvarlB> zvarl = zvarl(stcd);
if(CollectionUtils.isNotEmpty(zvarl)){
calcTqData(rzData,zvarl);
}
//根据监测时间合并雨量和水位数据
return rzData;
}
}