gunshi-project-ss/src/main/java/com/gunshi/project/ss/service/StatisticsService.java

645 lines
24 KiB
Java

package com.gunshi.project.ss.service;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.gunshi.db.dto.DateRangeSo;
import com.gunshi.project.ss.common.model.StStbprpB;
import com.gunshi.project.ss.common.model.vo.StRzVo;
import com.gunshi.project.ss.entity.dto.ReportTmSo;
import com.gunshi.project.ss.entity.so.StatisticsQuerySo;
import com.gunshi.project.ss.entity.vo.*;
import com.gunshi.project.ss.mapper.StPptnRHMapper;
import com.gunshi.project.ss.model.StPptnRD;
import com.gunshi.project.ss.model.StPptnRH;
import com.gunshi.project.ss.util.DateUtil;
import com.gunshi.project.ss.util.ExcelUtil;
import com.gunshi.project.ss.util.MyBeanUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
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.time.LocalDate;
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;
@Autowired
private StStbprpBService stStbprpBService;
private static final String TIME_END_PREFIX = " 08:00:00";
private static final String ZERO_TIME_END_PREFIX = " 00:00:00";
public List<SdJyRbVo> getDailyRain(ReportTmSo tm) {
List<SdJyRbVo> res = new ArrayList<>();
List<StStbprpB> stStbprpBList = stStbprpBService.getPptnStations();
String start = DateUtil.convertDateToString(tm.getDate()) + TIME_END_PREFIX;
String end = DateUtil.getPlusDate(tm.getDate(), 1) + TIME_END_PREFIX;
for (StStbprpB stStbprpB : stStbprpBList) {
List<String> dates = DateUtil.getDatesBetween(tm.getDate(), tm.getDate(), false);
List<StPptnRH> list = stPptnRHMapper.queryListByStcd(start, end,stStbprpB.getStcd());
for (String date : dates) {
SdJyRbVo vo = new SdJyRbVo();
vo.setDate(date);
getDrp(vo, list);
vo.setStcd(stStbprpB.getStcd());
vo.setStnm(stStbprpB.getStnm());
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(ReportTmSo tm, HttpServletResponse response) {
List<SdJyRbVo> list = getDailyRain(tm);
String start = DateUtil.convertDateToChineseYmd(tm.getDate());
String end = DateUtil.convertDateToChineseYmd(tm.getDate());
String fileName = start + "-" + end + "小时降雨量日报表";
ExcelUtil.exportExcel(list, fileName, SdJyRbVo.class, response, fileName);
}
public List<SdSwRbVo> sdSwRb(ReportTmSo reportTmSo) {
List<SdSwRbVo> res = new ArrayList<>();
List<StStbprpB> pptnStations = stStbprpBService.getPptnStations();
String start = DateUtil.convertDateToString(reportTmSo.getDate()) + ZERO_TIME_END_PREFIX;
String end = DateUtil.getPlusDate(reportTmSo.getDate(), 1) + ZERO_TIME_END_PREFIX;
List<String> dates = DateUtil.getDatesBetween(reportTmSo.getDate(), reportTmSo.getDate(), false);
for (StStbprpB pptnStation : pptnStations) {
List<StRzVo> list = stPptnRHMapper.queryRzListByStcd(start, end,pptnStation.getStcd());
for (String date : dates) {
SdSwRbVo vo = new SdSwRbVo();
vo.setDate(date);
vo.setStcd(pptnStation.getStcd());
vo.setStnm(pptnStation.getStnm());
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++;
}
}
if(count > 0){
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(ReportTmSo dateRangeSo, HttpServletResponse response) {
List<SdSwRbVo> list = sdSwRb(dateRangeSo);
String tm = DateUtil.convertDateToChineseYmd(dateRangeSo.getDate());
String fileName = tm + "时段水位日报表";
ExcelUtil.exportExcel(list, fileName, SdSwRbVo.class, response, fileName);
}
public List<RjyNbVo> rjyNb(StatisticsQuerySo statisticsQuerySo,Integer type) {
List<RjyNbVo> res = new ArrayList<>();
Integer year = statisticsQuerySo.getYear();
String stcd = statisticsQuerySo.getStcd();
List<StPptnRD> list = new ArrayList<>();
if(type != null){
list = stPptnRHMapper.queryDayRzByStcd(year.toString(),stcd);
}else{
list = stPptnRHMapper.queryDayDrpByStcd(year,stcd);
}
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().toString());
}
}
}
res.add(vo);
}
return res;
}
private RjyNbVo setDayDrp(RjyNbVo vo, String month, String drp) {
switch (month) {
case "01":
vo.setDrpM1(drp);
break;
case "02":
vo.setDrpM2(drp);
break;
case "03":
vo.setDrpM3(drp);
break;
case "04":
vo.setDrpM4(drp);
break;
case "05":
vo.setDrpM5(drp);
break;
case "06":
vo.setDrpM6(drp);
break;
case "07":
vo.setDrpM7(drp);
break;
case "08":
vo.setDrpM8(drp);
break;
case "09":
vo.setDrpM9(drp);
break;
case "10":
vo.setDrpM10(drp);
break;
case "11":
vo.setDrpM11(drp);
break;
case "12":
vo.setDrpM12(drp);
break;
}
return vo;
}
public RjyNbStatVo rjyNbStat(StatisticsQuerySo statisticsQuerySo) {
RjyNbStatVo vo = new RjyNbStatVo();
Integer year = statisticsQuerySo.getYear();
String stcd = statisticsQuerySo.getStcd();
List<StPptnRD> list = stPptnRHMapper.queryDayDrpByStcd(year,stcd);
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.toString());
}
}
}
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.toString());
}
}
}
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).toString());
}
}
}
public void rjyNbExport(StatisticsQuerySo statisticsQuerySo, HttpServletResponse response) {
//上方数据
List<RjyNbVo> rjyNb = rjyNb(statisticsQuerySo,null);
StStbprpB one = stStbprpBService.lambdaQuery().eq(StStbprpB::getStcd, statisticsQuerySo.getStcd()).one();
//下方统计数据
RjyNbStatVo vo = rjyNbStat(statisticsQuerySo);
List<RjyNbVo> list = vo.getList();
if(list != null){
rjyNb.addAll(list);
}
//最下方拼接一条数据
RjyNbVo rjyNbVo = new RjyNbVo();
rjyNbVo.setDate("年统计");
rjyNbVo.setDrpM1("降水量");
rjyNbVo.setDrpM2("降水量");
if(vo.getDrpSum() != null){
rjyNbVo.setDrpM3(vo.getDrpSum().toString());
rjyNbVo.setDrpM4(vo.getDrpSum().toString());
rjyNbVo.setDrpM5(vo.getDrpSum().toString());
rjyNbVo.setDrpM6(vo.getDrpSum().toString());
}
rjyNbVo.setDrpM7("降雨日数");
rjyNbVo.setDrpM8("降雨日数");
if(vo.getDayCount() != null){
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 = one.getStnm() + statisticsQuerySo.getYear() + "年日降雨年报表";
ExcelUtil.exportExcel(rjyNb, fileName, RjyNbVo.class, response, fileName,1);
}
public List<RjyNbVo> rjswNb(StatisticsQuerySo statisticsQuerySo) {
return rjyNb(statisticsQuerySo,1);
}
public RjswNbStatVo rjswNbStat(StatisticsQuerySo statisticsQuerySo) {
RjswNbStatVo vo = new RjswNbStatVo();
Integer year = statisticsQuerySo.getYear();
String stcd = statisticsQuerySo.getStcd();
List<StPptnRD> list = stPptnRHMapper.queryDayRzByStcd(year.toString(),stcd);
if (CollectionUtils.isEmpty(list)) {
return vo;
}
BigDecimal max = list.stream().max(Comparator.comparing(StPptnRD::getDrp)).get().getDrp();
vo.setMax(max);
BigDecimal min = list.stream().min(Comparator.comparing(StPptnRD::getDrp)).get().getDrp();
vo.setMin(min);
BigDecimal sum = list.stream().map(StPptnRD::getDrp).reduce(BigDecimal.ZERO,BigDecimal::add);
Long count = list.stream().filter(o -> o.getDrp().compareTo(new BigDecimal(0)) > 0).collect(Collectors.counting());
vo.setAvg(sum.divide(new BigDecimal(count),2,RoundingMode.HALF_UP));
//按月份分组
Map<String, List<StPptnRD>> map = list.stream().collect(Collectors.groupingBy(StPptnRD::getMonth));
List<NbStatVo> statVos = statData(map);
List<RjswNbVo> childList = new ArrayList<>();
RjswNbVo rjswNbVo = new RjswNbVo();
Map<String, String> avgMap = statVos.stream().collect(Collectors.toMap(NbStatVo::getMonth, NbStatVo::getAvg));
RjyNbVo rjyNbVo = setDayRz(avgMap);
BeanUtils.copyProperties(rjyNbVo,rjswNbVo);
rjswNbVo.setTheme("月统计");
rjswNbVo.setDate("平均");
childList.add(rjswNbVo);
RjswNbVo rjswNbVoMax = new RjswNbVo();
Map<String, String> maxMap = statVos.stream().collect(Collectors.toMap(NbStatVo::getMonth, NbStatVo::getMax));
RjyNbVo rjyNbVoMax = setDayRz(maxMap);
BeanUtils.copyProperties(rjyNbVoMax,rjswNbVoMax);
rjswNbVoMax.setTheme("月统计");
rjswNbVoMax.setDate("最高");
childList.add(rjswNbVoMax);
RjswNbVo rjMaxDate = new RjswNbVo();
Map<String, String> maxDateMap = statVos.stream().collect(Collectors.toMap(NbStatVo::getMonth, NbStatVo::getMaxDate));
RjyNbVo rjyNbVoMaxDate = setDayRz(maxDateMap);
BeanUtils.copyProperties(rjyNbVoMaxDate,rjMaxDate);
rjMaxDate.setTheme("月统计");
rjMaxDate.setDate("最高日期");
childList.add(rjMaxDate);
RjswNbVo rjswNbVoMin = new RjswNbVo();
Map<String, String> minMap = statVos.stream().collect(Collectors.toMap(NbStatVo::getMonth, NbStatVo::getMin));
RjyNbVo rjyNbVoMin = setDayRz(minMap);
BeanUtils.copyProperties(rjyNbVoMin,rjswNbVoMin);
rjswNbVoMin.setTheme("月统计");
rjswNbVoMin.setDate("最低");
childList.add(rjswNbVoMin);
RjswNbVo rjMinDate = new RjswNbVo();
Map<String, String> minDateMap = statVos.stream().collect(Collectors.toMap(NbStatVo::getMonth, NbStatVo::getMinDate));
RjyNbVo rjyNbVoMinDate = setDayRz(minDateMap);
BeanUtils.copyProperties(rjyNbVoMinDate,rjMinDate);
rjMinDate.setTheme("月统计");
rjMinDate.setDate("最低日期");
childList.add(rjMinDate);
vo.setList(childList);
return vo;
}
private RjyNbVo setDayRz(Map<String, String> map) {
RjyNbVo rjyNbVo = new RjyNbVo();
map.entrySet().forEach(entry->{
String month = entry.getKey();
String value = entry.getValue();
setDayDrp(rjyNbVo,month,value);
});
return rjyNbVo;
}
private List<NbStatVo> statData(Map<String, List<StPptnRD>> map) {
List<NbStatVo> statVos = new ArrayList<>();
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)){
NbStatVo vo = new NbStatVo();
vo.setMonth(s);
StPptnRD max = list.stream().max(Comparator.comparing(StPptnRD::getDrp)).get();
vo.setMax(max.getDrp().toString());
vo.setMaxDate(max.getDay()+"日");
StPptnRD min = list.stream().min(Comparator.comparing(StPptnRD::getDrp)).get();
vo.setMin(min.getDrp().toString());
vo.setMinDate(min.getDay()+"日");
BigDecimal sum = list.stream().map(StPptnRD::getDrp).reduce(BigDecimal.ZERO, BigDecimal::add);
Long count = list.stream().filter(o -> o.getDrp().compareTo(new BigDecimal(0)) > 0).collect(Collectors.counting());
vo.setAvg(sum.divide(new BigDecimal(count),2,RoundingMode.HALF_UP).toString());
statVos.add(vo);
}
}
return statVos;
}
public void rjswNbExport(StatisticsQuerySo statisticsQuerySo, HttpServletResponse response) {
//上方数据
List<RjyNbVo> rjyNbVos = this.rjswNb(statisticsQuerySo);
List<RjswNbVo> rjswNbVos = MyBeanUtil.collectionCopy(rjyNbVos, RjswNbVo.class);
rjswNbVos.stream().forEach(o->o.setTheme(o.getDate()));
//下方统计数据
RjswNbStatVo statVo = this.rjswNbStat(statisticsQuerySo);
List<RjswNbVo> list = statVo.getList();
if(list != null){
rjswNbVos.addAll(list);
}
StStbprpB one = stStbprpBService.lambdaQuery().eq(StStbprpB::getStcd, statisticsQuerySo.getStcd()).one();
//最下方拼接一条数据
RjswNbVo rjswNbVo = new RjswNbVo();
rjswNbVo.setTheme("年统计");
rjswNbVo.setDate("年统计");
rjswNbVo.setDrpM1("最高水位");
if(statVo.getMax() != null){
rjswNbVo.setDrpM2(statVo.getMax().toString());
rjswNbVo.setDrpM3(statVo.getMax().toString());
rjswNbVo.setDrpM4(statVo.getMax().toString());
}
rjswNbVo.setDrpM5("最低水位");
if(statVo.getMin() != null){
rjswNbVo.setDrpM6(statVo.getMin().toString());
rjswNbVo.setDrpM7(statVo.getMin().toString());
rjswNbVo.setDrpM8(statVo.getMin().toString());
}
rjswNbVo.setDrpM9("平均水位");
if(statVo.getAvg() != null){
rjswNbVo.setDrpM10(statVo.getAvg().toString());
rjswNbVo.setDrpM11(statVo.getAvg().toString());
rjswNbVo.setDrpM12(statVo.getAvg().toString());
}
rjswNbVos.add(rjswNbVo);
String fileName = one.getStnm() + statisticsQuerySo.getYear() + "年日平均水位年报表";
ExcelUtil.exportExcel(rjswNbVos, fileName, RjswNbVo.class, response, fileName,2);
}
}