461 lines
16 KiB
Java
461 lines
16 KiB
Java
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<SdJyRbVo> sdJyRb(DateRangeSo dateRangeSo) {
|
|
List<SdJyRbVo> res = new ArrayList<>();
|
|
String start = DateUtil.convertDateToString(dateRangeSo.getStart()) + TIME_END_PREFIX;
|
|
String end = DateUtil.getPlusDate(dateRangeSo.getEnd(), 1) + TIME_END_PREFIX;
|
|
List<String> dates = DateUtil.getDatesBetween(dateRangeSo.getStart(), dateRangeSo.getEnd(), false);
|
|
List<StPptnRH> 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<StPptnRH> 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<StPptnRH> 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<SdJyRbVo> 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<SdSwRbVo> sdSwRb(DateRangeSo dateRangeSo) {
|
|
List<SdSwRbVo> 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<String> dates = DateUtil.getDatesBetween(dateRangeSo.getStart(), dateRangeSo.getEnd(), false);
|
|
List<StRzVo> 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<StRzVo> 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<StRzVo> 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<SdSwRbVo> 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<RjyNbVo> rjyNb(StatisticsQuerySo statisticsQuerySo) {
|
|
List<RjyNbVo> res = new ArrayList<>();
|
|
Integer year = statisticsQuerySo.getYear();
|
|
List<StPptnRD> list = stPptnRHMapper.queryDayDrp(year);
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
return res;
|
|
}
|
|
Map<String, List<StPptnRD>> 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<StPptnRD> 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<StPptnRD> 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<String, List<StPptnRD>> map = list.stream().collect(Collectors.groupingBy(StPptnRD::getMonth));
|
|
|
|
List<RjyNbVo> 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<String, List<StPptnRD>> map) {
|
|
for(int i = 1;i< 13;i++){
|
|
String s = String.valueOf(i);
|
|
if(i < 10){
|
|
s = "0" + i;
|
|
}
|
|
List<StPptnRD> 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<String, List<StPptnRD>> map) {
|
|
for(int i = 1;i< 13;i++){
|
|
String s = String.valueOf(i);
|
|
if(i < 10){
|
|
s = "0" + i;
|
|
}
|
|
List<StPptnRD> 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<String, List<StPptnRD>> map) {
|
|
for(int i = 1;i< 13;i++){
|
|
String s = String.valueOf(i);
|
|
if(i < 10){
|
|
s = "0" + i;
|
|
}
|
|
List<StPptnRD> 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<RjyNbVo> rjyNb = rjyNb(statisticsQuerySo);
|
|
//下方统计数据
|
|
RjyNbStatVo vo = rjyNbStat(statisticsQuerySo);
|
|
List<RjyNbVo> 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);
|
|
}
|
|
}
|
|
|
|
|