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.project.xyt.entity.so.InfiltraLineSo; 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.OsmoticPressDevice; import com.gunshi.project.xyt.model.OsmoticPressDeviceAutoDao; import com.gunshi.project.xyt.model.OsmoticPressR; 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 OsmoticPressDeviceAutoDao pressDeviceAutoDao; public Page queryPage(OsmoticQueryPageSo osmoticQueryPageSo) { return mapper.queryPage(osmoticQueryPageSo.getPageSo().toPage(),osmoticQueryPageSo); } /** * 测值查询,管水位和库水位数据固定查询每日早8点 * @param osmoticQuerySo * @return */ public List queryValue(OsmoticQuerySo osmoticQuerySo) { List dateList = DateUtil.getDatesBetween(osmoticQuerySo.getDateTimeRangeSo().getStart(), osmoticQuerySo.getDateTimeRangeSo().getEnd()); 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.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) { List resList = new ArrayList<>(); //查询库水位 List list = mapper.queryRz(osmoticQuerySo); //查询测站管水位 List valueList = mapper.queryValue(osmoticQuerySo); //按测站分组 Map> map = valueList.stream().collect(Collectors.groupingBy(OsmoticValueVo::getStationCode)); map.entrySet().forEach(o->{ OsmoticChartVo vo = new OsmoticChartVo(); List voList = o.getValue(); OsmoticValueVo max = voList.stream().max(Comparator.comparing(OsmoticValueVo::getValue)).get(); OsmoticValueVo min = voList.stream().min(Comparator.comparing(OsmoticValueVo::getValue)).get(); vo.setStationCode(o.getKey()); vo.setMaxValue(max.getValue()); vo.setMaxTm(max.getTm()); vo.setMinValue(min.getValue()); vo.setMinTm(min.getTm()); 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(InfiltraLineSo infiltraLineSo) { List resList = new ArrayList<>(); String profileCode = infiltraLineSo.getProfileCode(); //通过断面查询渗压设备 List stationCodes = queryPressList(profileCode); if(CollectionUtils.isEmpty(stationCodes)){ return resList; } //查询库水位 List list = mapper.queryLineRz(infiltraLineSo); Map rzMap = list.stream().collect(Collectors.toMap(StRzVo::getTm, StRzVo::getRz)); //查询测站管水位 List valueList = mapper.queryLineValue(infiltraLineSo,stationCodes); //查询测站预警信息 List warnList = mapper.queryWarn(infiltraLineSo,stationCodes); 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(InfiltraLineSo infiltraLineSo, HttpServletResponse response) { //通过断面查询渗压设备 List stationCodes = queryPressList(infiltraLineSo.getProfileCode()); //表头信息 List heads = new ArrayList<>(); heads.add("时间"); heads.add("库水位(m)"); heads.addAll(stationCodes); heads.add("结果分析"); //表格数据 List resList = infiltraLine(infiltraLineSo); List> list = new ArrayList<>(); for (OsmoticStationVo vo : resList) { Map test = new LinkedHashMap<>(); test.put("t1", vo.getTm()); test.put("t2", vo.getRz()); for(int i = 0;icode.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)); } 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.toString()); } list2.add(objects); } ExcelUtil.exportExcel(hs, list2, "浸润线", null, response, "浸润线"); } }