Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

wanghc před 2 roky
rodič
revize
0b42b45899

+ 231 - 35
ipfcst/ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/FileAnalysisService.java

@@ -36,7 +36,6 @@ import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * 解析电科院NWP和DQ文件
@@ -108,6 +107,10 @@ public class FileAnalysisService extends BaseService {
 
 	PowerPlanSDService powerPlanSDService;
 
+  ForecastPowerShortTermOneService forecastPowerShortTermOneService;
+
+  ForecastPowerShortTermTwoService forecastPowerShortTermTwoService;
+
   ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository;
   AGC_AVCInfoService agcAvcInfoService;
   BoosterStationInfoService boosterStationInfoService;
@@ -164,35 +167,121 @@ public class FileAnalysisService extends BaseService {
 							flag = false;
 						}
 					}
+
+					// 预测标识保存一期、二期还是总
+          int ycbs = 0;
 					if (file.getName().startsWith("DQ")) {
 						try {
-							List<ForecastPowerShortTerm> listDq = fileAnalysisShortTerm(file, currentDate);
-							ForecastPowerShortTerm forecastPowerShortTerm = null;
-							if (listDq != null && listDq.size() > 0) {
-								//如果数据不全,进行补入
-								while (listDq.get(listDq.size() - 1).getForecastTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
-									forecastPowerShortTerm = new ForecastPowerShortTerm();
-									forecastPowerShortTerm.setFpValue(listDq.get(listDq.size() - 96).getFpValue());//修正前值
-									forecastPowerShortTerm.setGenDate(new Date()); //装机容量
-									forecastPowerShortTerm.setForecastTime(currentDate);
-									forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E1);
-									listDq.add(forecastPowerShortTerm);
-								}
+              try (InputStreamReader read = new InputStreamReader(new FileInputStream(file), "utf-8");
+                   BufferedReader bufferedReader = new BufferedReader(read);){
+                String stringLine;
+                while ((stringLine = bufferedReader.readLine()) != null) {
+                  // 读取第一行的场站名称判断是哪期的
+                  String[] firstRow = stringLine.split(" ");
+                  if (firstRow.length==2){
+                    // 获取场站名称
+                    String czmc = firstRow[0].split("::")[1];
+                    if ("龙阜风电场".equals(czmc)){
+                      ycbs = 0;
+                    }
+                    if ("龙阜风电场一期".equals(czmc)){
+                      ycbs = 1;
+                    }
+                    else if ("龙阜风电场二期".equals(czmc)){
+                      ycbs = 2;
+                    }
+                  }
+                  break;
+                }
+              }
 
-								try {
-									//短期数据修正
-									Long startTime = listDq.get(0).getForecastTime();
-									Long endTime = listDq.get(listDq.size() - 1).getForecastTime();//删除相同时间数据
-									forecastPowerShortTermService.deleteBetweenAndGenTime(startTime, endTime, listDq);
-									flag = true;
-								} catch (Exception e) {
-									log.error("保存短期数据报错", e);
-									flag = false;
-								}
-							} else {
-								log.info(file.getName() + "文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
-								flag = false;
-							}
+              if (ycbs==0){
+                // 原来总的
+                List<ForecastPowerShortTerm> listDq = fileAnalysisShortTerm(file, currentDate);
+                ForecastPowerShortTerm forecastPowerShortTerm = null;
+                if (listDq != null && listDq.size() > 0) {
+                  //如果数据不全,进行补入
+                  while (listDq.get(listDq.size() - 1).getForecastTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
+                    forecastPowerShortTerm = new ForecastPowerShortTerm();
+                    forecastPowerShortTerm.setFpValue(listDq.get(listDq.size() - 96).getFpValue());//修正前值
+                    forecastPowerShortTerm.setGenDate(new Date()); //装机容量
+                    forecastPowerShortTerm.setForecastTime(currentDate);
+                    forecastPowerShortTerm.setPredictionModelEnum(PredictionModelEnum.E1);
+                    listDq.add(forecastPowerShortTerm);
+                  }
+                  try {
+                    //短期数据修正
+                    Long startTime = listDq.get(0).getForecastTime();
+                    Long endTime = listDq.get(listDq.size() - 1).getForecastTime();//删除相同时间数据
+                    forecastPowerShortTermService.deleteBetweenAndGenTime(startTime, endTime, listDq);
+                    flag = true;
+                  } catch (Exception e) {
+                    log.error("保存短期数据报错", e);
+                    flag = false;
+                  }
+                } else {
+                  log.info(file.getName() + "文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
+                  flag = false;
+                }
+              }
+              else if (ycbs==1){
+                // 一期短期文件
+                List<ForecastPowerShortTermOne> listDq = fileAnalysisShortTermOne(file, currentDate);
+                ForecastPowerShortTermOne forecastPowerShortTermOne = null;
+                if (listDq != null && listDq.size() > 0) {
+                  //如果数据不全,进行补入
+                  while (listDq.get(listDq.size() - 1).getForecastTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
+                    forecastPowerShortTermOne = new ForecastPowerShortTermOne();
+                    forecastPowerShortTermOne.setFpValue(listDq.get(listDq.size() - 96).getFpValue());//修正前值
+                    forecastPowerShortTermOne.setGenDate(new Date()); //装机容量
+                    forecastPowerShortTermOne.setForecastTime(currentDate);
+                    forecastPowerShortTermOne.setPredictionModelEnum(PredictionModelEnum.E1);
+                    listDq.add(forecastPowerShortTermOne);
+                  }
+                  try {
+                    //短期数据修正
+                    Long startTime = listDq.get(0).getForecastTime();
+                    Long endTime = listDq.get(listDq.size() - 1).getForecastTime();//删除相同时间数据
+                    forecastPowerShortTermOneService.deleteBetweenAndGenTime(startTime, endTime, listDq);
+                    flag = true;
+                  } catch (Exception e) {
+                    log.error("一期文件保存短期数据报错", e);
+                    flag = false;
+                  }
+                } else {
+                  log.info(file.getName() + "一期文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
+                  flag = false;
+                }
+              }
+              else if (ycbs==2){
+                // 二期短期文件
+                List<ForecastPowerShortTermTwo> listDq = fileAnalysisShortTermTwo(file, currentDate);
+                ForecastPowerShortTermTwo forecastPowerShortTermTwo = null;
+                if (listDq != null && listDq.size() > 0) {
+                  //如果数据不全,进行补入
+                  while (listDq.get(listDq.size() - 1).getForecastTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
+                    forecastPowerShortTermTwo = new ForecastPowerShortTermTwo();
+                    forecastPowerShortTermTwo.setFpValue(listDq.get(listDq.size() - 96).getFpValue());//修正前值
+                    forecastPowerShortTermTwo.setGenDate(new Date()); //装机容量
+                    forecastPowerShortTermTwo.setForecastTime(currentDate);
+                    forecastPowerShortTermTwo.setPredictionModelEnum(PredictionModelEnum.E1);
+                    listDq.add(forecastPowerShortTermTwo);
+                  }
+                  try {
+                    //短期数据修正
+                    Long startTime = listDq.get(0).getForecastTime();
+                    Long endTime = listDq.get(listDq.size() - 1).getForecastTime();//删除相同时间数据
+                    forecastPowerShortTermTwoService.deleteBetweenAndGenTime(startTime, endTime, listDq);
+                    flag = true;
+                  } catch (Exception e) {
+                    log.error("二期文件保存短期数据报错", e);
+                    flag = false;
+                  }
+                } else {
+                  log.info(file.getName() + "二期文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
+                  flag = false;
+                }
+              }
 						} catch (Exception e) {
 							flag = false;
 							log.error("解析DQ文件失败", e);
@@ -842,7 +931,7 @@ public class FileAnalysisService extends BaseService {
 
           if (flag) {
 						//文件解析成功之后,保存记录
-						saveFileParsingRecord(file, "1");
+						saveFileParsingRecord(file, "1",ycbs);
 						//移除文件备份到临时文件下
 						moveFile(file);
 						if (startConsole){
@@ -858,7 +947,7 @@ public class FileAnalysisService extends BaseService {
             }
 					} else {
 						//文件解析失败之后,保存记录
-						saveFileParsingRecord(file, "0");
+						saveFileParsingRecord(file, "0",ycbs);
 						//移除文件备份到error文件下
 						moveFileError(file);
 					}
@@ -909,12 +998,12 @@ public class FileAnalysisService extends BaseService {
 				} finally {
 					if (flag) {
 						//文件解析成功之后,保存记录
-						saveFileParsingRecord(file, "1");
+						saveFileParsingRecord(file, "1",99);
 						//移除文件备份到临时文件下
 						moveFile(file);
 					} else {
 						//文件解析失败之后,保存记录
-						saveFileParsingRecord(file, "0");
+						saveFileParsingRecord(file, "0",99);
 						//移除文件备份到error文件下
 						moveFileError(file);
 					}
@@ -1368,7 +1457,105 @@ public class FileAnalysisService extends BaseService {
 		return forecastPowerShortTerm;
 	}
 
+  /**
+   * 一期短期解析
+   *
+   * @param file        文件路径
+   * @param currentDate 当前时间
+   * @return 样例集合
+   */
+  private List<ForecastPowerShortTermOne> fileAnalysisShortTermOne(File file, Long currentDate) {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    List<ForecastPowerShortTermOne> forecastPowerShortTermOne = new ArrayList<>();
+    // 当文件未被使用时,进行解析上报
+    if (file.renameTo(file)) {
+      InputStreamReader read = null;
+      BufferedReader bufferedReader = null;
+      String stringLine;
+      ForecastPowerShortTermOne stf;
+      try {
+        read = new InputStreamReader(new FileInputStream(file), "utf-8");
+        bufferedReader = new BufferedReader(read);
+        while ((stringLine = bufferedReader.readLine()) != null) {
+          String[] string_arr = stringLine.split("\t");
+          if (string_arr.length == 4 && string_arr[0].startsWith("#")) {
+            if (StringUtils.isNotEmpty(string_arr[2])) {
+              stf = new ForecastPowerShortTermOne();
+              stf.setFpValue(new BigDecimal(string_arr[3] + ""));
+              stf.setForecastTime(sdf.parse(string_arr[2]).getTime());
+              stf.setGenDate(new Date(currentDate));
+              stf.setPredictionModelEnum(PredictionModelEnum.E1);
+              forecastPowerShortTermOne.add(stf);
+            }
+          }
+        }
+      } catch (IOException | ParseException | RuntimeException e) {
+        log.error("系统错误:", e);
+        File destFile = new File(file.getPath().replaceFirst("new", "error"));
+        if (destFile.exists()) {
+          destFile.delete();
+        }
+        try {
+          FileUtils.moveFile(file, destFile);
+        } catch (IOException e1) {
+          log.error(file.getName() + "一期文件解析失败", e);
+        }
+      } finally {
+        close(bufferedReader, read);
+      }
+    }
+    return forecastPowerShortTermOne;
+  }
 
+  /**
+   * 二期短期解析
+   *
+   * @param file        文件路径
+   * @param currentDate 当前时间
+   * @return 样例集合
+   */
+  private List<ForecastPowerShortTermTwo> fileAnalysisShortTermTwo(File file, Long currentDate) {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    List<ForecastPowerShortTermTwo> forecastPowerShortTermTwo = new ArrayList<>();
+    // 当文件未被使用时,进行解析上报
+    if (file.renameTo(file)) {
+      InputStreamReader read = null;
+      BufferedReader bufferedReader = null;
+      String stringLine;
+      ForecastPowerShortTermTwo stf;
+      try {
+        read = new InputStreamReader(new FileInputStream(file), "utf-8");
+        bufferedReader = new BufferedReader(read);
+        while ((stringLine = bufferedReader.readLine()) != null) {
+          String[] string_arr = stringLine.split("\t");
+          if (string_arr.length == 4 && string_arr[0].startsWith("#")) {
+            if (StringUtils.isNotEmpty(string_arr[2])) {
+              stf = new ForecastPowerShortTermTwo();
+              stf.setFpValue(new BigDecimal(string_arr[3] + ""));
+              stf.setForecastTime(sdf.parse(string_arr[2]).getTime());
+              stf.setGenDate(new Date(currentDate));
+              stf.setPredictionModelEnum(PredictionModelEnum.E1);
+              forecastPowerShortTermTwo.add(stf);
+            }
+          }
+        }
+      } catch (IOException | ParseException | RuntimeException e) {
+        log.error("系统错误:", e);
+        File destFile = new File(file.getPath().replaceFirst("new", "error"));
+        if (destFile.exists()) {
+          destFile.delete();
+        }
+        try {
+          FileUtils.moveFile(file, destFile);
+        } catch (IOException e1) {
+          log.error(file.getName() + "二期文件解析失败", e);
+        }
+      } finally {
+        close(bufferedReader, read);
+      }
+    }
+    return forecastPowerShortTermTwo;
+  }
 
   /*
   * 一体化文件解析
@@ -1578,13 +1765,22 @@ public class FileAnalysisService extends BaseService {
 	 *
 	 * @param file       文件信息
 	 * @param fileStatus 文件解析状态 1:表示解析成功 0:解析失败
+   * @param ycbs        预 测标识
 	 */
-	private void saveFileParsingRecord(File file, String fileStatus) {
+	private void saveFileParsingRecord(File file, String fileStatus,Integer ycbs) {
 		String fileType = "";
 		if (file.getName().startsWith("JH")) {
 			fileType = "JH";//假期文件
 		} else if (file.getName().startsWith("DQ")) {
-			fileType = "DQ";//短期文件
+      if (ycbs==0){
+        fileType = "DQ";//总短期文件
+      }
+      else if (ycbs==1){
+        fileType = "DQ1";//一期短期文件
+      }
+      else if (ycbs==2){
+        fileType = "DQ2";//二期短期文件
+      }
 		} else if (file.getName().startsWith("NWP")) {
 			fileType = "NWP";//NWP文件
 		} else if (file.getName().startsWith("UP")) {
@@ -1684,12 +1880,12 @@ public class FileAnalysisService extends BaseService {
 				} finally {
 					if (flag) {
 						//文件解析成功之后,保存记录
-						saveFileParsingRecord(file, "1");
+						saveFileParsingRecord(file, "1",99);
 						//移除文件备份到临时文件下
 						moveFile(file);
 					} else {
 						//文件解析失败之后,保存记录
-						saveFileParsingRecord(file, "0");
+						saveFileParsingRecord(file, "0",99);
 						//移除文件备份到error文件下
 						moveFileError(file);
 					}