Prechádzať zdrojové kódy

1.增加解析验证调控功能
2.云端解析调用检修功能
3.解析检修计划功能

tl 6 mesiacov pred
rodič
commit
e88cf3e4aa

+ 24 - 0
cpp-admin/src/main/java/com/cpp/web/domain/BaseForecastCloudEntity.java

@@ -0,0 +1,24 @@
+package com.cpp.web.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预测功率基类
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BaseForecastCloudEntity extends BaseForecastEntity {
+
+    /**
+     * 预测模型
+     */
+    @ApiModelProperty(value = "预测模型")
+    private String forecastModel;
+
+}

+ 2 - 14
cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerShortTermCloud.java

@@ -1,18 +1,11 @@
 package com.cpp.web.domain.cloud;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.cpp.web.domain.BaseCppEntity;
-import com.cpp.web.domain.BaseForecastEntity;
+import com.cpp.web.domain.BaseForecastCloudEntity;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
-import javax.validation.constraints.Digits;
-
 /**
  * 中心测预测短期
  *
@@ -23,13 +16,8 @@ import javax.validation.constraints.Digits;
 @TableName("cpp_forecast_power_short_term_cloud")
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "cpp_forecast_power_short_term_cloud")
-public class ForecastPowerShortTermCloud extends BaseForecastEntity {
+public class ForecastPowerShortTermCloud extends BaseForecastCloudEntity {
 
-    /**
-     * 预测模型
-     */
-    @ApiModelProperty(value = "预测模型")
-    private String forecastModel;
 
 
 }

+ 2 - 14
cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerUltraShortTermCloud.java

@@ -1,17 +1,11 @@
 package com.cpp.web.domain.cloud;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.cpp.web.domain.BaseCppEntity;
-import com.cpp.web.domain.BaseForecastEntity;
+import com.cpp.web.domain.BaseForecastCloudEntity;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
-import javax.validation.constraints.Digits;
 
 /**
  * 中心测预测超短期
@@ -23,12 +17,6 @@ import javax.validation.constraints.Digits;
 @TableName("cpp_forecast_power_ultra_short_term_cloud")
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "cpp_forecast_power_ultra_short_term_cloud")
-public class ForecastPowerUltraShortTermCloud extends BaseForecastEntity {
-
-    /**
-     * 预测模型
-     */
-    @ApiModelProperty(value = "预测模型")
-    private String forecastModel;
+public class ForecastPowerUltraShortTermCloud extends BaseForecastCloudEntity {
 
 }

+ 9 - 20
cpp-admin/src/main/java/com/cpp/web/service/datafactory/CloudFileParsing.java

@@ -1,6 +1,7 @@
 package com.cpp.web.service.datafactory;
 
 import com.cpp.common.utils.StringUtils;
+import com.cpp.web.domain.BaseForecastCloudEntity;
 import com.cpp.web.domain.BaseForecastEntity;
 import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import com.cpp.web.domain.cloud.NwpCloud;
@@ -105,15 +106,16 @@ public class CloudFileParsing {
                 }
                 // 如果文件名长度符合规则
                 if (fileName.length() < 31) {
-                    // 如果是短期文件
-                    if (file.getName().startsWith("DQ")) {
-                        String stationCode = findStationCode(fileName);
-                        if (!stationCode.equals("null")) {
+                    String stationCode = findStationCode(fileName);
+                    if (!stationCode.equals("null")) {
+                        // 如果是短期文件
+                        if (file.getName().startsWith("DQ")) {
+
                             try {
                                 //标准格式DQ_J01100_202410170118030.RB
                                 parsingLog.setFileType(FileTypeEnum.dq);
                                 // 解析短期文件
-                                List<BaseForecastEntity> listDq = new ArrayList<>();
+                                List<BaseForecastCloudEntity> listDq = new ArrayList<>();
                                 listDq.addAll(fileAnalysisShortTerm(file, new Date(currentDate)));
                                 if (!listDq.isEmpty()) {
                                     try {
@@ -140,18 +142,11 @@ public class CloudFileParsing {
                                 LogUtil.info(DataSourcesEnum.E2, AlarmEnum.E4, "解析DQ文件失败:" + fileName, null);
                                 log.error("解析DQ文件失败:" + fileName, e);
                             }
-                        }else {
-                            flag = false;
-                            parsingLog.setParsingDescribe("解析DQ文件异常:" + fileName + "==无法获取场站编码");
-                            LogUtil.info(DataSourcesEnum.E2, AlarmEnum.E4, "解析DQ文件失败:" + fileName + "==无法获取场站编码", null);
-                            log.error("解析DQ文件失败:" + fileName + "==无法获取场站编码");
                         }
-                    }
 
 
-                    if (file.getName().startsWith("NWP")) {
-                        String stationCode = findStationCode(fileName);
-                        if (!stationCode.equals("null")) {
+                        if (file.getName().startsWith("NWP")) {
+
                             try {
                                 parsingLog.setFileType(FileTypeEnum.nwp);
                                 List<NwpCloud> listNwp = fileAnalysisNwp(file, new Date(currentDate));
@@ -178,13 +173,7 @@ public class CloudFileParsing {
                                 parsingLog.setParsingDescribe("解析NWP文件失败:" + fileName);
                                 flag = false;
                             }
-                        } else {
-                            flag = false;
-                            LogUtil.info(DataSourcesEnum.E2, AlarmEnum.E4, "解析NWP文件失败:" + fileName + "==无法获取场站编码", null);
-                            log.error("解析NWP文件失败:" + fileName + "==无法获取场站编码");
-                            parsingLog.setParsingDescribe("解析NWP文件失败:" + fileName + "==无法获取场站编码");
                         }
-
                     }
 
 

+ 23 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingInterface.java

@@ -126,5 +126,28 @@ public interface ParsingInterface {
         }
     }
 
+    default String parsingUploadStatus(String sign, List<String> fileContent) {
+        String uploadStatus = "fail";
+        try {
+            ParsingConfParam config = ParsingFieldUtil.getConfig(sign);
+            String s = fileContent.get(Integer.parseInt(config.getLineNumber()) - 1);
+            int signIndex = s.indexOf(config.getDataSign());
+            if (signIndex > 0) {
+                int startLength = config.getDataSign().length() + signIndex + 1;
+                int length = 7;
+                if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                    startLength += 1;
+                }
+                if (s.substring(startLength, startLength + length).equals("success")){
+                    uploadStatus = "success";
+                }
+            }
+
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return uploadStatus;
+        }
 
+    }
 }

+ 3 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRcdqServiceImpl.java

@@ -6,12 +6,14 @@ import com.cpp.web.domain.datafactory.ParsingCdq;
 import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.domain.regulation.TempShortRegulation;
 import com.cpp.web.domain.station.ForecastPowerUltraShortTermRegulation;
 import com.cpp.web.domain.station.ForecastPowerUltraShortTermStation;
 import com.cpp.web.service.datafactory.DataStore;
 import com.cpp.web.service.datafactory.ParsingCdqService;
 import com.cpp.web.service.datafactory.ParsingInterface;
 import com.cpp.web.service.datafactory.ScheduledHelper;
+import com.cpp.web.service.regulation.TempShortRegulationService;
 import com.cpp.web.service.station.ForecastPowerUltraShortTermRegulationService;
 import com.cpp.web.service.station.ForecastPowerUltraShortTermStationService;
 import com.cpp.web.utils.DateTimeUtil;
@@ -76,6 +78,7 @@ public class ParsingRcdqServiceImpl implements ParsingInterface {
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 if (parsingCdq.getDataType().equals(ParsingFieldUtil.MULTI)) {//多行操作
                     Date forecastTime = parsingForecastTime(parsingCdq.getForecastTime(), fileContent);
+                    String status = parsingUploadStatus("2<=>5<=>status=",fileContent);
                     Date time = forecastTime;
                     if (forecastTime != null) {//解析时间成功才可以进行以下操作
                         if (parsingCdq.getFpValue() != null) {

+ 86 - 3
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRdqServiceImpl.java

@@ -1,24 +1,36 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cpp.common.utils.spring.SpringUtils;
 import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingDq;
 import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.domain.enums.UploadStatusEnum;
+import com.cpp.web.domain.regulation.TempShortRegulation;
 import com.cpp.web.domain.station.ForecastPowerShortTermRegulation;
+import com.cpp.web.domain.station.ForecastPowerShortTermSend;
 import com.cpp.web.domain.station.ForecastPowerShortTermStation;
 import com.cpp.web.service.datafactory.DataStore;
 import com.cpp.web.service.datafactory.ParsingDqService;
 import com.cpp.web.service.datafactory.ParsingInterface;
 import com.cpp.web.service.datafactory.ScheduledHelper;
+import com.cpp.web.service.regulation.TempShortRegulationService;
 import com.cpp.web.service.station.ForecastPowerShortTermRegulationService;
+import com.cpp.web.service.station.ForecastPowerShortTermSendService;
 import com.cpp.web.utils.DateTimeUtil;
 import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -28,6 +40,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -49,6 +62,10 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
 
     private List<ParsingDq> parsingDqs = new ArrayList<>();
 
+    private final TempShortRegulationService tempShortRegulationService;
+
+    private final ForecastPowerShortTermSendService forecastPowerShortTermSendService;
+
     @Override
     public boolean save(BaseParsing parsing) {
         return true;
@@ -79,6 +96,7 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 if (parsingDqInfo.getDataType().equals(ParsingFieldUtil.MULTI)) {//多行操作
                     Date forecastTime = parsingForecastTime(parsingDqInfo.getForecastTime(), fileContent);
+                    String status = parsingUploadStatus("2<=>5<=>status=", fileContent);
                     Date time = forecastTime;
                     if (forecastTime != null) {//解析时间成功才可以进行以下操作
                         if (parsingDqInfo.getFpValue() != null) {
@@ -103,10 +121,19 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
                                     }
                                 }
 
-                                scheduleAddCache(forecastPowerShortTermRegulationList,stationCode);
+                                scheduleAddCache(forecastPowerShortTermRegulationList, stationCode);
                                 forecastPowerShortTermRegulationService.saveBatch(forecastPowerShortTermRegulationList);
                                 log.info("解析 调控后DQ文件:{} 成功! O(∩_∩)O", file.getName());
                                 parsingResultDto.setStatus("success");
+
+                                //使用新线程写入状态,不会影响解析速度
+                                SpringUtils.getBean(ThreadPoolTaskExecutor.class).execute(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        verifyRegulation(stationCode, forecastPowerShortTermRegulationList, forecastTime, status);
+                                    }
+                                });
+
                             } else {
                                 parsingResultDto.setMessage("解析 调控后短期文件时间错误");
                                 log.error("解析  调控后DQ文件时间错误");
@@ -135,6 +162,61 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
         }
     }
 
+    /**
+     * 校验调控后数据是否成功上传
+     *
+     * @param stationCode
+     * @param forecastPowerShortTermRegulationList
+     * @param forecastTime
+     * @param status
+     */
+    private void verifyRegulation(String stationCode, List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList, Date forecastTime, String status) {
+        String dqEndTime = configService.selectConfigByKey("dqEndTime");
+        if (dqEndTime.equals(StringUtils.EMPTY)) {
+            dqEndTime = "08:00";
+        }
+        try {
+            Long longTime = forecastTime.getTime() - 86400000L;
+            Date startTime = DateTimeUtil.getDayStartTime(longTime);
+            Date endTime = DateUtils.parseDate(DateFormatUtils.format(startTime, "yyyy-MM-dd " + dqEndTime), "yyyy-MM-dd HH:mm");
+            QueryWrapper<TempShortRegulation> tk_date = new QueryWrapper<TempShortRegulation>().between("tk_date", startTime, endTime).eq("station_code", stationCode);
+            List<TempShortRegulation> tempShortRegulations = tempShortRegulationService.list(tk_date);
+            if (tempShortRegulations.size() > 0) {
+                if (status.equals("success")) {
+                    List<ForecastPowerShortTermSend> forecastPowerShortTermSendList = forecastPowerShortTermSendService.findByForecastTimeBetweenAndForecastHowLongAgoAndStationCode(forecastPowerShortTermRegulationList.get(0).getTime().getTime(), forecastPowerShortTermRegulationList.get(forecastPowerShortTermRegulationList.size() - 1).getTime().getTime(), -99, stationCode);
+                    Map<Date, List<ForecastPowerShortTermSend>> dateListMap = forecastPowerShortTermSendList.stream().collect(Collectors.groupingBy(ForecastPowerShortTermSend::getTime, Collectors.toList()));
+                    Map<Date, List<ForecastPowerShortTermRegulation>> listMap = forecastPowerShortTermRegulationList.stream().collect(Collectors.groupingBy(ForecastPowerShortTermRegulation::getTime, Collectors.toList()));
+                    String uploadStatus = UploadStatusEnum.E1.name();
+                    for (Map.Entry<Date, List<ForecastPowerShortTermRegulation>> dateListEntry : listMap.entrySet()) {
+                        if (dateListMap.containsKey(dateListEntry.getKey())) {
+                            if (dateListMap.get(dateListEntry.getKey()).get(0).getFpValue().compareTo(dateListEntry.getValue().get(0).getFpValue()) != 0) {
+                                uploadStatus = UploadStatusEnum.E2.name();
+                                log.info("回传数据与下发数据不符,调控失败{}", stationCode);
+                                break;
+                            }
+                        } else {
+                            uploadStatus = UploadStatusEnum.E2.name();
+                            log.info("回传数据时间与下发数据时间不符,调控失败{}", stationCode);
+                            break;
+                        }
+                    }
+                    for (TempShortRegulation tempShortRegulation : tempShortRegulations) {
+                        tempShortRegulation.setUploadStatusEnum(uploadStatus);
+                    }
+                } else {
+                    log.info("站端返回上报结果失败,调控失败{}", stationCode);
+                    for (TempShortRegulation tempShortRegulation : tempShortRegulations) {
+                        tempShortRegulation.setUploadStatusEnum(UploadStatusEnum.E2.name());
+                    }
+                }
+                tempShortRegulationService.saveOrUpdateBatch(tempShortRegulations);
+            }
+        } catch (Exception e) {
+            log.error("验证调控失败", e);
+            e.printStackTrace();
+        }
+    }
+
     protected Date parsingForecastTime(String sign, List<String> fileContent) {
         Date forecastTime = null;
         try {
@@ -237,13 +319,14 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
      * @param time
      */
     public Integer calcHowLongAgo(Date baseTime, Date time) {
-        return ((int) (time.getTime() - baseTime.getTime() % 86400000L)) + 1;
+        return ((int) ((time.getTime() - baseTime.getTime()) / 86400000L)) + 1;
     }
 
 
     private final ScheduledHelper scheduledHelper = new ScheduledHelper();
 
-    public void scheduleAddCache(List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList, String stationCode) {
+    public void scheduleAddCache
+            (List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList, String stationCode) {
 
         int ago = 1;
         try {

+ 14 - 1
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingStatusServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.File;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -79,6 +80,7 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
         private List<ChannelError> channelErrors;
         private List<UploadFile> uploadFiles;
         private BigDecimal hardDiskCapacity;
+        private List<RestrictedPlan> restrictedPlans;
 
 
         /**
@@ -88,7 +90,6 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
          */
         private void generateAbnormalAlarm(String stationCode) {
 
-            List<AbnormalAlarm> list = new ArrayList<>();
             if (this.channelErrors != null) {
                 for (ChannelError channelError : this.channelErrors) {
                     LogUtil.info(DataSourcesEnum.E1, AlarmEnum.E1, channelError.getMsg(), stationCode);
@@ -107,6 +108,9 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
                     LogUtil.info(DataSourcesEnum.E1, AlarmEnum.E3, LogUtil.format("站端磁盘空间达到 {}%,请关注!", this.hardDiskCapacity), stationCode);
                 }
             }
+            if (this.restrictedPlans != null&&restrictedPlans.size()>0) {
+
+            }
 
         }
     }
@@ -122,4 +126,13 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
         private String type;
         private String name;
     }
+
+    @Data
+    class RestrictedPlan {
+        private String planName;
+        private Date startTime;
+        private Date endTime;
+        private BigDecimal capacity;
+        private String describe;
+    }
 }

+ 2 - 1
cpp-admin/src/main/java/com/cpp/web/service/overhaulplan/OverhaulPlanService.java

@@ -2,6 +2,7 @@ package com.cpp.web.service.overhaulplan;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.BaseForecastCloudEntity;
 import com.cpp.web.domain.BaseForecastEntity;
 import com.cpp.web.domain.overhaulplan.OverhaulPlan;
 
@@ -24,6 +25,6 @@ public interface OverhaulPlanService extends IService<OverhaulPlan> {
 
     List<OverhaulPlan> findByStationCodeAndTimeBetween(Date startTime,Date endTime,String stationCode);
 
-    List getCorrectionData(List<BaseForecastEntity> list, String fileType, String fileName, String stationCode);
+    List getCorrectionData(List<BaseForecastCloudEntity> list, String fileType, String fileName, String stationCode);
 
 }

+ 3 - 2
cpp-admin/src/main/java/com/cpp/web/service/overhaulplan/impl/OverhaulPlanServiceImpl.java

@@ -2,6 +2,7 @@ package com.cpp.web.service.overhaulplan.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.BaseForecastCloudEntity;
 import com.cpp.web.domain.BaseForecastEntity;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
 import com.cpp.web.domain.overhaulplan.OverhaulPlan;
@@ -105,7 +106,7 @@ public class OverhaulPlanServiceImpl extends ServiceImpl<OverhaulPlanMapper, Ove
      * @return
      */
     @Override
-    public List getCorrectionData(List<BaseForecastEntity> list, String fileType, String fileName, String stationCode) {
+    public List getCorrectionData(List<BaseForecastCloudEntity> list, String fileType, String fileName, String stationCode) {
 
         BigDecimal capacity;
         List<BaseForecastEntity> resultList = new ArrayList<>();
@@ -121,7 +122,7 @@ public class OverhaulPlanServiceImpl extends ServiceImpl<OverhaulPlanMapper, Ove
             capacity = BigDecimal.ZERO;
         }
         if (null != list && list.size() > 0) {
-            list.stream().sorted(Comparator.comparing(BaseForecastEntity::getTime));
+            list.stream().sorted(Comparator.comparing(BaseForecastCloudEntity::getTime));
             startTime = list.get(0).getTime();
             endTime = list.get(list.size() - 1).getTime();
 

+ 3 - 1
cpp-admin/src/main/java/com/cpp/web/service/station/impl/ForecastPowerShortTermSendServiceImpl.java

@@ -31,7 +31,9 @@ public class ForecastPowerShortTermSendServiceImpl extends ServiceImpl<ForecastP
         if (startTime != null && endTime != null) {
             wrapper.between("time", new Date(startTime), new Date(endTime));
         }
-        wrapper.eq("forecast_how_long_ago", howLongAgo);
+        if (howLongAgo != -99){
+            wrapper.eq("forecast_how_long_ago", howLongAgo);
+        }
         return baseMapper.selectList(wrapper);
     }