优化预报方案管理接口

master
chenxiwang 2024-07-31 17:21:15 +08:00
parent 2fb4cbcd3a
commit 5be62326e2
3 changed files with 163 additions and 33 deletions

View File

@ -45,9 +45,9 @@ public class ForecastPlanController {
@PostMapping("/insert")
public R<ForecastPlan> 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<ForecastPlan> 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<Boolean> 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<ForecastPlan>> list(@RequestBody @Validated ForecastPlan forecastPlan) {
QueryWrapper<ForecastPlan> wrapper = new QueryWrapper<ForecastPlan>();
QueryWrapper<ForecastPlan> wrapper = new QueryWrapper<ForecastPlan>()
.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<ForecastPlan>> page(@RequestBody @Validated ForecastPlan forecastPlan) {
QueryWrapper<ForecastPlan> wrapper = new QueryWrapper<ForecastPlan>();
QueryWrapper<ForecastPlan> wrapper = new QueryWrapper<ForecastPlan>()
.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());
}

View File

@ -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;
}

View File

@ -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<ForecastResultsMapper, F
voList = RrainfallForecast.getData(sdf.format(startTm), k, PaT0, Wm, pt, H1, dt, PaT1, PList, u);
// 预测程序返回的时间会比想要的长,截取
if(CollectionUtils.isNotEmpty(voList)){
voList.subList(0, PList.length);
voList = voList.subList(0, PList.length);
for (int j = 0; j < voList.size(); j++){
voList.get(j).setDrp(new BigDecimal(PList[j]));
}
@ -194,11 +196,11 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
StStbprpB stStbprpB = stStbprpBService.getOne(new QueryWrapper<StStbprpB>().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<RainGrib2Layer> gribList = forecastService.getGribData(tm, false);
//24小时每个网格的总量
List<RainGrib2Layer> total = gribList.stream().filter(o -> o.getTmRange().getInterval() == 24).collect(Collectors.toList());
@ -244,31 +246,39 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
*/
public List<ForecastResultVo> getHumanForecastResult(ForecastPlan forecastPlan) {
List<ForecastResultVo> resultList = new ArrayList<>();
// 需要根据△T来整编实际降雨、水位数据
List<ForecastUseparam> paramList = forecastUseparamService.list();
Map<String, String> paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue));
double dt = Double.parseDouble(paramMap.get("dt"));
// 获取时间范围内的真实降雨
List<StPptnR> pptnRList = stPptnRService.list(new QueryWrapper<StPptnR>().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
List<StPptnR> pptnRRealList = stPptnRService.list(new QueryWrapper<StPptnR>().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
// 获取时间范围内的真实水位
List<StRsvrR> rsvrRList = stRsvrRService.list(new QueryWrapper<StRsvrR>().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
List<StRsvrR> rsvrRRealList = stRsvrRService.list(new QueryWrapper<StRsvrR>().eq("stcd", "716153201").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
// 获取时间范围内的真实入库流量
List<StWaterR> waterRkList = stWaterRService.list(new QueryWrapper<StWaterR>().eq("stcd", "1111111").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
List<StWaterR> waterRkRealList = stWaterRService.list(new QueryWrapper<StWaterR>().eq("stcd", "1111111").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
// 获取时间范围内的真实出库流量
List<StWaterR> waterCkList = stWaterRService.list(new QueryWrapper<StWaterR>().eq("stcd", "2222222").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
List<StWaterR> waterCkRealList = stWaterRService.list(new QueryWrapper<StWaterR>().eq("stcd", "2222222").ge("tm", forecastPlan.getStartTm()).le("tm", forecastPlan.getForecastTm()));
// 获取预测数据
List<FloodAlgorithemVo> floodAlgorithemVos = floodForecast(forecastPlan);
if (CollectionUtils.isNotEmpty(floodAlgorithemVos)) {
Map<Date, String> pptnRMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(pptnRList)) {
pptnRMap = pptnRList.stream().collect(Collectors.toMap(StPptnR::getTm, StPptnR::getDrp));
Map<String, String> 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<Date, String> rsvrRMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(rsvrRList)) {
rsvrRMap = rsvrRList.stream().collect(Collectors.toMap(StRsvrR::getTm, StRsvrR::getRz));
Map<String, String> 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<Date, String> waterRkMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(waterRkList)) {
waterRkMap = waterRkList.stream().collect(Collectors.toMap(StWaterR::getTm, StWaterR::getQ));
Map<String, String> waterRkMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(waterRkRealList)) {
waterRkMap = waterRkRealList.stream().collect(Collectors.toMap(obj -> sdf.format(obj.getTm()), obj -> obj.getQ()));
}
Map<Date, String> waterCkMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(waterCkList)) {
waterCkMap = waterRkList.stream().collect(Collectors.toMap(StWaterR::getTm, StWaterR::getQ));
Map<String, String> 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<ForecastResultsMapper, F
if (waterCkMap.containsKey(floodVo.getDateStr())) {
vo.setRealCkQValue(new BigDecimal(waterCkMap.get(floodVo.getDateStr())));
}
resultList.add(vo);
}
}
return resultList;
}
/**
* @description: T
* @param pptnRRealList
* @param dt
* @return: java.util.List<com.gunshi.project.xyt.model.StPptnR>
* @auther: cxw
*/
private List<StPptnR> reorganizePptnRData(List<StPptnR> 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<StPptnR> 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<com.gunshi.project.xyt.model.StRsvrR>
* @auther: cxw
*/
private List<StRsvrR> reorganizeRsvrRData(List<StRsvrR> 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<StRsvrR> 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;