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; import com.gunshi.project.xyt.entity.vo.AttResBaseVo; import com.gunshi.project.xyt.entity.vo.AttResMonitorVo; import com.gunshi.project.xyt.entity.vo.StRsvrVo; 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; 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; import org.springframework.stereotype.Service; import java.math.BigDecimal; 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; 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()); //查询所有测站的库容曲线 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){ continue; } Map stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW)); List list = zvarlBS.stream().map(StZvarlB::getRz).collect(Collectors.toList()); vo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list)); } } return attResBaseVos; } 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(); queryWrapper.eq(StZvarlB::getStcd, stcd) .orderByAsc(StZvarlB::getPtno); 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)); /** * 根据监测水位和库容曲线计算出当前库容 * 计算规则: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)); } } 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; } }