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.vo.SdJyRbVo; import com.gunshi.project.xyt.entity.vo.SdSwRbVo; import com.gunshi.project.xyt.entity.vo.StRzVo; import com.gunshi.project.xyt.mapper.StPptnRHMapper; 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.ArrayList; import java.util.Date; import java.util.List; 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); } }