5 changed files with 299 additions and 0 deletions
@ -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)); |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
|
|||
|
|||
} |
@ -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; |
|||
} |
@ -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; |
|||
} |
@ -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…
Reference in new issue