Browse Source

feat: 水闸水雨情统计相关接口

master_tdsql
hxh 1 year ago
parent
commit
f7b653684d
  1. 54
      shuili-system/src/main/java/com/kms/yxgh/sz/controller/SzYqStatisticsController.java
  2. 53
      shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqDailyWaterLevelDto.java
  3. 31
      shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqExceedIndexDto.java
  4. 22
      shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqExceedIndexQueDto.java
  5. 139
      shuili-system/src/main/java/com/kms/yxgh/sz/service/SzYqStatisticsService.java

54
shuili-system/src/main/java/com/kms/yxgh/sz/controller/SzYqStatisticsController.java

@ -0,0 +1,54 @@
package com.kms.yxgh.sz.controller;
import com.kms.yxgh.base.Response;
import com.kms.yxgh.sz.dto.SzYqDailyWaterLevelDto;
import com.kms.yxgh.sz.dto.SzYqExceedIndexDto;
import com.kms.yxgh.sz.dto.SzYqExceedIndexQueDto;
import com.kms.yxgh.sz.service.SzYqStatisticsService;
import com.shuili.common.core.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
* @ClassName: SzYqStatisticsController
* @Description: TODO
* @Date: 2024/3/5 上午10:10
* *
* @author: hxh
* @version: 1.0
*/
@RestController
@RequestMapping("/run/sz/yq/statistics")
@Api(tags = "堤防水雨情统计")
public class SzYqStatisticsController extends BaseController {
@Autowired
private SzYqStatisticsService dfYqStatisticsService;
///超出指标统计
@PostMapping("/exceed-index")
@ApiOperation("超出指标统计")
public Response<SzYqExceedIndexDto> exceedIndex(@RequestBody SzYqExceedIndexQueDto dto) {
return Response.ok(dfYqStatisticsService.exceedIndex(dto));
}
///获取10天内某堤防水位数据+分洪水位+警戒水位
@PostMapping("/get-ten-days-water-regime")
@ApiOperation("获取10天内某堤防水位数据+分洪水位+警戒水位")
public Response<SzYqDailyWaterLevelDto> getTenDaysWaterRegime(@RequestBody SzYqExceedIndexQueDto dto) {
return Response.ok(dfYqStatisticsService.getTenDaysWaterRegime(dto));
}
//获取10天内某堤防降雨量和过闸水量
@PostMapping("/get-ten-days-rainfall")
@ApiOperation("获取10天内某堤防降雨量和过闸水量")
public Response<SzYqDailyWaterLevelDto> getTenDaysRainfall(@RequestBody SzYqExceedIndexQueDto dto) {
return Response.ok(dfYqStatisticsService.getTenDaysRainfall(dto));
}
}

53
shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqDailyWaterLevelDto.java

@ -0,0 +1,53 @@
package com.kms.yxgh.sz.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
* @ClassName: SzYqDailyWaterLevelDto
* @Description: TODO
* @Date: 2024/3/5 上午10:51
* *
* @author: hxh
* @version: 1.0
*/
@ApiModel("水闸水位日报")
@Data
public class SzYqDailyWaterLevelDto {
@ApiModelProperty("水闸水位数据")
private Map<String, WaterLevel> waterLevelMap;
@ApiModelProperty("降雨量和过闸流量")
private Map<String, RainfallAndSluiceFlow> rainfallAndSluiceFlowMap;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class RainfallAndSluiceFlow {
@ApiModelProperty("降雨量")
private String rainfall;
@ApiModelProperty("过闸流量")
private String sluiceFlow;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class WaterLevel {
@ApiModelProperty("水位")
private String waterLevel;
@ApiModelProperty("分洪水位")
private String floodLevel;
@ApiModelProperty("警戒水位")
private String warningLevel;
}
}

31
shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqExceedIndexDto.java

@ -0,0 +1,31 @@
package com.kms.yxgh.sz.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName: SzYqExceedIndexDto
* @Description: TODO
* @Date: 2024/3/5 上午10:18
* *
* @author: hxh
* @version: 1.0
*/
@Data
@ApiModel("水闸水雨情超出指标统计结果")
public class SzYqExceedIndexDto {
@ApiModelProperty("低于洪峰次数")
private Integer belowPeakCount;
@ApiModelProperty("超出警戒次数")
private Integer exceedWarningCount;
@ApiModelProperty("超出降雨量次数")
private Integer exceedRainfallCount;
@ApiModelProperty("超出过闸流量次数")
private Integer exceedSluiceFlowCount;
}

22
shuili-system/src/main/java/com/kms/yxgh/sz/dto/SzYqExceedIndexQueDto.java

@ -0,0 +1,22 @@
package com.kms.yxgh.sz.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName: SzYqExceedIndexQueDto
* @Description: TODO
* @Date: 2024/3/5 上午10:18
* *
* @author: hxh
* @version: 1.0
*/
@Data
@ApiModel("水闸水雨情超出指标统计")
public class SzYqExceedIndexQueDto {
@ApiModelProperty("水闸代码")
private String wagaCode;
}

139
shuili-system/src/main/java/com/kms/yxgh/sz/service/SzYqStatisticsService.java

@ -0,0 +1,139 @@
package com.kms.yxgh.sz.service;
import com.kms.yxgh.common.DailySumDto;
import com.kms.yxgh.sz.dto.SzYqDailyWaterLevelDto;
import com.kms.yxgh.sz.dto.SzYqExceedIndexDto;
import com.kms.yxgh.sz.dto.SzYqExceedIndexQueDto;
import com.kms.yxgh.sz.mapper.SzWaterRegimeMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @ClassName: SzYqStatisticsService
* @Description: TODO
* @Date: 2024/3/5 上午10:12
* *
* @author: hxh
* @version: 1.0
*/
@AllArgsConstructor
@Service
public class SzYqStatisticsService {
private final SzWaterRegimeMapper szWaterRegimeMapper;
public SzYqExceedIndexDto exceedIndex(SzYqExceedIndexQueDto dto) {
SzYqExceedIndexDto result = new SzYqExceedIndexDto();
CompletableFuture<Integer> belowPeakCount = CompletableFuture.supplyAsync(() -> belowPeakCount(dto));
CompletableFuture<Integer> exceedWarningCount = CompletableFuture.supplyAsync(() -> exceedWarningCount(dto));
CompletableFuture<Integer> exceedRainfallCount = CompletableFuture.supplyAsync(() -> exceedRainfallCount(dto));
CompletableFuture<Integer> exceedSluiceFlowCount = CompletableFuture.supplyAsync(() -> exceedSluiceFlowCount(dto));
CompletableFuture.allOf(belowPeakCount, exceedWarningCount, exceedRainfallCount, exceedSluiceFlowCount).join();
result.setBelowPeakCount(belowPeakCount.join());
result.setExceedWarningCount(exceedWarningCount.join());
result.setExceedRainfallCount(exceedRainfallCount.join());
result.setExceedSluiceFlowCount(exceedSluiceFlowCount.join());
return result;
}
private int belowPeakCount(SzYqExceedIndexQueDto dto) {
Date tenDaysAgo = getTenDaysAgo();
return szWaterRegimeMapper.belowPeakCount(dto, tenDaysAgo, 12);
}
//计算10天内的时间函数,返回Date
private Date getTenDaysAgo() {
return Date.from(LocalDateTime.now().minusDays(10).atZone(ZoneId.systemDefault()).toInstant());
}
private int exceedWarningCount(SzYqExceedIndexQueDto dto) {
Date tenDaysAgo = getTenDaysAgo();
return szWaterRegimeMapper.exceedWarningCount(dto, tenDaysAgo, 38);
}
private int exceedRainfallCount(SzYqExceedIndexQueDto dto) {
Date twentyFourHoursAgo = get24HoursAgo();
return szWaterRegimeMapper.exceedRainfallCount(dto, twentyFourHoursAgo, 50);
}
//计算24小时内的时间函数,返回Date
private Date get24HoursAgo() {
return Date.from(LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault()).toInstant());
}
private int exceedSluiceFlowCount(SzYqExceedIndexQueDto dto) {
Date tenDaysAgo = getTenDaysAgo();
return szWaterRegimeMapper.exceedSluiceFlowCount(dto, tenDaysAgo, 100);
}
public SzYqDailyWaterLevelDto getTenDaysWaterRegime(SzYqExceedIndexQueDto dto) {
List<DailySumDto> dailyWaterLevel = szWaterRegimeMapper.getTenDaysWaterRegime(dto, getTenDaysAgo());
SzYqDailyWaterLevelDto result = new SzYqDailyWaterLevelDto();
populateWaterLevelMap(result, dailyWaterLevel);
return result;
}
public SzYqDailyWaterLevelDto getTenDaysRainfall(SzYqExceedIndexQueDto dto) {
List<DailySumDto> dailyRainfall = szWaterRegimeMapper.getTenDaysTotalRainfall(dto, getTenDaysAgo());
List<DailySumDto> dailySluiceFlow = szWaterRegimeMapper.getTenDaysTotalSluiceFlow(dto, getTenDaysAgo());
SzYqDailyWaterLevelDto result = new SzYqDailyWaterLevelDto();
populateRainfallAndSluiceFlowMap(result, dailyRainfall, dailySluiceFlow);
return result;
}
private void populateWaterLevelMap(SzYqDailyWaterLevelDto result, List<DailySumDto> dailyWaterLevel) {
Map<String, DailySumDto> dailyDataMap = convertListToMap(dailyWaterLevel);
Map<String, SzYqDailyWaterLevelDto.WaterLevel> waterLevelMap =
IntStream.range(0, 10)
.mapToObj(i -> LocalDateTime.now().minusDays(10).plusDays(i))
.collect(Collectors.toMap(
date -> date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
date -> new SzYqDailyWaterLevelDto.WaterLevel(getSum(dailyDataMap, date), "12", "38")
));
result.setWaterLevelMap(waterLevelMap);
}
private void populateRainfallAndSluiceFlowMap(SzYqDailyWaterLevelDto result, List<DailySumDto> dailyRainfall, List<DailySumDto> dailySluiceFlow) {
Map<String, DailySumDto> dailyRainfallMap = convertListToMap(dailyRainfall);
Map<String, DailySumDto> dailySluiceFlowMap = convertListToMap(dailySluiceFlow);
Map<String, SzYqDailyWaterLevelDto.RainfallAndSluiceFlow> rainfallAndSluiceFlowMap =
IntStream.range(0, 10)
.mapToObj(i -> LocalDateTime.now().minusDays(10).plusDays(i))
.collect(Collectors.toMap(
date -> date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
date -> new SzYqDailyWaterLevelDto.RainfallAndSluiceFlow(
getSum(dailyRainfallMap, date),
getSum(dailySluiceFlowMap, date)
)
));
result.setRainfallAndSluiceFlowMap(rainfallAndSluiceFlowMap);
}
private String getSum(Map<String, DailySumDto> dailyDataMap, LocalDateTime date) {
return String.valueOf(dailyDataMap.getOrDefault(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), new DailySumDto()).getSum());
}
private Map<String, DailySumDto> convertListToMap(List<DailySumDto> dailyData) {
return dailyData.stream().collect(Collectors.toMap(DailySumDto::getDate, dailySumDto -> dailySumDto));
}
}
Loading…
Cancel
Save