package com.gunshi.project.xyt.service; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.gunshi.db.dto.DateRangeSo; import com.gunshi.project.xyt.entity.so.StatisticsQuerySo; import com.gunshi.project.xyt.entity.vo.*; import com.gunshi.project.xyt.mapper.StPptnRHMapper; import com.gunshi.project.xyt.model.StPptnRD; import com.gunshi.project.xyt.model.StPptnRH; import com.gunshi.project.xyt.util.DateUtil; import com.gunshi.project.xyt.util.ExcelUtil; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; 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 StatisticsService { @Autowired private StPptnRHMapper stPptnRHMapper; private static final String TIME_END_PREFIX = " 08:00:00"; private static final String ZERO_TIME_END_PREFIX = " 00:00:00"; public List sdJyRb(DateRangeSo dateRangeSo) { List res = new ArrayList<>(); String start = DateUtil.convertDateToString(dateRangeSo.getStart()) + TIME_END_PREFIX; String end = DateUtil.getPlusDate(dateRangeSo.getEnd(), 1) + TIME_END_PREFIX; List dates = DateUtil.getDatesBetween(dateRangeSo.getStart(), dateRangeSo.getEnd(), false); List list = stPptnRHMapper.queryList(start, end); for (String date : dates) { SdJyRbVo vo = new SdJyRbVo(); vo.setDate(date); getDrp(vo, list); res.add(vo); } return res; } private void getDrp(SdJyRbVo vo, List list) { if (CollectionUtils.isNotEmpty(list)) { String date = vo.getDate(); BigDecimal drpD = new BigDecimal(0); Date start = DateUtil.convertStringToDate(date + TIME_END_PREFIX); String end = DateUtil.getPlusTime(date + TIME_END_PREFIX, 24); List dayList = list.stream().filter(o -> o.getTm().compareTo(start) > 0 && o.getTm().compareTo(DateUtil.convertStringToDate(end)) <= 0).collect(Collectors.toList()); SimpleDateFormat simpleDateFormatHH = new SimpleDateFormat("HH"); for (int i = 0; i < dayList.size(); i++) { StPptnRH stPptnRH = dayList.get(i); if (stPptnRH.getDrp() != null) { vo = setHourDrp(vo, simpleDateFormatHH.format(stPptnRH.getTm()), stPptnRH.getDrp()); drpD = drpD.add(stPptnRH.getDrp()); } } vo.setDrpD(drpD); } } private SdJyRbVo setHourDrp(SdJyRbVo vo, String HH, BigDecimal drp) { switch (HH) { case "01": vo.setDrpH1(drp); break; case "02": vo.setDrpH2(drp); break; case "03": vo.setDrpH3(drp); break; case "04": vo.setDrpH4(drp); break; case "05": vo.setDrpH5(drp); break; case "06": vo.setDrpH6(drp); break; case "07": vo.setDrpH7(drp); break; case "08": vo.setDrpH8(drp); break; case "09": vo.setDrpH9(drp); break; case "10": vo.setDrpH10(drp); break; case "11": vo.setDrpH11(drp); break; case "12": vo.setDrpH12(drp); break; case "13": vo.setDrpH13(drp); break; case "14": vo.setDrpH14(drp); break; case "15": vo.setDrpH15(drp); break; case "16": vo.setDrpH16(drp); break; case "17": vo.setDrpH17(drp); break; case "18": vo.setDrpH18(drp); break; case "19": vo.setDrpH19(drp); break; case "20": vo.setDrpH20(drp); break; case "21": vo.setDrpH21(drp); break; case "22": vo.setDrpH22(drp); break; case "23": vo.setDrpH23(drp); break; case "00": vo.setDrpH24(drp); break; } return vo; } public void sdJyRbExport(DateRangeSo dateRangeSo, HttpServletResponse response) { List list = sdJyRb(dateRangeSo); String start = DateUtil.convertDateToChineseYmd(dateRangeSo.getStart()); String end = DateUtil.convertDateToChineseYmd(dateRangeSo.getEnd()); String fileName = start + "-" + end + "小时降雨量日报表"; ExcelUtil.exportExcel(list, fileName, SdJyRbVo.class, response, fileName); } public List sdSwRb(DateRangeSo dateRangeSo) { List res = new ArrayList<>(); String start = DateUtil.convertDateToString(dateRangeSo.getStart()) + ZERO_TIME_END_PREFIX; String end = DateUtil.getPlusDate(dateRangeSo.getEnd(), 1) + ZERO_TIME_END_PREFIX; List dates = DateUtil.getDatesBetween(dateRangeSo.getStart(), dateRangeSo.getEnd(), false); List list = stPptnRHMapper.queryRzList(start, end); for (String date : dates) { SdSwRbVo vo = new SdSwRbVo(); vo.setDate(date); getRz(vo, list); res.add(vo); } return res; } private void getRz(SdSwRbVo vo, List list) { if (CollectionUtils.isNotEmpty(list)) { String date = vo.getDate(); BigDecimal rzD = new BigDecimal(0); Integer count = 0; String start = date + ZERO_TIME_END_PREFIX; String end = DateUtil.getPlusTime(date + ZERO_TIME_END_PREFIX, 24); List dayList = list.stream().filter(o -> o.getTm().compareTo(start) >= 0 && o.getTm().compareTo(end) < 0).collect(Collectors.toList()); SimpleDateFormat simpleDateFormatHH = new SimpleDateFormat("HH"); for (int i = 0; i < dayList.size(); i++) { StRzVo stRzVo = dayList.get(i); if (stRzVo.getRz() != null) { vo = setHourRz(vo, simpleDateFormatHH.format(DateUtil.convertStringToDate(stRzVo.getTm())), stRzVo.getRz()); rzD = rzD.add(stRzVo.getRz()); count++; } } vo.setRzAvg(rzD.divide(new BigDecimal(count), 2, RoundingMode.HALF_UP)); } } private SdSwRbVo setHourRz(SdSwRbVo vo, String HH, BigDecimal rz) { switch (HH) { case "01": vo.setRzH1(rz); break; case "02": vo.setRzH2(rz); break; case "03": vo.setRzH3(rz); break; case "04": vo.setRzH4(rz); break; case "05": vo.setRzH5(rz); break; case "06": vo.setRzH6(rz); break; case "07": vo.setRzH7(rz); break; case "08": vo.setRzH8(rz); break; case "09": vo.setRzH9(rz); break; case "10": vo.setRzH10(rz); break; case "11": vo.setRzH11(rz); break; case "12": vo.setRzH12(rz); break; case "13": vo.setRzH13(rz); break; case "14": vo.setRzH14(rz); break; case "15": vo.setRzH15(rz); break; case "16": vo.setRzH16(rz); break; case "17": vo.setRzH17(rz); break; case "18": vo.setRzH18(rz); break; case "19": vo.setRzH19(rz); break; case "20": vo.setRzH20(rz); break; case "21": vo.setRzH21(rz); break; case "22": vo.setRzH22(rz); break; case "23": vo.setRzH23(rz); break; case "00": vo.setRzH24(rz); break; } return vo; } public void sdSwRbExport(DateRangeSo dateRangeSo, HttpServletResponse response) { List list = sdSwRb(dateRangeSo); String start = DateUtil.convertDateToChineseYmd(dateRangeSo.getStart()); String end = DateUtil.convertDateToChineseYmd(dateRangeSo.getEnd()); String fileName = start + "-" + end + "时段水位日报表"; ExcelUtil.exportExcel(list, fileName, SdSwRbVo.class, response, fileName); } public List rjyNb(StatisticsQuerySo statisticsQuerySo) { List res = new ArrayList<>(); Integer year = statisticsQuerySo.getYear(); List list = stPptnRHMapper.queryDayDrp(year); if (CollectionUtils.isEmpty(list)) { return res; } Map> map = list.stream().collect(Collectors.groupingBy(StPptnRD::getDay)); for (int i = 1; i < 32; i++) { RjyNbVo vo = new RjyNbVo(); String s = String.valueOf(i); vo.setDate(s); if(i < 10){ s = "0" + i; } List rds = map.get(s); if(CollectionUtils.isNotEmpty(rds)){ for (int j = 0; j < rds.size(); j++) { StPptnRD rd = rds.get(j); if (rd.getDrp() != null) { vo = setDayDrp(vo, rd.getMonth(), rd.getDrp()); } } } res.add(vo); } return res; } private RjyNbVo setDayDrp(RjyNbVo vo, String month, BigDecimal drp) { switch (month) { case "01": vo.setDrpM1(drp.toString()); break; case "02": vo.setDrpM2(drp.toString()); break; case "03": vo.setDrpM3(drp.toString()); break; case "04": vo.setDrpM4(drp.toString()); break; case "05": vo.setDrpM5(drp.toString()); break; case "06": vo.setDrpM6(drp.toString()); break; case "07": vo.setDrpM7(drp.toString()); break; case "08": vo.setDrpM8(drp.toString()); break; case "09": vo.setDrpM9(drp.toString()); break; case "10": vo.setDrpM10(drp.toString()); break; case "11": vo.setDrpM11(drp.toString()); break; case "12": vo.setDrpM12(drp.toString()); break; } return vo; } public RjyNbStatVo rjyNbStat(StatisticsQuerySo statisticsQuerySo) { RjyNbStatVo vo = new RjyNbStatVo(); Integer year = statisticsQuerySo.getYear(); List list = stPptnRHMapper.queryDayDrp(year); if (CollectionUtils.isEmpty(list)) { return vo; } BigDecimal drpSum = list.stream().map(StPptnRD::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add); vo.setDrpSum(drpSum); Long count = list.stream().filter(o -> o.getDrp().compareTo(new BigDecimal(0)) > 0).collect(Collectors.counting()); vo.setDayCount(count); //按月份分组 Map> map = list.stream().collect(Collectors.groupingBy(StPptnRD::getMonth)); List childList = new ArrayList<>(); RjyNbVo rjyNbVo = new RjyNbVo(); rjyNbVo.setDate("月降雨量"); setMonthSumDrp(rjyNbVo,map); childList.add(rjyNbVo); RjyNbVo rVo = new RjyNbVo(); rVo.setDate("降雨日数"); setMonthDrpDay(rVo,map); childList.add(rVo); RjyNbVo max = new RjyNbVo(); max.setDate("最大日量"); setMonthDrpMax(max,map); childList.add(max); vo.setList(childList); return vo; } private void setMonthDrpMax(RjyNbVo rjyNbVo, Map> map) { for(int i = 1;i< 13;i++){ String s = String.valueOf(i); if(i < 10){ s = "0" + i; } List list = map.get(s); if(CollectionUtils.isNotEmpty(list)) { BigDecimal maxDrp = list.stream().max(Comparator.comparing(StPptnRD::getDrp)).get().getDrp(); setDayDrp(rjyNbVo, s, maxDrp); } } } private void setMonthSumDrp(RjyNbVo rjyNbVo, Map> map) { for(int i = 1;i< 13;i++){ String s = String.valueOf(i); if(i < 10){ s = "0" + i; } List list = map.get(s); if(CollectionUtils.isNotEmpty(list)){ BigDecimal drpSum = list.stream().map(StPptnRD::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add); setDayDrp(rjyNbVo,s,drpSum); } } } private void setMonthDrpDay(RjyNbVo rjyNbVo, Map> map) { for(int i = 1;i< 13;i++){ String s = String.valueOf(i); if(i < 10){ s = "0" + i; } List list = map.get(s); if(CollectionUtils.isNotEmpty(list)){ Long count = list.stream().filter(o -> o.getDrp().compareTo(new BigDecimal(0)) > 0).collect(Collectors.counting()); setDayDrp(rjyNbVo,s,new BigDecimal(count)); } } } public void rjyNbExport(StatisticsQuerySo statisticsQuerySo, HttpServletResponse response) { //上方数据 List rjyNb = rjyNb(statisticsQuerySo); //下方统计数据 RjyNbStatVo vo = rjyNbStat(statisticsQuerySo); List list = vo.getList(); rjyNb.addAll(list); //最下方拼接一条数据 RjyNbVo rjyNbVo = new RjyNbVo(); rjyNbVo.setDate("年统计"); rjyNbVo.setDrpM1("降水量"); rjyNbVo.setDrpM2("降水量"); rjyNbVo.setDrpM3(vo.getDrpSum().toString()); rjyNbVo.setDrpM4(vo.getDrpSum().toString()); rjyNbVo.setDrpM5(vo.getDrpSum().toString()); rjyNbVo.setDrpM6(vo.getDrpSum().toString()); rjyNbVo.setDrpM7("降雨日数"); rjyNbVo.setDrpM8("降雨日数"); rjyNbVo.setDrpM9(vo.getDayCount().toString()); rjyNbVo.setDrpM10(vo.getDayCount().toString()); rjyNbVo.setDrpM11(vo.getDayCount().toString()); rjyNbVo.setDrpM12(vo.getDayCount().toString()); rjyNb.add(rjyNbVo); String fileName = "小玉潭水库" + statisticsQuerySo.getYear() + "年日降雨年报表"; ExcelUtil.exportExcel(rjyNb, fileName, RjyNbVo.class, response, fileName,true); } }