|
@@ -245,4 +245,263 @@ public class ForecastReportController {
|
|
|
}
|
|
|
return R.ok(resultMap);
|
|
|
}
|
|
|
+
|
|
|
+ @GetMapping(value = {"/exportDataEvent/{ycDate}/{cdqDate}/{sjDate}/{agcDate}","/exportDataEvent/{ycDate}/{cdqDate}/{sjDate}/{agcDate}" })
|
|
|
+ public void exportDataEvent(
|
|
|
+ @PathVariable("ycDate") Long ycDate,
|
|
|
+ @PathVariable("cdqDate") Long cdqDate,
|
|
|
+ @PathVariable("sjDate") Long sjDate,
|
|
|
+ @PathVariable("agcDate") Long agcDate,
|
|
|
+ HttpServletResponse response) {
|
|
|
+
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ String fileName = "预测报表"+simpleDateFormat.format(new Date())+".xlsx";
|
|
|
+ response.setContentType("application/x-msdownload;charset=utf-8");
|
|
|
+
|
|
|
+ try (Workbook workbook = new XSSFWorkbook();ServletOutputStream out = response.getOutputStream()){
|
|
|
+ response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
|
|
+ Date ycStartTime = new Date(ycDate+1000*60*15);
|
|
|
+ Date ycEndTime = new Date(ycDate+1000*60*1440);
|
|
|
+ // 获取场站短期实时
|
|
|
+ QueryWrapper<ForecastPowerShortTerm> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.between("forecast_time", ycStartTime, ycEndTime);
|
|
|
+ List<ForecastPowerShortTerm> forecastPowerShortTermList = forecastPowerShortTermService.list(queryWrapper);
|
|
|
+ // 按照场站编号进行分组
|
|
|
+ Map<String, List<ForecastPowerShortTerm>> stListByStationCodeMap = forecastPowerShortTermList.stream().collect(Collectors.groupingBy(r -> r.getStationCode()));
|
|
|
+
|
|
|
+ // 获取nwp实时
|
|
|
+ QueryWrapper<Nwp> nwpWrapper = new QueryWrapper<>();
|
|
|
+ nwpWrapper.between("pre_time", ycStartTime, ycEndTime);
|
|
|
+ List<Nwp> nwpList = nwpService.list(nwpWrapper);
|
|
|
+ // 按照场站编号进行分组
|
|
|
+ Map<String, List<Nwp>> nwpListByStationCodeMap = nwpList.stream().collect(Collectors.groupingBy(r -> r.getStationCode()));
|
|
|
+
|
|
|
+ // 获取场站超短期实时
|
|
|
+ Date cdqStartTime = new Date(cdqDate+1000*60*15);
|
|
|
+ Date cdqEndTime = new Date(cdqDate+1000*60*1440);
|
|
|
+ QueryWrapper<ForecastPowerUltraShortTerm> cdqWrapper = new QueryWrapper<>();
|
|
|
+ cdqWrapper.between("forecast_time", cdqStartTime, cdqEndTime);
|
|
|
+ List<ForecastPowerUltraShortTerm> cdqList = forecastPowerUltraShortTermService.list(cdqWrapper);
|
|
|
+ // 按照场站编号进行分组
|
|
|
+ Map<String, List<ForecastPowerUltraShortTerm>> cdqListByStationCodeMap = cdqList.stream().collect(Collectors.groupingBy(r -> r.getStationCode()));
|
|
|
+
|
|
|
+ // 获取场站实际功率
|
|
|
+ Date sjStartTime = new Date(sjDate+1000*60*15);
|
|
|
+ Date sjEndTime = new Date(sjDate+1000*60*1440);
|
|
|
+ QueryWrapper<PowerStationStatusData> sjWrapper = new QueryWrapper<>();
|
|
|
+ sjWrapper.between("time", sjStartTime, sjEndTime);
|
|
|
+ List<PowerStationStatusData> sjList = powerStationStatusDataService.list(sjWrapper);
|
|
|
+ // 按照场站编号进行分组
|
|
|
+ Map<String, List<PowerStationStatusData>> sjListByStationCodeMap = sjList.stream().collect(Collectors.groupingBy(r -> r.getStationCode()));
|
|
|
+
|
|
|
+ // 获取agc
|
|
|
+ Date agcStartTime = new Date(agcDate+1000*60*15);
|
|
|
+ Date agcEndTime = new Date(agcDate+1000*60*1440);
|
|
|
+ QueryWrapper<GridApCommandValue> agcWrapper = new QueryWrapper<>();
|
|
|
+ agcWrapper.between("time", agcStartTime, agcEndTime);
|
|
|
+ List<GridApCommandValue> agcList = gridApCommandValueService.list(agcWrapper);
|
|
|
+ // 按照场站编号进行分组
|
|
|
+ Map<String, List<GridApCommandValue>> agcListByStationCodeMap = agcList.stream().collect(Collectors.groupingBy(r -> r.getStationId()));
|
|
|
+
|
|
|
+ List<ElectricField> list = electricFieldService.list();
|
|
|
+ list.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
|
|
|
+ Long momentTime = 15 * 60 * 1000L;
|
|
|
+ for (int i=0;i<list.size();i++) {
|
|
|
+ ElectricField electricField = list.get(i);
|
|
|
+ Sheet sheet = workbook.createSheet(electricField.getName());
|
|
|
+ // 创建样式 - 水平垂直居中,带边框
|
|
|
+ CellStyle centerStyle = workbook.createCellStyle();
|
|
|
+ centerStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
+ centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
+ centerStyle.setBorderTop(BorderStyle.THIN);
|
|
|
+ centerStyle.setBorderBottom(BorderStyle.THIN);
|
|
|
+ centerStyle.setBorderLeft(BorderStyle.THIN);
|
|
|
+ centerStyle.setBorderRight(BorderStyle.THIN);
|
|
|
+ // 创建表头
|
|
|
+ List<String> headList = new ArrayList<>();
|
|
|
+ headList.add("时间");
|
|
|
+ headList.add("风速");
|
|
|
+ headList.add("短期功率预测");
|
|
|
+ headList.add("超短期功率预测");
|
|
|
+ headList.add("实际发电");
|
|
|
+ headList.add("AGC指令");
|
|
|
+
|
|
|
+ // 提取短期map
|
|
|
+ Map<String, ForecastPowerShortTerm> stListByTimeMap = new HashMap<>();
|
|
|
+ if (stListByStationCodeMap.get(electricField.getStationCode())!=null){
|
|
|
+ List<ForecastPowerShortTerm> forecastPowerShortTerms = stListByStationCodeMap.get(electricField.getStationCode());
|
|
|
+ stListByTimeMap = forecastPowerShortTerms.stream()
|
|
|
+ .filter(forecast -> electricField.getBelongForecastManufactor().equals(forecast.getForecastManufactor()))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ myObject -> DateUtil.format(myObject.getForecastTime(),"HH:mm"), // keyMapper,将Date转换为long
|
|
|
+ myObject -> myObject, // valueMapper,保持原对象
|
|
|
+ (existing, replacement) -> existing // mergeFunction,处理重复key的情况,这里简单地保留现有的value
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ // 提取nwp风速
|
|
|
+ Map<String, Nwp> nwpListByTimeMap = new HashMap<>();
|
|
|
+ if (nwpListByStationCodeMap.get(electricField.getStationCode())!=null){
|
|
|
+ List<Nwp> forecastPowerShortTerms = nwpListByStationCodeMap.get(electricField.getStationCode());
|
|
|
+ nwpListByTimeMap = forecastPowerShortTerms.stream()
|
|
|
+ .filter(forecast -> "SYJY".equals(forecast.getForecastManufactor()))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ myObject -> DateUtil.format(myObject.getPreTime(),"HH:mm"), // keyMapper,将Date转换为long
|
|
|
+ myObject -> myObject, // valueMapper,保持原对象
|
|
|
+ (existing, replacement) -> existing // mergeFunction,处理重复key的情况,这里简单地保留现有的value
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ // 获取nwp轮毂高度
|
|
|
+ int nwpHubHeight = Integer.parseInt(sysParameterService.getSysParameterAndStationCode("NWP_HubHeight", "100", electricField.getStationCode()));
|
|
|
+ // 提取超短期map
|
|
|
+ Map<String, ForecastPowerUltraShortTerm> cdqListByTimeMap = new HashMap<>();
|
|
|
+ if (cdqListByStationCodeMap.get(electricField.getStationCode())!=null){
|
|
|
+ List<ForecastPowerUltraShortTerm> cdqTerms = cdqListByStationCodeMap.get(electricField.getStationCode());
|
|
|
+ cdqListByTimeMap = cdqTerms.stream()
|
|
|
+ .filter(forecast -> electricField.getBelongForecastManufactor().equals(forecast.getForecastManufactor()))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ myObject -> DateUtil.format(myObject.getForecastTime(),"HH:mm"), // keyMapper,将Date转换为long
|
|
|
+ myObject -> myObject, // valueMapper,保持原对象
|
|
|
+ (existing, replacement) -> existing // mergeFunction,处理重复key的情况,这里简单地保留现有的value
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ // 提取实际功率
|
|
|
+ Map<String, PowerStationStatusData> sjListByTimeMap = new HashMap<>();
|
|
|
+ if (sjListByStationCodeMap.get(electricField.getStationCode())!=null){
|
|
|
+ List<PowerStationStatusData> sjTerms = sjListByStationCodeMap.get(electricField.getStationCode());
|
|
|
+ sjListByTimeMap = sjTerms.stream()
|
|
|
+ .filter(forecast -> electricField.getStationCode().equals(forecast.getStationCode()))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ myObject -> DateUtil.format(new Date(myObject.getTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()),"HH:mm"), // keyMapper,将Date转换为long
|
|
|
+ myObject -> myObject, // valueMapper,保持原对象
|
|
|
+ (existing, replacement) -> existing // mergeFunction,处理重复key的情况,这里简单地保留现有的value
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ // 提取agc
|
|
|
+ Map<String, GridApCommandValue> agcListByTimeMap = new HashMap<>();
|
|
|
+ if (agcListByStationCodeMap.get(electricField.getStationCode())!=null){
|
|
|
+ List<GridApCommandValue> agcTerms = agcListByStationCodeMap.get(electricField.getStationCode());
|
|
|
+ agcListByTimeMap = agcTerms.stream()
|
|
|
+ .filter(forecast -> electricField.getStationCode().equals(forecast.getStationId()))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ myObject -> DateUtil.format(myObject.getTime(),"HH:mm"), // keyMapper,将Date转换为long
|
|
|
+ myObject -> myObject, // valueMapper,保持原对象
|
|
|
+ (existing, replacement) -> existing // mergeFunction,处理重复key的情况,这里简单地保留现有的value
|
|
|
+ ));
|
|
|
+ }
|
|
|
+ List<ForecastReportDto> forecastReportDtoList = new ArrayList<>();
|
|
|
+ for (Long tempTime = ycStartTime.getTime(); tempTime <= ycEndTime.getTime(); tempTime = tempTime + momentTime) {
|
|
|
+ ForecastReportDto forecastReportDto = new ForecastReportDto();
|
|
|
+ String timeStr = DateUtil.format(new Date(tempTime),"HH:mm");
|
|
|
+ if (timeStr.equals("00:00")){
|
|
|
+ forecastReportDto.setTime("24:00");
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ forecastReportDto.setTime(timeStr);
|
|
|
+ }
|
|
|
+ // 短期
|
|
|
+ if (stListByTimeMap.get(timeStr)!=null){
|
|
|
+ ForecastPowerShortTerm forecastPowerShortTerm = stListByTimeMap.get(timeStr);
|
|
|
+ forecastReportDto.setShortTerm(forecastPowerShortTerm.getFpValue());
|
|
|
+ }
|
|
|
+ // 超短期
|
|
|
+ if (cdqListByTimeMap.get(timeStr)!=null){
|
|
|
+ ForecastPowerUltraShortTerm forecastPowerUltraShortTerm = cdqListByTimeMap.get(timeStr);
|
|
|
+ forecastReportDto.setUltraShortTerm(forecastPowerUltraShortTerm.getFpValue());
|
|
|
+ }
|
|
|
+ // 实际功率
|
|
|
+ if (sjListByTimeMap.get(timeStr)!=null){
|
|
|
+ PowerStationStatusData powerStationStatusData = sjListByTimeMap.get(timeStr);
|
|
|
+ forecastReportDto.setActualPower(powerStationStatusData.getRealValue());
|
|
|
+ }
|
|
|
+ // agc
|
|
|
+ if (agcListByTimeMap.get(timeStr)!=null){
|
|
|
+ GridApCommandValue gridApCommandValue = agcListByTimeMap.get(timeStr);
|
|
|
+ forecastReportDto.setAgc(gridApCommandValue.getCommandValue());
|
|
|
+ }
|
|
|
+ // nwp轮毂风速
|
|
|
+ if (nwpListByTimeMap.get(timeStr)!=null){
|
|
|
+ Nwp nwp = nwpListByTimeMap.get(timeStr);
|
|
|
+ // 获取nwp轮毂风速
|
|
|
+ if (nwpHubHeight==170){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs170());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==150){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs150());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==140){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs140());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==130){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs130());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==120){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs120());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==110){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs110());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==100){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs100());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==90){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs90());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==80){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs80());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==70){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs70());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==50){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs50());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==30){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs30());
|
|
|
+ }
|
|
|
+ else if (nwpHubHeight==10){
|
|
|
+ forecastReportDto.setWindSpeed(nwp.getWs10());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ forecastReportDtoList.add(forecastReportDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第一行 - 主表头
|
|
|
+ Row headerRow = sheet.createRow(0);
|
|
|
+ for (int p = 0; p < headList.size(); p++) {
|
|
|
+ Cell cell = headerRow.createCell(p);
|
|
|
+ cell.setCellValue(headList.get(p));
|
|
|
+ cell.setCellStyle(centerStyle);
|
|
|
+ }
|
|
|
+ for (int k=0;k<forecastReportDtoList.size();k++){
|
|
|
+ ForecastReportDto forecastReportDto = forecastReportDtoList.get(k);
|
|
|
+
|
|
|
+ Row row = sheet.createRow(k + 1);
|
|
|
+ Cell cell0 = row.createCell(0);
|
|
|
+ cell0.setCellValue(forecastReportDto.getTime());
|
|
|
+ cell0.setCellStyle(centerStyle);
|
|
|
+ Cell cell1 = row.createCell(1);
|
|
|
+ cell1.setCellValue(forecastReportDto.getWindSpeed()==null?"":forecastReportDto.getWindSpeed().toString());
|
|
|
+ cell1.setCellStyle(centerStyle);
|
|
|
+ Cell cell2 = row.createCell(2);
|
|
|
+ cell2.setCellValue(forecastReportDto.getShortTerm()==null?"":forecastReportDto.getShortTerm().toString());
|
|
|
+ cell2.setCellStyle(centerStyle);
|
|
|
+ Cell cell3 = row.createCell(3);
|
|
|
+ cell3.setCellValue(forecastReportDto.getUltraShortTerm()==null?"":forecastReportDto.getUltraShortTerm().toString());
|
|
|
+ cell3.setCellStyle(centerStyle);
|
|
|
+ Cell cell4 = row.createCell(4);
|
|
|
+ cell4.setCellValue(forecastReportDto.getActualPower()==null?"":forecastReportDto.getActualPower().toString());
|
|
|
+ cell4.setCellStyle(centerStyle);
|
|
|
+ Cell cell5 = row.createCell(5);
|
|
|
+ cell5.setCellValue(forecastReportDto.getAgc()==null?"":forecastReportDto.getAgc().toString());
|
|
|
+ cell5.setCellStyle(centerStyle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 写入输出流
|
|
|
+ workbook.write(out);
|
|
|
+ out.flush();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|