Browse Source

提交基础配置

tl 7 tháng trước cách đây
mục cha
commit
7e19ddbb8f
100 tập tin đã thay đổi với 8918 bổ sung0 xóa
  1. 4 0
      cpp-admin/pom.xml
  2. 53 0
      cpp-admin/src/main/java/com/cpp/web/domain/BaseDataEntity.java
  3. 82 0
      cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerShortTermCloud.java
  4. 79 0
      cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerUltraShortTermCloud.java
  5. 318 0
      cpp-admin/src/main/java/com/cpp/web/domain/cloud/NwpCloud.java
  6. 52 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/BaseParsing.java
  7. 71 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ChannelStatus.java
  8. 49 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingCdq.java
  9. 244 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingCft.java
  10. 47 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingDq.java
  11. 61 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingFileUrl.java
  12. 133 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingFj.java
  13. 57 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingLog.java
  14. 100 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingNbq.java
  15. 219 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingNwp.java
  16. 156 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingQxz.java
  17. 63 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingRp.java
  18. 47 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingType.java
  19. 31 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/dto/ParsingConfParam.java
  20. 22 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/FileTypeEnum.java
  21. 20 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/ParsingDataSourcesEnum.java
  22. 13 0
      cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/UseStatusEnum.java
  23. 117 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/ElectricField.java
  24. 68 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerShortTermStation.java
  25. 68 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerUltraShortTermStation.java
  26. 129 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/InverterInfo.java
  27. 196 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/InverterStatusData.java
  28. 236 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/NwpStation.java
  29. 164 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/PowerStationStatusData.java
  30. 145 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WeatherStationInfo.java
  31. 259 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WeatherStationStatusData.java
  32. 150 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WindTowerInfo.java
  33. 1147 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WindTowerStatusData.java
  34. 270 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WindTurbineInfo.java
  35. 213 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/WindTurbineStatusData.java
  36. 90 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/enums/EquipmentTypeEnum.java
  37. 52 0
      cpp-admin/src/main/java/com/cpp/web/domain/station/enums/ProvinceEnum.java
  38. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerShortTermMapper.java
  39. 16 0
      cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerUltraShortTermMapper.java
  40. 16 0
      cpp-admin/src/main/java/com/cpp/web/mapper/cloud/NwpMapper.java
  41. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingCdqMapper.java
  42. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingCftMapper.java
  43. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingDqMapper.java
  44. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingFileUrlMapper.java
  45. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingFjMapper.java
  46. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingNbqMapper.java
  47. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingNwpMapper.java
  48. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingQxzMapper.java
  49. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingRpMapper.java
  50. 23 0
      cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingTypeMapper.java
  51. 17 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/ElectricFieldMapper.java
  52. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerShortTermHisMapper.java
  53. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerUltraShortTermHisMapper.java
  54. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/InverterInfoMapper.java
  55. 16 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/InverterStatusDataMapper.java
  56. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/NwpHisMapper.java
  57. 14 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/PowerStationStatusDataMapper.java
  58. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WeatherStationInfoMapper.java
  59. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WeatherStationStatusDataMapper.java
  60. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTowerInfoMapper.java
  61. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTowerStatusDataMapper.java
  62. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTurbineInfoMapper.java
  63. 15 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTurbineStatusDataMapper.java
  64. 27 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerShortTermService.java
  65. 27 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerUltraShortTermService.java
  66. 17 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/NwpService.java
  67. 50 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerShortTermServiceImpl.java
  68. 33 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerUltraShortTermServiceImpl.java
  69. 37 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/NwpServiceImpl.java
  70. 19 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/BaseParsingService.java
  71. 25 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ChannelStatusService.java
  72. 371 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/CloudFileParsing.java
  73. 385 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/DownloadService.java
  74. 112 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/FtpFileParsing.java
  75. 16 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingCdqService.java
  76. 16 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingCftService.java
  77. 16 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingDqService.java
  78. 130 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFileService.java
  79. 14 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFileUrlService.java
  80. 15 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFjService.java
  81. 121 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingInterface.java
  82. 19 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingLogService.java
  83. 16 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingNbqService.java
  84. 15 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingNwpService.java
  85. 15 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingQxzService.java
  86. 16 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingRpService.java
  87. 25 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ReportingRateRecordsService.java
  88. 68 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/BaseParsingServiceImpl.java
  89. 47 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ChannelStatusServiceImpl.java
  90. 275 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCdqServiceImpl.java
  91. 137 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCftServiceImpl.java
  92. 275 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingDqServiceImpl.java
  93. 18 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFileUrlServiceImpl.java
  94. 135 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFjServiceImpl.java
  95. 34 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingLogServiceImpl.java
  96. 128 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNbqServiceImpl.java
  97. 275 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNwpServiceImpl.java
  98. 118 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingQxzServiceImpl.java
  99. 181 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRpServiceImpl.java
  100. 45 0
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ReportingRateRecordsServiceImpl.java

+ 4 - 0
cpp-admin/pom.xml

@@ -64,6 +64,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
     </dependencies>
     <profiles>    <!--考虑到window 和linux环境 npm命令格式的问题,使用maven的profile实现动态指定命令-->
         <profile>

+ 53 - 0
cpp-admin/src/main/java/com/cpp/web/domain/BaseDataEntity.java

@@ -0,0 +1,53 @@
+package com.cpp.web.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+@Data
+public class BaseDataEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 创建者
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private String creator;
+    /**
+     * 创建时间
+     */
+
+    @TableField( fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+    /**
+     * 最后修改者
+     */
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String lastModifier;
+    /**
+     * 最后修改时间
+     */
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime lastModifyTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String delFlag;
+
+    /**
+     * 场站标识
+     */
+    private String stationCode;
+}

+ 82 - 0
cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerShortTermCloud.java

@@ -0,0 +1,82 @@
+package com.cpp.web.domain.cloud;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.web.domain.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.validation.constraints.Digits;
+
+/**
+ * 中心测预测短期
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_forecast_power_short_term_cloud")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_forecast_power_short_term_cloud")
+public class ForecastPowerShortTermCloud extends BaseDataEntity {
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date time;
+
+
+    /**
+     * 预测数据
+     */
+    @ApiModelProperty(value = "预测数据")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal fpValue = new BigDecimal(-99);
+
+
+    /**
+     * 预测厂家
+     */
+    @ApiModelProperty(value = "预测厂家")
+    private String forecastManufacturers;
+
+
+    /**
+     * 预测模型
+     */
+    @ApiModelProperty(value = "预测模型")
+    private String forecastModel;
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    private BigDecimal openCapacity = new BigDecimal(-99);
+
+
+    /**
+     * 装机容量
+     */
+    @ApiModelProperty(value = "装机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+
+}

+ 79 - 0
cpp-admin/src/main/java/com/cpp/web/domain/cloud/ForecastPowerUltraShortTermCloud.java

@@ -0,0 +1,79 @@
+package com.cpp.web.domain.cloud;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.web.domain.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.validation.constraints.Digits;
+
+/**
+ * 中心测预测超短期
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_forecast_power_ultra_short_term_cloud")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_forecast_power_ultra_short_term_cloud")
+public class ForecastPowerUltraShortTermCloud extends BaseDataEntity {
+
+
+
+    /**
+     * 预测厂家
+     */
+    @ApiModelProperty(value = "预测厂家")
+    private String forecastManufacturers;
+
+
+    /**
+     * 预测模型
+     */
+    @ApiModelProperty(value = "预测模型")
+    private String forecastModel;
+
+    /**
+     * 预测值时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date time;
+
+
+    /**
+     * 预测数据
+     */
+    @ApiModelProperty(value = "预测数据")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal fpValue = new BigDecimal(-99);
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    private BigDecimal openCapacity = new BigDecimal(-99);
+
+
+    /**
+     * 装机容量
+     */
+    @ApiModelProperty(value = "装机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+}

+ 318 - 0
cpp-admin/src/main/java/com/cpp/web/domain/cloud/NwpCloud.java

@@ -0,0 +1,318 @@
+package com.cpp.web.domain.cloud;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import javax.validation.constraints.Digits;
+
+/**
+ * 中心测数值天气预报
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_nwp_cloud")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_nwp_cloud")
+public class NwpCloud extends BaseDataEntity {
+
+
+    /**
+     * 预测厂家
+     */
+    @ApiModelProperty(value = "预测厂家")
+    private String forecastManufacturers;
+
+
+    /**
+     * 预测模型
+     */
+    @ApiModelProperty(value = "预测模型")
+    private String forecastModel;
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date time;
+
+
+    /**
+     * 温度
+     */
+    @ApiModelProperty(value = "温度")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal t = 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 pressure = new BigDecimal(-99);
+
+
+    /**
+     * 短波辐射
+     */
+    @ApiModelProperty(value = "短波辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal swr = new BigDecimal(-99);
+
+
+    /**
+     * 长波辐射
+     */
+    @ApiModelProperty(value = "长波辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal lwr = new BigDecimal(-99);
+
+
+    /**
+     * 直辐射
+     */
+    @ApiModelProperty(value = "直辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal directRadiation = new BigDecimal(-99);
+
+
+    /**
+     * 散辐射
+     */
+    @ApiModelProperty(value = "散辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal diffuseRadiation = new BigDecimal(-99);
+
+
+    /**
+     * 热感通量
+     */
+    @ApiModelProperty(value = "热感通量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal senf = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速
+     */
+    @ApiModelProperty(value = "10米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws10 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速
+     */
+    @ApiModelProperty(value = "30米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws30 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速
+     */
+    @ApiModelProperty(value = "50米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws50 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速
+     */
+    @ApiModelProperty(value = "70米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws70 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速
+     */
+    @ApiModelProperty(value = "80米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws80 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速
+     */
+    @ApiModelProperty(value = "90米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws90 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速
+     */
+    @ApiModelProperty(value = "100米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws100 = new BigDecimal(-99);
+
+
+    /**
+     * 170米风速
+     */
+    @ApiModelProperty(value = "170米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws170 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向
+     */
+    @ApiModelProperty(value = "10米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd10 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向
+     */
+    @ApiModelProperty(value = "30米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd30 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向
+     */
+    @ApiModelProperty(value = "50米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd50 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向
+     */
+    @ApiModelProperty(value = "70米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd70 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向
+     */
+    @ApiModelProperty(value = "80米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd80 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向
+     */
+    @ApiModelProperty(value = "90米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd90 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向
+     */
+    @ApiModelProperty(value = "100米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd100 = new BigDecimal(-99);
+
+
+    /**
+     * 170米风向
+     */
+    @ApiModelProperty(value = "170米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd170 = new BigDecimal(-99);
+
+    /**
+     * 110米风速
+     */
+    @ApiModelProperty(value = "110米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws110 = new BigDecimal(-99);
+    /**
+     * 120米风速
+     */
+    @ApiModelProperty(value = "120米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws120 = new BigDecimal(-99);
+    /**
+     * 130米风速
+     */
+    @ApiModelProperty(value = "130米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws130 = new BigDecimal(-99);
+    /**
+     * 140米风速
+     */
+    @ApiModelProperty(value = "140米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws140 = new BigDecimal(-99);
+    /**
+     * 150米风速
+     */
+    @ApiModelProperty(value = "150米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws150 = new BigDecimal(-99);
+    /**
+     * 110米风向
+     */
+    @ApiModelProperty(value = "110米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd110 = new BigDecimal(-99);
+    /**
+     * 120米风向
+     */
+    @ApiModelProperty(value = "120米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd120 = new BigDecimal(-99);
+    /**
+     * 130米风向
+     */
+    @ApiModelProperty(value = "130米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd130 = new BigDecimal(-99);
+    /**
+     * 140米风向
+     */
+    @ApiModelProperty(value = "140米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd140 = new BigDecimal(-99);
+    /**
+     * 150米风向
+     */
+    @ApiModelProperty(value = "150米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd150 = new BigDecimal(-99);
+    /**
+     * 降水总量
+     */
+    @ApiModelProperty(value = "降水总量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal tpr = new BigDecimal(-99);
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+}

+ 52 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/BaseParsing.java

@@ -0,0 +1,52 @@
+package com.cpp.web.domain.datafactory;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.cpp.common.annotation.Excel;
+import com.cpp.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 基础解析
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+public class BaseParsing extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 数据类型(s:单行,m:多行)
+     */
+    @ApiModelProperty(value = "文件名")
+    private String dataType;
+
+    /**
+     * 文件名
+     */
+    @ApiModelProperty(value = "文件名")
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @ApiModelProperty(value = "文件类型")
+    private String fileType;
+
+
+    /**
+     * 场站编码
+     */
+    @ApiModelProperty(value = "场站编码")
+    private String stationCode;
+}

+ 71 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ChannelStatus.java

@@ -0,0 +1,71 @@
+//package com.cpp.web.domain.datafactory;
+//
+//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.BaseEntity;
+//import io.swagger.annotations.ApiModel;
+//import io.swagger.annotations.ApiModelProperty;
+//import lombok.Data;
+//import lombok.EqualsAndHashCode;
+//
+//import java.util.Date;
+//
+///**
+// * 通道状态表
+// *
+// * @author csc code generator
+// * @date 2022-12-28 14:49:40
+// */
+//@Data
+//@TableName("pf_channel_status")
+//@EqualsAndHashCode(callSuper = true)
+//@ApiModel(value = "通道状态表")
+//public class ChannelStatus extends BaseEntity<ChannelStatus> {
+//    private static final long serialVersionUID = 1L;
+//
+//
+//    /**
+//     *
+//     */
+//    @TableId(type = IdType.ASSIGN_UUID)
+//    @ApiModelProperty(value = "主键ID")
+//    private String id;
+//
+//
+//    /**
+//     * 类型:接入;上报
+//     */
+//    @ApiModelProperty(value = "类型:1接入;0上报")
+//    private String type;
+//
+//
+//    /**
+//     * 通道名称
+//     */
+//    @ApiModelProperty(value = "通道名称")
+//    private String channelName;
+//
+//
+//    /**
+//     * 状态:0正常;1异常
+//     */
+//    @ApiModelProperty(value = "状态:0正常;1异常")
+//    private String status;
+//
+//
+//    /**
+//     * 场站标识
+//     */
+//    @ApiModelProperty(value = "场站标识")
+//    private String stationCode;
+//
+//
+//    /**
+//     * 上报时间
+//     */
+//    @ApiModelProperty(value = "上报时间")
+//    private Date uploadTime;
+//
+//
+//}

+ 49 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingCdq.java

@@ -0,0 +1,49 @@
+package com.cpp.web.domain.datafactory;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.web.domain.datafactory.BaseParsing;
+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("cpp_parsing_cdq")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_cdq")
+public class ParsingCdq extends BaseParsing {
+
+
+
+
+
+    /**
+     * 数据生成日期
+     */
+    @ApiModelProperty(value = "数据生成日期")
+    private String genDate;
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测时间")
+    private String forecastTime;
+
+
+    /**
+     * 预测数据
+     */
+    @ApiModelProperty(value = "预测数据")
+    private String fpValue;
+
+
+}

+ 244 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingCft.java

@@ -0,0 +1,244 @@
+package com.cpp.web.domain.datafactory;
+
+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("cpp_parsing_cft")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_cft")
+public class ParsingCft extends BaseParsing {
+
+
+    /**
+     * 状态值为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;
+}

+ 47 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingDq.java

@@ -0,0 +1,47 @@
+package com.cpp.web.domain.datafactory;
+
+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;
+
+/**
+ * dq解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_dq")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_dq")
+public class ParsingDq extends BaseParsing{
+
+
+    /**
+     * 数据生成日期
+     */
+    @ApiModelProperty(value = "数据生成日期")
+    private String genDate;
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测时间")
+    private String forecastTime;
+
+
+    /**
+     * 预测数据
+     */
+    @ApiModelProperty(value = "预测数据")
+    private String fpValue;
+
+
+
+
+}

+ 61 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingFileUrl.java

@@ -0,0 +1,61 @@
+package com.cpp.web.domain.datafactory;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.annotation.Excel;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.domain.datafactory.enums.ParsingDataSourcesEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * ftp解析文件
+ * Parse file
+ *
+ * @author tl
+ * @version 1.0
+ */
+@TableName("cpp_parsing_file_url")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_file_url")
+@Data
+public class ParsingFileUrl extends BaseEntity {
+
+    /**
+     * Id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 场站编号
+     */
+    @ApiModelProperty(value = "场站编号")
+    private String stationCode;
+
+
+    /**
+     * 解析分类(云端预测,站端上报)
+     */
+    @ApiModelProperty(value = "解析分类")
+    private ParsingDataSourcesEnum parsingDataSources;
+
+    /**
+     * 文件类型
+     */
+    @ApiModelProperty(value = "文件类型")
+    private FileTypeEnum fileType;
+
+    /**
+     * 文件扫描路径
+     */
+    @ApiModelProperty(value = "文件扫描路径")
+    private String url;
+
+}

+ 133 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingFj.java

@@ -0,0 +1,133 @@
+package com.cpp.web.domain.datafactory;
+
+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("cpp_parsing_fj")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_fj")
+public class ParsingFj extends BaseParsing {
+
+    /**
+     * 设备名称(该项对应本地设备中的设备名称)
+     */
+    @ApiModelProperty(value = "设备名称")
+    private String equipmentName;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+
+    /**
+     * 有功(KW)
+     */
+    @ApiModelProperty(value = "有功(KW)")
+    private String activePower;
+
+
+    /**
+     * 无功(KVar)
+     */
+    @ApiModelProperty(value = "无功(KVar)")
+    private String reactivePower;
+
+
+    /**
+     * 功率因数
+     */
+    @ApiModelProperty(value = "功率因数")
+    private String powerFactor;
+
+
+    /**
+     * 电压(V)
+     */
+    @ApiModelProperty(value = "电压(V)")
+    private String voltage;
+
+
+    /**
+     * 电流(A)
+     */
+    @ApiModelProperty(value = "电流(A)")
+    private String electricalCurrent;
+
+
+    /**
+     * 当日发电量(kW·h)
+     */
+    @ApiModelProperty(value = "当日发电量(kW·h)")
+    private String dayElectricQuantity;
+
+
+    /**
+     * 当日并网小时
+     */
+    @ApiModelProperty(value = "当日并网小时")
+    private String dayGridConnectedHours;
+
+
+    /**
+     * 转速(rpm)
+     */
+    @ApiModelProperty(value = "转速(rpm)")
+    private String windWheelRatedSpeed;
+
+
+    /**
+     * 风速(m/s)
+     */
+    @ApiModelProperty(value = "风速(m/s)")
+    private String ws;
+
+
+    /**
+     * 风向(°)
+     */
+    @ApiModelProperty(value = "风向(°)")
+    private String wd;
+
+
+    /**
+     * 温度(℃)
+     */
+    @ApiModelProperty(value = "温度(℃)")
+    private String t;
+
+
+    /**
+     * 桨距角(°)
+     */
+    @ApiModelProperty(value = "桨距角(°)")
+    private String pitchAngle;
+
+
+    /**
+     * 累积发电量(MW·h)
+     */
+    @ApiModelProperty(value = "累积发电量(MW·h)")
+    private String cumulativeGeneratedEnergy;
+}

+ 57 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingLog.java

@@ -0,0 +1,57 @@
+package com.cpp.web.domain.datafactory;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.annotation.Excel;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 解析记录
+ */
+@Data
+@TableName("cpp_parsing_log")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_log")
+public class ParsingLog extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private String id;
+
+    /**
+     * 文件名
+     */
+    @Excel(name = "文件名")
+    private String fileName;
+
+    /**
+     * 文件解析状态
+     */
+    @Excel(name = "文件解析状态1成功0失败")
+    private String parsingFileStatus;
+
+    /**
+     * 文件解析状态描述
+     */
+    @Excel(name = "文件解析状态描述")
+    private String parsingDescribe;
+
+    /**
+     * 解析时间
+     */
+    @Excel(name = "解析时间")
+    private Date parsingTime;
+
+    /**
+     * 文件类型
+     */
+    @Excel(name = "文件类型")
+    private FileTypeEnum fileType;
+}

+ 100 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingNbq.java

@@ -0,0 +1,100 @@
+package com.cpp.web.domain.datafactory;
+
+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;
+
+/**
+ * dq解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_nbq")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_nbq")
+public class ParsingNbq extends BaseParsing {
+
+
+    /**
+     * 设备名称(该项对应本地设备中的设备名称)
+     */
+    @ApiModelProperty(value = "设备名称")
+    private String equipmentName;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+
+    /**
+     * 有功(KW)
+     */
+    @ApiModelProperty(value = "有功(KW)")
+    private String activePower;
+
+
+    /**
+     * 无功(KVar)
+     */
+    @ApiModelProperty(value = "无功(KVar)")
+    private String reactivePower;
+
+
+    /**
+     * 功率因数
+     */
+    @ApiModelProperty(value = "功率因数")
+    private String powerFactor;
+
+
+    /**
+     * 电压
+     */
+    @ApiModelProperty(value = "电压")
+    private String voltage;
+
+
+    /**
+     * 电流
+     */
+    @ApiModelProperty(value = "电流")
+    private String electricalCurrent;
+
+
+    /**
+     * 当日发电量
+     */
+    @ApiModelProperty(value = "当日发电量")
+    private String dayElectricQuantity;
+
+
+    /**
+     * 累积发电量
+     */
+    @ApiModelProperty(value = "累积发电量")
+    private String cumulativeGeneratedEnergy;
+
+
+    /**
+     * 当日并网小时数
+     */
+    @ApiModelProperty(value = "当日并网小时数")
+    private String dayGridConnectedHours;
+
+}

+ 219 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingNwp.java

@@ -0,0 +1,219 @@
+package com.cpp.web.domain.datafactory;
+
+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;
+
+/**
+ * nwp解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_nwp")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_nwp")
+public class ParsingNwp extends BaseParsing {
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测时间")
+    private String preTime;
+
+
+    /**
+     * 生成日期
+     */
+    @ApiModelProperty(value = "生成日期")
+    private String scDate;
+
+
+    /**
+     * 生成时间
+     */
+    @ApiModelProperty(value = "生成时间")
+    private String scTime;
+
+
+    /**
+     * 预测日期
+     */
+    @ApiModelProperty(value = "预测日期")
+    private String preDate;
+
+
+    /**
+     * 温度
+     */
+    @ApiModelProperty(value = "温度")
+    private String t;
+
+
+    /**
+     * 湿度
+     */
+    @ApiModelProperty(value = "湿度")
+    private String rh;
+
+
+    /**
+     * 气压
+     */
+    @ApiModelProperty(value = "气压")
+    private String pressure;
+
+
+    /**
+     * 短波辐射
+     */
+    @ApiModelProperty(value = "短波辐射")
+    private String swr;
+
+
+    /**
+     * 长波辐射
+     */
+    @ApiModelProperty(value = "长波辐射")
+    private String lwr;
+
+
+    /**
+     * 直辐射
+     */
+    @ApiModelProperty(value = "直辐射")
+    private String directRadiation;
+
+
+    /**
+     * 散辐射
+     */
+    @ApiModelProperty(value = "散辐射")
+    private String diffuseRadiation;
+
+
+    /**
+     * 热感通量
+     */
+    @ApiModelProperty(value = "热感通量")
+    private String senf;
+
+
+    /**
+     * 10米风速
+     */
+    @ApiModelProperty(value = "10米风速")
+    private String ws10;
+
+
+    /**
+     * 30米风速
+     */
+    @ApiModelProperty(value = "30米风速")
+    private String ws30;
+
+
+    /**
+     * 50米风速
+     */
+    @ApiModelProperty(value = "50米风速")
+    private String ws50;
+
+
+    /**
+     * 70米风速
+     */
+    @ApiModelProperty(value = "70米风速")
+    private String ws70;
+
+
+    /**
+     * 80米风速
+     */
+    @ApiModelProperty(value = "80米风速")
+    private String ws80;
+
+
+    /**
+     * 90米风速
+     */
+    @ApiModelProperty(value = "90米风速")
+    private String ws90;
+
+
+    /**
+     * 100米风速
+     */
+    @ApiModelProperty(value = "100米风速")
+    private String ws100;
+
+
+    /**
+     * 170米风速
+     */
+    @ApiModelProperty(value = "170米风速")
+    private String ws170;
+
+
+    /**
+     * 10米风向
+     */
+    @ApiModelProperty(value = "10米风向")
+    private String wd10;
+
+
+    /**
+     * 30米风向
+     */
+    @ApiModelProperty(value = "30米风向")
+    private String wd30;
+
+
+    /**
+     * 50米风向
+     */
+    @ApiModelProperty(value = "50米风向")
+    private String wd50;
+
+
+    /**
+     * 70米风向
+     */
+    @ApiModelProperty(value = "70米风向")
+    private String wd70;
+
+
+    /**
+     * 80米风向
+     */
+    @ApiModelProperty(value = "80米风向")
+    private String wd80;
+
+
+    /**
+     * 90米风向
+     */
+    @ApiModelProperty(value = "90米风向")
+    private String wd90;
+
+
+    /**
+     * 100米风向
+     */
+    @ApiModelProperty(value = "100米风向")
+    private String wd100;
+
+
+    /**
+     * 170米风向
+     */
+    @ApiModelProperty(value = "170米风向")
+    private String wd170;
+
+}

+ 156 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingQxz.java

@@ -0,0 +1,156 @@
+package com.cpp.web.domain.datafactory;
+
+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;
+
+/**
+ * cdq解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_qxz")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_qxz")
+public class ParsingQxz extends BaseParsing {
+
+    /**
+     * 数据类型(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;
+}

+ 63 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingRp.java

@@ -0,0 +1,63 @@
+package com.cpp.web.domain.datafactory;
+
+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;
+
+/**
+ * rp解析配置
+ * Parse file
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_rp")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_rp")
+public class ParsingRp extends BaseParsing {
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+
+    /**
+     * 实际功率(MW)
+     */
+    @ApiModelProperty(value = "实际功率(MW)")
+    private String realValue;
+
+
+    /**
+     * 可用功率(MW)
+     */
+    @ApiModelProperty(value = "可用功率(MW)")
+    private String ableValue;
+
+
+    /**
+     * 理论功率(MW)
+     */
+    @ApiModelProperty(value = "理论功率(MW)")
+    private String theoryValue;
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    private String openCapacity;
+
+
+    /**
+     * 装机容量(MW)
+     */
+    @ApiModelProperty(value = "装机容量(MW)")
+    private String capacity;
+}

+ 47 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/ParsingType.java

@@ -0,0 +1,47 @@
+package com.cpp.web.domain.datafactory;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.annotation.Excel;
+import com.cpp.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 解析配置
+ * <p>
+ * Parse file
+ *
+ * @author tl
+ * @version 1.0
+ */
+@Data
+@TableName("cpp_parsing_type")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_parsing_type")
+public class ParsingType extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 识别文件名标识
+     */
+    @ApiModelProperty(value = "文件名")
+    private String fileName;
+
+    /**
+     * 文件类型
+     */
+    @ApiModelProperty(value = "文件类型")
+    private String fileType;
+
+
+}

+ 31 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/dto/ParsingConfParam.java

@@ -0,0 +1,31 @@
+package com.cpp.web.domain.datafactory.dto;
+
+import lombok.Data;
+
+/*
+ * 解析配置格式规则:
+ *   s<<=>>1<<=>>entity
+ *   s:单行标识
+ *   1:取值在1行
+ *   entity=:键标记标记
+ *
+ *   m<<=>>4-20<<=>>3
+ *   m:多行标识
+ *   4-20:取值在4-20行
+ *   3:第三列
+ * */
+@Data
+public class ParsingConfParam {
+
+    //数据所在行
+    private String lineNumber;
+
+    //数据所在横向组
+    private String rowNumber;
+
+    //数据标记
+    private String dataSign;
+
+    //时间格式
+    private String format;
+}

+ 22 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/FileTypeEnum.java

@@ -0,0 +1,22 @@
+package com.cpp.web.domain.datafactory.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum FileTypeEnum {
+    E1(1, "短期"),
+    E2(2, "超短期"),
+    E3(3, "实发功率"),
+    E4(4, "NWP"),
+    E5(5, "运行信息"),
+    E6(6, "气象站"),
+    E7(7, "测风塔"),
+    E8(8, "逆变器"),
+    E9(9, "风机");
+
+    private Integer code;
+    private String message;
+
+}

+ 20 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/ParsingDataSourcesEnum.java

@@ -0,0 +1,20 @@
+package com.cpp.web.domain.datafactory.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 解析通道类型
+ *
+ * @Author: tl
+ * @Date: 2023/6/2 14:24
+ */
+@Getter
+@AllArgsConstructor
+public enum ParsingDataSourcesEnum {
+
+    E1(1, "ftp(站端)"),
+    E2(2, "云端(中心侧)");
+    private Integer code;
+    private String message;
+}

+ 13 - 0
cpp-admin/src/main/java/com/cpp/web/domain/datafactory/enums/UseStatusEnum.java

@@ -0,0 +1,13 @@
+package com.cpp.web.domain.datafactory.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum UseStatusEnum {
+    E1(1, "使用"),
+    E2(2, "停用");
+    private Integer code;
+    private String message;
+}

+ 117 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/ElectricField.java

@@ -0,0 +1,117 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.station.enums.ProvinceEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * cpp_electric_field
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_electric_field")
+@EqualsAndHashCode(callSuper = true)
+public class ElectricField extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 场站编号
+     */
+    @ApiModelProperty(value = "场站编号")
+    private String stationCode;
+
+
+    /**
+     * 电站名称
+     */
+    @ApiModelProperty(value = "电站名称")
+    private String name;
+
+
+    /**
+     * 场站装机容量(MW)
+     */
+    @ApiModelProperty(value = "场站装机容量(MW)")
+    private BigDecimal capacity;
+
+
+    /**
+     * 并网设备数
+     */
+    @ApiModelProperty(value = "并网设备数")
+    private Integer gridCE;
+
+
+    /**
+     * 场站经度
+     */
+    @ApiModelProperty(value = "场站经度")
+    private BigDecimal longitude;
+
+
+    /**
+     * 场站纬度
+     */
+    @ApiModelProperty(value = "场站纬度")
+    private BigDecimal latitude;
+
+
+    /**
+     * 海拔
+     */
+    @ApiModelProperty(value = "altitude")
+    private BigDecimal altitude;
+
+
+    /**
+     * 场站类型1:光伏电站,2:风力电站
+     */
+    @ApiModelProperty(value = "场站类型1:光伏电站,2:风力电站")
+    private String electricFieldTypeEnum;
+
+
+
+    /**
+     * 场站所属公司
+     */
+    @ApiModelProperty(value = "场站所属公司")
+    private String company;
+
+
+    /**
+     * 场站位置
+     */
+    @ApiModelProperty(value = "场站位置")
+    private String location;
+
+
+    /**
+     * 场站面积
+     */
+    @ApiModelProperty(value = "场站面积")
+    private BigDecimal area;
+
+
+
+    /**
+     * 上报省调
+     */
+//    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "省份")
+    private ProvinceEnum provinceEnum;
+}

+ 68 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerShortTermStation.java

@@ -0,0 +1,68 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.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.util.Date;
+
+/**
+ * 站端预测短期
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_forecast_power_short_term_station")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_forecast_power_short_term_station")
+public class ForecastPowerShortTermStation extends BaseDataEntity {
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date forecastTime;
+
+
+    /**
+     * 预测功率
+     */
+    @ApiModelProperty(value = "预测功率")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal fpValue = new BigDecimal(-99);
+
+
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    private BigDecimal openCapacity = new BigDecimal(-99);
+
+
+    /**
+     * 装机容量
+     */
+    @ApiModelProperty(value = "装机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+
+}

+ 68 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/ForecastPowerUltraShortTermStation.java

@@ -0,0 +1,68 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.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.util.Date;
+
+/**
+ * 站端超短期
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_forecast_power_ultra_short_term_station")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_forecast_power_ultra_short_term_station")
+public class ForecastPowerUltraShortTermStation extends BaseDataEntity {
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date time;
+
+
+    /**
+     * 预测功率
+     */
+    @ApiModelProperty(value = "预测功率")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal fpValue = new BigDecimal(-99);
+
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal openCapacity = new BigDecimal(-99);
+
+
+    /**
+     * 装机容量
+     */
+    @ApiModelProperty(value = "装机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+
+}

+ 129 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/InverterInfo.java

@@ -0,0 +1,129 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.station.enums.EquipmentTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * cpp_inverter_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_inverter_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_inverter_info")
+public class InverterInfo extends BaseEntity {
+
+    public InverterInfo() {
+        this.setEquipmentType(EquipmentTypeEnum.INVERTER.getCode());
+    }
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 设备类型
+     */
+    @ApiModelProperty(value = "设备类型")
+    private Integer equipmentType;
+
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+
+    /**
+     * 制造商
+     */
+    @ApiModelProperty(value = "制造商")
+    private String manufacturer;
+
+
+    /**
+     * 型号
+     */
+    @ApiModelProperty(value = "型号")
+    private String modelNumber;
+
+
+    /**
+     * 安装时间
+     */
+    @ApiModelProperty(value = "安装时间")
+    private Date installationTime;
+
+
+    /**
+     * 入库时间间隔  单位 s
+     */
+    @ApiModelProperty(value = "入库时间间隔  单位 s")
+    private Integer timeInterval;
+
+
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号")
+    private String equipmentNo;
+
+
+    /**
+     * 是否组串式 1:是 0:不是
+     */
+    @ApiModelProperty(value = "是否组串式 1:是 0:不是")
+    private String groupSeries;
+
+
+    /**
+     * 逆变器效率
+     */
+    @ApiModelProperty(value = "逆变器效率")
+    private BigDecimal efficiency = new BigDecimal(-99);
+
+
+    /**
+     * 额定功率
+     */
+    @ApiModelProperty(value = "额定功率")
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+    /**
+     * 集电线路
+     */
+    @ApiModelProperty(value = "集电线路")
+    private String collectorCircuit;
+
+
+    /**
+     * 逆变器是否样板机 1:是 0:不是
+     */
+    @ApiModelProperty(value = "逆变器是否样板机 1:是 0:不是")
+    private String sample;
+    /**
+     * 绑定数据采集通道
+     */
+    @ApiModelProperty(value = "绑定数据采集通道")
+    private String bindTunnel;
+
+}

+ 196 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/InverterStatusData.java

@@ -0,0 +1,196 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+
+import com.cpp.web.domain.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;
+
+/**
+ * cpp_inverter_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_inverter_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_inverter_status_data")
+public class InverterStatusData extends BaseDataEntity {
+
+
+    /**
+     * 设备主键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);
+
+
+    /**
+     * 有功(KW)
+     */
+    @ApiModelProperty(value = "有功(KW)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal activePower = new BigDecimal(-99);
+
+
+    /**
+     * 无功(KVar)
+     */
+    @ApiModelProperty(value = "无功(KVar)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal reactivePower = new BigDecimal(-99);
+
+
+    /**
+     * 功率因数
+     */
+    @ApiModelProperty(value = "功率因数")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal powerFactor = new BigDecimal(-99);
+
+
+    /**
+     * 电压
+     */
+    @ApiModelProperty(value = "电压")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal voltage = new BigDecimal(-99);
+
+
+    /**
+     * 电流
+     */
+    @ApiModelProperty(value = "电流")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal electricalCurrent = new BigDecimal(-99);
+
+
+    /**
+     * 当日发电量
+     */
+    @ApiModelProperty(value = "当日发电量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal dayElectricQuantity = new BigDecimal(-99);
+
+
+    /**
+     * 累积发电量
+     */
+    @ApiModelProperty(value = "累积发电量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal cumulativeGeneratedEnergy = new BigDecimal(-99);
+
+
+    /**
+     * 当日并网小时数
+     */
+    @ApiModelProperty(value = "当日并网小时数")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal dayGridConnectedHours = new BigDecimal(-99);
+
+
+}

+ 236 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/NwpStation.java

@@ -0,0 +1,236 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+
+import com.cpp.web.domain.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.util.Date;
+
+/**
+ * 站端nwp
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_nwp_station")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_nwp_station")
+public class NwpStation extends BaseDataEntity {
+
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+
+    /**
+     * 预测时间
+     */
+    @ApiModelProperty(value = "预测值时间")
+    private Date time;
+    
+
+    /**
+     * 温度
+     */
+    @ApiModelProperty(value = "温度")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal t = 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 pressure = new BigDecimal(-99);
+
+
+    /**
+     * 短波辐射
+     */
+    @ApiModelProperty(value = "短波辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal swr = new BigDecimal(-99);
+
+
+    /**
+     * 长波辐射
+     */
+    @ApiModelProperty(value = "长波辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal lwr = new BigDecimal(-99);
+
+
+    /**
+     * 直辐射
+     */
+    @ApiModelProperty(value = "直辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal directRadiation = new BigDecimal(-99);
+
+
+    /**
+     * 散辐射
+     */
+    @ApiModelProperty(value = "散辐射")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal diffuseRadiation = new BigDecimal(-99);
+
+
+    /**
+     * 热感通量
+     */
+    @ApiModelProperty(value = "热感通量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal senf = new BigDecimal(-99);
+
+
+    /**
+     * 10米风速
+     */
+    @ApiModelProperty(value = "10米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws10 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风速
+     */
+    @ApiModelProperty(value = "30米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws30 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风速
+     */
+    @ApiModelProperty(value = "50米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws50 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风速
+     */
+    @ApiModelProperty(value = "70米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws70 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风速
+     */
+    @ApiModelProperty(value = "80米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws80 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风速
+     */
+    @ApiModelProperty(value = "90米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws90 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风速
+     */
+    @ApiModelProperty(value = "100米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws100 = new BigDecimal(-99);
+
+
+    /**
+     * 170米风速
+     */
+    @ApiModelProperty(value = "170米风速")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ws170 = new BigDecimal(-99);
+
+
+    /**
+     * 10米风向
+     */
+    @ApiModelProperty(value = "10米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd10 = new BigDecimal(-99);
+
+
+    /**
+     * 30米风向
+     */
+    @ApiModelProperty(value = "30米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd30 = new BigDecimal(-99);
+
+
+    /**
+     * 50米风向
+     */
+    @ApiModelProperty(value = "50米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd50 = new BigDecimal(-99);
+
+
+    /**
+     * 70米风向
+     */
+    @ApiModelProperty(value = "70米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd70 = new BigDecimal(-99);
+
+
+    /**
+     * 80米风向
+     */
+    @ApiModelProperty(value = "80米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd80 = new BigDecimal(-99);
+
+
+    /**
+     * 90米风向
+     */
+    @ApiModelProperty(value = "90米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd90 = new BigDecimal(-99);
+
+
+    /**
+     * 100米风向
+     */
+    @ApiModelProperty(value = "100米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd100 = new BigDecimal(-99);
+
+
+    /**
+     * 170米风向
+     */
+    @ApiModelProperty(value = "170米风向")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal wd170 = new BigDecimal(-99);
+
+}

+ 164 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/PowerStationStatusData.java

@@ -0,0 +1,164 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+
+import com.cpp.web.domain.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;
+
+/**
+ * cpp_power_station_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_power_station_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_power_station_status_data")
+public class PowerStationStatusData extends BaseDataEntity {
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private LocalDateTime time;
+
+
+    /**
+     * 备用字段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);
+
+    /**
+     * 实际功率(MW)
+     */
+    @ApiModelProperty(value = "实际功率(MW)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal realValue = new BigDecimal(-99);
+
+
+    /**
+     * 可用功率(MW)
+     */
+    @ApiModelProperty(value = "可用功率(MW)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal ableValue = new BigDecimal(-99);
+
+
+    /**
+     * 理论功率(MW)
+     */
+    @ApiModelProperty(value = "理论功率(MW)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal theoryValue = new BigDecimal(-99);
+
+    /**
+     * 开机容量
+     */
+    @ApiModelProperty(value = "开机容量")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal openCapacity = new BigDecimal(-99);
+
+
+    /**
+     * 装机容量(MW)
+     */
+    @ApiModelProperty(value = "装机容量(MW)")
+    @Digits(integer = 10, fraction = 2)
+    private BigDecimal capacity = new BigDecimal(-99);
+
+
+
+    /**
+     * jsonText
+     */
+    @ApiModelProperty(value = "jsonText")
+    private String jsonText;
+
+
+
+    /**
+     * 备用字段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);
+
+}

+ 145 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WeatherStationInfo.java

@@ -0,0 +1,145 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.station.enums.EquipmentTypeEnum;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+
+/**
+ * cpp_weather_station_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_weather_station_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_weather_station_info")
+public class WeatherStationInfo extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    public WeatherStationInfo() {
+        this.setEquipmentType(EquipmentTypeEnum.WEATHERSTATION.getCode());
+    }
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 备用字段A
+     */
+    @ApiModelProperty(value = "备用字段A")
+    private String backupA;
+
+
+    /**
+     * 备用字段B
+     */
+    @ApiModelProperty(value = "备用字段B")
+    private String backupB;
+
+
+    /**
+     * 备用字段C
+     */
+    @ApiModelProperty(value = "备用字段C")
+    private String backupC;
+
+
+    /**
+     * 备用字段D
+     */
+    @ApiModelProperty(value = "备用字段D")
+    private String backupD;
+
+
+    /**
+     * 备用字段E
+     */
+    @ApiModelProperty(value = "备用字段E")
+    private String backupE;
+
+
+    /**
+     * 设备类型
+     */
+    @ApiModelProperty(value = "设备类型")
+    private Integer equipmentType;
+
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+
+    /**
+     * 制造商
+     */
+    @ApiModelProperty(value = "制造商")
+    private String manufacturer;
+
+
+    /**
+     * 型号
+     */
+    @ApiModelProperty(value = "型号")
+    private String modelNumber;
+
+
+    /**
+     * 安装时间
+     */
+    @ApiModelProperty(value = "安装时间")
+    private LocalDate installationTime;
+
+
+    /**
+     * 是否上报 1:是 0 否
+     */
+    @ApiModelProperty(value = "是否上报 1:是 0 否")
+    private String report;
+
+
+    /**
+     * 入库时间间隔 单位 s
+     */
+    @ApiModelProperty(value = "入库时间间隔 单位 s")
+    private Integer timeInterval;
+
+
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号")
+    private String equipmentNo;
+
+
+    /**
+     * 绑定数据采集通道
+     */
+    @ApiModelProperty(value = "绑定数据采集通道")
+    private String bindTunnel;
+
+    /**
+     * 是否作为解析使用 1:是 0 否
+     */
+    @ApiModelProperty(value = "是否解析 1:是 0 否")
+    private String analyticUse;
+
+}

+ 259 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WeatherStationStatusData.java

@@ -0,0 +1,259 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.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.util.Date;
+
+/**
+ * cpp_weather_station_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_weather_station_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_weather_station_status_data")
+public class WeatherStationStatusData extends BaseDataEntity {
+
+
+    /**
+     * 设备主键ID
+     */
+    @ApiModelProperty(value = "设备主键ID")
+    private String equipmentId;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private Date 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;
+
+
+}

+ 150 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WindTowerInfo.java

@@ -0,0 +1,150 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.station.enums.EquipmentTypeEnum;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+
+/**
+ * cpp_wind_tower_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_wind_tower_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_wind_tower_info")
+public class WindTowerInfo extends BaseEntity {
+
+    public WindTowerInfo() {
+        this.setEquipmentType(EquipmentTypeEnum.WINDTOWER.getCode());
+    }
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 备用字段A
+     */
+    @ApiModelProperty(value = "备用字段A")
+    private String backupA;
+
+
+    /**
+     * 备用字段B
+     */
+    @ApiModelProperty(value = "备用字段B")
+    private String backupB;
+
+
+    /**
+     * 备用字段C
+     */
+    @ApiModelProperty(value = "备用字段C")
+    private String backupC;
+
+
+    /**
+     * 备用字段D
+     */
+    @ApiModelProperty(value = "备用字段D")
+    private String backupD;
+
+
+    /**
+     * 备用字段E
+     */
+    @ApiModelProperty(value = "备用字段E")
+    private String backupE;
+
+
+    /**
+     * 设备类型
+     */
+    @ApiModelProperty(value = "设备类型")
+    private Integer equipmentType;
+
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+
+    /**
+     * 制造商
+     */
+    @ApiModelProperty(value = "制造商")
+    private String manufacturer;
+
+
+    /**
+     * 型号
+     */
+    @ApiModelProperty(value = "型号")
+    private String modelNumber;
+
+
+    /**
+     * 安装时间
+     */
+    @ApiModelProperty(value = "安装时间")
+    private LocalDate installationTime;
+
+
+    /**
+     * 是否上报 1:是 0 否
+     */
+    @ApiModelProperty(value = "是否上报 1:是 0 否")
+    private String report;
+
+
+    /**
+     * 入库时间间隔 单位 s
+     */
+    @ApiModelProperty(value = "入库时间间隔 单位 s")
+    private Integer timeInterval;
+
+
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号")
+    private String equipmentNo;
+
+
+    /**
+     * 测风塔是否样板机 1:是 0:否
+     */
+    @ApiModelProperty(value = "测风塔是否样板机 1:是 0:否")
+    private Integer sample;
+
+
+    /**
+     * 绑定数据采集通道
+     */
+    @ApiModelProperty(value = "绑定数据采集通道")
+    private String bindTunnel;
+
+    /**
+     * 是否作为解析使用 1:是 0 否
+     */
+    @ApiModelProperty(value = "是否上报 1:是 0 否")
+    private String analyticUse;
+}

+ 1147 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WindTowerStatusData.java

@@ -0,0 +1,1147 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.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.util.Date;
+
+/**
+ * cpp_wind_tower_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_wind_tower_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_wind_tower_status_data")
+public class WindTowerStatusData extends BaseDataEntity {
+
+
+    /**
+     * 设备主键ID
+     */
+    @ApiModelProperty(value = "设备主键ID")
+    private String equipmentId;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private Date 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;
+
+
+}

+ 270 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WindTurbineInfo.java

@@ -0,0 +1,270 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.station.enums.EquipmentTypeEnum;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * cpp_wind_turbine_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_wind_turbine_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_wind_turbine_info")
+public class WindTurbineInfo extends BaseEntity {
+
+    public WindTurbineInfo() {
+        this.setEquipmentType(EquipmentTypeEnum.WINDTURBINE.getCode());
+    }
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+
+    /**
+     * 备用字段A
+     */
+    @ApiModelProperty(value = "备用字段A")
+    private String backupA;
+
+
+    /**
+     * 备用字段B
+     */
+    @ApiModelProperty(value = "备用字段B")
+    private String backupB;
+
+
+    /**
+     * 备用字段C
+     */
+    @ApiModelProperty(value = "备用字段C")
+    private String backupC;
+
+
+    /**
+     * 备用字段D
+     */
+    @ApiModelProperty(value = "备用字段D")
+    private String backupD;
+
+
+    /**
+     * 备用字段E
+     */
+    @ApiModelProperty(value = "备用字段E")
+    private String backupE;
+
+
+    /**
+     * 设备类型
+     */
+    @ApiModelProperty(value = "设备类型")
+    private Integer equipmentType;
+
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+
+    /**
+     * 制造商
+     */
+    @ApiModelProperty(value = "制造商")
+    private String manufacturer;
+
+
+    /**
+     * 型号
+     */
+    @ApiModelProperty(value = "型号")
+    private String modelNumber;
+
+
+    /**
+     * 安装时间
+     */
+    @ApiModelProperty(value = "安装时间")
+    private Date installationTime;
+
+
+    /**
+     * 是否上报 1:是 0 否
+     */
+    @ApiModelProperty(value = "是否上报 1:是 0 否")
+    private String report;
+
+
+    /**
+     * 入库时间间隔 单位 s
+     */
+    @ApiModelProperty(value = "入库时间间隔 单位 s")
+    private Integer timeInterval;
+
+
+    /**
+     * 设备编号
+     */
+    @ApiModelProperty(value = "设备编号")
+    private String equipmentNo;
+
+
+    /**
+     * 风机等级
+     */
+    @ApiModelProperty(value = "风机等级")
+    private Integer grade;
+
+
+    /**
+     * 设计空气密度
+     */
+    @ApiModelProperty(value = "设计空气密度")
+    private BigDecimal airDensity = new BigDecimal(-99);
+
+
+    /**
+     * 切入速度
+     */
+    @ApiModelProperty(value = "切入速度")
+    private BigDecimal cutInSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 额定风速
+     */
+    @ApiModelProperty(value = "额定风速")
+    private BigDecimal ratedWindSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 切出速度
+     */
+    @ApiModelProperty(value = "切出速度")
+    private BigDecimal cutOutSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 生存风速
+     */
+    @ApiModelProperty(value = "生存风速")
+    private BigDecimal liveWindSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 叶轮直径(m)
+     */
+    @ApiModelProperty(value = "叶轮直径(m)")
+    private BigDecimal windWheelDiameter = new BigDecimal(-99);
+
+
+    /**
+     * 最大转速(m)
+     */
+    @ApiModelProperty(value = "最大转速(m)")
+    private BigDecimal windWheelMaxSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 最小转速(m)
+     */
+    @ApiModelProperty(value = "最小转速(m)")
+    private BigDecimal windWheelMinSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 额定转速(m)
+     */
+    @ApiModelProperty(value = "额定转速(m)")
+    private BigDecimal windWheelRatedSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 轮毂高度(m)
+     */
+    @ApiModelProperty(value = "轮毂高度(m)")
+    private BigDecimal hubHeight = new BigDecimal(-99);
+
+
+    /**
+     * 并网日期(m)
+     */
+    @ApiModelProperty(value = "并网日期")
+    private Date parallelInDate;
+
+
+    /**
+     * 使用寿命
+     */
+    @ApiModelProperty(value = "使用寿命")
+    private BigDecimal lifeLength = new BigDecimal(-99);
+
+
+    /**
+     * 最大功率
+     */
+    @ApiModelProperty(value = "最大功率")
+    private BigDecimal maxPower = new BigDecimal(-99);
+
+
+    /**
+     * 风机是否样板机 1:是 0:否
+     */
+    @ApiModelProperty(value = "风机是否样板机 1:是 0:否")
+    private String sample;
+
+
+    /**
+     * 经度
+     */
+    @ApiModelProperty(value = "经度")
+    private BigDecimal longitude = new BigDecimal(-99);
+
+
+    /**
+     * 纬度
+     */
+    @ApiModelProperty(value = "纬度")
+    private BigDecimal latitude = new BigDecimal(-99);
+
+
+    /**
+     * 集电线路
+     */
+    @ApiModelProperty(value = "集电线路")
+    private String collectorCircuit;
+
+
+    /**
+     * 分期
+     */
+    @ApiModelProperty(value = "分期")
+    private String divideIntoDifferentPeriod;
+
+    /**
+     * 绑定数据采集通道
+     */
+    @ApiModelProperty(value = "绑定数据采集通道")
+    private String bindTunnel;
+}

+ 213 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/WindTurbineStatusData.java

@@ -0,0 +1,213 @@
+package com.cpp.web.domain.station;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.cpp.common.core.domain.BaseEntity;
+import com.cpp.web.domain.BaseDataEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * cpp_wind_turbine_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Data
+@TableName("cpp_wind_turbine_status_data")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_wind_turbine_status_data")
+public class WindTurbineStatusData extends BaseDataEntity {
+
+
+
+    /**
+     * 设备主键ID
+     */
+    @ApiModelProperty(value = "设备主键ID")
+    private String equipmentId;
+
+
+    /**
+     * 状态值为1代表运行,2代表待机,3代表停用,4代表故障
+     */
+    @ApiModelProperty(value = "状态值为1代表运行,2代表待机,3代表停用,4代表故障")
+    private String status;
+
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private Date time;
+
+
+    /**
+     * 备用字段1
+     */
+    @ApiModelProperty(value = "备用字段1")
+    private BigDecimal data1 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段2
+     */
+    @ApiModelProperty(value = "备用字段2")
+    private BigDecimal data2 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段3
+     */
+    @ApiModelProperty(value = "备用字段3")
+    private BigDecimal data3 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段4
+     */
+    @ApiModelProperty(value = "备用字段4")
+    private BigDecimal data4 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段5
+     */
+    @ApiModelProperty(value = "备用字段5")
+    private BigDecimal data5 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段6
+     */
+    @ApiModelProperty(value = "备用字段6")
+    private BigDecimal data6 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段7
+     */
+    @ApiModelProperty(value = "备用字段7")
+    private BigDecimal data7 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段8
+     */
+    @ApiModelProperty(value = "备用字段8")
+    private BigDecimal data8 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段9
+     */
+    @ApiModelProperty(value = "备用字段9")
+    private BigDecimal data9 = new BigDecimal(-99);
+
+
+    /**
+     * 备用字段10
+     */
+    @ApiModelProperty(value = "备用字段10")
+    private BigDecimal data10 = new BigDecimal(-99);
+
+
+    /**
+     * 有功(KW)
+     */
+    @ApiModelProperty(value = "有功(KW)")
+    private BigDecimal activePower = new BigDecimal(-99);
+
+
+    /**
+     * 无功(KVar)
+     */
+    @ApiModelProperty(value = "无功(KVar)")
+    private BigDecimal reactivePower = new BigDecimal(-99);
+
+
+    /**
+     * 功率因数
+     */
+    @ApiModelProperty(value = "功率因数")
+    private BigDecimal powerFactor = new BigDecimal(-99);
+
+
+    /**
+     * 电压(V)
+     */
+    @ApiModelProperty(value = "电压(V)")
+    private BigDecimal voltage = new BigDecimal(-99);
+
+
+    /**
+     * 电流(A)
+     */
+    @ApiModelProperty(value = "电流(A)")
+    private BigDecimal electricalCurrent = new BigDecimal(-99);
+
+
+    /**
+     * 当日发电量(kW·h)
+     */
+    @ApiModelProperty(value = "当日发电量(kW·h)")
+    private BigDecimal dayElectricQuantity = new BigDecimal(-99);
+
+
+    /**
+     * 当日并网小时
+     */
+    @ApiModelProperty(value = "当日并网小时")
+    private BigDecimal dayGridConnectedHours = new BigDecimal(-99);
+
+
+    /**
+     * 转速(rpm)
+     */
+    @ApiModelProperty(value = "转速(rpm)")
+    private BigDecimal windWheelRatedSpeed = new BigDecimal(-99);
+
+
+    /**
+     * 风速(m/s)
+     */
+    @ApiModelProperty(value = "风速(m/s)")
+    private BigDecimal ws = new BigDecimal(-99);
+
+
+    /**
+     * 风向(°)
+     */
+    @ApiModelProperty(value = "风向(°)")
+    private BigDecimal wd = new BigDecimal(-99);
+
+
+    /**
+     * 温度(℃)
+     */
+    @ApiModelProperty(value = "温度(℃)")
+    private BigDecimal t = new BigDecimal(-99);
+
+
+    /**
+     * 桨距角(°)
+     */
+    @ApiModelProperty(value = "桨距角(°)")
+    private BigDecimal pitchAngle = new BigDecimal(-99);
+
+
+    /**
+     * 累积发电量(MW·h)
+     */
+    @ApiModelProperty(value = "累积发电量(MW·h)")
+    private BigDecimal cumulativeGeneratedEnergy = new BigDecimal(-99);
+
+
+}

+ 90 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/enums/EquipmentTypeEnum.java

@@ -0,0 +1,90 @@
+package com.cpp.web.domain.station.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 设备数据对象类型枚举
+ * lastModify
+ * 2020.3.26  修唯   枚举名修改,新增发电站类型,删除各种功率,设备数,开机容量等类型
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/19 8:59
+ */
+@Getter
+@AllArgsConstructor
+public enum EquipmentTypeEnum implements IEnum<String> {
+
+    /**
+     * 场站也视为设备类型的一种
+     */
+    POWERSTATION(0, "发电站"),
+    WEATHERSTATION(1, "气象站"),
+    INVERTER(2, "逆变器"),
+    WINDTOWER(3, "测风塔"),
+    WINDTURBINE(4, "风机"),
+    FORECASTDATA(5, "预测数据"),
+    BOOSTERSTATION(6, "主升压变"),
+    AGC_AVC(7, "AGC_AVC"),
+    BWD(8, "并网点"),
+    CYB(9, "厂用变"),
+    JDX(10, "集电线"),
+    SYZMX(11, "升压站母线"),
+    WGBC(12, "无功补偿"),
+    DLQ(13, "断路器"),
+    DZ(14, "刀闸"),
+    JDDZ(15, "接地刀闸"),
+    DXFDJ(16, "等效发电机");
+
+    private Integer code;
+    private String message;
+
+
+    public static EquipmentTypeEnum valueOf(Integer code) {
+        switch (code) {
+            case 0:
+                return POWERSTATION;
+            case 1:
+                return WEATHERSTATION;
+            case 2:
+                return INVERTER;
+            case 3:
+                return WINDTOWER;
+            case 4:
+                return WINDTURBINE;
+            case 5:
+                return FORECASTDATA;
+            case 6:
+                return BOOSTERSTATION;
+            case 7:
+                return AGC_AVC;
+            case 8:
+                return BWD;
+            case 9:
+                return CYB;
+            case 10:
+                return JDX;
+            case 11:
+                return SYZMX;
+            case 12:
+                return WGBC;
+            case 13:
+                return DLQ;
+            case 14:
+                return DZ;
+            case 15:
+                return JDDZ;
+            case 16:
+                return DXFDJ;
+            default:
+                return null;
+        }
+    }
+
+    @Override
+    public String getValue() {
+        return this.name();
+    }
+}

+ 52 - 0
cpp-admin/src/main/java/com/cpp/web/domain/station/enums/ProvinceEnum.java

@@ -0,0 +1,52 @@
+package com.cpp.web.domain.station.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 省调度中心枚举
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 9:02
+ */
+@Getter
+@AllArgsConstructor
+public enum ProvinceEnum {
+    E11(11, "北京市"),
+    E12(12, "天津市"),
+    E13(13, "河北省-冀北"),
+    E17(17, "河北省-南网"),
+    E14(14, "山西省"),
+    E15(15, "内蒙古自治区-蒙东"),
+    E16(16, "内蒙古自治区-蒙西"),
+    E21(21, "辽宁省"),
+    E22(22, "吉林省"),
+    E23(23, "黑龙江省"),
+    E31(31, "上海市"),
+    E32(32, "江苏省"),
+    E33(33, "浙江省"),
+    E34(34, "安徽省"),
+    E35(35, "福建省"),
+    E36(36, "江西省"),
+    E37(37, "山东省"),
+    E41(41, "河南省"),
+    E42(42, "湖北省"),
+    E43(43, "湖南省"),
+    E44(44, "广东省"),
+    E45(45, "广西壮族自治区"),
+    E46(46, "海南省"),
+    E50(50, "重庆市"),
+    E51(51, "四川省"),
+    E52(52, "贵州省"),
+    E53(53, "云南省"),
+    E54(54, "西藏自治区"),
+    E61(61, "陕西省"),
+    E62(62, "甘肃省"),
+    E63(63, "青海省"),
+    E64(64, "宁夏回族自治区"),
+    E65(65, "新疆维吾尔自治区"),
+    E99(99, "华北直调");
+    private Integer code;
+    private String message;
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerShortTermMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.cloud;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * idp_forecast_power_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface ForecastPowerShortTermMapper extends BaseMapper<ForecastPowerShortTermCloud> {
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerUltraShortTermMapper.java

@@ -0,0 +1,16 @@
+package com.cpp.web.mapper.cloud;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.cloud.ForecastPowerUltraShortTermCloud;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * idp_forecast_power_ultra_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface ForecastPowerUltraShortTermMapper extends BaseMapper<ForecastPowerUltraShortTermCloud> {
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/cloud/NwpMapper.java

@@ -0,0 +1,16 @@
+package com.cpp.web.mapper.cloud;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.cloud.NwpCloud;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * idp_nwp
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface NwpMapper extends BaseMapper<NwpCloud> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingCdqMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingCdq;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingCdqMapper extends BaseMapper<ParsingCdq> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingCftMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingCft;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingCftMapper extends BaseMapper<ParsingCft> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingDqMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingDq;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingDqMapper extends BaseMapper<ParsingDq> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingFileUrlMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingFileUrl;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析文件路径mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingFileUrlMapper extends BaseMapper<ParsingFileUrl> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingFjMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingFj;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingFjMapper extends BaseMapper<ParsingFj> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingNbqMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingNbq;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingNbqMapper extends BaseMapper<ParsingNbq> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingNwpMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingNwp;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingNwpMapper extends BaseMapper<ParsingNwp> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingQxzMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingQxz;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingQxzMapper extends BaseMapper<ParsingQxz> {
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingRpMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.datafactory;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingRp;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 解析配置mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingRpMapper extends BaseMapper<ParsingRp> {
+
+}

+ 23 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/datafactory/ParsingTypeMapper.java

@@ -0,0 +1,23 @@
+package com.cpp.web.mapper.datafactory;
+
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.datafactory.ParsingType;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 解析文件类型mapper
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface ParsingTypeMapper extends BaseMapper<ParsingType> {
+
+
+    List<ParsingType> selectTypeList();
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/ElectricFieldMapper.java

@@ -0,0 +1,17 @@
+package com.cpp.web.mapper.station;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import com.cpp.web.domain.station.ElectricField;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_electric_field
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface ElectricFieldMapper extends BaseMapper<ElectricField> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerShortTermHisMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.ForecastPowerShortTermStation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_forecast_power_short_term_his
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface ForecastPowerShortTermHisMapper extends BaseMapper<ForecastPowerShortTermStation> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerUltraShortTermHisMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.ForecastPowerUltraShortTermStation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_forecast_power_ultra_short_term_his
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface ForecastPowerUltraShortTermHisMapper extends BaseMapper<ForecastPowerUltraShortTermStation> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/InverterInfoMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.InverterInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_inverter_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface InverterInfoMapper extends BaseMapper<InverterInfo> {
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/InverterStatusDataMapper.java

@@ -0,0 +1,16 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.InverterStatusData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 逆变器数据dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface InverterStatusDataMapper extends BaseMapper<InverterStatusData> {
+
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/NwpHisMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.NwpStation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_nwp_his
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface NwpHisMapper extends BaseMapper<NwpStation> {
+
+}

+ 14 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/PowerStationStatusDataMapper.java

@@ -0,0 +1,14 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.PowerStationStatusData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_power_station_status_data
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface PowerStationStatusDataMapper extends BaseMapper<PowerStationStatusData> {
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WeatherStationInfoMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.WeatherStationInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_weather_station_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface WeatherStationInfoMapper extends BaseMapper<WeatherStationInfo> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WeatherStationStatusDataMapper.java

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

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTowerInfoMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.WindTowerInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_wind_tower_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface WindTowerInfoMapper extends BaseMapper<WindTowerInfo> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTowerStatusDataMapper.java

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

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTurbineInfoMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.WindTurbineInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_wind_turbine_info
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Mapper
+public interface WindTurbineInfoMapper extends BaseMapper<WindTurbineInfo> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/WindTurbineStatusDataMapper.java

@@ -0,0 +1,15 @@
+package com.cpp.web.mapper.station;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.station.WindTurbineStatusData;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 风机数据dao层
+ *
+ * @author tl
+ * @date 2022-05-11 09:47:21
+ */
+@Mapper
+public interface WindTurbineStatusDataMapper extends BaseMapper<WindTurbineStatusData> {
+
+}

+ 27 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerShortTermService.java

@@ -0,0 +1,27 @@
+package com.cpp.web.service.cloud;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * idp_forecast_power_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+public interface ForecastPowerShortTermService extends IService<ForecastPowerShortTermCloud> {
+    /**
+     * 根据场站编号和时间范围来查询
+     *
+     * @param stationCode 场站编号
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @return
+     */
+    List<ForecastPowerShortTermCloud> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime);
+
+    List<ForecastPowerShortTermCloud> findByStationCodeAndStartTimeAndEndTimeAndForecastManufactor(String stationCode, Date startTime, Date endTime, String forecastManufactor);
+}

+ 27 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerUltraShortTermService.java

@@ -0,0 +1,27 @@
+package com.cpp.web.service.cloud;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.cloud.ForecastPowerUltraShortTermCloud;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * idp_forecast_power_ultra_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+public interface ForecastPowerUltraShortTermService extends IService<ForecastPowerUltraShortTermCloud> {
+
+    /**
+     * 根据场站编号和时间范围来查询
+     *
+     * @param stationCode 场站编号
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @return
+     */
+    List<ForecastPowerUltraShortTermCloud> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime);
+
+}

+ 17 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/NwpService.java

@@ -0,0 +1,17 @@
+package com.cpp.web.service.cloud;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.cloud.NwpCloud;
+
+import java.util.Date;
+
+/**
+ * idp_nwp
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+public interface NwpService extends IService<NwpCloud> {
+    QueryWrapper<NwpCloud> getPageByStationCodeAndeTimeBetween(String stationCode, Date startTime, Date endTime, String forecastManufactor);
+}

+ 50 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerShortTermServiceImpl.java

@@ -0,0 +1,50 @@
+package com.cpp.web.service.cloud.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
+import com.cpp.web.mapper.cloud.ForecastPowerShortTermMapper;
+import com.cpp.web.service.cloud.ForecastPowerShortTermService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * idp_forecast_power_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Service
+public class ForecastPowerShortTermServiceImpl extends ServiceImpl<ForecastPowerShortTermMapper, ForecastPowerShortTermCloud> implements ForecastPowerShortTermService {
+
+
+    @Override
+    public List<ForecastPowerShortTermCloud> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime) {
+        QueryWrapper<ForecastPowerShortTermCloud> wrapper = new QueryWrapper<>();
+        if (stationCode != null && !stationCode.equals("")) {
+            wrapper.eq("station_code", stationCode);
+        }
+        if (startTime != null && !startTime.equals("") && endTime != null && !endTime.equals("")) {
+            wrapper.between("forecast_time", startTime, endTime);
+        }
+
+        return baseMapper.selectList(wrapper);
+    }
+    @Override
+    public List<ForecastPowerShortTermCloud> findByStationCodeAndStartTimeAndEndTimeAndForecastManufactor(String stationCode, Date startTime, Date endTime, String forecastManufactor) {
+        QueryWrapper<ForecastPowerShortTermCloud> wrapper = new QueryWrapper<>();
+        if (stationCode != null && !stationCode.equals("")) {
+            wrapper.eq("station_code", stationCode);
+        }
+        if (startTime != null && !startTime.equals("") && endTime != null && !endTime.equals("")) {
+            wrapper.between("forecast_time", startTime, endTime);
+        }
+        if (forecastManufactor != null && !forecastManufactor.equals("")) {
+            wrapper.eq("forecast_manufactor", forecastManufactor);
+        }
+        return baseMapper.selectList(wrapper);
+    }
+
+}

+ 33 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerUltraShortTermServiceImpl.java

@@ -0,0 +1,33 @@
+package com.cpp.web.service.cloud.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.cloud.ForecastPowerUltraShortTermCloud;
+import com.cpp.web.mapper.cloud.ForecastPowerUltraShortTermMapper;
+import com.cpp.web.service.cloud.ForecastPowerUltraShortTermService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * idp_forecast_power_ultra_short_term
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Service
+public class ForecastPowerUltraShortTermServiceImpl extends ServiceImpl<ForecastPowerUltraShortTermMapper, ForecastPowerUltraShortTermCloud> implements ForecastPowerUltraShortTermService {
+
+    @Override
+    public List<ForecastPowerUltraShortTermCloud> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime) {
+        QueryWrapper<ForecastPowerUltraShortTermCloud> wrapper = new QueryWrapper<>();
+        if (stationCode != null && !stationCode.equals("")) {
+            wrapper.eq("station_code", stationCode);
+        }
+        if (startTime != null && !startTime.equals("") && endTime != null && !endTime.equals("")) {
+            wrapper.between("forecast_time", startTime, endTime);
+        }
+        return baseMapper.selectList(wrapper);
+    }
+}

+ 37 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/NwpServiceImpl.java

@@ -0,0 +1,37 @@
+package com.cpp.web.service.cloud.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.cloud.NwpCloud;
+import com.cpp.web.mapper.cloud.NwpMapper;
+import com.cpp.web.service.cloud.NwpService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * idp_nwp
+ *
+ * @author tl
+ * @date 2024-09-23 15:28:33
+ */
+@Service
+public class NwpServiceImpl extends ServiceImpl<NwpMapper, NwpCloud> implements NwpService {
+
+
+    @Override
+    public QueryWrapper<NwpCloud> getPageByStationCodeAndeTimeBetween(String stationCode, Date startTime, Date endTime, String forecastManufactor) {
+        QueryWrapper<NwpCloud> wrapper = new QueryWrapper<>();
+
+        if (stationCode != null && !stationCode.equals("")) {
+            wrapper.eq("station_code", stationCode);
+        }
+        if (startTime != null && !startTime.equals("") && endTime != null && !endTime.equals("")) {
+            wrapper.between("pre_time", startTime, endTime);
+        }
+        if (forecastManufactor != null && !forecastManufactor.equals("")) {
+            wrapper.eq("forecast_manufactor", forecastManufactor);
+        }
+        return wrapper;
+    }
+}

+ 19 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/BaseParsingService.java

@@ -0,0 +1,19 @@
+package com.cpp.web.service.datafactory;
+
+import com.cpp.web.domain.datafactory.BaseParsing;
+
+import java.util.List;
+import java.util.Map;
+
+public interface BaseParsingService {
+    List<BaseParsing> getParsingInfos();
+
+
+    List<Map<String,String>> getFileType();
+
+
+    boolean save(BaseParsing baseParsing);
+
+
+    boolean deleteById(BaseParsing baseParsing);
+}

+ 25 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ChannelStatusService.java

@@ -0,0 +1,25 @@
+//package com.cpp.web.service.datafactory;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.IService;
+//import com.jiayue.ipp.common.data.entity.an.ChannelStatus;
+//
+///**
+// * 通道状态表
+// *
+// * @author csc code generator
+// * @date 2022-12-28 14:49:40
+// */
+//public interface ChannelStatusService extends IService<ChannelStatus> {
+//    /**
+//     * 根据上报时间 场站编号 通道状态 通道类型 构造查询条件
+//     *
+//     * @param stationCode       场站编号
+//     * @param startTime         上报时间
+//     * @param endTime           上报时间
+//     * @param channelStatusCode 通道状态
+//     * @param channelTypeCode   通道类型
+//     * @return 查询条件
+//     */
+//    QueryWrapper<ChannelStatus> findByStationCodeAndStartTimeBetweenAndChannelStatusAndChannelType(String stationCode, Long startTime, Long endTime, String channelStatusCode, String channelTypeCode);
+//}

+ 371 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/CloudFileParsing.java

@@ -0,0 +1,371 @@
+//package com.cpp.web.service.datafactory;
+//
+//import cn.hutool.core.date.DateUtil;
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+//import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+//import com.jiayue.ipfcst.common.core.util.NumberUtils;
+//import com.jiayue.ipp.common.data.entity.ForecastPowerShortTerm;
+//import com.jiayue.ipp.common.data.entity.ForecastPowerShortTermHis;
+//import com.jiayue.ipp.common.data.entity.Nwp;
+//import com.jiayue.ipp.common.data.entity.an.ParsingChannel;
+//import com.jiayue.ipp.common.data.entity.an.ParsingLog;
+//import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+//import lombok.AllArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.io.FileUtils;
+//import org.apache.commons.lang.StringUtils;
+//import org.apache.commons.lang.time.DateFormatUtils;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import java.io.BufferedReader;
+//import java.io.File;
+//import java.io.IOException;
+//import java.io.InputStreamReader;
+//import java.math.BigDecimal;
+//import java.math.RoundingMode;
+//import java.nio.charset.StandardCharsets;
+//import java.nio.file.Files;
+//import java.text.ParseException;
+//import java.text.SimpleDateFormat;
+//import java.util.ArrayList;
+//import java.util.Date;
+//import java.util.List;
+//
+///**
+// * 云端文件解析
+// *
+// * @author tl
+// * @date 2022-05-11 09:51:21
+// */
+//@AllArgsConstructor
+//@Slf4j
+//@Service
+//@Transactional
+//public class CloudFileParsing {
+//
+//
+//    /**
+//     * 解析
+//     *
+//     * @param parsingChannel
+//     */
+//    public void parsing(ParsingChannel parsingChannel) {
+//
+//        //过滤出当前解析通道下在使用的《 解析路径 》
+//        List<ParsingUrl> parsingUrls = parsingUrlService.list(Wrappers.lambdaQuery(ParsingUrl.class).eq(ParsingUrl::getCId, parsingChannel.getId()).eq(ParsingUrl::getUrlStatus, "1"));
+//        String dateDir = DateFormatUtils.format(new Date(), "yyyyMMdd");
+//        String dayStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
+//        //遍历解析路径,对文件进行解析
+//        for (ParsingUrl parsingUrl : parsingUrls) {
+//
+//            String failDir = parsingUrl.getUrl() + File.separator + "fail" + File.separator + dateDir;
+//
+//            String success = parsingUrl.getUrl() + File.separator + "success" + File.separator + dateDir;
+//
+//            String path = parsingUrl.getUrl() + File.separator + "new";
+//
+//            File dirFile = new File(path);
+//
+//            if (!dirFile.exists()) {
+//                dirFile.mkdirs();
+//            }
+//            File[] files = dirFile.listFiles();
+//            log.info("扫描路径:{},文件数:{}", path, files.length);
+//            //遍历文件
+//            for (File file : files) {
+//                String fileName = file.getName();
+//                ParsingLog parsingLog = new ParsingLog();
+//                parsingLog.setFileName(fileName);
+//                parsingLog.setStationCode(parsingUrl.getStationCode());
+//                parsingLog.setParsingTime(new Date());
+//
+//                if (!fileName.contains(dayStr)) {
+//                    file.delete();
+//                    log.warn(parsingUrl.getStationCode() + "下" + fileName + "云端文件不是当天的文件,删除!");
+//                    break;
+//                }
+//
+//                // 如果是短期文件
+//                if (file.getName().startsWith("DQ")) {
+//                    try {
+//                        // 解析短期文件
+//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                        List<ForecastPowerShortTerm> forecastPowerShortTermList = new ArrayList<>();
+//                        List<ForecastPowerShortTermHis> forecastPowerShortTermHisList = new ArrayList<>();
+//                        // 当文件未被使用时,进行解析上报
+//                        if (file.renameTo(file)) {
+//                            InputStreamReader read = null;
+//                            BufferedReader bufferedReader = null;
+//                            String stringLine;
+//                            ForecastPowerShortTerm stf;
+//                            try {
+//                                read = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);
+//                                bufferedReader = new BufferedReader(read);
+//                                Long systemTime = System.currentTimeMillis();
+//                                // 循环解析文件
+//                                while ((stringLine = bufferedReader.readLine()) != null) {
+//                                    String[] string_arr = stringLine.split("\t");
+//                                    if (string_arr.length == 4 && string_arr[0].startsWith("#")) {
+//                                        if (StringUtils.isNotEmpty(string_arr[2])) {
+//                                            // 实时表
+//                                            stf = new ForecastPowerShortTerm();
+//                                            stf.setFpValue(new BigDecimal(string_arr[3]));
+//                                            stf.setForecastTime(sdf.parse(string_arr[2]));
+//                                            stf.setGenDate(new Date());
+//                                            stf.setStationCode(parsingUrl.getStationCode());
+//                                            stf.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                            forecastPowerShortTermList.add(stf);
+//
+//                                            // 历史表
+//                                            //过滤当天的数据
+//                                            long secondDayTime = com.jiayue.ipp.idp.util.DateMomentUtil.getDayStartTime(systemTime) + 1000 * 60 * 60 * 24;
+//                                            if (sdf.parse(string_arr[2]).getTime() >= secondDayTime) {
+//                                                ForecastPowerShortTermHis forecastPowerShortTermHis = new ForecastPowerShortTermHis();
+//                                                forecastPowerShortTermHis.setGenDate(new Date());
+//                                                forecastPowerShortTermHis.setStationCode(parsingUrl.getStationCode());
+//                                                forecastPowerShortTermHis.setAbleValue(new BigDecimal(string_arr[3]));
+//                                                forecastPowerShortTermHis.setForecastTime(sdf.parse(string_arr[2]));
+//                                                forecastPowerShortTermHis.setForecastHowLongAgo(DateMomentUtil.getDaysBetweenTwoDate(systemTime, sdf.parse(string_arr[2]).getTime()));
+//                                                forecastPowerShortTermHis.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                                forecastPowerShortTermHisList.add(forecastPowerShortTermHis);
+//                                            }
+//                                        }
+//                                    }
+//                                }
+//
+//                                if (forecastPowerShortTermList.size() > 0 && forecastPowerShortTermHisList.size() > 0) {
+//                                    // 保存短期实时
+//                                    Date startTime = forecastPowerShortTermList.get(0).getForecastTime();
+//                                    Date endTime = forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime();
+//                                    LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                    lambdaQueryWrapper.eq(ForecastPowerShortTerm::getStationCode, parsingUrl.getStationCode());
+//                                    lambdaQueryWrapper.eq(ForecastPowerShortTerm::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                    lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime, endTime);
+//                                    forecastPowerShortTermService.remove(lambdaQueryWrapper);
+//                                    forecastPowerShortTermService.saveBatch(forecastPowerShortTermList);
+//
+//                                    // 保存短期历史
+//                                    LambdaQueryWrapper<ForecastPowerShortTermHis> forecastPowerShortTermHisLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getStationCode, parsingUrl.getStationCode());
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getGenDate, DateUtil.format(new Date(), "yyyy-MM-dd"));
+//                                    forecastPowerShortTermHisService.remove(forecastPowerShortTermHisLambdaQueryWrapper);
+//                                    forecastPowerShortTermHisService.saveBatch(forecastPowerShortTermHisList);
+//                                    log.info(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析成功!");
+//                                    try {
+//                                        File file1 = new File(success + File.separator + fileName);
+//                                        if (file1.exists()) {
+//                                            file1.delete();
+//                                        }
+//                                        FileUtils.moveFile(file, new File(success + File.separator + fileName));
+//                                    } catch (IOException e) {
+//                                        e.printStackTrace();
+//                                    }
+//                                }
+//                            } catch (Exception e) {
+//                                log.error("嘉越云端文件解析失败:", e);
+//                                try {
+//                                    File file1 = new File(failDir + File.separator + fileName);
+//                                    if (file1.exists()) {
+//                                        file1.delete();
+//                                    }
+//                                    FileUtils.moveFile(file, new File(failDir + File.separator + fileName));
+//                                } catch (IOException ex) {
+//                                    log.error(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析失败1", ex);
+//                                }
+//                            } finally {
+//                                close(bufferedReader, read);
+//                            }
+//                        }
+//                    } catch (Exception e) {
+//                        log.error(parsingUrl.getStationCode() + "下" + fileName + "解析嘉越云端DQ文件失败", e);
+//                        try {
+//                            File file1 = new File(failDir + File.separator + fileName);
+//                            if (file1.exists()) {
+//                                file1.delete();
+//                            }
+//                            FileUtils.moveFile(file, new File(failDir + File.separator + fileName));
+//                        } catch (IOException ex) {
+//                            log.error(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析失败1", ex);
+//                        }
+//                    }
+//                }
+//
+//                if (file.getName().startsWith("NWP")) {
+//                    List<Nwp> listNwp = new ArrayList<>();
+//                    if (file.renameTo(file)) {
+//                        InputStreamReader readNwp = null;
+//                        BufferedReader bufferedReaderNwp = null;
+//                        try {
+//                            readNwp = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);//考虑到编码格式
+//                            bufferedReaderNwp = new BufferedReader(readNwp);
+//                            String lineTxt;
+//                            Nwp nwpData;
+//                            BigDecimal nwpDirectRadiation = new BigDecimal("0.7"); //直接辐射
+//                            BigDecimal nwpDiffuseRadiation = new BigDecimal("0.3"); //散接辐射
+//
+//                            while ((lineTxt = bufferedReaderNwp.readLine()) != null) {
+//                                //NWP文件按照Tab方式截取
+//                                String[] datas = lineTxt.split("\t");
+//                                if (datas.length >= 35 && datas[0].startsWith("#")) {
+//                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                                    //过滤当天的数据
+//                                    //if (sdf.parse(datas[5]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 * 60 *
+//                                    // 1000) {
+//                                    nwpData = new Nwp();
+//                                    nwpData.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    //将截取的文件放入nwpData中
+//                                    nwpData.setStationCode(parsingUrl.getStationCode());
+////                                    nwpData.setScDate(datas[2]);
+////                                    nwpData.setScTime(datas[3]);
+////                                    nwpData.setPreDate(datas[4]);
+//                                    nwpData.setPreTime(sdf.parse(datas[5]));//采集时间 与 短期预测时间关联
+//                                    nwpData.setT(NumberUtils.subtract(new BigDecimal(datas[6]), new BigDecimal("273.15")));//温度
+//
+//                                    nwpData.setSenf(new BigDecimal(datas[11]).setScale(2, RoundingMode.HALF_UP));//感热
+//                                    nwpData.setSwr(new BigDecimal(datas[9]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+//                                    nwpData.setLwr(new BigDecimal(datas[10]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+//                                    nwpData.setPressure(new BigDecimal(datas[8]).setScale(2, RoundingMode.HALF_UP));//地表气压
+//                                    nwpData.setRh(new BigDecimal(datas[7]).setScale(2, RoundingMode.HALF_UP));//2m相对湿度
+//                                    nwpData.setDiffuseRadiation(new BigDecimal(datas[9]).multiply(nwpDiffuseRadiation).setScale(2, RoundingMode.HALF_UP));//散接辐射
+//                                    nwpData.setDirectRadiation(new BigDecimal(datas[9]).multiply(nwpDirectRadiation).setScale(2, RoundingMode.HALF_UP));//直接辐射
+//
+//                                    nwpData.setWs10(new BigDecimal(datas[19]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs30(new BigDecimal(datas[20]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs50(new BigDecimal(datas[21]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs70(new BigDecimal(datas[22]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs80(new BigDecimal(datas[23]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs90(new BigDecimal(datas[24]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs100(new BigDecimal(datas[25]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs170(new BigDecimal(datas[26]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd10(new BigDecimal(datas[27]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd30(new BigDecimal(datas[28]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd50(new BigDecimal(datas[29]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd70(new BigDecimal(datas[30]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd80(new BigDecimal(datas[31]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd90(new BigDecimal(datas[32]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd100(new BigDecimal(datas[33]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd170(new BigDecimal(datas[34]).setScale(2, RoundingMode.HALF_UP));
+//                                    if (datas.length > 35) {
+//                                        //nwp 新增解析内容
+////                                        nwpData.setWs20(new BigDecimal(datas[35]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs40(new BigDecimal(datas[36]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs60(new BigDecimal(datas[37]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs110(new BigDecimal(datas[38]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs120(new BigDecimal(datas[39]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs130(new BigDecimal(datas[40]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs140(new BigDecimal(datas[41]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs150(new BigDecimal(datas[42]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs160(new BigDecimal(datas[43]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs180(new BigDecimal(datas[44]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs190(new BigDecimal(datas[45]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs200(new BigDecimal(datas[46]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd20(new BigDecimal(datas[47]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd40(new BigDecimal(datas[48]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd60(new BigDecimal(datas[49]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd110(new BigDecimal(datas[50]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd120(new BigDecimal(datas[51]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd130(new BigDecimal(datas[52]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd140(new BigDecimal(datas[53]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd150(new BigDecimal(datas[54]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd160(new BigDecimal(datas[55]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd180(new BigDecimal(datas[56]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd190(new BigDecimal(datas[57]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd200(new BigDecimal(datas[58]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT10(new BigDecimal(datas[59]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT20(new BigDecimal(datas[60]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT30(new BigDecimal(datas[61]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT40(new BigDecimal(datas[62]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT50(new BigDecimal(datas[63]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT60(new BigDecimal(datas[64]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT70(new BigDecimal(datas[65]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT80(new BigDecimal(datas[66]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT90(new BigDecimal(datas[67]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT100(new BigDecimal(datas[68]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT110(new BigDecimal(datas[69]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT120(new BigDecimal(datas[70]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT130(new BigDecimal(datas[71]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT140(new BigDecimal(datas[72]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT150(new BigDecimal(datas[73]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT160(new BigDecimal(datas[74]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT170(new BigDecimal(datas[75]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT180(new BigDecimal(datas[76]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT190(new BigDecimal(datas[77]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT200(new BigDecimal(datas[78]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setDniCalcd(new BigDecimal(datas[79]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setSolarZenith(new BigDecimal(datas[80]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setClearskyGhi(new BigDecimal(datas[81]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setLcc(new BigDecimal(datas[82]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setMcc(new BigDecimal(datas[83]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setHcc(new BigDecimal(datas[84]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setTcc(new BigDecimal(datas[85]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setTpr(new BigDecimal(datas[86]).setScale(2, RoundingMode.HALF_UP));
+//                                    }
+//                                    listNwp.add(nwpData);
+//                                }
+//                            }
+//                            if (listNwp.size() > 0 ) {
+//                                // 保存nwp实时
+//                                Date startTime = listNwp.get(0).getPreTime();
+//                                Date endTime = listNwp.get(listNwp.size() - 1).getPreTime();
+//                                LambdaQueryWrapper<Nwp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                lambdaQueryWrapper.eq(Nwp::getStationCode, parsingUrl.getStationCode());
+//                                lambdaQueryWrapper.eq(Nwp::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                lambdaQueryWrapper.between(Nwp::getPreTime, startTime, endTime);
+//                                nwpService.remove(lambdaQueryWrapper);
+//                                nwpService.saveBatch(listNwp);
+//                                log.info(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端NWP文件解析成功!");
+//                                try {
+//                                    File file1 = new File(success + File.separator + fileName);
+//                                    if (file1.exists()) {
+//                                        file1.delete();
+//                                    }
+//                                    FileUtils.moveFile(file, new File(success + File.separator + fileName));
+//                                } catch (IOException e) {
+//                                    e.printStackTrace();
+//                                }
+//                            }
+//                        } catch (IOException | ParseException | RuntimeException e) {
+//                            log.error("系统错误:", e);
+//                            File destFile = new File(file.getPath().replaceFirst("new", "error"));
+//                            if (destFile.exists()) {
+//                                destFile.delete();
+//                            }
+//                            try {
+//                                FileUtils.moveFile(file, destFile);
+//                            } catch (IOException e1) {
+//                                log.error(file.getName() + "文件解析失败", e);
+//                            }
+//                        } finally {
+//                            close(bufferedReaderNwp, readNwp);
+//                        }
+//                    }
+//
+//                }
+//            }
+//        }
+//        log.info("解析嘉越云端文件定时执行完成");
+//
+//    }
+//
+//    /**
+//     * 关闭文件流
+//     *
+//     * @param bufferedReader 字符数据
+//     * @param read           字节流
+//     */
+//    private void close(BufferedReader bufferedReader, InputStreamReader read) {
+//        try {
+//            if (bufferedReader != null) {
+//                bufferedReader.close();
+//            }
+//            if (read != null) {
+//                read.close();
+//            }
+//        } catch (IOException e) {
+//            log.error("关闭文件流失败:", e);
+//        }
+//    }
+//}

+ 385 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/DownloadService.java

@@ -0,0 +1,385 @@
+//package com.cpp.web.service.datafactory;
+//
+//import cn.hutool.core.date.DateUtil;
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+//import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
+//import com.jiayue.ipfcst.common.core.util.NumberUtils;
+//import com.jiayue.ipp.common.data.entity.ForecastPowerShortTerm;
+//import com.jiayue.ipp.common.data.entity.ForecastPowerShortTermHis;
+//import com.jiayue.ipp.common.data.entity.Nwp;
+//import com.jiayue.ipp.common.data.entity.an.ParsingChannel;
+//import com.jiayue.ipp.common.data.entity.an.ParsingLog;
+//import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+//import com.jiayue.ipp.idp.service.ForecastPowerShortTermHisService;
+//import com.jiayue.ipp.idp.service.ForecastPowerShortTermService;
+//import com.jiayue.ipp.idp.service.NwpService;
+//import lombok.AllArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.io.FileUtils;
+//import org.apache.commons.lang.StringUtils;
+//import org.apache.commons.lang.time.DateFormatUtils;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import java.io.BufferedReader;
+//import java.io.File;
+//import java.io.IOException;
+//import java.io.InputStreamReader;
+//import java.math.BigDecimal;
+//import java.math.RoundingMode;
+//import java.nio.charset.StandardCharsets;
+//import java.nio.file.Files;
+//import java.text.ParseException;
+//import java.text.SimpleDateFormat;
+//import java.util.ArrayList;
+//import java.util.Date;
+//import java.util.List;
+//
+///**
+// * ftp通信业务层
+// *
+// * @author tl
+// * @date 2022-05-11 09:51:21
+// */
+//@AllArgsConstructor
+//@Slf4j
+//@Service
+//@Transactional
+//public class DownloadService {
+//
+//    private final ParsingUrlService parsingUrlService;
+//
+//    private final ParsingFileService parsingFileService;
+//
+//    private final ParsingLogService parsingLogService;
+//
+//    private final ForecastPowerShortTermHisService forecastPowerShortTermHisService;
+//
+//    private final ForecastPowerShortTermService forecastPowerShortTermService;
+//
+//    private final NwpService nwpService;
+//
+//    /**
+//     * 解析
+//     *
+//     * @param parsingChannel
+//     */
+//    public void parsing(ParsingChannel parsingChannel) {
+//
+//        //过滤出当前解析通道下在使用的《 解析路径 》
+//        List<ParsingUrl> parsingUrls = parsingUrlService.list(Wrappers.lambdaQuery(ParsingUrl.class).eq(ParsingUrl::getCId, parsingChannel.getId()).eq(ParsingUrl::getUrlStatus, "1"));
+//        String dateDir = DateFormatUtils.format(new Date(), "yyyyMMdd");
+//        String dayStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
+//        //遍历解析路径,对文件进行解析
+//        for (ParsingUrl parsingUrl : parsingUrls) {
+//
+//            String failDir = parsingUrl.getUrl() + File.separator + "fail" + File.separator + dateDir;
+//
+//            String success = parsingUrl.getUrl() + File.separator + "success" + File.separator + dateDir;
+//
+//            String path = parsingUrl.getUrl() + File.separator + "new";
+//
+//            File dirFile = new File(path);
+//
+//            if (!dirFile.exists()) {
+//                dirFile.mkdirs();
+//            }
+//            File[] files = dirFile.listFiles();
+//            log.info("扫描路径:{},文件数:{}", path, files.length);
+//            //遍历文件
+//            for (File file : files) {
+//                String fileName = file.getName();
+//                ParsingLog parsingLog = new ParsingLog();
+//                parsingLog.setFileName(fileName);
+//                parsingLog.setStationCode(parsingUrl.getStationCode());
+//                parsingLog.setParsingTime(new Date());
+//
+//                if (!fileName.contains(dayStr)) {
+//                    file.delete();
+//                    log.warn(parsingUrl.getStationCode() + "下" + fileName + "云端文件不是当天的文件,删除!");
+//                    break;
+//                }
+//
+//                // 如果是短期文件
+//                if (file.getName().startsWith("DQ")) {
+//                    try {
+//                        // 解析短期文件
+//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                        List<ForecastPowerShortTerm> forecastPowerShortTermList = new ArrayList<>();
+//                        List<ForecastPowerShortTermHis> forecastPowerShortTermHisList = new ArrayList<>();
+//                        // 当文件未被使用时,进行解析上报
+//                        if (file.renameTo(file)) {
+//                            InputStreamReader read = null;
+//                            BufferedReader bufferedReader = null;
+//                            String stringLine;
+//                            ForecastPowerShortTerm stf;
+//                            try {
+//                                read = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);
+//                                bufferedReader = new BufferedReader(read);
+//                                Long systemTime = System.currentTimeMillis();
+//                                // 循环解析文件
+//                                while ((stringLine = bufferedReader.readLine()) != null) {
+//                                    String[] string_arr = stringLine.split("\t");
+//                                    if (string_arr.length == 4 && string_arr[0].startsWith("#")) {
+//                                        if (StringUtils.isNotEmpty(string_arr[2])) {
+//                                            // 实时表
+//                                            stf = new ForecastPowerShortTerm();
+//                                            stf.setFpValue(new BigDecimal(string_arr[3]));
+//                                            stf.setForecastTime(sdf.parse(string_arr[2]));
+//                                            stf.setGenDate(new Date());
+//                                            stf.setStationCode(parsingUrl.getStationCode());
+//                                            stf.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                            forecastPowerShortTermList.add(stf);
+//
+//                                            // 历史表
+//                                            //过滤当天的数据
+//                                            long secondDayTime = com.jiayue.ipp.idp.util.DateMomentUtil.getDayStartTime(systemTime) + 1000 * 60 * 60 * 24;
+//                                            if (sdf.parse(string_arr[2]).getTime() >= secondDayTime) {
+//                                                ForecastPowerShortTermHis forecastPowerShortTermHis = new ForecastPowerShortTermHis();
+//                                                forecastPowerShortTermHis.setGenDate(new Date());
+//                                                forecastPowerShortTermHis.setStationCode(parsingUrl.getStationCode());
+//                                                forecastPowerShortTermHis.setAbleValue(new BigDecimal(string_arr[3]));
+//                                                forecastPowerShortTermHis.setForecastTime(sdf.parse(string_arr[2]));
+//                                                forecastPowerShortTermHis.setForecastHowLongAgo(DateMomentUtil.getDaysBetweenTwoDate(systemTime, sdf.parse(string_arr[2]).getTime()));
+//                                                forecastPowerShortTermHis.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                                forecastPowerShortTermHisList.add(forecastPowerShortTermHis);
+//                                            }
+//                                        }
+//                                    }
+//                                }
+//
+//                                if (forecastPowerShortTermList.size() > 0 && forecastPowerShortTermHisList.size() > 0) {
+//                                    // 保存短期实时
+//                                    Date startTime = forecastPowerShortTermList.get(0).getForecastTime();
+//                                    Date endTime = forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime();
+//                                    LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                    lambdaQueryWrapper.eq(ForecastPowerShortTerm::getStationCode, parsingUrl.getStationCode());
+//                                    lambdaQueryWrapper.eq(ForecastPowerShortTerm::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                    lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime, endTime);
+//                                    forecastPowerShortTermService.remove(lambdaQueryWrapper);
+//                                    forecastPowerShortTermService.saveBatch(forecastPowerShortTermList);
+//
+//                                    // 保存短期历史
+//                                    LambdaQueryWrapper<ForecastPowerShortTermHis> forecastPowerShortTermHisLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getStationCode, parsingUrl.getStationCode());
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                    forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getGenDate, DateUtil.format(new Date(), "yyyy-MM-dd"));
+//                                    forecastPowerShortTermHisService.remove(forecastPowerShortTermHisLambdaQueryWrapper);
+//                                    forecastPowerShortTermHisService.saveBatch(forecastPowerShortTermHisList);
+//                                    log.info(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析成功!");
+//                                    try {
+//                                        File file1 = new File(success + File.separator + fileName);
+//                                        if (file1.exists()) {
+//                                            file1.delete();
+//                                        }
+//                                        FileUtils.moveFile(file, new File(success + File.separator + fileName));
+//                                    } catch (IOException e) {
+//                                        e.printStackTrace();
+//                                    }
+//                                }
+//                            } catch (Exception e) {
+//                                log.error("嘉越云端文件解析失败:", e);
+//                                try {
+//                                    File file1 = new File(failDir + File.separator + fileName);
+//                                    if (file1.exists()) {
+//                                        file1.delete();
+//                                    }
+//                                    FileUtils.moveFile(file, new File(failDir + File.separator + fileName));
+//                                } catch (IOException ex) {
+//                                    log.error(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析失败1", ex);
+//                                }
+//                            } finally {
+//                                close(bufferedReader, read);
+//                            }
+//                        }
+//                    } catch (Exception e) {
+//                        log.error(parsingUrl.getStationCode() + "下" + fileName + "解析嘉越云端DQ文件失败", e);
+//                        try {
+//                            File file1 = new File(failDir + File.separator + fileName);
+//                            if (file1.exists()) {
+//                                file1.delete();
+//                            }
+//                            FileUtils.moveFile(file, new File(failDir + File.separator + fileName));
+//                        } catch (IOException ex) {
+//                            log.error(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端文件解析失败1", ex);
+//                        }
+//                    }
+//                }
+//
+//                if (file.getName().startsWith("NWP")) {
+//                    List<Nwp> listNwp = new ArrayList<>();
+//                    if (file.renameTo(file)) {
+//                        InputStreamReader readNwp = null;
+//                        BufferedReader bufferedReaderNwp = null;
+//                        try {
+//                            readNwp = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);//考虑到编码格式
+//                            bufferedReaderNwp = new BufferedReader(readNwp);
+//                            String lineTxt;
+//                            Nwp nwpData;
+//                            BigDecimal nwpDirectRadiation = new BigDecimal("0.7"); //直接辐射
+//                            BigDecimal nwpDiffuseRadiation = new BigDecimal("0.3"); //散接辐射
+//
+//                            while ((lineTxt = bufferedReaderNwp.readLine()) != null) {
+//                                //NWP文件按照Tab方式截取
+//                                String[] datas = lineTxt.split("\t");
+//                                if (datas.length >= 35 && datas[0].startsWith("#")) {
+//                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                                    //过滤当天的数据
+//                                    //if (sdf.parse(datas[5]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 * 60 *
+//                                    // 1000) {
+//                                    nwpData = new Nwp();
+//                                    nwpData.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    //将截取的文件放入nwpData中
+//                                    nwpData.setStationCode(parsingUrl.getStationCode());
+////                                    nwpData.setScDate(datas[2]);
+////                                    nwpData.setScTime(datas[3]);
+////                                    nwpData.setPreDate(datas[4]);
+//                                    nwpData.setPreTime(sdf.parse(datas[5]));//采集时间 与 短期预测时间关联
+//                                    nwpData.setT(NumberUtils.subtract(new BigDecimal(datas[6]), new BigDecimal("273.15")));//温度
+//
+//                                    nwpData.setSenf(new BigDecimal(datas[11]).setScale(2, RoundingMode.HALF_UP));//感热
+//                                    nwpData.setSwr(new BigDecimal(datas[9]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+//                                    nwpData.setLwr(new BigDecimal(datas[10]).setScale(2, RoundingMode.HALF_UP));//短波辐射(相当于总辐射)
+//                                    nwpData.setPressure(new BigDecimal(datas[8]).setScale(2, RoundingMode.HALF_UP));//地表气压
+//                                    nwpData.setRh(new BigDecimal(datas[7]).setScale(2, RoundingMode.HALF_UP));//2m相对湿度
+//                                    nwpData.setDiffuseRadiation(new BigDecimal(datas[9]).multiply(nwpDiffuseRadiation).setScale(2, RoundingMode.HALF_UP));//散接辐射
+//                                    nwpData.setDirectRadiation(new BigDecimal(datas[9]).multiply(nwpDirectRadiation).setScale(2, RoundingMode.HALF_UP));//直接辐射
+//
+//                                    nwpData.setWs10(new BigDecimal(datas[19]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs30(new BigDecimal(datas[20]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs50(new BigDecimal(datas[21]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs70(new BigDecimal(datas[22]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs80(new BigDecimal(datas[23]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs90(new BigDecimal(datas[24]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs100(new BigDecimal(datas[25]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWs170(new BigDecimal(datas[26]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd10(new BigDecimal(datas[27]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd30(new BigDecimal(datas[28]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd50(new BigDecimal(datas[29]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd70(new BigDecimal(datas[30]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd80(new BigDecimal(datas[31]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd90(new BigDecimal(datas[32]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd100(new BigDecimal(datas[33]).setScale(2, RoundingMode.HALF_UP));
+//                                    nwpData.setWd170(new BigDecimal(datas[34]).setScale(2, RoundingMode.HALF_UP));
+//                                    if (datas.length > 35) {
+//                                        //nwp 新增解析内容
+////                                        nwpData.setWs20(new BigDecimal(datas[35]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs40(new BigDecimal(datas[36]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs60(new BigDecimal(datas[37]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs110(new BigDecimal(datas[38]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs120(new BigDecimal(datas[39]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs130(new BigDecimal(datas[40]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs140(new BigDecimal(datas[41]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWs150(new BigDecimal(datas[42]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs160(new BigDecimal(datas[43]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs180(new BigDecimal(datas[44]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs190(new BigDecimal(datas[45]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWs200(new BigDecimal(datas[46]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd20(new BigDecimal(datas[47]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd40(new BigDecimal(datas[48]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd60(new BigDecimal(datas[49]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd110(new BigDecimal(datas[50]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd120(new BigDecimal(datas[51]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd130(new BigDecimal(datas[52]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd140(new BigDecimal(datas[53]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setWd150(new BigDecimal(datas[54]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd160(new BigDecimal(datas[55]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd180(new BigDecimal(datas[56]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd190(new BigDecimal(datas[57]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setWd200(new BigDecimal(datas[58]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT10(new BigDecimal(datas[59]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT20(new BigDecimal(datas[60]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT30(new BigDecimal(datas[61]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT40(new BigDecimal(datas[62]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT50(new BigDecimal(datas[63]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT60(new BigDecimal(datas[64]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT70(new BigDecimal(datas[65]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT80(new BigDecimal(datas[66]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT90(new BigDecimal(datas[67]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT100(new BigDecimal(datas[68]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT110(new BigDecimal(datas[69]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT120(new BigDecimal(datas[70]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT130(new BigDecimal(datas[71]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT140(new BigDecimal(datas[72]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT150(new BigDecimal(datas[73]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT160(new BigDecimal(datas[74]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT170(new BigDecimal(datas[75]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT180(new BigDecimal(datas[76]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT190(new BigDecimal(datas[77]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setT200(new BigDecimal(datas[78]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setDniCalcd(new BigDecimal(datas[79]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setSolarZenith(new BigDecimal(datas[80]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setClearskyGhi(new BigDecimal(datas[81]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setLcc(new BigDecimal(datas[82]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setMcc(new BigDecimal(datas[83]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setHcc(new BigDecimal(datas[84]).setScale(2, RoundingMode.HALF_UP));
+////                                        nwpData.setTcc(new BigDecimal(datas[85]).setScale(2, RoundingMode.HALF_UP));
+//                                        nwpData.setTpr(new BigDecimal(datas[86]).setScale(2, RoundingMode.HALF_UP));
+//                                    }
+//                                    listNwp.add(nwpData);
+//                                }
+//                            }
+//                            if (listNwp.size() > 0 ) {
+//                                // 保存nwp实时
+//                                Date startTime = listNwp.get(0).getPreTime();
+//                                Date endTime = listNwp.get(listNwp.size() - 1).getPreTime();
+//                                LambdaQueryWrapper<Nwp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                lambdaQueryWrapper.eq(Nwp::getStationCode, parsingUrl.getStationCode());
+//                                lambdaQueryWrapper.eq(Nwp::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                lambdaQueryWrapper.between(Nwp::getPreTime, startTime, endTime);
+//                                nwpService.remove(lambdaQueryWrapper);
+//                                nwpService.saveBatch(listNwp);
+//                                log.info(parsingUrl.getStationCode() + "下" + fileName + "嘉越云端NWP文件解析成功!");
+//                                try {
+//                                    File file1 = new File(success + File.separator + fileName);
+//                                    if (file1.exists()) {
+//                                        file1.delete();
+//                                    }
+//                                    FileUtils.moveFile(file, new File(success + File.separator + fileName));
+//                                } catch (IOException e) {
+//                                    e.printStackTrace();
+//                                }
+//                            }
+//                        } catch (IOException | ParseException | RuntimeException e) {
+//                            log.error("系统错误:", e);
+//                            File destFile = new File(file.getPath().replaceFirst("new", "error"));
+//                            if (destFile.exists()) {
+//                                destFile.delete();
+//                            }
+//                            try {
+//                                FileUtils.moveFile(file, destFile);
+//                            } catch (IOException e1) {
+//                                log.error(file.getName() + "文件解析失败", e);
+//                            }
+//                        } finally {
+//                            close(bufferedReaderNwp, readNwp);
+//                        }
+//                    }
+//
+//                }
+//            }
+//        }
+//        log.info("解析嘉越云端文件定时执行完成");
+//
+//    }
+//
+//    /**
+//     * 关闭文件流
+//     *
+//     * @param bufferedReader 字符数据
+//     * @param read           字节流
+//     */
+//    private void close(BufferedReader bufferedReader, InputStreamReader read) {
+//        try {
+//            if (bufferedReader != null) {
+//                bufferedReader.close();
+//            }
+//            if (read != null) {
+//                read.close();
+//            }
+//        } catch (IOException e) {
+//            log.error("关闭文件流失败:", e);
+//        }
+//    }
+//}

+ 112 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/FtpFileParsing.java

@@ -0,0 +1,112 @@
+package com.cpp.web.service.datafactory;
+
+import cn.hutool.extra.ftp.Ftp;
+import cn.hutool.extra.ftp.FtpConfig;
+import cn.hutool.extra.ftp.FtpMode;
+import com.cpp.web.domain.datafactory.ParsingFileUrl;
+import com.cpp.web.domain.datafactory.ParsingType;
+import com.cpp.web.mapper.datafactory.ParsingTypeMapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * ftp文件解析
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+@AllArgsConstructor
+@Slf4j
+@Service
+public class FtpFileParsing {
+
+    private final ParsingTypeMapper parsingTypeMapper;
+
+    /**
+     * 解析文件方法
+     *
+     * @param parsingFileUrls 解析文件路径
+     * @return
+     */
+    public void parsingFile(List<ParsingFileUrl> parsingFileUrls) {
+
+        List<ParsingType> parsingTypes = parsingTypeMapper.selectTypeList();
+
+        if (parsingTypes.size() > 0) {
+            Ftp ftp = createParsingFtp();
+            if (ftp != null) {
+                for (ParsingFileUrl parsingFileUrl : parsingFileUrls) {
+                    String url = parsingFileUrl.getUrl();
+                    if (ftp.existFile(url)) {
+                        List<String> fileNames = ftp.ls(url);
+                        for (String fileName : fileNames) {
+                            for (ParsingType parsingType : parsingTypes) {
+                                if (fileName.contains(parsingType.getFileName())){
+
+                                }
+                            }
+                        }
+                    } else {
+                        log.info("ftp服务端,场站:{},无对应路径,{}", parsingFileUrl.getStationCode(), parsingFileUrl.getUrl());
+                    }
+                }
+
+                try {
+                    ftp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        } else {
+            log.info("未配置文件识别类型标识,无法进行下载解析");
+        }
+    }
+
+    public Ftp createParsingFtp() {
+        Ftp ftp = null;
+        Properties prop = new Properties();
+        try {
+            prop.load(new FileInputStream("ftpConfig.properties"));
+            String host = prop.getProperty("ftp.server.host");
+            String port = prop.getProperty("ftp.server.port");
+            String user = prop.getProperty("ftp.server.username");
+            String password = prop.getProperty("ftp.server.password");
+
+            FtpConfig ftpConfig = new FtpConfig();
+            try {
+                //创建ftp配置
+                ftpConfig.setHost(host);
+                ftpConfig.setPort(Integer.parseInt(port));
+                ftpConfig.setPassword(password);
+                ftpConfig.setUser(user);
+                //字符集使用UTF-8
+                ftpConfig.setCharset(Charset.forName("UTF-8"));
+                ftpConfig.setConnectionTimeout(5 * 1000L);
+
+                //设置主动模式连接
+                ftp = new Ftp(ftpConfig, FtpMode.Active);
+                log.info("{} :ftp服务器连接成功", ftpConfig.getHost());
+            } catch (Exception e) {
+                log.error("{} :ftp服务器连接失败", ftpConfig.getHost(), e);
+                if (ftp != null) {
+                    ftp.close();
+                }
+            }
+        } catch (Exception ex) {
+            log.error("获取ftp配置失败。", ex);
+        } finally {
+            return ftp;
+        }
+    }
+
+
+
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingCdqService.java

@@ -0,0 +1,16 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingCdq;
+
+/**
+ * 测风塔解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingCdqService extends IService<ParsingCdq> {
+
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingCftService.java

@@ -0,0 +1,16 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingCft;
+
+/**
+ * 测风塔解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingCftService extends IService<ParsingCft> {
+
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingDqService.java

@@ -0,0 +1,16 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingDq;
+
+/**
+ * 短期解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingDqService extends IService<ParsingDq> {
+
+
+}

+ 130 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFileService.java

@@ -0,0 +1,130 @@
+//package com.cpp.web.service.datafactory;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.jiayue.ipp.common.data.entity.an.ChannelStatus;
+//import com.jiayue.ipp.common.data.entity.an.ParsingUrl;
+//import com.jiayue.ipp.common.data.entity.an.ReportingRateRecords;
+//import com.jiayue.ipp.idp.dto.*;
+//import com.jiayue.ipp.idp.util.FileUtil;
+//import com.jiayue.ipp.idp.util.JsonBeanUtil;
+//import lombok.RequiredArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import java.io.File;
+//import java.text.SimpleDateFormat;
+//import java.util.ArrayList;
+//import java.util.Date;
+//import java.util.List;
+//
+///**
+// * 解析文件业务层
+// *
+// * @author tl
+// * @date 2022-05-11 09:51:21
+// */
+//@Service
+//@RequiredArgsConstructor
+//@Slf4j
+//@Transactional
+//public class ParsingFileService {
+//
+//    private final com.jiayue.ipp.idp.service.an.ReportingRateRecordsService reportingRateRecordsService;
+//
+//    private final List<ParsingInterface> parsingInterfaces;
+//
+//    private final com.jiayue.ipp.idp.service.an.ChannelStatusService channelStatusService;
+//
+//    //文件解析
+//    /*
+//     * 解析配置格式规则:
+//     *   s=>>1=>>entity=
+//     *   s:单行标识
+//     *   1:取值在1行
+//     *   entity=:键标记标记
+//     *
+//     *   m=>>4-20=>>3
+//     *   m:多行标识
+//     *   4-20:取值在4-20行
+//     *   3:第三列
+//     * */
+//    public FileAnalysisStatusDto parsingFile(File file, ParsingUrl parsingUrl) {
+//        log.info("开始尝试解析【{}】的 {}",parsingUrl.getStationCode(),file.getName());
+//        FileAnalysisStatusDto fileAnalysisStatusDto=new FileAnalysisStatusDto();
+//        //因为并不知道当前文件属于哪种类型文件,所以遍历接口实现类来进行对应文件的解析
+//        for (ParsingInterface parsingInterface : parsingInterfaces) {
+//            fileAnalysisStatusDto = parsingInterface.parsing(file, parsingUrl);
+//            if (fileAnalysisStatusDto.getStatus()!=null) {
+//                return fileAnalysisStatusDto;
+//            }
+//        }
+//        if (fileAnalysisStatusDto.getStatus()==null){
+//            fileAnalysisStatusDto.setMessage("无配置符合文件解析失败!!!");
+//        }
+//        return fileAnalysisStatusDto;
+//    }
+//
+//
+//
+//    /**
+//     * 对于状态文件单独解析
+//     *
+//     * @param file
+//     * @param parsingUrl
+//     * @return
+//     */
+//    public String parsingStatusFile(File file, ParsingUrl parsingUrl) {
+//        SimpleDateFormat simpleDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd_HH:mm");
+//
+//        String parsingStatus = ParsingConstant.FAIL;
+//        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(parsingUrl.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(parsingUrl.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, parsingUrl.getStationCode());
+//            channelStatusService.remove(lambdaQueryWrapper);
+//            channelStatusService.saveBatch(channelStatusList);
+//            parsingStatus = "status";
+//        } catch (Exception e) {
+//            parsingStatus += "status 解析失败";
+//            log.error("解析状态数据失败! /(ㄒoㄒ)/~~", e);
+//        }finally {
+//            return parsingStatus;
+//        }
+//
+//    }
+//
+//
+//}

+ 14 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFileUrlService.java

@@ -0,0 +1,14 @@
+package com.cpp.web.service.datafactory;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingFileUrl;
+
+/**
+ * 解析ftp路径业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingFileUrlService extends IService<ParsingFileUrl> {
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingFjService.java

@@ -0,0 +1,15 @@
+package com.cpp.web.service.datafactory;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingFj;
+
+/**
+ * 风机解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingFjService extends IService<ParsingFj> {
+
+
+}

+ 121 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingInterface.java

@@ -0,0 +1,121 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
+import com.cpp.web.utils.FieldUtil;
+import com.cpp.web.utils.PUtil;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+/**
+ * 解析业务层总接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingInterface {
+
+    boolean save(BaseParsing baseParsing);
+
+    boolean deleteById(Long id);
+
+//    FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl);
+
+
+    default Long parsingTime(String sign, List<String> fileContent) {
+        Long time = 0l;
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+            String s = fileContent.get(Integer.parseInt(config.getLineNumber()) - 1);
+            int signIndex = s.indexOf(config.getDataSign());
+            String result;
+            if (signIndex > 0) {
+                int startLength = config.getDataSign().length() + signIndex + 1;
+                int length = config.getFormat().length();
+                if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                    startLength += 1;
+                }
+                result = s.substring(startLength, startLength + length);
+
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(config.getFormat());
+
+                time = simpleDateFormat.parse(result).getTime();
+            }
+
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return time;
+        }
+
+    }
+
+
+    default BigDecimal parsingValue(String sign, List<String> fileContent) {
+
+        BigDecimal value = new BigDecimal(-99);
+        try {
+            if (sign != null && !sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+
+                String s = fileContent.get(Integer.parseInt(config.getLineNumber()) - 1);
+
+                String[] strings = PUtil.splitLineWithSpace(s);
+                int rowNumber = Integer.parseInt(config.getRowNumber()) - 1;
+                String result = strings[rowNumber];
+                value = new BigDecimal(result);
+            }
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return value;
+        }
+    }
+
+
+    default String parsingStatus(String sign, List<String> fileContent) {
+        String status = null;
+        try {
+            if (sign != null&&!sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+
+                String s = fileContent.get(Integer.parseInt(config.getLineNumber()) - 1);
+
+                String[] strings = PUtil.splitLineWithSpace(s);
+                int rowNumber = Integer.parseInt(config.getRowNumber()) - 1;
+                status = strings[rowNumber];
+            }
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return status;
+        }
+    }
+
+
+    default String parsingName(String sign, List<String> fileContent) {
+
+        String name = "";
+        try {
+            if (sign != null && !sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+
+                String s = fileContent.get(Integer.parseInt(config.getLineNumber()) - 1);
+
+                String[] strings = PUtil.splitLineWithSpace(s);
+                int rowNumber = Integer.parseInt(config.getRowNumber()) - 1;
+                name = strings[rowNumber];
+            }
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return name;
+        }
+    }
+
+
+
+}

+ 19 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingLogService.java

@@ -0,0 +1,19 @@
+//package com.cpp.web.service.datafactory;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.IService;
+//import com.jiayue.ipp.common.data.entity.an.ParsingLog;
+//
+//import java.util.Date;
+//
+///**
+// * 解析记录业务层接口
+// *
+// * @author tl
+// * @date 2022-05-16 11:15:21
+// */
+//public interface ParsingLogService extends IService<ParsingLog> {
+//
+//    QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileStatusAndFileType(String stationCode, Date startTime, Date endTime, String fileStatus, String fileType);
+//
+//}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingNbqService.java

@@ -0,0 +1,16 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingNbq;
+
+/**
+ * 逆变器解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingNbqService extends IService<ParsingNbq> {
+
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingNwpService.java

@@ -0,0 +1,15 @@
+package com.cpp.web.service.datafactory;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingNwp;
+
+/**
+ * 短期解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingNwpService extends IService<ParsingNwp> {
+
+
+}

+ 15 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingQxzService.java

@@ -0,0 +1,15 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingQxz;
+
+/**
+ * 气象站解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingQxzService extends IService<ParsingQxz> {
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingRpService.java

@@ -0,0 +1,16 @@
+package com.cpp.web.service.datafactory;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.datafactory.ParsingRp;
+
+/**
+ * 短期解析信息业务层接口
+ *
+ * @author tl
+ * @date 2022-05-11 09:51:21
+ */
+public interface ParsingRpService extends IService<ParsingRp> {
+
+
+}

+ 25 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ReportingRateRecordsService.java

@@ -0,0 +1,25 @@
+//package com.cpp.web.service.datafactory;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.IService;
+//import com.jiayue.ipp.common.data.entity.an.ReportingRateRecords;
+//
+///**
+// * 上报率记录表
+// *
+// * @author csc code generator
+// * @date 2022-12-28 14:49:14
+// */
+//public interface ReportingRateRecordsService extends IService<ReportingRateRecords> {
+//
+//    /**
+//     * 根据场站编号 时间范围 文件类型构造查询条件
+//     *
+//     * @param stationCode 场站类型
+//     * @param startTime   开始时间
+//     * @param endTime     结束时间
+//     * @param reportType  上报文件类型
+//     * @return
+//     */
+//    QueryWrapper<ReportingRateRecords> findByStationCodeAndTimeBetweenAndReportType(String stationCode, Long startTime, Long endTime, String reportType);
+//}

+ 68 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/BaseParsingServiceImpl.java

@@ -0,0 +1,68 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.service.datafactory.BaseParsingService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+@RequiredArgsConstructor
+public class BaseParsingServiceImpl implements BaseParsingService {
+
+//    private final Parsing parsingDqInfoService;
+//    private final ParsingCdqInfoService parsingCdqInfoService;
+//    private final ParsingNwpInfoService parsingNwpInfoService;
+//
+
+    private final Map<String, ParsingInterface> parsingInterfaceMap;
+
+
+    @Override
+    public List<BaseParsing> getParsingInfos() {
+
+        List<BaseParsing> parsingInfos = new ArrayList<>();
+
+//        parsingInfos.addAll(parsingDqInfoService.list());
+//        parsingInfos.addAll(parsingCdqInfoService.list());
+//        parsingInfos.addAll(parsingNwpInfoService.list());
+
+        return parsingInfos;
+    }
+
+    @Override
+    public List<Map<String,String>> getFileType() {
+        FileTypeEnum[] values = FileTypeEnum.values();
+        List<Map<String,String>> mapList = new ArrayList<>();
+        for (FileTypeEnum value : values) {
+            Map<String,String> map = new HashMap<>();
+            map.put(value.name(),value.getMessage());
+            mapList.add(map);
+        }
+        return mapList;
+    }
+
+    @Override
+    public boolean save(BaseParsing baseParsing) {
+
+        ParsingInterface parsingInterface = parsingInterfaceMap.get("parsing" + baseParsing.getFileType() + "ServiceImpl");
+
+        return parsingInterface.save(baseParsing);
+    }
+
+    @Override
+    public boolean deleteById(BaseParsing baseParsing) {
+        ParsingInterface parsingInterface = parsingInterfaceMap.get("parsing" + baseParsing.getFileType() + "ServiceImpl");
+
+        return parsingInterface.deleteById(baseParsing.getId());
+    }
+
+
+}

+ 47 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ChannelStatusServiceImpl.java

@@ -0,0 +1,47 @@
+//package com.cpp.web.service.datafactory.impl;
+//
+//import cn.hutool.core.date.DateTime;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+//import com.jiayue.ipp.common.data.entity.an.ChannelStatus;
+//import com.jiayue.ipp.idp.mapper.an.ChannelStatusMapper;
+//import com.jiayue.ipp.idp.service.an.ChannelStatusService;
+//import org.springframework.stereotype.Service;
+//
+///**
+// * 通道状态表
+// *
+// * @author csc code generator
+// * @date 2022-12-28 14:49:40
+// */
+//@Service
+//public class ChannelStatusServiceImpl extends ServiceImpl<ChannelStatusMapper, ChannelStatus> implements ChannelStatusService {
+//
+//    /**
+//     * 根据上报时间 场站编号 通道状态 通道类型 构造查询条件
+//     *
+//     * @param stationCode       场站编号
+//     * @param startTime         上报时间
+//     * @param endTime           上报时间
+//     * @param channelStatusCode 通道状态
+//     * @param channelTypeCode   通道类型
+//     * @return 查询条件
+//     */
+//    @Override
+//    public QueryWrapper<ChannelStatus> findByStationCodeAndStartTimeBetweenAndChannelStatusAndChannelType(String stationCode, Long startTime, Long endTime, String channelStatusCode, String channelTypeCode) {
+//        QueryWrapper<ChannelStatus> wrapper = new QueryWrapper<>();
+//        if (stationCode != null && !stationCode.equals("")) {
+//            wrapper.eq("station_code", stationCode);
+//        }
+//        if (startTime != null && endTime != null) {
+//            wrapper.between("upload_time", new DateTime(startTime), new DateTime(endTime));
+//        }
+//        if (channelStatusCode != null && !channelStatusCode.equals("")) {
+//            wrapper.eq("status", channelStatusCode);
+//        }
+//        if (channelTypeCode != null && !channelTypeCode.equals("")) {
+//            wrapper.eq("type", channelTypeCode);
+//        }
+//        return wrapper;
+//    }
+//}

+ 275 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingCdqServiceImpl.java

@@ -0,0 +1,275 @@
+package com.cpp.web.service.datafactory.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingCdq;
+import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
+import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.mapper.datafactory.ParsingCdqMapper;
+import com.cpp.web.service.cloud.ForecastPowerUltraShortTermService;
+import com.cpp.web.service.datafactory.ParsingCdqService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.station.ForecastPowerUltraShortTermHisService;
+import com.cpp.web.utils.FieldUtil;
+import com.cpp.web.utils.PUtil;
+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.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 超短期解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingCdqServiceImpl extends ServiceImpl<ParsingCdqMapper, ParsingCdq> implements ParsingCdqService, ParsingInterface {
+
+//    private final Long intervalTime = 900000l;
+
+    private final ForecastPowerUltraShortTermHisService forecastPowerUltraShortTermHisService;
+
+    private final ForecastPowerUltraShortTermService forecastPowerUltraShortTermService;
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingCdq) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.CDQ.getCode()+"");
+////
+////        String parsingStatus = ParsingConstant.FAIL;
+//
+//        try {
+//            // 查询ParsingCdqInfo列表
+//            List<ParsingCdqInfo> parsingCdqInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingCdqInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+//            if (!parsingCdqInfos.isEmpty()) {
+//                ParsingCdqInfo parsingCdqInfo = parsingCdqInfos.get(0);
+//
+//                if (file.getName().contains(parsingCdqInfo.getFileName())) {
+//
+//                    List<String> fileContent = FileUtil.getFileContent(file);
+//                    if (parsingCdqInfo.getDataType().equals(FieldUtil.MULTI)) {
+//                        List<BigDecimal> bigDecimals;
+//                        if (parsingCdqInfo.getFpValue() != null) ;
+//                        bigDecimals = parsingFpValue(parsingCdqInfo.getFpValue(), fileContent);
+//
+//                        if (bigDecimals.size() > 0) {
+//                            Long forecastTime = parsingForecastTime(parsingCdqInfo.getForecastTime(), fileContent);
+//                            if (forecastTime != 0L) {
+//                                // 所属产生时刻用第一个点位减去15分钟
+//                                long genDate = forecastTime-1000*60*15L;
+//
+//                                int ago = 1;
+//                                List<ForecastPowerUltraShortTermHis> forecastPowerUltraShortTermHisList = new ArrayList<>();
+//                                List<ForecastPowerUltraShortTerm> forecastPowerUltraShortTermList = new ArrayList<>();
+//
+//                                for (BigDecimal bigDecimal : bigDecimals) {
+//                                    // 构造ForecastPowerUltraShortTermHis对象
+//                                    ForecastPowerUltraShortTermHis forecastPowerUltraShortTermHis = new ForecastPowerUltraShortTermHis();
+//                                    forecastPowerUltraShortTermHis.setGenDate(new Date(genDate));
+//                                    forecastPowerUltraShortTermHis.setStationCode(parsingUrl.getStationCode());
+//                                    forecastPowerUltraShortTermHis.setAbleValue(bigDecimal);
+//                                    Date localDateTime = new Date(forecastTime);
+//                                    forecastPowerUltraShortTermHis.setForecastTime(localDateTime);
+//                                    forecastPowerUltraShortTermHis.setForecastHowLongAgo(ago);
+//                                    forecastPowerUltraShortTermHis.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    forecastTime += Constant.INTERVALTIME;
+//
+//                                    // 构造ForecastPowerUltraShortTerm对象
+//                                    ForecastPowerUltraShortTerm forecastPowerUltraShortTerm = new ForecastPowerUltraShortTerm();
+//                                    forecastPowerUltraShortTerm.setForecastTime(localDateTime);
+//                                    forecastPowerUltraShortTerm.setStationCode(parsingUrl.getStationCode());
+//                                    forecastPowerUltraShortTerm.setFpValue(bigDecimal);
+//                                    forecastPowerUltraShortTerm.setGenDate(new Date(genDate));
+//                                    forecastPowerUltraShortTerm.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    forecastPowerUltraShortTermList.add(forecastPowerUltraShortTerm);
+//
+//                                    forecastPowerUltraShortTermHisList.add(forecastPowerUltraShortTermHis);
+//                                    ago++;
+//                                }
+//
+//                                fileAnalysisStatusDto.setStatus("1");
+//                                log.info("解析CDQ文件:{} 成功! O(∩_∩)O", file.getName());
+//
+//                                // 删除之前的ForecastPowerUltraShortTerm记录
+//                                LambdaQueryWrapper<ForecastPowerUltraShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                lambdaQueryWrapper.eq(ForecastPowerUltraShortTerm::getStationCode, parsingUrl.getStationCode());
+//                                lambdaQueryWrapper.eq(ForecastPowerUltraShortTerm::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                lambdaQueryWrapper.between(ForecastPowerUltraShortTerm::getForecastTime, forecastPowerUltraShortTermList.get(0).getForecastTime(), forecastPowerUltraShortTermList.get(forecastPowerUltraShortTermList.size() - 1).getForecastTime());
+//                                forecastPowerUltraShortTermService.remove(lambdaQueryWrapper);
+//                                // 批量保存新的ForecastPowerUltraShortTerm记录
+//                                forecastPowerUltraShortTermService.saveBatch(forecastPowerUltraShortTermList);
+//
+//                                // 删除当天的ForecastPowerUltraShortTermHis记录
+//                                LambdaQueryWrapper<ForecastPowerUltraShortTermHis> forecastPowerUltraShortTermHisLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                forecastPowerUltraShortTermHisLambdaQueryWrapper.eq(ForecastPowerUltraShortTermHis::getGenDate, new Date(genDate));
+//                                forecastPowerUltraShortTermHisLambdaQueryWrapper.eq(ForecastPowerUltraShortTermHis::getStationCode, parsingUrl.getStationCode());
+//                                forecastPowerUltraShortTermHisLambdaQueryWrapper.eq(ForecastPowerUltraShortTermHis::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                forecastPowerUltraShortTermHisService.remove(forecastPowerUltraShortTermHisLambdaQueryWrapper);
+//                                // 批量保存新的ForecastPowerUltraShortTermHis记录
+//                                forecastPowerUltraShortTermHisService.saveBatch(forecastPowerUltraShortTermHisList);
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("解析超短期文件时间错误");
+//                                log.error("解析CDQ文件时间错误");
+//                            }
+//                        }
+//                        else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("解析超短期文件无数据");
+//                            log.error("解析超短期文件无数据");
+//                        }
+//
+//                    }else {
+//                        fileAnalysisStatusDto.setStatus("0");
+//                        fileAnalysisStatusDto.setMessage("超短期暂无单行解析方式");
+//                        log.info("cdq暂无单行解析方式");
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析超短期数据失败!");
+//            log.error("解析超短期数据失败", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+
+
+    //目前所知该类型在文件中只有s一种形式,暂不支持m
+    protected Date parsingGenDate(String sign, List<String> fileContent) {
+        Date genDate = new Date();
+        try {
+            if (!sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+                String s = fileContent.get(PUtil.noParseInt(config.getLineNumber()));
+                int signIndex = s.indexOf(config.getDataSign());
+                String result;
+                if (signIndex > 0) {
+
+                    int startLength = config.getDataSign().length() + signIndex + 1;
+                    int length = config.getFormat().length();
+                    if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                        startLength += 1;
+                    }
+                    result = s.substring(startLength, startLength + length);
+
+                    DateTimeFormatter fmt = DateTimeFormatter.ofPattern(config.getFormat());
+                    genDate = DateUtil.parse(result, fmt.toString());
+                    log.info("解析超短期【数据生成日期】成功,日期为:{}", result);
+                } else {
+                    log.error("解析超短期【数据生成日期】时公式标识不存在所在行");
+                }
+
+            }
+
+        } catch (RuntimeException e) {
+            log.error("解析超短期【数据生成日期】失败");
+            e.printStackTrace();
+        } finally {
+            return genDate;
+        }
+    }
+
+
+    //解析预测时间
+    protected Long parsingForecastTime(String sign, List<String> fileContent) {
+        Long forecastTime = 0l;
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+
+            String s = fileContent.get(PUtil.noParseInt(config.getLineNumber()));
+            int signIndex = s.indexOf(config.getDataSign());
+            String result;
+            if (signIndex > 0) {
+                int startLength = config.getDataSign().length() + signIndex + 1;
+                int length = config.getFormat().length();
+                if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                    startLength += 1;
+                }
+                result = s.substring(startLength, startLength + length);
+
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(config.getFormat());
+
+                forecastTime = simpleDateFormat.parse(result).getTime();
+
+                log.info("解析超短期【预测时间】成功,开始时间为:{}", result);
+            } else {
+                log.error("解析超短期【预测时间】时公式标识不存在所在行");
+            }
+
+        } catch (RuntimeException e) {
+            log.error("解析超短期【预测时间】失败");
+            e.printStackTrace();
+        } finally {
+            return forecastTime;
+        }
+
+    }
+
+
+    /*
+     * 解析配置格式规则:
+     *   s=>>1=>>entity=
+     *   s:单行标识
+     *   1:取值在1行
+     *   entity=:键标记标记
+     *
+     *   m=>>4-20=>>3
+     *   m:多行标识
+     *   4-20:取值在4-20行
+     *   3:第三列
+     * */
+    protected List<BigDecimal> parsingFpValue(String sign, List<String> fileContent) {
+        List<BigDecimal> fpValues = new ArrayList<>();
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+
+
+            String[] lineNumber = config.getLineNumber().split("-");
+            int startLine = PUtil.noParseInt(lineNumber[0]);
+            int endLine = PUtil.noParseInt(lineNumber[1]);
+
+            for (int i = startLine; i <= endLine; i++) {
+                String[] strings = PUtil.splitLineWithSpace(fileContent.get(i));
+                String result = strings[PUtil.noParseInt(config.getRowNumber())];
+
+                fpValues.add(new BigDecimal(result));
+            }
+
+            log.info("解析超短期【预测数据】成功!!!,记录数:{}", fpValues.size());
+
+        } catch (RuntimeException e) {
+            log.error("解析超短期【预测数据】失败");
+            e.printStackTrace();
+        } finally {
+            return fpValues;
+        }
+    }
+
+
+}

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

@@ -0,0 +1,137 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingCft;
+import com.cpp.web.mapper.datafactory.ParsingCftMapper;
+import com.cpp.web.service.datafactory.ParsingCftService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.station.WindTowerInfoService;
+import com.cpp.web.service.station.WindTowerStatusDataService;
+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.util.Date;
+import java.util.List;
+
+/**
+ * 测风塔解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingCftServiceImpl extends ServiceImpl<ParsingCftMapper, ParsingCft> implements ParsingCftService, ParsingInterface {
+
+
+    private final Long intervalTime = 300000L;
+
+    private final WindTowerStatusDataService windTowerStatusDataService;
+
+    private final WindTowerInfoService windTowerInfoService;
+
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingCft) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.CFT.getCode()+"");
+//
+//        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()));
+//                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();
+//                                    windTowerStatusData.setTime(new Date(time));
+//
+//                                    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);
+//                                    fileAnalysisStatusDto.setStatus("1");
+//                                    log.info("解析CFT文件:{} 成功! O(∩_∩)O", file.getName());
+//                                } else {
+//                                    fileAnalysisStatusDto.setStatus("0");
+//                                    fileAnalysisStatusDto.setMessage("解析测风塔文件时间错误");
+//                                    log.error("解析CFT文件时间错误");
+//                                }
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("测风塔暂无多行解析方式");
+//                                log.info("cft暂无多行解析方式");
+//                            }
+//                        }
+//                    }
+//                } else {
+//                    fileAnalysisStatusDto.setStatus("0");
+//                    fileAnalysisStatusDto.setMessage("测风塔未配置作为解析使用设备");
+//                    log.info("cft未配置作为解析使用设备");
+//                }
+//
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析测风塔数据失败!");
+//            log.error("解析测风塔数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+}

+ 275 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingDqServiceImpl.java

@@ -0,0 +1,275 @@
+package com.cpp.web.service.datafactory.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingDq;
+import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
+import com.cpp.web.mapper.datafactory.ParsingDqMapper;
+import com.cpp.web.service.cloud.ForecastPowerShortTermService;
+import com.cpp.web.service.datafactory.ParsingDqService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.station.ForecastPowerShortTermHisService;
+import com.cpp.web.utils.FieldUtil;
+import com.cpp.web.utils.PUtil;
+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.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 短期解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+@Transactional
+public class ParsingDqServiceImpl extends ServiceImpl<ParsingDqMapper, ParsingDq> implements ParsingDqService, ParsingInterface {
+
+    private final ForecastPowerShortTermHisService forecastPowerShortTermHisService;
+
+    private final ForecastPowerShortTermService forecastPowerShortTermService;
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingDq) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.DQ.getCode()+"");
+//
+//        try {
+//            List<ForecastPowerShortTermHis> forecastPowerShortTermHisList = new ArrayList<>();
+//            List<ForecastPowerShortTerm> forecastPowerShortTermList = new ArrayList<>();
+//            List<ParsingDqInfo> parsingDqInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingDqInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+//            if (!parsingDqInfos.isEmpty()) {
+//                ParsingDqInfo parsingDqInfo = parsingDqInfos.get(0);
+//
+//                    //判断文件名是否符合配置
+//                    if (file.getName().contains(parsingDqInfo.getFileName())) {
+//
+//                        List<String> fileContent = FileUtil.getFileContent(file);
+//                        if (parsingDqInfo.getDataType().equals(FieldUtil.MULTI)) {
+//                            List<BigDecimal> bigDecimals;
+//                            if (parsingDqInfo.getFpValue() != null) ;
+//                            bigDecimals = parsingFpValue(parsingDqInfo.getFpValue(), fileContent);
+//
+//                            if (bigDecimals.size() > 0) {
+//
+////                                LocalDate genDate = parsingGenDate(parsingDqInfo.getGenDate(), fileContent);
+//                                Long forecastTime = parsingForecastTime(parsingDqInfo.getForecastTime(), fileContent);
+//                                long secondDayTime = com.jiayue.ipp.idp.util.DateMomentUtil.getDayStartTime(System.currentTimeMillis())+1000*60*60*24;
+//                                if (forecastTime==secondDayTime){
+//                                    if (forecastTime != 0l) {
+//                                        Long systemTime = System.currentTimeMillis();
+//                                        for (BigDecimal bigDecimal : bigDecimals) {
+//                                            Date forecastDate = new Date(forecastTime);
+//                                            ForecastPowerShortTermHis forecastPowerShortTermHis = new ForecastPowerShortTermHis();
+//                                            forecastPowerShortTermHis.setGenDate(new Date());
+//                                            forecastPowerShortTermHis.setStationCode(parsingUrl.getStationCode());
+//                                            forecastPowerShortTermHis.setAbleValue(bigDecimal);
+//                                            forecastPowerShortTermHis.setForecastTime(forecastDate);
+//                                            forecastPowerShortTermHis.setForecastHowLongAgo(DateMomentUtil.getDaysBetweenTwoDate(systemTime,forecastTime));
+//                                            forecastPowerShortTermHis.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                            forecastPowerShortTermHisList.add(forecastPowerShortTermHis);
+//
+//                                            ForecastPowerShortTerm forecastPowerShortTerm = new ForecastPowerShortTerm();
+//                                            forecastPowerShortTerm.setForecastTime(forecastDate);
+//                                            forecastPowerShortTerm.setStationCode(parsingUrl.getStationCode());
+//                                            forecastPowerShortTerm.setFpValue(bigDecimal);
+//                                            forecastPowerShortTerm.setGenDate(new Date());
+//                                            forecastPowerShortTerm.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                            forecastPowerShortTermList.add(forecastPowerShortTerm);
+//
+//                                            forecastTime += Constant.INTERVALTIME;
+//                                        }
+//
+//                                        // 保存短期实时
+//                                        Date startTime = forecastPowerShortTermList.get(0).getForecastTime();
+//                                        Date endTime = forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime();
+//                                        LambdaQueryWrapper<ForecastPowerShortTerm> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                        lambdaQueryWrapper.eq(ForecastPowerShortTerm::getStationCode, parsingUrl.getStationCode());
+//                                        lambdaQueryWrapper.eq(ForecastPowerShortTerm::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                        lambdaQueryWrapper.between(ForecastPowerShortTerm::getForecastTime, startTime, endTime);
+//                                        forecastPowerShortTermService.remove(lambdaQueryWrapper);
+//                                        forecastPowerShortTermService.saveBatch(forecastPowerShortTermList);
+//
+//                                        // 保存短期历史
+////                                        LocalDate today = LocalDate.now();
+//                                        LambdaQueryWrapper<ForecastPowerShortTermHis> forecastPowerShortTermHisLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                        forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getStationCode, parsingUrl.getStationCode());
+//                                        forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getForecastManufactor, parsingUrl.getForecastManufactor());
+//                                        forecastPowerShortTermHisLambdaQueryWrapper.eq(ForecastPowerShortTermHis::getGenDate, DateUtil.format(new Date(),"yyyy-MM-dd"));
+//                                        forecastPowerShortTermHisService.remove(forecastPowerShortTermHisLambdaQueryWrapper);
+//                                        forecastPowerShortTermHisService.saveBatch(forecastPowerShortTermHisList);
+//
+//
+//                                        log.info("解析DQ文件:{} 成功! O(∩_∩)O", file.getName());
+//                                        fileAnalysisStatusDto.setStatus("1");
+//                                    } else {
+//                                        fileAnalysisStatusDto.setStatus("0");
+//                                        fileAnalysisStatusDto.setMessage("解析短期文件时间错误");
+//                                        log.error("解析DQ文件时间错误");
+//                                    }
+//                                }
+//                                else{
+//                                    fileAnalysisStatusDto.setStatus("0");
+//                                    fileAnalysisStatusDto.setMessage("短期文件里日期不对");
+//                                    log.info("dq文件里日期不对");
+//                                }
+//
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("解析短期文件无数据");
+//                                log.error("解析短期文件无数据");
+//                            }
+//                        } else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("短期暂无单行解析方式");
+//                            log.info("dq暂无单行解析方式");
+//                        }
+//                    }
+////                }
+////                else{
+////                    parsingStatus += "dq文件里日期不对";
+////                    log.info("dq文件里日期不对");
+////                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析短期数据失败!");
+//            log.error("解析短期数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+
+
+    //目前所知该类型在文件中只有s一种形式==》暂不支持m
+    protected LocalDate parsingGenDate(String sign, List<String> fileContent) {
+        LocalDate genDate = LocalDate.now();
+
+        try {
+            if (!sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+
+                String s = fileContent.get(PUtil.noParseInt(config.getLineNumber()));
+                int signIndex = s.indexOf(config.getDataSign());
+                String result;
+                if (signIndex > 0) {
+                    int startLength = config.getDataSign().length() + signIndex + 1;
+                    int length = config.getFormat().length();
+                    if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                        startLength += 1;
+                    }
+                    result = s.substring(startLength, startLength + length);
+
+                    DateTimeFormatter fmt = DateTimeFormatter.ofPattern(config.getFormat());
+                    genDate = LocalDate.parse(result, fmt);
+                    log.info("解析短期【数据生成日期】成功==》日期为:{}", result);
+                } else {
+                    log.error("解析短期【数据生成日期】时公式标识不存在所在行");
+                }
+            }
+        } catch (RuntimeException e) {
+            log.error("解析短期【数据生成日期】失败");
+            e.printStackTrace();
+        } finally {
+            return genDate;
+        }
+    }
+
+    protected Long parsingForecastTime(String sign, List<String> fileContent) {
+        Long forecastTime = 0l;
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+            String s = fileContent.get(PUtil.noParseInt(config.getLineNumber()));
+            int signIndex = s.indexOf(config.getDataSign());
+            String result;
+            if (signIndex > 0) {
+                int startLength = config.getDataSign().length() + signIndex + 1;
+                int length = config.getFormat().length();
+                if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                    startLength += 1;
+                }
+                result = s.substring(startLength, startLength + length);
+
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(config.getFormat());
+
+                forecastTime = simpleDateFormat.parse(result).getTime();
+
+                log.info("解析短期【预测时间】成功==》开始时间为:{}", result);
+            } else {
+                log.error("解析短期【预测时间】时公式标识不存在所在行");
+            }
+        } catch (RuntimeException e) {
+            log.error("解析短期【预测时间】失败");
+            e.printStackTrace();
+        } finally {
+            return forecastTime;
+        }
+
+    }
+
+
+    /*
+     * 解析配置格式规则:
+     *   s=>>1=>>entity=
+     *   s:单行标识
+     *   1:取值在1行
+     *   entity=:键标记标记
+     *
+     *   m=>>4-20=>>3
+     *   m:多行标识
+     *   4-20:取值在4-20行
+     *   3:第三列
+     * */
+    protected List<BigDecimal> parsingFpValue(String sign, List<String> fileContent) {
+        List<BigDecimal> fpValues = new ArrayList<>();
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+
+
+            String[] lineNumber = config.getLineNumber().split("-");
+            int startLine = PUtil.noParseInt(lineNumber[0]);
+            int endLine = PUtil.noParseInt(lineNumber[1]);
+
+            for (int i = startLine; i <= endLine; i++) {
+                String[] strings = PUtil.splitLineWithSpace(fileContent.get(i));
+                String result = strings[PUtil.noParseInt(config.getRowNumber())];
+
+                fpValues.add(new BigDecimal(result));
+            }
+
+            log.info("解析短期【预测数据】成功!!!==》记录数:{}", fpValues.size());
+        } catch (RuntimeException e) {
+            log.error("解析短期【预测数据】失败");
+            e.printStackTrace();
+        } finally {
+            return fpValues;
+        }
+    }
+
+}

+ 18 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFileUrlServiceImpl.java

@@ -0,0 +1,18 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.ParsingFileUrl;
+import com.cpp.web.mapper.datafactory.ParsingFileUrlMapper;
+import com.cpp.web.service.datafactory.ParsingFileUrlService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 解析ftp路径业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+public class ParsingFileUrlServiceImpl extends ServiceImpl<ParsingFileUrlMapper, ParsingFileUrl> implements ParsingFileUrlService {
+
+}

+ 135 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingFjServiceImpl.java

@@ -0,0 +1,135 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingFj;
+import com.cpp.web.mapper.datafactory.ParsingFjMapper;
+import com.cpp.web.service.datafactory.ParsingFjService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.station.WindTurbineInfoService;
+import com.cpp.web.service.station.WindTurbineStatusDataService;
+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.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 风机解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingFjServiceImpl extends ServiceImpl<ParsingFjMapper, ParsingFj> implements ParsingFjService, ParsingInterface {
+
+
+    private final Long intervalTime = 300000l;
+
+    private final WindTurbineStatusDataService windTurbineStatusDataService;
+
+    private final WindTurbineInfoService windTurbineInfoService;
+
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingFj) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl ftpParsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.FJ.getCode()+"");
+//
+//        try {
+//
+//
+//            List<ParsingFjInfo> parsingFjInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingFjInfo.class).like(ParsingInfo::getStationCode, ftpParsingUrl.getStationCode()));
+//            if (parsingFjInfos.size() > 0) {
+//
+//                List<String> fileContent = FileUtil.getFileContent(file);
+//                List<WindTurbineInfo> windTurbineInfoList = windTurbineInfoService.list(Wrappers.lambdaQuery(WindTurbineInfo.class).eq(WindTurbineInfo::getStationCode, ftpParsingUrl.getStationCode()));
+//
+//                for (ParsingFjInfo parsingFjInfo : parsingFjInfos) {
+//                    //判断文件名是否符合配置
+//                    if (file.getName().indexOf(parsingFjInfo.getFileName()) >= 0) {
+//
+//                        WindTurbineStatusData windTurbineStatusData = new WindTurbineStatusData();
+//
+//                        if (parsingFjInfo.getDataType().equals(FieldUtil.SINGLE)) {
+//
+//                            String fjName = parsingName(parsingFjInfo.getEquipmentName(), fileContent);
+//
+//                            List<WindTurbineInfo> filterWindTurbineInfos = windTurbineInfoList.stream().filter(i -> i.getName().equals(fjName)).collect(Collectors.toList());
+//
+//                            if (filterWindTurbineInfos.size() > 0) {
+//                                windTurbineStatusData.setEquipmentId(filterWindTurbineInfos.get(0).getEquipmentNo());
+//                                Long time = parsingTime(parsingFjInfo.getTime(), fileContent);
+//                                if (time != 0l) {
+//                                    windTurbineStatusData.setTime(new Date(time));
+//
+//                                    windTurbineStatusData.setActivePower(parsingValue(parsingFjInfo.getActivePower(), fileContent));
+//                                    windTurbineStatusData.setCumulativeGeneratedEnergy(parsingValue(parsingFjInfo.getCumulativeGeneratedEnergy(), fileContent));
+//                                    windTurbineStatusData.setDayGridConnectedHours(parsingValue(parsingFjInfo.getDayGridConnectedHours(), fileContent));
+//                                    windTurbineStatusData.setWindWheelRatedSpeed(parsingValue(parsingFjInfo.getWindWheelRatedSpeed(), fileContent));
+//                                    windTurbineStatusData.setDayElectricQuantity(parsingValue(parsingFjInfo.getDayElectricQuantity(), fileContent));
+//                                    windTurbineStatusData.setElectricalCurrent(parsingValue(parsingFjInfo.getElectricalCurrent(), fileContent));
+//                                    windTurbineStatusData.setPitchAngle(parsingValue(parsingFjInfo.getPitchAngle(), fileContent));
+//                                    windTurbineStatusData.setPowerFactor(parsingValue(parsingFjInfo.getPowerFactor(), fileContent));
+//                                    windTurbineStatusData.setReactivePower(parsingValue(parsingFjInfo.getReactivePower(), fileContent));
+//                                    windTurbineStatusData.setVoltage(parsingValue(parsingFjInfo.getVoltage(), fileContent));
+//                                    windTurbineStatusData.setWd(parsingValue(parsingFjInfo.getWd(), fileContent));
+//                                    windTurbineStatusData.setWs(parsingValue(parsingFjInfo.getWs(), fileContent));
+//                                    windTurbineStatusData.setT(parsingValue(parsingFjInfo.getT(), fileContent));
+//
+//                                    windTurbineStatusData.setStatus(parsingStatus(parsingFjInfo.getStatus(), fileContent));
+//                                    windTurbineStatusData.setStationCode(parsingFjInfo.getStationCode());
+//
+//                                    windTurbineStatusDataService.save(windTurbineStatusData);
+//                                    log.info("解析FJ文件:" + file.getName() + " 成功! O(∩_∩)O");
+//                                    fileAnalysisStatusDto.setStatus("1");
+//                                } else {
+//                                    fileAnalysisStatusDto.setStatus("0");
+//                                    fileAnalysisStatusDto.setMessage("解析风机文件时间错误");
+//                                    log.error("解析FJ文件时间错误");
+//                                }
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("风机在本地无配置无法解析");
+//                                log.info("fj {} 在本地无配置无法解析", fjName);
+//                            }
+//                        } else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("风机暂无多行解析方式");
+//                            log.info("fj暂无多行解析方式");
+//                        }
+//                    }
+//                }
+//            }
+//
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析风机数据错误!");
+//            log.error("解析风机数据错误",e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//
+//    }
+
+
+}

+ 34 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingLogServiceImpl.java

@@ -0,0 +1,34 @@
+//package com.cpp.web.service.datafactory.impl;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+//import org.springframework.stereotype.Service;
+//
+//import java.util.Date;
+//
+///**
+// * 解析记录业务层实现类
+// *
+// * @author tl
+// * @date 2022-05-11 18:07:03
+// */
+//@Service
+//public class ParsingLogServiceImpl extends ServiceImpl<ParsingLogMapper, ParsingLog> implements ParsingLogService {
+//    @Override
+//    public QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileStatusAndFileType(String stationCode, Date startTime, Date endTime, String fileStatus, String fileType) {
+//        QueryWrapper<ParsingLog> wrapper = new QueryWrapper<>();
+//        if (stationCode != null && !stationCode.equals("")) {
+//            wrapper.eq("station_code", stationCode);
+//        }
+//        if (startTime != null && !startTime.equals("") && endTime != null && !endTime.equals("")) {
+//            wrapper.between("cpp_parsing_time", startTime, endTime);
+//        }
+//        if (fileStatus != null && !fileStatus.equals("")) {
+//            wrapper.eq("cpp_parsing_file_status", fileStatus);
+//        }
+//        if (fileType != null && !fileType.equals("")) {
+//            wrapper.eq("file_type", fileType);
+//        }
+//        return wrapper;
+//    }
+//}

+ 128 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNbqServiceImpl.java

@@ -0,0 +1,128 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingNbq;
+import com.cpp.web.mapper.datafactory.ParsingNbqMapper;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.datafactory.ParsingNbqService;
+import com.cpp.web.service.station.InverterInfoService;
+import com.cpp.web.service.station.InverterStatusDataService;
+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;
+import java.util.stream.Collectors;
+
+/**
+ * 逆变器解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingNbqServiceImpl extends ServiceImpl<ParsingNbqMapper, ParsingNbq> implements ParsingNbqService, ParsingInterface {
+
+    private final InverterStatusDataService inverterStatusDataService;
+
+    private final InverterInfoService inverterInfoService;
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingNbq) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl ftpParsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.NBQ.getCode()+"");
+//
+//        try {
+//
+//            //查询符合该场站的nbq配置信息
+//            List<ParsingNbqInfo> parsingNbqInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingNbqInfo.class).like(ParsingInfo::getStationCode, ftpParsingUrl.getStationCode()));
+//            if (parsingNbqInfos.size() > 0) {
+//
+//                //解析文件内容以行为单位的 List<String>
+//                List<String> fileContent = FileUtil.getFileContent(file);
+//
+//                //查询对应该场站路径下的逆变器信息
+//                List<InverterInfo> inverterInfoList = inverterInfoService.list(Wrappers.lambdaQuery(InverterInfo.class).eq(InverterInfo::getStationCode, ftpParsingUrl.getStationCode()));
+//
+//                //因为有可能该场站有多种解析配置,例如多个逆变器数据情况,需要循环解析信息
+//                for (ParsingNbqInfo parsingNbqInfo : parsingNbqInfos) {
+//                    //判断文件名是否符合配置
+//                    if (file.getName().indexOf(parsingNbqInfo.getFileName()) >= 0) {
+//
+//                        //判断数据类型是单行还是多行
+//                        if (parsingNbqInfo.getDataType().equals(FieldUtil.SINGLE)) {
+//                            /**
+//                             * 逆变器和风机id  需要解析名称找出对应设备存入id
+//                             *
+//                             */
+//                            String nbqName = parsingName(parsingNbqInfo.getEquipmentName(), fileContent);
+//                            List<InverterInfo> filterInverterInfos = inverterInfoList.stream().filter(i -> i.getName().equals(nbqName)).collect(Collectors.toList());
+//                            if (filterInverterInfos.size() > 0) {
+//                                Long time = parsingTime(parsingNbqInfo.getTime(), fileContent);
+//                                if (time != 0l) {
+//                                    InverterStatusData inverterStatusData = new InverterStatusData();
+//                                    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
+//                                    inverterStatusData.setTime(localDateTime);
+//
+//                                    inverterStatusData.setActivePower(parsingValue(parsingNbqInfo.getActivePower(), fileContent));
+//                                    inverterStatusData.setCumulativeGeneratedEnergy(parsingValue(parsingNbqInfo.getCumulativeGeneratedEnergy(), fileContent));
+//                                    inverterStatusData.setDayGridConnectedHours(parsingValue(parsingNbqInfo.getDayGridConnectedHours(), fileContent));
+//                                    inverterStatusData.setDayElectricQuantity(parsingValue(parsingNbqInfo.getDayElectricQuantity(), fileContent));
+//                                    inverterStatusData.setElectricalCurrent(parsingValue(parsingNbqInfo.getElectricalCurrent(), fileContent));
+//                                    inverterStatusData.setReactivePower(parsingValue(parsingNbqInfo.getReactivePower(), fileContent));
+//                                    inverterStatusData.setPowerFactor(parsingValue(parsingNbqInfo.getPowerFactor(), fileContent));
+//                                    inverterStatusData.setVoltage(parsingValue(parsingNbqInfo.getVoltage(), fileContent));
+//                                    inverterStatusData.setStatus(parsingStatus(parsingNbqInfo.getStatus(), fileContent));
+//                                    inverterStatusData.setEquipmentId(filterInverterInfos.get(0).getEquipmentNo());
+//                                    inverterStatusData.setStationCode(ftpParsingUrl.getStationCode());
+//                                    inverterStatusDataService.save(inverterStatusData);
+//                                    log.info("解析NBQ文件:{} 成功! O(∩_∩)O", file.getName());
+//                                    fileAnalysisStatusDto.setStatus("1");
+//                                } else {
+//                                    fileAnalysisStatusDto.setStatus("0");
+//                                    fileAnalysisStatusDto.setMessage("逆变器在本地无配置无法解析");
+//                                    log.info("nbq {} 在本地无配置无法解析", nbqName);
+//                                }
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("解析逆变器文件时间错误");
+//                                log.error("解析NBQ文件时间错误");
+//                            }
+//                        } else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("逆变器暂无多行解析方式");
+//                            log.info("nbq暂无多行解析方式");
+//                        }
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析逆变器数据失败!");
+//            log.error("解析逆变器数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+}

+ 275 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingNwpServiceImpl.java

@@ -0,0 +1,275 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingNwp;
+import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
+import com.cpp.web.mapper.datafactory.ParsingNwpMapper;
+import com.cpp.web.service.cloud.NwpService;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.datafactory.ParsingNwpService;
+import com.cpp.web.service.station.NwpHisService;
+import com.cpp.web.utils.FieldUtil;
+import com.cpp.web.utils.PUtil;
+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.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 测风塔解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+@Transactional
+public class ParsingNwpServiceImpl extends ServiceImpl<ParsingNwpMapper, ParsingNwp> implements ParsingNwpService, ParsingInterface {
+
+    private final NwpHisService nwpHisService;
+
+    private final NwpService nwpService;
+
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingNwp) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+
+//    //文件解析
+//    /*
+//     * 解析配置格式规则:
+//     *
+//     *   m=>>4-20-4-1=>>3
+//     *   m:多行标识
+//     *   4-20:取值在4-20行
+//     *   -4:代表有层层高
+//     *   -1:代表取第一种层高
+//     *   3:第三列
+//     * */
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.NWP.getCode()+"");
+//
+//        try {
+//
+//            List<ParsingNwpInfo> parsingNwpInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingNwpInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+//            if (!parsingNwpInfos.isEmpty()) {
+//                for (ParsingNwpInfo parsingNwpInfo : parsingNwpInfos) {
+//                    //判断文件名是否符合配置
+//                    if (file.getName().contains(parsingNwpInfo.getFileName())) {
+//                        List<String> fileContent = FileUtil.getFileContent(file);
+//                        if (parsingNwpInfo.getDataType().equals(FieldUtil.MULTI)) {
+//                            Long time = parsingTime(parsingNwpInfo.getPreTime(), fileContent);
+//
+//
+//                            if (time != 0l) {
+//                                List<BigDecimal> ws10s = parsingNwpValue(parsingNwpInfo.getWs10(), fileContent);
+//                                List<BigDecimal> wd10s = parsingNwpValue(parsingNwpInfo.getWd10(), fileContent);
+//                                List<BigDecimal> ws30s = parsingNwpValue(parsingNwpInfo.getWs30(), fileContent);
+//                                List<BigDecimal> wd30s = parsingNwpValue(parsingNwpInfo.getWd30(), fileContent);
+//                                List<BigDecimal> ws50s = parsingNwpValue(parsingNwpInfo.getWs50(), fileContent);
+//                                List<BigDecimal> wd50s = parsingNwpValue(parsingNwpInfo.getWd50(), fileContent);
+//                                List<BigDecimal> ws70s = parsingNwpValue(parsingNwpInfo.getWs70(), fileContent);
+//                                List<BigDecimal> wd70s = parsingNwpValue(parsingNwpInfo.getWd70(), fileContent);
+//                                List<BigDecimal> ws80s = parsingNwpValue(parsingNwpInfo.getWs80(), fileContent);
+//                                List<BigDecimal> wd80s = parsingNwpValue(parsingNwpInfo.getWd80(), fileContent);
+//                                List<BigDecimal> ws90s = parsingNwpValue(parsingNwpInfo.getWs90(), fileContent);
+//                                List<BigDecimal> wd90s = parsingNwpValue(parsingNwpInfo.getWd90(), fileContent);
+//                                List<BigDecimal> ws100s = parsingNwpValue(parsingNwpInfo.getWs100(), fileContent);
+//                                List<BigDecimal> wd100s = parsingNwpValue(parsingNwpInfo.getWd100(), fileContent);
+//                                List<BigDecimal> ws170s = parsingNwpValue(parsingNwpInfo.getWs170(), fileContent);
+//                                List<BigDecimal> wd170s = parsingNwpValue(parsingNwpInfo.getWd170(), fileContent);
+//                                List<BigDecimal> directRadiations = parsingNwpValue(parsingNwpInfo.getDirectRadiation(), fileContent);
+//                                List<BigDecimal> lwrs = parsingNwpValue(parsingNwpInfo.getLwr(), fileContent);
+//                                List<BigDecimal> diffuseRadiations = parsingNwpValue(parsingNwpInfo.getDiffuseRadiation(), fileContent);
+//                                List<BigDecimal> rhs = parsingNwpValue(parsingNwpInfo.getRh(), fileContent);
+//                                List<BigDecimal> pressures = parsingNwpValue(parsingNwpInfo.getPressure(), fileContent);
+//                                List<BigDecimal> senfs = parsingNwpValue(parsingNwpInfo.getSenf(), fileContent);
+//                                List<BigDecimal> swrs = parsingNwpValue(parsingNwpInfo.getSwr(), fileContent);
+//                                List<BigDecimal> ts = parsingNwpValue(parsingNwpInfo.getT(), fileContent);
+//
+//                                List<NwpHis> nwpHisList = new ArrayList<>();
+//
+//                                List<Nwp> nwpList = new ArrayList<>();
+//                                //以十米风速为基准
+//                                for (int i = 0; i < ws10s.size(); i++) {
+//                                    NwpHis nwpHis = new NwpHis();
+//                                    Date localDateTime = new Date(time);
+//                                    nwpHis.setPreTime(localDateTime);
+//                                    nwpHis.setPreDate(localDateTime);
+//                                    nwpHis.setScDate(localDateTime);
+//                                    nwpHis.setScTime(localDateTime);
+//                                    nwpHis.setDirectRadiation(valueSet(directRadiations, i));
+//                                    nwpHis.setDiffuseRadiation(valueSet(diffuseRadiations, i));
+//                                    nwpHis.setForecastHowLongAgo(i / 96 + 1);
+//                                    nwpHis.setLwr(valueSet(lwrs, i));
+//                                    nwpHis.setPressure(valueSet(pressures, i));
+//                                    nwpHis.setRh(valueSet(rhs, i));
+//                                    nwpHis.setSenf(valueSet(senfs, i));
+//                                    nwpHis.setSwr(valueSet(swrs, i));
+//                                    nwpHis.setT(valueSet(ts, i));
+//                                    nwpHis.setWs10(valueSet(ws10s, i));
+//                                    nwpHis.setWd10(valueSet(wd10s, i));
+//                                    nwpHis.setWs30(valueSet(ws30s, i));
+//                                    nwpHis.setWd30(valueSet(wd30s, i));
+//                                    nwpHis.setWs50(valueSet(ws50s, i));
+//                                    nwpHis.setWd50(valueSet(wd50s, i));
+//                                    nwpHis.setWs70(valueSet(ws70s, i));
+//                                    nwpHis.setWd70(valueSet(wd70s, i));
+//                                    nwpHis.setWs80(valueSet(ws80s, i));
+//                                    nwpHis.setWd80(valueSet(wd80s, i));
+//                                    nwpHis.setWs90(valueSet(ws90s, i));
+//                                    nwpHis.setWd90(valueSet(wd90s, i));
+//                                    nwpHis.setWs100(valueSet(ws100s, i));
+//                                    nwpHis.setWd100(valueSet(wd100s, i));
+//                                    nwpHis.setWs170(valueSet(ws170s, i));
+//                                    nwpHis.setWd170(valueSet(wd170s, i));
+//                                    nwpHis.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    nwpHis.setStationCode(parsingUrl.getStationCode());
+//
+//                                    nwpHisList.add(nwpHis);
+//
+//
+//
+//                                    Nwp nwp = new Nwp();
+//                                    nwp.setPreTime(localDateTime);
+//                                    nwp.setPreDate(localDateTime);
+//                                    nwp.setScDate(localDateTime);
+//                                    nwp.setScTime(localDateTime);
+//                                    nwp.setDirectRadiation(valueSet(directRadiations, i));
+//                                    nwp.setDiffuseRadiation(valueSet(diffuseRadiations, i));
+//                                    nwp.setLwr(valueSet(lwrs, i));
+//                                    nwp.setPressure(valueSet(pressures, i));
+//                                    nwp.setRh(valueSet(rhs, i));
+//                                    nwp.setSenf(valueSet(senfs, i));
+//                                    nwp.setSwr(valueSet(swrs, i));
+//                                    nwp.setT(valueSet(ts, i));
+//                                    nwp.setWs10(valueSet(ws10s, i));
+//                                    nwp.setWd10(valueSet(wd10s, i));
+//                                    nwp.setWs30(valueSet(ws30s, i));
+//                                    nwp.setWd30(valueSet(wd30s, i));
+//                                    nwp.setWs50(valueSet(ws50s, i));
+//                                    nwp.setWd50(valueSet(wd50s, i));
+//                                    nwp.setWs70(valueSet(ws70s, i));
+//                                    nwp.setWd70(valueSet(wd70s, i));
+//                                    nwp.setWs80(valueSet(ws80s, i));
+//                                    nwp.setWd80(valueSet(wd80s, i));
+//                                    nwp.setWs90(valueSet(ws90s, i));
+//                                    nwp.setWd90(valueSet(wd90s, i));
+//                                    nwp.setWs100(valueSet(ws100s, i));
+//                                    nwp.setWd100(valueSet(wd100s, i));
+//                                    nwp.setWs170(valueSet(ws170s, i));
+//                                    nwp.setWd170(valueSet(wd170s, i));
+//                                    nwp.setForecastManufactor(parsingUrl.getForecastManufactor());
+//                                    nwp.setStationCode(parsingUrl.getStationCode());
+//
+//                                    nwpList.add(nwp);
+//                                    time += Constant.INTERVALTIME;
+//                                }
+//
+//
+//
+//                                Date startTime = nwpHisList.get(0).getPreTime();
+//                                Date endTime = nwpHisList.get(nwpHisList.size() - 1).getPreTime();
+//                                nwpHisService.saveBatch(nwpHisList);
+//                                LambdaQueryWrapper<Nwp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                                lambdaQueryWrapper.eq(Nwp::getStationCode, parsingUrl.getStationCode());
+//                                lambdaQueryWrapper.between(Nwp::getPreTime, startTime, endTime);
+//                                nwpService.remove(lambdaQueryWrapper);
+////
+//                                nwpService.saveBatch(nwpList);
+//
+//                                fileAnalysisStatusDto.setStatus("1");
+//                                log.info("解析Nwp文件:{} 成功! O(∩_∩)O", file.getName());
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("解析Nwp文件时间错误");
+//                                log.error("解析Nwp文件时间错误");
+//                            }
+//                        } else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("Nwp暂无单行解析方式");
+//                            log.info("nwp暂无单行解析方式");
+//                        }
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析Nwp数据失败");
+//            log.error("解析Nwp数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+
+
+    protected List<BigDecimal> parsingNwpValue(String sign, List<String> fileContent) {
+        List<BigDecimal> fpValues = new ArrayList<>();
+
+        try {
+            if (sign != null && !sign.equals("")) {
+                ParsingConfParam config = FieldUtil.getConfig(sign);
+                String[] lineNumber = config.getLineNumber().split("-");
+                if (lineNumber.length > 2) {
+                    int startLine = Integer.parseInt(lineNumber[0]) - 1;
+                    int endLine = Integer.parseInt(lineNumber[1]) - 1;
+                    int size = Integer.parseInt(lineNumber[2]);
+                    int no = Integer.parseInt(lineNumber[3]) - 1 ;
+
+                    for (int i = startLine + no; i <= endLine; i += size) {
+                        String[] strings = PUtil.splitLineWithSpace(fileContent.get(i));
+                        String result = strings[Integer.parseInt(config.getRowNumber()) - 1];
+
+                        fpValues.add(new BigDecimal(result));
+                    }
+
+                } else {
+
+                    int startLine = Integer.parseInt(lineNumber[0]) - 1;
+                    int endLine = Integer.parseInt(lineNumber[1]) - 1;
+
+                    for (int i = startLine; i <= endLine; i++) {
+                        String[] strings = PUtil.splitLineWithSpace(fileContent.get(i));
+                        String result = strings[Integer.parseInt(config.getRowNumber()) - 1];
+
+                        fpValues.add(new BigDecimal(result));
+                    }
+                }
+            }
+
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } finally {
+            return fpValues;
+        }
+    }
+
+
+    private BigDecimal valueSet(List<BigDecimal> list, int i) {
+        if (list.size() > i) {
+            return list.get(i);
+        } else {
+            return new BigDecimal(-99);
+        }
+
+    }
+}

+ 118 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingQxzServiceImpl.java

@@ -0,0 +1,118 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingQxz;
+import com.cpp.web.mapper.datafactory.ParsingQxzMapper;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.datafactory.ParsingQxzService;
+import com.cpp.web.service.station.WeatherStationInfoService;
+import com.cpp.web.service.station.WeatherStationStatusDataService;
+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.util.Date;
+import java.util.List;
+
+/**
+ * 气象站解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+@Transactional
+public class ParsingQxzServiceImpl extends ServiceImpl<ParsingQxzMapper, ParsingQxz> implements ParsingQxzService, ParsingInterface {
+
+
+    private final Long intervalTime = 300000L;
+
+    private final WeatherStationStatusDataService weatherStationStatusDataService;
+
+    private final WeatherStationInfoService weatherStationInfoService;
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingQxz) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.QXZ.getCode()+"");
+//        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()));
+//                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();
+//                                    w.setTime(new Date(time));
+//                                    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);
+//                                    fileAnalysisStatusDto.setStatus("1");
+//                                    log.info("解析QXZ文件:{} 成功! O(∩_∩)O", file.getName());
+//                                } else {
+//                                    fileAnalysisStatusDto.setStatus("0");
+//                                    fileAnalysisStatusDto.setMessage("解析气象站文件时间错误");
+//                                    log.error("解析QXZ文件时间错误");
+//                                }
+//                            } else {
+//                                fileAnalysisStatusDto.setStatus("0");
+//                                fileAnalysisStatusDto.setMessage("气象站暂无多行解析方式");
+//                                log.info("qxz暂无多行解析方式");
+//                            }
+//                        }
+//                    }
+//                } else {
+//                    fileAnalysisStatusDto.setStatus("0");
+//                    fileAnalysisStatusDto.setMessage("气象站未配置作为解析使用设备");
+//                    log.info("qxz未配置作为解析使用设备");
+//                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析气象站数据失败!");
+//            log.error("解析气象站数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+}

+ 181 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingRpServiceImpl.java

@@ -0,0 +1,181 @@
+package com.cpp.web.service.datafactory.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.datafactory.BaseParsing;
+import com.cpp.web.domain.datafactory.ParsingRp;
+import com.cpp.web.domain.datafactory.dto.ParsingConfParam;
+import com.cpp.web.domain.datafactory.enums.FileTypeEnum;
+import com.cpp.web.mapper.datafactory.ParsingRpMapper;
+import com.cpp.web.service.datafactory.ParsingInterface;
+import com.cpp.web.service.datafactory.ParsingRpService;
+import com.cpp.web.service.station.PowerStationStatusDataService;
+import com.cpp.web.utils.FieldUtil;
+import com.cpp.web.utils.PUtil;
+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.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 实际功率解析业务层实现类
+ *
+ * @author tl
+ * @date 2022-05-11 18:07:03
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+@Transactional
+public class ParsingRpServiceImpl extends ServiceImpl<ParsingRpMapper, ParsingRp> implements ParsingRpService, ParsingInterface {
+
+    private final PowerStationStatusDataService powerStationStatusDataService;
+
+    @Override
+    public boolean save(BaseParsing parsingInfo) {
+        return save((ParsingRp) parsingInfo);
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return removeById(id);
+    }
+//
+//    @Override
+//    public FileAnalysisStatusDto parsing(File file, ParsingUrl parsingUrl) {
+//        FileAnalysisStatusDto fileAnalysisStatusDto = new FileAnalysisStatusDto();
+//        fileAnalysisStatusDto.setFileName(file.getName());
+//        fileAnalysisStatusDto.setFileType(FileTypeEnum.RP.getCode()+"");
+//
+//        try {
+//            List<ParsingRpInfo> parsingRpInfos = baseMapper.selectList(Wrappers.lambdaQuery(ParsingRpInfo.class).like(ParsingInfo::getStationCode, parsingUrl.getStationCode()));
+//            if (!parsingRpInfos.isEmpty()) {
+//                ParsingRpInfo parsingRpInfo = parsingRpInfos.get(0);
+//
+//                //判断文件名是否符合配置
+//                if (file.getName().contains(parsingRpInfo.getFileName())) {
+//
+//                    List<String> fileContent = FileUtil.getFileContent(file);
+//                    if (parsingRpInfo.getDataType().equals(FieldUtil.SINGLE)) {
+//                        BigDecimal bigDecimal;
+//                        if (parsingRpInfo.getAbleValue() != null) ;
+//                        bigDecimal = parsingValue(parsingRpInfo.getRealValue(), fileContent);
+//
+//
+//                        Long time = parsingForecastTime(parsingRpInfo.getTime(), fileContent);
+//
+//                        if (time != 0l) {
+//                            PowerStationStatusData powerStationStatusData = new PowerStationStatusData();
+//                            powerStationStatusData.setStationCode(parsingUrl.getStationCode());
+////                                powerStationStatusData.setAbleValue(bigDecimals.get(0));
+//                            powerStationStatusData.setRealValue(bigDecimal);
+//                            LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
+//                            powerStationStatusData.setTime(localDateTime);
+//
+//                            powerStationStatusDataService.save(powerStationStatusData);
+//
+//                            log.info("解析RP文件:{} 成功! O(∩_∩)O", file.getName());
+//                            fileAnalysisStatusDto.setStatus("1");
+//                        } else {
+//                            fileAnalysisStatusDto.setStatus("0");
+//                            fileAnalysisStatusDto.setMessage("解析实际功率文件时间错误");
+//                            log.error("解析RP文件时间错误");
+//                        }
+//                    } else {
+//                        fileAnalysisStatusDto.setStatus("0");
+//                        fileAnalysisStatusDto.setMessage("实际功率暂无单行解析方式");
+//                        log.info("RP暂无单行解析方式");
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            fileAnalysisStatusDto.setStatus("0");
+//            fileAnalysisStatusDto.setMessage("解析实际功率数据失败!");
+//            log.error("解析实际功率数据失败! /(ㄒoㄒ)/~~", e);
+//        } finally {
+//            return fileAnalysisStatusDto;
+//        }
+//    }
+
+
+    protected Long parsingForecastTime(String sign, List<String> fileContent) {
+        Long forecastTime = 0l;
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+            String s = fileContent.get(PUtil.noParseInt(config.getLineNumber()));
+            int signIndex = s.indexOf(config.getDataSign());
+            String result;
+            if (signIndex > 0) {
+                int startLength = config.getDataSign().length() + signIndex + 1;
+                int length = config.getFormat().length();
+                if (String.valueOf(s.charAt(startLength + 1)).equals("'")) {
+                    startLength += 1;
+                }
+                result = s.substring(startLength, startLength + length);
+
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(config.getFormat());
+
+                forecastTime = simpleDateFormat.parse(result).getTime();
+
+                log.info("解析实际功率【时间】成功==》开始时间为:{}", result);
+            } else {
+                log.error("解析实际功率【时间】时公式标识不存在所在行");
+            }
+        } catch (RuntimeException e) {
+            log.error("解析实际功率【时间】失败");
+            e.printStackTrace();
+        } finally {
+            return forecastTime;
+        }
+
+    }
+
+
+    /*
+     * 解析配置格式规则:
+     *   s=>>1=>>entity=
+     *   s:单行标识
+     *   1:取值在1行
+     *   entity=:键标记标记
+     *
+     *   m=>>4-20=>>3
+     *   m:多行标识
+     *   4-20:取值在4-20行
+     *   3:第三列
+     * */
+    protected List<BigDecimal> parsingFpValue(String sign, List<String> fileContent) {
+        List<BigDecimal> fpValues = new ArrayList<>();
+        try {
+            ParsingConfParam config = FieldUtil.getConfig(sign);
+
+
+            String[] lineNumber = config.getLineNumber().split("-");
+            int startLine = PUtil.noParseInt(lineNumber[0]);
+            int endLine = PUtil.noParseInt(lineNumber[1]);
+
+            for (int i = startLine; i <= endLine; i++) {
+                String[] strings = PUtil.splitLineWithSpace(fileContent.get(i));
+                String result = strings[PUtil.noParseInt(config.getRowNumber())];
+
+                fpValues.add(new BigDecimal(result));
+            }
+
+            log.info("解析短期【实际功率】成功!!!==》记录数:{}", fpValues.size());
+        } catch (RuntimeException e) {
+            log.error("解析短期【实际功率】失败");
+            e.printStackTrace();
+        } finally {
+            return fpValues;
+        }
+    }
+
+}

+ 45 - 0
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ReportingRateRecordsServiceImpl.java

@@ -0,0 +1,45 @@
+//package com.cpp.web.service.datafactory.impl;
+//
+//import cn.hutool.core.date.DateTime;
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+//import com.jiayue.ipp.common.data.entity.an.ReportingRateRecords;
+//import com.jiayue.ipp.idp.mapper.an.ReportingRateRecordsMapper;
+//import com.jiayue.ipp.idp.service.an.ReportingRateRecordsService;
+//import org.springframework.stereotype.Service;
+//
+///**
+// * 上报率记录表
+// *
+// * @author csc code generator
+// * @date 2022-12-28 14:49:14
+// */
+//@Service
+//public class ReportingRateRecordsServiceImpl extends ServiceImpl<ReportingRateRecordsMapper, ReportingRateRecords> implements ReportingRateRecordsService {
+//
+//
+//    /**
+//     * 根据场站编号 时间范围 文件类型构造查询条件
+//     *
+//     * @param stationCode 场站类型
+//     * @param startTime   开始时间
+//     * @param endTime     结束时间
+//     * @param reportType  上报文件类型
+//     * @return
+//     */
+//    @Override
+//    public QueryWrapper<ReportingRateRecords> findByStationCodeAndTimeBetweenAndReportType(String stationCode, Long startTime, Long endTime, String reportType) {
+//        QueryWrapper<ReportingRateRecords> wrapper = new QueryWrapper<>();
+//        if (stationCode != null && !stationCode.equals("")) {
+//            wrapper.eq("station_code", stationCode);
+//        }
+//        if (startTime != null && endTime != null) {
+//            wrapper.between("upload_time", new DateTime(startTime), new DateTime(endTime));
+//        }
+//        if (reportType != null && !reportType.equals("")) {
+//            wrapper.eq("file_type", reportType);
+//        }
+//        wrapper.orderByDesc("upload_time");
+//        return wrapper;
+//    }
+//}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác