Browse Source

cloud 获取修正数据

yuanhao 2 years ago
parent
commit
4259b815a5

+ 25 - 8
in-cloud/src/main/java/com/jiayue/insu/incloud/compermisson/QNHLComPermisson.java

@@ -6,11 +6,15 @@ import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSON;
 import cn.hutool.json.JSON;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.jiayue.insu.incloud.constants.CommonStant;
 import com.jiayue.insu.incloud.constants.enums.QNHLEnum;
 import com.jiayue.insu.incloud.constants.enums.QNHLEnum;
 import com.jiayue.insu.incloud.constants.vo.ResponseVo;
 import com.jiayue.insu.incloud.constants.vo.ResponseVo;
 import com.jiayue.insu.incloud.entity.IntegrationCompany;
 import com.jiayue.insu.incloud.entity.IntegrationCompany;
+import com.jiayue.insu.incloud.entity.Record;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.service.IntegrationCompanyService;
 import com.jiayue.insu.incloud.service.IntegrationCompanyService;
+import com.jiayue.insu.incloud.service.RecordService;
 import com.jiayue.insu.incloud.service.StationService;
 import com.jiayue.insu.incloud.service.StationService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,10 +40,16 @@ public class QNHLComPermisson implements GeneratePermisson{
     @Autowired
     @Autowired
     private StationService stationService;
     private StationService stationService;
 
 
+    @Autowired
+    private RecordService recordService;
+
     private IntegrationCompany integrationCompany;
     private IntegrationCompany integrationCompany;
 
 
     @Override
     @Override
     public Boolean generateKey(Station station) {
     public Boolean generateKey(Station station) {
+        Record record = new Record();
+        record.setStationCode(station.getStationCode());
+        record.setType(CommonStant.RECORD_TYPE_COM_PERMISSON);
         boolean result = false;
         boolean result = false;
         String username = station.getUsername();
         String username = station.getUsername();
         String password = station.getPassword();
         String password = station.getPassword();
@@ -47,17 +57,18 @@ public class QNHLComPermisson implements GeneratePermisson{
         String auth = username+":"+passwordMD5;
         String auth = username+":"+passwordMD5;
         IntegrationCompany integrationCompany = getIntegrationCompany(station.getInCode());
         IntegrationCompany integrationCompany = getIntegrationCompany(station.getInCode());
         if(integrationCompany!=null){
         if(integrationCompany!=null){
+
+            record.setInCode(integrationCompany.getCode());
+
             String tokenUrl = integrationCompany.getComUrl();
             String tokenUrl = integrationCompany.getComUrl();
             String response;
             String response;
             String token;
             String token;
 
 
-            String requestTime = DateUtil.now();
-            LocalDateTime expirationTime = DateUtil.offsetDay(DateUtil.parse(requestTime), 1).toLocalDateTime();
             try {
             try {
                 HttpRequest httpRequest = HttpRequest.post(tokenUrl)
                 HttpRequest httpRequest = HttpRequest.post(tokenUrl)
                         .header("Content-Type", "application/json")
                         .header("Content-Type", "application/json")
                         .header("Authorization", auth);
                         .header("Authorization", auth);
-                httpRequest.setGlobalTimeout(5000);
+                httpRequest.setGlobalTimeout(20000);
                 response = httpRequest.execute().body();
                 response = httpRequest.execute().body();
                 if(StrUtil.isNotEmpty(response)){
                 if(StrUtil.isNotEmpty(response)){
                     boolean isJson = JSONUtil.isJsonObj(response);
                     boolean isJson = JSONUtil.isJsonObj(response);
@@ -66,11 +77,17 @@ public class QNHLComPermisson implements GeneratePermisson{
                         ResponseVo responseVo = JSONUtil.toBean(response,ResponseVo.class);
                         ResponseVo responseVo = JSONUtil.toBean(response,ResponseVo.class);
                         if(responseVo.getRetCode().equals(QNHLEnum.REQUEST_SUCCESS.getCode())){
                         if(responseVo.getRetCode().equals(QNHLEnum.REQUEST_SUCCESS.getCode())){
                             token = responseVo.getData();
                             token = responseVo.getData();
-                            station.setKey(token);
-                            station.setKeyTime(expirationTime);
-                            stationService.save(station);
-                            result = true;
                             log.info("========== 一体化token请求成功: {} token="+token+"  ==========",station.getStationCode());
                             log.info("========== 一体化token请求成功: {} token="+token+"  ==========",station.getStationCode());
+                            station.setComKey(token);
+                            station.setKeyTime(LocalDateTime.now().plusDays(1));
+                  /*          LambdaUpdateWrapper<Station> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+                            lambdaUpdateWrapper.eq(Station::getId, station.getId())
+                                    .set(Station::getComKey, token)
+                                    .set(Station::getKeyTime,LocalDateTime.now().plusDays(1));*/
+                            stationService.saveOrUpdate(station);
+                            record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
+                            result = true;
+
                         }else{
                         }else{
                             log.error("========== 一体化token请求异常: {} 接收retCode响应码非成功标识T200 标识为"+resultJson.getByPath("retCode")+" "+resultJson.getByPath("retMsg")+" ==========",station.getStationCode());
                             log.error("========== 一体化token请求异常: {} 接收retCode响应码非成功标识T200 标识为"+resultJson.getByPath("retCode")+" "+resultJson.getByPath("retMsg")+" ==========",station.getStationCode());
                             log.info("========== 请求参数 账号密码:"+username+":"+password+" MD5加密:"+ auth +" ==========");
                             log.info("========== 请求参数 账号密码:"+username+":"+password+" MD5加密:"+ auth +" ==========");
@@ -90,7 +107,7 @@ public class QNHLComPermisson implements GeneratePermisson{
         }
         }
 
 
 
 
-
+        recordService.save(record);
         return result;
         return result;
     }
     }
 
 

+ 14 - 2
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/CommonStant.java

@@ -18,8 +18,10 @@ public interface CommonStant {
      */
      */
     String RECORD_TYPE_PULL_CORRECT = "PULL_CORRECT";
     String RECORD_TYPE_PULL_CORRECT = "PULL_CORRECT";
 
 
-
-
+    /**
+     * 日志类型:交互权限
+     */
+    String RECORD_TYPE_COM_PERMISSON = "COM_PERMISSON";
 
 
 
 
     /**
     /**
@@ -47,4 +49,14 @@ public interface CommonStant {
     String ET_PHOTOVOLTAIC = "E1";
     String ET_PHOTOVOLTAIC = "E1";
 
 
     String ET_WIND = "E2";
     String ET_WIND = "E2";
+
+
+    /**
+     * 上午
+     */
+    String AM_DAY ="AM";
+    /**
+     * 下午
+     */
+    String PM_DAY = "PM";
 }
 }

+ 1 - 1
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/QNHLEnum.java

@@ -2,7 +2,7 @@ package com.jiayue.insu.incloud.constants.enums;
 
 
 public enum QNHLEnum {
 public enum QNHLEnum {
 
 
-    REQUEST_SUCCESS("T200","REQUEST_SUCCESS","请求成功"),
+    REQUEST_SUCCESS("T200","success","请求成功"),
 
 
     PERMISSON_TOKEN_EXPIRE("I101","TOKEN_EXPIRE","token已过期"),
     PERMISSON_TOKEN_EXPIRE("I101","TOKEN_EXPIRE","token已过期"),
     PERMISSON_TOKEN_INVALID("I102","TOKEN_INVALID","无效token"),
     PERMISSON_TOKEN_INVALID("I102","TOKEN_INVALID","无效token"),

+ 1 - 1
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/StatusEnum.java

@@ -3,7 +3,7 @@ package com.jiayue.insu.incloud.constants.enums;
 
 
 public enum StatusEnum {
 public enum StatusEnum {
     SUCCESS("success","success","成功"),
     SUCCESS("success","success","成功"),
-    RESPONSE_FAIL("response_fail","response_fail","请求失败,响应错误"),
+    RESPONSE_FAIL("response_fail","response_fail","请求失败,响应错误"),
     DOWNLOAD_FILE_FAIL("response_fail","response_fail","下载文件失败"),
     DOWNLOAD_FILE_FAIL("response_fail","response_fail","下载文件失败"),
     DOWNLOAD_FILE_ERROR("response_fail","response_fail","下载文件异常"),
     DOWNLOAD_FILE_ERROR("response_fail","response_fail","下载文件异常"),
     FILE_NULL("file_null","file_null","文件为空"),
     FILE_NULL("file_null","file_null","文件为空"),

+ 43 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/controller/TestController.java

@@ -2,10 +2,14 @@ package com.jiayue.insu.incloud.controller;
 
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
 import com.jiayue.insu.common.core.util.R;
 import com.jiayue.insu.common.core.util.R;
+import com.jiayue.insu.incloud.compermisson.QNHLComPermisson;
 import com.jiayue.insu.incloud.entity.Quartz;
 import com.jiayue.insu.incloud.entity.Quartz;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.entity.Station;
+import com.jiayue.insu.incloud.pulldata.PullCorrectDataForQNHL;
 import com.jiayue.insu.incloud.pulldata.PullInitData;
 import com.jiayue.insu.incloud.pulldata.PullInitData;
+import com.jiayue.insu.incloud.pushdata.PushDataForQNHL;
 import com.jiayue.insu.incloud.quartz.ScheduledTask;
 import com.jiayue.insu.incloud.quartz.ScheduledTask;
+import com.jiayue.insu.incloud.service.StationService;
 import org.quartz.SchedulerException;
 import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -26,6 +30,14 @@ public class TestController {
     ScheduledTask scheduledTask;
     ScheduledTask scheduledTask;
     @Autowired
     @Autowired
     PullInitData pullInitData;
     PullInitData pullInitData;
+
+    @Autowired
+    PushDataForQNHL pushDataForQNHL;
+    @Autowired
+    StationService stationService;
+    @Autowired
+    PullCorrectDataForQNHL pullCorrectDataForQNHL;
+
     @GetMapping("/job")
     @GetMapping("/job")
     public R testJob() throws ClassNotFoundException, SchedulerException, ParseException {
     public R testJob() throws ClassNotFoundException, SchedulerException, ParseException {
         scheduledTask.deleteJob("testJob2");
         scheduledTask.deleteJob("testJob2");
@@ -49,4 +61,35 @@ public class TestController {
         pullInitData.pullDQAndNWPData(station);
         pullInitData.pullDQAndNWPData(station);
         return R.ok();
         return R.ok();
     }
     }
+
+
+
+    @GetMapping("/init")
+    public R testInit() {
+        Station j00243 = stationService.findByStationCode("J00243");
+        pullInitData.pullDQAndNWPData(j00243);
+        return R.ok();
+    }
+
+    @GetMapping("/push")
+    public R testPush()  {
+        Station j00243 = stationService.findByStationCode("J00243");
+        pushDataForQNHL.pushDQAndNWPData(j00243);
+        return R.ok();
+    }
+
+    @GetMapping("/pull")
+    public R testPull(){
+        Station j00243 = stationService.findByStationCode("J00243");
+        pullCorrectDataForQNHL.pullDQAndNWPData(j00243);
+        return R.ok();
+    }
+    @Autowired
+    QNHLComPermisson qnhlComPermisson;
+    @GetMapping("/token")
+    public R testToken(){
+        Station j00243 = stationService.findByStationCode("J00243");
+        qnhlComPermisson.generateKey(j00243);
+        return R.ok();
+    }
 }
 }

+ 1 - 1
in-cloud/src/main/java/com/jiayue/insu/incloud/entity/IntegrationCompany.java

@@ -12,7 +12,7 @@ import lombok.Data;
  * @version 1.0
  * @version 1.0
  * @since 2022/5/25 16:22
  * @since 2022/5/25 16:22
  */
  */
-@TableName(value = "in_quartz")
+@TableName(value = "in_company")
 @Data
 @Data
 public class IntegrationCompany extends  BaseEntity{
 public class IntegrationCompany extends  BaseEntity{
 
 

+ 1 - 1
in-cloud/src/main/java/com/jiayue/insu/incloud/entity/Station.java

@@ -50,7 +50,7 @@ public class Station extends BaseEntity {
     /**
     /**
      * 通讯key
      * 通讯key
      */
      */
-    String key;
+    String comKey;
     /**
     /**
      * 状态
      * 状态
      */
      */

+ 29 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/job/data/pull/PullCorrectDataJob.java

@@ -0,0 +1,29 @@
+package com.jiayue.insu.incloud.job.data.pull;
+
+import com.jiayue.insu.incloud.entity.Station;
+import com.jiayue.insu.incloud.pulldata.PullCorrectDataForQNHL;
+import com.jiayue.insu.incloud.pulldata.PullInitData;
+import com.jiayue.insu.incloud.service.StationService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class PullCorrectDataJob implements Job {
+
+
+    @Autowired
+    PullCorrectDataForQNHL pullCorrectDataForQNHL;
+    @Autowired
+     private StationService stationService;
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        String stationCode  = jobExecutionContext.getTrigger().getJobKey().getName();
+        Station one = stationService.findByStationCode(stationCode);
+        if (one != null) {
+            pullCorrectDataForQNHL.pullDQAndNWPData(one);
+        }
+
+
+    }
+}

+ 0 - 1
in-cloud/src/main/java/com/jiayue/insu/incloud/job/data/pull/PullInitDataJob.java

@@ -1,6 +1,5 @@
 package com.jiayue.insu.incloud.job.data.pull;
 package com.jiayue.insu.incloud.job.data.pull;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.pulldata.PullInitData;
 import com.jiayue.insu.incloud.pulldata.PullInitData;
 import com.jiayue.insu.incloud.service.StationService;
 import com.jiayue.insu.incloud.service.StationService;

+ 541 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/pulldata/PullCorrectDataForQNHL.java

@@ -0,0 +1,541 @@
+package com.jiayue.insu.incloud.pulldata;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.jiayue.insu.incloud.compermisson.QNHLComPermisson;
+import com.jiayue.insu.incloud.constants.CommonStant;
+import com.jiayue.insu.incloud.constants.CompanyConstant;
+import com.jiayue.insu.incloud.constants.enums.QNHLEnum;
+import com.jiayue.insu.incloud.constants.enums.StatusEnum;
+import com.jiayue.insu.incloud.constants.vo.RequestVo;
+import com.jiayue.insu.incloud.constants.vo.ResponseVo;
+import com.jiayue.insu.incloud.entity.ForecastData;
+import com.jiayue.insu.incloud.entity.IntegrationCompany;
+import com.jiayue.insu.incloud.entity.Record;
+import com.jiayue.insu.incloud.entity.Station;
+import com.jiayue.insu.incloud.service.ForecastDataService;
+import com.jiayue.insu.incloud.service.IntegrationCompanyService;
+import com.jiayue.insu.incloud.service.RecordService;
+import com.jiayue.insu.incloud.service.StationService;
+import com.jiayue.insu.incloud.utils.SystermUtils;
+import io.minio.MinioClient;
+import io.minio.PutObjectOptions;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class PullCorrectDataForQNHL implements IPullInitCorrectData{
+
+    @Autowired
+    private ForecastDataService forecastDataService;
+    @Autowired
+    private StationService stationService;
+    @Autowired
+    private IntegrationCompanyService integrationCompanyService;
+    @Autowired
+    private QNHLComPermisson qNHLComPermisson;
+
+    @Autowired
+    private RecordService recordService;
+    @Autowired
+    private  VelocityEngine velocityEngine;
+
+    @Value("${minio.fileurl}")
+    String fileurl;
+
+    @Value("${minlo.logurl}")
+    private String logurl;
+
+    @Value("${minlo.host}")
+    private String minloHost;
+
+    @Value("${minlo.user}")
+    private String minloUser;
+
+    @Value("${minlo.pwd}")
+    private String minloPwd;
+
+    @Override
+    public Boolean pullDQAndNWPData(Station station) {
+
+        Record record = new Record();
+        record.setStationCode(station.getStationCode());
+        record.setInCode(station.getInCode());
+        record.setType(CommonStant.RECORD_TYPE_PULL_CORRECT);
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        record.setTime(localDateTime);
+        record.setCreateTime(LocalDateTime.now());
+
+        Station st = stationService.findByStationCode(station.getStationCode());
+        String token  = st.getComKey();
+        LocalDateTime tokenTime  = st.getKeyTime();
+
+        IntegrationCompany integrationCompany = integrationCompanyService.findByCode(CompanyConstant.COMPANY_QNHL);
+        String dataPullUrl = integrationCompany.getPullUrl();
+
+
+
+        boolean result =false;
+        String response;
+        RequestVo requestVo;
+        List<ForecastData> list = new ArrayList<>();
+
+        if (StrUtil.isEmpty(token)  || LocalDateTime.now().isAfter(tokenTime)) {
+            if(qNHLComPermisson.generateKey(station)){
+                st = stationService.findByStationCode(station.getStationCode());
+                token  = st.getComKey();
+                tokenTime  = st.getKeyTime();
+            }
+        }
+
+        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();
+
+                JSONObject json = JSONUtil.parseObj(requestVo, true);
+                String body = json.toString();
+
+                HttpRequest httpRequest = HttpRequest.post(dataPullUrl)
+                        .header("Content-Type", "application/json")
+                        .header("Authorization", token);
+                httpRequest.setGlobalTimeout(20000);
+                response = httpRequest
+                        .body(body)
+                        .execute().body();
+
+                if (StrUtil.isNotEmpty(response)) {
+                    boolean isJson = JSONUtil.isJsonObj(response);
+                    if (isJson) {
+                        ResponseVo responseVo = JSONUtil.toBean(response, ResponseVo.class);
+                        String code = responseVo.getRetCode();
+                        if (code.equals(QNHLEnum.REQUEST_SUCCESS.getCode())) {
+
+                            List<ForecastData> aList = new ArrayList<>();
+                            long startTime = DateUtil.beginOfDay(new Date()).getTime();
+                            long endTime = DateUtil.offsetDay(new Date(startTime), 10).getTime();
+                            aList = forecastDataService.findTimeByStation(station.getStationCode(), startTime, endTime);
+                            log.info(station.getStationCode() + " 请求短期修正数据返回内容:{}", response);
+
+                            String dataContent = responseVo.getData();
+                            if (!dataContent.contains("NULL") && !dataContent.contains("null")) {
+
+                                try {
+
+                                    if (CommonStant.ET_PHOTOVOLTAIC.equals(st.getType())) {
+                                        list = correctPhotovoltaicData(responseVo.getData());
+
+                                    } else {
+                                        list = correctWindData(responseVo.getData());
+                                    }
+
+                                    /**************检测解析数据完整性*******************/
+                                    if (list.size() < 961) {
+                                        record.setState(StatusEnum.DATA_DEFICIENCY.getCode());
+                                        record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
+                                        log.warn( "========== {}:{} ==> 请求短期修正数据缺数: {}" ,integrationCompany.getName(),st.getStationCode(),list.size());
+                                    } else {
+                                        result = true;
+                                        for (ForecastData a : aList) {
+                                            List<ForecastData> collect = list.stream().filter(n -> n.getForecastTime().longValue() == a.getForecastTime().longValue()).collect(Collectors.toList());
+                                            if (CollectionUtil.isNotEmpty(collect)) {
+                                                ForecastData correct = collect.get(0);
+                                                a.setCorrectTime(LocalDateTime.now());
+                                                a.setFpValueCorrect(correct.getFpValueCorrect());
+                                                a.setSwrCorrect(correct.getSwrCorrect());
+                                                a.setDirectRadiationCorrect(correct.getDirectRadiationCorrect());
+                                                a.setDiffuseRadiationCorrect(correct.getDiffuseRadiationCorrect());
+                                                a.setWindSpeedCorrect(correct.getWindSpeedCorrect());
+                                                a.setWindDirCorrect(correct.getWindDirCorrect());
+                                                a.setTemperatureCorrect(correct.getTemperatureCorrect());
+                                                a.setHumidityCorrect(correct.getHumidityCorrect());
+                                                a.setPressureCorrect(correct.getPressureCorrect());
+
+                                            } else {
+                                                record.setState(StatusEnum.DATA_DEFICIENCY.getCode());
+                                                record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
+                                                log.warn( "========== {}:{} ==> 请求短期修正数据缺数: {}" ,integrationCompany.getName(),st.getStationCode(),list.size());
+                                                break;
+                                            }
+                                        }
+
+                                    }
+                                    /**************检测解析数据完整性*******************/
+
+                                } catch (Exception e) {
+                                    record.setState(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getSign());
+                                    record.setStateContent("解析失败");
+                                    log.error("=========={}:{} ==> 解析短期修正数据失败 " ,integrationCompany.getName(),st.getStationCode());
+                                }
+                            } else {
+                                record.setState(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getSign());
+                                record.setStateContent(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getMsg());
+                                log.error("=========={}:{} ==>拉取短期修正数据失败  返回响应存在NULL ==========" ,integrationCompany.getName(),st.getStationCode());
+                            }
+
+
+                            if (result) {
+                                log.info("=========={}:{} ==> 拉取短期修正数据成功! ==========" ,integrationCompany.getName(),st.getStationCode());
+                                record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
+                                record.setStateContent(QNHLEnum.REQUEST_SUCCESS.getMsg());
+                                boolean b = forecastDataService.saveOrUpdateBatch(aList);
+                                if(b){
+                                    File file = genFile(station);
+                                    if(file!=null){
+                                        boolean isUpload = uploadFile(station.getStationCode() + "/" + file.getName(), file, station.getStationCode());
+                                    }
+                                }
+
+                            }
+
+                        } else {
+
+                        }
+                    } else {
+                        record.setState(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getSign());
+                        record.setStateContent(StatusEnum.CONNECT_RESPONSE_FORMAT_ERROR.getMsg());
+                        log.error("=========={}:{} ==>拉取短期修正数据失败 接收响应字符串非json格式 " ,integrationCompany.getName(),st.getStationCode());
+                    }
+                } else {
+                    record.setState(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getSign());
+                    record.setStateContent(StatusEnum.CONNECT_RESPONSE_CONTENT_NULL.getMsg());
+                    log.error("=========={}:{} ==> 拉取短期修正数据失败  返回响应内容为空 ==========" ,integrationCompany.getName(),st.getStationCode());
+                }
+
+            } catch (Exception e) {
+                record.setState(StatusEnum.CONNECT_ERROR.getSign());
+                record.setStateContent(StatusEnum.CONNECT_ERROR.getMsg());
+                log.error("=========={}:{} ==>请求短期修正数据失败 连接断开或请求超时 ==========",integrationCompany.getName(),st.getStationCode());
+                e.printStackTrace();
+
+            }
+        }
+        recordService.save(record);
+        return result;
+
+    }
+
+    @Override
+    public Boolean pullDQData(Station station) {
+        return null;
+    }
+
+    @Override
+    public Boolean pullNWPData(Station station) {
+        return null;
+    }
+
+
+    /**
+     * 生成文件
+     *
+     * @return
+     */
+    public File genFile(Station station) {
+
+        String vmsPath = SystermUtils.getResourceBasePath() + "/vms/DQAMEND.vm";
+        File file = null;
+        Template template = this.velocityEngine.getTemplate(vmsPath);
+        if (template != null) {
+            VelocityContext velocityContext;
+            StringWriter writer;
+
+            long startTime = DateUtil.beginOfDay(new Date()).getTime();
+            long endTime = DateUtil.offsetDay(new Date(startTime), 10).getTime();
+            List<ForecastData> aList = new ArrayList<>();
+            aList = forecastDataService.findTimeByStation( station.getStationCode(), startTime, endTime);
+            aList.sort(Comparator.comparing(ForecastData::getForecastTime));
+            List<Map<String, Object>> vList = new ArrayList<>();
+
+            for (ForecastData a : aList) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", a.getId());
+                map.put("forecastTime", DateUtil.format(new Date(a.getForecastTime()), "yyyyMMddHHmmss"));
+                map.put("fpValue", a.getFpValue() == null ? "-99" : a.getFpValue());
+                map.put("fpValueAmend", a.getFpValueCorrect() == null ? "-99" : a.getFpValueCorrect());
+                map.put("swr", a.getSwr() == null ? "-99" : a.getSwr());
+                map.put("swrAmend", a.getSwrCorrect() == null ? "-99" : a.getSwrCorrect());
+                map.put("directRadiation", a.getDirectRadiation() == null ? "-99" : a.getDirectRadiation());
+                map.put("directRadiationAmend", a.getDirectRadiationCorrect() == null ? "-99" : a.getDirectRadiationCorrect());
+                map.put("diffuseRadiation", a.getDiffuseRadiation() == null ? "-99" : a.getDiffuseRadiation());
+                map.put("diffuseRadiationAmend", a.getDiffuseRadiationCorrect() == null ? "-99" : a.getDiffuseRadiationCorrect());
+                map.put("windspeed", a.getWindSpeed() == null ? "-99" : a.getWindSpeed());
+                map.put("windspeedAmend", a.getWindSpeedCorrect() == null ? "-99" : a.getWindSpeedCorrect());
+                map.put("windDir", a.getWindDir() == null ? "-99" : a.getWindDir());
+                map.put("windDirAmend", a.getWindDirCorrect() == null ? "-99" : a.getWindDirCorrect());
+                map.put("temperature", a.getTemperature() == null ? "-99" : a.getTemperature());
+                map.put("temperatureAmend", a.getTemperatureCorrect() == null ? "-99" : a.getTemperatureCorrect());
+                map.put("humidity", a.getHumidity() == null ? "-99" : a.getHumidity());
+                map.put("humidityAmend", a.getHumidityCorrect() == null ? "-99" : a.getHumidityCorrect());
+                map.put("pressure", a.getPressure() == null ? "-99" : a.getPressure());
+                map.put("pressureAmend", a.getPressureCorrect() == null ? "-99" : a.getPressureCorrect());
+                vList.add(map);
+
+            }
+
+            velocityContext = new VelocityContext();
+            velocityContext.put("sign", "signCode");
+
+            velocityContext.put("uploadTime", DateUtil.format(new Date(), "yyyy-MM-dd"));
+            velocityContext.put("vList", vList);
+
+            writer = new StringWriter();
+            template.merge(velocityContext, writer);
+
+            String fUrl = fileurl + File.separatorChar + station.getStationCode();
+            log.info(fUrl);
+            File fileUrl = new File(fUrl);
+            if (!fileUrl.exists()) {// 判断目录是否存在
+                fileUrl.mkdirs();
+            }
+
+            String fileName = "AMENDFORECAST_" + DateUtil.format(new Date(), "yyyyMMddHHmm") + ".RB";
+
+            file = new File(fUrl + 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() + " 生成minlo文件失败");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+                log.warn(station.getStationCode() + " 创建minlo文件失败");
+            } finally {
+                if (os != null) {
+                    try {
+                        os.close();
+                    } catch (IOException e) {
+                        log.error("文件生成关闭流失败", e);
+                    }
+                }
+            }
+
+        }
+
+        return file;
+    }
+
+    /**
+     * 上传文件
+     *
+     * @return
+     */
+    public boolean uploadFile(String filePath, File file, String stationCode) {
+        boolean status = false;
+        try {
+            MinioClient minioClient = new MinioClient(minloHost, minloUser, minloPwd, false);
+
+            // 检查存储桶是否已经存在
+            boolean isExist = minioClient.bucketExists("forcast");
+            if (!isExist) {
+                // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
+                minioClient.makeBucket("forcast");
+            }
+
+            // 使用putObject上传一个文件到存储桶中。
+            minioClient.putObject("forcast", filePath, FileUtil.getInputStream(file), new PutObjectOptions(file.length(), -1));
+
+            Map<String, Object> parmer = new HashMap<>();
+            parmer.put("stationCode", stationCode);
+            parmer.put("fileName", file.getName());
+            String s = JSONUtil.toJsonStr(parmer);
+            String response = "";
+
+            response = HttpUtil.post(logurl, parmer);
+            if (StringUtils.isNotEmpty(response)) {
+                boolean isJson = JSONUtil.isJsonObj(response);
+                if (isJson) {
+                    JSONObject jsonObject = JSONUtil.parseObj(response);
+                    String code = jsonObject.getStr("code");
+                    if (code.equals("0")) {
+                        status = true;
+                    } else {
+                        log.warn(stationCode + " minlo上送日志响应不为0");
+                    }
+                } else {
+                    log.warn(stationCode + " minlo上送日志响应格式不对");
+                }
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("文件上传存储服务器失败" + filePath, e);
+        }
+
+        return status;
+    }
+
+
+    /**
+     * 光伏数据解析
+     *
+     * @param data 待解析数据
+     * @return
+     * @throws Exception
+     */
+    public List<ForecastData> correctPhotovoltaicData(String data) throws Exception {
+
+        String[] content = data.split("\n");
+
+
+        String dateStr = content[0].split("'")[1];
+
+        List<ForecastData> list = new ArrayList<>();
+
+
+        for (int i = 3; i < content.length - 1; i++) {
+
+            ForecastData inForecastPowerShortTerm = new ForecastData();
+            String column = content[i];
+
+            String[] datas = column.split(CommonStant.SPACE1_CONSTANT);
+
+            inForecastPowerShortTerm.setForecastTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").getTime());
+
+            inForecastPowerShortTerm.setFpValueCorrect(isNumber(datas[3]));
+
+            inForecastPowerShortTerm.setSwrCorrect(isNumber(datas[4]));
+
+            inForecastPowerShortTerm.setDirectRadiationCorrect(isNumber(datas[5]));
+
+            inForecastPowerShortTerm.setDiffuseRadiationCorrect(isNumber(datas[6]));
+
+            inForecastPowerShortTerm.setTemperatureCorrect(isNumber(datas[7]));
+
+            inForecastPowerShortTerm.setHumidityCorrect(isNumber(datas[8]));
+
+            inForecastPowerShortTerm.setPressureCorrect(isNumber(datas[9]));
+
+            inForecastPowerShortTerm.setWindSpeedCorrect(isNumber(datas[10]));
+
+            inForecastPowerShortTerm.setWindDirCorrect(isNumber(datas[11]));
+
+            inForecastPowerShortTerm.setCorrectTime(LocalDateTime.now());
+
+            list.add(inForecastPowerShortTerm);
+        }
+
+        return list;
+
+    }
+
+    /**
+     * 风电数据解析
+     *
+     * @param data 待解析数据
+     * @return 解析数据
+     * @throws Exception
+     */
+    public List<ForecastData> correctWindData(String data) throws Exception {
+
+        String[] content = data.split("\n");
+
+
+        String dateStr = content[0].split("'")[1];
+
+        List<ForecastData> list = new ArrayList<>();
+
+
+        if (content[1].contains("CorrectForecast")) {
+
+
+            for (int i = 3; i < content.length - 1; i++) {
+
+                ForecastData inForecastPowerShortTerm = new ForecastData();
+                String column = content[i];
+
+                String[] datas = column.split(CommonStant.SPACE1_CONSTANT);
+
+                inForecastPowerShortTerm.setForecastTime(DateUtil.parse(datas[2], "yyyyMMddHHmmss").getTime());
+
+                inForecastPowerShortTerm.setFpValueCorrect(isNumber(datas[3]));
+
+                inForecastPowerShortTerm.setWindSpeedCorrect(isNumber(datas[4]));
+
+                inForecastPowerShortTerm.setWindDirCorrect(isNumber(datas[5]));
+
+                inForecastPowerShortTerm.setTemperatureCorrect(isNumber(datas[6]));
+
+                inForecastPowerShortTerm.setHumidityCorrect(isNumber(datas[7]));
+
+                inForecastPowerShortTerm.setPressureCorrect(isNumber(datas[8]));
+
+                inForecastPowerShortTerm.setCorrectTime(LocalDateTime.now());
+
+                list.add(inForecastPowerShortTerm);
+            }
+        } else {
+            log.error("解析一体化修正短期异常:{}", "标识错误不为<CorrectForecast>");
+
+        }
+
+
+        return list;
+
+    }
+
+    /**
+     * 判断是否是数值
+     *
+     * @param data
+     * @return
+     */
+    public BigDecimal isNumber(String data) {
+        BigDecimal bigDecimal = null;
+        Pattern pattern = Pattern.compile("-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?");
+        Matcher isNum = pattern.matcher(data);
+        try {
+            if (isNum.matches()) {
+                bigDecimal = new BigDecimal(data).setScale(2, BigDecimal.ROUND_DOWN);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+        return bigDecimal;
+    }
+
+
+}

+ 3 - 3
in-cloud/src/main/java/com/jiayue/insu/incloud/pulldata/PullInitData.java

@@ -41,11 +41,11 @@ public class PullInitData implements IPullInitForecastData{
     private RecordService recordService;
     private RecordService recordService;
     @Autowired
     @Autowired
     private ForecastDataService forecastDataService;
     private ForecastDataService forecastDataService;
-    @Value("${pull.url}")
+    @Value("${minio.pull.url}")
     String url;
     String url;
-    @Value("${pull.fileurl}")
+    @Value("${minio.pull.fileurl}")
     String fileurl;
     String fileurl;
-    @Value("${pull.fileDir}")
+    @Value("${minio.pull.fileDir}")
     String fileDir;
     String fileDir;
     @Override
     @Override
     public Boolean pullDQAndNWPData(Station station) {
     public Boolean pullDQAndNWPData(Station station) {

+ 3 - 3
in-cloud/src/main/java/com/jiayue/insu/incloud/pushdata/PushDataForQNHL.java

@@ -66,7 +66,7 @@ public class PushDataForQNHL implements IPushInitForecastData {
         record.setCreateTime(LocalDateTime.now());
         record.setCreateTime(LocalDateTime.now());
 
 
         Station st = stationService.findByStationCode(station.getStationCode());
         Station st = stationService.findByStationCode(station.getStationCode());
-        String token  = st.getKey();
+        String token  = st.getComKey();
         LocalDateTime tokenTime  = st.getKeyTime();
         LocalDateTime tokenTime  = st.getKeyTime();
 
 
         IntegrationCompany integrationCompany = integrationCompanyService.findByCode(CompanyConstant.COMPANY_QNHL);
         IntegrationCompany integrationCompany = integrationCompanyService.findByCode(CompanyConstant.COMPANY_QNHL);
@@ -81,7 +81,7 @@ public class PushDataForQNHL implements IPushInitForecastData {
         if (StrUtil.isEmpty(token)  || LocalDateTime.now().isAfter(tokenTime)) {
         if (StrUtil.isEmpty(token)  || LocalDateTime.now().isAfter(tokenTime)) {
             if(qNHLComPermisson.generateKey(station)){
             if(qNHLComPermisson.generateKey(station)){
                 st = stationService.findByStationCode(station.getStationCode());
                 st = stationService.findByStationCode(station.getStationCode());
-                token  = st.getKey();
+                token  = st.getComKey();
                 tokenTime  = st.getKeyTime();
                 tokenTime  = st.getKeyTime();
             }
             }
         }
         }
@@ -149,7 +149,7 @@ public class PushDataForQNHL implements IPushInitForecastData {
                                     for (ForecastData a : aList) {
                                     for (ForecastData a : aList) {
                                         a.setUploadTime(LocalDateTime.now());
                                         a.setUploadTime(LocalDateTime.now());
                                     }
                                     }
-                                    forecastDataService.saveBatch(aList);
+                                    forecastDataService.saveOrUpdateBatch(aList);
                                     record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
                                     record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
                                     result = true;
                                     result = true;
                                     log.info("=========={}:{} ==>上送短期原始数据成功  {}条==========",integrationCompany.getName(), st.getStationCode(), aList.size());
                                     log.info("=========={}:{} ==>上送短期原始数据成功  {}条==========",integrationCompany.getName(), st.getStationCode(), aList.size());

+ 112 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/utils/SystermUtils.java

@@ -0,0 +1,112 @@
+package com.jiayue.insu.incloud.utils;
+
+import cn.hutool.core.date.DateUtil;
+
+import com.jiayue.insu.incloud.constants.CommonStant;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.ResourceUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Date;
+import java.util.Properties;
+
+/**
+ * @description:
+ * @author: yuanhao
+ * @createDate: 2021/9/27
+ * @version: 1.0
+ */
+@Slf4j
+public class SystermUtils {
+
+    public static Properties props = System.getProperties();
+    public static String osName = props.getProperty("os.name");
+
+    /**
+     * 功能描述: 判断文件夹是否存在
+     *
+     * @param:
+     * @return:
+     * @auther: bizy
+     * @date: 2018/7/18 15:47 下午
+     */
+    public static String judeDirExists(String path) {
+        try {
+
+            if (osName.indexOf("Windows") > -1) {
+                path = path.replaceAll("/", "\\\\");
+            } else {
+                path = path.replaceAll("\\\\", "/");
+                path = "/" + path;
+            }
+
+            File file = new File(path);
+
+            if (file.exists()) {
+                if (file.isDirectory()) {
+                    log.debug("dir exists");
+                } else {
+                    log.debug("the same name file exists, can not create dir");
+                }
+            } else {
+                log.debug("dir not exists, create it ...");
+                File parent = file.getParentFile(); // 获取父文件
+                if (!parent.exists()) {
+                    parent.mkdirs(); //创建所有父文件夹
+                }
+                file.mkdir();
+
+                if (osName.indexOf("Windows") <= -1) {
+                    Runtime.getRuntime().exec("chmod 777 -R " + path);//ftp服务器在linux环境中,生成的文件涉及到读写权限问题,直接给777权限
+                }
+            }
+            log.info("path:" + path);
+        } catch (IOException e) {
+            log.error("系统错误:" + e.getMessage(), e);
+        } finally {
+            return path;
+        }
+    }
+
+
+    public static String getResourceBasePath() {
+        // 获取跟目录
+        File path = null;
+        try {
+            path = new File(ResourceUtils.getURL("classpath:").getPath());
+
+        } catch (FileNotFoundException e) {
+            // nothing to do
+        }
+        if (path == null || !path.exists()) {
+            path = new File("");
+        }
+
+        String pathStr = path.getAbsolutePath();
+        try {
+            pathStr = URLDecoder.decode(pathStr, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        // 如果是在eclipse中运行,则和target同级目录,如果是jar部署到服务器,则默认和jar包同级
+//    pathStr = pathStr.replace("\\target\\classes", "");
+
+        return pathStr;
+    }
+
+
+    public static String AMPM() {
+        String ampm = CommonStant.AM_DAY;
+        boolean am = DateUtil.isAM(new Date());
+        if (!am) {
+            ampm = CommonStant.PM_DAY;
+        }
+
+        return ampm;
+    }
+
+}

+ 13 - 4
in-cloud/src/main/resources/bootstrap.yml

@@ -44,10 +44,19 @@ spring:
               user: root
               user: root
               password: root
               password: root
 
 
-pull:
-  url: https://117.78.19.70:9010/client/getFileLogsForAio/
-  fileurl: https://117.78.19.70:9010/client/getFileById?id=
-  fileDir: D:\\fileInit\\temp
+
+
+minlo:
+  pull:
+    url: https://117.78.19.70:9010/client/getFileLogsForAio/
+    fileurl: https://117.78.19.70:9010/client/getFileById?id=
+    fileDir: D:\\fileInit\\temp
+
+  fileurl: D:\\fileInit\\minlo
+  host: http://api.jiayuepowertech.com:9013
+  user: minio
+  pwd: yanfa*3377
+  logurl: http://117.78.19.70:9009/client/saveFileLogsForAio
 
 
 logging:
 logging:
   config: classpath:logback.xml
   config: classpath:logback.xml

+ 8 - 0
in-cloud/src/main/resources/vms/DQAMEND.vm

@@ -0,0 +1,8 @@
+<! Entity=${sign}  type=AMEND  time='${uploadTime}' !>
+
+<ShortTermForcastAmend>
+@id 时间 预测功率 预测功率修 总辐射 总辐射修 直辐射 直辐射修 散辐射 散辐射修 风速 风速修 风向 风向修 气温 气温修 湿度 湿度修 压力 压力修
+#foreach( $dq in $vList )
+#${velocityCount}	${dq.forecastTime}	${dq.fpValue}	${dq.fpValueAmend}	${dq.swr}	${dq.swrAmend}	${dq.directRadiation}	${dq.directRadiationAmend}	${dq.diffuseRadiation}	${dq.diffuseRadiationAmend}	${dq.windspeed}	${dq.windspeedAmend}	${dq.windDir}	${dq.windDirAmend}	${dq.temperature}	${dq.temperatureAmend}	${dq.humidity}	${dq.humidityAmend}	${dq.pressure}	${dq.pressureAmend}
+#end
+</ShortTermForcastAmend>