|
@@ -1,21 +1,11 @@
|
|
|
package com.ufo.project.forecast.shortterm.power.controller;
|
|
package com.ufo.project.forecast.shortterm.power.controller;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
-import java.math.BigDecimal;
|
|
|
|
|
-import java.math.RoundingMode;
|
|
|
|
|
import java.net.URLEncoder;
|
|
import java.net.URLEncoder;
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.time.Instant;
|
|
|
|
|
-import java.time.ZoneOffset;
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Calendar;
|
|
|
|
|
-import java.util.Comparator;
|
|
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
|
|
-import java.util.TreeMap;
|
|
|
|
|
-import java.util.TreeSet;
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -26,19 +16,15 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
import com.alibaba.excel.EasyExcel;
|
|
import com.alibaba.excel.EasyExcel;
|
|
|
-import com.ufo.base.common.utils.StringUtils;
|
|
|
|
|
import com.ufo.base.framework.aspectj.lang.annotation.Log;
|
|
import com.ufo.base.framework.aspectj.lang.annotation.Log;
|
|
|
import com.ufo.base.framework.aspectj.lang.enums.BusinessType;
|
|
import com.ufo.base.framework.aspectj.lang.enums.BusinessType;
|
|
|
import com.ufo.base.framework.web.controller.BaseController;
|
|
import com.ufo.base.framework.web.controller.BaseController;
|
|
|
import com.ufo.base.framework.web.domain.AjaxResult;
|
|
import com.ufo.base.framework.web.domain.AjaxResult;
|
|
|
-import com.ufo.project.forecast.shortterm.power.domain.UltraShortTermPowerForecastCsvRow;
|
|
|
|
|
import com.ufo.project.forecast.shortterm.power.domain.UltraShortTermPowerForecastData;
|
|
import com.ufo.project.forecast.shortterm.power.domain.UltraShortTermPowerForecastData;
|
|
|
import com.ufo.project.forecast.shortterm.power.domain.UltraShortTermPowerSingleExport;
|
|
import com.ufo.project.forecast.shortterm.power.domain.UltraShortTermPowerSingleExport;
|
|
|
import com.ufo.project.forecast.shortterm.power.util.ExcelForecastFileUtil;
|
|
import com.ufo.project.forecast.shortterm.power.util.ExcelForecastFileUtil;
|
|
|
-import com.ufo.project.model.domain.DataElectricityLocal;
|
|
|
|
|
-import com.ufo.project.model.domain.ModelPredictionTasks;
|
|
|
|
|
-import com.ufo.project.model.service.IDataElectricityLocalService;
|
|
|
|
|
-import com.ufo.project.model.service.IModelPredictionTasksService;
|
|
|
|
|
|
|
+import com.ufo.project.forecast.supershort.domain.DataUltraShortTermPowerForecasting;
|
|
|
|
|
+import com.ufo.project.forecast.supershort.service.IDataUltraShortTermPowerForecastingService;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 超短期功率预测Controller
|
|
* 超短期功率预测Controller
|
|
@@ -52,14 +38,10 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
private static final Logger log = LoggerFactory.getLogger(UltraShortTermPowerForecastingController.class);
|
|
private static final Logger log = LoggerFactory.getLogger(UltraShortTermPowerForecastingController.class);
|
|
|
|
|
|
|
|
private static final String PATTERN_SECOND = "yyyy-MM-dd HH:mm:ss";
|
|
private static final String PATTERN_SECOND = "yyyy-MM-dd HH:mm:ss";
|
|
|
- private static final String PATTERN_MINUTE = "yyyy-MM-dd HH:mm";
|
|
|
|
|
private static final String PATTERN_COMPACT = "yyyyMMddHHmm";
|
|
private static final String PATTERN_COMPACT = "yyyyMMddHHmm";
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
- private IModelPredictionTasksService modelPredictionTasksService;
|
|
|
|
|
-
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private IDataElectricityLocalService dataElectricityLocalService;
|
|
|
|
|
|
|
+ private IDataUltraShortTermPowerForecastingService dataUltraShortTermPowerForecastingService;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取超短期功率预测数据(预测 + 实发功率合并)
|
|
* 获取超短期功率预测数据(预测 + 实发功率合并)
|
|
@@ -120,7 +102,7 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 查询预测任务并解析 result_path 对应文件,与实发功率按时间 merge
|
|
|
|
|
|
|
+ * 查询超短期功率预测数据,从 data_ultra_short_term_power_forecasting 表获取
|
|
|
*/
|
|
*/
|
|
|
private List<UltraShortTermPowerForecastData> queryForecastData(Long stationId, String startTimeStr, String endTimeStr)
|
|
private List<UltraShortTermPowerForecastData> queryForecastData(Long stationId, String startTimeStr, String endTimeStr)
|
|
|
{
|
|
{
|
|
@@ -131,60 +113,18 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
Date startTime = sdf.parse(startTimeStr);
|
|
Date startTime = sdf.parse(startTimeStr);
|
|
|
Date endTime = sdf.parse(endTimeStr);
|
|
Date endTime = sdf.parse(endTimeStr);
|
|
|
|
|
|
|
|
- // 逻辑#1 预测数据: target_time 在 [startTime当日0点, endTime当日23:59:59] 区间
|
|
|
|
|
- Date queryStart = startOfDay(startTime);
|
|
|
|
|
- Date queryEnd = endOfDay(endTime);
|
|
|
|
|
- List<ModelPredictionTasks> tasks = modelPredictionTasksService
|
|
|
|
|
- .selectPredictionTasks(stationId, "ultra_short", queryStart, queryEnd);
|
|
|
|
|
- Map<String, UltraShortTermPowerForecastData> forecastMap = new TreeMap<>();
|
|
|
|
|
- for (ModelPredictionTasks task : tasks)
|
|
|
|
|
- {
|
|
|
|
|
- List<UltraShortTermPowerForecastCsvRow> rows = ExcelForecastFileUtil.readResultFile(
|
|
|
|
|
- task.getResultPath(), UltraShortTermPowerForecastCsvRow.class);
|
|
|
|
|
- if (rows == null)
|
|
|
|
|
- {
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- for (UltraShortTermPowerForecastCsvRow row : rows)
|
|
|
|
|
- {
|
|
|
|
|
- String time = ExcelForecastFileUtil.formatTime(row.getTime());
|
|
|
|
|
- if (StringUtils.isEmpty(time) || !inRange(time, startTime, endTime))
|
|
|
|
|
- {
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- forecastMap.put(time, toData(row));
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 逻辑#2 实发功率
|
|
|
|
|
long startUnix = startTime.getTime() / 1000;
|
|
long startUnix = startTime.getTime() / 1000;
|
|
|
long endUnix = endTime.getTime() / 1000;
|
|
long endUnix = endTime.getTime() / 1000;
|
|
|
- List<DataElectricityLocal> actualList = dataElectricityLocalService
|
|
|
|
|
- .selectActualPowerList(stationId, formatOffsetDateTime(startUnix), formatOffsetDateTime(endUnix));
|
|
|
|
|
- Map<String, Double> actualMap = new HashMap<>();
|
|
|
|
|
- for (DataElectricityLocal actual : actualList)
|
|
|
|
|
|
|
+ List<DataUltraShortTermPowerForecasting> dataList = dataUltraShortTermPowerForecastingService
|
|
|
|
|
+ .selectByTimeRange(stationId.toString(), startUnix, endUnix);
|
|
|
|
|
+ if (dataList == null)
|
|
|
{
|
|
{
|
|
|
- actualMap.put(formatDate(actual.getTm(), PATTERN_MINUTE), actual.getActualPower());
|
|
|
|
|
|
|
+ return result;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // merge:两边时间并集,缺失补 0
|
|
|
|
|
- TreeSet<String> keys = new TreeSet<>(forecastMap.keySet());
|
|
|
|
|
- keys.addAll(actualMap.keySet());
|
|
|
|
|
- for (String key : keys)
|
|
|
|
|
|
|
+ for (DataUltraShortTermPowerForecasting data : dataList)
|
|
|
{
|
|
{
|
|
|
- UltraShortTermPowerForecastData data = forecastMap.get(key);
|
|
|
|
|
- if (data == null)
|
|
|
|
|
- {
|
|
|
|
|
- data = new UltraShortTermPowerForecastData();
|
|
|
|
|
- data.setTime(key);
|
|
|
|
|
- }
|
|
|
|
|
- Double monitored = actualMap.get(key);
|
|
|
|
|
- data.setMonitoredPower(monitored == null ? 0D : monitored);
|
|
|
|
|
- double power = data.getPower() == null ? 0D : data.getPower();
|
|
|
|
|
- data.setBias(round2(data.getMonitoredPower() - power));
|
|
|
|
|
- result.add(data);
|
|
|
|
|
|
|
+ result.add(toData(data));
|
|
|
}
|
|
}
|
|
|
- result.sort(Comparator.comparing(UltraShortTermPowerForecastData::getTime));
|
|
|
|
|
}
|
|
}
|
|
|
catch (Exception e)
|
|
catch (Exception e)
|
|
|
{
|
|
{
|
|
@@ -194,37 +134,28 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private UltraShortTermPowerForecastData toData(UltraShortTermPowerForecastCsvRow row)
|
|
|
|
|
- {
|
|
|
|
|
- UltraShortTermPowerForecastData data = new UltraShortTermPowerForecastData();
|
|
|
|
|
- data.setTime(ExcelForecastFileUtil.formatTime(row.getTime()));
|
|
|
|
|
- data.setPower(row.getPower());
|
|
|
|
|
- data.setPower15(row.getPower15());
|
|
|
|
|
- data.setPower30(row.getPower30());
|
|
|
|
|
- data.setPower45(row.getPower45());
|
|
|
|
|
- data.setPower60(row.getPower60());
|
|
|
|
|
- data.setPower75(row.getPower75());
|
|
|
|
|
- data.setPower90(row.getPower90());
|
|
|
|
|
- data.setPower105(row.getPower105());
|
|
|
|
|
- data.setPower120(row.getPower120());
|
|
|
|
|
- data.setPower135(row.getPower135());
|
|
|
|
|
- data.setPower150(row.getPower150());
|
|
|
|
|
- data.setPower165(row.getPower165());
|
|
|
|
|
- data.setPower180(row.getPower180());
|
|
|
|
|
- data.setPower195(row.getPower195());
|
|
|
|
|
- data.setPower210(row.getPower210());
|
|
|
|
|
- data.setPower225(row.getPower225());
|
|
|
|
|
- data.setPower240(row.getPower240());
|
|
|
|
|
- return data;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 判断格式化时间(yyyy-MM-dd HH:mm)是否在 [startTime, endTime] 区间内(字符串比较,无需时区换算)
|
|
|
|
|
- */
|
|
|
|
|
- private boolean inRange(String timeKey, Date startTime, Date endTime)
|
|
|
|
|
|
|
+ private UltraShortTermPowerForecastData toData(DataUltraShortTermPowerForecasting data)
|
|
|
{
|
|
{
|
|
|
- return timeKey.compareTo(formatDate(startTime, PATTERN_MINUTE)) >= 0
|
|
|
|
|
- && timeKey.compareTo(formatDate(endTime, PATTERN_MINUTE)) <= 0;
|
|
|
|
|
|
|
+ UltraShortTermPowerForecastData result = new UltraShortTermPowerForecastData();
|
|
|
|
|
+ result.setTime(ExcelForecastFileUtil.formatTime(String.valueOf(data.getStartTime())));
|
|
|
|
|
+ result.setMonitoredPower(parseDouble(data.getPower()));
|
|
|
|
|
+ result.setPower15(parseDouble(data.getPower15()));
|
|
|
|
|
+ result.setPower30(parseDouble(data.getPower30()));
|
|
|
|
|
+ result.setPower45(parseDouble(data.getPower45()));
|
|
|
|
|
+ result.setPower60(parseDouble(data.getPower60()));
|
|
|
|
|
+ result.setPower75(parseDouble(data.getPower75()));
|
|
|
|
|
+ result.setPower90(parseDouble(data.getPower90()));
|
|
|
|
|
+ result.setPower105(parseDouble(data.getPower105()));
|
|
|
|
|
+ result.setPower120(parseDouble(data.getPower120()));
|
|
|
|
|
+ result.setPower135(parseDouble(data.getPower135()));
|
|
|
|
|
+ result.setPower150(parseDouble(data.getPower150()));
|
|
|
|
|
+ result.setPower165(parseDouble(data.getPower165()));
|
|
|
|
|
+ result.setPower180(parseDouble(data.getPower180()));
|
|
|
|
|
+ result.setPower195(parseDouble(data.getPower195()));
|
|
|
|
|
+ result.setPower210(parseDouble(data.getPower210()));
|
|
|
|
|
+ result.setPower225(parseDouble(data.getPower225()));
|
|
|
|
|
+ result.setPower240(parseDouble(data.getPower240()));
|
|
|
|
|
+ return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String formatDate(Date date, String pattern)
|
|
private String formatDate(Date date, String pattern)
|
|
@@ -233,36 +164,15 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 取日期当天 0 点
|
|
|
|
|
|
|
+ * 字符串转 Double,空值返回 null
|
|
|
*/
|
|
*/
|
|
|
- private Date startOfDay(Date date)
|
|
|
|
|
|
|
+ private Double parseDouble(String value)
|
|
|
{
|
|
{
|
|
|
- Calendar cal = Calendar.getInstance();
|
|
|
|
|
- cal.setTime(date);
|
|
|
|
|
- cal.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
|
|
- cal.set(Calendar.MINUTE, 0);
|
|
|
|
|
- cal.set(Calendar.SECOND, 0);
|
|
|
|
|
- cal.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
- return cal.getTime();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 取日期当天 23:59:59
|
|
|
|
|
- */
|
|
|
|
|
- private Date endOfDay(Date date)
|
|
|
|
|
- {
|
|
|
|
|
- Calendar cal = Calendar.getInstance();
|
|
|
|
|
- cal.setTime(date);
|
|
|
|
|
- cal.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
|
|
- cal.set(Calendar.MINUTE, 59);
|
|
|
|
|
- cal.set(Calendar.SECOND, 59);
|
|
|
|
|
- cal.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
- return cal.getTime();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private double round2(double value)
|
|
|
|
|
- {
|
|
|
|
|
- return BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
|
|
|
+ if (value == null || value.trim().isEmpty())
|
|
|
|
|
+ {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return Double.parseDouble(value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String buildFileName(String startTime, String endTime)
|
|
private String buildFileName(String startTime, String endTime)
|
|
@@ -278,15 +188,4 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
return "超短期预测.xlsx";
|
|
return "超短期预测.xlsx";
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 将 unix 秒转换为带时区的 ISO 8601 字符串(+08:00)
|
|
|
|
|
- * 例:2026-08-02T00:00:00+08:00
|
|
|
|
|
- */
|
|
|
|
|
- private String formatOffsetDateTime(Long unixSeconds)
|
|
|
|
|
- {
|
|
|
|
|
- return Instant.ofEpochSecond(unixSeconds)
|
|
|
|
|
- .atOffset(ZoneOffset.ofHours(8))
|
|
|
|
|
- .toString();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|