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

222 lines
9.4 KiB
Java
Raw Normal View History

2024-07-08 17:41:17 +08:00
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.gunshi.project.xyt.entity.so.DataQueryCommonSo;
import com.gunshi.project.xyt.entity.so.ReservoirWaterCommonSo;
2024-07-15 16:58:18 +08:00
import com.gunshi.project.xyt.entity.vo.*;
2024-07-08 17:41:17 +08:00
import com.gunshi.project.xyt.mapper.AttResBaseMapper;
import com.gunshi.project.xyt.mapper.StZvarlBMapper;
import com.gunshi.project.xyt.model.AttResBase;
import com.gunshi.project.xyt.model.StImgRReal;
2024-07-15 16:58:18 +08:00
import com.gunshi.project.xyt.model.StStbprpB;
2024-07-08 17:41:17 +08:00
import com.gunshi.project.xyt.model.StZvarlB;
import com.gunshi.project.xyt.util.DataHandleUtil;
import com.gunshi.project.xyt.util.DateUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
2024-07-15 16:58:18 +08:00
import org.springframework.beans.BeanUtils;
2024-07-08 17:41:17 +08:00
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
2024-07-15 16:58:18 +08:00
import java.time.LocalDateTime;
import java.time.ZoneId;
2024-07-08 17:41:17 +08:00
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;
2024-07-15 16:58:18 +08:00
@Resource
private RainBasinDivisionService rainBasinDivisionService;
2024-07-08 17:41:17 +08:00
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.109-114-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());
//默认查询近一周水位
2024-07-15 16:13:05 +08:00
String endTime = DateUtil.convertDateToMDSString(new Date());
2024-07-08 17:41:17 +08:00
String startTime = DateUtil.getMinusTime(endTime, 7 * 24);
vo.setList(attResBaseMapper.queryRzList(attResBase.getStcd(),startTime,endTime));
return vo;
}
2024-07-15 16:58:18 +08:00
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);
}
2024-07-08 17:41:17 +08:00
}