Ver código fonte

cloud 上送数据

yuanhao 3 anos atrás
pai
commit
30e6477a74
18 arquivos alterados com 645 adições e 29 exclusões
  1. 2 5
      in-client-qn-ui/src/views/vab/table/index.vue
  2. 0 2
      in-cloud/src/main/java/com/jiayue/insu/incloud/compermisson/GeneratePermisson.java
  3. 46 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/ConnectConstant.java
  4. 0 4
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/CommonEnum.java
  5. 28 4
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/DataTypeEnum.java
  6. 48 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/QNHLEnum.java
  7. 24 8
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/StatusEnum.java
  8. 46 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/constants/vo/RequestVo.java
  9. 5 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/entity/IntegrationCompany.java
  10. 8 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/entity/Record.java
  11. 2 3
      in-cloud/src/main/java/com/jiayue/insu/incloud/pulldata/PullInitData.java
  12. 396 3
      in-cloud/src/main/java/com/jiayue/insu/incloud/pushdata/PushDataForQNHL.java
  13. 4 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/ForecastDataService.java
  14. 1 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/IntegrationCompanyService.java
  15. 1 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/StationService.java
  16. 19 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/ForecastDataServiceImpl.java
  17. 7 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/IntegrationCompanyServiceImpl.java
  18. 8 0
      in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/StationServiceImpl.java

+ 2 - 5
in-client-qn-ui/src/views/vab/table/index.vue

@@ -12,12 +12,9 @@
       return {}
     },
     computed: {},
-    created() {
-    },
+    created() {},
     beforeDestroy() {},
     mounted() {},
-    methods: {
-
-    },
+    methods: {},
   }
 </script>

+ 0 - 2
in-cloud/src/main/java/com/jiayue/insu/incloud/compermisson/GeneratePermisson.java

@@ -14,7 +14,5 @@ import java.util.Map;
  */
 public interface GeneratePermisson {
 
-    Map<String, Map<String,Object>> permissonMap = new HashMap<>();
-
     Object generateKey(Station station);
 }

+ 46 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/ConnectConstant.java

@@ -0,0 +1,46 @@
+package com.jiayue.insu.incloud.constants;
+
+/**
+ * @description: 交互常量
+ * @author: yuanhao
+ * @createDate: 2021/8/20
+ * @version: 1.0
+ */
+public interface ConnectConstant {
+
+    /**
+     * 数据传输类型:功率预测主站下发
+     */
+    String  TRANSFER_TYPE_DOWNLOAD = "download";
+    /**
+     * 数据传输类型:功率预测子站回传
+     */
+    String  TRANSFER_TYPE_UPLOAD = "upload";
+    /**
+     * 数据传输类型:一体化平台修正下发
+     */
+    String  TRANSFER_TYPE_CORRECT = "correct";
+
+    /**
+     * 换行
+     */
+    String LINE_CONSTANT ="\n";
+    /**
+     * 空格1
+     */
+    String SPACE1_CONSTANT = " ";
+    /**
+     * 空格2
+     */
+    String SPACE2_CONSTANT = "  ";
+    /**
+     * 空格3
+     */
+    String SPACE3_CONSTANT = "   ";
+    /**
+     * 空格4
+     */
+    String SPACE4_CONSTANT = "    ";
+
+
+}

+ 0 - 4
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/CommonEnum.java

@@ -1,4 +0,0 @@
-package com.jiayue.insu.incloud.constants.enums;
-
-public class CommonEnum {
-}

+ 28 - 4
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/enums/DataTypeEnum.java

@@ -3,16 +3,40 @@ package com.jiayue.insu.incloud.constants.enums;
 public enum DataTypeEnum {
 
     PUSH_QNHL_DQ("DQ","FORE","短期预测"),
-    PUSH_QNHL_NWP("NWP","FORE","短期预测");
+    PUSH_QNHL_NWP("NWP","FORE","气象预测");
 
 
-    private final String type;
-    private final String sign;
-    private final String des;
+    private  String type;
+    private  String sign;
+    private  String des;
 
     DataTypeEnum(String type, String sign, String des) {
         this.type = type;
         this.sign = sign;
         this.des = des;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public void setDes(String des) {
+        this.des = des;
+    }
 }

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

@@ -0,0 +1,48 @@
+package com.jiayue.insu.incloud.constants.enums;
+
+public enum QNHLEnum {
+
+    REQUEST_SUCCESS("T200","REQUEST_SUCCESS","请求成功"),
+    PERMISSON_TOKEN_EXPIRE("I101","TOKEN_EXPIRE","token已过期"),
+    PERMISSON_TOKEN_INVALID("I102","TOKEN_INVALID","无效token"),
+    PERMISSON_AUTOGRAPH_FAIL("I103","AUTOGRAPH_FAIL","签名失败"),
+    PERMISSON_LOGIN_NOT("I104","LOGIN_NOT","用户未登录"),
+
+            ;
+
+    private String code;
+    private String sign;
+    private String msg;
+
+    QNHLEnum(String code, String sign, String msg) {
+        this.code = code;
+        this.sign = sign;
+        this.msg  =msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

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

@@ -1,23 +1,29 @@
 package com.jiayue.insu.incloud.constants.enums;
 
-import lombok.Data;
-
 
 public enum StatusEnum {
-    SUCCESS("success","成功"),
-    RESPONSE_FAIL("response_fail","请求失败,回响应错误"),
-    DOWNLOAD_FILE_FAIL("response_fail","下载文件失败"),
-    DOWNLOAD_FILE_ERROR("response_fail","下载文件异常"),
-    FILE_NULL("file_null","文件为空"),
+    SUCCESS("success","success","成功"),
+    RESPONSE_FAIL("response_fail","response_fail","请求失败,回响应错误"),
+    DOWNLOAD_FILE_FAIL("response_fail","response_fail","下载文件失败"),
+    DOWNLOAD_FILE_ERROR("response_fail","response_fail","下载文件异常"),
+    FILE_NULL("file_null","file_null","文件为空"),
+
+
+    CONNECT_RESPONSE_FORMAT_ERROR("response_format_error","response_format_error","响应格式异常"),
+    CONNECT_RESPONSE_CONTENT_NULL("response_content_null","response_content_null","响应内容为空"),
+    CONNECT_ERROR("connect_error","connect_error","链接异常"),
 
 
+    DATA_DEFICIENCY("data_deficiency","data_deficiency","数据缺失"),
     ;
 
     private String code;
+    private String sign;
     private String msg;
 
-    StatusEnum(String code, String msg) {
+    StatusEnum(String code,String sign, String msg) {
         this.code = code;
+        this.sign = sign;
         this.msg  =msg;
     }
 
@@ -29,6 +35,16 @@ public enum StatusEnum {
         this.code = code;
     }
 
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+
     public String getMsg() {
         return msg;
     }

+ 46 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/constants/vo/RequestVo.java

@@ -0,0 +1,46 @@
+package com.jiayue.insu.incloud.constants.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * @description: 一体化请求VO
+ * @author: yuanhao
+ * @createDate: 2021/8/24
+ * @version: 1.0
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RequestVo {
+
+    /**
+     * 数据传输类型
+     */
+    private String transferType;
+
+    /**
+     * 日期
+     */
+    private String date;
+    /**
+     * 数据类型
+     */
+    private String dataType;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 数据
+     */
+    private String data;
+
+
+
+}

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

@@ -37,4 +37,9 @@ public class IntegrationCompany extends  BaseEntity{
      * 推动数据URL
      */
     String pushUrl;
+
+    /**
+     * 拉取数据URL
+     */
+    String pullUrl;
 }

+ 8 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/entity/Record.java

@@ -41,8 +41,16 @@ public class Record {
      */
     private LocalDateTime time;
     /**
+     *创建时间
+     */
+    private LocalDateTime createTime;
+    /**
      *状态
      */
     private String state;
+    /**
+     *状态 描述
+     */
+    private String stateContent;
 
 }

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

@@ -59,6 +59,7 @@ public class PullInitData implements IPullInitForecastData{
         record.setStationCode(station.getStationCode());
         record.setInCode(station.getInCode());
         record.setTime(localDateTime);
+        record.setCreateTime(LocalDateTime.now());
         record.setType(CommonStant.RECORD_TYPE_PULL);
         log.info("下载minio原始RB文件 --> {}"+station.getStationCode());
         try {
@@ -107,9 +108,7 @@ public class PullInitData implements IPullInitForecastData{
                                 if (CollectionUtil.isNotEmpty(listNow)) {
 
                                     //删除该时间段内数据
-                                    LambdaQueryWrapper<ForecastData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-                                    lambdaQueryWrapper.between(ForecastData::getForecastTime,listNow.get(0).getForecastTime(), listNow.get(listNow.size() - 1).getForecastTime());
-                                    forecastDataService.remove(lambdaQueryWrapper);
+                                    forecastDataService.removeBetweenTimeByStation(station.getStationCode(),listNow.get(0).getForecastTime(),listNow.get(listNow.size() - 1).getForecastTime());
                                     forecastDataService.saveBatch(listNow);
                                     String fileName = dqNowFile.getName() + "," + nwpNowFile.getName();
                                     record.setContent(fileName);

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

@@ -1,8 +1,40 @@
 package com.jiayue.insu.incloud.pushdata;
 
+import cn.hutool.core.bean.BeanUtil;
+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.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+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.ConnectConstant;
+import com.jiayue.insu.incloud.constants.StatusConstant;
+import com.jiayue.insu.incloud.constants.enums.DataTypeEnum;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * 清能推送数据
  *
@@ -11,8 +43,372 @@ import org.springframework.stereotype.Component;
  * @since 2022/5/22 11:29
  */
 @Component
+@Slf4j
 public class PushDataForQNHL implements IPushInitForecastData {
 
+    @Autowired
+    private ForecastDataService forecastDataService;
+    @Autowired
+    private StationService stationService;
+    @Autowired
+    private IntegrationCompanyService integrationCompanyService;
+    @Autowired
+    private QNHLComPermisson qNHLComPermisson;
+
+    @Autowired
+    private RecordService recordService;
+
+    public Boolean pushDQAndNWPData(Station station) {
+
+        Record record = new Record();
+        record.setStationCode(station.getStationCode());
+        record.setInCode(station.getInCode());
+        record.setType(CommonStant.RECORD_TYPE_PUSH);
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        record.setTime(localDateTime);
+        record.setCreateTime(LocalDateTime.now());
+
+        Station st = stationService.findByStationCode(station.getStationCode());
+        String token  = st.getKey();
+        LocalDateTime tokenTime  = st.getKeyTime();
+
+        IntegrationCompany integrationCompany = integrationCompanyService.findByCode(CompanyConstant.COMPANY_QNHL);
+        String dataPushUrl = integrationCompany.getPushUrl();
+
+
+
+        boolean result =false;
+        String response;
+        RequestVo requestVo;
+
+        if (StrUtil.isEmpty(token)  || LocalDateTime.now().isAfter(tokenTime)) {
+            if(qNHLComPermisson.generateKey(station)){
+                st = stationService.findByStationCode(station.getStationCode());
+                token  = st.getKey();
+                tokenTime  = st.getKeyTime();
+            }
+        }
+
+        if (StrUtil.isNotEmpty(token) &&  LocalDateTime.now().isBefore(tokenTime)) {
+            long startTime = DateUtil.beginOfDay(new Date()).getTime();
+            long endTime = DateUtil.offsetDay(new Date(startTime), 10).getTime();
+            long momentTime = 900000L;
+            List<ForecastData> aList;
+            aList = forecastDataService.findTimeByStation(station.getStationCode(), startTime, endTime);
+            aList.sort(Comparator.comparing(ForecastData::getForecastTime));
+
+            if (CollectionUtil.isNotEmpty(aList)) {
+
+                /**************************补点 start*************************/
+                if (aList.get(0).getForecastTime().longValue() != startTime) {
+                    List<ForecastData> bList = new ArrayList<>();
+                    long finallyTime = aList.get(0).getForecastTime().longValue();
+                    ForecastData source = aList.get(0);
+                    for (Long tempTime = startTime; tempTime < finallyTime; tempTime = tempTime + momentTime) {
+                        ForecastData target = new ForecastData();
+                        BeanUtil.copyProperties(source, target, false);
+                        target.setId(null);
+                        target.setForecastTime(tempTime);
+                        bList.add(target);
+
+                    }
+                    forecastDataService.saveBatch(bList);
+                    aList = forecastDataService.findTimeByStation(station.getStationCode(), startTime, endTime);
+                    aList.sort(Comparator.comparing(ForecastData::getForecastTime));
+                }
+                /**************************补点 end*************************/
+
+
+                //如果数据小于961条 不上送数据
+                if (aList.size() >= 961) {
+
+                    if (StatusConstant.ET_PHOTOVOLTAIC.equals(station.getType())) {
+                        requestVo = generatePhotovoltaicRequest(station.getSignCode(), aList, startTime, endTime);
+                    } else {
+                        requestVo = generateWindRequest(station.getSignCode(), aList, startTime, endTime);
+                    }
+
+                    JSONObject json = JSONUtil.parseObj(requestVo, false);
+                    String body = json.toString();
+
+                    try {
+
+                        HttpRequest httpRequest = HttpRequest.post(dataPushUrl)
+                                .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())) {
+
+                                    for (ForecastData a : aList) {
+                                        a.setUploadTime(LocalDateTime.now());
+                                    }
+                                    forecastDataService.saveBatch(aList);
+                                    record.setState(QNHLEnum.REQUEST_SUCCESS.getSign());
+                                    result = true;
+                                    log.info("=========={}:{} ==>上送短期原始数据成功  {}条==========",integrationCompany.getName(), st.getStationCode(), aList.size());
+                                } else {
+                                    QNHLEnum[] values = QNHLEnum.values();
+                                    for (QNHLEnum q: values) {
+                                        if(code.equals(q.getCode())){
+                                            log.error("=========={}:{} ==>上送数据失败 失败标识:{} ,失败原因:{} ==========", integrationCompany.getName(),st.getStationCode(),code, responseVo.getRetMsg());
+                                            record.setState(q.getSign());
+                                            record.setStateContent(q.getMsg());
+                                            if(q.name().startsWith("PERMISSON")){
+                                                log.error("=========={}:{} ==>重新请求token ==========", integrationCompany.getName(),st.getStationCode(),code);
+                                                qNHLComPermisson.generateKey(station);
+                                            }
+                                        }
+
+                                    }
+
+                                }
+                            } 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();
+
+                    }
+
+
+                } else {
+
+                    record.setState(StatusEnum.DATA_DEFICIENCY.getSign());
+                    record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
+                    log.warn("=========={}:{} ==>上送短期原始数据失败 上送数据不足 不上送数据 ==========",integrationCompany.getName(),st.getStationCode());
+                }
+
+
+            } else {
+                record.setState(StatusEnum.DATA_DEFICIENCY.getSign());
+                record.setStateContent(StatusEnum.DATA_DEFICIENCY.getMsg());
+                log.warn("=========={}:{} ==>上送短期原始数据失败 上送数据查询为空 不上送数据 ==========",integrationCompany.getName(),st.getStationCode());
+            }
+
+        } else {
+
+            record.setState(QNHLEnum.PERMISSON_LOGIN_NOT.getSign());
+            record.setStateContent(QNHLEnum.PERMISSON_LOGIN_NOT.getMsg());
+            log.error("=========={}:{} ==>上送短期原始数据失败 无token ==========",integrationCompany.getName(),st.getStationCode());
+        }
+
+
+        return result;
+    }
+    /**
+     * 生成光短期请求
+     *
+     * @return RequestVo
+     */
+    public RequestVo generatePhotovoltaicRequest(String el, List<ForecastData> aList, long startTime, long endTime) {
+
+        DateTime dateTime = DateUtil.parse(DateUtil.now());
+
+        String fileName = el + "_" + dateTime.toString("yyyyMMdd_HHmm") + "_" + DataTypeEnum.PUSH_QNHL_DQ.getSign() + ".CIME";
+
+        String content = "";
+
+        Long momentTime = 900000L; // 15分钟一个时刻
+
+        String header = "<! Entity=" + el + "  time='" + dateTime.toString("yyyy-MM-dd HH:mm:ss") + "' !>" + ConnectConstant.LINE_CONSTANT;
+        String labelStart = "<ForecastPower>" + ConnectConstant.LINE_CONSTANT;
+        String labelEnd = "</ForecastPower>" + ConnectConstant.LINE_CONSTANT;
+        String title = "@" + ConnectConstant.SPACE1_CONSTANT + "序号" + ConnectConstant.SPACE4_CONSTANT + "时间"
+                + ConnectConstant.SPACE4_CONSTANT + "功率预测" + ConnectConstant.SPACE4_CONSTANT + "总辐照度"
+                + ConnectConstant.SPACE4_CONSTANT + "直射辐照度" + ConnectConstant.SPACE4_CONSTANT + "散射辐照度"
+                + ConnectConstant.SPACE4_CONSTANT + "温度" + ConnectConstant.SPACE4_CONSTANT + "湿度" + ConnectConstant.SPACE4_CONSTANT
+                + "气压" + ConnectConstant.SPACE4_CONSTANT + "风速" + ConnectConstant.SPACE4_CONSTANT + " 风向" + ConnectConstant.LINE_CONSTANT;
+        content += header;
+        content += labelStart;
+        content += title;
+        String template = "#" + ConnectConstant.SPACE1_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.LINE_CONSTANT;
+
+
+        Map<Long, List<ForecastData>> forecastMap =
+                aList.stream().collect(Collectors.groupingBy(ForecastData::getForecastTime));
+
+        int i = 1;
+
+        for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+
+            List<ForecastData> list = forecastMap.get(tempTime);
+
+            String time = DateUtil.date(tempTime).toString("yyyyMMddHHmmss");
+
+            if (CollectionUtil.isNotEmpty(list)) {
+                ForecastData aioForecastPowerShortTerm = forecastMap.get(tempTime).get(0);
+                String dataStr = StrUtil.format(template,
+                        i,
+                        time,
+                        aioForecastPowerShortTerm.getFpValue() == null ? "NULL" : aioForecastPowerShortTerm.getFpValue().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getSwr() == null ? "NULL" : aioForecastPowerShortTerm.getSwr().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getDirectRadiation() == null ? "NULL" : aioForecastPowerShortTerm.getDirectRadiation().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getDiffuseRadiation() == null ? "NULL" : aioForecastPowerShortTerm.getDiffuseRadiation().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getTemperature() == null ? "NULL" : aioForecastPowerShortTerm.getTemperature().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getHumidity() == null ? "NULL" : aioForecastPowerShortTerm.getHumidity().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getPressure() == null ? "NULL" : aioForecastPowerShortTerm.getPressure().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getWindSpeed() == null ? "NULL" : aioForecastPowerShortTerm.getWindSpeed().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getWindDir() == null ? "NULL" : aioForecastPowerShortTerm.getWindDir().setScale(6).toString()
+                );
+                content += dataStr;
+
+            } else {
+                String dataStr = StrUtil.format(template,
+                        i,
+                        time,
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL"
+                );
+                content += dataStr;
+            }
+
+
+            i++;
+        }
+
+        content += labelEnd;
+
+        RequestVo requestVo = RequestVo.builder()
+                .transferType(ConnectConstant.TRANSFER_TYPE_DOWNLOAD)
+                .date(dateTime.toString("yyyyMMdd"))
+                .dataType(DataTypeEnum.PUSH_QNHL_DQ.getSign())
+                .fileName(fileName)
+                .data(content).build();
+
+        return requestVo;
+    }
+
+
+    /**
+     * 生成风短期请求
+     *
+     * @return RequestVo
+     */
+    public RequestVo generateWindRequest(String el, List<ForecastData> aList, long startTime, long endTime) {
+
+        DateTime dateTime = DateUtil.parse(DateUtil.now());
+
+        String fileName = el + "_" + dateTime.toString("yyyyMMdd_HHmm") + "_" + DataTypeEnum.PUSH_QNHL_DQ.getSign() + ".CIME";
+
+        StringBuilder content = new StringBuilder();
+
+        long momentTime = 900000L; // 15分钟一个时刻
+
+        String header = "<! Entity=" + el + "  time='" + dateTime.toString("yyyy-MM-dd HH:mm:ss") + "' !>" + ConnectConstant.LINE_CONSTANT;
+        String labelStart = "<ForecastPower>" + ConnectConstant.LINE_CONSTANT;
+        String labelEnd = "</ForecastPower>" + ConnectConstant.LINE_CONSTANT;
+        String title = "@" + ConnectConstant.SPACE1_CONSTANT + "序号" + ConnectConstant.SPACE4_CONSTANT + "时间"
+                + ConnectConstant.SPACE4_CONSTANT + "功率预测" + ConnectConstant.SPACE4_CONSTANT + "风速"
+                + ConnectConstant.SPACE4_CONSTANT + "风向" + ConnectConstant.SPACE4_CONSTANT + "温度"
+                + ConnectConstant.SPACE4_CONSTANT + "湿度" + ConnectConstant.SPACE4_CONSTANT + "气压" + ConnectConstant.LINE_CONSTANT;
+        content.append(header);
+        content.append(labelStart);
+        content.append(title);
+        String template = "#" + ConnectConstant.SPACE1_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.SPACE4_CONSTANT + "{}"
+                + ConnectConstant.LINE_CONSTANT;
+
+
+        Map<Long, List<ForecastData>> forecastMap =
+                aList.stream().collect(Collectors.groupingBy(ForecastData::getForecastTime));
+
+        int i = 1;
+
+        for (long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
+
+
+            List<ForecastData> list = forecastMap.get(tempTime);
+
+            String time = DateUtil.date(tempTime).toString("yyyyMMddHHmmss");
+
+            if (CollectionUtil.isNotEmpty(list)) {
+
+                ForecastData aioForecastPowerShortTerm = list.get(0);
+
+                String dataStr = StrUtil.format(template, i, time,
+                        aioForecastPowerShortTerm.getFpValue() == null ? "NULL" : aioForecastPowerShortTerm.getFpValue().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getWindSpeed() == null ? "NULL" : aioForecastPowerShortTerm.getWindSpeed().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getWindDir() == null ? "NULL" : aioForecastPowerShortTerm.getWindDir().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getTemperature() == null ? "NULL" : aioForecastPowerShortTerm.getTemperature().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getHumidity() == null ? "NULL" : aioForecastPowerShortTerm.getHumidity().setScale(6).toString(),
+                        aioForecastPowerShortTerm.getPressure() == null ? "NULL" : aioForecastPowerShortTerm.getPressure().setScale(6).toString()
+                );
+
+                content.append(dataStr);
+
+            } else {
+                String dataStr = StrUtil.format(template, i, time,
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL",
+                        "NULL"
+                );
+
+                content.append(dataStr);
+            }
+
+            i++;
+        }
+
+        content.append(labelEnd);
+
+        RequestVo requestVo = RequestVo.builder()
+                .transferType(ConnectConstant.TRANSFER_TYPE_DOWNLOAD)
+                .date(dateTime.toString("yyyyMMdd"))
+                .dataType(DataTypeEnum.PUSH_QNHL_DQ.getSign())
+                .fileName(fileName)
+                .data(content.toString()).build();
+
+        return requestVo;
+    }
+
 
     @Override
     public Boolean pushDQData(Station station) {
@@ -26,7 +422,4 @@ public class PushDataForQNHL implements IPushInitForecastData {
     }
 
 
-    public Boolean pushDQAndNWPData(Station station) {
-        return false;
-    }
 }

+ 4 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/ForecastDataService.java

@@ -4,7 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.insu.incloud.entity.ForecastData;
 import com.jiayue.insu.incloud.entity.IntegrationCompany;
 
+import java.util.List;
+
 public interface ForecastDataService extends IService<ForecastData> {
 
+    boolean removeBetweenTimeByStation(String station,Long startTime,Long endTime);
 
+    List<ForecastData>  findTimeByStation(String station,Long startTime,Long endTime);
 }

+ 1 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/IntegrationCompanyService.java

@@ -6,5 +6,6 @@ import com.jiayue.insu.incloud.entity.Station;
 
 public interface IntegrationCompanyService extends IService<IntegrationCompany> {
 
+    IntegrationCompany findByCode(String code);
 
 }

+ 1 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/StationService.java

@@ -5,5 +5,6 @@ import com.jiayue.insu.incloud.entity.Station;
 
 public interface StationService extends IService<Station> {
 
+    Station findByStationCode(String stationCode);
 
 }

+ 19 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/ForecastDataServiceImpl.java

@@ -1,13 +1,32 @@
 package com.jiayue.insu.incloud.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.insu.incloud.entity.ForecastData;
 import com.jiayue.insu.incloud.mapper.ForecastDataMapper;
 import com.jiayue.insu.incloud.service.ForecastDataService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class ForecastDataServiceImpl extends ServiceImpl<ForecastDataMapper, ForecastData> implements ForecastDataService {
 
 
+    @Override
+    public boolean removeBetweenTimeByStation(String station, Long startTime, Long endTime) {
+        LambdaQueryWrapper<ForecastData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(ForecastData::getForecastTime,startTime, endTime);
+        lambdaQueryWrapper.eq(ForecastData::getStationCode,station);
+        this.remove(lambdaQueryWrapper);
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public List<ForecastData> findTimeByStation(String station, Long startTime, Long endTime) {
+        LambdaQueryWrapper<ForecastData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(ForecastData::getForecastTime,startTime, endTime);
+        lambdaQueryWrapper.eq(ForecastData::getStationCode,station);
+        return this.list(lambdaQueryWrapper);
+    }
 }

+ 7 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/IntegrationCompanyServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jiayue.insu.incloud.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.insu.incloud.entity.IntegrationCompany;
 import com.jiayue.insu.incloud.mapper.IntegrationCompanyMapper;
@@ -10,4 +11,10 @@ import org.springframework.stereotype.Service;
 public class IntegrationCompanyServiceImpl extends ServiceImpl<IntegrationCompanyMapper, IntegrationCompany> implements IntegrationCompanyService {
 
 
+    @Override
+    public IntegrationCompany findByCode(String code) {
+        LambdaQueryWrapper<IntegrationCompany> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(IntegrationCompany::getCode,code);
+        return this.getOne(lambdaQueryWrapper);
+    }
 }

+ 8 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/StationServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jiayue.insu.incloud.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.insu.incloud.entity.Station;
 import com.jiayue.insu.incloud.mapper.StationMapper;
@@ -10,4 +11,11 @@ import org.springframework.stereotype.Service;
 public class StationServiceImpl extends ServiceImpl<StationMapper, Station> implements StationService {
 
 
+    @Override
+    public Station findByStationCode(String stationCode) {
+        LambdaQueryWrapper<Station> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Station::getStationCode,stationCode);
+        return this.getOne(lambdaQueryWrapper);
+
+    }
 }