306 lines
13 KiB
Java
306 lines
13 KiB
Java
package com.gunshi.project.hsz.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.hsz.entity.so.DataQueryCommonSo;
|
||
import com.gunshi.project.hsz.entity.so.PicQuerySo;
|
||
import com.gunshi.project.hsz.entity.so.ReservoirWaterCommonSo;
|
||
import com.gunshi.project.hsz.entity.vo.*;
|
||
import com.gunshi.project.hsz.mapper.AttResBaseMapper;
|
||
import com.gunshi.project.hsz.mapper.StZvarlBMapper;
|
||
import com.gunshi.project.hsz.model.*;
|
||
import com.gunshi.project.hsz.util.DateUtil;
|
||
import jakarta.annotation.Resource;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.BeanUtils;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.math.RoundingMode;
|
||
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;
|
||
|
||
@Autowired
|
||
private StZvarlBService stZvarlBService;
|
||
|
||
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());
|
||
|
||
for (AttResBaseVo vo : attResBaseVos) {
|
||
BigDecimal rz = vo.getRz();
|
||
List<StZvarlB> zvarlList = stZvarlBMapper.selectList(null);
|
||
for (StZvarlB zvarl : zvarlList) {
|
||
if (zvarl.getRz().equals(rz)) {
|
||
vo.setNowCap(zvarl.getW());
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//查询所有测站的库容曲线
|
||
// 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){
|
||
// //当期水位库容
|
||
// StZvarlB equals = zvarlBS.stream().filter(e -> e.getRz().compareTo(vo.getRz()) == 0).findFirst().orElse(new StZvarlB());
|
||
// //死水位库容
|
||
// StZvarlB dead = zvarlBS.stream().filter(e -> e.getRz().compareTo(vo.getDeadCap()) == 0).findFirst().orElse(new StZvarlB());
|
||
// if(Objects.nonNull(equals) && Objects.nonNull(dead)){
|
||
// BigDecimal subtract = equals.getW().subtract(dead.getW());
|
||
// vo.setNowCap(subtract);
|
||
// }
|
||
// continue;
|
||
// }
|
||
// Map<BigDecimal, BigDecimal> stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
|
||
// List<BigDecimal> list = zvarlBS.stream().map(StZvarlB::getRz).sorted().collect(Collectors.toList());
|
||
// vo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list));
|
||
// }
|
||
// }
|
||
return attResBaseVos;
|
||
}
|
||
|
||
|
||
public List<AttResBaseVo> listV2() {
|
||
List<AttResBaseVo> voList = attResBaseMapper.queryListV2();
|
||
if(CollectionUtils.isEmpty(voList)){
|
||
return voList;
|
||
}
|
||
|
||
List<StZvarlB> zvarlList = stZvarlBService.list();
|
||
voList.forEach(vo -> {
|
||
if(vo.getCalState() == 1){
|
||
vo.setDesState(0);
|
||
vo.setFlState(0);
|
||
}else if(vo.getCalState() == 0 && vo.getDesState() ==1){
|
||
vo.setFlState(0);
|
||
}
|
||
|
||
BigDecimal rz = vo.getRz();
|
||
if (rz != null) {
|
||
BigDecimal w = stZvarlBService.getWFromZvarl(rz, null, zvarlList);
|
||
vo.setNowCap(w);
|
||
}
|
||
});
|
||
|
||
return voList;
|
||
}
|
||
|
||
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();
|
||
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,
|
||
(existing, replacement) -> existing));
|
||
|
||
* 根据监测水位和库容曲线计算出当前库容
|
||
* 计算规则: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));
|
||
}
|
||
*/
|
||
//zqrl转map,用rz值做key,bigdecimal的精度设置为3位
|
||
Map<BigDecimal, BigDecimal> map = zqrl.stream().collect(Collectors.toMap(v -> v.getRz().setScale(3, RoundingMode.UNNECESSARY), v -> v.getW()));
|
||
for (AttResMonitorVo vo : rzData) {
|
||
BigDecimal rz = vo.getRz().setScale(3, RoundingMode.UNNECESSARY);
|
||
if (map.containsKey(rz)) {
|
||
vo.setW(map.get(rz));
|
||
}
|
||
}
|
||
}
|
||
|
||
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,2,Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()));
|
||
|
||
if(oldRz != null){
|
||
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;
|
||
}
|
||
|
||
public Page<AttResMonitorVo> dataPage(PicQuerySo picQuerySo) {
|
||
String stcd = picQuerySo.getStcd();
|
||
//水位数据
|
||
Page<AttResMonitorVo> rzData = attResBaseMapper.rzDataPage(picQuerySo.getPageSo().toPage(),picQuerySo);
|
||
//获取库容曲线关系,算出库容
|
||
List<StZvarlB> zvarl = zvarl(stcd);
|
||
if(CollectionUtils.isNotEmpty(zvarl)){
|
||
calcTqData(rzData.getRecords(),zvarl);
|
||
}
|
||
return rzData;
|
||
}
|
||
}
|