|
|
@@ -6,31 +6,38 @@ import java.math.RoundingMode;
|
|
|
import java.net.URLEncoder;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Date;
|
|
|
import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.function.Consumer;
|
|
|
import java.util.function.Function;
|
|
|
+import java.util.function.Supplier;
|
|
|
import java.util.stream.Collectors;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
import com.alibaba.excel.EasyExcel;
|
|
|
+import com.github.pagehelper.PageHelper;
|
|
|
import com.ufo.base.common.utils.TimeUtils;
|
|
|
import com.ufo.base.framework.aspectj.lang.annotation.Log;
|
|
|
import com.ufo.base.framework.aspectj.lang.enums.BusinessType;
|
|
|
import com.ufo.base.framework.web.controller.BaseController;
|
|
|
import com.ufo.base.framework.web.domain.AjaxResult;
|
|
|
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.UltraShortTermPowerForecastOnceData;
|
|
|
import com.ufo.project.forecast.supershort.domain.DataUltraShortTermPowerForecasting;
|
|
|
import com.ufo.project.forecast.supershort.service.IDataUltraShortTermPowerForecastingService;
|
|
|
+import com.ufo.project.model.domain.DataElectricityLocal;
|
|
|
+import com.ufo.project.model.service.IDataElectricityLocalService;
|
|
|
|
|
|
/**
|
|
|
* 超短期功率预测Controller
|
|
|
@@ -48,6 +55,24 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
|
|
|
@Autowired
|
|
|
private IDataUltraShortTermPowerForecastingService dataUltraShortTermPowerForecastingService;
|
|
|
+ @Autowired
|
|
|
+ private IDataElectricityLocalService dataElectricityLocalService;
|
|
|
+
|
|
|
+ @PreAuthorize("@ss.hasPermi('electricity:forecast:ultrashorttermpower')")
|
|
|
+ @GetMapping("/report/scopes")
|
|
|
+ public AjaxResult scopes(@RequestParam("stationId") Long stationId,
|
|
|
+ @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestParam(value = "type", defaultValue = "0") Integer type)
|
|
|
+ {
|
|
|
+ long startUnix = TimeUtils.gmt8Time2Utc(startTime);
|
|
|
+ long endUnix = TimeUtils.gmt8Time2Utc(endTime);
|
|
|
+ List<DataUltraShortTermPowerForecasting> dataList = dataUltraShortTermPowerForecastingService
|
|
|
+ .selectByStartTimeRange(stationId.toString(), startUnix, endUnix);
|
|
|
+ List<String> scopes = dataList.stream().map(r -> {
|
|
|
+ String scope = TimeUtils.utcToGmt8Format(r.getStartTime());
|
|
|
+ return scope;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ return success(scopes);
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 获取超短期功率预测数据(预测 + 实发功率合并)
|
|
|
@@ -55,13 +80,18 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
* @param stationId 场站id
|
|
|
* @param startTime 开始时间 yyyy-MM-dd HH:mm:ss
|
|
|
* @param endTime 截止时间 yyyy-MM-dd HH:mm:ss
|
|
|
+ * @param type 0 单点预测; 1 单次预测
|
|
|
*/
|
|
|
@PreAuthorize("@ss.hasPermi('electricity:forecast:ultrashorttermpower')")
|
|
|
@GetMapping("/report")
|
|
|
public AjaxResult report(@RequestParam("stationId") Long stationId,
|
|
|
- @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime)
|
|
|
+ @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestParam(value = "type", defaultValue = "0") Integer type)
|
|
|
{
|
|
|
- return success(queryForecastData(stationId, startTime, endTime));
|
|
|
+ if(type == 0){
|
|
|
+ return success(queryForecastData(stationId, startTime, endTime));
|
|
|
+ }else{
|
|
|
+ return success(queryForecastOnceData(stationId, startTime, endTime));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -80,33 +110,76 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime,
|
|
|
@RequestParam(value = "type", defaultValue = "0") Integer type) throws IOException
|
|
|
{
|
|
|
- List<UltraShortTermPowerForecastData> data = queryForecastData(stationId, startTime, endTime);
|
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
response.setCharacterEncoding("utf-8");
|
|
|
String fileName = URLEncoder.encode(buildFileName(startTime, endTime), "UTF-8").replaceAll("\\+", "%20");
|
|
|
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName);
|
|
|
- if (type != null && type == 1)
|
|
|
- {
|
|
|
- List<UltraShortTermPowerSingleExport> rows = new ArrayList<>();
|
|
|
- for (UltraShortTermPowerForecastData item : data)
|
|
|
- {
|
|
|
- UltraShortTermPowerSingleExport row = new UltraShortTermPowerSingleExport();
|
|
|
- row.setTime(item.getTime());
|
|
|
- row.setMonitoredPower(item.getMonitoredPower());
|
|
|
- row.setPower(item.getPower());
|
|
|
- row.setBias(item.getBias());
|
|
|
- rows.add(row);
|
|
|
- }
|
|
|
- EasyExcel.write(response.getOutputStream(), UltraShortTermPowerSingleExport.class)
|
|
|
- .sheet("超短期功率预测").doWrite(rows);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
+ if(type == 0){
|
|
|
+ List<UltraShortTermPowerForecastData> data = queryForecastData(stationId, startTime, endTime);
|
|
|
EasyExcel.write(response.getOutputStream(), UltraShortTermPowerForecastData.class)
|
|
|
.sheet("超短期功率预测").doWrite(data);
|
|
|
+ }else{
|
|
|
+ List<UltraShortTermPowerForecastOnceData> data = queryForecastOnceData(stationId, startTime, endTime);
|
|
|
+ EasyExcel.write(response.getOutputStream(), UltraShortTermPowerForecastOnceData.class)
|
|
|
+ .sheet("超短期功率预测").doWrite(data);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private List<UltraShortTermPowerForecastOnceData> queryForecastOnceData(Long stationId, String startTimeStr, String endTimeStr){
|
|
|
+ List<UltraShortTermPowerForecastOnceData> result = new ArrayList<>();
|
|
|
+ long startUnix = TimeUtils.gmt8Time2Utc(startTimeStr);
|
|
|
+ long endUnix = TimeUtils.gmt8Time2Utc(endTimeStr);
|
|
|
+ PageHelper.startPage(1, 1);
|
|
|
+ List<DataUltraShortTermPowerForecasting> dataList = dataUltraShortTermPowerForecastingService
|
|
|
+ .selectByStartTimeRange(stationId.toString(), startUnix, endUnix);
|
|
|
+ if(CollectionUtils.isEmpty(dataList)){
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ DataUltraShortTermPowerForecasting data = dataList.get(0);
|
|
|
+ String startTimeTimeZoneStr = TimeUtils.formatOffsetDateTime(startTimeStr);
|
|
|
+ String endTimeTimeZoneStr = TimeUtils.formatOffsetDateTime(endTimeStr, 4);
|
|
|
+ List<DataElectricityLocal> realDataList = dataElectricityLocalService.selectActualPowerList(stationId, startTimeTimeZoneStr, endTimeTimeZoneStr);
|
|
|
+
|
|
|
+ Map<Long, DataElectricityLocal> realDataMap = realDataList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ (DataElectricityLocal r) -> r.getTm().getTime() / 1000,
|
|
|
+ Function.identity()));
|
|
|
+
|
|
|
+ List<Function<DataUltraShortTermPowerForecasting, String>> timePowerConsumers = Arrays.asList(
|
|
|
+ DataUltraShortTermPowerForecasting::getPower , DataUltraShortTermPowerForecasting::getPower15,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower30, DataUltraShortTermPowerForecasting::getPower45,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower60, DataUltraShortTermPowerForecasting::getPower75,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower90, DataUltraShortTermPowerForecasting::getPower105,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower120, DataUltraShortTermPowerForecasting::getPower135,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower150, DataUltraShortTermPowerForecasting::getPower165,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower180, DataUltraShortTermPowerForecasting::getPower195,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower210, DataUltraShortTermPowerForecasting::getPower225,
|
|
|
+ DataUltraShortTermPowerForecasting::getPower240
|
|
|
+ );
|
|
|
+ int step = 15;
|
|
|
+ for(int i = 0; i < 16; i++){
|
|
|
+ UltraShortTermPowerForecastOnceData onceData =
|
|
|
+ toOnceData(data, (long) i * step, realDataMap, timePowerConsumers.get(i));
|
|
|
+ result.add(onceData);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private UltraShortTermPowerForecastOnceData toOnceData(DataUltraShortTermPowerForecasting data, Long plusMinutes, Map<Long, DataElectricityLocal> realDataMap,
|
|
|
+ Function<DataUltraShortTermPowerForecasting, String> timePowerConsumer)
|
|
|
+ {
|
|
|
+ Long time = data.getForecastTime() + plusMinutes * 60;
|
|
|
+ DataElectricityLocal realData = realDataMap.get(time);
|
|
|
+ String powerStr = timePowerConsumer.apply(data);
|
|
|
+ double actualPower = realData != null ? realData.getActualPower() : 0D;
|
|
|
+ UltraShortTermPowerForecastOnceData onceData = new UltraShortTermPowerForecastOnceData().setTime(TimeUtils.utcToGmt8Format(time))
|
|
|
+ .setPower(Double.parseDouble(powerStr))
|
|
|
+ .setMonitoredPower(actualPower)
|
|
|
+ .setBias(actualPower - Double.parseDouble(powerStr))
|
|
|
+ ;
|
|
|
+ return onceData;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 查询超短期功率预测数据,从 data_ultra_short_term_power_forecasting 表获取
|
|
|
*/
|
|
|
@@ -119,23 +192,36 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
long endUnix = TimeUtils.gmt8Time2Utc(endTimeStr);
|
|
|
|
|
|
List<DataUltraShortTermPowerForecasting> dataList = dataUltraShortTermPowerForecastingService
|
|
|
- .selectByTimeRange(stationId.toString(), startUnix, endUnix);
|
|
|
+ .selectByStartTimeRange(stationId.toString(), startUnix, endUnix);
|
|
|
if (dataList == null || dataList.isEmpty())
|
|
|
{
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- // 按 forecast_time 分组,同一时间点取平均值
|
|
|
+ String startTimeTimeZoneStr = TimeUtils.formatOffsetDateTime(startTimeStr);
|
|
|
+ String endTimeTimeZoneStr = TimeUtils.formatOffsetDateTime(endTimeStr);
|
|
|
+ List<DataElectricityLocal> realDataList = dataElectricityLocalService.selectActualPowerList(stationId, startTimeTimeZoneStr, endTimeTimeZoneStr);
|
|
|
+
|
|
|
+ // 按 start_time 分组,同一时间点取平均值
|
|
|
Map<Long, List<DataUltraShortTermPowerForecasting>> groupedByTime = dataList.stream()
|
|
|
- .filter(data -> data.getForecastTime() != null)
|
|
|
+ .filter(data -> data.getStartTime() != null)
|
|
|
.collect(Collectors.groupingBy(
|
|
|
- DataUltraShortTermPowerForecasting::getForecastTime,
|
|
|
+ DataUltraShortTermPowerForecasting::getStartTime,
|
|
|
LinkedHashMap::new,
|
|
|
Collectors.toList()));
|
|
|
|
|
|
+ Map<Long, DataElectricityLocal> realDataMap = realDataList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ (DataElectricityLocal r) -> r.getTm().getTime() / 1000,
|
|
|
+ Function.identity()));
|
|
|
+
|
|
|
for (Map.Entry<Long, List<DataUltraShortTermPowerForecasting>> entry : groupedByTime.entrySet())
|
|
|
{
|
|
|
- result.add(toData(entry.getKey(), entry.getValue()));
|
|
|
+ UltraShortTermPowerForecastData data = toData(entry.getKey(), entry.getValue());
|
|
|
+ if(realDataMap.containsKey(entry.getKey())){
|
|
|
+ data.setMonitoredPower(realDataMap.get(entry.getKey()).getActualPower());
|
|
|
+ }
|
|
|
+ result.add(data);
|
|
|
}
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
@@ -146,11 +232,11 @@ public class UltraShortTermPowerForecastingController extends BaseController
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private UltraShortTermPowerForecastData toData(Long forecastTime, List<DataUltraShortTermPowerForecasting> items)
|
|
|
+ private UltraShortTermPowerForecastData toData(Long time, List<DataUltraShortTermPowerForecasting> items)
|
|
|
{
|
|
|
UltraShortTermPowerForecastData result = new UltraShortTermPowerForecastData();
|
|
|
// forecast_time 为 UTC unix 秒,展示时格式化为 GMT+8 时间
|
|
|
- result.setTime(TimeUtils.utcToGmt8Format(forecastTime));
|
|
|
+ result.setTime(TimeUtils.utcToGmt8Format(time));
|
|
|
result.setMonitoredPower(avgPower(items, DataUltraShortTermPowerForecasting::getPower));
|
|
|
result.setPower15(avgPower(items, DataUltraShortTermPowerForecasting::getPower15));
|
|
|
result.setPower30(avgPower(items, DataUltraShortTermPowerForecasting::getPower30));
|