|
@@ -36,7 +36,6 @@ import java.math.RoundingMode;
|
|
import java.text.ParseException;
|
|
import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
-import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* 解析电科院NWP和DQ文件
|
|
* 解析电科院NWP和DQ文件
|
|
@@ -108,6 +107,10 @@ public class FileAnalysisService extends BaseService {
|
|
|
|
|
|
PowerPlanSDService powerPlanSDService;
|
|
PowerPlanSDService powerPlanSDService;
|
|
|
|
|
|
|
|
+ ForecastPowerShortTermOneService forecastPowerShortTermOneService;
|
|
|
|
+
|
|
|
|
+ ForecastPowerShortTermTwoService forecastPowerShortTermTwoService;
|
|
|
|
+
|
|
ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository;
|
|
ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository;
|
|
AGC_AVCInfoService agcAvcInfoService;
|
|
AGC_AVCInfoService agcAvcInfoService;
|
|
BoosterStationInfoService boosterStationInfoService;
|
|
BoosterStationInfoService boosterStationInfoService;
|
|
@@ -164,35 +167,121 @@ public class FileAnalysisService extends BaseService {
|
|
flag = false;
|
|
flag = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 预测标识保存一期、二期还是总
|
|
|
|
+ int ycbs = 0;
|
|
if (file.getName().startsWith("DQ")) {
|
|
if (file.getName().startsWith("DQ")) {
|
|
try {
|
|
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) {
|
|
} catch (Exception e) {
|
|
flag = false;
|
|
flag = false;
|
|
log.error("解析DQ文件失败", e);
|
|
log.error("解析DQ文件失败", e);
|
|
@@ -842,7 +931,7 @@ public class FileAnalysisService extends BaseService {
|
|
|
|
|
|
if (flag) {
|
|
if (flag) {
|
|
//文件解析成功之后,保存记录
|
|
//文件解析成功之后,保存记录
|
|
- saveFileParsingRecord(file, "1");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "1",ycbs);
|
|
//移除文件备份到临时文件下
|
|
//移除文件备份到临时文件下
|
|
moveFile(file);
|
|
moveFile(file);
|
|
if (startConsole){
|
|
if (startConsole){
|
|
@@ -858,7 +947,7 @@ public class FileAnalysisService extends BaseService {
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//文件解析失败之后,保存记录
|
|
//文件解析失败之后,保存记录
|
|
- saveFileParsingRecord(file, "0");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "0",ycbs);
|
|
//移除文件备份到error文件下
|
|
//移除文件备份到error文件下
|
|
moveFileError(file);
|
|
moveFileError(file);
|
|
}
|
|
}
|
|
@@ -909,12 +998,12 @@ public class FileAnalysisService extends BaseService {
|
|
} finally {
|
|
} finally {
|
|
if (flag) {
|
|
if (flag) {
|
|
//文件解析成功之后,保存记录
|
|
//文件解析成功之后,保存记录
|
|
- saveFileParsingRecord(file, "1");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "1",99);
|
|
//移除文件备份到临时文件下
|
|
//移除文件备份到临时文件下
|
|
moveFile(file);
|
|
moveFile(file);
|
|
} else {
|
|
} else {
|
|
//文件解析失败之后,保存记录
|
|
//文件解析失败之后,保存记录
|
|
- saveFileParsingRecord(file, "0");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "0",99);
|
|
//移除文件备份到error文件下
|
|
//移除文件备份到error文件下
|
|
moveFileError(file);
|
|
moveFileError(file);
|
|
}
|
|
}
|
|
@@ -1368,7 +1457,105 @@ public class FileAnalysisService extends BaseService {
|
|
return forecastPowerShortTerm;
|
|
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 file 文件信息
|
|
* @param fileStatus 文件解析状态 1:表示解析成功 0:解析失败
|
|
* @param fileStatus 文件解析状态 1:表示解析成功 0:解析失败
|
|
|
|
+ * @param ycbs 预 测标识
|
|
*/
|
|
*/
|
|
- private void saveFileParsingRecord(File file, String fileStatus) {
|
|
|
|
|
|
+ private void saveFileParsingRecord(File file, String fileStatus,Integer ycbs) {
|
|
String fileType = "";
|
|
String fileType = "";
|
|
if (file.getName().startsWith("JH")) {
|
|
if (file.getName().startsWith("JH")) {
|
|
fileType = "JH";//假期文件
|
|
fileType = "JH";//假期文件
|
|
} else if (file.getName().startsWith("DQ")) {
|
|
} 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")) {
|
|
} else if (file.getName().startsWith("NWP")) {
|
|
fileType = "NWP";//NWP文件
|
|
fileType = "NWP";//NWP文件
|
|
} else if (file.getName().startsWith("UP")) {
|
|
} else if (file.getName().startsWith("UP")) {
|
|
@@ -1684,12 +1880,12 @@ public class FileAnalysisService extends BaseService {
|
|
} finally {
|
|
} finally {
|
|
if (flag) {
|
|
if (flag) {
|
|
//文件解析成功之后,保存记录
|
|
//文件解析成功之后,保存记录
|
|
- saveFileParsingRecord(file, "1");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "1",99);
|
|
//移除文件备份到临时文件下
|
|
//移除文件备份到临时文件下
|
|
moveFile(file);
|
|
moveFile(file);
|
|
} else {
|
|
} else {
|
|
//文件解析失败之后,保存记录
|
|
//文件解析失败之后,保存记录
|
|
- saveFileParsingRecord(file, "0");
|
|
|
|
|
|
+ saveFileParsingRecord(file, "0",99);
|
|
//移除文件备份到error文件下
|
|
//移除文件备份到error文件下
|
|
moveFileError(file);
|
|
moveFileError(file);
|
|
}
|
|
}
|