diff --git a/src/main/java/com/gunshi/project/xyt/controller/StatisticsController.java b/src/main/java/com/gunshi/project/xyt/controller/StatisticsController.java new file mode 100644 index 0000000..f300c98 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/controller/StatisticsController.java @@ -0,0 +1,57 @@ +package com.gunshi.project.xyt.controller; + +import com.gunshi.core.result.R; +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.service.StatisticsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 描述: 报图报表 + * author: xusan + * date: 2024-07-08 17:40:37 + */ +@Tag(name = "报图报表") +@RestController +@RequestMapping(value="/statistics") +public class StatisticsController{ + + @Autowired + private StatisticsService service; + + @Operation(summary = "时段降雨日报表") + @PostMapping("/sdJyRb") + public R> sdJyRb(@Validated @RequestBody DateRangeSo dateRangeSo) { + return R.ok(service.sdJyRb(dateRangeSo)); + } + + @Operation(summary = "时段降雨日报表导出") + @PostMapping( "/sdJyRb/export") + public void export(@RequestBody @Validated DateRangeSo dateRangeSo, HttpServletResponse response) { + service.sdJyRbExport(dateRangeSo,response); + } + + @Operation(summary = "时段水位日报表") + @PostMapping("/sdSwRb") + public R> sdSwRb(@Validated @RequestBody DateRangeSo dateRangeSo) { + return R.ok(service.sdSwRb(dateRangeSo)); + } + + @Operation(summary = "时段水位日报表导出") + @PostMapping("/sdSwRb/export") + public void sdSwRbExport(@Validated @RequestBody DateRangeSo dateRangeSo, HttpServletResponse response) { + service.sdSwRbExport(dateRangeSo,response); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gunshi/project/xyt/entity/vo/SdJyRbVo.java b/src/main/java/com/gunshi/project/xyt/entity/vo/SdJyRbVo.java new file mode 100644 index 0000000..6fdd56e --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/vo/SdJyRbVo.java @@ -0,0 +1,176 @@ +package com.gunshi.project.xyt.entity.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ExcelIgnoreUnannotated +public class SdJyRbVo { + + + /** + * 日期 + */ + @ExcelProperty({"${title}","日期"}) + @ColumnWidth(15) + private String date; + + /** + * 第9小时降水量 + */ + @ExcelProperty({"${title}","9时"}) + private BigDecimal drpH9; + + /** + * 第10小时降水量 + */ + @ExcelProperty({"${title}","10时"}) + private BigDecimal drpH10; + + /** + * 第11小时降水量 + */ + @ExcelProperty({"${title}","11时"}) + private BigDecimal drpH11; + + /** + * 第12小时降水量 + */ + @ExcelProperty({"${title}","12时"}) + private BigDecimal drpH12; + + /** + * 第13小时降水量 + */ + @ExcelProperty({"${title}","13时"}) + private BigDecimal drpH13; + + /** + * 第14小时降水量 + */ + @ExcelProperty({"${title}","14时"}) + private BigDecimal drpH14; + + /** + * 第15小时降水量 + */ + @ExcelProperty({"${title}","15时"}) + private BigDecimal drpH15; + + /** + * 第16小时降水量 + */ + @ExcelProperty({"${title}","16时"}) + private BigDecimal drpH16; + + /** + * 第17小时降水量 + */ + @ExcelProperty({"${title}","17时"}) + private BigDecimal drpH17; + + /** + * 第18小时降水量 + */ + @ExcelProperty({"${title}","18时"}) + private BigDecimal drpH18; + + /** + * 第19小时降水量 + */ + @ExcelProperty({"${title}","19时"}) + private BigDecimal drpH19; + + /** + * 第20小时降水量 + */ + @ExcelProperty({"${title}","20时"}) + private BigDecimal drpH20; + + /** + * 第21小时降水量 + */ + @ExcelProperty({"${title}","21时"}) + private BigDecimal drpH21; + + /** + * 第22小时降水量 + */ + @ExcelProperty({"${title}","22时"}) + private BigDecimal drpH22; + + /** + * 第23小时降水量 + */ + @ExcelProperty({"${title}","23时"}) + private BigDecimal drpH23; + + /** + * 第24小时降水量 + */ + @ExcelProperty({"${title}","24时"}) + private BigDecimal drpH24; + + + /** + * 第1小时降水量 + */ + @ExcelProperty({"${title}","1时"}) + private BigDecimal drpH1; + + /** + * 第2小时降水量 + */ + @ExcelProperty({"${title}","2时"}) + private BigDecimal drpH2; + + /** + * 第3小时降水量 + */ + @ExcelProperty({"${title}","3时"}) + private BigDecimal drpH3; + + /** + * 第4小时降水量 + */ + @ExcelProperty({"${title}","4时"}) + private BigDecimal drpH4; + + /** + * 第5小时降水量 + */ + @ExcelProperty({"${title}","5时"}) + private BigDecimal drpH5; + + /** + * 第6小时降水量 + */ + @ExcelProperty({"${title}","6时"}) + private BigDecimal drpH6; + + /** + * 第7小时降水量 + */ + @ExcelProperty({"${title}","7时"}) + private BigDecimal drpH7; + + /** + * 第8小时降水量 + */ + @ExcelProperty({"${title}","8时"}) + private BigDecimal drpH8; + + /** + * 日降水量 + */ + @ExcelProperty({"${title}","日累计"}) + @ColumnWidth(15) + private BigDecimal drpD; + + + +} diff --git a/src/main/java/com/gunshi/project/xyt/entity/vo/SdSwRbVo.java b/src/main/java/com/gunshi/project/xyt/entity/vo/SdSwRbVo.java new file mode 100644 index 0000000..419400c --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/entity/vo/SdSwRbVo.java @@ -0,0 +1,176 @@ +package com.gunshi.project.xyt.entity.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ExcelIgnoreUnannotated +public class SdSwRbVo { + + + /** + * 日期 + */ + @ExcelProperty({"${title}","日期"}) + @ColumnWidth(15) + private String date; + + /** + * 第0小时水位 + */ + @ExcelProperty({"${title}","0时"}) + private BigDecimal rzH24; + + + /** + * 第1小时水位 + */ + @ExcelProperty({"${title}","1时"}) + private BigDecimal rzH1; + + /** + * 第2小时水位 + */ + @ExcelProperty({"${title}","2时"}) + private BigDecimal rzH2; + + /** + * 第3小时水位 + */ + @ExcelProperty({"${title}","3时"}) + private BigDecimal rzH3; + + /** + * 第4小时水位 + */ + @ExcelProperty({"${title}","4时"}) + private BigDecimal rzH4; + + /** + * 第5小时水位 + */ + @ExcelProperty({"${title}","5时"}) + private BigDecimal rzH5; + + /** + * 第6小时水位 + */ + @ExcelProperty({"${title}","6时"}) + private BigDecimal rzH6; + + /** + * 第7小时水位 + */ + @ExcelProperty({"${title}","7时"}) + private BigDecimal rzH7; + + /** + * 第8小时水位 + */ + @ExcelProperty({"${title}","8时"}) + private BigDecimal rzH8; + + /** + * 第9小时水位 + */ + @ExcelProperty({"${title}","9时"}) + private BigDecimal rzH9; + + /** + * 第10小时水位 + */ + @ExcelProperty({"${title}","10时"}) + private BigDecimal rzH10; + + /** + * 第11小时水位 + */ + @ExcelProperty({"${title}","11时"}) + private BigDecimal rzH11; + + /** + * 第12小时水位 + */ + @ExcelProperty({"${title}","12时"}) + private BigDecimal rzH12; + + /** + * 第13小时水位 + */ + @ExcelProperty({"${title}","13时"}) + private BigDecimal rzH13; + + /** + * 第14小时水位 + */ + @ExcelProperty({"${title}","14时"}) + private BigDecimal rzH14; + + /** + * 第15小时水位 + */ + @ExcelProperty({"${title}","15时"}) + private BigDecimal rzH15; + + /** + * 第16小时水位 + */ + @ExcelProperty({"${title}","16时"}) + private BigDecimal rzH16; + + /** + * 第17小时水位 + */ + @ExcelProperty({"${title}","17时"}) + private BigDecimal rzH17; + + /** + * 第18小时水位 + */ + @ExcelProperty({"${title}","18时"}) + private BigDecimal rzH18; + + /** + * 第19小时水位 + */ + @ExcelProperty({"${title}","19时"}) + private BigDecimal rzH19; + + /** + * 第20小时水位 + */ + @ExcelProperty({"${title}","20时"}) + private BigDecimal rzH20; + + /** + * 第21小时水位 + */ + @ExcelProperty({"${title}","21时"}) + private BigDecimal rzH21; + + /** + * 第22小时水位 + */ + @ExcelProperty({"${title}","22时"}) + private BigDecimal rzH22; + + /** + * 第23小时水位 + */ + @ExcelProperty({"${title}","23时"}) + private BigDecimal rzH23; + + + + /** + * 日平均 + */ + @ExcelProperty({"${title}","平均"}) + @ColumnWidth(15) + private BigDecimal rzAvg; + +} diff --git a/src/main/java/com/gunshi/project/xyt/mapper/StPptnRHMapper.java b/src/main/java/com/gunshi/project/xyt/mapper/StPptnRHMapper.java index 521e16e..092232e 100644 --- a/src/main/java/com/gunshi/project/xyt/mapper/StPptnRHMapper.java +++ b/src/main/java/com/gunshi/project/xyt/mapper/StPptnRHMapper.java @@ -1,8 +1,12 @@ package com.gunshi.project.xyt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gunshi.project.xyt.entity.vo.StRzVo; import com.gunshi.project.xyt.model.StPptnRH; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 描述: 降雨量小时表 @@ -12,4 +16,7 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface StPptnRHMapper extends BaseMapper { + List queryList(@Param("start") String start,@Param("end") String end); + + List queryRzList(@Param("start") String start,@Param("end") String end); } \ No newline at end of file diff --git a/src/main/java/com/gunshi/project/xyt/service/StatisticsService.java b/src/main/java/com/gunshi/project/xyt/service/StatisticsService.java new file mode 100644 index 0000000..99dc3a3 --- /dev/null +++ b/src/main/java/com/gunshi/project/xyt/service/StatisticsService.java @@ -0,0 +1,286 @@ +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); + } +} + + diff --git a/src/main/java/com/gunshi/project/xyt/util/DateUtil.java b/src/main/java/com/gunshi/project/xyt/util/DateUtil.java index 4d0cd17..bfc1933 100644 --- a/src/main/java/com/gunshi/project/xyt/util/DateUtil.java +++ b/src/main/java/com/gunshi/project/xyt/util/DateUtil.java @@ -23,6 +23,8 @@ public class DateUtil { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + private static SimpleDateFormat chineseYmd = new SimpleDateFormat("yyyy年MM月dd日"); + private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static DateTimeFormatter ymdformat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -53,6 +55,10 @@ public class DateUtil { return df.format(date); } + public static String convertDateToChineseYmd(Date date){ + return chineseYmd.format(date); + } + public static long hoursBetweenDate(Date start,Date end){ long startTime = start.getTime(); long endTime = end.getTime(); @@ -119,6 +125,12 @@ public class DateUtil { return minusTime.format(formatter); } + public static String getPlusTime(String str,long hour){ + LocalDateTime dateTime = LocalDateTime.parse(str, formatter); + LocalDateTime plusTime = dateTime.plusHours(hour); + return plusTime.format(formatter); + } + public static String getPlusDate(Date date,long day){ String str = convertDateToString(date); LocalDate localDate = LocalDate.parse(str, ymdformat); diff --git a/src/main/resources/mapper/StPptnRHMapper.xml b/src/main/resources/mapper/StPptnRHMapper.xml index ea998c1..730d7aa 100644 --- a/src/main/resources/mapper/StPptnRHMapper.xml +++ b/src/main/resources/mapper/StPptnRHMapper.xml @@ -2,4 +2,16 @@ + + +