package com.gunshi.project.xyt.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gunshi.db.dto.DateTimeRangeSo; import com.gunshi.project.xyt.entity.so.OsmoticQueryPageSo; import com.gunshi.project.xyt.entity.so.OsmoticQuerySo; import com.gunshi.project.xyt.entity.vo.*; import com.gunshi.project.xyt.mapper.OsmoticPressRMapper; import com.gunshi.project.xyt.model.*; import com.gunshi.project.xyt.model.AttDamProfileAutoDao; import com.gunshi.project.xyt.model.OsmoticPressDeviceAutoDao; import com.gunshi.project.xyt.util.DateUtil; import com.gunshi.project.xyt.util.ExcelUtil; import com.gunshi.project.xyt.util.MyBeanUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 描述: 渗压监测记录表 * author: xusan * date: 2024-07-08 17:30:37 */ @Service @Slf4j @Transactional(rollbackFor = Exception.class) public class OsmoticPressRService extends ServiceImpl { @Resource private OsmoticPressRMapper mapper; @Resource private AttDamProfileAutoDao profileAutoDao; @Resource private OsmoticPressDeviceAutoDao pressDeviceAutoDao; public Page queryPage(OsmoticQueryPageSo osmoticQueryPageSo) { return mapper.queryPage(osmoticQueryPageSo.getPageSo().toPage(),osmoticQueryPageSo); } /** * 测值查询,管水位和库水位数据固定查询每日早8点 * @param osmoticQuerySo * @return */ public List queryValue(OsmoticQuerySo osmoticQuerySo,Integer year) { Boolean isDesc = true; //查询测站降雨量 Map drpMap = new HashMap<>(); if(year != null){ isDesc = false; List drpList = mapper.queryDrp(year); drpMap = drpList.stream().collect(Collectors.toMap(StRzVo::getTm, StRzVo::getRz)); } List dateList = DateUtil.getDatesBetween(osmoticQuerySo.getDateTimeRangeSo().getStart(), osmoticQuerySo.getDateTimeRangeSo().getEnd(),isDesc); List resList = new ArrayList<>(); //查询库水位 List list = mapper.queryRz(osmoticQuerySo); Map rzMap = list.stream().collect(Collectors.toMap(StRzVo::getTm, StRzVo::getRz)); //查询测站管水位 List valueList = mapper.queryValue(osmoticQuerySo); //数据处理 for(String str : dateList){ OsmoticStationVo vo = new OsmoticStationVo(); vo.setTm(str); vo.setRz(rzMap.get(str)); vo.setDrp(drpMap.get(str)); vo.setList(valueList.stream().filter(o->str.equals(o.getTm())).map(t->{ t.setRz(vo.getRz()); return t; }).collect(Collectors.toList())); resList.add(vo); } return resList; } public List queryChart(OsmoticQuerySo osmoticQuerySo,Integer year) { List resList = new ArrayList<>(); List stationCodes = osmoticQuerySo.getStationCodes(); //查询库水位 List list = mapper.queryRz(osmoticQuerySo); //查询测站降雨量 List drpList = new ArrayList<>(); if(year != null){ drpList = mapper.queryDrp(year); OsmoticChartVo chartVo = new OsmoticChartVo(); chartVo.setStationCode("rz"); if(CollectionUtils.isNotEmpty(list)){ StRzVo max = list.stream().max(Comparator.comparing(StRzVo::getRz)).get(); StRzVo min = list.stream().min(Comparator.comparing(StRzVo::getRz)).get(); chartVo.setMaxValue(max.getRz()); chartVo.setMaxTm(max.getTm()); chartVo.setMinValue(min.getRz()); chartVo.setMinTm(min.getTm()); chartVo.setDiff(max.getRz().subtract(min.getRz())); resList.add(chartVo); } if(CollectionUtils.isNotEmpty(drpList)){ OsmoticChartVo drpVo = new OsmoticChartVo(); drpVo.setStationCode("drp"); StRzVo maxDrp = drpList.stream().max(Comparator.comparing(StRzVo::getRz)).get(); StRzVo minDrp = drpList.stream().min(Comparator.comparing(StRzVo::getRz)).get(); drpVo.setMaxValue(maxDrp.getRz()); drpVo.setMaxTm(maxDrp.getTm()); drpVo.setMinValue(minDrp.getRz()); drpVo.setMinTm(minDrp.getTm()); drpVo.setDiff(maxDrp.getRz().subtract(minDrp.getRz())); resList.add(drpVo); } } //查询测站管水位 List valueList = mapper.queryValue(osmoticQuerySo); //按测站分组 Map> map = valueList.stream().collect(Collectors.groupingBy(OsmoticValueVo::getStationCode)); for(String code : stationCodes){ OsmoticChartVo vo = new OsmoticChartVo(); vo.setStationCode(code); if(map.containsKey(code)){ List voList = map.get(code); OsmoticValueVo max = voList.stream().max(Comparator.comparing(OsmoticValueVo::getValue)).get(); OsmoticValueVo min = voList.stream().min(Comparator.comparing(OsmoticValueVo::getValue)).get(); vo.setStationCode(code); vo.setMaxValue(max.getValue()); vo.setMaxTm(max.getTm()); vo.setMinValue(min.getValue()); vo.setMinTm(min.getTm()); vo.setDiff(max.getValue().subtract(min.getValue())); if(year == null){ vo.setDetailVos(bindData(MyBeanUtil.collectionCopy(list,OsmoticChartDetailVo.class),MyBeanUtil.collectionCopy(voList,OsmoticChartDetailVo.class))); } } resList.add(vo); } return resList; } //根据监测时间合并管水位和库水位数据 private List bindData(List tmRzList, List voList) { HashSet strings = new HashSet<>(); tmRzList.stream().forEach(v1 -> strings.add(v1.getTm())); voList.stream().forEach(v1 -> strings.add(v1.getTm())); List result = new ArrayList<>(); strings.stream().forEach(v1 ->{ OsmoticChartDetailVo v = new OsmoticChartDetailVo(); v.setTm(v1); result.add(v); }); List list = result.stream().map(v1 -> { tmRzList.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> { v1.setRz(v2.getRz()); }); voList.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> { v1.setValue(v2.getValue()); }); return v1; }).collect(Collectors.toList()); return list.stream().sorted(Comparator.comparing(OsmoticChartDetailVo::getTm)).collect(Collectors.toList()); } public List infiltraLine(OsmoticQuerySo osmoticQuerySo) { List resList = new ArrayList<>(); String profileCode = osmoticQuerySo.getProfileCode(); //通过断面查询渗压设备 List stationCodes = queryPressList(profileCode); if(CollectionUtils.isEmpty(stationCodes)){ return resList; } osmoticQuerySo.setStationCodes(stationCodes); //查询库水位 List list = mapper.queryLineRz(osmoticQuerySo); Map rzMap = list.stream().collect(Collectors.toMap(StRzVo::getTm, StRzVo::getRz)); //查询测站管水位 List valueList = mapper.queryLineValue(osmoticQuerySo); //查询测站预警信息 List warnList = mapper.queryWarn(osmoticQuerySo); valueList.stream().map(vo->{ Boolean b = warnList.stream().filter(o->o.getStationCode().equals(vo.getStationCode()) && o.getTm().equals(vo.getTm())).findAny().isPresent(); if(b){ vo.setStatus(0); } return vo; }).collect(Collectors.toList()); HashSet dateList = new HashSet<>(); list.stream().forEach(v1 -> dateList.add(v1.getTm())); valueList.stream().forEach(v1 -> dateList.add(v1.getTm())); for(String str : dateList){ OsmoticStationVo vo = new OsmoticStationVo(); vo.setTm(str); vo.setRz(rzMap.get(str)); List newList = valueList.stream().filter(o->str.equals(o.getTm())).collect(Collectors.toList()); vo.setList(newList); if(CollectionUtils.isNotEmpty(newList) && newList.stream().filter(o->o.getStatus() == 0).findAny().isPresent()){ vo.setStatus(0); } resList.add(vo); } return resList; } private List queryPressList(String profileCode){ List pressList = pressDeviceAutoDao.list(new QueryWrapper().eq("profile_code", profileCode)); return pressList.stream().map(OsmoticPressDevice::getStationCode).collect(Collectors.toList()); } public void export(OsmoticQuerySo osmoticQuerySo, HttpServletResponse response) { //通过断面查询渗压设备 List stationCodes = queryPressList(osmoticQuerySo.getProfileCode()); //表头信息 List heads = new ArrayList<>(); heads.add("序号"); heads.add("时间"); heads.add("库水位(m)"); heads.addAll(stationCodes); heads.add("结果分析"); //表格数据 List resList = infiltraLine(osmoticQuerySo); List> list = new ArrayList<>(); for (int j = 0;j < resList.size(); j++) { OsmoticStationVo vo = resList.get(j); Map test = new LinkedHashMap<>(); test.put("t0",j+1); test.put("t1", vo.getTm()); test.put("t2", vo.getRz()); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); OsmoticValueVo valueVo = vo.getList().stream().filter(o->code.equals(o.getStationCode())).findFirst().orElse(null); test.put(code,valueVo != null ? valueVo.getValue() : "-"); } test.put("t4", vo.getStatus() == 0 ? "异常":"正常"); list.add(test); } List> hs = new ArrayList<>(); for (String s : heads) { hs.add(Arrays.asList(s)); } ExcelUtil.exportExcel(hs, tableData(list), "浸润线", response, "浸润线"); } private OsmoticQuerySo commonQueryHandle(OsmoticQuerySo osmoticQuerySo){ String profileCode = osmoticQuerySo.getProfileCode(); //通过断面查询渗压设备 List stationCodes = queryPressList(profileCode); osmoticQuerySo.setStationCodes(stationCodes); Integer year = osmoticQuerySo.getYear(); Date start = DateUtil.convertStringToDate(year + "-01-01 00:00:00"); Date end = DateUtil.convertStringToDate(year + "-12-31 00:00:00"); DateTimeRangeSo so = new DateTimeRangeSo(); so.setStart(start); so.setEnd(end); osmoticQuerySo.setDateTimeRangeSo(so); return osmoticQuerySo; } public List yearStat(OsmoticQuerySo osmoticQuerySo) { commonQueryHandle(osmoticQuerySo); return queryValue(osmoticQuerySo,osmoticQuerySo.getYear()); } public List yearStatValue(OsmoticQuerySo osmoticQuerySo) { commonQueryHandle(osmoticQuerySo); return queryChart(osmoticQuerySo,osmoticQuerySo.getYear()); } public void yearStatExport(OsmoticQuerySo osmoticQuerySo, HttpServletResponse response) { String profileName = ""; //断面名称 AttDamProfile damProfile = profileAutoDao.getById(osmoticQuerySo.getProfileCode()); if(damProfile != null){ profileName = damProfile.getProfileName(); } //上方表格数据 List resList = yearStat(osmoticQuerySo); //下方特征值数据 List chartList = queryChart(osmoticQuerySo,osmoticQuerySo.getYear()); List stationCodes = osmoticQuerySo.getStationCodes(); //表头信息 List> headList = new ArrayList<>(); List heads1 = new ArrayList<>(); heads1.add("序号"); heads1.add("序号"); headList.add(heads1); List heads2 = new ArrayList<>(); heads2.add("监测日期"); heads2.add("监测日期"); headList.add(heads2); for(String code : stationCodes){ List heads = new ArrayList<>(); heads.add(profileName + "断面测压管水位(m)"); heads.add(code); headList.add(heads); } List heads3 = new ArrayList<>(); heads3.add("库水位(m)"); heads3.add("库水位(m)"); headList.add(heads3); List heads4 = new ArrayList<>(); heads4.add("降雨量(mm)"); heads4.add("降雨量(mm)"); headList.add(heads4); List> list = new ArrayList<>(); for (int j = 0;j < resList.size(); j++) { OsmoticStationVo vo = resList.get(j); Map test = new LinkedHashMap<>(); test.put("t0",j+1); test.put("t1", vo.getTm()); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); OsmoticValueVo valueVo = vo.getList().stream().filter(o->code.equals(o.getStationCode())).findFirst().orElse(null); test.put(code,valueVo != null ? valueVo.getValue() : ""); } test.put("t2", vo.getRz()); test.put("t3", vo.getDrp()); list.add(test); } Map max = new LinkedHashMap<>(); max.put("t0","全年度特征值统计"); max.put("t1", "最大值"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); max.put(code,chartList.stream().filter(o->code.equals(o.getStationCode())).findFirst().get().getMaxValue()); } max.put("t2", chartList.stream().filter(o->"rz".equals(o.getStationCode())).findFirst().get().getMaxValue()); max.put("t3", chartList.stream().filter(o->"drp".equals(o.getStationCode())).findFirst().get().getMaxValue()); list.add(max); Map maxTm = new LinkedHashMap<>(); maxTm.put("t0","全年度特征值统计"); maxTm.put("t1", "日期"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); maxTm.put(code,chartList.stream().filter(o->code.equals(o.getStationCode())).findFirst().get().getMaxTm()); } maxTm.put("t2", chartList.stream().filter(o->"rz".equals(o.getStationCode())).findFirst().get().getMaxTm()); maxTm.put("t3", chartList.stream().filter(o->"drp".equals(o.getStationCode())).findFirst().get().getMaxTm()); list.add(maxTm); Map min = new LinkedHashMap<>(); min.put("t0","全年度特征值统计"); min.put("t1", "最大值"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); min.put(code,chartList.stream().filter(o->code.equals(o.getStationCode())).findFirst().get().getMinValue()); } min.put("t2", chartList.stream().filter(o->"rz".equals(o.getStationCode())).findFirst().get().getMinValue()); min.put("t3", chartList.stream().filter(o->"drp".equals(o.getStationCode())).findFirst().get().getMinValue()); list.add(min); Map minTm = new LinkedHashMap<>(); minTm.put("t0","全年度特征值统计"); minTm.put("t1", "日期"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); minTm.put(code,chartList.stream().filter(o->code.equals(o.getStationCode())).findFirst().get().getMinTm()); } minTm.put("t2", chartList.stream().filter(o->"rz".equals(o.getStationCode())).findFirst().get().getMinTm()); minTm.put("t3", chartList.stream().filter(o->"drp".equals(o.getStationCode())).findFirst().get().getMinTm()); list.add(minTm); Map diff = new LinkedHashMap<>(); diff.put("t0","全年度特征值统计"); diff.put("t1", "年变幅"); for(int i = 0;i < stationCodes.size();i++){ String code = stationCodes.get(i); diff.put(code,chartList.stream().filter(o->code.equals(o.getStationCode())).findFirst().get().getDiff()); } diff.put("t2", chartList.stream().filter(o->"rz".equals(o.getStationCode())).findFirst().get().getDiff()); diff.put("t3", chartList.stream().filter(o->"drp".equals(o.getStationCode())).findFirst().get().getDiff()); list.add(diff); ExcelUtil.exportExcel(headList,tableData(list),2,new int[]{0},profileName+"断面年度渗压统计",response,"年度渗压统计"); } private List tableData( List> list){ List list2 = new ArrayList<>(); Collection values; for (int i = 0; i < list.size(); i++) { values = list.get(i).values(); List objects = new ArrayList<>(); for (Object value : values) { objects.add(value == null ? "" : value.toString()); } list2.add(objects); } return list2; } }