From 5be62326e2cad87e8cb3a2bd1d897c289efa8706 Mon Sep 17 00:00:00 2001 From: chenxiwang <1520264117@qq.com> Date: Wed, 31 Jul 2024 17:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A2=84=E6=8A=A5=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ForecastPlanController.java | 32 ++-- .../project/xyt/model/ForecastPlan.java | 17 ++ .../xyt/service/ForecastResultsService.java | 147 +++++++++++++++--- 3 files changed, 163 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gunshi/project/xyt/controller/ForecastPlanController.java b/src/main/java/com/gunshi/project/xyt/controller/ForecastPlanController.java index 311e211..f7d61ab 100644 --- a/src/main/java/com/gunshi/project/xyt/controller/ForecastPlanController.java +++ b/src/main/java/com/gunshi/project/xyt/controller/ForecastPlanController.java @@ -45,9 +45,9 @@ public class ForecastPlanController { @PostMapping("/insert") public R insert(@Validated(Insert.class) @RequestBody ForecastPlan dto) { boolean result = service.save(dto); - if(result){ - taskGroupHandler.addCronJob(String.valueOf(dto.getId()), dto); - } +// if(result){ +// taskGroupHandler.addCronJob(String.valueOf(dto.getId()), dto); +// } return R.ok(result ? dto : null); } @@ -55,11 +55,11 @@ public class ForecastPlanController { @PostMapping("/update") public R update(@Validated(Update.class) @RequestBody ForecastPlan dto) { boolean result = service.updateById(dto); - if(result){ - // 先删除,再重新添加 - taskGroupHandler.removeCronJob(String.valueOf(dto.getId())); - taskGroupHandler.addCronJob(String.valueOf(dto.getId()), dto); - } +// if(result){ +// // 先删除,再重新添加 +// taskGroupHandler.removeCronJob(String.valueOf(dto.getId())); +// taskGroupHandler.addCronJob(String.valueOf(dto.getId()), dto); +// } return R.ok(result ? dto : null); } @@ -67,16 +67,19 @@ public class ForecastPlanController { @GetMapping("/del/{id}") public R del(@Schema(name = "id") @PathVariable("id") Serializable id) { boolean b = service.removeById(id); - if (b) { - taskGroupHandler.removeCronJob((String) id); - } +// if (b) { +// taskGroupHandler.removeCronJob((String) id); +// } return R.ok(b); } @Operation(summary = "列表") @PostMapping("/list") public R> list(@RequestBody @Validated ForecastPlan forecastPlan) { - QueryWrapper wrapper = new QueryWrapper(); + QueryWrapper wrapper = new QueryWrapper() + .like(ObjectUtils.isNotNull(forecastPlan.getName()), "name", forecastPlan.getName()) + .ge(ObjectUtils.isNotNull(forecastPlan.getStartTime()), "forecast_tm", forecastPlan.getStartTime()) + .le(ObjectUtils.isNotNull(forecastPlan.getEndTime()), "forecast_tm", forecastPlan.getEndTime()); if(StringUtils.isNotBlank(forecastPlan.getSortField())){ wrapper.orderBy(true, ObjectUtils.isEmpty(forecastPlan.getIsAsc()) ? false : forecastPlan.getIsAsc(), forecastPlan.getSortField()); } @@ -86,7 +89,10 @@ public class ForecastPlanController { @Operation(summary = "分页") @PostMapping("/page") public R> page(@RequestBody @Validated ForecastPlan forecastPlan) { - QueryWrapper wrapper = new QueryWrapper(); + QueryWrapper wrapper = new QueryWrapper() + .like(ObjectUtils.isNotNull(forecastPlan.getName()), "name", forecastPlan.getName()) + .ge(ObjectUtils.isNotNull(forecastPlan.getStartTime()), "forecast_tm", forecastPlan.getStartTime()) + .le(ObjectUtils.isNotNull(forecastPlan.getEndTime()), "forecast_tm", forecastPlan.getEndTime()); if(StringUtils.isNotBlank(forecastPlan.getSortField())){ wrapper.orderBy(true, ObjectUtils.isEmpty(forecastPlan.getIsAsc()) ? false : forecastPlan.getIsAsc(), forecastPlan.getSortField()); } diff --git a/src/main/java/com/gunshi/project/xyt/model/ForecastPlan.java b/src/main/java/com/gunshi/project/xyt/model/ForecastPlan.java index 4677839..c3e547b 100644 --- a/src/main/java/com/gunshi/project/xyt/model/ForecastPlan.java +++ b/src/main/java/com/gunshi/project/xyt/model/ForecastPlan.java @@ -127,4 +127,21 @@ public class ForecastPlan extends GenericPageParams implements Serializable { @TableField(value="time_interval") @Schema(description="任务时间间隔(分钟)") private String timeInterval; + + + /** + * 选择的起始时间 + */ + @Schema(description = "选择的起始时间") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + @TableField(exist = false) + private Date startTime; + + /** + * 选择的结束时间 + */ + @Schema(description = "选择的结束时间") + @JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8") + @TableField(exist = false) + private Date endTime; } diff --git a/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java b/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java index 81803b6..91cda68 100644 --- a/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java +++ b/src/main/java/com/gunshi/project/xyt/service/ForecastResultsService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gunshi.algorithm.RrainfallForecast; +import com.gunshi.algorithm.RunoffService; import com.gunshi.model.vo.FloodAlgorithemVo; import com.gunshi.project.xyt.entity.vo.ForeRainTimeVo; import com.gunshi.project.xyt.entity.vo.ForeRainVo; @@ -26,6 +27,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -160,7 +162,7 @@ public class ForecastResultsService extends ServiceImpl().eq("stcd", stcd)); String tm = "";// 时间格式应为:YYYYMMDDHH其中HH只能为08或20,例如2023062908 if (isBeforeEightAM(now)) { - tm = eightSdf.format(now); - } else { tm = sixteenSdf.format(now); + } else { + tm = eightSdf.format(now); } - tm = tm.trim().replace("-", ""); + tm = tm.replaceAll(" ", "").replaceAll("-", ""); List gribList = forecastService.getGribData(tm, false); //24小时每个网格的总量 List total = gribList.stream().filter(o -> o.getTmRange().getInterval() == 24).collect(Collectors.toList()); @@ -244,31 +246,39 @@ public class ForecastResultsService extends ServiceImpl getHumanForecastResult(ForecastPlan forecastPlan) { List resultList = new ArrayList<>(); + // 需要根据△T来整编实际降雨、水位数据 + List paramList = forecastUseparamService.list(); + Map paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue)); + double dt = Double.parseDouble(paramMap.get("dt")); + // 获取时间范围内的真实降雨 - List pptnRList = stPptnRService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); + List pptnRRealList = stPptnRService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); // 获取时间范围内的真实水位 - List rsvrRList = stRsvrRService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); + List rsvrRRealList = stRsvrRService.list(new QueryWrapper().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); // 获取时间范围内的真实入库流量 - List waterRkList = stWaterRService.list(new QueryWrapper().eq("stcd", "1111111").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); + List waterRkRealList = stWaterRService.list(new QueryWrapper().eq("stcd", "1111111").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); // 获取时间范围内的真实出库流量 - List waterCkList = stWaterRService.list(new QueryWrapper().eq("stcd", "2222222").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); + List waterCkRealList = stWaterRService.list(new QueryWrapper().eq("stcd", "2222222").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm())); + // 获取预测数据 List floodAlgorithemVos = floodForecast(forecastPlan); if (CollectionUtils.isNotEmpty(floodAlgorithemVos)) { - Map pptnRMap = new HashMap<>(); - if (CollectionUtils.isNotEmpty(pptnRList)) { - pptnRMap = pptnRList.stream().collect(Collectors.toMap(StPptnR::getTm, StPptnR::getDrp)); + Map pptnRMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(pptnRRealList)) { + pptnRRealList = reorganizePptnRData(pptnRRealList, dt); + pptnRMap = pptnRRealList.stream().collect(Collectors.toMap(obj -> sdf.format(obj.getTm()), obj -> obj.getDrp())); } - Map rsvrRMap = new HashMap<>(); - if (CollectionUtils.isNotEmpty(rsvrRList)) { - rsvrRMap = rsvrRList.stream().collect(Collectors.toMap(StRsvrR::getTm, StRsvrR::getRz)); + Map rsvrRMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(rsvrRRealList)) { + rsvrRRealList = reorganizeRsvrRData(rsvrRRealList, dt); + rsvrRMap = rsvrRRealList.stream().collect(Collectors.toMap(obj -> sdf.format(obj.getTm()), obj -> obj.getRz())); } - Map waterRkMap = new HashMap<>(); - if (CollectionUtils.isNotEmpty(waterRkList)) { - waterRkMap = waterRkList.stream().collect(Collectors.toMap(StWaterR::getTm, StWaterR::getQ)); + Map waterRkMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(waterRkRealList)) { + waterRkMap = waterRkRealList.stream().collect(Collectors.toMap(obj -> sdf.format(obj.getTm()), obj -> obj.getQ())); } - Map waterCkMap = new HashMap<>(); - if (CollectionUtils.isNotEmpty(waterCkList)) { - waterCkMap = waterRkList.stream().collect(Collectors.toMap(StWaterR::getTm, StWaterR::getQ)); + Map waterCkMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(waterCkRealList)) { + waterCkMap = waterRkRealList.stream().collect(Collectors.toMap(obj -> sdf.format(obj.getTm()), obj -> obj.getQ())); } // 组装 for (FloodAlgorithemVo floodVo : floodAlgorithemVos) { @@ -290,6 +300,103 @@ public class ForecastResultsService extends ServiceImpl + * @auther: cxw + */ + private List reorganizePptnRData(List pptnRRealList, double dt) { + // 每次加0小时30分钟,根据dt设置,此时dt=0.5小时 + int totalMinutes = (int) Math.round(dt * 60); + // 计算小时数 + int hours = totalMinutes / 60; + // 计算剩余的分钟数(即不足一小时的部分) + int minutes = totalMinutes % 60; + List resultList = new ArrayList<>(); + for (int i = 0; i < pptnRRealList.size(); i++) { + StPptnR stPptnR = pptnRRealList.get(i); + resultList.add(stPptnR); + Date tm = stPptnR.getTm(); + String drp = stPptnR.getDrp(); + if (i + 1 == pptnRRealList.size()) { + break; + } else { + StPptnR stPptnRNext = pptnRRealList.get(i + 1); + // 两条数据的小时差 + double diffHours = dateHourDifference(stPptnR.getTm(), stPptnRNext.getTm()); + int floorNum = (int) Math.floor(diffHours / dt); + BigDecimal meanDifference = + new BigDecimal(stPptnRNext.getDrp()).subtract(new BigDecimal(drp)).divide(new BigDecimal(floorNum), + BigDecimal.ROUND_HALF_UP, 2); + for (int j = 1; j < floorNum; j++) { + // 增补出的数据 + StPptnR suppleStPptnR = new StPptnR(); + BigDecimal add = new BigDecimal(drp).add(meanDifference.multiply(new BigDecimal(j))).setScale(2, BigDecimal.ROUND_HALF_UP); + try { + suppleStPptnR.setTm(sdf.parse(RunoffService.calc(sdf.format(tm), hours, minutes, true))); + } catch (ParseException e) { + throw new RuntimeException(e); + } + suppleStPptnR.setDrp(add.toString()); + suppleStPptnR.setStcd(stPptnR.getStcd()); + resultList.add(suppleStPptnR); + } + } + } + return resultList; + } + + /** + * @description: 根据△T来整编实际水位数据 + * @param rsvrRRealList + * @param dt + * @return: java.util.List + * @auther: cxw + */ + private List reorganizeRsvrRData(List rsvrRRealList, double dt) { + // 每次加0小时30分钟,根据dt设置,此时dt=0.5小时 + int totalMinutes = (int) Math.round(dt * 60); + // 计算小时数 + int hours = totalMinutes / 60; + // 计算剩余的分钟数(即不足一小时的部分) + int minutes = totalMinutes % 60; + List resultList = new ArrayList<>(); + for (int i = 0; i < rsvrRRealList.size(); i++) { + StRsvrR stRsvrR = rsvrRRealList.get(i); + resultList.add(stRsvrR); + Date tm = stRsvrR.getTm(); + String drp = stRsvrR.getRz(); + if (i + 1 == rsvrRRealList.size()) { + break; + } else { + StRsvrR stRsvrRNext = rsvrRRealList.get(i + 1); + // 两条数据的小时差 + double diffHours = dateHourDifference(stRsvrR.getTm(), stRsvrRNext.getTm()); + int floorNum = (int) Math.floor(diffHours / dt); + BigDecimal meanDifference = + new BigDecimal(stRsvrRNext.getRz()).subtract(new BigDecimal(drp)).divide(new BigDecimal(floorNum), + BigDecimal.ROUND_HALF_UP, 2); + for (int j = 1; j < floorNum; j++) { + // 增补出的数据 + StRsvrR suppleStRsvrR = new StRsvrR(); + BigDecimal add = new BigDecimal(drp).add(meanDifference.multiply(new BigDecimal(j))).setScale(2, BigDecimal.ROUND_HALF_UP); + try { + suppleStRsvrR.setTm(sdf.parse(RunoffService.calc(sdf.format(tm), hours, minutes, true))); + } catch (ParseException e) { + throw new RuntimeException(e); + } + suppleStRsvrR.setRz(add.toString()); + suppleStRsvrR.setStcd(stRsvrR.getStcd()); + resultList.add(suppleStRsvrR); + } } } return resultList;