Browse Source

一体化外网程序适配:
源丰分为一二期,外网程序需解析回传2套文件

zhangchenglong 1 year ago
parent
commit
13fb9e9f17
35 changed files with 811 additions and 697 deletions
  1. 8 2
      in-client-qn/pom.xml
  2. 1 1
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/constant/CommonStant.java
  3. 0 1
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BackStatData.java
  4. 5 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BaseBackTime.java
  5. 5 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BaseCorrectTime.java
  6. 5 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/CorrforeSt.java
  7. 38 3
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/Record.java
  8. 1 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/inenum/QNHLEnum.java
  9. 8 20
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackFileAnalysisJob.java
  10. 3 18
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackForeDataJob.java
  11. 2 19
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackStatDataJob.java
  12. 6 2
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/ComPermissonJob.java
  13. 2 22
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrectUsJob.java
  14. 28 11
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrforeDataJob.java
  15. 26 10
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrforeFileJob.java
  16. 28 6
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/RepairPlanJob.java
  17. 9 6
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/permisson/com/ComPermisson.java
  18. 1 1
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/BackForeForecastDataService.java
  19. 1 1
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/BackForeUsForecastDataService.java
  20. 10 5
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/RecordService.java
  21. 6 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/StationService.java
  22. 98 89
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataAnalysisService.java
  23. 44 81
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataGenBodyService.java
  24. 0 10
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataGenService.java
  25. 235 292
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/CorrforeService.java
  26. 13 3
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/InitRunner.java
  27. 150 80
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/RequestDataService.java
  28. 8 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/BackForeForecastDataServiceImpl.java
  29. 8 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/BackForeUsForecastDataServiceImpl.java
  30. 20 1
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/RecordServiceImpl.java
  31. 16 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/StationServiceImpl.java
  32. 0 3
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/DateTimeUtils.java
  33. 1 10
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/RequestUtils.java
  34. 24 0
      in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/SystermUtils.java
  35. 1 0
      in-client-qn/src/main/resources/vms/DQ.vm

+ 8 - 2
in-client-qn/pom.xml

@@ -115,11 +115,11 @@
             <version>2.7.2</version>
         </dependency>
 
-      <!--  <dependency>
+      <dependency>
             <groupId>com.mchange</groupId>
             <artifactId>c3p0</artifactId>
             <version>0.9.5.4</version>
-        </dependency>-->
+        </dependency>
 
         <dependency>
             <groupId>org.apache.velocity</groupId>
@@ -134,6 +134,12 @@
             <artifactId>in-common-minio</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+            <scope>test</scope>
+        </dependency>
 
 
     </dependencies>

+ 1 - 1
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/constant/CommonStant.java

@@ -27,7 +27,7 @@ public interface CommonStant {
 
 
     /**
-     * 日志类型:下拉修正数据
+     * 日志类型:下拉修正数据(嘉越修正)
      */
     String RECORD_TYPE_PULL_CORRECT_JY = "PULL_CORRECT_JY";
 

+ 0 - 1
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BackStatData.java

@@ -111,7 +111,6 @@ public class BackStatData extends  BaseBackTime {
      */
     BigDecimal reportStateForecast;
 
-
     /**
      * 上报状态回传 超短期上报状态   0未上报;1上报
      */

+ 5 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BaseBackTime.java

@@ -37,4 +37,9 @@ public class BaseBackTime {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     LocalDateTime backTime;
+
+    /**
+     * 场站编码
+     */
+    String stationCode;
 }

+ 5 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/BaseCorrectTime.java

@@ -36,4 +36,9 @@ public class BaseCorrectTime {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     LocalDateTime passTime;
+
+    /**
+     * 场站编码
+     */
+    String stationCode;
 }

+ 5 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/CorrforeSt.java

@@ -90,4 +90,9 @@ public class CorrforeSt implements Serializable {
     @TableField( exist = false)
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Long endTime;
+
+    /**
+     * 场站编码
+     */
+    String stationCode;
 }

+ 38 - 3
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/entity/Record.java

@@ -51,14 +51,49 @@ public class Record {
      *状态 描述
      */
     private String stateContent;
-
-
+    /**
+     * 开始时间
+     */
     @TableField( exist = false)
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startTime;
-
+    /**
+     * 结束时间
+     */
     @TableField( exist = false)
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
+    /**
+     * 场站编码
+     */
+    String stationCode;
+
+    /**
+     * 无参构造函数
+     */
+    public Record(){
+
+    }
+
+    /**
+     * 初始化Record
+     * @param type
+     * @param content
+     * @param time
+     * @param createTime
+     * @param state
+     * @param stateContent
+     * @param stationCode
+     */
+    public Record(String type,String content,LocalDateTime time,LocalDateTime createTime,String state,String stateContent,String stationCode){
+        this.type = type;
+        this.content = content;
+        this.time = time;
+        this.createTime = createTime;
+        this.state = state;
+        this.stateContent = stateContent;
+        this.stationCode = stationCode;
+    }
+
 }

+ 1 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/inenum/QNHLEnum.java

@@ -9,6 +9,7 @@ package com.jiayue.insu.inclientqn.inenum;
 public enum QNHLEnum {
 
     REQUEST_SUCCESS("T200","success","请求成功"),
+    REQUEST_FAIL("T000","fail","请求失败"),
 
     PERMISSON_TOKEN_EXPIRE("I101","TOKEN_EXPIRE","token已过期"),
     PERMISSON_TOKEN_INVALID("I102","TOKEN_INVALID","无效token"),

+ 8 - 20
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackFileAnalysisJob.java

@@ -1,12 +1,6 @@
 package com.jiayue.insu.inclientqn.job;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import com.jiayue.insu.inclientqn.constant.CommonStant;
-import com.jiayue.insu.inclientqn.entity.Record;
-import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
-import com.jiayue.insu.inclientqn.inenum.StatusEnum;
-import com.jiayue.insu.inclientqn.service.RecordService;
 import com.jiayue.insu.inclientqn.service.client.BackDataAnalysisService;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.quartz.Job;
@@ -14,31 +8,25 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.time.LocalDateTime;
-
 /**
- * @description: 回传预测数据定时任务
+ * @description: 解析回传的总数据定时任务
  * @author: yuanhao
  * @createDate: 2022/6/17
  * @version: 1.0
  */
 public class BackFileAnalysisJob implements Job {
-
-
     @Autowired
     private BackDataAnalysisService backDataAnalysisService;
-    @Autowired
-    private RecordService recordService;
 
+    /**
+     * 回传解析文件
+     * @param jobExecutionContext
+     * @throws JobExecutionException
+     */
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        // 获取当前时间所在15分钟节点 例如 10:18=》10:15 、 11:29=>11:15
         long time = DateTimeUtils.get15min(DateUtil.date().getTime());
-        LocalDateTime localDateTime = LocalDateTimeUtil.of(time);
-        Record record = recordService.findTimeAndTypeAndState(localDateTime, CommonStant.RECORD_TYPE_BACK_DATA_FILE, StatusEnum.SUCCESS.getSign());
-
-        if (record == null) {
-            backDataAnalysisService.watchFile(time);
-        }
-
+        backDataAnalysisService.watchFile(time);
     }
 }

+ 3 - 18
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackForeDataJob.java

@@ -1,12 +1,6 @@
 package com.jiayue.insu.inclientqn.job;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import com.jiayue.insu.inclientqn.constant.CommonStant;
-import com.jiayue.insu.inclientqn.entity.Record;
-import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
-import com.jiayue.insu.inclientqn.inenum.StatusEnum;
-import com.jiayue.insu.inclientqn.service.RecordService;
 import com.jiayue.insu.inclientqn.service.client.RequestDataService;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.quartz.Job;
@@ -14,8 +8,6 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.time.LocalDateTime;
-
 /**
  * @description: 回传预测数据定时任务
  * @author: yuanhao
@@ -24,21 +16,14 @@ import java.time.LocalDateTime;
  */
 public class BackForeDataJob implements Job {
 
-
     @Autowired
     private RequestDataService requestDataService;
-    @Autowired
-    private RecordService recordService;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        // 获取当前时间所在15分钟节点 例如 10:18=》10:15 、 11:29=>11:15
         long time = DateTimeUtils.get15min(DateUtil.date().getTime());
-        LocalDateTime localDateTime = LocalDateTimeUtil.of(time);
-        Record record = recordService.findTimeAndTypeAndContentAndState(localDateTime, CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_FORE_ALL.getCode(), StatusEnum.SUCCESS.getSign());
-
-        if (record == null) {
-            requestDataService.requestBackFore(time);
-        }
-
+        // 回传短期数据
+        requestDataService.requestBackFore(time);
     }
 }

+ 2 - 19
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/BackStatDataJob.java

@@ -1,12 +1,6 @@
 package com.jiayue.insu.inclientqn.job;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import com.jiayue.insu.inclientqn.constant.CommonStant;
-import com.jiayue.insu.inclientqn.entity.Record;
-import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
-import com.jiayue.insu.inclientqn.inenum.StatusEnum;
-import com.jiayue.insu.inclientqn.service.RecordService;
 import com.jiayue.insu.inclientqn.service.client.RequestDataService;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.quartz.Job;
@@ -14,8 +8,6 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.time.LocalDateTime;
-
 /**
  * @description: 回传统计数据定时任务
  * @author: yuanhao
@@ -23,22 +15,13 @@ import java.time.LocalDateTime;
  * @version: 1.0
  */
 public class BackStatDataJob implements Job {
-
-
     @Autowired
     private RequestDataService requestDataService;
-    @Autowired
-    private RecordService recordService;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        // 获取当前时间所在15分钟节点 例如 10:18=》10:15 、 11:29=>11:15
         long time = DateTimeUtils.get15min(DateUtil.date().getTime());
-        LocalDateTime localDateTime = LocalDateTimeUtil.of(time);
-        Record record = recordService.findTimeAndTypeAndContentAndState(localDateTime, CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_STAT_ALL.getCode(), StatusEnum.SUCCESS.getSign());
-
-        if (record == null) {
-            requestDataService.requestBackStat(time);
-        }
-
+        requestDataService.requestBackStat(time);
     }
 }

+ 6 - 2
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/ComPermissonJob.java

@@ -7,6 +7,8 @@ import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
+import java.util.List;
+
 /**
  * @description:  请求一体化 交互权限
  * @author: yuanhao
@@ -21,7 +23,9 @@ public class ComPermissonJob implements Job {
     private StationService stationService;
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        Station station = stationService.findThis();
-        comPermisson.generateKey(station);
+        List<Station> stationList = stationService.findAll();
+        for(Station station : stationList){
+            comPermisson.generateKey(station);
+        }
     }
 }

+ 2 - 22
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrectUsJob.java

@@ -1,45 +1,25 @@
 package com.jiayue.insu.inclientqn.job;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import com.jiayue.insu.inclientqn.constant.CommonStant;
-import com.jiayue.insu.inclientqn.entity.Record;
-import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
-import com.jiayue.insu.inclientqn.inenum.StatusEnum;
-import com.jiayue.insu.inclientqn.service.RecordService;
 import com.jiayue.insu.inclientqn.service.client.CorrforeService;
-import com.jiayue.insu.inclientqn.service.client.RequestDataService;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.time.LocalDateTime;
-
 /**
- * @description: 超短期修正系数定时任务
+ * @description: 获取超短期修正系数
  * @author: yuanhao
  * @createDate: 2022/6/17
  * @version: 1.0
  */
 public class CorrectUsJob implements Job {
-
-
     @Autowired
     private CorrforeService corrforeService;
-    @Autowired
-    private RecordService recordService;
-
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         long time = DateTimeUtils.get15min(DateUtil.date().getTime());
-        LocalDateTime localDateTime = LocalDateTimeUtil.of(time);
-        Record record = recordService.findTimeAndTypeAndContentAndState(localDateTime.plusMinutes(15L), CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_CORRULTRSHOR_TYPE.getCode(), StatusEnum.SUCCESS.getSign());
-
-        if (record == null) {
-            corrforeService.downLoadUltraShortTerm(time);
-        }
-
+        corrforeService.downLoadUltraShortTerm(time);
     }
 }

+ 28 - 11
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrforeDataJob.java

@@ -6,17 +6,17 @@ import com.jiayue.insu.inclientqn.entity.Record;
 import com.jiayue.insu.inclientqn.entity.Station;
 import com.jiayue.insu.inclientqn.inenum.StatusEnum;
 import com.jiayue.insu.inclientqn.service.client.CorrforeService;
-
 import com.jiayue.insu.inclientqn.service.RecordService;
 import com.jiayue.insu.inclientqn.service.StationService;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
-
 import java.time.LocalDateTime;
+import java.util.List;
+
 /**
- * @description:  请求一体化 修正数据
+ * @description: 请求一体化 修正数据
  * @author: yuanhao
  * @createDate: 2022/6/17
  * @version: 1.0
@@ -28,17 +28,34 @@ public class CorrforeDataJob implements Job {
     private StationService stationService;
     @Autowired
     private RecordService recordService;
+
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         //查询是否有今天成功记录 (为提高稳定性,该定时任务采取在规定时间段内 重复循环执行的定时策略,故:需要查询是否存在成功记录)
-        Record successRecord = recordService.findTimeAndTypeAndState(
-                LocalDateTimeUtil.beginOfDay(LocalDateTime.now()),
-                CommonStant.RECORD_TYPE_PULL_CORRECT,
-                StatusEnum.SUCCESS.getCode());
-
-        if(successRecord == null) {
-            Station station = stationService.findThis();
-            corrforeService.downLoadCorrforeData(station);
+        Record successRecord;
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        // 查询全部场站信息
+        List<Station> stationList = stationService.findAll();
+        // 如果场站大于1个,则循环请求一体化修正数据
+        if (stationList != null && stationList.size() > 1) {
+            for (Station station : stationList) {
+                // 如果有执行记录,则不再执行
+                successRecord = recordService.findTimeAndTypeAndStateAndStationCode(localDateTime, CommonStant.RECORD_TYPE_PULL_CORRECT, StatusEnum.SUCCESS.getCode(), station.getStationCode());
+                if (successRecord != null) {
+                    return;
+                }
+                // 下载并生成修正后短期数据
+                corrforeService.downLoadCorrforeData(station);
+            }
+            // 如果场站大于1个,则直接请求一体化修正数据
+        } else if (stationList != null && stationList.size() == 1) {
+            successRecord = recordService.findTimeAndTypeAndState(localDateTime, CommonStant.RECORD_TYPE_PULL_CORRECT, StatusEnum.SUCCESS.getCode());
+            // 如果有执行记录,则不再执行
+            if (successRecord != null) {
+                return;
+            }
+            // 下载并生成修正后短期数据
+            corrforeService.downLoadCorrforeData(stationList.get(0));
         }
 
     }

+ 26 - 10
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/CorrforeFileJob.java

@@ -12,8 +12,9 @@ import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
-
 import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * @description:  请求嘉越云修正数据
  * @author: yuanhao
@@ -31,15 +32,30 @@ public class CorrforeFileJob implements Job {
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         //查询是否有今天成功记录 (为提高稳定性,该定时任务采取在规定时间段内 重复循环执行的定时策略,故:需要查询是否存在成功记录)
-        Record successRecord = recordService.findTimeAndTypeAndState(
-                LocalDateTimeUtil.beginOfDay(LocalDateTime.now()),
-                CommonStant.RECORD_TYPE_PULL_CORRECT_JY,
-                StatusEnum.SUCCESS.getCode());
-
-        if (successRecord == null) {
-            Station station = stationService.findThis();
-
-            corrforeService.downLoadCorrforeFile(station);
+        Record successRecord;
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        // 查询全部场站信息
+        List<Station> stationList = stationService.findAll();
+        // 如果场站大于1个,则循环请求一体化修正数据
+        if (stationList != null && stationList.size() > 1) {
+            for (Station station : stationList) {
+                // 如果有执行记录,则不再执行
+                successRecord = recordService.findTimeAndTypeAndStateAndStationCode(LocalDateTimeUtil.beginOfDay(LocalDateTime.now()), CommonStant.RECORD_TYPE_PULL_CORRECT_JY, StatusEnum.SUCCESS.getCode()    ,station.getStationCode());
+                if (successRecord != null) {
+                    return;
+                }
+                // 下载并生成修正后短期数据
+                corrforeService.downLoadCorrforeFile(station);
+            }
+            // 如果场站等于1个,则直接请求一体化修正数据
+        } else if (stationList != null && stationList.size() == 1) {
+            successRecord = recordService.findTimeAndTypeAndState(LocalDateTimeUtil.beginOfDay(LocalDateTime.now()), CommonStant.RECORD_TYPE_PULL_CORRECT_JY, StatusEnum.SUCCESS.getCode());
+            // 如果有执行记录,则不再执行
+            if (successRecord != null) {
+                return;
+            }
+            // 下载并生成修正后短期数据
+            corrforeService.downLoadCorrforeFile(stationList.get(0));
         }
     }
 }

+ 28 - 6
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/job/RepairPlanJob.java

@@ -4,17 +4,19 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import com.jiayue.insu.inclientqn.constant.CommonStant;
 import com.jiayue.insu.inclientqn.entity.Record;
+import com.jiayue.insu.inclientqn.entity.Station;
 import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
 import com.jiayue.insu.inclientqn.inenum.StatusEnum;
 import com.jiayue.insu.inclientqn.service.RecordService;
+import com.jiayue.insu.inclientqn.service.StationService;
 import com.jiayue.insu.inclientqn.service.client.CorrforeService;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
-
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @description: 检修计划定时下载任务
@@ -24,20 +26,40 @@ import java.time.LocalDateTime;
  */
 public class RepairPlanJob implements Job {
 
-
     @Autowired
     private CorrforeService corrforeService;
     @Autowired
     private RecordService recordService;
+    @Autowired
+    private StationService stationService;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         long time = DateTimeUtils.get15min(DateUtil.date().getTime());
         LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
-        Record record = recordService.findTimeAndTypeAndContentAndState(localDateTime, CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_REPAPLAN_TYPE.getCode(), StatusEnum.SUCCESS.getSign());
-
-        if (record == null) {
-            corrforeService.downLoadRepairPlan(time);
+        Record record;
+        // 查询全部场站信息
+        List<Station> stationList = stationService.findAll();
+        // 如果场站大于1个,则循环下载检修计划数据
+        if (stationList != null && stationList.size() > 1) {
+            for (Station station : stationList) {
+                // 如果有执行记录,则不再执行
+                record = recordService.findTimeAndTypeAndContentAndStateAndStationCode(localDateTime, CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_REPAPLAN_TYPE.getCode(), StatusEnum.SUCCESS.getSign(),station.getStationCode());
+                if (record != null) {
+                    return;
+                }
+                // 下载并生成检修计划数据
+                corrforeService.downLoadRepairPlan(time,station);
+            }
+            // 如果场站等于1个,则直接下载检修计划数据
+        } else if (stationList != null && stationList.size() == 1) {
+            record = recordService.findTimeAndTypeAndContentAndState(localDateTime, CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_REPAPLAN_TYPE.getCode(), StatusEnum.SUCCESS.getSign());
+            // 如果有执行记录,则不再执行
+            if (record != null) {
+                return;
+            }
+            // 下载并生成检修计划数据
+            corrforeService.downLoadRepairPlan(time,stationList.get(0));
         }
 
     }

+ 9 - 6
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/permisson/com/ComPermisson.java

@@ -16,7 +16,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.DigestUtils;
-
 import java.time.LocalDateTime;
 
 /**
@@ -35,19 +34,27 @@ public class ComPermisson {
     @Autowired
     private RecordService recordService;
 
+    /**
+     * 生成清能一体化token
+     * @param station
+     * @return
+     */
     public Boolean generateKey(Station station) {
         Record record = new Record();
+
         record.setType(CommonStant.RECORD_TYPE_COM_PERMISSON);
         LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         record.setTime(localDateTime);
         record.setCreateTime(LocalDateTime.now());
+        record.setState(QNHLEnum.REQUEST_FAIL.getSign());
+        record.setStationCode(station.getStationCode());
+
         boolean result = false;
         String username = station.getUsername();
         String password = station.getPassword();
         String passwordMD5 = DigestUtils.md5DigestAsHex(password.getBytes()).toUpperCase();
         String auth = username + ":" + passwordMD5;
 
-
         String tokenUrl = station.getComurl();
         String response;
         String token;
@@ -71,7 +78,6 @@ public class ComPermisson {
                         stationService.updateById(station);
                         record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
                         result = true;
-
                     } else {
                         log.error("========== 一体化token请求异常: {} 接收retCode响应码非成功标识T200 标识为" + resultJson.getByPath("retCode") + " " + resultJson.getByPath("retMsg") + " ==========", station.getStationCode());
                         log.info("========== 请求参数 账号密码:" + username + ":" + password + " MD5加密:" + auth + " ==========");
@@ -89,7 +95,6 @@ public class ComPermisson {
 
         }
 
-
         recordService.save(record);
         return result;
     }
@@ -111,11 +116,9 @@ public class ComPermisson {
             }
         }
 
-
         if (StrUtil.isNotEmpty(token) && LocalDateTime.now().isBefore(tokenTime)){
             result = true;
         }
-
         return result;
     }
 

+ 1 - 1
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/BackForeForecastDataService.java

@@ -17,6 +17,6 @@ public interface BackForeForecastDataService extends IService<BackForeForecastDa
 
     List<BackForeForecastData> findBySignTime(LocalDateTime time);
 
-
+    List<BackForeForecastData> findBySignTimeAndStationCode(LocalDateTime time,String stationCode);
 
 }

+ 1 - 1
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/BackForeUsForecastDataService.java

@@ -18,6 +18,6 @@ public interface BackForeUsForecastDataService extends IService<BackForeUsForeca
 
     List<BackForeUsForecastData> findBySignTime(LocalDateTime time);
 
-
+    List<BackForeUsForecastData> findBySignTimeAndStationCode(LocalDateTime time,String stationCode);
 
 }

+ 10 - 5
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/RecordService.java

@@ -15,15 +15,20 @@ import java.time.LocalDateTime;
 public interface RecordService extends IService<Record> {
 
     /**
-     *  查询记录
-     * @param time 时间
-     * @param type 日志类型
+     * 查询记录
+     *
+     * @param time  时间
+     * @param type  日志类型
      * @param state 状态
      * @return
      */
-    Record findTimeAndTypeAndState(LocalDateTime time,String type,String state);
+    Record findTimeAndTypeAndState(LocalDateTime time, String type, String state);
 
-    Record findTimeAndTypeAndContentAndState(LocalDateTime time,String type,String content, String state);
+    Record findTimeAndTypeAndContentAndState(LocalDateTime time, String type, String content, String state);
+
+    Record findTimeAndTypeAndStateAndStationCode(LocalDateTime time, String type, String state, String StationCode);
+
+    Record findTimeAndTypeAndContentAndStateAndStationCode(LocalDateTime time, String type, String content, String state,String StationCode);
 
 
 }

+ 6 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/StationService.java

@@ -3,6 +3,8 @@ package com.jiayue.insu.inclientqn.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.insu.inclientqn.entity.Station;
 
+import java.util.List;
+
 
 /**
  * 场站信息业务接口
@@ -15,4 +17,8 @@ public interface StationService extends IService<Station> {
 
     Station findThis();
 
+    Station findByStationCode(String stationCode);
+
+    List<Station> findAll();
+
 }

+ 98 - 89
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataAnalysisService.java

@@ -3,14 +3,9 @@ package com.jiayue.insu.inclientqn.service.client;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileReader;
-import cn.hutool.core.io.watch.WatchMonitor;
-import cn.hutool.core.io.watch.Watcher;
-import cn.hutool.core.io.watch.watchers.DelayWatcher;
-import cn.hutool.core.lang.Console;
 import cn.hutool.core.util.StrUtil;
 import com.jiayue.insu.inclientqn.constant.CommonStant;
 import com.jiayue.insu.inclientqn.entity.*;
@@ -19,16 +14,14 @@ import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
 import com.jiayue.insu.inclientqn.inenum.StatusEnum;
 import com.jiayue.insu.inclientqn.service.*;
 import com.jiayue.insu.inclientqn.util.DateTimeUtils;
+import com.jiayue.insu.inclientqn.util.SystermUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
-
 import java.io.File;
 import java.math.BigDecimal;
-import java.nio.file.Path;
-import java.nio.file.WatchEvent;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -44,7 +37,6 @@ import java.util.*;
 @RefreshScope
 public class BackDataAnalysisService {
 
-
     @Value("${backdata.filepath}")
     private String backFilePath;
 
@@ -58,35 +50,30 @@ public class BackDataAnalysisService {
 
     private final BackForeForecastDataService backForeForecastDataService;
 
-
     private static Map<String, Map<String, Object>> labelMap = new HashMap<>();
 
     static {
+        // 设定文件模板
         Map<String, Object> rp = new HashMap<>();
         rp.put("label_start", "<" + QNHLEnum.DATA_STAT_TYPE_RealPower.getCode() + ">");
         rp.put("label_end", "</" + QNHLEnum.DATA_STAT_TYPE_RealPower.getCode() + ">");
-
         labelMap.put(QNHLEnum.DATA_STAT_TYPE_RealPower.getCode(), rp);
 
-
         Map<String, Object> rw = new HashMap<>();
         rw.put("label_start", "<" + QNHLEnum.DATA_STAT_TYPE_RealWeather.getCode() + ">");
         rw.put("label_end", "</" + QNHLEnum.DATA_STAT_TYPE_RealWeather.getCode() + ">");
         labelMap.put(QNHLEnum.DATA_STAT_TYPE_RealWeather.getCode(), rw);
 
-
         Map<String, Object> fpr = new HashMap<>();
         fpr.put("label_start", "<" + QNHLEnum.DATA_STAT_TYPE_ForecastPowerReport.getCode() + ">");
         fpr.put("label_end", "</" + QNHLEnum.DATA_STAT_TYPE_ForecastPowerReport.getCode() + ">");
         labelMap.put(QNHLEnum.DATA_STAT_TYPE_ForecastPowerReport.getCode(), fpr);
 
-
         Map<String, Object> ufpr = new HashMap<>();
         ufpr.put("label_start", "<" + QNHLEnum.DATA_STAT_TYPE_UltraShortTermForecastReport.getCode() + ">");
         ufpr.put("label_end", "</" + QNHLEnum.DATA_STAT_TYPE_UltraShortTermForecastReport.getCode() + ">");
         labelMap.put(QNHLEnum.DATA_STAT_TYPE_UltraShortTermForecastReport.getCode(), ufpr);
 
-
         Map<String, Object> fp = new HashMap<>();
         fp.put("label_start", "<" + QNHLEnum.DATA_FORE_TYPE_ForecastPower.getCode() + ">");
         fp.put("label_end", "</" + QNHLEnum.DATA_FORE_TYPE_ForecastPower.getCode() + ">");
@@ -96,45 +83,80 @@ public class BackDataAnalysisService {
         ufp.put("label_start", "<" + QNHLEnum.DATA_FORE_TYPE_UltraShortTermForecast.getCode() + ">");
         ufp.put("label_end", "</" + QNHLEnum.DATA_FORE_TYPE_UltraShortTermForecast.getCode() + ">");
         labelMap.put(QNHLEnum.DATA_FORE_TYPE_UltraShortTermForecast.getCode(), ufp);
-
-
     }
 
-
-    public void watchFile(Long time){
-       String fileName =  CommonStant.RECORD_TYPE_BACK_DATA_FILE+"_" +LocalDateTimeUtil.format(LocalDateTimeUtil.of(time),DatePattern.PURE_DATETIME_PATTERN)+".CIME";
-        //获取扫描文件路径
+    /**
+     * 解析文件
+     *
+     * @param time
+     */
+    public void watchFile(Long time) {
+        // 如果配置文件中回传路径未配置,则查询数据库
         if (StrUtil.isEmpty(backFilePath)) {
+            // 获取回传文件路径
             backFilePath = stationService.findThis().getBackFilePath();
         }
+        List<String> stationCodeFileNames = SystermUtils.getFileNames(backFilePath);
+        // 获取文件名
+        String fileName = CommonStant.RECORD_TYPE_BACK_DATA_FILE + "_" + LocalDateTimeUtil.format(LocalDateTimeUtil.of(time), DatePattern.PURE_DATETIME_PATTERN) + ".CIME";
+        File file;
+        // 如果场站文件目录分为AB机的情况 例:/home/syjy/zxgl/new/J00195-A
+        if(stationCodeFileNames!=null&& stationCodeFileNames.size()>0){
+            // 循环场站编码
+            for(String stationCode :stationCodeFileNames){
+                // 查询操作记录
+                Record record = recordService.findTimeAndTypeAndStateAndStationCode(LocalDateTimeUtil.of(time), CommonStant.RECORD_TYPE_BACK_DATA_FILE, StatusEnum.SUCCESS.getSign(),stationCode);
+                // 如果操作记录存在,则不进行解析文件
+                if (record != null) {
+                    log.info(LocalDateTimeUtil.of(time) + stationCode + "操作记录存在,不进行解析文件");
+                    break;
+                }
+                file = FileUtil.file(backFilePath + File.separatorChar + stationCode + File.separatorChar+ fileName);
+                // 根据文件及场站信息,解析文件
+                this.analysisAndSave(time,file,stationCode);
+            }
+        }else{
+            // 查询操作记录
+            Record record = recordService.findTimeAndTypeAndState(LocalDateTimeUtil.of(time), CommonStant.RECORD_TYPE_BACK_DATA_FILE, StatusEnum.SUCCESS.getSign());
+            // 如果操作记录不存在,则进行解析文件
+            if (record != null) {
+                log.info(LocalDateTimeUtil.of(time) + "操作记录存在,不进行解析文件");
+                return;
+            }
+            file = FileUtil.file(backFilePath + File.separatorChar + fileName);
+            // 根据文件及场站信息,解析文件
+            this.analysisAndSave(time,file,null);
+        }
+    }
 
-
-        File file = FileUtil.file(backFilePath+File.separatorChar +fileName);
-
-        if (file.exists()) {// 判断目录是否存在
-
-            Record record = new Record();
-            record.setType(CommonStant.RECORD_TYPE_BACK_DATA_FILE);
-            record.setState(StatusEnum.FILE_NULL.getCode());
-            record.setStateContent(StatusEnum.FILE_NULL.getMsg());
-            LocalDateTime localDateTime = LocalDateTimeUtil.of(DateTimeUtils.get15min(time));
-            record.setTime(localDateTime);
-            record.setCreateTime(LocalDateTime.now());
-
+    /**
+     * 根据文件及场站信息,解析文件
+     * @param time
+     * @param file
+     * @param stationCode
+     */
+    public void analysisAndSave(Long time,File file,String stationCode){
+        // 获取当前时间所在15分钟节点 例如 10:18=》10:15 、 11:29=>11:15
+        LocalDateTime localDateTime = LocalDateTimeUtil.of(DateTimeUtils.get15min(time));
+        // 判断目录是否存在
+        if (file.exists()) {
+            // 初始化记录
+            Record record = new Record(CommonStant.RECORD_TYPE_BACK_DATA_FILE, null, localDateTime, LocalDateTime.now(), StatusEnum.FILE_NULL.getCode(), StatusEnum.FILE_NULL.getCode(),stationCode);
             try {
-
-                    FileReader fileReader = new FileReader(file);
-                    List<String> contents = fileReader.readLines();
-                    if (CollectionUtil.isNotEmpty(contents)) {
-                        String s = fileAnalysis(contents);
-                        if (StrUtil.isNotEmpty(s)) {
-                            record.setStateContent(s);
-                            record.setState(StatusEnum.SUCCESS.getCode());
-                        }
-
+                // 读取文件
+                FileReader fileReader = new FileReader(file);
+                List<String> contents = fileReader.readLines();
+                // 如果文件内容不为空
+                if (CollectionUtil.isNotEmpty(contents)) {
+                    // 解析文件,获取操作类型
+                    String fileContentStr = fileAnalysis(contents,stationCode);
+                    // 如果操作类型不为空
+                    if (StrUtil.isNotEmpty(fileContentStr)) {
+                        //存入操作类型和状态
+                        record.setStateContent(fileContentStr);
+                        record.setState(StatusEnum.SUCCESS.getCode());
                     }
-
-
+                }
             } catch (Exception e) {
                 e.printStackTrace();
             } finally {
@@ -142,8 +164,9 @@ public class BackDataAnalysisService {
                 record.setTime(localDateTime);
                 recordService.save(record);
             }
-
-
+        } else {
+            Record record = new Record(CommonStant.RECORD_TYPE_BACK_DATA_FILE, null, localDateTime, localDateTime, StatusEnum.FILE_NULL.getCode(), StatusEnum.FILE_NULL.getMsg(),stationCode);
+            recordService.save(record);
         }
     }
 
@@ -236,32 +259,39 @@ public class BackDataAnalysisService {
 
     }
 
-
-    public String fileAnalysis(List<String> contents) {
+    /**
+     * 解析文件并返回操作类型
+     * @param contents
+     * @return
+     */
+    public String fileAnalysis(List<String> contents,String stationCode) {
         String result = "";
-
+        // 获取文件时间
         String[] fileTime = contents.get(0).split("\\s+")[2].split("=");
         LocalDateTime signTime = LocalDateTimeUtil.parse(fileTime[1].substring(1, fileTime[1].length() - 1), DatePattern.PURE_DATETIME_PATTERN);
         LocalDateTime now = LocalDateTime.now();
-
+        // 根据类型分类的文件内容
         Map<String, List<String>> contentMap = new HashMap<>();
-
+        // 回传数据
         BackStatData backStatData = new BackStatData();
         backStatData.setSignTime(signTime);
         backStatData.setAnalysisTime(LocalDateTime.now());
-
+        backStatData.setStationCode(stationCode);
+        // 超短期数据
         List<BackForeUsForecastData> usList = new ArrayList<>();
-
+        // 短期数据
         List<BackForeForecastData> list = new ArrayList<>();
-
-        Station station = stationService.findThis();
-
+        // 场站信息
+        Station station = stationService.findByStationCode(stationCode);
+        // 循环文件模板,根据标签内容,将文件内容分类存入map
         for (Map.Entry<String, Map<String, Object>> entry : labelMap.entrySet()) {
             Map<String, Object> map = entry.getValue();
+            // 获取起始标签和结束标签
             String label_start = (String) map.get("label_start");
             String label_end = (String) map.get("label_end");
             int start_index = 0;
             int end_index = 0;
+            // 获取标签头和标签尾位置
             for (int i = 0; i < contents.size(); i++) {
                 if (contents.get(i).equals(label_start)) {
                     start_index = i;
@@ -269,20 +299,18 @@ public class BackDataAnalysisService {
                 if (contents.get(i).equals(label_end)) {
                     end_index = i;
                 }
-
             }
-            //标签头和标签尾相减大于2  说明除了表头 至少还有1行数据
+            //标签头和标签尾相减大于2  说明除了表头 至少还有1行数据,把数据放入map
             if (end_index - start_index > 2) {
                 contentMap.put(entry.getKey(), ListUtil.sub(contents, start_index + 2, end_index));
             }
-
         }
 
-
+        // 循环分类后的文件
         for (Map.Entry<String, List<String>> entry : contentMap.entrySet()) {
-
+            // 获取
             List<String> value = entry.getValue();
-
+            // 判断内容分类的key名
             switch (entry.getKey()) {
                 case "RealPower":
                     try {
@@ -290,16 +318,12 @@ public class BackDataAnalysisService {
                         if (rpData.length == 3) {
                             backStatData.setRealPower(new BigDecimal(rpData[2]));
                             result += "RealPower,";
-
                         }
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
                     break;
-
                 case "RealWeather":
-
                     try {
                         String[] rwData = value.get(0).split("\\s+");
                         if (station.getType().equals(ElectricFieldTypeEnum.E2.name())) {
@@ -310,7 +334,6 @@ public class BackDataAnalysisService {
                                 backStatData.setHumidity(new BigDecimal(rwData[5]));
                                 backStatData.setPressure(new BigDecimal(rwData[6]));
                                 result += "RealWeather,";
-
                             }
                         } else {
                             if (rwData.length == 11) {
@@ -329,11 +352,8 @@ public class BackDataAnalysisService {
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
                     break;
-
                 case "ForecastPowerReport":
-
                     try {
                         String[] fpr = value.get(0).split("\\s+");
                         if (fpr.length == 3) {
@@ -343,11 +363,8 @@ public class BackDataAnalysisService {
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
                     break;
-
                 case "UltraShortTermForecastReport":
-
                     try {
                         String[] ufpr = value.get(0).split("\\s+");
                         if (ufpr.length == 3) {
@@ -357,20 +374,18 @@ public class BackDataAnalysisService {
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
                     break;
-
                 case "UltraShortTermForecast":
-
                     try {
                         for (String content : value) {
                             String[] datas = content.split("\\s+");
                             BackForeUsForecastData backForeUsForecastData = new BackForeUsForecastData();
                             backForeUsForecastData.setSignTime(signTime);
-                            backForeUsForecastData.setAnalysisTime(now);
                             backForeUsForecastData.setForecastTime(LocalDateTimeUtil.parse(datas[2], DatePattern.PURE_DATETIME_PATTERN));
                             backForeUsForecastData.setForecastValue(new BigDecimal(datas[3]));
                             backForeUsForecastData.setForecastOpenCap(new BigDecimal(datas[4]));
+                            backForeUsForecastData.setAnalysisTime(now);
+                            backForeUsForecastData.setStationCode(stationCode);
                             usList.add(backForeUsForecastData);
                         }
                         result += "usf,";
@@ -378,9 +393,7 @@ public class BackDataAnalysisService {
                         e.printStackTrace();
                     }
                     break;
-
                 case "ForecastPower":
-
                     try {
                         for (String content : value) {
                             String[] datas = content.split("\\s+");
@@ -390,26 +403,22 @@ public class BackDataAnalysisService {
                             backForeForecastData.setForecastTime(LocalDateTimeUtil.parse(datas[2], DatePattern.PURE_DATETIME_PATTERN));
                             backForeForecastData.setForecastValue(new BigDecimal(datas[3]));
                             backForeForecastData.setForecastOpenCap(new BigDecimal(datas[4]));
+                            backForeForecastData.setStationCode(stationCode);
                             list.add(backForeForecastData);
                         }
                         result += "fp,";
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
-
                     break;
             }
         }
-
-
+        // 保存回传数据
         backStatDataService.save(backStatData);
+        // 保存超短期数据
         backForeUsForecastDataService.saveBatch(usList);
+        // 保存短期数据
         backForeForecastDataService.saveBatch(list);
-
-
         return result;
     }
-
-
 }

+ 44 - 81
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataGenBodyService.java

@@ -1,28 +1,21 @@
 package com.jiayue.insu.inclientqn.service.client;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.StrUtil;
-import com.jiayue.insu.inclientqn.constant.CommonStant;
 import com.jiayue.insu.inclientqn.constant.TemplateStant;
 import com.jiayue.insu.inclientqn.entity.BackForeForecastData;
 import com.jiayue.insu.inclientqn.entity.BackForeUsForecastData;
 import com.jiayue.insu.inclientqn.entity.BackStatData;
 import com.jiayue.insu.inclientqn.inenum.ElectricFieldTypeEnum;
 import com.jiayue.insu.inclientqn.inenum.QNHLEnum;
-import com.jiayue.insu.inclientqn.model.RequestVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
-
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-
-
 /**
  * @description: 回传数据请求生成
  * @author: yuanhao
@@ -42,29 +35,23 @@ public class BackDataGenBodyService {
      * @return RequestVo
      */
     public StringBuilder genStateRealPowerData(List<BackStatData> backStatDatas) {
-
         StringBuilder content = new StringBuilder();
-
+        // 如果统计数据中实际功率不为空
         if (backStatDatas.get(0).getRealPower() != null) {
-
+            // 获取开始、结束、title标签
             String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_STAT_TYPE_RealPower.getCode());
             String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_STAT_TYPE_RealPower.getCode());
             String title = TemplateStant.BACK_STAT_REAL_POWER_TITLE;
-
+            // 拼接开始、title、内容、结束
             content.append(labelStart);
             content.append(title);
-
             String dataContent = StrUtil.format(TemplateStant.BACK_STAT_REAL_POWER_TEMPLATE, backStatDatas.get(0).getRealPower().toString());
-
             content.append(dataContent);
             content.append(labelEnd);
         }
-
-
         return content;
     }
 
-
     /**
      * 生成回传实际气象
      *
@@ -73,36 +60,33 @@ public class BackDataGenBodyService {
      * @return RequestVo
      */
     public StringBuilder genStateRealWeatherData(String stationType, List<BackStatData> backStatDatas) {
-
         StringBuilder content = new StringBuilder();
-
-
         try {
+            // 获取开始、结束、title标签
             String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_STAT_TYPE_RealWeather.getCode());
             String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_STAT_TYPE_RealWeather.getCode());
-
+            // 拼接开始标签
             content.append(labelStart);
-            String title = "";
-            String dataContent = "";
+            String title;
+            String dataContent;
+            // 获取第一条统计数据
             BackStatData backStatData = backStatDatas.get(0);
-
+            // 如果是风电场
             if (stationType.equals(ElectricFieldTypeEnum.E2.name())) {
-
+                // 设置title和内容
                 title = TemplateStant.BACK_STAT_REAL_WEATHER_TITLE_E2;
                 dataContent = StrUtil.format(TemplateStant.BACK_STAT_REAL_WEATHER_TEMPLATE_E2, backStatData.getWs().toString(), backStatData.getWd().toString()
                         , backStatData.getTemperature().toString(), backStatData.getHumidity().toString(), backStatData.getPressure().toString());
-
+            // 光伏
             } else {
-
+                // 设置title和内容
                 title = TemplateStant.BACK_STAT_REAL_WEATHER_TITLE_E1;
                 dataContent = StrUtil.format(TemplateStant.BACK_STAT_REAL_WEATHER_TEMPLATE_E1, backStatData.getGlobalR().toString(), backStatData.getDirectR().toString()
                         , backStatData.getDiffuseR().toString(), backStatData.getTemperature().toString(), backStatData.getCellT().toString(),
                         backStatData.getHumidity().toString(), backStatData.getPressure().toString(), backStatData.getWs().toString(), backStatData.getWd().toString()
                 );
-
             }
-
-
+            // 拼接title、内容和结束标签
             content.append(title);
             content.append(dataContent);
             content.append(labelEnd);
@@ -110,14 +94,9 @@ public class BackDataGenBodyService {
             log.warn("回传数据-实际气象信息缺少数据");
             content = new StringBuilder();
         }
-
-
-
-
         return content;
     }
 
-
     /**
      * 生成短期上报
      *
@@ -125,28 +104,23 @@ public class BackDataGenBodyService {
      * @return RequestVo
      */
     public StringBuilder genStateForecastPowerReport(List<BackStatData> backStatDatas) {
-
         StringBuilder content = new StringBuilder();
+        // 如果统计数据中上报状态不为空
         if (backStatDatas.get(0).getReportStateForecast() != null) {
-
+            // 获取开始、结束、title标签
             String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_STAT_TYPE_ForecastPowerReport.getCode());
             String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_STAT_TYPE_ForecastPowerReport.getCode());
             String title = TemplateStant.BACK_FORE_FORECAST_TITLE_REPORT;
-
-
+            // 拼接开始、title、内容、结束标签
             content.append(labelStart);
             content.append(title);
-
             String dataContent = StrUtil.format(TemplateStant.BACK_FORE_FORECAST_TEMPLATE_REPORT, backStatDatas.get(0).getReportStateForecast().toString());
-
             content.append(dataContent);
             content.append(labelEnd);
         }
-
         return content;
     }
 
-
     /**
      * 生成超短期上报
      *
@@ -154,98 +128,87 @@ public class BackDataGenBodyService {
      * @return RequestVo
      */
     public StringBuilder genStateUltraShortTermForecastReport(List<BackStatData> backStatDatas) {
-
-
         StringBuilder content = new StringBuilder();
+        // 如果统计数据中上报状态不为空
         if (backStatDatas.get(0).getReportStateForecastshort() != null) {
-
+            // 获取开始、结束、title标签
             String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_STAT_TYPE_UltraShortTermForecastReport.getCode());
             String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_STAT_TYPE_UltraShortTermForecastReport.getCode());
             String title = TemplateStant.BACK_FORE_US_FORECAST_TITLE_REPORT;
-
+            // 拼接开始、title、内容、结束标签
             content.append(labelStart);
             content.append(title);
-
             String dataContent = StrUtil.format(TemplateStant.BACK_FORE_US_FORECAST_TITLE_TEMPLATE, backStatDatas.get(0).getReportStateForecastshort().toString());
-
             content.append(dataContent);
             content.append(labelEnd);
-
         }
-
         return content;
     }
 
-
+    /**
+     * 根据超短期数据拼接字符串
+     * @param stationType
+     * @param backForeUsForecastDatas
+     * @return
+     */
     public StringBuilder genForeUltraShortTermForecast(String stationType, List<BackForeUsForecastData> backForeUsForecastDatas) {
-
-
         StringBuilder content = new StringBuilder();
-
+        // 根据时间排序
         Collections.sort(backForeUsForecastDatas, Comparator.comparing(BackForeUsForecastData::getForecastTime));
-
+        // 组装开始标签和结束标签
         String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_FORE_TYPE_UltraShortTermForecast.getCode());
         String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_FORE_TYPE_UltraShortTermForecast.getCode());
-
-        String title = "";
-        String template = "";
-
+        String title;
+        String template;
+        // 拼接开始标签
         content.append(labelStart);
-
-
+        // 如果是风电场
         if (stationType.equals(ElectricFieldTypeEnum.E2.name())) {
             title = TemplateStant.BACK_FORE_US_FORECAST_TITLE_E2;
             template = TemplateStant.BACK_FORE_US_FORECAST_TEMPLATE_E2;
-
+        // 光伏
         } else {
             title = TemplateStant.BACK_FORE_US_FORECAST_TITLE_E1;
             template = TemplateStant.BACK_FORE_US_FORECAST_TEMPLATE_E1;
-
         }
-
+        // 拼接title
         content.append(title);
-
+        // 循环拼接超短期数据
         for (int i = 0; i < backForeUsForecastDatas.size(); i++) {
-
             BackForeUsForecastData b = backForeUsForecastDatas.get(i);
             String format = LocalDateTimeUtil.format(b.getForecastTime(), DatePattern.PURE_DATETIME_PATTERN);
             String dataContent = StrUtil.format(template, i, format, b.getForecastValue(), b.getForecastOpenCap());
             content.append(dataContent);
         }
-
+        // 拼接结束标签
         content.append(labelEnd);
-
-
         return content;
     }
 
-
+    /**
+     * 根据短期数据拼接字符串
+     * @param backForeForecastDatas
+     * @return
+     */
     public StringBuilder genForeForecast(List<BackForeForecastData> backForeForecastDatas) {
-
         StringBuilder content = new StringBuilder();
-
+        // 根据预测时间排序
         Collections.sort(backForeForecastDatas, Comparator.comparing(BackForeForecastData::getForecastTime));
-
+        // 组装开始标签、结束标签、title
         String labelStart = TemplateStant.GEN_LABELSTART(QNHLEnum.DATA_FORE_TYPE_ForecastPower.getCode());
         String labelEnd = TemplateStant.GEN_LABELEND(QNHLEnum.DATA_FORE_TYPE_ForecastPower.getCode());
-
         String title = TemplateStant.BACK_FORE_FORECAST_TITLE;
-
         content.append(labelStart);
         content.append(title);
-
+        // 循环拼接短期数据
         for (int i = 0; i < backForeForecastDatas.size(); i++) {
-
             BackForeForecastData b = backForeForecastDatas.get(i);
             String format = LocalDateTimeUtil.format(b.getForecastTime(), DatePattern.PURE_DATETIME_PATTERN);
             String dataContent = StrUtil.format(TemplateStant.BACK_FORE_FORECAST_TEMPLATE, i + 1, format, b.getForecastValue(), b.getForecastOpenCap());
             content.append(dataContent);
         }
-
+        // 拼接结束标签
         content.append(labelEnd);
-
         return content;
     }
-
-
 }

+ 0 - 10
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/BackDataGenService.java

@@ -66,7 +66,6 @@ public class BackDataGenService {
             requestVo = RequestVo.UPLOAD_STAT(el, content.toString(), signTime);
         }
 
-
         return requestVo;
     }
 
@@ -113,7 +112,6 @@ public class BackDataGenService {
 
             }
 
-
             content.append(title);
             content.append(dataContent);
             content.append(labelEnd);
@@ -121,7 +119,6 @@ public class BackDataGenService {
             requestVo = RequestVo.UPLOAD_STAT(el, content.toString(), signTime);
         }
 
-
         return requestVo;
     }
 
@@ -158,11 +155,9 @@ public class BackDataGenService {
             requestVo = RequestVo.UPLOAD_STAT(el, content.toString(), signTime);
         }
 
-
         return requestVo;
     }
 
-
     /**
      * 生成超短期上报
      *
@@ -199,7 +194,6 @@ public class BackDataGenService {
         return requestVo;
     }
 
-
     public RequestVo genForeUltraShortTermForecast(String el, String stationType, long signTime, List<BackForeUsForecastData> backForeUsForecastDatas) throws Exception {
 
         RequestVo requestVo = null;
@@ -218,7 +212,6 @@ public class BackDataGenService {
             content.append(header);
             content.append(labelStart);
 
-
             if (stationType.equals(ElectricFieldTypeEnum.E2.name())) {
                 title = TemplateStant.BACK_FORE_US_FORECAST_TITLE_E2;
                 template = TemplateStant.BACK_FORE_US_FORECAST_TEMPLATE_E2;
@@ -245,7 +238,6 @@ public class BackDataGenService {
 
         }
 
-
         return requestVo;
     }
 
@@ -258,7 +250,6 @@ public class BackDataGenService {
 
             boolean checkDate = true;
 
-
             if (checkDate) {
                 Collections.sort(backForeForecastDatas, Comparator.comparing(BackForeForecastData::getForecastTime));
                 StringBuilder content = new StringBuilder();
@@ -290,5 +281,4 @@ public class BackDataGenService {
         return requestVo;
     }
 
-
 }

+ 235 - 292
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/CorrforeService.java

@@ -50,124 +50,150 @@ import java.util.regex.Pattern;
 @RequiredArgsConstructor
 public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
 
-
     private final RecordService recordService;
-
     private final StationService stationService;
-
     private final CorrforeStService corrforeStService;
-
     private final VelocityEngine velocityEngine;
-
     private final ComPermisson comPermisson;
-
     private final MinioUtilService minioUtilService;
-
     private final CorrectUltraShortTermService correctUltraShortTermService;
-
     private final RepairPlanService repairPlanService;
 
-
     @Value("${minio.bucketname}")
     private String bucketName;
 
+    /**
+     * 下载超短期数据
+     *
+     * @param signTime
+     */
+    public void downLoadUltraShortTerm(long signTime) {
+        // 获取全部场站
+        List<Station> stationList = stationService.findAll();
+        Record record;
+        LocalDateTime localDateTime = LocalDateTimeUtil.of(signTime);
+
+        // 如果场站大于2个,则为多场站情况
+        if (stationList != null && stationList.size() > 1) {
+            for (Station station : stationList) {
+                record = recordService.findTimeAndTypeAndContentAndStateAndStationCode(localDateTime.plusMinutes(15L), CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_CORRULTRSHOR_TYPE.getCode(), StatusEnum.SUCCESS.getSign(),station.getStationCode());
+                if (record != null) {
+                    return;
+                }
+                this.getUltraShortTermAndGenFile(station, signTime);
+            }
+            // 如果只有一个场站
+        } else if (stationList != null && stationList.size() == 1) {
+            record = recordService.findTimeAndTypeAndContentAndState(localDateTime.plusMinutes(15L), CommonStant.RECORD_TYPE_CORRECT_DATA, QNHLEnum.DATA_CORRULTRSHOR_TYPE.getCode(), StatusEnum.SUCCESS.getSign());
+            if (record != null) {
+                return;
+            }
+            this.getUltraShortTermAndGenFile(stationList.get(0), signTime);
+        }
+    }
 
-    public void downLoadUltraShortTerm(long signTime){
-
-        Station station = stationService.findThis();
+    /**
+     * 获取超短期修正数据并生成文件
+     * @param station
+     * @param signTime
+     */
+    public void getUltraShortTermAndGenFile(Station station, long signTime){
         //标记为要生成超短期的时刻
         LocalDateTime signLDT = LocalDateTimeUtil.of(signTime).plusMinutes(15L);
-
+        // 初始化日志
         Record record = new Record();
         record.setType(CommonStant.RECORD_TYPE_CORRECT_DATA);
         record.setContent(QNHLEnum.DATA_CORRULTRSHOR_TYPE.getCode());
         record.setCreateTime(LocalDateTime.now());
-
+        record.setStationCode(station.getStationCode());
         //标记为要生成超短期的时刻
         record.setTime(signLDT);
-
+        // 组装请求参数
         RequestVo requestVo = RequestVo.CORRECT_US(station.getSignCode(), null, signTime);
         JSONObject json = JSONUtil.parseObj(requestVo, true);
         String body = json.toString();
+        // 发送请求
         String response = RequestUtils.post(station.getDownloadurl(), body, station.getComKey());
+        // 返回结果校验成功
         if (RequestUtils.checkResponse(response, record)) {
-
             ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
             String code = responseVo.getRetCode();
-
+            // 如果请求成功
             if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
-
-
+                // 获取请求结果
                 JSONObject jsonObject = JSONUtil.parseObj(responseVo.getData());
-
-                if(genUs(station,jsonObject)){
-
-                    correctUltraShortTerm(jsonObject.get("data").toString(),signLDT);
-
+                // 如果生成修正超短期文件成功
+                if (genUs(station, jsonObject)) {
+                    // 将修正后的超短期数据入库
+                    correctUltraShortTerm(jsonObject.get("data").toString(), signLDT);
+                    // 设置日志操作状态
                     record.setState(StatusEnum.SUCCESS.getSign());
                     record.setStateContent(responseVo.getRetMsg());
-                }else{
+                    // 如果生成超短期修正文件失败
+                } else {
+                    // 设置日志操作状态
                     record.setState(StatusEnum.GEN_FILE_FAIL.getSign());
                     record.setStateContent(StatusEnum.GEN_FILE_FAIL.getMsg());
                 }
-
-
-
+                // 如果请求失败
             } else {
+                // 设置日志操作状态
                 record.setState(code);
                 record.setStateContent(responseVo.getRetMsg());
             }
         }
-
+        // 保存操作日志
         recordService.save(record);
-
     }
 
-    public void downLoadRepairPlan(long signTime){
-
-        Station station = stationService.findThis();
-
+    /**
+     * 下载检修计划
+     *
+     * @param signTime
+     */
+    public void downLoadRepairPlan(long signTime,Station station) {
+        // 获取当日开始时间
         LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        //初始化操作日志
         Record record = new Record();
         record.setType(CommonStant.RECORD_TYPE_CORRECT_DATA);
         record.setContent(QNHLEnum.DATA_REPAPLAN_TYPE.getCode());
         record.setCreateTime(LocalDateTime.now());
         record.setTime(localDateTime);
-
+        //组装请求参数
         RequestVo requestVo = RequestVo.CORRECT_RP(null, signTime);
         JSONObject json = JSONUtil.parseObj(requestVo, true);
         String body = json.toString();
+        // 发送请求,下载检修计划
         String response = RequestUtils.post(station.getDownloadurl(), body, station.getComKey());
-
+        // 如果返回结果正常
         if (RequestUtils.checkResponse(response, record)) {
-
+            // 获取返回信息
             ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
             String code = responseVo.getRetCode();
-
+            // 如果调用接口成功
             if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
-
-                if(genRp(station,responseVo.getData())){
-
-                    repairPlan(responseVo.getData(),localDateTime);
-
+                // 如果生成检修计划文件成功
+                if (genRp(station, responseVo.getData())) {
+                    // 保存检修计划数据
+                    repairPlan(responseVo.getData(), localDateTime);
+                    // 设置操作结果
                     record.setState(StatusEnum.SUCCESS.getSign());
                     record.setStateContent(responseVo.getRetMsg());
-                }else{
+                } else {
+                    // 设置操作结果
                     record.setState(StatusEnum.GEN_FILE_FAIL.getSign());
                     record.setStateContent(StatusEnum.GEN_FILE_FAIL.getMsg());
                 }
-
-
-
+                //调用接口失败
             } else {
+                // 设置操作结果
                 record.setState(code);
                 record.setStateContent(responseVo.getRetMsg());
             }
         }
-
-
+        // 保存操作记录
         recordService.save(record);
-
     }
 
     /**
@@ -183,7 +209,6 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
         LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         record.setTime(localDateTime);
         record.setCreateTime(LocalDateTime.now());
-
         boolean isUpload = false;
 
         try {
@@ -202,7 +227,7 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
             if (isFile) {
                 minioUtilService.downloadObject(bucketName, downfileName, station.getLocalFilePath() + File.separatorChar + downfileName.split("/")[1]);
                 record.setState(StatusEnum.SUCCESS.getSign());
-            }else{
+            } else {
                 record.setState(StatusEnum.FILE_NULL.getSign());
             }
 
@@ -212,38 +237,35 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
             record.setStateContent(StatusEnum.DOWNLOAD_FILE_ERROR.getMsg());
         }
 
-
         recordService.save(record);
         return isUpload;
     }
 
     /**
-     * 下载修正预测数据,从一体化上
+     * 下载修正短期预测数据,从一体化上
      *
      * @param station
      * @return
      */
     public boolean downLoadCorrforeData(Station station) {
-
+        // 初始化操作记录
         Record record = new Record();
         record.setType(CommonStant.RECORD_TYPE_PULL_CORRECT);
         LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         record.setTime(localDateTime);
         record.setCreateTime(LocalDateTime.now());
-
-
+        // 获取token
         String token = station.getComKey();
-        LocalDateTime tokenTime = station.getKeyTime();
-
+        // 获取下载路径
         String dataPullUrl = station.getDownloadurl();
 
-
         boolean result = false;
         boolean isUpload = false;
         String response;
         RequestVo requestVo;
         List<CorrforeSt> list = new ArrayList<>();
-
+        // 如果token为空或者token失效,从新获取token
+        LocalDateTime tokenTime = station.getKeyTime();
         if (StrUtil.isEmpty(token) || LocalDateTime.now().isAfter(tokenTime)) {
             if (comPermisson.generateKey(station)) {
                 station = stationService.findThis();
@@ -251,20 +273,20 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
                 tokenTime = station.getKeyTime();
             }
         }
-
+        // 如果token为不为空并且者token未失效
         if (StrUtil.isNotEmpty(token) && LocalDateTime.now().isBefore(tokenTime)) {
             try {
-
+                //实装请求参数
                 DateTime dateTime = DateUtil.parse(DateUtil.today());
                 requestVo = RequestVo.builder()
                         .transferType(QNHLEnum.TRANSFER_TYPE_CORRECT.getCode())
                         .date(dateTime.toString("yyyyMMdd"))
                         .dataType(QNHLEnum.DATA_CORRFORE_TYPE.getCode())
                         .build();
-
+                // 将求情转为jsonString
                 JSONObject json = JSONUtil.parseObj(requestVo, true);
                 String body = json.toString();
-
+                // 发送请求
                 HttpRequest httpRequest = HttpRequest.post(dataPullUrl)
                         .header("Content-Type", "application/json")
                         .header("Authorization", token);
@@ -273,45 +295,45 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
                         .body(body)
                         .execute().body();
 
+                // 如果结果不为空
                 if (StrUtil.isNotEmpty(response)) {
                     boolean isJson = JSONUtil.isJsonObj(response);
+                    // 如果返回结果是json类型
                     if (isJson) {
                         ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
                         String code = responseVo.getRetCode();
+                        // 如果调用结果成功
                         if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
-
                             log.info(station.getStationCode() + " 请求短期修正数据返回内容:{}", response);
-
                             try {
-
+                                // 如果是光伏
                                 if (CommonStant.ET_PHOTOVOLTAIC.equals(station.getType())) {
+                                    //解析光伏数据
                                     list = correctPhotovoltaicData(responseVo.getData());
-
+                                // 如果是风电
                                 } else {
+                                    //解析风电数据
                                     list = correctWindData(responseVo.getData());
                                 }
-
                                 /**************检测解析数据完整性*******************/
                                 BigDecimal one = new BigDecimal("1");
                                 BigDecimal checkCount = new BigDecimal(station.getDays().toString()).add(one).multiply(new BigDecimal("96")).add(one);
-
+                                // 如果修正后短期数据不为0
                                 if (list.size() > 0) {
                                     if (list.size() < checkCount.intValue()) {
                                         log.warn("========== 请求短期修正数据缺数: {}", list.size());
                                     }
                                     corrforeStService.updateBetweenForecastTime(list.get(0).getTimeFormat(), list.get(list.size() - 1).getTimeFormat(), list);
-                                    genFile(station, list);
-                                    result = true;
-
-
+                                    // 生成短期修正后文件
+                                    if(genFile(station, list)){
+                                        result = true;
+                                    }
+                                // 如果短期数据为空
                                 } else {
                                     record.setState(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getCode());
                                     record.setStateContent(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getMsg());
                                 }
-
-
                                 /**************检测解析数据完整性*******************/
-
                             } catch (Exception e) {
                                 e.printStackTrace();
                                 record.setState(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getSign());
@@ -319,12 +341,10 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
                                 log.error("========== 解析短期或生成文件失败 ");
                             }
 
-
                             if (result) {
                                 log.info("========== 拉取短期修正数据成功! ==========");
                                 record.setState(StatusEnum.SUCCESS.getSign());
                                 record.setStateContent(String.valueOf(list.size()));
-
                             }
 
                         } else {
@@ -355,7 +375,6 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
         return isUpload;
     }
 
-
     /**
      * 光伏数据解析
      *
@@ -365,44 +384,28 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
      */
     public List<CorrforeSt> correctPhotovoltaicData(String data) throws Exception {
         List<CorrforeSt> list = new ArrayList<>();
-
         String[] content = data.split("\n");
 
         for (int i = 3; i < content.length - 1; i++) {
-
             CorrforeSt corrforeSt = new CorrforeSt();
             String column = content[i];
             String[] datas = column.split(CommonStant.SPACE1_CONSTANT);
             corrforeSt.setForecastTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").getTime());
             corrforeSt.setTimeFormat(DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
-
             corrforeSt.setFpValue(isNumberOrNull(datas[3]));
-
             corrforeSt.setGlobalR(isNumberOrNull(datas[4]));
-
             corrforeSt.setDirectR(isNumberOrNull(datas[5]));
-
             corrforeSt.setDiffuseR(isNumberOrNull(datas[6]));
-
             corrforeSt.setT(isNumberOrNull(datas[7]));
-
             corrforeSt.setRh(isNumberOrNull(datas[8]));
-
             corrforeSt.setP(isNumberOrNull(datas[9]));
-
             corrforeSt.setWs(isNumberOrNull(datas[10]));
-
             corrforeSt.setWd(isNumberOrNull(datas[11]));
-
             corrforeSt.setCorrectTime(LocalDateTime.now());
-
             Collections.sort(list, Comparator.comparing(CorrforeSt::getForecastTime));
-
             list.add(corrforeSt);
         }
-
         return list;
-
     }
 
     /**
@@ -413,113 +416,91 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
      * @throws Exception
      */
     public List<CorrforeSt> correctWindData(String data) throws Exception {
-
         List<CorrforeSt> list = new ArrayList<>();
-
         String[] content = data.split("\n");
 
-
         for (int i = 3; i < content.length - 1; i++) {
-
             CorrforeSt corrforeSt = new CorrforeSt();
             String column = content[i];
             String[] datas = column.split(CommonStant.SPACE1_CONSTANT);
             corrforeSt.setForecastTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").getTime());
             corrforeSt.setTimeFormat(DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
-
             corrforeSt.setFpValue(isNumberOrNull(datas[3]));
-
             corrforeSt.setWs(isNumberOrNull(datas[4]));
-
             corrforeSt.setWd(isNumberOrNull(datas[5]));
-
             corrforeSt.setT(isNumberOrNull(datas[6]));
-
             corrforeSt.setRh(isNumberOrNull(datas[7]));
-
             corrforeSt.setP(isNumberOrNull(datas[8]));
-
             corrforeSt.setCorrectTime(LocalDateTime.now());
-
             Collections.sort(list, Comparator.comparing(CorrforeSt::getForecastTime));
-
             list.add(corrforeSt);
         }
-
-
         return list;
-
     }
 
-
-    public boolean correctUltraShortTerm(String content,LocalDateTime signTime){
+    /**
+     * 将修正后的超短期数据入库
+     *
+     * @param content
+     * @param signTime
+     * @return
+     */
+    public boolean correctUltraShortTerm(String content, LocalDateTime signTime) {
         boolean result = true;
-
         try {
             List<CorrectUltraShortTerm> list = new ArrayList<>();
-
             String[] contents = content.split("\n");
-
-
-            for (int i = 3; i < contents.length-1; i++) {
+            for (int i = 3; i < contents.length - 1; i++) {
                 CorrectUltraShortTerm cus = new CorrectUltraShortTerm();
                 String column = contents[i];
                 String[] datas = column.split("\\s+");
                 cus.setSignTime(signTime);
-                cus.setRequestTime(LocalDateTime.now());
                 cus.setPassTime(LocalDateTime.now());
-                cus.setForecastTime( DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
+                cus.setRequestTime(LocalDateTime.now());
+                cus.setForecastTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
                 cus.setRatio(new BigDecimal(datas[3]));
                 list.add(cus);
             }
-
             correctUltraShortTermService.saveBatch(list);
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             result = false;
         }
-
         return result;
-
-
     }
 
-    public boolean repairPlan(String content,LocalDateTime signTime){
+    /**
+     * 批量保存检修计划
+     *
+     * @param content
+     * @param signTime
+     * @return
+     */
+    public boolean repairPlan(String content, LocalDateTime signTime) {
         boolean result = true;
-
         try {
             List<RepairPlan> list = new ArrayList<>();
-
             String[] contents = content.split("\n");
-
-
-            for (int i = 3; i < contents.length-1; i++) {
+            for (int i = 3; i < contents.length - 1; i++) {
                 RepairPlan rp = new RepairPlan();
                 String column = contents[i];
                 String[] datas = column.split("\\s+");
                 rp.setSignTime(signTime);
                 rp.setRequestTime(LocalDateTime.now());
                 rp.setPassTime(LocalDateTime.now());
-                rp.setStartTime( DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
-                rp.setEndTime( DateUtil.parse(datas[3], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
+                rp.setStartTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
+                rp.setEndTime(DateUtil.parse(datas[3], "yyyyMMddHHmmss").toTimestamp().toLocalDateTime());
                 rp.setCap(new BigDecimal(datas[4]));
                 list.add(rp);
             }
-
             repairPlanService.saveBatch(list);
-
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             result = false;
         }
-
         return result;
-
-
     }
 
-
-
     /**
      * 判断是否是NULL 和是否是数值
      *
@@ -529,7 +510,6 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
     public BigDecimal isNumberOrNull(String data) {
         BigDecimal bigDecimal = new BigDecimal("-99");
         if (!data.contains("null") && !data.contains("NULL")) {
-
             Pattern pattern = Pattern.compile("-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?");
             Matcher isNum = pattern.matcher(data);
             try {
@@ -539,30 +519,31 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
             } catch (Exception e) {
                 e.printStackTrace();
             }
-
         }
-
         return bigDecimal;
     }
 
-
     /**
-     * 生成文件
+     * 生成修正后的短期文件
      *
+     * @param station
+     * @param list
      * @return
      */
-    public File genFile(Station station, List<CorrforeSt> list) {
-
+    public boolean genFile(Station station, List<CorrforeSt> list) {
+        boolean result = true;
+        // 初始化模板
         String vmsPath = SystermUtils.getResourceBasePath() + "/vms/DQ.vm";
-        File file = null;
+        File file ;
         Template template = this.velocityEngine.getTemplate(vmsPath);
+        // 如果模板不为空
         if (template != null) {
             VelocityContext velocityContext;
             StringWriter writer;
-
+            // 将修正后的短期数据按照预测时间排序
             list.sort(Comparator.comparing(CorrforeSt::getForecastTime));
+            // 根据修正后的数据,拼接需要的数据
             List<Map<String, Object>> vList = new ArrayList<>();
-
             for (CorrforeSt a : list) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("id", a.getId());
@@ -570,179 +551,141 @@ public class CorrforeService extends ServiceImpl<CorrforeStMapper, CorrforeSt> {
                 map.put("forecastTime", DateUtil.format(new Date(a.getForecastTime()), "yyyy-MM-dd HH:mm:ss"));
                 map.put("fpValue", a.getFpValue() == null ? "-99" : a.getFpValue());
                 vList.add(map);
-
             }
-
+            // 格式化模板数据
+            writer = new StringWriter();
             velocityContext = new VelocityContext();
             velocityContext.put("stationName", station.getName());
             velocityContext.put("date", DateUtil.format(new Date(), "yyyy-MM-dd"));
             velocityContext.put("vList", vList);
-
-            writer = new StringWriter();
             template.merge(velocityContext, writer);
-
-
+            // 获取文件路径
             File fileUrl = new File(station.getLocalFilePath());
             if (!fileUrl.exists()) {// 判断目录是否存在
                 fileUrl.mkdirs();
             }
-
+            // 获取文件名
             String fileName = "DQ_" + DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyyMMddHHmmss") + "0.RB";
-
             file = new File(station.getLocalFilePath() + File.separatorChar + fileName);
-
-
-            FileOutputStream os = null;
-
-            try {
-                boolean res = file.createNewFile();
-                if (res) {
-                    os = new FileOutputStream(file);
-                    // 采用UTF-8字符集
-                    os.write(writer.toString().getBytes("UTF-8"));
-                    os.flush();
-                } else {
-                    log.warn(station.getStationCode() + " 生成修正DQ文件失败");
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-                log.warn(station.getStationCode() + " 创建修正DQ失败");
-            } finally {
-                if (os != null) {
-                    try {
-                        os.close();
-                    } catch (IOException e) {
-                        log.error("文件生成关闭流失败", e);
-                    }
-                }
-                log.info("执行生成文件完毕:"+station.getLocalFilePath() + File.separatorChar + fileName);
-            }
-
+            // 写入文件
+            result = writeFile(file, station, writer, fileName);
         }
-
-        return file;
+        return result;
     }
 
-
-    public boolean genUs(Station station, JSONObject jsonObject){
+    /**
+     * 生成修正后的超短期文件
+     *
+     * @param station
+     * @param jsonObject
+     * @return
+     */
+    public boolean genUs(Station station, JSONObject jsonObject) {
         boolean result = true;
-
+        // 获取模板
         String vmsPath = SystermUtils.getResourceBasePath() + "/vms/US.vm";
-        File file = null;
         Template template = this.velocityEngine.getTemplate(vmsPath);
+        // 如果
         if (template != null) {
-            VelocityContext velocityContext= new VelocityContext();
-            StringWriter writer;
-
-
-            velocityContext.put("content",  jsonObject.get("data").toString());
-
-            writer = new StringWriter();
-            template.merge(velocityContext, writer);
-
-
-            File fileUrl = new File(station.getLocalFilePath());
-            if (!fileUrl.exists()) {// 判断目录是否存在
-                fileUrl.mkdirs();
-            }
-
-            String fileName = jsonObject.get("fileName").toString() ;
+            // 获取文件名
+            String fileName = jsonObject.get("fileName").toString();
             String[] s = fileName.split("_");
-            String fn = "CDQ_"+s[1]+s[2]+"00.RB";
-            file = new File(station.getLocalFilePath() + File.separatorChar + fn);
-
-
-            FileOutputStream os = null;
-
-            try {
-                boolean res = file.createNewFile();
-                if (res) {
-                    os = new FileOutputStream(file);
-                    // 采用UTF-8字符集
-                    os.write(writer.toString().getBytes("UTF-8"));
-                    os.flush();
-                } else {
-                    result = false;
-                    log.warn(station.getStationCode() + " 生成修正超短期系数文件失败");
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-                result = false;
-                log.warn(station.getStationCode() + " 创建修正超短期系数文件失败");
-            } finally {
-                if (os != null) {
-                    try {
-                        os.close();
-                    } catch (IOException e) {
-                        log.error("文件生成关闭流失败", e);
-                    }
-                }
-                log.info("执行生成文件完毕:"+station.getLocalFilePath() + File.separatorChar + fileName);
-            }
-
+            String fn = "CDQ_" + s[1] + s[2] + "00.RB";
+            File file = new File(station.getLocalFilePath() + File.separatorChar + fn);
+            // 创建文件并写入
+            result = mergeTemplateAndwriteFile(file, station, fileName, template, jsonObject.get("data").toString());
         }
-
         return result;
     }
 
-
-    public boolean genRp(Station station, String content){
+    /**
+     * 生成检修计划文件
+     *
+     * @param station
+     * @param content
+     * @return
+     */
+    public boolean genRp(Station station, String content) {
         boolean result = true;
-
+        // 初始化模板
         String vmsPath = SystermUtils.getResourceBasePath() + "/vms/RP.vm";
-        File file = null;
+        File file;
         Template template = this.velocityEngine.getTemplate(vmsPath);
+        // 如果模板不为空
         if (template != null) {
-            VelocityContext velocityContext= new VelocityContext();
-            StringWriter writer;
-
-
-            velocityContext.put("content", content);
-
-            writer = new StringWriter();
-            template.merge(velocityContext, writer);
-
-
-            File fileUrl = new File(station.getLocalFilePath());
-            if (!fileUrl.exists()) {// 判断目录是否存在
-                fileUrl.mkdirs();
-            }
-
-            String fileName = "JX_"+LocalDateTimeUtil.format(LocalDateTimeUtil.beginOfDay(LocalDateTime.now()),"yyyyMMddHHmmss")+".RB" ;
-
+            // 获取文件名
+            String fileName = "JX_" + LocalDateTimeUtil.format(LocalDateTimeUtil.beginOfDay(LocalDateTime.now()), "yyyyMMddHHmmss") + ".RB";
             file = new File(station.getLocalFilePath() + File.separatorChar + fileName);
+            // 创建文件并写入
+            result = mergeTemplateAndwriteFile(file, station, fileName, template, content);
+        }
+        return result;
+    }
 
+    /**
+     * 写入文件
+     *
+     * @param file
+     * @param station
+     * @return
+     */
+    private boolean mergeTemplateAndwriteFile(File file, Station station, String fileName, Template template, String content) {
+        // 创建模板
+        VelocityContext velocityContext = new VelocityContext();
+        StringWriter writer = new StringWriter();
+        // 放入内容
+        velocityContext.put("content", content);
+        // 写入数据
+        template.merge(velocityContext, writer);
+        return writeFile(file, station, writer, fileName);
+    }
 
-            FileOutputStream os = null;
-
-            try {
-                boolean res = file.createNewFile();
-                if (res) {
-                    os = new FileOutputStream(file);
-                    // 采用UTF-8字符集
-                    os.write(writer.toString().getBytes("UTF-8"));
-                    os.flush();
-                } else {
-                    result = false;
-                    log.warn(station.getStationCode() + " 生成修正超短期系数文件失败");
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
+    /**
+     * 写入文件
+     * @param file
+     * @param station
+     * @param writer
+     * @param fileName
+     * @return
+     */
+    private boolean writeFile(File file, Station station, StringWriter writer, String fileName) {
+        boolean result = true;
+        // 获取文件路径
+        File fileUrl = new File(station.getLocalFilePath());
+        // 判断目录是否存在
+        if (!fileUrl.exists()) {
+            fileUrl.mkdirs();
+        }
+        // 创建流
+        FileOutputStream os = null;
+        try {
+            boolean res = file.createNewFile();
+            // 如果创建成功
+            if (res) {
+                os = new FileOutputStream(file);
+                // 采用UTF-8字符集
+                os.write(writer.toString().getBytes("UTF-8"));
+                os.flush();
+                // 创建文件失败
+            } else {
                 result = false;
-                log.warn(station.getStationCode() + " 创建修正超短期系数文件失败");
-            } finally {
-                if (os != null) {
-                    try {
-                        os.close();
-                    } catch (IOException e) {
-                        log.error("文件生成关闭流失败", e);
-                    }
+                log.warn(station.getStationCode() + "文件名:" + fileName + " 生成失败");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            result = false;
+            log.warn(station.getStationCode() + " 创建" + "文件名:" + fileName + "失败");
+        } finally {
+            // 如果流不为空,关闭流
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    log.error("文件生成关闭流失败", e);
                 }
-                log.info("执行生成文件完毕:"+station.getLocalFilePath() + File.separatorChar + fileName);
             }
-
+            log.info("执行生成文件完毕:" + station.getLocalFilePath() + File.separatorChar + fileName);
+            return result;
         }
-
-        return result;
     }
 }

+ 13 - 3
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/InitRunner.java

@@ -1,12 +1,18 @@
 package com.jiayue.insu.inclientqn.service.client;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import com.jiayue.insu.inclientqn.entity.Station;
 import com.jiayue.insu.inclientqn.permisson.com.ComPermisson;
 import com.jiayue.insu.inclientqn.service.StationService;
+import com.jiayue.insu.inclientqn.util.DateTimeUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 @Component
 public class InitRunner implements CommandLineRunner {
     @Autowired
@@ -17,8 +23,12 @@ public class InitRunner implements CommandLineRunner {
     private BackDataAnalysisService backDataAnalysisService;
     @Override
     public void run(String... args) throws Exception {
-        Station station = stationService.findThis();
-        comPermisson.generateKey(station);
-        backDataAnalysisService.watchFile();
+        List<Station> stationList = stationService.findAll();
+        for(Station station :stationList){
+            comPermisson.generateKey(station);
+        }
+
+        long time = DateTimeUtils.get15min(DateUtil.date().getTime());
+        backDataAnalysisService.watchFile(time);
     }
 }

+ 150 - 80
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/client/RequestDataService.java

@@ -15,20 +15,15 @@ import com.jiayue.insu.inclientqn.model.RequestVo;
 import com.jiayue.insu.inclientqn.model.ResponseVo;
 import com.jiayue.insu.inclientqn.permisson.com.ComPermisson;
 import com.jiayue.insu.inclientqn.service.*;
-import com.jiayue.insu.inclientqn.service.client.BackDataGenService;
 import com.jiayue.insu.inclientqn.util.RequestUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
-
 import java.time.LocalDateTime;
 import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
 import java.util.stream.Collectors;
 
-
 /**
  * @description: 回传数据请求
  * @author: yuanhao
@@ -41,171 +36,261 @@ import java.util.stream.Collectors;
 @RefreshScope
 public class RequestDataService {
 
-
     private final BackDataGenService backDataGenService;
-
     private final BackDataGenBodyService backDataGenBodyService;
-
     private final StationService stationService;
-
     private final ComPermisson comPermisson;
-
     private final RecordService recordService;
-
     private final BackStatDataService backStatDataService;
-
-
     private final BackForeUsForecastDataService backForeUsForecastDataService;
-
     private final BackForeForecastDataService backForeForecastDataService;
 
-
+    /**
+     * 回传统计数据信息
+     *
+     * @param signTime
+     */
     public void requestBackStat(long signTime) {
+        // 获取全部场站
+        List<Station> stationList = stationService.findAll();
+        Record record;
         LocalDateTime localDateTime = LocalDateTimeUtil.of(signTime);
+        // 如果场站大于2个,则为多场站情况
+        if (stationList != null && stationList.size() > 1) {
+            for (Station station : stationList) {
+                record = recordService.findTimeAndTypeAndContentAndStateAndStationCode(localDateTime, CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_STAT_ALL.getCode(), StatusEnum.SUCCESS.getSign(), station.getStationCode());
+                if (record != null) {
+                    return;
+                }
+                this.pullBackStatData(station, localDateTime, signTime);
+            }
+            // 如果只有一个场站
+        } else if (stationList != null && stationList.size() == 1) {
+            record = recordService.findTimeAndTypeAndContentAndState(localDateTime, CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_STAT_ALL.getCode(), StatusEnum.SUCCESS.getSign());
+            if (record != null) {
+                return;
+            }
+            this.pullBackStatData(stationList.get(0), localDateTime, signTime);
+        }
+    }
+
+    /**
+     * 回传统计数据
+     *
+     * @param station
+     * @param localDateTime
+     * @param signTime
+     */
+    public void pullBackStatData(Station station, LocalDateTime localDateTime, long signTime) {
 
         Record record = new Record();
         record.setType(CommonStant.RECORD_TYPE_BACK_DATA);
         record.setTime(localDateTime);
         record.setCreateTime(LocalDateTime.now());
         record.setContent(QNHLEnum.DATA_STAT_ALL.getCode());
+        record.setStationCode(station.getStationCode());
+
 
-        Station station = stationService.findThis();
         StringBuilder stringBuilder = new StringBuilder();
+        // 根据时间获取统计数据
         List<BackStatData> backStatDatas = backStatDataService.findBySignTime(localDateTime);
+        // 如果统计数据不为空
         if (CollectionUtil.isNotEmpty(backStatDatas)) {
+            // 拼接表头
             String header = StrUtil.format(TemplateStant.HEADER_TEMPLATE, station.getSignCode(), DateUtil.parse(DateUtil.now()).toString("yyyy-MM-dd HH:mm:ss"));
             stringBuilder.append(header);
-
+            // 根据统计数据拼接实际功率
             stringBuilder.append(backDataGenBodyService.genStateRealPowerData(backStatDatas));
+            // 根据统计数据拼接实际气象
             stringBuilder.append(backDataGenBodyService.genStateRealWeatherData(station.getType(), backStatDatas));
+            // 根据统计数据拼接短期上报
             stringBuilder.append(backDataGenBodyService.genStateForecastPowerReport(backStatDatas));
+            // 根据统计数据拼接超短期上报
             stringBuilder.append(backDataGenBodyService.genStateUltraShortTermForecastReport(backStatDatas));
-
+            // 组装请求参数
             RequestVo requestVo = RequestVo.UPLOAD_STAT(station.getSignCode(), stringBuilder.toString(), signTime);
-
-            //校验请求数据是否为null  和  token是否有效
+            //校验请求token是否有效
             if (comPermisson.isToken(station)) {
+                // 将请求参数转为jsonString类型
                 JSONObject json = JSONUtil.parseObj(requestVo, true);
                 String body = json.toString();
+                // 发送请求
                 String response = RequestUtils.post(station.getBackurl(), body, station.getComKey());
-
+                // 返回结果校验成功
                 if (RequestUtils.checkResponse(response, record)) {
-
                     ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
                     String code = responseVo.getRetCode();
-
+                    // 如果请求成功
                     if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
-
+                        // 设置日志状态
                         record.setState(StatusEnum.SUCCESS.getSign());
                         record.setStateContent(responseVo.getRetMsg());
-
+                        // 获取统计数据
                         BackStatData backStatData = backStatDatas.get(0);
-
+                        // 设置统计时间
                         backStatData.setBackTime(LocalDateTime.now());
-
+                        backStatData.setStationCode(station.getStationCode());
                         try {
+                            // 保存或更新统计数据
                             backStatDataService.saveOrUpdate(backStatData);
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
-
+                        // 请求失败
                     } else {
+                        // 设置日志状态
                         record.setState(code);
                         record.setStateContent(responseVo.getRetMsg());
                     }
                 }
-
+                // token无效
             } else {
+                // 设置日志状态
                 record.setState(QNHLEnum.PERMISSON_TOKEN_INVALID.getCode());
                 record.setStateContent(QNHLEnum.PERMISSON_TOKEN_INVALID.getMsg());
             }
-
-
-        }else{
+            // 如果统计数据为空
+        } else {
+            // 设置日志状态
             record.setState(StatusEnum.DATA_DEFICIENCY.getCode());
             record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
         }
-
+        // 保存日志信息
         recordService.save(record);
-    }
 
+    }
 
+    /**
+     * 回传短期数据
+     *
+     * @param signTime
+     */
     public void requestBackFore(long signTime) {
+        List<Station> stationList = stationService.findAll();
+
+        Record record;
+        // 是否为ab机
+        boolean abFlag = false;
+        // 如果场站大于2个,则为多场站情况
+        if (stationList != null && stationList.size() > 1) {
+            abFlag = true;
+            // 循环所有场站
+            for (Station station : stationList) {
+                // 查询该场站是否有回传短期记录,如果有则直接返回
+                record = recordService.findTimeAndTypeAndContentAndStateAndStationCode(LocalDateTimeUtil.of(signTime), CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_FORE_ALL.getCode(), StatusEnum.SUCCESS.getSign(), station.getStationCode());
+                if (record != null) {
+                    break;
+                }
+                analysisAndSave(signTime, station, abFlag);
+            }
+        } else if (stationList != null && stationList.size() == 1) {
+            record = recordService.findTimeAndTypeAndContentAndState(LocalDateTimeUtil.of(signTime), CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_FORE_ALL.getCode(), StatusEnum.SUCCESS.getSign());
+            if (record != null) {
+                return;
+            }
+            analysisAndSave(signTime, stationList.get(0), abFlag);
+        }
+    }
+
+    /**
+     * 解析并保存
+     *
+     * @param signTime
+     * @param station
+     * @param abFlag
+     */
+    public void analysisAndSave(long signTime, Station station, boolean abFlag) {
+        // 获取场站信息
+        String stationCode = station.getStationCode();
+        // 获取当天凌晨时间
         LocalDateTime localDateTime = LocalDateTimeUtil.of(signTime);
         LocalDateTime beginDay = LocalDateTimeUtil.beginOfDay(localDateTime);
-
-        Record record = new Record();
-        record.setType(CommonStant.RECORD_TYPE_BACK_DATA);
-        record.setTime(localDateTime);
-        record.setCreateTime(LocalDateTime.now());
-        record.setContent(QNHLEnum.DATA_FORE_ALL.getCode());
-
-        Station station = stationService.findThis();
+        // 初始化记录
+        Record record = new Record(CommonStant.RECORD_TYPE_BACK_DATA, QNHLEnum.DATA_FORE_ALL.getCode(), localDateTime, LocalDateTime.now(), null, null, stationCode);
+        // 需要传输的字符串
         StringBuilder stringBuilder = new StringBuilder();
+        // 格式化表头
         String header = StrUtil.format(TemplateStant.HEADER_TEMPLATE, station.getSignCode(), DateUtil.parse(DateUtil.now()).toString("yyyy-MM-dd HH:mm:ss"));
         stringBuilder.append(header);
+        // 根据时间获取超短期数据
+        List<BackForeUsForecastData> uList;
+        // 根据时间获取短期数据
+        List<BackForeForecastData> list;
+
+        // 如果是场站分AB机的情况
+        if (abFlag) {
+            uList = backForeUsForecastDataService.findBySignTimeAndStationCode(localDateTime, stationCode);
+            list = backForeForecastDataService.findBySignTimeAndStationCode(beginDay, stationCode);
+        } else {
+            uList = backForeUsForecastDataService.findBySignTime(localDateTime);
+            list = backForeForecastDataService.findBySignTime(beginDay);
+        }
 
-        List<BackForeUsForecastData> uList = backForeUsForecastDataService.findBySignTime(localDateTime);
-
-        List<BackForeForecastData> list = backForeForecastDataService.findBySignTime(beginDay);
-
+        // 状态内容
         String stateContent = "";
-
+        // 如果超短期数据不为空
         if (CollectionUtil.isNotEmpty(uList)) {
-            stringBuilder.append(backDataGenBodyService.genForeUltraShortTermForecast(station.getType(),uList));
-
-            uList.forEach(u->u.setBackTime(LocalDateTime.now()));
-            stateContent+="cdq,";
+            // 拼接超短期数据
+            stringBuilder.append(backDataGenBodyService.genForeUltraShortTermForecast(station.getType(), uList));
+            // 设置回传时间
+            uList.forEach(u -> u.setBackTime(LocalDateTime.now()));
+            stateContent += "cdq,";
         }
 
+        // 如果短期数据不为空
         if (CollectionUtil.isNotEmpty(list)) {
             //当数据有回传记录则不再回传
             List<BackForeForecastData> fList = list.stream().filter(b -> b.getBackTime() == null).collect(Collectors.toList());
-            if(CollectionUtil.isNotEmpty(fList)){
+            // 如果有回传时间不为空的数据,拼接短期数据
+            if (CollectionUtil.isNotEmpty(fList)) {
                 stringBuilder.append(backDataGenBodyService.genForeForecast(list));
-                list.forEach(u->u.setBackTime(LocalDateTime.now()));
-                stateContent+="dq,";
+                list.forEach(u -> u.setBackTime(LocalDateTime.now()));
+                stateContent += "dq,";
             }
-
         }
 
+        // 组装请求vo
         RequestVo requestVo = RequestVo.UPLOAD_FORE(station.getSignCode(), stringBuilder.toString(), signTime);
-        //校验请求数据是否为nulltoken是否有效
+        //校验请求数据是否为nulltoken是否有效
         if ((CollectionUtil.isNotEmpty(uList) || CollectionUtil.isNotEmpty(list)) && comPermisson.isToken(station)) {
+            // 将请求数据转为jsonString
             JSONObject json = JSONUtil.parseObj(requestVo, true);
             String body = json.toString();
+            // 发送请求
             String response = RequestUtils.post(station.getBackurl(), body, station.getComKey());
-
+            // 校验请求返回结果
             if (RequestUtils.checkResponse(response, record)) {
-
+                // 将请求结果字符转转为bean
                 ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
                 String code = responseVo.getRetCode();
-
+                // 如果请求成功
                 if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
-
+                    // 设置日志请求状态
                     record.setState(StatusEnum.SUCCESS.getSign());
                     record.setStateContent(stateContent);
-
-
                     try {
+                        // 更新短期超短期数据
                         backForeUsForecastDataService.saveOrUpdateBatch(uList);
                         backForeForecastDataService.saveOrUpdateBatch(list);
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
+                    // 如果请求失败
                 } else {
+                    // 设置日志请求状态
                     record.setState(code);
                     record.setStateContent(responseVo.getRetMsg());
                 }
             }
-
+            //校验请求数据是为null或token无效
         } else {
+            // 设置日志请求状态
             record.setState(StatusEnum.DATA_DEFICIENCY.getSign());
             record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
         }
-
+        // 保存日志记录
         recordService.save(record);
+
     }
 
     /**
@@ -224,10 +309,8 @@ public class RequestDataService {
         record.setCreateTime(LocalDateTime.now());
         record.setContent(qnhlEnum.getCode());
 
-
         Station station = stationService.findThis();
 
-
         List<BackStatData> backStatDatas = backStatDataService.findBySignTime(localDateTime);
 
         RequestVo requestVo = null;
@@ -307,7 +390,6 @@ public class RequestDataService {
             record.setStateContent("token失效或请求体为null");
         }
 
-
         recordService.save(record);
     }
 
@@ -327,7 +409,6 @@ public class RequestDataService {
         record.setCreateTime(LocalDateTime.now());
         record.setContent(qnhlEnum.getCode());
 
-
         Station station = stationService.findThis();
 
         List<BackForeUsForecastData> list = backForeUsForecastDataService.findBySignTime(localDateTime);
@@ -340,7 +421,6 @@ public class RequestDataService {
             e.printStackTrace();
         }
 
-
         if (requestVo != null && comPermisson.isToken(station)) {
             JSONObject json = JSONUtil.parseObj(requestVo, true);
             String body = json.toString();
@@ -371,8 +451,6 @@ public class RequestDataService {
                     record.setStateContent(responseVo.getRetMsg());
                 }
             }
-
-
         } else {
             record.setState(StatusEnum.BACK_DATA_GEN_FAIL.getSign());
             record.setStateContent("token失效或请求体为null");
@@ -381,7 +459,6 @@ public class RequestDataService {
         recordService.save(record);
     }
 
-
     /**
      * 回传短期数据
      *
@@ -399,7 +476,6 @@ public class RequestDataService {
         record.setCreateTime(LocalDateTime.now());
         record.setContent(qnhlEnum.getCode());
 
-
         Station station = stationService.findThis();
 
         List<BackForeForecastData> list = backForeForecastDataService.findBySignTime(beginDay);
@@ -412,7 +488,6 @@ public class RequestDataService {
             e.printStackTrace();
         }
 
-
         if (requestVo != null && comPermisson.isToken(station)) {
             JSONObject json = JSONUtil.parseObj(requestVo, true);
             String body = json.toString();
@@ -437,21 +512,16 @@ public class RequestDataService {
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
-
                 } else {
                     record.setState(code);
                     record.setStateContent(responseVo.getRetMsg());
                 }
             }
-
-
         } else {
             record.setState(StatusEnum.BACK_DATA_GEN_FAIL.getSign());
             record.setStateContent("token失效或请求体为null");
         }
-
         recordService.save(record);
     }
 
-
 }

+ 8 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/BackForeForecastDataServiceImpl.java

@@ -30,4 +30,12 @@ public class BackForeForecastDataServiceImpl extends ServiceImpl<BackForeForecas
         lambdaQueryWrapper.eq(BackForeForecastData::getSignTime,time);
         return this.list(lambdaQueryWrapper);
     }
+
+    @Override
+    public List<BackForeForecastData> findBySignTimeAndStationCode(LocalDateTime time, String stationCode) {
+        LambdaQueryWrapper<BackForeForecastData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(BackForeForecastData::getSignTime,time);
+        lambdaQueryWrapper.eq(BackForeForecastData::getStationCode,stationCode);
+        return this.list(lambdaQueryWrapper);
+    }
 }

+ 8 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/BackForeUsForecastDataServiceImpl.java

@@ -32,4 +32,12 @@ public class BackForeUsForecastDataServiceImpl extends ServiceImpl<BackForeUsFor
         lambdaQueryWrapper.eq(BackForeUsForecastData::getSignTime,time);
         return this.list(lambdaQueryWrapper);
     }
+
+    @Override
+    public List<BackForeUsForecastData> findBySignTimeAndStationCode(LocalDateTime time, String stationCode) {
+        LambdaQueryWrapper<BackForeUsForecastData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(BackForeUsForecastData::getSignTime,time);
+        lambdaQueryWrapper.eq(BackForeUsForecastData::getStationCode,stationCode);
+        return this.list(lambdaQueryWrapper);
+    }
 }

+ 20 - 1
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/RecordServiceImpl.java

@@ -33,7 +33,6 @@ public class RecordServiceImpl extends ServiceImpl<RecordMapper, Record> impleme
         lambdaQueryWrapper.eq(Record::getTime,time);
         lambdaQueryWrapper.eq(Record::getType,type);
         lambdaQueryWrapper.eq(Record::getState,state);
-
         return this.getOne(lambdaQueryWrapper);
     }
 
@@ -44,7 +43,27 @@ public class RecordServiceImpl extends ServiceImpl<RecordMapper, Record> impleme
         lambdaQueryWrapper.eq(Record::getType,type);
         lambdaQueryWrapper.eq(Record::getState,state);
         lambdaQueryWrapper.eq(Record::getContent,content);
+        return this.getOne(lambdaQueryWrapper);
+    }
 
+    @Override
+    public Record findTimeAndTypeAndStateAndStationCode(LocalDateTime time, String type, String state, String StationCode) {
+        LambdaQueryWrapper<Record> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Record::getTime,time);
+        lambdaQueryWrapper.eq(Record::getType,type);
+        lambdaQueryWrapper.eq(Record::getState,state);
+        lambdaQueryWrapper.eq(Record::getStationCode,StationCode);
+        return this.getOne(lambdaQueryWrapper);
+    }
+
+    @Override
+    public Record findTimeAndTypeAndContentAndStateAndStationCode(LocalDateTime time, String type, String content, String state, String StationCode) {
+        LambdaQueryWrapper<Record> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Record::getTime,time);
+        lambdaQueryWrapper.eq(Record::getType,type);
+        lambdaQueryWrapper.eq(Record::getState,state);
+        lambdaQueryWrapper.eq(Record::getContent,content);
+        lambdaQueryWrapper.eq(Record::getStationCode,StationCode);
         return this.getOne(lambdaQueryWrapper);
     }
 }

+ 16 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/service/impl/StationServiceImpl.java

@@ -1,11 +1,14 @@
 package com.jiayue.insu.inclientqn.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.insu.inclientqn.entity.Station;
 import com.jiayue.insu.inclientqn.mapper.StationMapper;
 import com.jiayue.insu.inclientqn.service.StationService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 场站信息业务实现
  *
@@ -21,4 +24,17 @@ public class StationServiceImpl extends ServiceImpl<StationMapper, Station> impl
     public Station findThis() {
         return this.list().get(0);
     }
+
+    @Override
+    public Station findByStationCode(String stationCode) {
+        LambdaQueryWrapper<Station> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Station::getStationCode,stationCode);
+        return this.getOne(lambdaQueryWrapper);
+    }
+
+    @Override
+    public List<Station> findAll() {
+        LambdaQueryWrapper<Station> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        return this.list(lambdaQueryWrapper);
+    }
 }

+ 0 - 3
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/DateTimeUtils.java

@@ -7,12 +7,9 @@ public class DateTimeUtils {
      * @return
      */
    public static long get15min(long time){
-
        if(time%900000L !=0){
            time = time -  time%900000L;
        }
-
        return time;
-
     }
 }

+ 1 - 10
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/RequestUtils.java

@@ -16,7 +16,6 @@ public class RequestUtils {
      */
     public static String post(String url,String body,String token){
         String response = "";
-
         try{
             HttpRequest httpRequest = HttpRequest.post(url)
                     .header("Content-Type", "application/json")
@@ -28,37 +27,29 @@ public class RequestUtils {
         }catch (Exception e){
             e.printStackTrace();
         }
-
-
         return response;
-
     }
 
     /**
-     *
+     * 校验请求返回结果
      * @param response  返回数据
      * @param record 记录
      * @return 是否返回数据正常
      */
-
     public static boolean checkResponse(String response,Record record){
         boolean result = false;
         if (StrUtil.isNotEmpty(response)) {
-
             result = JSONUtil.isJsonObj(response);
             //如果不是json格式
             if(!result){
                 record.setState(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getSign());
                 record.setStateContent(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getMsg());
             }
-
         }else{
             record.setState(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getSign());
             record.setStateContent(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getMsg());
         }
-
         return result;
     }
 
-
 }

+ 24 - 0
in-client-qn/src/main/java/com/jiayue/insu/inclientqn/util/SystermUtils.java

@@ -11,7 +11,9 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Properties;
 
 /**
@@ -109,4 +111,26 @@ public class SystermUtils {
         return ampm;
     }
 
+    /**
+     * 获取指定目录下所有文件夹名称
+     * @param directoryPath
+     * @return
+     */
+    public static List<String> getFileNames(String directoryPath){
+        List<String> fileNames = new ArrayList<>();
+        File directory = new File(directoryPath);
+        // 如果路径有效
+        if (directory.exists() && directory.isDirectory()) {
+            // 过滤出所有文件夹
+            File[] subDirectories = directory.listFiles(File::isDirectory);
+            if (subDirectories != null) {
+                // 将文件夹名称放入list
+                for (File subDirectory : subDirectories) {
+                    fileNames.add(subDirectory.getName());
+                }
+            }
+        }
+        return fileNames;
+    }
+
 }

+ 1 - 0
in-client-qn/src/main/resources/vms/DQ.vm

@@ -3,3 +3,4 @@
 #foreach( $dq in $vList )
 #${velocityCount}	${dq.stationName}	${dq.forecastTime}	${dq.fpValue}
 #end
+</功率预测::${stationName}>