From c43f3f16aff4812ba3f64e1a8ccba8527ec7041d Mon Sep 17 00:00:00 2001 From: yangzhe123 <2824096059@qq.com> Date: Wed, 21 Jan 2026 16:21:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=AA=E6=B0=B4-=E8=B0=83=E5=BA=A6=E6=BC=94?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ForecastProjectController.java | 13 +- .../ss/entity/dto/DispatchResultDto.java | 13 + .../ss/service/ForecastProjectService.java | 258 +++++++++--------- 3 files changed, 146 insertions(+), 138 deletions(-) create mode 100644 src/main/java/com/gunshi/project/ss/entity/dto/DispatchResultDto.java diff --git a/src/main/java/com/gunshi/project/ss/controller/ForecastProjectController.java b/src/main/java/com/gunshi/project/ss/controller/ForecastProjectController.java index 507bb9d..6ed254f 100644 --- a/src/main/java/com/gunshi/project/ss/controller/ForecastProjectController.java +++ b/src/main/java/com/gunshi/project/ss/controller/ForecastProjectController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gunshi.core.result.R; +import com.gunshi.project.ss.entity.dto.DispatchResultDto; import com.gunshi.project.ss.entity.vo.ForecastResultVo; import com.gunshi.project.ss.model.*; import com.gunshi.project.ss.service.ForecastProjectService; @@ -146,16 +147,16 @@ public class ForecastProjectController { } @Operation(summary = "调度计算-闸门开放关闭时间") - @GetMapping("/caculate/{waterLevel}") - public R> caculate(@PathVariable("waterLevel") String waterLevel) { - List res = service.caculate(waterLevel); + @GetMapping("/caculate/{id}/{waterLevel}") + public R> caculate(@PathVariable("id") String id,@PathVariable("waterLevel") String waterLevel) { + List res = service.caculate(id,waterLevel); return R.ok(res); } @Operation(summary = "调度计算-调度结果") - @GetMapping("/dispatch/result") - public R getDispatchResult(){ - ForecastDispatchResult result = service.getDispatchResult(); + @PostMapping("/dispatch/result") + public R getDispatchResult(@RequestBody DispatchResultDto dto){ + ForecastDispatchResult result = service.getDispatchResult(dto); return R.ok(result); } diff --git a/src/main/java/com/gunshi/project/ss/entity/dto/DispatchResultDto.java b/src/main/java/com/gunshi/project/ss/entity/dto/DispatchResultDto.java new file mode 100644 index 0000000..efce793 --- /dev/null +++ b/src/main/java/com/gunshi/project/ss/entity/dto/DispatchResultDto.java @@ -0,0 +1,13 @@ +package com.gunshi.project.ss.entity.dto; + + +import com.gunshi.db.dto.DateTimeRangeSo; +import lombok.Data; + +@Data +public class DispatchResultDto { + + private String projectId; + + private DateTimeRangeSo dateTimeRangeSo; +} diff --git a/src/main/java/com/gunshi/project/ss/service/ForecastProjectService.java b/src/main/java/com/gunshi/project/ss/service/ForecastProjectService.java index 4b4fe01..a823811 100644 --- a/src/main/java/com/gunshi/project/ss/service/ForecastProjectService.java +++ b/src/main/java/com/gunshi/project/ss/service/ForecastProjectService.java @@ -1,14 +1,21 @@ package com.gunshi.project.ss.service; +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gunshi.db.dto.DateTimeRangeSo; import com.gunshi.project.ss.common.util.LocalDateTimeConverter; import com.gunshi.project.ss.entity.TimeCapacity; import com.gunshi.project.ss.entity.TimeNetWater; +import com.gunshi.project.ss.entity.dto.DispatchResultDto; import com.gunshi.project.ss.entity.vo.ForecastResultVo; import com.gunshi.project.ss.mapper.ForecastProjectMapper; import com.gunshi.project.ss.model.*; +import com.gunshi.project.ss.service.AttResBaseService; +import com.gunshi.project.ss.service.ForecastResultsService; +import com.gunshi.project.ss.service.ForecastUseparamService; +import com.gunshi.project.ss.service.StZvarlBService; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.kernel.colors.DeviceRgb; import com.itextpdf.kernel.events.Event; @@ -41,7 +48,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -167,29 +173,15 @@ public class ForecastProjectService extends ServiceImpl caculate(String rz) { - BigDecimal openDoorFlow = new BigDecimal(5);//开闸门放水流量 5立方米/秒 - - ForecastTask forecastTask = new ForecastTask(); - // 设置当前时间整点 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime nowHour = now.withMinute(0).withSecond(0).withNano(0); - forecastTask.setNowTime(LocalDateTimeConverter.toDate(nowHour)); - - // 设置开始时间(当前时间减去一天) - LocalDateTime startTime = nowHour.minusDays(1); - forecastTask.setStartTime(LocalDateTimeConverter.toDate(startTime)); - - // 设置结束时间(当前时间加上durationHours) - LocalDateTime endTime = nowHour.plusHours(24); - forecastTask.setEndTime(LocalDateTimeConverter.toDate(endTime)); - - forecastTask.setForecastWarm(1); - forecastTask.setForecastPeriod(24); // 设置预报时长 - List humanForecastResult = forecastResultsService.getHumanForecastResult(forecastTask); + public List caculate(String id, String rz) { + BigDecimal openDoorFlow = new BigDecimal("5");//开闸门放水流量 5立方米/秒 + ForecastProject forecastProjectResults = getForecastProjectResults(id); + List humanForecastResult = forecastProjectResults.getVoList(); if(humanForecastResult.isEmpty()){ throw new IllegalArgumentException("对不起,暂无预报数据"); } + Date forecastTm = forecastProjectResults.getForecastTm(); + LocalDateTime nowHour = LocalDateTimeConverter.fromDate(forecastTm); //过滤出大于等于nowHour的数据 // 获取当前时间的格式化字符串(与tm格式一致) String nowHourStr = nowHour.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); @@ -203,17 +195,25 @@ public class ForecastProjectService extends ServiceImpl= 0; }) .collect(Collectors.toList()); -// filteredResults.stream().forEach(o ->{ -// o.setYcRkQValue(new BigDecimal("10")); -// o.setYcCkQValue(new BigDecimal("0")); -// }); ForecastResultVo forecastResultVo = filteredResults.get(0);//a点 //b点为filteredResults的最后一条数据 //c点为waterLevel BigDecimal waterLevel = new BigDecimal(rz);//c点 LocalDateTime start = null; LocalDateTime end = null; - List stZvarlBList = stZvarlBService.list(); + List stZvarlBList = stZvarlBService.lambdaQuery() + .orderByAsc(StZvarlB::getRz) + .list(); + if(rz != null){ + BigDecimal minRZ = stZvarlBList.get(0).getRz(); + BigDecimal maxRZ = stZvarlBList.get(stZvarlBList.size() - 1).getRz(); + BigDecimal curRZ = new BigDecimal(rz); + if(curRZ.compareTo(minRZ) < 0){ + throw new IllegalArgumentException("对不起,水位控制值小于了库容曲线的最小值"); + }else if(curRZ.compareTo(maxRZ) > 0){ + throw new IllegalArgumentException("对不起,水位控制值大于了库容曲线的最大值"); + } + } // 获取配置参数 List paramList = forecastUseparamService.list(new QueryWrapper().isNotNull("param_code").isNotNull("param_value")); if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(paramList)) { @@ -231,8 +231,10 @@ public class ForecastProjectService extends ServiceImpl 0){ + log.info("实际水位大于输入水位哦"); //如果实际水位已经大于了输入的水位的话,那么闸门开门时间就设置为当前时间 start = nowHour;// + log.info("开始时间为{}",start); //计算闸门关门时间 //计算a点库容 //库容单位 万m³ @@ -298,6 +300,7 @@ public class ForecastProjectService extends ServiceImpl 0) { // 分钟加1 @@ -333,7 +337,9 @@ public class ForecastProjectService extends ServiceImpl humanForecastResult = forecastResultsService.getHumanForecastResult(forecastTask); + public ForecastDispatchResult getDispatchResult(DispatchResultDto dto) { + ForecastProject forecastProjectResults = getForecastProjectResults(dto.getProjectId()); + List humanForecastResult = forecastProjectResults.getVoList(); + if(humanForecastResult.isEmpty()){ + throw new IllegalArgumentException("对不起,暂无预报数据"); + } + Date forecastTm = forecastProjectResults.getForecastTm(); + LocalDateTime nowHour = LocalDateTimeConverter.fromDate(forecastTm); //过滤出大于等于nowHour的数据 // 获取当前时间的格式化字符串(与tm格式一致) String nowHourStr = nowHour.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); @@ -979,13 +972,6 @@ public class ForecastProjectService extends ServiceImpl 0){ - maxRz = vo.getYcSwHValue(); - maxRzDate = LocalDateTime.parse(vo.getTm(),formatter); - } //最大入库流量 if(vo.getYcRkQValue().compareTo(maxRKQ) >0){ maxRKQ = vo.getYcRkQValue(); maxRKDate = LocalDateTime.parse(vo.getTm(),formatter); } - if(start == null){ - if(vo.getYcSwHValue().compareTo(flLowLimLev) > 0){ - start = LocalDateTime.parse(vo.getTm(),formatter); - } - } - if(vo.getYcSwHValue().compareTo(flLowLimLev) > 0){ - //如果预测水位高于汛限水位 - BigDecimal gap = vo.getYcSwHValue().subtract(flLowLimLev); - if(gap.compareTo(overLimit) > 0){ - overLimit = gap; - } - } - if(start != null && end == null){ - if(vo.getYcSwHValue().compareTo(flLowLimLev) <= 0){ - end = LocalDateTime.parse(vo.getTm(),formatter); - } - } } + DateTimeRangeSo dateTimeRangeSo = dto.getDateTimeRangeSo(); + if(dateTimeRangeSo != null){ + Date start = dateTimeRangeSo.getStart(); + Date end = dateTimeRangeSo.getEnd(); + long timeSeconds = (end.getTime() - start.getTime()) / 1000; + totalCKWater = totalCKWater.add(new BigDecimal("5").multiply(new BigDecimal(timeSeconds))); + } + result.setTotalOutflowVolume(totalCKWater.divide(new BigDecimal("10000").setScale(2,RoundingMode.HALF_UP))); + result.setTotalInflowVolume(totalRKWater.divide(new BigDecimal("10000").setScale(2,RoundingMode.HALF_UP))); result.setMaxInflow(maxRKQ); if(maxRKQ.compareTo(BigDecimal.ZERO) == 0){ result.setMaxInflowDate(nowHour); }else{ result.setMaxInflowDate(maxRKDate); } - result.setExceedLimitStart(start); - result.setExceedLimitEnd(end); - if(start == null && end == null){ - result.setExceedLimitValue(null); - }else{ - result.setExceedLimitValue(overLimit); - } - - result.setMaxReservoirLevel(maxRz); - result.setMaxReservoirLevelDate(maxRzDate); - - result.setTotalInflowVolume(totalRKWater); - result.setTotalOutflowVolume(totalCKWater); return result; } + public ForecastProject getForecastProjectResults(String projectId) { + ForecastProject forecastProject = getById(projectId); + if (Objects.isNull(forecastProject)) { + throw new IllegalArgumentException("抱歉,该预报方案不存在"); + } + List resultList = forecastResultsService.list(new QueryWrapper().eq("project_id", projectId).orderBy(true, true, "tm")); + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(resultList)) { + List vos = resultList.stream() + .map(result -> { + ForecastResultVo vo = new ForecastResultVo(); + vo.setTm(sdf.format(result.getTm())); + vo.setYcRkQValue(result.getYcRkQValue()); + vo.setRealRkQValue(result.getRealRkQValue()); + vo.setYcCkQValue(result.getYcCkQValue()); + vo.setRealCkQValue(result.getRealCkQValue()); + vo.setYcSwHValue(result.getYcSwHValue()); + vo.setRealSwHValue(result.getRealSwHValue()); + BigDecimal ycSwHValue = result.getYcSwHValue() == null ? BigDecimal.ZERO : result.getYcSwHValue(); + BigDecimal realSwHValue = result.getRealSwHValue() == null ? BigDecimal.ZERO : result.getRealSwHValue(); + vo.setSwHDValue(ycSwHValue.subtract(realSwHValue));// 处理预测与实测水位差 + vo.setDrp(result.getDrp()); + vo.setIspreDrp(result.getIspreDrp()); + vo.setR(result.getR()); + vo.setFlLowLimLev(result.getFlLowLimLev()); + vo.setCurrentYdgdyjz(result.getCurrentYdgdyjz()); + vo.setPa(result.getPa()); + return vo; + }).collect(Collectors.toList()); + forecastProject.setVoList(vos); + forecastResultsService.handleVoList(forecastProject); + } + return forecastProject; + } + // 页码事件处理器 - 简化版本 private static class PageNumberEventHandler implements IEventHandler { private final PdfFont font;