优化预报方案管理接口
parent
2fb4cbcd3a
commit
5be62326e2
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue