فهرست منبع

增加解析功能的代码

xusl 1 سال پیش
والد
کامیت
eeac8be90b
25فایلهای تغییر یافته به همراه2824 افزوده شده و 82 حذف شده
  1. 78 78
      ipp-ap/src/const/crud/windtowerinfo.js
  2. 266 0
      ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/WeatherStationStatusData.java
  3. 1154 0
      ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/WindTowerStatusData.java
  4. 63 0
      ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/FTPParsingChannel.java
  5. 244 0
      ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/ParsingCftInfo.java
  6. 166 0
      ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/ParsingQxzInfo.java
  7. 4 4
      ipp-idp/src/main/java/com/jiayue/ipp/idp/job/ApiJob.java
  8. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/WeatherStationStatusDataMapper.java
  9. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/WindTowerStatusDataMapper.java
  10. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/FTPParsngChanneMapper.java
  11. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/ParsingCftInfoMapper.java
  12. 17 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/ParsingQxzInfoMapper.java
  13. 15 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/WeatherStationStatusDataService.java
  14. 14 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/WindTowerStatusDataService.java
  15. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPParsingChannelService.java
  16. 15 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPParsingUrlService.java
  17. 329 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPService.java
  18. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/ParsingCftInfoService.java
  19. 16 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/ParsingQxzInfoService.java
  20. 18 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/WeatherStationStatusDataServiceImpl.java
  21. 18 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/WindTowerStatusDataServiceImpl.java
  22. 23 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/FTPParsingChannelServiceImpl.java
  23. 18 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/FTPParsingUrlServiceImpl.java
  24. 146 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/ParsingCftInfoServiceImpl.java
  25. 124 0
      ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/ParsingQxzInfoServiceImpl.java

+ 78 - 78
ipp-ap/src/const/crud/windtowerinfo.js

@@ -74,83 +74,83 @@ export const tableOption = {
         trigger: 'blur'
       }],
     }
-    , {
-      "type": "select",
-      "label": "是否上报",
-      "prop": "report",
-      rules: [{
-        required: true,
-        message: '请选择是否上报',
-        trigger: 'blur'
-      }],
-      dicData: [{
-        value: '1',
-        label: '是'
-      }, {
-        value: '0',
-        label: '否'
-      }],
-    }
-    ,{
-      "type": "select",
-      "label": "入库时间间隔",
-      "prop": "timeInterval",
-      labelWidth: 120,
-      rules: [{
-        required: true,
-        message: '请选择入库时间间隔',
-        trigger: 'blur'
-      }],
-      dicData: [{
-        value: 1,
-        label: '一分钟'
-      }, {
-        value: 5,
-        label: '五分钟'
-      }],
-    }
-    , {
-      "type": "select",
-      "label": "测风塔是否样板机",
-      "prop": "sample",
-      labelWidth: 140,
-      rules: [{
-        required: true,
-        message: '请选择是否样板机',
-        trigger: 'blur'
-      }],
-      dicData: [{
-        value: 1,
-        label: '是'
-      }, {
-        value: 0,
-        label: '否'
-      }],
-    }
-    , {
-      "type": "input",
-      "label": "绑定数据采集通道",
-      "prop": "bindTunnel",
-      labelWidth: 140,
-      rules: [{
-        required: true,
-        message: '请选择绑定通道',
-        trigger: 'blur'
-      }],
-    }
-    , {
-      "type": "select",
-      "label": "是否为模板机",
-      "prop": "analyticUse",
-      value: '0',
-      labelWidth: 120,
-      rules: [{
-        required: true,
-        message: '请选择是否为模板机',
-        trigger: 'blur'
-      }],
-      dicData: [{value: '1', label: '是',disabled: false},
-        {value: '0', label: '否'}]
-    }
+    // , {
+    //   "type": "select",
+    //   "label": "是否上报",
+    //   "prop": "report",
+    //   rules: [{
+    //     required: true,
+    //     message: '请选择是否上报',
+    //     trigger: 'blur'
+    //   }],
+    //   dicData: [{
+    //     value: '1',
+    //     label: '是'
+    //   }, {
+    //     value: '0',
+    //     label: '否'
+    //   }],
+    // }
+    // ,{
+    //   "type": "select",
+    //   "label": "入库时间间隔",
+    //   "prop": "timeInterval",
+    //   labelWidth: 120,
+    //   rules: [{
+    //     required: true,
+    //     message: '请选择入库时间间隔',
+    //     trigger: 'blur'
+    //   }],
+    //   dicData: [{
+    //     value: 1,
+    //     label: '一分钟'
+    //   }, {
+    //     value: 5,
+    //     label: '五分钟'
+    //   }],
+    // }
+    // , {
+    //   "type": "select",
+    //   "label": "测风塔是否样板机",
+    //   "prop": "sample",
+    //   labelWidth: 140,
+    //   rules: [{
+    //     required: true,
+    //     message: '请选择是否样板机',
+    //     trigger: 'blur'
+    //   }],
+    //   dicData: [{
+    //     value: 1,
+    //     label: '是'
+    //   }, {
+    //     value: 0,
+    //     label: '否'
+    //   }],
+    // }
+    // , {
+    //   "type": "input",
+    //   "label": "绑定数据采集通道",
+    //   "prop": "bindTunnel",
+    //   labelWidth: 140,
+    //   rules: [{
+    //     required: true,
+    //     message: '请选择绑定通道',
+    //     trigger: 'blur'
+    //   }],
+    // }
+    // , {
+    //   "type": "select",
+    //   "label": "是否为模板机",
+    //   "prop": "analyticUse",
+    //   value: '0',
+    //   labelWidth: 120,
+    //   rules: [{
+    //     required: true,
+    //     message: '请选择是否为模板机',
+    //     trigger: 'blur'
+    //   }],
+    //   dicData: [{value: '1', label: '是',disabled: false},
+    //     {value: '0', label: '否'}]
+    // }
   ]
 }

+ 266 - 0
ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/WeatherStationStatusData.java

@@ -0,0 +1,266 @@
+package com.jiayue.ipp.common.data.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jiayue.ipp.common.mybatis.base.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * idp_weather_station_status_data
+ *
+ * @author whc
+ * @date 2022-03-18 15:49:50
+ */
+@Data
+@TableName("idp_weather_station_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "idp_weather_station_status_data")
+public class WeatherStationStatusData extends BaseDataEntity<WeatherStationStatusData> {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+
+    /**
+     * 设备主键ID
+     */
+    @ApiModelProperty(value = "设备主键ID")
+    private String equipmentId;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private LocalDateTime time;
+
+
+    /**
+     * 备用字段1
+     */
+    @ApiModelProperty(value = "备用字段1")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data1 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段2
+     */
+    @ApiModelProperty(value = "备用字段2")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data2 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段3
+     */
+    @ApiModelProperty(value = "备用字段3")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data3 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段4
+     */
+    @ApiModelProperty(value = "备用字段4")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data4 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段5
+     */
+    @ApiModelProperty(value = "备用字段5")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data5 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段6
+     */
+    @ApiModelProperty(value = "备用字段6")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data6 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段7
+     */
+    @ApiModelProperty(value = "备用字段7")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data7 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段8
+     */
+    @ApiModelProperty(value = "备用字段8")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data8 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段9
+     */
+    @ApiModelProperty(value = "备用字段9")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data9 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段10
+     */
+    @ApiModelProperty(value = "备用字段10")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal data10 = new BigDecimal(-99);
+
+
+    /**
+     * 总辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "总辐射(W/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal globalR = new BigDecimal(-99);
+
+
+    /**
+     * 直接辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "直接辐射(W/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal directR = new BigDecimal(-99);
+
+
+    /**
+     * 散射辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "散射辐射(W/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal diffuseR = new BigDecimal(-99);
+
+
+    /**
+     * 斜面辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "斜面辐射(W/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal obliqueR = new BigDecimal(-99);
+
+
+    /**
+     * 环境温度(℃)
+     */
+    @ApiModelProperty(value = "环境温度(℃)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal airT = new BigDecimal(-99);
+
+
+    /**
+     * 气压(KPa)
+     */
+    @ApiModelProperty(value = "气压(KPa)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal p = new BigDecimal(-99);
+
+
+    /**
+     * 湿度(%)
+     */
+    @ApiModelProperty(value = "湿度(%)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal rh = new BigDecimal(-99);
+
+
+    /**
+     * 光伏电池板温度(℃)
+     */
+    @ApiModelProperty(value = "光伏电池板温度(℃)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal cellT = new BigDecimal(-99);
+
+
+    /**
+     * 风速(m/s)
+     */
+    @ApiModelProperty(value = "风速(m/s)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws = new BigDecimal(-99);
+
+
+    /**
+     * 风向(°)
+     */
+    @ApiModelProperty(value = "风向(°)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd = new BigDecimal(-99);
+
+
+    /**
+     * 日照小时数
+     */
+    @ApiModelProperty(value = "日照小时数")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal hourDA = new BigDecimal(-99);
+
+
+    /**
+     * 总辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "总辐射日累计(MJ/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal globalRDA = new BigDecimal(-99);
+
+
+    /**
+     * 直接辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "直接辐射日累计(MJ/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal directRDA = new BigDecimal(-99);
+
+
+    /**
+     * 散射辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "散射辐射日累计(MJ/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal diffuseRDA = new BigDecimal(-99);
+
+
+    /**
+     * 斜面辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "斜面辐射日累计(MJ/㎡)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal obliqueRDA = new BigDecimal(-99);
+
+
+    /**
+     * 数据是否是通过预测数据生成的
+     */
+    @ApiModelProperty(value = "数据是否是通过预测数据生成的")
+    private String isGenerated;
+
+
+}

+ 1154 - 0
ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/WindTowerStatusData.java

@@ -0,0 +1,1154 @@
+package com.jiayue.ipp.common.data.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jiayue.ipp.common.mybatis.base.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Digits;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * idp_wind_tower_status_data
+ *
+ * @author whc
+ * @date 2022-03-18 15:50:05
+ */
+@Data
+@TableName("idp_wind_tower_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "idp_wind_tower_status_data")
+public class WindTowerStatusData extends BaseDataEntity<WindTowerStatusData> {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+
+    /**
+     * 设备主键ID
+     */
+    @ApiModelProperty(value = "设备主键ID")
+    private String equipmentId;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private LocalDateTime time;
+
+
+    /**
+     * 备用字段1
+     */
+    @ApiModelProperty(value = "备用字段1")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data1 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段2
+     */
+    @ApiModelProperty(value = "备用字段2")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data2 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段3
+     */
+    @ApiModelProperty(value = "备用字段3")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data3 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段4
+     */
+    @ApiModelProperty(value = "备用字段4")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data4 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段5
+     */
+    @ApiModelProperty(value = "备用字段5")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data5 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段6
+     */
+    @ApiModelProperty(value = "备用字段6")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data6 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段7
+     */
+    @ApiModelProperty(value = "备用字段7")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data7 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段8
+     */
+    @ApiModelProperty(value = "备用字段8")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data8 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段9
+     */
+    @ApiModelProperty(value = "备用字段9")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data9 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段10
+     */
+    @ApiModelProperty(value = "备用字段10")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal data10 = new BigDecimal(-99);
+
+
+    /**
+     * 温度瞬时值
+     */
+    @ApiModelProperty(value = "温度瞬时值(℃)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal tInst = new BigDecimal(-99);
+
+
+    /**
+     * 温度最大值(℃)
+     */
+    @ApiModelProperty(value = "温度最大值(℃)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal tMax = new BigDecimal(-99);
+
+
+    /**
+     * 温度最小值(℃)
+     */
+    @ApiModelProperty(value = "温度最小值(℃)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal tMin = new BigDecimal(-99);
+
+
+    /**
+     * 温度平均值(℃)
+     */
+    @ApiModelProperty(value = "温度平均值(℃)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal tAve = new BigDecimal(-99);
+
+
+    /**
+     * 温度标准差(℃)
+     */
+    @ApiModelProperty(value = "温度标准差(℃)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal tSta = new BigDecimal(-99);
+
+
+    /**
+     * 湿度瞬时值(%)
+     */
+    @ApiModelProperty(value = "湿度瞬时值(%)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal rhInst = new BigDecimal(-99);
+
+
+    /**
+     * 湿度最大值(%)
+     */
+    @ApiModelProperty(value = "湿度最大值(%)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal rhMax = new BigDecimal(-99);
+
+
+    /**
+     * 湿度最小值(%)
+     */
+    @ApiModelProperty(value = "湿度最小值(%)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal rhMin = new BigDecimal(-99);
+
+
+    /**
+     * 湿度平均值(%)
+     */
+    @ApiModelProperty(value = "湿度平均值(%)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal rhAve = new BigDecimal(-99);
+
+
+    /**
+     * 湿度标准差(%)
+     */
+    @ApiModelProperty(value = "湿度标准差(%)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal rhSta = new BigDecimal(-99);
+
+
+    /**
+     * 气压瞬时值(KPa)
+     */
+    @ApiModelProperty(value = "气压瞬时值(KPa)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal paInst = new BigDecimal(-99);
+
+
+    /**
+     * 气压最大值(KPa)
+     */
+    @ApiModelProperty(value = "气压最大值(KPa)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal paMax = new BigDecimal(-99);
+
+
+    /**
+     * 气压最小值(KPa)
+     */
+    @ApiModelProperty(value = "气压最小值(KPa)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal paMin = new BigDecimal(-99);
+
+
+    /**
+     * 气压平均值(KPa)
+     */
+    @ApiModelProperty(value = "气压平均值(KPa)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal paAve = new BigDecimal(-99);
+
+
+    /**
+     * 气压标准差(KPa)
+     */
+    @ApiModelProperty(value = "气压标准差(KPa)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal paSta = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "10米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "10米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "10米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "10米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "10米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "10米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向最大值(°)
+     */
+    @ApiModelProperty(value = "10米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向最小值(°)
+     */
+    @ApiModelProperty(value = "10米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向平均值(°)
+     */
+    @ApiModelProperty(value = "10米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve10 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向标准差(°)
+     */
+    @ApiModelProperty(value = "10米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta10 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "30米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "30米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "30米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "30米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "30米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "30米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向最大值(°)
+     */
+    @ApiModelProperty(value = "30米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向最小值(°)
+     */
+    @ApiModelProperty(value = "30米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向平均值(°)
+     */
+    @ApiModelProperty(value = "30米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve30 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向标准差(°)
+     */
+    @ApiModelProperty(value = "30米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta30 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "50米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "50米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "50米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "50米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "50米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "50米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向最大值(°)
+     */
+    @ApiModelProperty(value = "50米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向最小值(°)
+     */
+    @ApiModelProperty(value = "50米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向平均值(°)
+     */
+    @ApiModelProperty(value = "50米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve50 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向标准差(°)
+     */
+    @ApiModelProperty(value = "50米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta50 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "60米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "60米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "60米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "60米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "60米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "60米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风向最大值(°)
+     */
+    @ApiModelProperty(value = "60米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风向最小值(°)
+     */
+    @ApiModelProperty(value = "60米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风向平均值(°)
+     */
+    @ApiModelProperty(value = "60米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve60 = new BigDecimal(-99);
+
+
+    /**
+     * 60米风向标准差(°)
+     */
+    @ApiModelProperty(value = "60米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta60 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "70米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "70米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "70米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "70米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "70米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "70米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向最大值(°)
+     */
+    @ApiModelProperty(value = "70米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向最小值(°)
+     */
+    @ApiModelProperty(value = "70米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向平均值(°)
+     */
+    @ApiModelProperty(value = "70米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve70 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向标准差(°)
+     */
+    @ApiModelProperty(value = "70米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta70 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "80米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "80米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "80米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "80米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "80米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "80米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向最大值(°)
+     */
+    @ApiModelProperty(value = "80米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向最小值(°)
+     */
+    @ApiModelProperty(value = "80米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向平均值(°)
+     */
+    @ApiModelProperty(value = "80米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve80 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向标准差(°)
+     */
+    @ApiModelProperty(value = "80米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta80 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "90米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "90米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "90米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "90米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "90米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "90米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向最大值(°)
+     */
+    @ApiModelProperty(value = "90米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向最小值(°)
+     */
+    @ApiModelProperty(value = "90米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向平均值(°)
+     */
+    @ApiModelProperty(value = "90米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve90 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向标准差(°)
+     */
+    @ApiModelProperty(value = "90米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta90 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "100米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "100米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "100米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "100米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "100米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "100米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向最大值(°)
+     */
+    @ApiModelProperty(value = "100米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向最小值(°)
+     */
+    @ApiModelProperty(value = "100米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向平均值(°)
+     */
+    @ApiModelProperty(value = "100米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve100 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向标准差(°)
+     */
+    @ApiModelProperty(value = "100米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta100 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "110米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "110米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "110米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "110米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "110米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "110米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风向最大值(°)
+     */
+    @ApiModelProperty(value = "110米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风向最小值(°)
+     */
+    @ApiModelProperty(value = "110米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风向平均值(°)
+     */
+    @ApiModelProperty(value = "110米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve110 = new BigDecimal(-99);
+
+
+    /**
+     * 110米风向标准差(°)
+     */
+    @ApiModelProperty(value = "110米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta110 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "120米风速瞬时值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInst120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "120米风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMax120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "120米风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMin120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "120米风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAve120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "120米风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsSta120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "120米风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInst120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风向最大值(°)
+     */
+    @ApiModelProperty(value = "120米风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMax120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风向最小值(°)
+     */
+    @ApiModelProperty(value = "120米风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMin120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风向平均值(°)
+     */
+    @ApiModelProperty(value = "120米风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAve120 = new BigDecimal(-99);
+
+
+    /**
+     * 120米风向标准差(°)
+     */
+    @ApiModelProperty(value = "120米风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdSta120 = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风速瞬时值
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速瞬时值")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsInstHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风速最大值(m/s)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速最大值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMaxHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风速最小值(m/s)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速最小值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsMinHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风速平均值(m/s)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速平均值(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsAveHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风速标准差(m/s)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速标准差(m/s)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wsStaHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向瞬时值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdInstHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风向最大值(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向最大值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMaxHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风向最小值(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向最小值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdMinHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风向平均值(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向平均值(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdAveHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 风机轮毂高度风向标准差(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向标准差(°)")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal wdStaHubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 空气密度  Kg/m³
+     */
+    @ApiModelProperty(value = "空气密度  Kg/m³")
+    @Digits(integer = 10, fraction = 4)
+    private BigDecimal airDensity = new BigDecimal(-99);
+
+
+    /**
+     * 数据是否是通过预测数据生成的 1:是 0:否
+     */
+    @ApiModelProperty(value = "数据是否是通过预测数据生成的 1:是 0:否")
+    private String isGenerated;
+
+
+}

+ 63 - 0
ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/FTPParsingChannel.java

@@ -0,0 +1,63 @@
+package com.jiayue.ipp.common.data.entity.an;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * ftp解析文件
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("pf_ftp_parsing_channel")
+@ApiModel(value = "pf_ftp_parsing_channel")
+public class FTPParsingChannel implements Serializable {
+
+    /**
+     * Id
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+
+    /**
+     * 通道名称
+     */
+    @ApiModelProperty(value = "通道名称")
+    private String channelName;
+
+
+    /**
+     * 远端IP
+     */
+    @ApiModelProperty(value = "远端IP")
+    private String remoteIp;
+
+    /**
+     * 远端端口
+     */
+    @ApiModelProperty(value = "远端端口")
+    private String remotePort;
+
+
+    /**
+     * 用户名
+     */
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+
+    /**
+     * 密码
+     */
+    @ApiModelProperty(value = "密码")
+    private String password;
+}

+ 244 - 0
ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/ParsingCftInfo.java

@@ -0,0 +1,244 @@
+package com.jiayue.ipp.common.data.entity.an;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * cdq解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("pf_parsing_cft_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "pf_parsing_cft_info")
+public class ParsingCftInfo extends ParsingInfo<ParsingCftInfo> implements Serializable {
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+
+    /**
+     * 温度瞬时值
+     */
+    @ApiModelProperty(value = "温度瞬时值")
+    private String tInst;
+
+
+    /**
+     * 湿度瞬时值(%)
+     */
+    @ApiModelProperty(value = "湿度瞬时值(%)")
+    private String rhInst;
+
+
+
+
+    /**
+     * 气压瞬时值(KPa)
+     */
+    @ApiModelProperty(value = "气压瞬时值(KPa)")
+    private String paInst;
+
+
+
+
+    /**
+     * 10米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "10米风速瞬时值(m/s)")
+    private String wsInst10;
+
+
+
+    /**
+     * 10米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "10米风向瞬时值(°)")
+    private String wdInst10;
+
+
+
+    /**
+     * 30米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "30米风速瞬时值(m/s)")
+    private String wsInst30;
+
+
+    /**
+     * 30米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "30米风向瞬时值(°)")
+    private String wdInst30;
+
+
+    /**
+     * 50米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "50米风速瞬时值(m/s)")
+    private String wsInst50;
+
+
+    /**
+     * 50米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "50米风向瞬时值(°)")
+    private String wdInst50;
+
+
+
+    /**
+     * 60米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "60米风速瞬时值(m/s)")
+    private String wsInst60;
+
+
+
+    /**
+     * 60米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "60米风向瞬时值(°)")
+    private String wdInst60;
+
+
+
+    /**
+     * 70米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "70米风速瞬时值(m/s)")
+    private String wsInst70;
+
+
+
+    /**
+     * 70米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "70米风向瞬时值(°)")
+    private String wdInst70;
+
+    public String gettInst() {
+        return tInst;
+    }
+
+    public void settInst(String tInst) {
+        this.tInst = tInst;
+    }
+
+    /**
+     * 80米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "80米风速瞬时值(m/s)")
+    private String wsInst80;
+
+
+
+    /**
+     * 80米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "80米风向瞬时值(°)")
+    private String wdInst80;
+
+
+
+    /**
+     * 90米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "90米风速瞬时值(m/s)")
+    private String wsInst90;
+
+
+
+    /**
+     * 90米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "90米风向瞬时值(°)")
+    private String wdInst90;
+
+
+
+    /**
+     * 100米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "100米风速瞬时值(m/s)")
+    private String wsInst100;
+
+
+
+    /**
+     * 100米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "100米风向瞬时值(°)")
+    private String wdInst100;
+
+
+
+    /**
+     * 110米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "110米风速瞬时值(m/s)")
+    private String wsInst110;
+
+
+
+    /**
+     * 110米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "110米风向瞬时值(°)")
+    private String wdInst110;
+
+
+
+    /**
+     * 120米风速瞬时值(m/s)
+     */
+    @ApiModelProperty(value = "120米风速瞬时值(m/s)")
+    private String wsInst120;
+
+
+
+    /**
+     * 120米风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "120米风向瞬时值(°)")
+    private String wdInst120;
+
+
+    /**
+     * 风机轮毂高度风速瞬时值
+     */
+    @ApiModelProperty(value = "风机轮毂高度风速瞬时值")
+    private String wsInstHubHeight;
+
+
+    /**
+     * 风机轮毂高度风向瞬时值(°)
+     */
+    @ApiModelProperty(value = "风机轮毂高度风向瞬时值(°)")
+    private String wdInstHubHeight;
+
+
+    /**
+     * 空气密度  Kg/m³
+     */
+    @ApiModelProperty(value = "空气密度  Kg/m³")
+    private String airDensity;
+}

+ 166 - 0
ipp-common/ipp-common-data/src/main/java/com/jiayue/ipp/common/data/entity/an/ParsingQxzInfo.java

@@ -0,0 +1,166 @@
+package com.jiayue.ipp.common.data.entity.an;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+
+/**
+ * cdq解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("pf_parsing_qxz_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "pf_parsing_qxz_info")
+public class ParsingQxzInfo extends ParsingInfo<ParsingQxzInfo> implements Serializable {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.ASSIGN_UUID)
+    @ApiModelProperty(value = "主键ID")
+    private String id;
+
+    /**
+     * 数据类型(s:单行,m:多行)
+     */
+    @ApiModelProperty(value = "文件名")
+    private String dataType;
+
+
+    /**
+     * 文件名
+     */
+    @ApiModelProperty(value = "文件名")
+    private String fileName;
+
+
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+
+    /**
+     * 总辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "总辐射(W/㎡)")
+    private String globalR;
+
+
+    /**
+     * 直接辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "直接辐射(W/㎡)")
+    private String directR;
+
+
+    /**
+     * 散射辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "散射辐射(W/㎡)")
+    private String diffuseR;
+
+
+    /**
+     * 斜面辐射(W/㎡)
+     */
+    @ApiModelProperty(value = "斜面辐射(W/㎡)")
+    private String obliqueR;
+
+
+    /**
+     * 环境温度(℃)
+     */
+    @ApiModelProperty(value = "环境温度(℃)")
+    private String airT;
+
+
+    /**
+     * 气压(KPa)
+     */
+    @ApiModelProperty(value = "气压(KPa)")
+    private String p;
+
+
+    /**
+     * 湿度(%)
+     */
+    @ApiModelProperty(value = "湿度(%)")
+    private String rh;
+
+
+    /**
+     * 光伏电池板温度(℃)
+     */
+    @ApiModelProperty(value = "光伏电池板温度(℃)")
+    private String cellT;
+
+
+    /**
+     * 风速(m/s)
+     */
+    @ApiModelProperty(value = "风速(m/s)")
+    private String ws;
+
+
+    /**
+     * 风向(°)
+     */
+    @ApiModelProperty(value = "风向(°)")
+    private String wd;
+
+
+    /**
+     * 日照小时数
+     */
+    @ApiModelProperty(value = "日照小时数")
+    private String hourDA;
+
+
+    /**
+     * 总辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "总辐射日累计(MJ/㎡)")
+    private String globalRDA;
+
+
+    /**
+     * 直接辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "直接辐射日累计(MJ/㎡)")
+    private String directRDA;
+
+
+    /**
+     * 散射辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "散射辐射日累计(MJ/㎡)")
+    private String diffuseRDA;
+
+
+    /**
+     * 斜面辐射日累计(MJ/㎡)
+     */
+    @ApiModelProperty(value = "斜面辐射日累计(MJ/㎡)")
+    private String obliqueRDA;
+}

+ 4 - 4
ipp-idp/src/main/java/com/jiayue/ipp/idp/job/ApiJob.java

@@ -31,9 +31,9 @@ public class ApiJob {
     }
 
 
-    @Scheduled(fixedRate = 60000l)
-    public void powerStationStatusDataApi() throws Exception {
-        callPowerStationStatusDataApi.packageData();
-    }
+//    @Scheduled(fixedRate = 60000l)
+//    public void powerStationStatusDataApi() throws Exception {
+//        callPowerStationStatusDataApi.packageData();
+//    }
 
 }

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/WeatherStationStatusDataMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ipp.common.data.entity.WeatherStationStatusData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 气象站数据dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface WeatherStationStatusDataMapper extends BaseMapper<WeatherStationStatusData> {
+
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/WindTowerStatusDataMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ipp.common.data.entity.WindTowerStatusData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 测风塔数据dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface WindTowerStatusDataMapper extends BaseMapper<WindTowerStatusData> {
+
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/FTPParsngChanneMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.mapper.an;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ipp.common.data.entity.an.FTPParsingChannel;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析ftp通道信息dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface FTPParsngChanneMapper extends BaseMapper<FTPParsingChannel> {
+
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/ParsingCftInfoMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.mapper.an;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ipp.common.data.entity.an.ParsingCftInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 测风塔解析信息dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingCftInfoMapper extends BaseMapper<ParsingCftInfo> {
+
+}

+ 17 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/mapper/an/ParsingQxzInfoMapper.java

@@ -0,0 +1,17 @@
+package com.jiayue.ipp.idp.mapper.an;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ipp.common.data.entity.an.ParsingQxzInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 气象站解析信息dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingQxzInfoMapper extends BaseMapper<ParsingQxzInfo> {
+
+}

+ 15 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/WeatherStationStatusDataService.java

@@ -0,0 +1,15 @@
+package com.jiayue.ipp.idp.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.WeatherStationStatusData;
+
+
+/**
+ * 气象站数据业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface WeatherStationStatusDataService extends IService<WeatherStationStatusData> {
+
+}

+ 14 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/WindTowerStatusDataService.java

@@ -0,0 +1,14 @@
+package com.jiayue.ipp.idp.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.WindTowerStatusData;
+
+/**
+ * 测风塔数据业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface WindTowerStatusDataService extends IService<WindTowerStatusData> {
+
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPParsingChannelService.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.service.an;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.an.FTPParsingChannel;
+
+
+/**
+ * 解析ftp通道业务接口
+ *
+ * @author tl
+ * @date 2022-05-05 18:07:03
+ */
+public interface FTPParsingChannelService  extends IService<FTPParsingChannel> {
+
+
+}

+ 15 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPParsingUrlService.java

@@ -0,0 +1,15 @@
+package com.jiayue.ipp.idp.service.an;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+
+
+/**
+ * 解析ftp路径业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface FTPParsingUrlService extends IService<ParsingUrl> {
+
+}

+ 329 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/FTPService.java

@@ -0,0 +1,329 @@
+package com.jiayue.ipp.idp.service.an;
+
+
+import cn.hutool.core.lang.Filter;
+import cn.hutool.extra.ftp.Ftp;
+import cn.hutool.extra.ftp.FtpConfig;
+import cn.hutool.extra.ftp.FtpMode;
+import com.jiayue.ipp.common.data.entity.an.FTPParsingChannel;
+import com.jiayue.ipp.common.data.entity.an.ParsingLog;
+import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+import com.jiayue.ipp.idp.dto.ParsingConstant;
+import com.jiayue.ipp.idp.util.FileUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.net.ftp.FTPFile;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * ftp通信业务层
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+@Transactional
+public class FTPService {
+
+    private final FTPParsingChannelService ftpParsingChannelService;
+
+    private final FTPParsingUrlService ftpParsingUrlService;
+
+//    private final MinioUtilService minioUtilService;
+
+    private final ParsingFileService parsingFileService;
+
+//    private final DaMinioFileMapper daMinioFileMapper;
+
+    private final ParsingLogService parsingLogService;
+
+    private final String bucketName = "ipp-da";
+
+    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
+
+    private final SimpleDateFormat simpleDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd_HH:mm");
+
+    private final ChannelStatusService channelStatusService;
+
+    private final ReportingRateRecordsService reportingRateRecordsService;
+
+
+    /**
+     * 逻辑过程:
+     * 获取ftp解析的通道进行ftp连接
+     * 通过ftp的下载路径下载对应场站和预测厂家目录中的文件到本地目录
+     * 进行文件解析
+     * 解析成功后,文件上传到minio
+     * 将记录存入数据库
+     * 备份并删除本地文件(备份文件应定时清理)
+     * 解析成功并结束
+     */
+    public void ftp() {
+
+        List<FTPParsingChannel> ftpParsingChannels = ftpParsingChannelService.list();
+        List<ParsingUrl> ftpParsingUrls = ftpParsingUrlService.list();
+
+        //循环ftp解析通道
+        for (FTPParsingChannel ftpParsingChannel : ftpParsingChannels) {
+
+            //创建ftp配置
+            FtpConfig ftpConfig = new FtpConfig();
+            ftpConfig.setHost(ftpParsingChannel.getRemoteIp());
+            ftpConfig.setPort(Integer.parseInt(ftpParsingChannel.getRemotePort()));
+            ftpConfig.setPassword(ftpParsingChannel.getPassword());
+            ftpConfig.setUser(ftpParsingChannel.getUsername());
+            //字符集使用UTF-8
+            ftpConfig.setCharset(Charset.forName("UTF-8"));
+            ftpConfig.setConnectionTimeout(5 * 1000L);
+
+            //ftp连接
+            Ftp ftp = ftpConnect(ftpConfig);
+
+            //判断是否连接成功,成功后业务继续
+            if (ftp != null) {
+                //过滤出当前解析通道下在使用的《 解析路径 》
+                List<ParsingUrl> ftpParsingUrlList = ftpParsingUrls.stream().filter(s -> s.getCId().equals(ftpParsingChannel.getId()) && s.getUrlStatus().equals("1")).collect(Collectors.toList());
+
+                try {
+                    //遍历解析路径,对文件进行解析
+                    for (ParsingUrl parsingUrl : ftpParsingUrlList) {
+
+                        String url = parsingUrl.getUrl();
+
+                        String path = FileUtil.getParsingPath() + File.separator + parsingUrl.getForecastManufactor();
+
+                        File dirFile = new File(path);
+                        if (!dirFile.exists()) {
+                            dirFile.mkdirs();
+                        }
+
+//                        String bakPath = FileUtil.getParsingPath() + File.separator + "bak" + File.separator + simpleDateFormat.format(new Date()) + File.separator + ftpParsingUrl.getForecastManufactor() + File.separator;
+//                        File bakPathFile = new File(bakPath);
+//                        if (!bakPathFile.exists()) {
+//                            bakPathFile.mkdir();
+//                        }
+
+                        if (ftp.existFile(url)) {
+                            List<FTPFile> ftpFiles = ftp.lsFiles(url, new Filter<FTPFile>() {
+                                @Override
+                                public boolean accept(FTPFile ftpFile) {
+                                    return true;
+                                }
+                            });
+
+                            //遍历文件
+                            for (FTPFile fTPFile : ftpFiles) {
+                                if (!fTPFile.isDirectory()) {
+                                    String fileName = fTPFile.getName();
+                                    ParsingLog parsingLog = new ParsingLog();
+                                    parsingLog.setFileName(fileName);
+                                    parsingLog.setStationCode(parsingUrl.getStationCode());
+                                    parsingLog.setParsingTime(new Date());
+
+                                    //下载文件到临时目录
+                                    ftp.download(url, fileName, dirFile);
+                                    File file = FileUtils.getFile(dirFile, fileName);
+
+                                    //定义解析的类型,默认为错误(未知),成功后为文件类型,也会作为存储目录名
+                                    String type = ParsingConstant.FAIL;
+                                    if (fileName.endsWith("status.json")) {
+                                        type = parsingStatusFile(file, parsingUrl);
+                                    } else {
+                                        type = parsingFileService.parsingFile(file, parsingUrl);
+
+                                    }
+                                    if (!type.startsWith(ParsingConstant.FAIL)) {
+                                        parsingLog.setFileType(type);
+                                        //minio路径
+                                        String foldPath = "/" + simpleDateFormat.format(new Date())
+                                                + "/" + parsingUrl.getStationCode()
+                                                + "/" + type
+                                                + "/" + parsingUrl.getForecastManufactor()
+                                                + "/" + file.getName();
+
+                                        //将文件上传到minIO
+//                                        if (minioUp(foldPath, file)) {
+//
+//                                            DaMinioFile daMinioFile = new DaMinioFile();
+//
+//                                            daMinioFile.setBucketName(bucketName);
+//                                            daMinioFile.setFileName(file.getName());
+//                                            daMinioFile.setFilePath(foldPath);
+//                                            daMinioFile.setFileState("0");
+//                                            daMinioFile.setFileType(type);
+//                                            daMinioFile.setStationCode(ftpParsingUrl.getStationCode());
+//                                            daMinioFile.setCompanySign(ftpParsingUrl.getForecastManufactor());
+//
+//                                            daMinioFileMapper.insert(daMinioFile);
+//
+////                                            ftp.changeWorkingDirectory("/lshrabbitMQ/hw_data");
+//
+//                                            boolean b = ftp.delFile(url + "/" + fileName);
+//                                            if (b) {
+//                                                FileUtils.forceDelete(file);
+////                                            FileUtils.moveFile(file, new File(bakPath + File.separator + fileName));
+//                                                parsingLog.setParsingFileStatus("1");
+//                                                parsingLog.setParsingDescribe("文件解析成功");
+//                                            } else {
+//                                                file.delete();
+//                                                log.error(ftpParsingChannel.getChannelName() + "ftp文件删除失败,本地文件删除,等待下次下载");
+//                                                parsingLog.setParsingFileStatus("0");
+//                                                parsingLog.setParsingDescribe(ftpParsingChannel.getChannelName() + "ftp文件删除失败,本地文件删除,等待下次下载");
+//                                            }
+//                                        } else {
+//                                            file.delete();
+//                                            log.error("minio上传失败,本地文件删除,等待下次下载");
+//                                            parsingLog.setParsingFileStatus("0");
+//                                            parsingLog.setParsingDescribe("minio上传失败,本地文件删除,等待下次下载");
+//                                        }
+                                    } else {
+                                        parsingLog.setParsingFileStatus("0");
+                                        //失败情况下会返回失败信息
+                                        parsingLog.setParsingDescribe(type);
+                                    }
+                                    parsingLogService.save(parsingLog);
+                                }
+                            }
+                        }
+                    }
+                    log.info("{}ftp下载文件并解析执行完成", ftpParsingChannel.getChannelName());
+                } catch (Exception e) {
+                    log.error("{}ftp下载文件并解析过程失败", ftpParsingChannel.getChannelName());
+                    e.printStackTrace();
+                } finally {
+                    try {
+                        if (ftp != null) {
+                            ftp.close();
+                            log.info("{}ftp连接关闭,对端ip:{}", ftpParsingChannel.getChannelName(), ftpParsingChannel.getRemoteIp());
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * minio 上传文件
+     *
+     * @param foldPath
+     * @param file
+     * @return
+     */
+    public boolean minioUp(String foldPath, File file) {
+//        boolean success = Boolean.FALSE;
+//        InputStream in = null;
+//        try {
+//            in = new FileInputStream(file);
+//            if (!minioUtilService.bucketExists(bucketName)) {
+//                minioUtilService.makeBucket(bucketName);
+//            }
+//            minioUtilService.putObject(bucketName, foldPath, in);
+//            log.info("minio上传文件成功:{}", file.getName());
+//            success = Boolean.TRUE;
+//        } catch (Exception e) {
+//            log.error("minio上传文件失败:{}", file.getName());
+//        } finally {
+//            try {
+//                in.close();
+//            } catch (IOException e) {
+//                e.printStackTrace();
+//            }
+//            return success;
+//        }
+        return true;
+    }
+
+    /**
+     * ftp连接
+     *
+     * @param ftpConfig
+     * @return
+     */
+    public Ftp ftpConnect(FtpConfig ftpConfig) {
+        Ftp ftp = null;
+        try {
+            //设置主动模式连接
+            ftp = new Ftp(ftpConfig, FtpMode.Active);
+            log.info("{} :ftp连接成功", ftpConfig.getHost());
+        } catch (Exception e) {
+            log.error("{} :获取上送文件ftp连接失败", ftpConfig.getHost());
+            e.printStackTrace();
+        } finally {
+            return ftp;
+        }
+    }
+
+
+    /**
+     * 对于状态文件单独解析
+     *
+     * @param file
+     * @param parsingUrl
+     * @return
+     */
+    public String parsingStatusFile(File file, ParsingUrl parsingUrl) {
+
+        String parsingStatus = ParsingConstant.FAIL;
+        return parsingStatus;
+//        try {
+//            String str = FileUtil.getStr(file);
+//
+//            ParsingStatusFileDto parsingStatusFileDto = JsonBeanUtil.jsonToBean(str, ParsingStatusFileDto.class);
+//
+//            Date date = simpleDateTimeFormat.parse(parsingStatusFileDto.getDate());
+//
+//            List<ReportingRateRecords> reportingRateRecordsList = new ArrayList<>();
+//            for (ReportingRateDto reportingRateDto : parsingStatusFileDto.getReportingRates()) {
+//                ReportingRateRecords reportingRateRecords = new ReportingRateRecords();
+//
+//                reportingRateRecords.setFileType(reportingRateDto.getRateType());
+//                reportingRateRecords.setReportingRate(reportingRateDto.getReportrate());
+//                reportingRateRecords.setStationCode(ftpParsingUrl.getStationCode());
+//                reportingRateRecords.setUploadTime(date);
+//
+//                reportingRateRecordsList.add(reportingRateRecords);
+//            }
+//
+//            reportingRateRecordsService.saveBatch(reportingRateRecordsList);
+//
+//
+//            List<ChannelStatus> channelStatusList = new ArrayList<>();
+//            for (ChannelStatusDto channelStatusDto : parsingStatusFileDto.getChannelStatus()) {
+//                ChannelStatus channelStatus = new ChannelStatus();
+//                channelStatus.setChannelName(channelStatusDto.getChannelName());
+//                channelStatus.setStationCode(ftpParsingUrl.getStationCode());
+//                channelStatus.setStatus(channelStatusDto.getStatus());
+//                channelStatus.setType(channelStatusDto.getType());
+//                channelStatus.setUploadTime(date);
+//
+//                channelStatusList.add(channelStatus);
+//            }
+//
+//            LambdaQueryWrapper<ChannelStatus> lambdaQueryWrapper = new LambdaQueryWrapper<ChannelStatus>();
+//            lambdaQueryWrapper.eq(ChannelStatus::getStationCode,ftpParsingUrl.getStationCode());
+//            channelStatusService.remove(lambdaQueryWrapper);
+//            channelStatusService.saveBatch(channelStatusList);
+//            parsingStatus = "status";
+//        } catch (Exception e) {
+//            parsingStatus += "status 解析失败";
+//            log.error("解析状态数据失败! /(ㄒoㄒ)/~~", e);
+//        }finally {
+//            return parsingStatus;
+//        }
+
+    }
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/ParsingCftInfoService.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.service.an;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.an.ParsingCftInfo;
+
+
+/**
+ * 测风塔解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingCftInfoService extends IService<ParsingCftInfo> {
+
+
+}

+ 16 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/an/ParsingQxzInfoService.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipp.idp.service.an;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ipp.common.data.entity.an.ParsingQxzInfo;
+
+
+/**
+ * 气象站解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingQxzInfoService extends IService<ParsingQxzInfo> {
+
+}

+ 18 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/WeatherStationStatusDataServiceImpl.java

@@ -0,0 +1,18 @@
+package com.jiayue.ipp.idp.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.WeatherStationStatusData;
+import com.jiayue.ipp.idp.mapper.WeatherStationStatusDataMapper;
+import com.jiayue.ipp.idp.service.WeatherStationStatusDataService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 气象站数据业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+public class WeatherStationStatusDataServiceImpl extends ServiceImpl<WeatherStationStatusDataMapper, WeatherStationStatusData> implements WeatherStationStatusDataService {
+
+}

+ 18 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/WindTowerStatusDataServiceImpl.java

@@ -0,0 +1,18 @@
+package com.jiayue.ipp.idp.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.WindTowerStatusData;
+import com.jiayue.ipp.idp.mapper.WindTowerStatusDataMapper;
+import com.jiayue.ipp.idp.service.WindTowerStatusDataService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 测风塔数据业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+public class WindTowerStatusDataServiceImpl extends ServiceImpl<WindTowerStatusDataMapper, WindTowerStatusData> implements WindTowerStatusDataService {
+
+}

+ 23 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/FTPParsingChannelServiceImpl.java

@@ -0,0 +1,23 @@
+package com.jiayue.ipp.idp.service.impl.an;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.an.FTPParsingChannel;
+import com.jiayue.ipp.idp.mapper.an.FTPParsngChanneMapper;
+import com.jiayue.ipp.idp.service.an.FTPParsingChannelService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 解析ftp通道业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+public class FTPParsingChannelServiceImpl extends ServiceImpl<FTPParsngChanneMapper, FTPParsingChannel> implements FTPParsingChannelService {
+
+
+
+}

+ 18 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/FTPParsingUrlServiceImpl.java

@@ -0,0 +1,18 @@
+package com.jiayue.ipp.idp.service.impl.an;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+import com.jiayue.ipp.idp.mapper.an.ParsingUrlMapper;
+import com.jiayue.ipp.idp.service.an.FTPParsingUrlService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 解析ftp路径业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+public class FTPParsingUrlServiceImpl extends ServiceImpl<ParsingUrlMapper, ParsingUrl> implements FTPParsingUrlService {
+
+}

+ 146 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/ParsingCftInfoServiceImpl.java

@@ -0,0 +1,146 @@
+package com.jiayue.ipp.idp.service.impl.an;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.WindTowerInfo;
+import com.jiayue.ipp.common.data.entity.WindTowerStatusData;
+import com.jiayue.ipp.common.data.entity.an.ParsingCftInfo;
+import com.jiayue.ipp.common.data.entity.an.ParsingInfo;
+import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+import com.jiayue.ipp.common.data.enums.FileTypeEnum;
+
+import com.jiayue.ipp.idp.dto.ParsingConstant;
+import com.jiayue.ipp.idp.mapper.an.ParsingCftInfoMapper;
+import com.jiayue.ipp.idp.service.WindTowerInfoService;
+import com.jiayue.ipp.idp.service.WindTowerStatusDataService;
+import com.jiayue.ipp.idp.service.an.ParsingCftInfoService;
+import com.jiayue.ipp.idp.service.an.ParsingInterface;
+import com.jiayue.ipp.idp.util.FieldUtil;
+import com.jiayue.ipp.idp.util.FileUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.List;
+
+/**
+ * 测风塔解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingCftInfoServiceImpl extends ServiceImpl<ParsingCftInfoMapper, ParsingCftInfo> implements ParsingCftInfoService, ParsingInterface {
+
+
+    private final Long intervalTime = 300000L;
+
+    private final WindTowerStatusDataService windTowerStatusDataService;
+
+    private final WindTowerInfoService windTowerInfoService;
+
+
+    @Override
+    public boolean save(ParsingInfo parsingInfo) {
+        return save((ParsingCftInfo) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(String id) {
+        return removeById(id);
+    }
+
+    @Override
+    public String parsing(File file, ParsingUrl parsingUrl) {
+
+        String parsingStatus = ParsingConstant.FAIL;
+
+        try {
+
+
+            List<ParsingCftInfo> parsingCftInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingCftInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+            if (parsingCftInfos.size() > 0) {
+                List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list(Wrappers.lambdaQuery(WindTowerInfo.class)
+                        .eq(WindTowerInfo::getStationCode, parsingUrl.getStationCode())
+                        .eq(WindTowerInfo::getAnalyticUse, "1"));
+                if (windTowerInfoList.size() > 0) {
+                    List<String> fileContent = FileUtil.getFileContent(file);
+                    for (ParsingCftInfo parsingCftInfo : parsingCftInfos) {
+                        //判断文件名是否符合配置
+                        if (file.getName().indexOf(parsingCftInfo.getFileName()) >= 0) {
+
+                            if (parsingCftInfo.getDataType().equals(FieldUtil.SINGLE)) {
+                                Long time = parsingTime(parsingCftInfo.getTime(), fileContent);
+                                if (time != 0L) {
+                                    WindTowerStatusData windTowerStatusData = new WindTowerStatusData();
+                                    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
+                                    windTowerStatusData.setTime(localDateTime);
+
+                                    windTowerStatusData.setTInst(parsingValue(parsingCftInfo.gettInst(), fileContent));
+                                    windTowerStatusData.setPaInst(parsingValue(parsingCftInfo.getPaInst(), fileContent));
+                                    windTowerStatusData.setRhInst(parsingValue(parsingCftInfo.getRhInst(), fileContent));
+                                    windTowerStatusData.setAirDensity(parsingValue(parsingCftInfo.getAirDensity(), fileContent));
+
+                                    windTowerStatusData.setWsInst10(parsingValue(parsingCftInfo.getWsInst10(), fileContent));
+                                    windTowerStatusData.setWsInst30(parsingValue(parsingCftInfo.getWsInst30(), fileContent));
+                                    windTowerStatusData.setWsInst50(parsingValue(parsingCftInfo.getWsInst50(), fileContent));
+                                    windTowerStatusData.setWsInst60(parsingValue(parsingCftInfo.getWsInst60(), fileContent));
+                                    windTowerStatusData.setWsInst70(parsingValue(parsingCftInfo.getWsInst70(), fileContent));
+                                    windTowerStatusData.setWsInst80(parsingValue(parsingCftInfo.getWsInst80(), fileContent));
+                                    windTowerStatusData.setWsInst90(parsingValue(parsingCftInfo.getWsInst90(), fileContent));
+                                    windTowerStatusData.setWsInst100(parsingValue(parsingCftInfo.getWsInst100(), fileContent));
+                                    windTowerStatusData.setWsInst110(parsingValue(parsingCftInfo.getWsInst110(), fileContent));
+                                    windTowerStatusData.setWsInstHubHeight(parsingValue(parsingCftInfo.getWsInstHubHeight(), fileContent));
+
+                                    windTowerStatusData.setWdInst10(parsingValue(parsingCftInfo.getWdInst10(), fileContent));
+                                    windTowerStatusData.setWdInst30(parsingValue(parsingCftInfo.getWdInst30(), fileContent));
+                                    windTowerStatusData.setWdInst50(parsingValue(parsingCftInfo.getWdInst50(), fileContent));
+                                    windTowerStatusData.setWdInst60(parsingValue(parsingCftInfo.getWdInst60(), fileContent));
+                                    windTowerStatusData.setWdInst70(parsingValue(parsingCftInfo.getWdInst70(), fileContent));
+                                    windTowerStatusData.setWdInst80(parsingValue(parsingCftInfo.getWdInst80(), fileContent));
+                                    windTowerStatusData.setWdInst90(parsingValue(parsingCftInfo.getWdInst90(), fileContent));
+                                    windTowerStatusData.setWdInst100(parsingValue(parsingCftInfo.getWdInst100(), fileContent));
+                                    windTowerStatusData.setWdInst110(parsingValue(parsingCftInfo.getWdInst110(), fileContent));
+                                    windTowerStatusData.setWdInstHubHeight(parsingValue(parsingCftInfo.getWdInstHubHeight(), fileContent));
+
+                                    windTowerStatusData.setStatus(parsingStatus(parsingCftInfo.getStatus(), fileContent));
+                                    windTowerStatusData.setStationCode(parsingUrl.getStationCode());
+
+                                    windTowerStatusData.setEquipmentId(windTowerInfoList.get(0).getEquipmentNo());
+
+                                    windTowerStatusDataService.save(windTowerStatusData);
+                                    parsingStatus = FileTypeEnum.CFT.name();
+                                    log.info("解析CFT文件:{} 成功! O(∩_∩)O", file.getName());
+                                } else {
+                                    parsingStatus += "解析CFT文件时间错误";
+                                    log.error("解析CFT文件时间错误");
+                                }
+                            } else {
+                                parsingStatus += "cft暂无多行解析方式";
+                                log.info("cft暂无多行解析方式");
+                            }
+                        }
+                    }
+                } else {
+                    parsingStatus += "cft未配置作为解析使用设备";
+                    log.info("cft未配置作为解析使用设备");
+                }
+
+            }
+        } catch (Exception e) {
+            parsingStatus += "解析测风塔数据失败";
+            log.error("解析测风塔数据失败! /(ㄒoㄒ)/~~", e);
+        } finally {
+            return parsingStatus;
+        }
+
+    }
+}

+ 124 - 0
ipp-idp/src/main/java/com/jiayue/ipp/idp/service/impl/an/ParsingQxzInfoServiceImpl.java

@@ -0,0 +1,124 @@
+package com.jiayue.ipp.idp.service.impl.an;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ipp.common.data.entity.WeatherStationInfo;
+import com.jiayue.ipp.common.data.entity.WeatherStationStatusData;
+import com.jiayue.ipp.common.data.entity.an.ParsingInfo;
+import com.jiayue.ipp.common.data.entity.an.ParsingQxzInfo;
+import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+import com.jiayue.ipp.common.data.enums.FileTypeEnum;
+import com.jiayue.ipp.idp.dto.ParsingConstant;
+import com.jiayue.ipp.idp.mapper.an.ParsingQxzInfoMapper;
+import com.jiayue.ipp.idp.service.WeatherStationInfoService;
+import com.jiayue.ipp.idp.service.WeatherStationStatusDataService;
+import com.jiayue.ipp.idp.service.an.ParsingInterface;
+import com.jiayue.ipp.idp.service.an.ParsingQxzInfoService;
+import com.jiayue.ipp.idp.util.FieldUtil;
+import com.jiayue.ipp.idp.util.FileUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.File;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.List;
+
+/**
+ * 气象站解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+@Transactional
+public class ParsingQxzInfoServiceImpl extends ServiceImpl<ParsingQxzInfoMapper, ParsingQxzInfo> implements ParsingQxzInfoService, ParsingInterface {
+
+
+    private final Long intervalTime = 300000L;
+
+    private final WeatherStationStatusDataService weatherStationStatusDataService;
+
+    private final WeatherStationInfoService weatherStationInfoService;
+
+    @Override
+    public boolean save(ParsingInfo parsingInfo) {
+        return save((ParsingQxzInfo) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(String id) {
+        return removeById(id);
+    }
+
+    @Override
+    public String parsing(File file, ParsingUrl parsingUrl) {
+        String parsingStatus = ParsingConstant.FAIL;
+
+        try {
+
+            List<ParsingQxzInfo> parsingQxzInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingQxzInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+            if (parsingQxzInfos.size() > 0) {
+                List<WeatherStationInfo> weatherStationInfoList = weatherStationInfoService.list(Wrappers.lambdaQuery(WeatherStationInfo.class)
+                        .eq(WeatherStationInfo::getStationCode, parsingUrl.getStationCode())
+                        .eq(WeatherStationInfo::getAnalyticUse, "1"));
+                if (weatherStationInfoList.size() > 0) {
+                    List<String> fileContent = FileUtil.getFileContent(file);
+                    for (ParsingQxzInfo parsingQxzInfo : parsingQxzInfos) {
+                        //判断文件名是否符合配置
+                        if (file.getName().indexOf(parsingQxzInfo.getFileName()) >= 0) {
+                            if (parsingQxzInfo.getDataType().equals(FieldUtil.SINGLE)) {
+                                Long time = parsingTime(parsingQxzInfo.getTime(), fileContent);
+                                if (time != 0L) {
+                                    WeatherStationStatusData w = new WeatherStationStatusData();
+                                    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
+                                    w.setTime(localDateTime);
+                                    w.setAirT(parsingValue(parsingQxzInfo.getAirT(), fileContent));
+                                    w.setCellT(parsingValue(parsingQxzInfo.getCellT(), fileContent));
+                                    w.setDiffuseR(parsingValue(parsingQxzInfo.getDiffuseR(), fileContent));
+                                    w.setDiffuseRDA(parsingValue(parsingQxzInfo.getDiffuseRDA(), fileContent));
+                                    w.setDirectR(parsingValue(parsingQxzInfo.getDirectR(), fileContent));
+                                    w.setDirectRDA(parsingValue(parsingQxzInfo.getDirectRDA(), fileContent));
+                                    w.setGlobalR(parsingValue(parsingQxzInfo.getGlobalR(), fileContent));
+                                    w.setGlobalRDA(parsingValue(parsingQxzInfo.getGlobalRDA(), fileContent));
+                                    w.setHourDA(parsingValue(parsingQxzInfo.getHourDA(), fileContent));
+                                    w.setObliqueR(parsingValue(parsingQxzInfo.getObliqueR(), fileContent));
+                                    w.setObliqueRDA(parsingValue(parsingQxzInfo.getObliqueRDA(), fileContent));
+                                    w.setP(parsingValue(parsingQxzInfo.getP(), fileContent));
+                                    w.setRh(parsingValue(parsingQxzInfo.getRh(), fileContent));
+                                    w.setWd(parsingValue(parsingQxzInfo.getWd(), fileContent));
+                                    w.setWs(parsingValue(parsingQxzInfo.getWs(), fileContent));
+                                    w.setStatus(parsingStatus(parsingQxzInfo.getStatus(), fileContent));
+                                    w.setStationCode(parsingQxzInfo.getStationCode());
+                                    w.setEquipmentId(weatherStationInfoList.get(0).getEquipmentNo());
+                                    weatherStationStatusDataService.save(w);
+                                    parsingStatus = FileTypeEnum.QXZ.name();
+                                    log.info("解析QXZ文件:{} 成功! O(∩_∩)O", file.getName());
+                                } else {
+                                    parsingStatus += "解析QXZ文件时间错误";
+                                    log.error("解析QXZ文件时间错误");
+                                }
+                            } else {
+                                parsingStatus += "qxz暂无多行解析方式";
+                                log.info("qxz暂无多行解析方式");
+                            }
+                        }
+                    }
+                } else {
+                    parsingStatus += "qxz未配置作为解析使用设备";
+                    log.info("qxz未配置作为解析使用设备");
+                }
+            }
+        } catch (Exception e) {
+            parsingStatus += "解析气象站数据失败";
+            log.error("解析气象站数据失败! /(ㄒoㄒ)/~~", e);
+        } finally {
+            return parsingStatus;
+        }
+    }
+}