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 list() { List 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 zvarlList = stZvarlBMapper.selectList(null); for (StZvarlB zvarl : zvarlList) { if (zvarl.getRz().equals(rz)) { vo.setNowCap(zvarl.getW()); break; } } } //查询所有测站的库容曲线 // List zvarlList = queryZval(attResBaseVos.stream().map(AttResBaseVo::getStcd).collect(Collectors.toList())); // Map> zvalMap = zvarlList.stream().collect(Collectors.groupingBy(StZvarlB::getStcd)); // for(AttResBaseVo vo : attResBaseVos){ // String stcd = vo.getStcd(); // BigDecimal rz = vo.getRz(); // //计算当前库容 // List 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 stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW)); // List list = zvarlBS.stream().map(StZvarlB::getRz).sorted().collect(Collectors.toList()); // vo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list)); // } // } return attResBaseVos; } public List listV2() { List voList = attResBaseMapper.queryListV2(); if(CollectionUtils.isEmpty(voList)){ return voList; } List 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(); BigDecimal w = stZvarlBService.getWFromZvarl(rz, null, zvarlList); vo.setNowCap(w); }); return voList; } private List queryZval(List stcdList) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.in(StZvarlB::getStcd, stcdList); return stZvarlBMapper.selectList(queryWrapper); } public List realImg(ReservoirWaterCommonSo reservoirWaterCommonSo) { return attResBaseMapper.realImg(reservoirWaterCommonSo.getResCode()); } public List zvarl(String stcd) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); return stZvarlBMapper.selectList(queryWrapper); } public List monitorData(DataQueryCommonSo dataQueryCommonSo) { String stcd = dataQueryCommonSo.getStcd(); //雨量数据 List drpData = attResBaseMapper.drpData(dataQueryCommonSo); //水位数据 List rzData = attResBaseMapper.rzData(dataQueryCommonSo); //获取库容曲线关系,算出库容 List zvarl = zvarl(stcd); if(CollectionUtils.isNotEmpty(zvarl)){ calcTqData(rzData,zvarl); } //根据监测时间合并雨量和水位数据 return bindData(stcd,drpData,rzData); } private void calcTqData(List rzData, List zqrl) { /* 前期库容曲线数据不足,采用了计算近似值,废弃,直接查表 BigDecimal maxRz = zqrl.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz(); BigDecimal minRz = zqrl.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz(); Map 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 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 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 bindData(String stcd,List drpData, List rzData) { HashSet strings = new HashSet<>(); drpData.stream().forEach(v1 -> strings.add(v1.getTm())); rzData.stream().forEach(v1 -> strings.add(v1.getTm())); ArrayList result = new ArrayList<>(); strings.stream().forEach(v1 -> result.add(AttResMonitorVo.builder().stcd(stcd).tm(v1).build())); List 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 channel(String resCode) { return attResBaseMapper.channel(resCode); } public Page imageInfo(PicQuerySo picQuerySo) { return attResBaseMapper.imageInfo(picQuerySo.getPageSo().toPage(),picQuerySo); } public List data(DataQueryCommonSo dataQueryCommonSo) { String stcd = dataQueryCommonSo.getStcd(); //水位数据 List rzData = attResBaseMapper.rzData(dataQueryCommonSo); //获取库容曲线关系,算出库容 List zvarl = zvarl(stcd); if(CollectionUtils.isNotEmpty(zvarl)){ calcTqData(rzData,zvarl); } return rzData; } public Page dataPage(PicQuerySo picQuerySo) { String stcd = picQuerySo.getStcd(); //水位数据 Page rzData = attResBaseMapper.rzDataPage(picQuerySo.getPageSo().toPage(),picQuerySo); //获取库容曲线关系,算出库容 List zvarl = zvarl(stcd); if(CollectionUtils.isNotEmpty(zvarl)){ calcTqData(rzData.getRecords(),zvarl); } return rzData; } }