瀏覽代碼

1.增加解析短期和超短期业务的数目校验
2.增加解析后删除相同时间的数据以免插入重复时间数据
3.日志打印的优化

tl 6 月之前
父節點
當前提交
eedbc38b63
共有 17 個文件被更改,包括 390 次插入321 次删除
  1. 6 4
      cpp-admin/src/main/java/com/cpp/web/controller/largeScreen/LargeScreenController.java
  2. 5 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerShortTermRegulation.java
  3. 6 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerUltraShortTermRegulation.java
  4. 59 23
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/DataStore.java
  5. 28 14
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCdqServiceImpl.java
  6. 60 60
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCftServiceImpl.java
  7. 31 22
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingDqServiceImpl.java
  8. 22 26
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFjServiceImpl.java
  9. 19 14
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNbqServiceImpl.java
  10. 13 17
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNwpServiceImpl.java
  11. 13 9
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingQxzServiceImpl.java
  12. 48 42
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRcdqServiceImpl.java
  13. 57 56
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRdqServiceImpl.java
  14. 13 14
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRpServiceImpl.java
  15. 6 15
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingStatusServiceImpl.java
  16. 0 1
      cpp-system/src/main/java/com/cpp/system/service/ISysConfigService.java
  17. 4 4
      cpp-ui/src/views/largeScreen/index.vue

+ 6 - 4
cpp-admin/src/main/java/com/cpp/web/controller/largeScreen/LargeScreenController.java

@@ -34,6 +34,8 @@ public class LargeScreenController {
     @Autowired
     ForecastPowerUltraShortTermStationService forecastPowerUltraShortTermStationService;
     @Autowired
+    ForecastPowerUltraShortTermRegulationService forecastPowerUltraShortTermRegulationService;
+    @Autowired
     ForecastPowerShortTermRegulationService forecastPowerShortTermRegulationService;
     @Autowired
     ElectricFieldService electricFieldService;
@@ -137,9 +139,9 @@ public class LargeScreenController {
         QueryWrapper cdqysWrapper = new QueryWrapper<>();
         cdqysWrapper.eq("forecast_how_long_ago", Integer.parseInt(cdqHowLongAgo));
         cdqysWrapper.between("time", dayStartTime, dayEndTime);
-        List<ForecastPowerUltraShortTermStation> forecastPowerUltraShortTermStationList = forecastPowerUltraShortTermStationService.list(cdqysWrapper);
+        List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermStationList = forecastPowerUltraShortTermRegulationService.list(cdqysWrapper);
         // 按场时间分组
-        Map<Long, List<ForecastPowerUltraShortTermStation>> utraShortTermStationDataGroup = forecastPowerUltraShortTermStationList.stream().collect(Collectors.groupingBy(s->s.getTime().getTime()));
+        Map<Long, List<ForecastPowerUltraShortTermRegulation>> utraShortTermStationDataGroup = forecastPowerUltraShortTermStationList.stream().collect(Collectors.groupingBy(s->s.getTime().getTime()));
 
         // 获取短期上报
         String dqHowLongAgo = configService.selectConfigByKey("dqHowLongAgo");
@@ -179,9 +181,9 @@ public class LargeScreenController {
             // 统计超短期曲线
             if (utraShortTermStationDataGroup.get(tempTime)!=null){
                 // 对每个时间点的所有场站数据进行求和
-                List<ForecastPowerUltraShortTermStation> everyDataList = utraShortTermStationDataGroup.get(tempTime);
+                List<ForecastPowerUltraShortTermRegulation> everyDataList = utraShortTermStationDataGroup.get(tempTime);
                 BigDecimal tempCdqSum = BigDecimal.ZERO;
-                for (ForecastPowerUltraShortTermStation forecastPowerUltraShortTermStation:everyDataList){
+                for (ForecastPowerUltraShortTermRegulation forecastPowerUltraShortTermStation:everyDataList){
                     BigDecimal cdqValue = forecastPowerUltraShortTermStation.getFpValue();
                     tempCdqSum = tempCdqSum.add(cdqValue);
                 }

+ 5 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerShortTermRegulation.java

@@ -25,6 +25,11 @@ import java.util.Date;
 public class ForecastPowerShortTermRegulation extends BaseForecastEntity {
 
 
+    /**
+     * 生成日期
+     */
+    @ApiModelProperty(value = "生成日期")
+    private Date genDate;
 
 
 }

+ 6 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerUltraShortTermRegulation.java

@@ -23,4 +23,10 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "cpp_forecast_power_ultra_short_term_regulation")
 public class ForecastPowerUltraShortTermRegulation extends BaseForecastEntity {
+
+    /**
+     * 生成时间
+     */
+    @ApiModelProperty(value = "生成时间")
+    private Date genTime;
 }

+ 59 - 23
cpp-admin/src/main/java/com/cpp/web/service/datafactory/DataStore.java

@@ -5,7 +5,10 @@ import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.station.*;
 import com.cpp.web.service.station.*;
 import com.cpp.web.utils.DateTimeUtil;
+import lombok.Data;
 
+import java.util.LinkedList;
+import java.util.NoSuchElementException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
@@ -25,17 +28,39 @@ public class DataStore {
 
 
     public <T> void setData(List<T> t, String stationCode) {
-        if (t.size()>0)
-            this.map.put(stationCode + t.get(0).getClass().getName(), t);
+        if (t.size() > 0) {
+            Class<?> clazz = t.get(0).getClass();
+            if (ForecastPowerShortTermRegulation.class.equals(clazz)) {
+                if (this.map.containsKey(stationCode + clazz.getName())) {
+                    FixedSizeCollection<T> fixedSizeCollection = ((FixedSizeCollection<T>) this.map.get(stationCode + clazz.getName()));
+                    t.forEach(obj -> fixedSizeCollection.add(obj));
+                } else {
+                    FixedSizeCollection<T> fixedSizeCollection = new FixedSizeCollection<>(960);
+                    t.forEach(obj -> fixedSizeCollection.add(obj));
+                    this.map.put(stationCode + clazz.getName(), fixedSizeCollection);
+                }
+            } else if (ForecastPowerUltraShortTermRegulation.class.equals(clazz)) {
+                if (this.map.containsKey(stationCode + clazz.getName())) {
+                    FixedSizeCollection<T> fixedSizeCollection = ((FixedSizeCollection<T>) this.map.get(stationCode + clazz.getName()));
+                    t.forEach(obj -> fixedSizeCollection.add(obj));
+                } else {
+                    FixedSizeCollection<T> fixedSizeCollection = new FixedSizeCollection<>(16);
+                    t.forEach(obj -> fixedSizeCollection.add(obj));
+                    this.map.put(stationCode + clazz.getName(), fixedSizeCollection);
+                }
+            } else if (PowerStationStatusData.class.equals(clazz) || WeatherStationStatusData.class.equals(clazz) || WindTowerStatusData.class.equals(clazz)) {
+                this.map.put(stationCode + clazz.getName(), t);
+            }
+        }
     }
 
 
     public <T> T getData(String stationCode, Class<T> clazz) {
         Object o = this.map.get(stationCode + clazz.getName());
-        if (o!=null){
+        if (o != null) {
             Date date = null;
             if (ForecastPowerShortTermRegulation.class.equals(clazz)) {
-                List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList = ((List<ForecastPowerShortTermRegulation>) o);
+                List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList = ((FixedSizeCollection<ForecastPowerShortTermRegulation>) o).getList();
                 date = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
                 Date finalDate1 = date;
                 List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulations = forecastPowerShortTermRegulationList.stream().filter(f -> f.getTime().equals(finalDate1)).collect(Collectors.toList());
@@ -45,7 +70,7 @@ public class DataStore {
                     return null;
                 }
             } else if (ForecastPowerUltraShortTermRegulation.class.equals(clazz)) {
-                List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulationList = ((List<ForecastPowerUltraShortTermRegulation>) o);
+                List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulationList = ((FixedSizeCollection<ForecastPowerUltraShortTermRegulation>) o).getList();
                 date = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
                 Date finalDate = date;
                 List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulations = forecastPowerUltraShortTermRegulationList.stream().filter(f -> f.getTime().equals(finalDate)).collect(Collectors.toList());
@@ -57,16 +82,12 @@ public class DataStore {
             } else if (PowerStationStatusData.class.equals(clazz) || WeatherStationStatusData.class.equals(clazz) || WindTowerStatusData.class.equals(clazz)) {
                 return ((List<T>) o).get(0);
             }
-
         }
-
         return null;
 
     }
 
     public void init() {
-
-
         ISysConfigService configService = SpringUtils.getBean(ISysConfigService.class);
         ElectricFieldService electricFieldService = SpringUtils.getBean(ElectricFieldService.class);
         PowerStationStatusDataService powerStationStatusDataService = SpringUtils.getBean(PowerStationStatusDataService.class);
@@ -76,30 +97,21 @@ public class DataStore {
         WeatherStationStatusDataService weatherStationStatusDataService = SpringUtils.getBean(WeatherStationStatusDataService.class);
 
         List<ElectricField> electricFieldList = electricFieldService.list();
-
         Date dayStartTime = DateTimeUtil.getDayStartTime(System.currentTimeMillis());
         //不清楚短期是否解析过,多查询一天直接置入
         Date dayEndTime = DateTimeUtil.getDayLastTime(System.currentTimeMillis() + 86400000L);
-
-
         if (electricFieldList.size() > 0) {
-
-
             int dqAgo = 1;
             try {
                 String dqHowLongAgo = configService.selectConfigByKey("dqHowLongAgo");
                 dqAgo = Integer.parseInt(dqHowLongAgo);
             } catch (Exception e) {
-
             }
-
-
             int cdqAgo = 1;
             try {
                 String cdqHowLongAgo = configService.selectConfigByKey("cdqHowLongAgo");
                 cdqAgo = Integer.parseInt(cdqHowLongAgo);
             } catch (Exception e) {
-
             }
 
             Map<String, List<PowerStationStatusData>> powerStationStatusDataListMap = powerStationStatusDataService.findByTimeBetween(dayStartTime, dayEndTime).stream().collect(Collectors.groupingBy(PowerStationStatusData::getStationCode, Collectors.toList()));
@@ -108,7 +120,6 @@ public class DataStore {
             Map<String, List<WindTowerStatusData>> windTowerStatusDataListMap = windTowerStatusDataService.findByBetweenTimeAndStationCode(dayStartTime, dayEndTime, null).stream().collect(Collectors.groupingBy(WindTowerStatusData::getStationCode, Collectors.toList()));
             Map<String, List<WeatherStationStatusData>> weatherStationStatusDataListMap = weatherStationStatusDataService.findByBetweenTimeAndStationCode(dayStartTime, dayEndTime, null).stream().collect(Collectors.groupingBy(WeatherStationStatusData::getStationCode, Collectors.toList()));
 
-
             for (ElectricField electricField : electricFieldList) {
                 String stationCode = electricField.getStationCode();
                 if (powerStationStatusDataListMap.containsKey(stationCode)) {
@@ -116,7 +127,6 @@ public class DataStore {
                     setData(Arrays.asList(powerStationStatusData), stationCode);
                 }
 
-
                 if (electricField.getElectricFieldTypeEnum().equals("E2") && windTowerStatusDataListMap.containsKey(stationCode)) {
                     WindTowerStatusData windTowerStatusData = windTowerStatusDataListMap.get(stationCode).stream().max(Comparator.comparing(p -> p.getTime().getTime())).get();
                     setData(Arrays.asList(windTowerStatusData), stationCode);
@@ -127,24 +137,50 @@ public class DataStore {
                     setData(Arrays.asList(weatherStationStatusData), stationCode);
                 }
 
-
                 if (forecastPowerShortTermRegulationListMap.containsKey(stationCode)) {
                     List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulations = forecastPowerShortTermRegulationListMap.get(stationCode);
                     setData(forecastPowerShortTermRegulations, stationCode);
-
                 }
 
                 if (forecastPowerUltraShortTermRegulationListMap.containsKey(stationCode)) {
                     List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulations = forecastPowerUltraShortTermRegulationListMap.get(stationCode);
                     setData(forecastPowerUltraShortTermRegulations, stationCode);
                 }
+            }
+        }
+    }
+
+    @Data
+    public class FixedSizeCollection<T> {
+        private final int maxSize;
+        private final LinkedList<T> list;
 
+        public FixedSizeCollection(int maxSize) {
+            this.maxSize = maxSize;
+            this.list = new LinkedList<>();
+        }
 
+        public void add(T element) {
+            list.add(element);
+            if (list.size() > maxSize) {
+                list.removeFirst();
             }
         }
 
+        public T get(int index) {
+            if (index < 0 || index >= list.size()) {
+                throw new NoSuchElementException("Index out of bounds: " + index);
+            }
+            return list.get(index);
+        }
 
-    }
+        public int size() {
+            return list.size();
+        }
 
+        public boolean isEmpty() {
+            return list.isEmpty();
+        }
 
+    }
 }

+ 28 - 14
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCdqServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.datafactory.BaseParsing;
@@ -19,6 +20,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,11 +40,13 @@ import java.util.stream.Collectors;
  * @date 2022-05-11 18:07:03
  */
 @Service("cdqParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingCdqServiceImpl extends ServiceImpl<ParsingCdqMapper, ParsingCdq> implements ParsingCdqService, ParsingInterface {
 
+    private final ISysConfigService configService;
+
     private final ForecastPowerUltraShortTermStationService forecastPowerUltraShortTermStationService;
 
     private List<ParsingCdq> parsingCdqs = new ArrayList<>();
@@ -59,14 +63,10 @@ public class ParsingCdqServiceImpl extends ServiceImpl<ParsingCdqMapper, Parsing
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.cdq.name());
-
         try {
-
-
             if (!this.parsingCdqs.isEmpty()) {
                 ParsingCdq parsingCdq = this.parsingCdqs.get(0);
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
@@ -91,29 +91,44 @@ public class ParsingCdqServiceImpl extends ServiceImpl<ParsingCdqMapper, Parsing
                                     forecastPowerUltraShortTermStationList.add(forecastPowerUltraShortTermStation);
                                     time = new Date(time.getTime() + 900000L);//递增15分钟
                                 }
-                                forecastPowerUltraShortTermStationService.saveBatch(forecastPowerUltraShortTermStationList);
-                                log.info("解析CDQ文件:{} 成功! O(∩_∩)O", file.getName());
-                                parsingResultDto.setStatus("success");
+                                int cdqPoint = 16;
+                                try {
+                                    cdqPoint = Integer.parseInt(configService.selectConfigByKey("require_cdq_point"));
+                                } catch (Exception e) {
+                                }
+                                if (forecastPowerUltraShortTermStationList.size() == cdqPoint) {
+                                    forecastPowerUltraShortTermStationService.remove(
+                                            new QueryWrapper<ForecastPowerUltraShortTermStation>()
+                                                    .eq("gen_time", genTime)
+                                                    .eq("station_code", stationCode)
+                                                    .between("time", forecastPowerUltraShortTermStationList.get(0).getTime(), forecastPowerUltraShortTermStationList.get(forecastPowerUltraShortTermStationList.size() - 1).getTime()));
+                                    forecastPowerUltraShortTermStationService.saveBatch(forecastPowerUltraShortTermStationList);
+                                    log.info("[" + stationCode + "]解析超短期文件:{} 成功! O(∩_∩)O", file.getName());
+                                    parsingResultDto.setStatus("success");
+                                } else {
+                                    parsingResultDto.setMessage("解析超短期文件数据量与要求不一致");
+                                    log.error("[" + stationCode + "]解析超短期文件数据量与要求不一致,fileName:{}", file.getName());
+                                }
                             } else {
                                 parsingResultDto.setMessage("解析超短期文件时间错误");
-                                log.error("解析CDQ文件时间错误");
+                                log.error("[" + stationCode + "]解析超短期文件时间错误,fileName:{}", file.getName());
                             }
                         } else {
                             parsingResultDto.setMessage("超短期文件里日期不对");
-                            log.error("cdq文件里日期不对");
+                            log.error("[" + stationCode + "]超短期文件里日期不对,fileName:{}", file.getName());
                         }
                     } else {
                         parsingResultDto.setMessage("解析超短期文件无数据");
-                        log.error("解析超短期文件无数据");
+                        log.error("[" + stationCode + "]解析超短期文件无数据,fileName:{}", file.getName());
                     }
                 }
             } else {
                 parsingResultDto.setMessage("超短期暂无单行解析方式");
-                log.error("cdq暂无单行解析方式");
+                log.error("[" + stationCode + "]超短期暂无单行解析方式,fileName:{}", file.getName());
             }
         } catch (Exception e) {
             parsingResultDto.setMessage("解析超短期数据失败!");
-            log.error("解析超短期数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析超短期数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
@@ -212,5 +227,4 @@ public class ParsingCdqServiceImpl extends ServiceImpl<ParsingCdqMapper, Parsing
     }
 
 
-
 }

+ 60 - 60
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCftServiceImpl.java

@@ -1,11 +1,13 @@
 package com.cpp.web.service.datafactory.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingCft;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.domain.station.ForecastPowerUltraShortTermStation;
 import com.cpp.web.domain.station.WindTowerStatusData;
 import com.cpp.web.mapper.datafactory.ParsingCftMapper;
 import com.cpp.web.service.datafactory.DataStore;
@@ -16,6 +18,7 @@ import com.cpp.web.service.station.WindTowerStatusDataService;
 import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +37,7 @@ import java.util.stream.Collectors;
  * @date 2022-05-11 18:07:03
  */
 @Service("cftParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingCftServiceImpl extends ServiceImpl<ParsingCftMapper, ParsingCft> implements ParsingCftService, ParsingInterface {
@@ -55,66 +58,63 @@ public class ParsingCftServiceImpl extends ServiceImpl<ParsingCftMapper, Parsing
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-        {
-            ParsingResultDto parsingResultDto = new ParsingResultDto();
-            parsingResultDto.setFileName(file.getName());
-            parsingResultDto.setFileType(FileTypeEnum.cft.name());
-
-            try {
-                if (!this.parsingCfts.isEmpty()) {
-                    ParsingCft parsingCft = this.parsingCfts.get(0);
-
-                        List<String> fileContent = ParsingFileUtil.getFileContent(file);
-                            //判断文件名是否符合配置
-                            if (parsingCft.getDataType().equals(ParsingFieldUtil.SINGLE)) {
-                                Date time = parsingTime(parsingCft.getTime(), fileContent);
-                                if (time != null) {
-                                    WindTowerStatusData windTowerStatusData = new WindTowerStatusData();
-                                    windTowerStatusData.setTime(time);
-                                    windTowerStatusData.setT(parsingValue(parsingCft.gett(), fileContent));
-                                    windTowerStatusData.setPa(parsingValue(parsingCft.getPa(), fileContent));
-                                    windTowerStatusData.setRh(parsingValue(parsingCft.getRh(), fileContent));
-
-                                    windTowerStatusData.setWs10(parsingValue(parsingCft.getWs10(), fileContent));
-                                    windTowerStatusData.setWs30(parsingValue(parsingCft.getWs30(), fileContent));
-                                    windTowerStatusData.setWs50(parsingValue(parsingCft.getWs50(), fileContent));
-                                    windTowerStatusData.setWs60(parsingValue(parsingCft.getWs60(), fileContent));
-                                    windTowerStatusData.setWs70(parsingValue(parsingCft.getWs70(), fileContent));
-                                    windTowerStatusData.setWs80(parsingValue(parsingCft.getWs80(), fileContent));
-                                    windTowerStatusData.setWs90(parsingValue(parsingCft.getWs90(), fileContent));
-                                    windTowerStatusData.setWs100(parsingValue(parsingCft.getWs100(), fileContent));
-                                    windTowerStatusData.setWsHubHeight(parsingValue(parsingCft.getWsHubHeight(), fileContent));
-
-                                    windTowerStatusData.setWd10(parsingValue(parsingCft.getWd10(), fileContent));
-                                    windTowerStatusData.setWd30(parsingValue(parsingCft.getWd30(), fileContent));
-                                    windTowerStatusData.setWd50(parsingValue(parsingCft.getWd50(), fileContent));
-                                    windTowerStatusData.setWd60(parsingValue(parsingCft.getWd60(), fileContent));
-                                    windTowerStatusData.setWd70(parsingValue(parsingCft.getWd70(), fileContent));
-                                    windTowerStatusData.setWd80(parsingValue(parsingCft.getWd80(), fileContent));
-                                    windTowerStatusData.setWd90(parsingValue(parsingCft.getWd90(), fileContent));
-                                    windTowerStatusData.setWd100(parsingValue(parsingCft.getWd100(), fileContent));
-                                    windTowerStatusData.setWdHubHeight(parsingValue(parsingCft.getWdHubHeight(), fileContent));
-                                    windTowerStatusData.setStationCode(stationCode);
-                                    DataStore.getInstance().setData(Arrays.asList(windTowerStatusData),stationCode);
-                                    windTowerStatusDataService.save(windTowerStatusData);
-                                    parsingResultDto.setStatus("success");
-                                    log.info("解析CFT文件:{} 成功! O(∩_∩)O", file.getName());
-                                } else {
-                                    parsingResultDto.setMessage("解析测风塔文件时间错误");
-                                    log.error("解析CFT文件时间错误");
-                                }
-                            } else {
-                                parsingResultDto.setMessage("测风塔暂无多行解析方式");
-                                log.error("cft暂无多行解析方式");
-                            }
-
-                        }
-            } catch (Exception e) {
-                parsingResultDto.setMessage("解析测风塔数据失败!");
-                log.error("解析测风塔数据失败! /(ㄒoㄒ)/~~", e);
-            } finally {
-                return parsingResultDto;
+        ParsingResultDto parsingResultDto = new ParsingResultDto();
+        parsingResultDto.setFileName(file.getName());
+        parsingResultDto.setFileType(FileTypeEnum.cft.name());
+        try {
+            if (!this.parsingCfts.isEmpty()) {
+                ParsingCft parsingCft = this.parsingCfts.get(0);
+                List<String> fileContent = ParsingFileUtil.getFileContent(file);
+                //判断文件名是否符合配置
+                if (parsingCft.getDataType().equals(ParsingFieldUtil.SINGLE)) {
+                    Date time = parsingTime(parsingCft.getTime(), fileContent);
+                    if (time != null) {
+                        WindTowerStatusData windTowerStatusData = new WindTowerStatusData();
+                        windTowerStatusData.setTime(time);
+                        windTowerStatusData.setT(parsingValue(parsingCft.gett(), fileContent));
+                        windTowerStatusData.setPa(parsingValue(parsingCft.getPa(), fileContent));
+                        windTowerStatusData.setRh(parsingValue(parsingCft.getRh(), fileContent));
+                        windTowerStatusData.setWs10(parsingValue(parsingCft.getWs10(), fileContent));
+                        windTowerStatusData.setWs30(parsingValue(parsingCft.getWs30(), fileContent));
+                        windTowerStatusData.setWs50(parsingValue(parsingCft.getWs50(), fileContent));
+                        windTowerStatusData.setWs60(parsingValue(parsingCft.getWs60(), fileContent));
+                        windTowerStatusData.setWs70(parsingValue(parsingCft.getWs70(), fileContent));
+                        windTowerStatusData.setWs80(parsingValue(parsingCft.getWs80(), fileContent));
+                        windTowerStatusData.setWs90(parsingValue(parsingCft.getWs90(), fileContent));
+                        windTowerStatusData.setWs100(parsingValue(parsingCft.getWs100(), fileContent));
+                        windTowerStatusData.setWsHubHeight(parsingValue(parsingCft.getWsHubHeight(), fileContent));
+                        windTowerStatusData.setWd10(parsingValue(parsingCft.getWd10(), fileContent));
+                        windTowerStatusData.setWd30(parsingValue(parsingCft.getWd30(), fileContent));
+                        windTowerStatusData.setWd50(parsingValue(parsingCft.getWd50(), fileContent));
+                        windTowerStatusData.setWd60(parsingValue(parsingCft.getWd60(), fileContent));
+                        windTowerStatusData.setWd70(parsingValue(parsingCft.getWd70(), fileContent));
+                        windTowerStatusData.setWd80(parsingValue(parsingCft.getWd80(), fileContent));
+                        windTowerStatusData.setWd90(parsingValue(parsingCft.getWd90(), fileContent));
+                        windTowerStatusData.setWd100(parsingValue(parsingCft.getWd100(), fileContent));
+                        windTowerStatusData.setWdHubHeight(parsingValue(parsingCft.getWdHubHeight(), fileContent));
+                        windTowerStatusData.setStationCode(stationCode);
+                        DataStore.getInstance().setData(Arrays.asList(windTowerStatusData), stationCode);
+                        windTowerStatusDataService.remove(
+                                new QueryWrapper<WindTowerStatusData>()
+                                        .eq("time", time)
+                                        .eq("station_code", stationCode));
+                        windTowerStatusDataService.save(windTowerStatusData);
+                        parsingResultDto.setStatus("success");
+                        log.info("[" + stationCode + "]解析测风塔文件:{} 成功! O(∩_∩)O", file.getName());
+                    } else {
+                        parsingResultDto.setMessage("解析测风塔文件时间错误");
+                        log.error("[" + stationCode + "]解析测风塔文件时间错误,fileName:{}", file.getName());
+                    }
+                } else {
+                    parsingResultDto.setMessage("测风塔暂无多行解析方式");
+                    log.error("[" + stationCode + "]测风塔暂无多行解析方式,fileName:{}", file.getName());
+                }
             }
+        } catch (Exception e) {
+            parsingResultDto.setMessage("解析测风塔数据失败!");
+            log.error("[" + stationCode + "]解析测风塔数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
+        } finally {
+            return parsingResultDto;
         }
     }
 

+ 31 - 22
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingDqServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.datafactory.BaseParsing;
@@ -20,6 +21,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -41,10 +43,12 @@ import java.util.stream.Collectors;
  */
 @Service("dqParsing")
 @Slf4j
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Transactional
 public class ParsingDqServiceImpl extends ServiceImpl<ParsingDqMapper, ParsingDq> implements ParsingDqService, ParsingInterface {
 
+    private final ISysConfigService configService;
+
     private List<ParsingDq> parsingDqs = new ArrayList<>();
 
     private final ForecastPowerShortTermStationService forecastPowerShortTermStationService;
@@ -70,10 +74,7 @@ public class ParsingDqServiceImpl extends ServiceImpl<ParsingDqMapper, ParsingDq
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileType(FileTypeEnum.dq.name());
         parsingResultDto.setFileName(file.getName());
-
         try {
-
-
             if (!this.parsingDqs.isEmpty()) {
                 ParsingDq parsingDqInfo = this.parsingDqs.get(0);
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
@@ -98,41 +99,49 @@ public class ParsingDqServiceImpl extends ServiceImpl<ParsingDqMapper, ParsingDq
                                     forecastPowerShortTermStationList.add(forecastPowerShortTermStation);
                                     time = new Date(time.getTime() + 900000L);//递增15分钟
                                 }
-
-                                List<BigDecimal> openCapacityList = parsingOpenCapacityValue(parsingDqInfo.getOpenCapacity(), fileContent);
-                                if (openCapacityList != null && openCapacityList.size() == fpValues.size()) {
-                                    for (int i = 0; i < forecastPowerShortTermStationList.size(); i++) {
-                                        forecastPowerShortTermStationList.get(i).setOpenCapacity(openCapacityList.get(i));
+                                int dqDay = 10;
+                                try {
+                                    dqDay = Integer.parseInt(configService.selectConfigByKey("require_dq_day"));
+                                } catch (Exception e){}
+                                if (forecastPowerShortTermStationList.size() == dqDay * 96) {
+                                    List<BigDecimal> openCapacityList = parsingOpenCapacityValue(parsingDqInfo.getOpenCapacity(), fileContent);
+                                    if (openCapacityList != null && openCapacityList.size() == fpValues.size()) {
+                                        for (int i = 0; i < forecastPowerShortTermStationList.size(); i++) {
+                                            forecastPowerShortTermStationList.get(i).setOpenCapacity(openCapacityList.get(i));
+                                        }
                                     }
+                                    forecastPowerShortTermStationService.remove(
+                                            new QueryWrapper<ForecastPowerShortTermStation>()
+                                                    .eq("gen_date", genDate)
+                                                    .eq("station_code", stationCode)
+                                                    .between("time", forecastPowerShortTermStationList.get(0).getTime(), forecastPowerShortTermStationList.get(forecastPowerShortTermStationList.size() - 1).getTime()));
+                                    forecastPowerShortTermStationService.saveBatch(forecastPowerShortTermStationList);
+                                    log.info("解析短期文件:{} 成功! O(∩_∩)O", file.getName());
+                                    parsingResultDto.setStatus("success");
+                                } else {
+                                    parsingResultDto.setMessage("解析短期文件数据量与要求不一致");
+                                    log.error("解析短期文件数据量与要求不一致,fileName:{}", file.getName());
                                 }
-
-                                forecastPowerShortTermStationService.saveBatch(forecastPowerShortTermStationList);
-                                log.info("解析短期文件:{} 成功! O(∩_∩)O", file.getName());
-                                parsingResultDto.setStatus("success");
                             } else {
                                 parsingResultDto.setMessage("解析短期文件时间错误");
-                                log.error("解析短期文件时间错误");
+                                log.error("解析短期文件时间错误,fileName:{}", file.getName());
                             }
                         } else {
                             parsingResultDto.setMessage("短期文件里日期不对");
-                            log.error("解析短期文件内时间错误");
+                            log.error("解析短期文件内时间错误,fileName:{}", file.getName());
                         }
-
                     } else {
                         parsingResultDto.setMessage("解析短期文件无数据");
-                        log.error("解析短期文件无数据");
+                        log.error("解析短期文件无数据,fileName:{}", file.getName());
                     }
-
                 }
-
-
             } else {
                 parsingResultDto.setMessage("短期暂无单行解析方式");
-                log.info("dq暂无单行解析方式");
+                log.info("短期暂无单行解析方式,fileName:{}", file.getName());
             }
         } catch (Exception e) {
             parsingResultDto.setMessage("解析短期数据失败!");
-            log.error("解析短期数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("解析短期数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }

+ 22 - 26
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFjServiceImpl.java

@@ -1,15 +1,13 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingFj;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
-import com.cpp.web.domain.station.InverterInfo;
-import com.cpp.web.domain.station.InverterStatusData;
-import com.cpp.web.domain.station.WindTurbineInfo;
-import com.cpp.web.domain.station.WindTurbineStatusData;
+import com.cpp.web.domain.station.*;
 import com.cpp.web.mapper.datafactory.ParsingFjMapper;
 import com.cpp.web.service.datafactory.ParsingFjService;
 import com.cpp.web.service.datafactory.ParsingInterface;
@@ -18,6 +16,7 @@ import com.cpp.web.service.station.WindTurbineStatusDataService;
 import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,7 +34,7 @@ import java.util.stream.Collectors;
  * @date 2022-05-11 18:07:03
  */
 @Service("fjParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingFjServiceImpl extends ServiceImpl<ParsingFjMapper, ParsingFj> implements ParsingFjService, ParsingInterface {
@@ -63,28 +62,23 @@ public class ParsingFjServiceImpl extends ServiceImpl<ParsingFjMapper, ParsingFj
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.fj.name());
-
         try {
-
             if (!this.parsingFjs.isEmpty()) {
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 ParsingFj parsingFjInfo = this.parsingFjs.get(0);
-
                 if (parsingFjInfo.getDataType().equals(ParsingFieldUtil.SINGLE)) {
                     List<String> fjNames = parsingNames(parsingFjInfo.getEquipmentName(), fileContent);
                     Date time = parsingTime(parsingFjInfo.getTime(), fileContent);
                     if (fjNames.size() > 0) {
-                        if (time != null){
+                        if (time != null) {
+                            List<WindTurbineStatusData> windTurbineStatusDataList = new ArrayList<>();
                             int number = Integer.parseInt(parsingFjInfo.getEquipmentName().split("-")[0]);
                             String replace1 = parsingFjInfo.getActivePower().split("<=>")[0] + "<=>";
                             List<WindTurbineInfo> windTurbineInfoList = windTurbineInfos.stream().filter(i -> i.getStationCode().equals(stationCode)).collect(Collectors.toList());
                             for (String fjName : fjNames) {
-
                                 List<WindTurbineInfo> filterWindTurbineInfos = windTurbineInfoList.stream().filter(i -> i.getName().equals(fjName)).collect(Collectors.toList());
-
                                 if (filterWindTurbineInfos.size() > 0) {
                                     Long eqId = filterWindTurbineInfos.get(0).getId();
-
                                     String replace2 = number + "<=>";
                                     WindTurbineStatusData windTurbineStatusData = new WindTurbineStatusData();
                                     windTurbineStatusData.setTime(time);
@@ -102,46 +96,48 @@ public class ParsingFjServiceImpl extends ServiceImpl<ParsingFjMapper, ParsingFj
                                     windTurbineStatusData.setWd(parsingValue(parsingFjInfo.getWd().replace(replace1, replace2), fileContent));
                                     windTurbineStatusData.setWs(parsingValue(parsingFjInfo.getWs().replace(replace1, replace2), fileContent));
                                     windTurbineStatusData.setT(parsingValue(parsingFjInfo.getT().replace(replace1, replace2), fileContent));
-
                                     windTurbineStatusData.setStatus(parsingStatus(parsingFjInfo.getStatus().replace(replace1, replace2), fileContent));
                                     windTurbineStatusData.setIsSample(parsingStatus(parsingFjInfo.getIsSample().replace(replace1, replace2), fileContent));
                                     windTurbineStatusData.setStationCode(stationCode);
-
-                                    windTurbineStatusDataService.save(windTurbineStatusData);
-                                    log.info("解析FJ文件:" + file.getName() + " 成功! O(∩_∩)O");
+                                    windTurbineStatusDataList.add(windTurbineStatusData);
                                     parsingResultDto.setStatus("success");
                                 } else {
                                     parsingResultDto.setStatus("0");
                                     parsingResultDto.setMessage("未找到对应风机:" + fjName);
-                                    log.error("未找到对应风机:{}", fjName);
+                                    log.error("[" + stationCode + "]未找到对应风机:{}", fjName);
                                     break;
                                 }
                                 number++;
                             }
-                        }else {
+                            if (windTurbineStatusDataList.size() > 0) {
+                                log.info("[" + stationCode + "]解析FJ文件:" + file.getName() + " 成功! O(∩_∩)O");
+                                windTurbineStatusDataService.remove(
+                                        new QueryWrapper<WindTurbineStatusData>()
+                                                .eq("time", time)
+                                                .eq("station_code", stationCode));
+                                windTurbineStatusDataService.saveBatch(windTurbineStatusDataList);
+                            }
+                        } else {
                             parsingResultDto.setStatus("0");
                             parsingResultDto.setMessage("解析风机数据时间失败:" + file.getName());
-                            log.error("解析风机数据时间失败:" + file.getName());
+                            log.error("[" + stationCode + "]解析风机数据时间失败,fileName:{}", file.getName());
                         }
-                    }else {
+                    } else {
                         parsingResultDto.setStatus("0");
                         parsingResultDto.setMessage("解析风机名称失败:" + file.getName());
-                        log.error("解析风机名称失败:" + file.getName());
+                        log.error("[" + stationCode + "]解析风机名称失败,fileName:{}", file.getName());
                     }
                 }
             } else {
                 parsingResultDto.setMessage("风机暂无多行解析方式");
-                log.error("fj暂无多行解析方式");
+                log.error("[" + stationCode + "]风机数据暂无多行解析方式,fileName:{}", file.getName());
             }
-
-
         } catch (Exception e) {
             parsingResultDto.setMessage("解析风机数据错误!");
-            log.error("解析风机数据错误", e);
+            log.error("[" + stationCode + "]解析风机数据错误,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
-
     }
 
     @Override

+ 19 - 14
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNbqServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
@@ -8,6 +9,7 @@ import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
 import com.cpp.web.domain.station.InverterInfo;
 import com.cpp.web.domain.station.InverterStatusData;
+import com.cpp.web.domain.station.WindTurbineStatusData;
 import com.cpp.web.mapper.datafactory.ParsingNbqMapper;
 import com.cpp.web.service.datafactory.ParsingInterface;
 import com.cpp.web.service.datafactory.ParsingNbqService;
@@ -16,6 +18,7 @@ import com.cpp.web.service.station.InverterStatusDataService;
 import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -36,7 +39,7 @@ import java.util.stream.Collectors;
  * @date 2022-05-11 18:07:03
  */
 @Service("nbqParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, ParsingNbq> implements ParsingNbqService, ParsingInterface {
@@ -64,9 +67,7 @@ public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, Parsing
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.nbq.name());
-
         try {
-
             //查询符合该场站的nbq配置信息
             if (!this.parsingNbqs.isEmpty()) {
                 ParsingNbq parsingNbqInfo = this.parsingNbqs.get(0);
@@ -84,6 +85,7 @@ public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, Parsing
                     Date time = parsingTime(parsingNbqInfo.getTime(), fileContent);
                     if (nbqNames.size() > 0) {
                         if (time != null) {
+                            List<InverterStatusData> inverterStatusDataList = new ArrayList<>();
                             int number = Integer.parseInt(parsingNbqInfo.getEquipmentName().split("-")[0]);
                             String replace1 = parsingNbqInfo.getActivePower().split("<=>")[0] + "<=>";
                             List<InverterInfo> inverterInfoList = inverterInfos.stream().filter(i -> i.getStationCode().equals(stationCode)).collect(Collectors.toList());
@@ -92,11 +94,9 @@ public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, Parsing
                                 List<InverterInfo> filterInverterInfos = inverterInfoList.stream().filter(i -> i.getName().equals(nbqName)).collect(Collectors.toList());
                                 if (filterInverterInfos.size() > 0) {
                                     Long eqId = filterInverterInfos.get(0).getId();
-
                                     String replace2 = number + "<=>";
                                     InverterStatusData inverterStatusData = new InverterStatusData();
                                     inverterStatusData.setTime(time);
-
                                     inverterStatusData.setActivePower(parsingValue(parsingNbqInfo.getActivePower().replace(replace1, replace2), fileContent));
                                     inverterStatusData.setCumulativeGeneratedEnergy(parsingValue(parsingNbqInfo.getCumulativeGeneratedEnergy().replace(replace1, replace2), fileContent));
                                     inverterStatusData.setDayGridConnectedHours(parsingValue(parsingNbqInfo.getDayGridConnectedHours().replace(replace1, replace2), fileContent));
@@ -109,40 +109,45 @@ public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, Parsing
                                     inverterStatusData.setIsSample(parsingStatus(parsingNbqInfo.getIsSample().replace(replace1, replace2), fileContent));
                                     inverterStatusData.setEquipmentId(eqId);
                                     inverterStatusData.setStationCode(stationCode);
-                                    inverterStatusDataService.save(inverterStatusData);
-                                    log.info("解析NBQ文件:{} 成功! O(∩_∩)O", file.getName());
+                                    inverterStatusDataList.add(inverterStatusData);
                                     parsingResultDto.setStatus("success");
                                 } else {
                                     parsingResultDto.setStatus("0");
                                     parsingResultDto.setMessage("未找到对应逆变器:" + nbqName);
-                                    log.error("未找到对应逆变器:{}", nbqName);
+                                    log.error("[" + stationCode + "]未找到对应逆变器:{}", nbqName);
                                     break;
                                 }
                                 number++;
                             }
+                            if (inverterStatusDataList.size() > 0) {
+                                log.info("解析NBQ文件:{} 成功! O(∩_∩)O", file.getName());
+                                inverterStatusDataService.remove(
+                                        new QueryWrapper<InverterStatusData>()
+                                                .eq("time", time)
+                                                .eq("station_code", stationCode));
+                                inverterStatusDataService.saveBatch(inverterStatusDataList);
+                            }
                         } else {
                             parsingResultDto.setStatus("0");
                             parsingResultDto.setMessage("解析逆变器数据时间失败:" + file.getName());
-                            log.error("解析逆变器数据时间失败:" + file.getName());
+                            log.error("[" + stationCode + "]解析逆变器数据时间失败,fileName:{}", file.getName());
                         }
                     } else {
                         parsingResultDto.setStatus("0");
                         parsingResultDto.setMessage("解析逆变器名称失败:" + file.getName());
-                        log.error("解析逆变器名称失败:" + file.getName());
+                        log.error("[" + stationCode + "]解析逆变器名称失败,fileName:{}", file.getName());
                     }
                 } else {
                     parsingResultDto.setMessage("逆变器暂无多行解析方式");
-                    log.error("nbq暂无多行解析方式");
+                    log.error("[" + stationCode + "]逆变器数据暂无多行解析方式,fileName:{}", file.getName());
                 }
-
             }
         } catch (Exception e) {
             parsingResultDto.setMessage("解析逆变器数据失败!");
-            log.error("解析逆变器数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析逆变器数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
-
     }
 
     @Override

+ 13 - 17
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNwpServiceImpl.java

@@ -1,11 +1,13 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingNwp;
 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.station.ForecastPowerShortTermStation;
 import com.cpp.web.domain.station.NwpStation;
 import com.cpp.web.mapper.datafactory.ParsingNwpMapper;
 import com.cpp.web.service.datafactory.ParsingInterface;
@@ -16,6 +18,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +36,7 @@ import java.util.List;
  * @date 2022-05-11 18:07:03
  */
 @Service("nwpParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingNwpServiceImpl extends ServiceImpl<ParsingNwpMapper, ParsingNwp> implements ParsingNwpService, ParsingInterface {
@@ -54,13 +57,10 @@ public class ParsingNwpServiceImpl extends ServiceImpl<ParsingNwpMapper, Parsing
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.nwp.name());
-
         try {
-
             if (!this.parsingNwps.isEmpty()) {
                 ParsingNwp parsingNwpInfo = this.parsingNwps.get(0);
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
@@ -91,7 +91,6 @@ public class ParsingNwpServiceImpl extends ServiceImpl<ParsingNwpMapper, Parsing
 //                        List<BigDecimal> senfs = parsingNwpValue(parsingNwpInfo.getSenf(), fileContent);
 //                        List<BigDecimal> swrs = parsingNwpValue(parsingNwpInfo.getSwr(), fileContent);
                         List<BigDecimal> ts = parsingNwpValue(parsingNwpInfo.getT(), fileContent);
-
                         List<NwpStation> nwpStationList = new ArrayList<>();
                         //以十米风速为基准
                         for (int i = 0; i < ws10s.size(); i++) {
@@ -122,35 +121,32 @@ public class ParsingNwpServiceImpl extends ServiceImpl<ParsingNwpMapper, Parsing
                             nwpStation.setWs100(valueSet(ws100s, i));
                             nwpStation.setWd100(valueSet(wd100s, i));
                             nwpStation.setStationCode(stationCode);
-
                             nwpStationList.add(nwpStation);
-
                             time = new Date(time.getTime() + 900000L);
                         }
-
+                        nwpStationService.remove(
+                                new QueryWrapper<NwpStation>()
+                                        .eq("gen_date", genDate)
+                                        .eq("station_code", stationCode)
+                                        .between("time", nwpStationList.get(0).getTime(), nwpStationList.get(nwpStationList.size() - 1).getTime()));
                         nwpStationService.saveBatch(nwpStationList);
-
                         parsingResultDto.setStatus("success");
-                        log.info("解析Nwp文件:{} 成功! O(∩_∩)O", file.getName());
+                        log.info("[" + stationCode + "]解析Nwp文件:{} 成功! O(∩_∩)O", file.getName());
                     } else {
                         parsingResultDto.setMessage("解析Nwp文件时间错误");
-                        log.error("解析Nwp文件时间错误");
+                        log.error("[" + stationCode + "]解析Nwp文件时间错误,fileName:{}", file.getName());
                     }
                 } else {
                     parsingResultDto.setMessage("Nwp暂无单行解析方式");
-                    log.error("nwp暂无单行解析方式");
+                    log.error("[" + stationCode + "]nwp暂无单行解析方式,fileName:{}", file.getName());
                 }
             }
-
-
         } catch (Exception e) {
             parsingResultDto.setMessage("解析Nwp数据失败");
-            log.error("解析Nwp数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析Nwp数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
-
-
     }
 
     @Override

+ 13 - 9
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingQxzServiceImpl.java

@@ -1,10 +1,12 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingQxz;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.domain.station.InverterStatusData;
 import com.cpp.web.domain.station.WeatherStationStatusData;
 import com.cpp.web.mapper.datafactory.ParsingQxzMapper;
 import com.cpp.web.service.datafactory.DataStore;
@@ -15,6 +17,7 @@ import com.cpp.web.service.station.WeatherStationStatusDataService;
 import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,7 +37,7 @@ import java.util.stream.Collectors;
  */
 @Service("qxzParsing")
 @Slf4j
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Transactional
 public class ParsingQxzServiceImpl extends ServiceImpl<ParsingQxzMapper, ParsingQxz> implements ParsingQxzService, ParsingInterface {
 
@@ -54,14 +57,12 @@ public class ParsingQxzServiceImpl extends ServiceImpl<ParsingQxzMapper, Parsing
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.qxz.name());
         try {
             if (!this.parsingQxzs.isEmpty()) {
                 ParsingQxz parsingQxzInfo = this.parsingQxzs.get(0);
-
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 //判断文件名是否符合配置
                 if (parsingQxzInfo.getDataType().equals(ParsingFieldUtil.SINGLE)) {
@@ -80,25 +81,28 @@ public class ParsingQxzServiceImpl extends ServiceImpl<ParsingQxzMapper, Parsing
                         w.setWs(parsingValue(parsingQxzInfo.getWs(), fileContent));
                         w.setStationCode(stationCode);
                         DataStore.getInstance().setData(Arrays.asList(w), stationCode);
+                        weatherStationStatusDataService.remove(
+                                new QueryWrapper<WeatherStationStatusData>()
+                                        .eq("time", time)
+                                        .eq("station_code", stationCode));
                         weatherStationStatusDataService.save(w);
                         parsingResultDto.setStatus("success");
-                        log.info("解析QXZ文件:{} 成功! O(∩_∩)O", file.getName());
+                        log.info("[" + stationCode + "]解析气象站文件:{} 成功! O(∩_∩)O", file.getName());
                     } else {
                         parsingResultDto.setMessage("解析气象站文件时间错误");
-                        log.error("解析QXZ文件时间错误");
+                        log.error("[" + stationCode + "]解析气象站文件时间错误,fileName:{}", file.getName());
                     }
                 } else {
                     parsingResultDto.setMessage("气象站暂无多行解析方式");
-                    log.error("qxz暂无多行解析方式");
+                    log.error("[" + stationCode + "]气象站暂无多行解析方式,fileName:{}", file.getName());
                 }
             } else {
                 parsingResultDto.setMessage("气象站未配置作为解析使用设备");
-                log.error("qxz未配置作为解析使用设备");
+                log.error("[" + stationCode + "]气象站未配置作为解析使用设备,fileName:{}", file.getName());
             }
-
         } catch (Exception e) {
             parsingResultDto.setMessage("解析气象站数据失败!");
-            log.error("解析气象站数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析气象站数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }

+ 48 - 42
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRcdqServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingCdq;
@@ -21,6 +22,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,7 +42,7 @@ import java.util.stream.Collectors;
  * @date 2022-05-11 18:07:03
  */
 @Service("rcdqParsing")
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Slf4j
 @Transactional
 public class ParsingRcdqServiceImpl implements ParsingInterface {
@@ -64,21 +66,18 @@ public class ParsingRcdqServiceImpl implements ParsingInterface {
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.cdq.name());
-
         try {
             List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulationList = new ArrayList();
-
             if (!this.parsingCdqs.isEmpty()) {
                 ParsingCdq parsingCdq = this.parsingCdqs.get(0);
-
                 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 genTime = new Date(forecastTime.getTime() - 900000L);
+                    String status = parsingUploadStatus("2<=>5<=>status=", fileContent);
                     Date time = forecastTime;
                     if (forecastTime != null) {//解析时间成功才可以进行以下操作
                         if (parsingCdq.getFpValue() != null) {
@@ -88,6 +87,7 @@ public class ParsingRcdqServiceImpl implements ParsingInterface {
                                 for (BigDecimal fpValue : fpValues) {
                                     ForecastPowerUltraShortTermRegulation forecastPowerUltraShortTermRegulation = new ForecastPowerUltraShortTermRegulation();
                                     forecastPowerUltraShortTermRegulation.setStationCode(stationCode);
+                                    forecastPowerUltraShortTermRegulation.setGenTime(genTime);
                                     forecastPowerUltraShortTermRegulation.setFpValue(fpValue);
                                     forecastPowerUltraShortTermRegulation.setTime(time);
                                     forecastPowerUltraShortTermRegulation.setForecastHowLongAgo(calcHowLongAgo(forecastTime, time));
@@ -95,32 +95,46 @@ public class ParsingRcdqServiceImpl implements ParsingInterface {
                                     forecastPowerUltraShortTermRegulationList.add(forecastPowerUltraShortTermRegulation);
                                     time = new Date(time.getTime() + 900000L);//递增15分钟
                                 }
-                                scheduleAddCache(forecastPowerUltraShortTermRegulationList, stationCode);
-                                forecastPowerUltraShortTermRegulationService.saveBatch(forecastPowerUltraShortTermRegulationList);
-                                log.info("解析 调控后CDQ文件:{} 成功! O(∩_∩)O", file.getName());
-                                parsingResultDto.setStatus("success");
+                                int cdqPoint = 16;
+                                try {
+                                    cdqPoint = Integer.parseInt(configService.selectConfigByKey("require_cdq_point"));
+                                } catch (Exception e) {
+                                }
+                                if (forecastPowerUltraShortTermRegulationList.size() == cdqPoint) {
+                                    scheduleAddCache(forecastPowerUltraShortTermRegulationList, stationCode);
+                                    forecastPowerUltraShortTermRegulationService.remove(
+                                            new QueryWrapper<ForecastPowerUltraShortTermRegulation>()
+                                                    .eq("gen_time", genTime)
+                                                    .eq("station_code", stationCode)
+                                                    .between("time", forecastPowerUltraShortTermRegulationList.get(0).getTime(), forecastPowerUltraShortTermRegulationList.get(forecastPowerUltraShortTermRegulationList.size() - 1).getTime()));
+                                    forecastPowerUltraShortTermRegulationService.saveBatch(forecastPowerUltraShortTermRegulationList);
+                                    log.info("[" + stationCode + "]解析调控后超短期文件:{} 成功! O(∩_∩)O", file.getName());
+                                    parsingResultDto.setStatus("success");
+                                } else {
+                                    parsingResultDto.setMessage("解析调控后超短期文件数据量与要求不一致");
+                                    log.error("[" + stationCode + "]解析调控后超短期文件数据量与要求不一致,fileName:{}", file.getName());
+                                }
                             } else {
                                 parsingResultDto.setMessage("解析超短期文件时间错误");
-                                log.error("解析 调控后CDQ文件时间错误");
+                                log.error("[" + stationCode + "]解析调控后超短期文件时间错误,fileName:{}", file.getName());
                             }
                         } else {
                             parsingResultDto.setMessage("调控后超短期文件中时间无法解析");
-                            log.error("调控后cdq文件里日期不对");
+                            log.error("[" + stationCode + "]调控后超短期文件里日期不对,fileName:{}", file.getName());
                         }
-
                     } else {
-                        parsingResultDto.setMessage("解析 调控后超短期文件无数据");
-                        log.error("解析 调控后超短期文件无数据");
+                        parsingResultDto.setMessage("解析调控后超短期文件无数据");
+                        log.error("[" + stationCode + "]解析调控后超短期文件无数据,fileName:{}", file.getName());
                     }
                 } else {
                     parsingResultDto.setMessage("调控后超短期暂无单行解析方式");
-                    log.error(" 调控后cdq暂无单行解析方式");
+                    log.error("[" + stationCode + "]调控后超短期暂无单行解析方式,fileName:{}", file.getName());
                 }
             }
 
         } catch (Exception e) {
-            parsingResultDto.setMessage("解析 调控后超短期数据失败!");
-            log.error("解析 调控后超短期数据失败! /(ㄒoㄒ)/~~", e);
+            parsingResultDto.setMessage("解析调控后超短期数据失败!");
+            log.error("[" + stationCode + "]解析调控后超短期数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
@@ -218,32 +232,24 @@ public class ParsingRcdqServiceImpl implements ParsingInterface {
     }
 
 
-    private final ScheduledHelper scheduledHelper = new ScheduledHelper();
+//    private final ScheduledHelper scheduledHelper = new ScheduledHelper();
 
     public void scheduleAddCache(List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulationList, String stationCode) {
-
-        int ago = 1;
-        try {
-            String cdqHowLongAgo = configService.selectConfigByKey("cdqHowLongAgo");
-            ago = Integer.parseInt(cdqHowLongAgo);
-        } catch (Exception e) {
-
-        }
-
-        Date date = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
-
-        Date startTime = new Date(date.getTime() + ago * 15 * 60000L);
-        //未来四小时
-        Date endTime = new Date(startTime.getTime() + 4 * 60 * 60000L);
-
-        List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulations = forecastPowerUltraShortTermRegulationList.stream().filter(f -> f.getTime().getTime() >= startTime.getTime() && f.getTime().getTime() < endTime.getTime()).collect(Collectors.toList());
-        if (forecastPowerUltraShortTermRegulations.size() >= 16 - ago) {
-            scheduledHelper.scheduleTaskAtFixedDate(startTime, new Runnable() {
-                @Override
-                public void run() {
-                    DataStore.getInstance().setData(forecastPowerUltraShortTermRegulationList, stationCode);
-                }
-            });
+        if (forecastPowerUltraShortTermRegulationList.get(0).getGenTime().equals(DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis()))) {
+            int ago = 1;
+            try {
+                String cdqHowLongAgo = configService.selectConfigByKey("cdqHowLongAgo");
+                ago = Integer.parseInt(cdqHowLongAgo);
+            } catch (Exception e) {
+            }
+            Date date = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
+            Date startTime = new Date(date.getTime() + ago * 15 * 60000L);
+            //未来四小时
+            Date endTime = new Date(startTime.getTime() + 15 * 60000L);
+            List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulations = forecastPowerUltraShortTermRegulationList.stream().filter(f -> f.getTime().getTime() >= startTime.getTime() && f.getTime().getTime() < endTime.getTime()).collect(Collectors.toList());
+            if (forecastPowerUltraShortTermRegulations.size() > 0) {
+                DataStore.getInstance().setData(forecastPowerUltraShortTermRegulations, stationCode);
+            }
         }
     }
 }

+ 57 - 56
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRdqServiceImpl.java

@@ -26,6 +26,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
@@ -51,7 +52,7 @@ import java.util.stream.Collectors;
  */
 @Service("rdqParsing")
 @Slf4j
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Transactional
 public class ParsingRdqServiceImpl implements ParsingInterface {
     private final ISysConfigService configService;
@@ -87,15 +88,14 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileType(FileTypeEnum.dq.name());
         parsingResultDto.setFileName(file.getName());
-
         try {
             List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList = new ArrayList();
-
             if (!this.parsingDqs.isEmpty()) {
                 ParsingDq parsingDqInfo = this.parsingDqs.get(0);
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 if (parsingDqInfo.getDataType().equals(ParsingFieldUtil.MULTI)) {//多行操作
                     Date forecastTime = parsingForecastTime(parsingDqInfo.getForecastTime(), fileContent);
+                    Date genDate = DateTimeUtil.getDayStartTime(forecastTime.getTime() - 86400000L);
                     String status = parsingUploadStatus("2<=>5<=>status=", fileContent);
                     Date time = forecastTime;
                     if (forecastTime != null) {//解析时间成功才可以进行以下操作
@@ -107,56 +107,66 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
                                     ForecastPowerShortTermRegulation forecastPowerShortTermRegulation = new ForecastPowerShortTermRegulation();
                                     forecastPowerShortTermRegulation.setStationCode(stationCode);
                                     forecastPowerShortTermRegulation.setFpValue(fpValue);
+                                    forecastPowerShortTermRegulation.setGenDate(genDate);
                                     forecastPowerShortTermRegulation.setTime(time);
                                     forecastPowerShortTermRegulation.setForecastHowLongAgo(calcHowLongAgo(forecastTime, time));
                                     forecastPowerShortTermRegulation.setCapacity(capacity);
                                     forecastPowerShortTermRegulationList.add(forecastPowerShortTermRegulation);
                                     time = new Date(time.getTime() + 900000L);//递增15分钟
                                 }
-
-                                List<BigDecimal> openCapacityList = parsingOpenCapacityValue(parsingDqInfo.getOpenCapacity(), fileContent);
-                                if (openCapacityList != null && openCapacityList.size() == fpValues.size()) {
-                                    for (int i = 0; i < forecastPowerShortTermRegulationList.size(); i++) {
-                                        forecastPowerShortTermRegulationList.get(i).setOpenCapacity(openCapacityList.get(i));
-                                    }
+                                int dqDay = 10;
+                                try {
+                                    dqDay = Integer.parseInt(configService.selectConfigByKey("require_dq_day"));
+                                } catch (Exception e) {
                                 }
-
-                                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);
+                                if (forecastPowerShortTermRegulationList.size() == dqDay * 96) {
+                                    List<BigDecimal> openCapacityList = parsingOpenCapacityValue(parsingDqInfo.getOpenCapacity(), fileContent);
+                                    if (openCapacityList != null && openCapacityList.size() == fpValues.size()) {
+                                        for (int i = 0; i < forecastPowerShortTermRegulationList.size(); i++) {
+                                            forecastPowerShortTermRegulationList.get(i).setOpenCapacity(openCapacityList.get(i));
+                                        }
                                     }
-                                });
-
+                                    scheduleAddCache(forecastPowerShortTermRegulationList, stationCode);
+                                    forecastPowerShortTermRegulationService.remove(
+                                            new QueryWrapper<ForecastPowerShortTermRegulation>()
+                                                    .eq("gen_date", genDate)
+                                                    .eq("station_code", stationCode)
+                                                    .between("time", forecastPowerShortTermRegulationList.get(0).getTime(), forecastPowerShortTermRegulationList.get(forecastPowerShortTermRegulationList.size() - 1).getTime()));
+
+                                    forecastPowerShortTermRegulationService.saveBatch(forecastPowerShortTermRegulationList);
+                                    log.info("[" + stationCode + "]解析调控后短期文件:{} 成功! 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("[" + stationCode + "]解析调控后短期文件数据量与要求不一致,fileName:{}", file.getName());
+                                }
                             } else {
-                                parsingResultDto.setMessage("解析 调控后短期文件时间错误");
-                                log.error("解析  调控后DQ文件时间错误");
+                                parsingResultDto.setMessage("解析调控后短期文件时间错误");
+                                log.error("[" + stationCode + "]解析调控后短期文件时间错误,fileName:{}", file.getName());
                             }
                         } else {
                             parsingResultDto.setMessage("调控后短期文件里日期不对");
-                            log.error("调控后dq文件里日期不对");
+                            log.error("[" + stationCode + "]调控后短期文件里日期不对,fileName:{}", file.getName());
                         }
-
                     } else {
                         parsingResultDto.setMessage("解析 调控后短期文件无数据");
-                        log.error("解析 调控后短期文件无数据");
+                        log.error("[" + stationCode + "]解析调控后短期文件无数据,fileName:{}", file.getName());
                     }
-
-
                 } else {
                     parsingResultDto.setMessage("调控后短期暂无单行解析方式");
-                    log.info("调控后dq暂无单行解析方式");
+                    log.info("[" + stationCode + "]调控后短期暂无单行解析方式,fileName:{}", file.getName());
                 }
             }
         } catch (Exception e) {
-            parsingResultDto.setMessage("解析 调控后短期数据失败!");
-            log.error("解析 调控后短期数据失败! /(ㄒoㄒ)/~~", e);
+            parsingResultDto.setMessage("解析调控后短期数据失败!");
+            log.error("[" + stationCode + "]解析调控后短期数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
@@ -323,33 +333,24 @@ public class ParsingRdqServiceImpl implements ParsingInterface {
     }
 
 
-    private final ScheduledHelper scheduledHelper = new ScheduledHelper();
+//    private final ScheduledHelper scheduledHelper = new ScheduledHelper();
 
     public void scheduleAddCache
             (List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList, String stationCode) {
-
-        int ago = 1;
-        try {
-            String dqHowLongAgo = configService.selectConfigByKey("dqHowLongAgo");
-            ago = Integer.parseInt(dqHowLongAgo);
-        } catch (Exception e) {
-
-        }
-
-        Long dAdd = System.currentTimeMillis() + ago * 86400000L;
-        Date startTime = DateTimeUtil.getDayStartTime(dAdd);
-        Date endTime = DateTimeUtil.getDayLastTime(dAdd);
-
-
-        List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulations = forecastPowerShortTermRegulationList.stream().filter(f -> f.getTime().getTime() >= startTime.getTime() && f.getTime().getTime() < endTime.getTime()).collect(Collectors.toList());
-        if (forecastPowerShortTermRegulations.size() >= 96) {
-            scheduledHelper.scheduleTaskAtFixedDate(startTime, new Runnable() {
-                @Override
-                public void run() {
-                    DataStore.getInstance().setData(forecastPowerShortTermRegulationList, stationCode);
-                }
-            });
+        if (forecastPowerShortTermRegulationList.get(0).getGenDate().equals(DateTimeUtil.getDayStartTime(System.currentTimeMillis()))) {
+            int ago = 1;
+            try {
+                String dqHowLongAgo = configService.selectConfigByKey("dqHowLongAgo");
+                ago = Integer.parseInt(dqHowLongAgo);
+            } catch (Exception e) {
+            }
+            Long dAdd = System.currentTimeMillis() + ago * 86400000L;
+            Date startTime = DateTimeUtil.getDayStartTime(dAdd);
+            Date endTime = DateTimeUtil.getDayLastTime(dAdd);
+            List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulations = forecastPowerShortTermRegulationList.stream().filter(f -> f.getTime().getTime() >= startTime.getTime() && f.getTime().getTime() < endTime.getTime()).collect(Collectors.toList());
+            if (forecastPowerShortTermRegulations.size() >= 96) {
+                DataStore.getInstance().setData(forecastPowerShortTermRegulations, stationCode);
+            }
         }
-
     }
 }

+ 13 - 14
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRpServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cpp.web.service.datafactory.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.ParsingRp;
@@ -7,6 +8,7 @@ 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.station.PowerStationStatusData;
+import com.cpp.web.domain.station.WindTurbineStatusData;
 import com.cpp.web.mapper.datafactory.ParsingRpMapper;
 import com.cpp.web.service.datafactory.DataStore;
 import com.cpp.web.service.datafactory.ParsingInterface;
@@ -16,6 +18,7 @@ import com.cpp.web.utils.ParsingFieldUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import com.cpp.web.utils.ParsingUtil;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,7 +38,7 @@ import java.util.List;
  */
 @Service("rpParsing")
 @Slf4j
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Transactional
 public class ParsingRpServiceImpl extends ServiceImpl<ParsingRpMapper, ParsingRp> implements ParsingRpService, ParsingInterface {
 
@@ -59,18 +62,13 @@ public class ParsingRpServiceImpl extends ServiceImpl<ParsingRpMapper, ParsingRp
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.rp.name());
-
         try {
             if (!this.parsingRps.isEmpty()) {
                 ParsingRp parsingRpInfo = this.parsingRps.get(0);
-
                 List<String> fileContent = ParsingFileUtil.getFileContent(file);
                 if (parsingRpInfo.getDataType().equals(ParsingFieldUtil.SINGLE)) {
-
                     Date time = parsingForecastTime(parsingRpInfo.getTime(), fileContent);
-
                     if (time != null) {
-
                         PowerStationStatusData powerStationStatusData = new PowerStationStatusData();
                         powerStationStatusData.setStationCode(stationCode);
                         powerStationStatusData.setTheoryValue(parsingValue(parsingRpInfo.getTheoryValue(), fileContent));
@@ -83,25 +81,26 @@ public class ParsingRpServiceImpl extends ServiceImpl<ParsingRpMapper, ParsingRp
                         powerStationStatusData.setBlockedCapacity(parsingValue(parsingRpInfo.getBlockedCapacity(), fileContent));
                         powerStationStatusData.setPowerRationing(parsingStatus(parsingRpInfo.getPowerRationing(), fileContent));
                         powerStationStatusData.setTime(time);
-
-                        DataStore.getInstance().setData(Arrays.asList(powerStationStatusData),stationCode);
+                        DataStore.getInstance().setData(Arrays.asList(powerStationStatusData), stationCode);
+                        powerStationStatusDataService.remove(
+                                new QueryWrapper<PowerStationStatusData>()
+                                        .eq("time", time)
+                                        .eq("station_code", stationCode));
                         powerStationStatusDataService.save(powerStationStatusData);
-
-                        log.info("解析RP文件:{} 成功! O(∩_∩)O", file.getName());
+                        log.info("[" + stationCode + "]解析实测功率文件:{} 成功! O(∩_∩)O", file.getName());
                         parsingResultDto.setStatus("success");
                     } else {
                         parsingResultDto.setMessage("解析实际功率文件时间错误");
-                        log.error("解析RP文件时间错误");
+                        log.error("[" + stationCode + "]解析实测功率文件时间错误,fileName:{}", file.getName());
                     }
                 } else {
                     parsingResultDto.setMessage("实际功率暂无单行解析方式");
-                    log.error("RP暂无单行解析方式");
+                    log.error("[" + stationCode + "]实测功率暂无单行解析方式,fileName:{}", file.getName());
                 }
-
             }
         } catch (Exception e) {
             parsingResultDto.setMessage("解析实际功率数据失败!");
-            log.error("解析实际功率数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析实实测功率数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }

+ 6 - 15
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingStatusServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cpp.web.service.datafactory.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.cpp.common.utils.spring.SpringUtils;
 import com.cpp.web.domain.datafactory.BaseParsing;
 import com.cpp.web.domain.datafactory.dto.ParsingResultDto;
 import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
@@ -13,6 +14,7 @@ import com.cpp.web.utils.LogUtil;
 import com.cpp.web.utils.ParsingFileUtil;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -31,12 +33,10 @@ import java.util.List;
  */
 @Service("statusParsing")
 @Slf4j
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Transactional
 public class ParsingStatusServiceImpl implements ParsingInterface {
 
-    private final OverhaulPlanService overhaulPlanService;
-
     @Override
     public boolean save(BaseParsing parsingInfo) {
         return true;
@@ -50,21 +50,18 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
 
     @Override
     public ParsingResultDto parsing(File file, String stationCode) {
-
         ParsingResultDto parsingResultDto = new ParsingResultDto();
         parsingResultDto.setFileName(file.getName());
         parsingResultDto.setFileType(FileTypeEnum.status.name());
         try {
-
             String json = ParsingFileUtil.getStr(file);
             StationStatusDto stationStatusDto = JSONUtil.parse(json).toBean(StationStatusDto.class);
             stationStatusDto.generateAbnormalAlarm(stationCode);
-
-            log.info("解析RP文件:{} 成功! O(∩_∩)O", file.getName());
+            log.info("[" + stationCode + "]解析状态文件:{} 成功! O(∩_∩)O", file.getName());
             parsingResultDto.setStatus("success");
         } catch (Exception e) {
             parsingResultDto.setMessage("解析站端状态数据失败!");
-            log.error("解析站端状态数据失败! /(ㄒoㄒ)/~~", e);
+            log.error("[" + stationCode + "]解析站端状态数据失败! /(ㄒoㄒ)/~~,fileName:{}", file.getName(), e);
         } finally {
             return parsingResultDto;
         }
@@ -89,20 +86,16 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
          * @return
          */
         private void generateAbnormalAlarm(String stationCode) {
-
             if (this.channelErrors != null) {
                 for (ChannelError channelError : this.channelErrors) {
                     LogUtil.info(DataSourcesEnum.E1, AlarmEnum.E1, channelError.getMsg(), stationCode);
                 }
             }
-
-
             if (this.uploadFiles != null) {
                 for (UploadFile uploadFile : this.uploadFiles) {
                     LogUtil.info(DataSourcesEnum.E1, AlarmEnum.E2, LogUtil.format("站端[{}]类型文件:【{}】未上报!", uploadFile.getType(), uploadFile.getName()), stationCode);
                 }
             }
-
             if (this.hardDiskCapacity != null) {
                 if (this.hardDiskCapacity.compareTo(new BigDecimal(95)) > -1) {
                     LogUtil.info(DataSourcesEnum.E1, AlarmEnum.E3, LogUtil.format("站端磁盘空间达到 {}%,请关注!", this.hardDiskCapacity), stationCode);
@@ -120,10 +113,8 @@ public class ParsingStatusServiceImpl implements ParsingInterface {
                     overhaulPlan.setName(restrictedPlan.getPlanName());
                     overhaulPlans.add(overhaulPlan);
                 }
-
-                overhaulPlanService.saveBatch(overhaulPlans);
+                SpringUtils.getBean(OverhaulPlanService.class).saveBatch(overhaulPlans);
             }
-
         }
     }
 

+ 0 - 1
cpp-system/src/main/java/com/cpp/system/service/ISysConfigService.java

@@ -25,7 +25,6 @@ public interface ISysConfigService
      * @return 参数键值
      */
     public String selectConfigByKey(String configKey);
-
     /**
      * 获取验证码开关
      *

+ 4 - 4
cpp-ui/src/views/largeScreen/index.vue

@@ -364,10 +364,10 @@ export default {
         name: '实际功率',
         num: '0'
       }, {
-        name: '理论功率',
+        name: '可用功率',
         num: '0'
       }, {
-        name: '可用功率',
+        name: '理论功率',
         num: '0'
       }, {
         name: '超短期预测功率',
@@ -493,8 +493,8 @@ export default {
         // 顶部统计值
         let sumMap = response.data.sumMap
         this.digitalDisk[0].num = this.formatNumber(sumMap.realSum) + ''
-        this.digitalDisk[1].num = this.formatNumber(sumMap.theorySum) + ''
-        this.digitalDisk[2].num = this.formatNumber(sumMap.ableSum) + ''
+        this.digitalDisk[1].num = this.formatNumber(sumMap.ableSum) + ''
+        this.digitalDisk[2].num = this.formatNumber(sumMap.theorySum) + ''
         this.digitalDisk[3].num = this.formatNumber(sumMap.cdqSum) + ''
         this.digitalDisk[4].num = this.formatNumber(sumMap.dqSum) + ''
         // 曲线图