Browse Source

Merge branch 'master' of http://git.jiayuepowertech.com:9022/xusl/focus

# Conflicts:
#	ipfcst-console/src/main/resources/application.yml
weiyigulu 3 năm trước cách đây
mục cha
commit
491d9342dd
33 tập tin đã thay đổi với 2639 bổ sung735 xóa
  1. 0 10
      client.yml
  2. 13 0
      focus-client.yml
  3. 16 3
      ipfcst-client/src/main/java/com/jiayue/client/job/DownloadFileJob.java
  4. 40 4
      ipfcst-client/src/main/java/com/jiayue/client/job/SendDataToDcJob.java
  5. 13 5
      ipfcst-client/src/main/java/com/jiayue/client/service/SendDataService.java
  6. 3 5
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/DataPoint.java
  7. 0 5
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/EquipmentAttribute.java
  8. 6 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/WindTowerStatusData.java
  9. 16 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/DataPointRepository.java
  10. 18 0
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/EquipmentAttributeRepository.java
  11. 53 41
      ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerUltraShortTermHisRepository.java
  12. 21 7
      ipfcst-console/src/main/frontend/router/modules/dataquery.js
  13. 20 56
      ipfcst-console/src/main/frontend/views/dataquery/forecastPowerShortHisTerm/index.vue
  14. 24 55
      ipfcst-console/src/main/frontend/views/dataquery/forecastPowerShortTerm/index.vue
  15. 744 0
      ipfcst-console/src/main/frontend/views/dataquery/forecastPowerUltraShortTerm16/charts/index.vue
  16. 248 0
      ipfcst-console/src/main/frontend/views/dataquery/forecastPowerUltraShortTerm16/index.vue
  17. 19 52
      ipfcst-console/src/main/frontend/views/dataquery/nwp/index.vue
  18. 4 1
      ipfcst-console/src/main/java/com/jiayue/ipfcst/config/RedisConfig.java
  19. 72 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/controller/ForecastPowerUltraShortTermHisController.java
  20. 44 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/dto/ResponseResults.java
  21. 30 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/dto/ResponseRows.java
  22. 14 15
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/job/DownLoadServiceJob.java
  23. 38 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/job/ReceiveDataJob.java
  24. 33 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/DataPointService.java
  25. 12 16
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/DownLoadService.java
  26. 88 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/EquipmentAttributeService.java
  27. 385 406
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/FileAnalysisService.java
  28. 143 51
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ForecastPowerUltraShortTermService.java
  29. 178 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ReceiveDataService.java
  30. 17 0
      ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/WindTowerInfoService.java
  31. 3 3
      ipfcst-console/src/main/resources/application.yml
  32. 40 0
      ipfcst-console/src/main/resources/sql/t_data_point.sql
  33. 284 0
      ipfcst-console/src/main/resources/sql/t_equipment_attribute.sql

+ 0 - 10
client.yml

@@ -1,10 +0,0 @@
-#青海client小程序使用jar包外配置文件
-remote:
-  ip: 192.168.1.202
-  port: 22
-  user: root
-  pwd: Syjy*3377
-  path: /home/syjy/ipfcstV3/downLoadFile/
-v3cloud:
-  filelogUrl: https://117.78.19.70:9010/client/getDownLoadFile/
-  fileDownUrl: https://117.78.19.70:9010/client/getFileById?id=

+ 13 - 0
focus-client.yml

@@ -0,0 +1,13 @@
+#青海client小程序使用jar包外配置文件
+remote:
+  ip: 192.168.1.208
+  port: 22
+  user: root
+  pwd: Syjy*3377
+  path: /home/syjy/ipfcstV3/downLoadFile/
+  dcUrl: http://cloud.jiayuepowertech.com:9001/qinghaiComeBackApi/datas
+v3cloud:
+  filelogUrl: https://117.78.19.70:9010/client/getDownLoadFileAll/
+  fileDownUrl: https://117.78.19.70:9010/client/getFileById?id=
+local:
+  downFilePath: /Users/wangtao/Documents/temp/client/

+ 16 - 3
ipfcst-client/src/main/java/com/jiayue/client/job/DownloadFileJob.java

@@ -35,18 +35,19 @@ public class DownloadFileJob {
     public QueryDataService queryDataService;
     //获取下载到文件,从临时目录移动到目标目录
     public static List<String> filedownLoadList = new ArrayList<String>();
+    public static List<String> isDownFileId = new ArrayList<String>();
     public static Properties properties = new Properties();
 
     static {
         YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
-        yaml.setResources(new PathResource("./client.yml"));
+        yaml.setResources(new PathResource("./focus-client.yml"));
         properties = yaml.getObject();
     }
 
     /**
      * 每天凌晨2点执行
      */
-    @Scheduled(cron = "0 09 10 * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     public void download() {
         log.info("上午文件下载定时任务开始");
         List<Map<String, Object>> stations = queryDataService.getStations();
@@ -60,13 +61,19 @@ public class DownloadFileJob {
             if (code.equals("0") && data.length() > 0) {
                 JSONArray array = JSONUtil.parseArray(data);
                 List<FileCreateLog> list = array.toList(FileCreateLog.class);
-                String path = FileUtil.judeDirExists("/Users/wangtao/Documents/temp/client");
+                String path = FileUtil.judeDirExists(properties.getProperty("local.downFilePath"));
 
                 try {
                     for (FileCreateLog fileCreateLog : list) {
+                        if (isDownFileId.contains(fileCreateLog.getId())) {
+                            log.info("文件:{}已下载。", fileCreateLog.getFileName());
+                            continue;
+                        }
+                        log.info("开始下载文件:{}。", fileCreateLog.getFileName());
                         String url = properties.getProperty("v3cloud.fileDownUrl") + fileCreateLog.getId();// "https://117.78.19.70:9010/client/getFileById?id=" + fileCreateLog.getId();
                         Long size = HttpUtil.downloadFile(url, path + File.separatorChar + fileCreateLog.getFileName());
                         if (size > 0) {
+                            isDownFileId.add(fileCreateLog.getId());
                             log.info("成功下载文件:{}", path + File.separatorChar + fileCreateLog.getFileName());
                             filedownLoadList.add(path + File.separatorChar + fileCreateLog.getFileName());
                         }
@@ -76,6 +83,7 @@ public class DownloadFileJob {
                 } finally {
                     //把下载的文件挪到功率预测服务器文件夹
                     if (filedownLoadList.size() > 0) {
+                        log.info("开始移动下载文件到功率预测,共:{} 个文件。", filedownLoadList.size());
                         for (String fpath : filedownLoadList) {
                             try {
                                 Scpclient scpclient = Scpclient.getInstance(properties.getProperty("remote.ip"),
@@ -83,10 +91,15 @@ public class DownloadFileJob {
                                         properties.getProperty("remote.pwd"));
 
                                 scpclient.putFile(fpath, properties.getProperty("remote.path") + stationCode + "/new/");
+                                log.info("移动文件:{} 到远程服务器 {} 成功", fpath, properties.getProperty("remote.path") + stationCode + "/new/");
                             } catch (Exception e) {
                                 log.error("移动文件到功率预测服务器失败:{}", e);
                             }
                         }
+                        log.info("所有文件移动完成,清空文件临时filedownLoadList");
+                        filedownLoadList.clear();
+                    } else {
+                        log.info("没有新文件下载,不需要移动到远程功率预测服务器。");
                     }
                 }
             }

+ 40 - 4
ipfcst-client/src/main/java/com/jiayue/client/job/SendDataToDcJob.java

@@ -6,6 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
 /**
  * 青海集中功率预测向数据中心回传数据:
  * 1.实际功率 短期 超短期 气象站 测风塔 风机 等数据
@@ -17,18 +21,50 @@ public class SendDataToDcJob {
 
     @Autowired
     public SendDataService sendDataService;
+    public static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
 
     /**
      * 每天凌晨2点执行
      */
     @Scheduled(cron = "0 0/5 * * * ?")
     public void sendJob() {
-        log.info("时间 【" + System.currentTimeMillis() + "】 向数据中心发送青海集中功率预测前一天的实际功率等数据。");
-        String startTime = "2021-09-25 00:00:00";
-        String endTime = "2021-09-26 00:00:00";
+        log.info("时间 【" + System.currentTimeMillis() + "】 向数据中心发送青海集中功率预测前一天的实际功率等数据。数据范围:【{}--{}】", getDayStartTime(), getDayLastTime());
+        sendDataService.send(getDayStartTime(), getDayLastTime(), "all");
+    }
 
-        sendDataService.send(startTime, endTime, "all");
 
+    /**
+     * 获取当前时间所在天的0点0分
+     *
+     * @return 0点0分的毫秒
+     */
+    public static String getDayStartTime() {
+        Calendar date = Calendar.getInstance();
+        date.setTime(new Date());
+        date.set(Calendar.HOUR_OF_DAY, 0);
+        date.set(Calendar.MINUTE, 0);
+        date.set(Calendar.SECOND, 0);
+        date.set(Calendar.MILLISECOND, 0);
+        date.add(Calendar.DAY_OF_MONTH, -1);
+        String dateString = formatter.format(date.getTime());
+        return dateString;
     }
 
+    /**
+     * 获取当前时间所在天的23点59分59秒
+     *
+     * @return 23点59分59秒的毫秒
+     */
+    public static String getDayLastTime() {
+        Calendar date = Calendar.getInstance();
+        date.setTime(new Date());
+        date.set(Calendar.HOUR_OF_DAY, 23);
+        date.set(Calendar.MINUTE, 59);
+        date.set(Calendar.SECOND, 59);
+        date.set(Calendar.MILLISECOND, 999);
+        date.add(Calendar.DAY_OF_MONTH, -1);
+        String dateString = formatter.format(date.getTime());
+        return dateString;
+    }
 }

+ 13 - 5
ipfcst-client/src/main/java/com/jiayue/client/service/SendDataService.java

@@ -6,12 +6,11 @@ import cn.hutool.json.JSONUtil;
 import com.jiayue.client.util.MD5Util;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.core.io.PathResource;
 import org.springframework.stereotype.Repository;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Repository
 @Slf4j
@@ -21,6 +20,14 @@ public class SendDataService {
     //青海回传数据通用签名key
     private final static String qinghaiKey = "Syjy*3377";
 
+    public static Properties properties = new Properties();
+
+    static {
+        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
+        yaml.setResources(new PathResource("./focus-client.yml"));
+        properties = yaml.getObject();
+    }
+
     /**
      * 向数据中心
      *
@@ -29,6 +36,7 @@ public class SendDataService {
      * @param flag
      */
     public void send(String startTime, String endTime, String flag) {
+
         try {
             List<Map<String, Object>> stations = queryDataService.getStations();
             for (Map<String, Object> station : stations) {
@@ -302,7 +310,7 @@ public class SendDataService {
 
         String reqStr = JSONUtil.toJsonStr(resultMap);
         log.info("回传数据给数据中心,请求报文:{}", reqStr);
-        String resp = HttpUtil.post("http://localhost:9001/qinghaiComeBackApi/datas", reqStr);
+        String resp = HttpUtil.post(properties.getProperty("remote.dcUrl"), reqStr);
         if (resp.length() > 0) {
             if (!"0".equals(JSONUtil.parseObj(resp).get("code"))) {
                 new Exception("回传数据给数据中心错误:" + resp);

+ 3 - 5
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/ProtocolGatherDataPoint.java → ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/DataPoint.java

@@ -1,6 +1,5 @@
 package com.jiayue.ipfcst.common.data.entity;
 
-import com.jiayue.ipfcst.common.data.constant.enums.DataSourceEnum;
 import com.jiayue.ipfcst.common.data.constant.enums.EquipmentTypeEnum;
 import lombok.Data;
 import org.hibernate.annotations.GenericGenerator;
@@ -15,7 +14,7 @@ import javax.persistence.*;
  */
 @Data
 @Entity
-public class ProtocolGatherDataPoint {
+public class DataPoint {
 
     /**
      * id主键
@@ -32,10 +31,9 @@ public class ProtocolGatherDataPoint {
     private String measuringPoint;
 
     /**
-     * 该测点对应的设备id
+     * 该测点对应的设备类型
      */
-    @Column(length = 5)
-    private Integer equipmentId;
+    private EquipmentTypeEnum equipmentType;
 
     /**
      * 测点描述的设备属性

+ 0 - 5
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/EquipmentAttribute.java

@@ -52,11 +52,6 @@ public class EquipmentAttribute {
     @Enumerated(EnumType.STRING)
     EquipmentTypeEnum equipmentType;
 
-    /**
-     * 场站标识
-     */
-    @Column
-    private String stationCode;
 
     /**
      * 字段类型

+ 6 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/entity/WindTowerStatusData.java

@@ -30,6 +30,12 @@ public class WindTowerStatusData extends AbstractEquipmentStatusData {
 	@Digits(integer = 10, fraction = 2)
 	@Column
 	private BigDecimal tInst = new BigDecimal(-99);
+	/**
+	 * 温度瞬时值(℃)
+	 */
+	@Digits(integer = 10, fraction = 2)
+	@Column
+	private BigDecimal wsInst = new BigDecimal(-99);
 
 	/**
 	 * 温度最大值(℃)

+ 16 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/DataPointRepository.java

@@ -0,0 +1,16 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.entity.DataPoint;
+
+import java.util.List;
+
+/**
+ * 场站信息仓储
+ *
+ * @author zzy
+ * @version 1.0
+ * @since 2019/8/5 9:15
+ */
+public interface DataPointRepository extends BaseRepository<DataPoint, Integer> {
+    List<DataPoint> findAllByEquipmentType(Integer equipmentType);
+}

+ 18 - 0
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/EquipmentAttributeRepository.java

@@ -0,0 +1,18 @@
+package com.jiayue.ipfcst.common.data.repository;
+
+import com.jiayue.ipfcst.common.data.constant.enums.EquipmentTypeEnum;
+import com.jiayue.ipfcst.common.data.entity.EquipmentAttribute;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ * 设备属性表述操作仓库
+ *
+ * @author 修唯xiuwei
+ * @version 3.0
+ */
+public interface EquipmentAttributeRepository extends JpaRepository<EquipmentAttribute, Integer>, JpaSpecificationExecutor<EquipmentAttribute> {
+  Page<EquipmentAttribute> findAllByEquipmentType(EquipmentTypeEnum equipmentType, Pageable pageable);
+}

+ 53 - 41
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/ForecastPowerUltraShortTermHisRepository.java

@@ -17,48 +17,60 @@ import java.util.List;
  */
 public interface ForecastPowerUltraShortTermHisRepository extends BaseRepository<ForecastPowerUltraShortTermHis, Integer> {
 
-	/**
-	 * 根据时间段删除当前时刻生成的超短期历史期数据
-	 *
-	 * @param startTime 开始时间
-	 * @param endTime   结束时间
-	 */
-	@Modifying
-	@Query(value = "delete from ForecastPowerUltraShortTermHis t where t.forecastTime >= ?1 and t.forecastTime<= ?2 and t.genDate = ?3 and t.stationCode= ?4")
-	void deleteNowMoment(Long startTime, Long endTime, Date nowMomentTime,String stationCode);
+    /**
+     * 根据时间段删除当前时刻生成的超短期历史期数据
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     */
+    @Modifying
+    @Query(value = "delete from ForecastPowerUltraShortTermHis t where t.forecastTime >= ?1 and t.forecastTime<= ?2 and t.genDate = ?3 and t.stationCode= ?4")
+    void deleteNowMoment(Long startTime, Long endTime, Date nowMomentTime, String stationCode);
 
-	/**
-	 * 根据提前多久,开始结束时间查询历史超短期 yh
-	 *
-	 * @param startTime 开始时间
-	 * @param endTime   结束时间
-	 * @param ago       提前多久预测
-	 * @return 结果集
-	 */
-	List<ForecastPowerUltraShortTermHis> findByForecastTimeBetweenAndForecastHowLongAgo(Long startTime, Long endTime, Integer ago);
-	/**
-	 * 根据提前多久,时间查询历史超短期 yh
-	 *
-	 * @param queryTime 时间
-	 * @param ago       提前多久预测
-	 * @return 结果集
-	 */
-	ForecastPowerUltraShortTermHis findByForecastTimeAndForecastHowLongAgo(Long queryTime, Integer ago);
-	/**
-	 * 根据预测时间查询历史超短期 yh
-	 *
-	 * @param queryTime 时间
+    /**
+     * 根据提前多久,开始结束时间查询历史超短期 yh
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @param ago       提前多久预测
+     * @return 结果集
+     */
+    List<ForecastPowerUltraShortTermHis> findByForecastTimeBetweenAndForecastHowLongAgo(Long startTime, Long endTime, Integer ago);
 
-	 * @return 结果集
-	 */
-	List<ForecastPowerUltraShortTermHis> findByForecastTime(Long queryTime);
-	/**
-	 * 根据提前多久,开始结束时间查询历史超短期 yh
-	 *
-	 * @param startTime 开始时间
-	 * @param endTime   结束时间
-	 * @return 结果集
-	 */
-	List<ForecastPowerUltraShortTermHis> findByForecastTimeBetween(Long startTime, Long endTime);
+    /**
+     * 根据提前多久,时间查询历史超短期 yh
+     *
+     * @param queryTime 时间
+     * @param ago       提前多久预测
+     * @return 结果集
+     */
+    ForecastPowerUltraShortTermHis findByForecastTimeAndForecastHowLongAgo(Long queryTime, Integer ago);
+
+    /**
+     * 根据预测时间查询历史超短期 yh
+     *
+     * @param queryTime 时间
+     * @return 结果集
+     */
+    List<ForecastPowerUltraShortTermHis> findByForecastTime(Long queryTime);
+
+    /**
+     * 根据提前多久,开始结束时间查询历史超短期 yh
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @return 结果集
+     */
+    List<ForecastPowerUltraShortTermHis> findByForecastTimeBetween(Long startTime, Long endTime);
+
+    /**
+     * 根据提前多久,开始结束时间查询历史超短期 yh
+     *
+     * @param startTime   开始时间
+     * @param endTime     结束时间
+     * @param stationCode 场站编码
+     * @return 结果集
+     */
+    List<ForecastPowerUltraShortTermHis> findByForecastTimeBetweenAndStationCode(Long startTime, Long endTime, String stationCode);
 
 }

+ 21 - 7
ipfcst-console/src/main/frontend/router/modules/dataquery.js

@@ -16,43 +16,57 @@ const dataqueryRouter = {
       path: 'inverterStatusData',
       component: () => import('@/views/dataquery/inverterStatusData'),
       name: 'inverterStatusData',
-      meta: { title: '逆变器数据', noCache: true }
+      meta: { title: '逆变器数据', noCache: true },
+      sign: 'currency'
     },
     {
       path: 'windTurbineStatusData',
       component: () => import('@/views/dataquery/windTurbineStatusData'),
       name: 'windTurbineStatusData',
-      meta: { title: '风机数据', noCache: true }
+      meta: { title: '风机数据', noCache: true },
+      sign: 'currency'
     },
     {
       path: 'weatherStationStatusData',
       component: () => import('@/views/dataquery/weatherStationStatusData'),
       name: 'weatherStationStatusData',
-      meta: { title: '气象站数据', noCache: true }
+      meta: { title: '气象站数据', noCache: true },
+      sign: 'currency'
     },
     {
       path: 'windTowerStatusData',
       component: () => import('@/views/dataquery/windTowerStatusData'),
       name: 'windTowerStatusData',
-      meta: { title: '测风塔数据', noCache: true }
+      meta: { title: '测风塔数据', noCache: true },
+      sign: 'currency'
     },
     {
       path: 'realTimeDQ',
       component: () => import('@/views/dataquery/forecastPowerShortTerm/index'),
       name: 'realTimeDQ',
-      meta: {title: '实时短期数据', noCache: true}
+      meta: {title: '实时短期数据', noCache: true},
+      sign: 'currency'
     },
     {
       path: 'realTimeNWP',
       component: () => import('@/views/dataquery/nwp/index'),
       name: 'realTimeNWP',
-      meta: {title: '实时nwp数据', noCache: true}
+      meta: {title: '实时nwp数据', noCache: true},
+      sign: 'currency'
     },
     {
       path: 'historyDq',
       component: () => import('@/views/dataquery/forecastPowerShortHisTerm/index'),
       name: 'historyDq',
-      meta: {title: '历史短期查询', noCache: true}
+      meta: {title: '历史短期查询', noCache: true},
+      sign: 'currency'
+    },
+    {
+      path: 'historyCdq',
+      component: () => import('@/views/dataquery/forecastPowerUltraShortTerm16/index'),
+      name: 'historyCdq',
+      meta: {title: '历史超短期查询', noCache: true},
+      sign: 'currency'
     }
   ]
 }

+ 20 - 56
ipfcst-console/src/main/frontend/views/dataquery/forecastPowerShortHisTerm/index.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="chart-container">
+    <br/>
     <div class="filter">
-      <div class="startTime">
-        <span class="timeText">起始时间</span>
+      <div class="startTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;起始时间:</span>
         <el-date-picker
           v-model="startTime"
           :clearable="false"
@@ -11,8 +12,8 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div class="endTime">
-        <span class="timeText">截止时间</span>
+      <div class="endTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;截止时间:</span>
         <el-date-picker
           v-model="endTime"
           :clearable="false"
@@ -21,8 +22,11 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div>
-        <span style="font-weight: bold;font-size: 14px">场站名称:</span>
+    </div>
+    <br/>
+    <div>
+      <div style="display: inline-block">
+        <span style="font-weight: bold;font-size: 14px">&#12288;场站名称:</span>
         <el-select style="width:250px" clearable v-model="stationCode" size="small">
           <el-option
             v-for="item in stationList"
@@ -34,13 +38,13 @@
           </el-option>
         </el-select>
       </div>
-      <div class="timeQuery">
-        <el-button size="small" :loading="loading" @click="dateQuery">查询</el-button>
+      <div class="timeQuery" style="display: inline-block">
+        <el-button size="small" :loading="loading" @click="dateQuery">&#12288;查询</el-button>
       </div>
     </div>
-
+    <br/>
     <div class="content">
-      <el-tabs type="card" v-model="activeName" @tab-click="Byresize">
+      <el-tabs type="card" v-model="activeName">
 
         <el-tab-pane label="表格" name="first">
           <div class="tableContent">
@@ -55,9 +59,7 @@
               :custom-config="{storage: true, checkMethod: checkColumnMethod}"
               :auto-resize="true"
               highlight-hover-row
-              :header-cell-style="{background:'black',color:'white',border:'white'}"
               max-height="90%"
-              :cell-style="{background:'black',color:'white'}"
               align="center"
               :data="tableData">
               <vxe-table-column field="forecastTime" title="预测时间" :formatter="dateFormat" width="180" sortable
@@ -145,6 +147,7 @@ export default {
       this.loading = false
     },
     getTable() {
+
       this.tableLoading = true
       this.$axios.get('/forecastPowerShortTermHis/' + this.queryStartTime + '/' + this.queryEndTime + '/' + this.stationCode + '/' + this.currentPage + '/' + this.pageSize + '?sortOrder=' + this.sortOrder).then((res) => {
         this.tableData = res.data.content
@@ -241,6 +244,11 @@ export default {
       }
       this.queryStartTime = this.startTime
       this.queryEndTime = this.endTime
+      if (this.stationCode == '') {
+        this.$message.error("场站编码不能为空")
+        this.loading = false
+        return
+      }
       this.getTable()
     },
 
@@ -248,48 +256,4 @@ export default {
 }
 </script>
 
-<style scoped>
-.chart-container {
-  position: relative;
-  width: 100%;
-  height: calc(100vh - 50px);
-}
-
-.filter {
-  position: relative;
-  display: flex;
-  padding: 20px 0 10px 15px;
-  font-size: 12px;
-  line-height: 11px;
-  color: white;
-}
-
-input {
-  background: transparent;
-  border: none;
-  color: white;
-}
-
-.timeText {
-  opacity: 0.69;
-  padding-right: 7px;
-  font-size: 14px;
-}
-
-.startTime {
-  display: inline-block;
-}
-
-.endTime {
-  display: inline-block;
-  padding-left: 42px;
-}
-
-
-.timeQuery {
-  background: transparent;
-}
-
-
-</style>
 

+ 24 - 55
ipfcst-console/src/main/frontend/views/dataquery/forecastPowerShortTerm/index.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="chart-container">
+    <br/>
     <div class="filter">
-      <div class="startTime">
-        <span class="timeText">起始时间</span>
+      <div class="startTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;起始时间:</span>
         <el-date-picker
           v-model="startTime"
           :clearable="false"
@@ -11,8 +12,8 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div class="endTime">
-        <span class="timeText">截止时间</span>
+      <div class="endTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;截止时间:</span>
         <el-date-picker
           v-model="endTime"
           :clearable="false"
@@ -21,8 +22,12 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div>
-        <span style="font-weight: bold;font-size: 14px">场站名称:</span>
+    </div>
+    <br/>
+    <div>
+
+      <div style="display: inline-block">
+        <span style="font-weight: bold;font-size: 14px">&#12288;场站名称:</span>
         <el-select style="width:250px" clearable v-model="stationCode" size="small">
           <el-option
             v-for="item in stationList"
@@ -34,11 +39,11 @@
           </el-option>
         </el-select>
       </div>
-      <div class="timeQuery">
-        <el-button size="small" :loading="loading" @click="dateQuery">查询</el-button>
+      <div class="timeQuery" style="display: inline-block">
+        <el-button size="small" :loading="loading" @click="dateQuery">&#12288;查询</el-button>
       </div>
     </div>
-
+    <br/>
     <div class="content">
       <el-tabs type="card" v-model="activeName" @tab-click="Byresize">
         <el-tab-pane label="图表" name="first">
@@ -58,9 +63,7 @@
               :custom-config="{storage: true, checkMethod: checkColumnMethod}"
               :auto-resize="true"
               highlight-hover-row
-              :header-cell-style="{background:'black',color:'white',border:'white'}"
               max-height="90%"
-              :cell-style="{background:'black',color:'white'}"
               align="center"
               :data="tableData">
               <vxe-table-column field="forecastTime" title="预测时间" :formatter="dateFormat" width="180" sortable
@@ -148,6 +151,11 @@ export default {
       this.loading = false
     },
     getDraw(startTime, endTime, stationCode) {
+      if (this.stationCode == '') {
+        this.$message.error("场站编码不能为空")
+        this.loading = false
+        return
+      }
       this.drawLoading = true
       this.$axios.get('/forecastPowerShortTerm/' + startTime + '/' + endTime + '/' + stationCode).then((res) => {
         this.drawData = res.data
@@ -164,6 +172,11 @@ export default {
       })
     },
     getTable() {
+      if (this.stationCode == '') {
+        this.$message.error("场站编码不能为空")
+        this.loading = false
+        return
+      }
       this.tableLoading = true
       this.$axios.get('/forecastPowerShortTerm/' + this.queryStartTime + '/' + this.queryEndTime + '/' + this.stationCode + '/' + this.currentPage + '/' + this.pageSize + '?sortOrder=' + this.sortOrder).then((res) => {
         this.tableData = res.data.content
@@ -276,48 +289,4 @@ export default {
 }
 </script>
 
-<style scoped>
-.chart-container {
-  position: relative;
-  width: 100%;
-  height: calc(100vh - 50px);
-}
-
-.filter {
-  position: relative;
-  display: flex;
-  padding: 20px 0 10px 15px;
-  font-size: 12px;
-  line-height: 11px;
-  color: white;
-}
-
-input {
-  background: transparent;
-  border: none;
-  color: white;
-}
-
-.timeText {
-  opacity: 0.69;
-  padding-right: 7px;
-  font-size: 14px;
-}
-
-.startTime {
-  display: inline-block;
-}
-
-.endTime {
-  display: inline-block;
-  padding-left: 42px;
-}
-
-
-.timeQuery {
-  background: transparent;
-}
-
-
-</style>
 

+ 744 - 0
ipfcst-console/src/main/frontend/views/dataquery/forecastPowerUltraShortTerm16/charts/index.vue

@@ -0,0 +1,744 @@
+<template>
+  <div style="width: 100%;height: 100%">
+    <div id="charts"></div>
+  </div>
+</template>
+
+<script>
+import resize from '../../../../components/Charts/mixins/resize'
+import echarts from 'echarts'
+import cc from '../../../../components/curvecolors'
+
+export default {
+  mixins: [resize],
+  watch: {
+    drawData: {
+      handler(newValue, oldValue) {
+        this.draw(newValue.times, newValue.realDatas, newValue.value, newValue.capacity)
+      },
+      deep: true
+    },
+    resizeKey: function (newQuestion, oldQuestion) {
+      if (this.chart != null) {
+        this.chart.resize();
+      }
+    }
+  },
+  props: {
+    drawData: {
+      type: Object,
+    },
+    resizeKey: {
+      type: Number
+    }
+  },
+  data() {
+    return {
+      chart: null,
+    }
+  },
+  mounted() {
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    draw(timeaxis, realpower, value, capacity) {
+      this.chart = echarts.init(document.getElementById('charts'))
+      this.chart.setOption({
+        backgroundColor: 'transparent',
+        title: {
+          top: 20,
+          text: '超短期预测实时时刻查询',
+          textStyle: {
+            fontWeight: 'normal',
+            fontSize: 16,
+            color: '#F1F1F3'
+          },
+          left: '1%'
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        legend: {
+          top: 20,
+          icon: 'rect',
+          itemWidth: 14,
+          itemHeight: 5,
+          itemGap: 13,
+          data: ['实际功率', '第1时刻', '第2时刻', '第3时刻', '第4时刻', '第5时刻', '第6时刻', '第7时刻', '第8时刻', '第9时刻', '第10时刻', '第11时刻', '第12时刻', '第13时刻', '第14时刻', '第15时刻', '第16时刻'],
+          right: '4%',
+          textStyle: {
+            fontSize: 12,
+            color: '#F1F1F3'
+          }
+        },
+        dataZoom: [{
+          show: true,
+          realtime: true,
+          start: 0,
+          end: 100,
+          left: "15%",
+          right: "15%",
+          textStyle: {
+            color: "#ffffff"
+          }
+        }, {
+          type: 'inside'
+        }],
+        grid: {
+          top: 100,
+          left: '2%',
+          right: '2%',
+          bottom: '10%',
+          containLabel: true
+        },
+        xAxis: [{
+          type: 'category',
+          boundaryGap: false,
+          axisLine: {
+            lineStyle: {
+              color: '#ffffff'
+            }
+          },
+          data: timeaxis
+        }],
+        yAxis: [{
+          type: 'value',
+          name: '(MW)',
+          max: capacity,
+          axisTick: {
+            show: false
+          },
+          axisLine: {
+            lineStyle: {
+              color: '#ffffff'
+            }
+          },
+          axisLabel: {
+            margin: 10,
+            textStyle: {
+              fontSize: 14
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        }],
+        series: [{
+          name: '实际功率',
+          type: 'line',
+          smooth: true,
+          symbol: 'circle',
+          symbolSize: 5,
+          showSymbol: false,
+          lineStyle: {
+            normal: {
+              width: 2
+            }
+          },
+          // areaStyle: {
+          //   normal: {
+          //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+          //       offset: 0,
+          //       color: 'rgba(50,194,219, 0.3)'
+          //     }, {
+          //       offset: 0.8,
+          //       color: 'rgba(219, 50, 51, 0)'
+          //     }], false),
+          //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+          //     shadowBlur: 10
+          //   }
+          // },
+          itemStyle: {
+            normal: {
+
+              color: cc.sj,
+              borderColor: 'rgba(50,194,219,0.2)',
+              borderWidth: 12
+            }
+          },
+          data: realpower
+        },
+          {
+            name: '第1时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line1,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value1
+          },
+          {
+            name: '第2时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line2,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value2
+          },
+          {
+            name: '第3时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line3,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value3
+          },
+          {
+            name: '第4时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line4,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value4
+          },
+          {
+            name: '第5时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line5,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value5
+          },
+          {
+            name: '第6时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line6,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value6
+          },
+          {
+            name: '第7时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line7,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value7
+          },
+          {
+            name: '第8时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line8,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value8
+          },
+          {
+            name: '第9时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line9,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value9
+          },
+          {
+            name: '第10时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line10,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value10
+          },
+          {
+            name: '第11时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line11,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value11
+          },
+          {
+            name: '第12时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line12,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value12
+          },
+          {
+            name: '第13时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line13,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value13
+          },
+          {
+            name: '第14时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line14,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value14
+          },
+          {
+            name: '第15时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+
+                color: cc.line15,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value15
+          },
+          {
+            name: '第16时刻',
+            type: 'line',
+            smooth: true,
+            symbol: 'circle',
+            symbolSize: 5,
+            showSymbol: false,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            // areaStyle: {
+            //   normal: {
+            //     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+            //       offset: 0,
+            //       color: 'rgba(50,194,219, 0.3)'
+            //     }, {
+            //       offset: 0.8,
+            //       color: 'rgba(219, 50, 51, 0)'
+            //     }], false),
+            //     shadowColor: 'rgba(0, 0, 0, 0.1)',
+            //     shadowBlur: 10
+            //   }
+            // },
+            itemStyle: {
+              normal: {
+                color: cc.line16,
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            },
+            data: value.value16
+          }]
+      })
+    },
+
+  }
+}
+</script>
+<style scoped>
+#charts {
+  width: 100%;
+  height: calc(80vh - 50px);
+}
+</style>

+ 248 - 0
ipfcst-console/src/main/frontend/views/dataquery/forecastPowerUltraShortTerm16/index.vue

@@ -0,0 +1,248 @@
+<template>
+  <div class="chart-container">
+    <br/>
+    <div class="filter">
+      <div class="startTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;时间:</span>
+        <el-date-picker
+          v-model="startTime"
+          :clearable="false"
+          type="date"
+          value-format="timestamp"
+          placeholder="选择日期">
+        </el-date-picker>
+      </div>
+      <div style="display: inline-block">
+        <span style="font-weight: bold;font-size: 14px">&#12288;场站名称:</span>
+        <el-select style="width:250px" clearable v-model="stationCode" size="small">
+          <el-option
+            v-for="item in stationList"
+            :key="item.stationCode"
+            :label="item.name"
+            :value="item.stationCode">
+            <span style="float: left">{{ item.name }}</span>
+            <span style="float: right; color: #8492a6;font-size: 13px">{{ item.stationCode }}</span>
+          </el-option>
+        </el-select>
+      </div>
+      <div class="timeQuery" style="display: inline-block">
+        <el-button size="small" :loading="loading" @click="dateQuery">&#12288;查询</el-button>
+      </div>
+
+    </div>
+    <br/>
+    <div class="content">
+      <el-tabs type="card" v-model="activeName">
+        <el-tab-pane label="表格" name="first">
+          <div class="tableContent">
+            <vxe-table
+              id="fstTable"
+              ref="fstRef"
+              border
+              export-config
+              :loading="loading"
+              @sort-change="sortChangeEvent"
+              :custom-config="{storage: true, checkMethod: checkColumnMethod}"
+              :auto-resize="true"
+              highlight-hover-row
+              max-height="90%"
+              align="center"
+              :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)">
+              <vxe-table-column field="times" title="预测时间" :formatter="dateFormat" width="180" sortable
+                                min-width="150"></vxe-table-column>
+              <!--              <vxe-table-column field="realValue" title="实际功率" min-width="60"></vxe-table-column>-->
+              <vxe-table-column field="value1" title="第1个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value2" title="第2个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value3" title="第3个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value4" title="第4个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value5" title="第5个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value6" title="第6个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value7" title="第7个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value8" title="第8个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value9" title="第9个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value10" title="第10个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value11" title="第11个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value12" title="第12个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value13" title="第13个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value14" title="第14个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value15" title="第15个时刻" min-width="60"></vxe-table-column>
+              <vxe-table-column field="value16" title="第16个时刻" min-width="60"></vxe-table-column>
+            </vxe-table>
+            <div class="rtPageturning">
+              <vxe-pager
+                background
+                :loading="loading"
+                :current-page.sync="currentPage"
+                :page-size.sync="pageSize"
+                :total="tableData.length"
+                @page-change="handlePageChange"
+                :layouts="['PrevJump', 'PrevPage', 'JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']">
+              </vxe-pager>
+            </div>
+          </div>
+          <!-- <Table height="100%" width="100%" :queryTime=this.queryTime @sendLoading="getLoadingFormTable"></Table>-->
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script>
+import Chart from './charts'
+import resize from '../../../components/Charts/mixins/resize'
+import moment from "moment";
+
+export default {
+  name: 'nwp',
+  components: {Chart},
+  mixins: [resize],
+  data() {
+    return {
+      outer: 'outer',
+      chart: null,
+      queryStartTime: '',
+      queryEndTime: '',
+      startTime: new Date(new Date().toLocaleDateString()).getTime(),
+      loading: true,
+      drawLoading: true,
+      tableLoading: true,
+      resizeKey: 1,
+      activeName: 'first',
+      drawData: {datas: [], times: []},
+      tableData: [],
+      total: 0,
+      sortOrder: 'asc',
+      pageSize: 10,
+      currentPage: 1,
+      stationCode: '',
+      stationList: [],
+
+    }
+  },
+  created() {
+    this.$nextTick(() => {
+      // 手动将表格和工具栏进行关联
+      this.$refs.fstRef.connect(this.$refs.fstToolBar)
+    })
+  },
+  mounted() {
+    this.init()
+    this.getStationList()
+  },
+  methods: {
+    init() {
+      this.queryStartTime = this.startTime
+      this.loading = true
+    },
+    getStationList() {
+      this.$axios.get('/electricField/getElectricField').then((res) => {
+        this.stationList = res.data
+      }).catch((error) => {
+        this.$message.error('获取场站下拉框出错' + error)
+      })
+      this.loading = false
+    },
+    getDraw(startTime, stationCode) {
+      this.drawLoading = true
+      this.$axios.get('/findByForecastRealTimeUltraShortTerm16/' + startTime + '/' + stationCode).then((res) => {
+        const value = res.data.value
+        this.tableData = []
+        for (let i = 1; i < res.data.value.length; i++) {
+          const temp = {}
+          temp.times = res.data.times[i]
+          //temp.realValue = res.data.realDatas[i]
+          temp.value1 = value.value1[i]
+          temp.value2 = value.value2[i]
+          temp.value3 = value.value3[i]
+          temp.value4 = value.value4[i]
+          temp.value5 = value.value5[i]
+          temp.value6 = value.value6[i]
+          temp.value7 = value.value7[i]
+          temp.value8 = value.value8[i]
+          temp.value9 = value.value9[i]
+          temp.value10 = value.value10[i]
+          temp.value11 = value.value11[i]
+          temp.value12 = value.value12[i]
+          temp.value13 = value.value13[i]
+          temp.value14 = value.value14[i]
+          temp.value15 = value.value15[i]
+          temp.value16 = value.value16[i]
+          this.tableData.push(temp)
+        }
+
+        this.loading = false
+        this.drawData = res.data
+        this.drawLoading = false
+        if (!this.drawLoading && !this.tableLoading) {
+          this.loading = false
+        }
+      }).catch((error) => {
+        this.drawLoading = false
+        if (!this.drawLoading && !this.tableLoading) {
+          this.loading = false
+        }
+        this.$message.error('查询实时预测短期echarts出错' + error)
+      })
+      this.loading = false
+    },
+    handlePageChange({currentPage, pageSize}) {
+      this.currentPage = currentPage
+      this.pageSize = pageSize
+      this.startTime = this.queryStartTime
+    },
+    dateFormat({cellValue, row, column}) {
+      return this.$XEUtils.toDateString(cellValue, 'yyyy-MM-dd HH:mm:ss')
+    },
+    dateFormatForTitle(cellValue) {
+      return this.$XEUtils.toDateString(cellValue, 'yyyy-MM-dd')
+    },
+    enumToWord({cellValue, row, column}) {
+      if (cellValue == "E1") {
+        return "云端模型"
+      }
+      if (cellValue == 'E2') {
+        return "物理模型"
+      }
+      if (cellValue == 'E3') {
+        return "统计模型"
+      }
+      if (cellValue == 'E4') {
+        return "补录数据"
+      }
+      if (cellValue == 'E5') {
+        return "差值模型"
+      }
+    },
+    dateMoment({cellValue, row, column}) {
+      return moment(cellValue).format('YYYY-MM-DD HH:mm:ss')
+    },
+    sortChangeEvent({column, property, order}) {
+      if (order == null) {
+        order = 'asc'
+      }
+      this.currentPage = 1
+      this.sortOrder = order
+      this.loading = true
+      // this.getTable()
+    },
+
+    checkColumnMethod({column}) {
+      if (column.property === 'preTime') {
+        return false
+      }
+      return true
+    },
+    dateQuery() {
+      this.loading = true
+      this.queryStartTime = this.startTime
+      if (this.stationCode == '') {
+        this.$message.error("场站编码不能为空")
+        this.loading = false
+        return
+      }
+      this.getDraw(this.queryStartTime, this.stationCode)
+    }
+  }
+}
+</script>
+

+ 19 - 52
ipfcst-console/src/main/frontend/views/dataquery/nwp/index.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="chart-container">
+    <br/>
     <div class="filter">
-      <div class="startTime">
-        <span class="timeText">起始时间</span>
+      <div class="startTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;起始时间</span>
         <el-date-picker
           v-model="startTime"
           :clearable="false"
@@ -11,8 +12,8 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div class="endTime">
-        <span class="timeText">截止时间</span>
+      <div class="endTime" style="display: inline-block">
+        <span class="timeText" style="font-weight: bold;font-size: 14px">&#12288;截止时间</span>
         <el-date-picker
           v-model="endTime"
           :clearable="false"
@@ -21,7 +22,10 @@
           placeholder="选择日期">
         </el-date-picker>
       </div>
-      <div>
+    </div>
+    <br/>
+    <div class="filter">
+      <div style="display: inline-block">
         <span style="font-weight: bold;font-size: 14px">场站名称:</span>
         <el-select style="width:250px" clearable v-model="stationCode" size="small">
           <el-option
@@ -34,13 +38,11 @@
           </el-option>
         </el-select>
       </div>
-      <div class="timeQuery">
-        <el-button size="small" :loading="loading" @click="dateQuery">查询</el-button>
+      <div class="timeQuery" style="display: inline-block">
+        <el-button size="small" :loading="loading" @click="dateQuery">&#12288;查询</el-button>
       </div>
 
-      <div class="toolbar" v-show="this.showToolBar">
-        <vxe-toolbar ref="nwpToolBar" custom></vxe-toolbar>
-      </div>
+
     </div>
 
     <div class="content">
@@ -61,9 +63,8 @@
               :custom-config="{storage: true, checkMethod: checkColumnMethod}"
               :auto-resize="true"
               highlight-hover-row
-              :header-cell-style="{background:'black',color:'white',border:'white'}"
               max-height="90%"
-              :cell-style="{background:'black',color:'white'}"
+              :cell-style="{background:'white',color:'black',border:'black'}"
               align="center"
               :columns="tableColumn"
               :data="tableData">
@@ -250,6 +251,12 @@ export default {
       }
       this.queryStartTime = this.startTime
       this.queryEndTime = this.endTime
+      if (this.stationCode == '') {
+        this.$message.error("场站编码不能为空")
+        this.loading = false
+        return
+      }
+
       this.getDraw(this.queryStartTime, this.queryEndTime, this.stationCode)
       this.getTable()
     },
@@ -267,46 +274,6 @@ export default {
 </script>
 
 <style scoped>
-.chart-container {
-  position: relative;
-  width: 100%;
-  height: calc(100vh - 50px);
-}
-
-.filter {
-  position: relative;
-  display: flex;
-  padding: 20px 0 10px 15px;
-  font-size: 12px;
-  line-height: 11px;
-  color: white;
-}
-
-input {
-  background: transparent;
-  border: none;
-  color: white;
-}
-
-.timeText {
-  opacity: 0.69;
-  padding-right: 7px;
-  font-size: 14px;
-}
-
-.startTime {
-  display: inline-block;
-}
-
-.endTime {
-  display: inline-block;
-  padding-left: 42px;
-}
-
-
-.timeQuery {
-  background: transparent;
-}
 
 </style>
 

+ 4 - 1
ipfcst-console/src/main/java/com/jiayue/ipfcst/config/RedisConfig.java

@@ -15,6 +15,9 @@ public class RedisConfig {
     @Value("${spring.redis.port}")
     private int port;
 
+    @Value("${spring.redis.password}")
+    private String password;
+
     @Value("${spring.redis.timeout}")
     private int timeout;
 
@@ -39,7 +42,7 @@ public class RedisConfig {
         jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
         // 是否启用pool的jmx管理功能, 默认true
         jedisPoolConfig.setJmxEnabled(JmxEnabled);
-        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
+        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout,password);
         return jedisPool;
     }
 }

+ 72 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/controller/ForecastPowerUltraShortTermHisController.java

@@ -0,0 +1,72 @@
+package com.jiayue.ipfcst.console.controller;
+
+import com.jiayue.ipfcst.common.core.web.vo.ResponseVO;
+import com.jiayue.ipfcst.console.service.ForecastPowerUltraShortTermService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 超短期预测历史信息restful接口
+ *
+ * @author yh
+ * @version 1.0
+ * @since 2019/8/7 10:12
+ */
+@RestController
+@Slf4j
+public class ForecastPowerUltraShortTermHisController {
+  private final ForecastPowerUltraShortTermService forecastPowerUltraShortTermService;
+
+  @Autowired
+  public ForecastPowerUltraShortTermHisController(ForecastPowerUltraShortTermService forecastPowerUltraShortTermService) {
+    this.forecastPowerUltraShortTermService = forecastPowerUltraShortTermService;
+  }
+
+  /**
+   * 按时间查询历史预测超短期 yh
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @return 结果集
+   */
+  @GetMapping(value = "/forecastUltraPowerShortTermHis/{startTime}/{endTime}/{ago}")
+  public ResponseVO findByForecastTimeBetween(@PathVariable("startTime") Long startTime,
+                                              @PathVariable("endTime") Long endTime,
+                                              @PathVariable("endTime") Integer ago) {
+    Map<String, Object> map = new HashMap<>();
+    try {
+      map = forecastPowerUltraShortTermService.findByForecastTimeBetweenAndForecastHowLongAgoOrderByForecastTime(startTime, endTime, ago);
+      return ResponseVO.success(map);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+
+  /**
+   * 查询超短期16个点的信息 tl
+   *
+   * @param startTime 开始时间
+   * @return 结果集
+   */
+  @GetMapping(value = "/findByForecastRealTimeUltraShortTerm16/{startTime}/{stationCode}")
+  public ResponseVO findByForecastRealTimeUltraShortTerm16(@PathVariable("startTime") Long startTime, @PathVariable("stationCode") String stationCode) {
+    Map<String, Object> map = new HashMap<>();
+    try {
+      map = forecastPowerUltraShortTermService.findByForecastRealTimeUltraShortTerm16(startTime, stationCode);
+      return ResponseVO.success(map);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return ResponseVO.fail(e.toString());
+    }
+  }
+
+
+}

+ 44 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/dto/ResponseResults.java

@@ -0,0 +1,44 @@
+package com.jiayue.ipfcst.console.dto;
+
+/**
+   * 通用查询请求结果 DTO
+ *
+ * @author whc
+ * @version 2.0
+ * @since 2021/9/26
+ */
+public class ResponseResults {
+  //设备id
+  private String deviceId;
+  //结果数组
+  private ResponseRows rows;
+  //测点ID
+  private String[] sensorIds;
+
+  public String getDeviceId() {
+    return deviceId;
+  }
+
+  public void setDeviceId(String deviceId) {
+    this.deviceId = deviceId;
+  }
+
+  public ResponseRows getRows() {
+    return rows;
+  }
+
+  public void setRows(ResponseRows rows) {
+    this.rows = rows;
+  }
+
+  public String[] getSensorIds() {
+    return sensorIds;
+  }
+
+  public void setSensorIds(String[] sensorIds) {
+    this.sensorIds = sensorIds;
+  }
+
+
+
+}

+ 30 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/dto/ResponseRows.java

@@ -0,0 +1,30 @@
+package com.jiayue.ipfcst.console.dto;
+/**
+ * 通用查询请求结果数据行 DTO
+ *
+ * @author whc
+ * @version 2.0
+ * @since 2021/9/26
+ */
+public class ResponseRows {
+  //数据时间戳
+  private Long timestamp;
+  //数据值
+  private String[] values;
+
+  public Long getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(Long timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String[] getValues() {
+    return values;
+  }
+
+  public void setValues(String[] values) {
+    this.values = values;
+  }
+}

+ 14 - 15
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/job/DownLoadServiceJob.java

@@ -6,10 +6,8 @@ import com.jiayue.ipfcst.console.service.ElectricFieldService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -23,24 +21,25 @@ import java.util.List;
 @EnableScheduling
 public class DownLoadServiceJob {
 
-    @Autowired
-    private DownLoadService downLoadService;
+  @Autowired
+  private DownLoadService downLoadService;
 
-    @Autowired
-    private ElectricFieldService electricFieldService;
-    //@Scheduled(cron = "0 0/15 * * * *")
-    public void fxglFileAnalysis() {
+  @Autowired
+  private ElectricFieldService electricFieldService;
 
-        log.debug("天气预报文件下载定时任务开始执行");
+  //@Scheduled(cron = "0 0/15 * * * *")
+  public void fxglFileAnalysis() {
 
-        List<ElectricField> electricFieldList = electricFieldService.getAll();
-        for(ElectricField electricField : electricFieldList){
-          this.downLoadService.download(electricField.getStationCode());
-        }
-
-        log.debug("天气预报文件下载定时任务执行结束");
+    log.debug("天气预报文件下载定时任务开始执行");
 
+    List<ElectricField> electricFieldList = electricFieldService.getAll();
+    for (ElectricField electricField : electricFieldList) {
+      this.downLoadService.download(electricField.getStationCode());
     }
 
+    log.debug("天气预报文件下载定时任务执行结束");
+
+  }
+
 
 }

+ 38 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/job/ReceiveDataJob.java

@@ -0,0 +1,38 @@
+package com.jiayue.ipfcst.console.job;
+
+import com.jiayue.ipfcst.console.service.ReceiveDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 天气预报下载 停用  现已由外网下发不主动下载
+ *
+ * @author whc
+ * @version 3.0
+ */
+@Slf4j
+@Service
+@EnableScheduling
+public class ReceiveDataJob {
+
+  @Autowired
+  private ReceiveDataService receiveDataService;
+
+
+  @Scheduled(fixedDelay = 60000)
+  public void receiveData() {
+
+    log.debug("开始向绿能数据中心请求数据");
+
+    this.receiveDataService.receive();
+
+    log.debug("数据请求结束");
+
+  }
+
+
+}

+ 33 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/DataPointService.java

@@ -0,0 +1,33 @@
+package com.jiayue.ipfcst.console.service;
+
+
+import com.jiayue.ipfcst.common.data.entity.DataPoint;
+import com.jiayue.ipfcst.common.data.repository.DataPointRepository;
+import com.jiayue.ipfcst.common.data.service.BaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@Slf4j
+public class DataPointService extends BaseService {
+
+  @Autowired
+  DataPointRepository dataPointRepository;
+
+  /**
+   * 查询设备下所有测点
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public List<DataPoint> getByEquipmentType(Integer equipmentType) {
+    List<DataPoint> resultList;
+    resultList = this.dataPointRepository.findAllByEquipmentType(equipmentType);
+    return resultList;
+  }
+
+
+}

+ 12 - 16
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/DownLoadService.java

@@ -6,12 +6,9 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.jiayue.ipfcst.common.core.util.DateTimeUtil;
 import com.jiayue.ipfcst.common.data.entity.FileCreateLog;
-import com.jiayue.ipfcst.fileupload.util.FileUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.servlet.ModelAndView;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
@@ -21,7 +18,7 @@ import java.util.List;
 /**
  * DownLoadController
  *
- * @author bizy
+ * @author whc
  * @version 1.0
  * @since 2019/4/9 13:36
  */
@@ -29,7 +26,7 @@ import java.util.List;
 @RestController
 public class DownLoadService {
 
-	public void download(String stationCode) {
+  public void download(String stationCode) {
     log.info("开始执行定时任务:http下载文件");
     String body = HttpRequest.get("https://117.78.19.70:9010/client/getDownLoadFileAll/" + stationCode).execute().body();
     JSONObject json = JSONUtil.parseObj(body);
@@ -43,27 +40,27 @@ public class DownLoadService {
       //String dir = FileUtil.getDownloadFilePath() +File.separator+stationCode+File.separator+"new/";
       //String dirBak = FileUtil.getDownloadFilePath() +File.separator+stationCode+File.separator+"backups/"+simpleDateFormat.format(date)+"/";
       //测试使用
-      String dir = "/Users/wanghongchen/fsdownload/"+stationCode+"/"+"new/";
-      String dirBak = "/Users/wanghongchen/fsdownload/"+stationCode+"/"+"backups/"+simpleDateFormat.format(date)+"/";
+      String dir = "/Users/wanghongchen/fsdownload/" + stationCode + "/" + "new/";
+      String dirBak = "/Users/wanghongchen/fsdownload/" + stationCode + "/" + "backups/" + simpleDateFormat.format(date) + "/";
       //循环backups下的文件,有文件则不下载
       File fileDirectory = new File(dir);
-      if(!fileDirectory.exists()){
+      if (!fileDirectory.exists()) {
         fileDirectory.mkdir();
       }
       File bakDirectory = new File(dirBak);
-      if(!bakDirectory.exists()){
+      if (!bakDirectory.exists()) {
         bakDirectory.mkdir();
       }
       try {
         for (FileCreateLog fileCreateLog : list) {
-          File file= new File(bakDirectory+File.separator+fileCreateLog.getFileName());
-          if(!file.exists()){
+          File file = new File(bakDirectory + File.separator + fileCreateLog.getFileName());
+          if (!file.exists()) {
             String url = "https://117.78.19.70:9010/client/getFileById?id=" + fileCreateLog.getId();
             long a = HttpUtil.downloadFile(url, dir + File.separatorChar + fileCreateLog.getFileName());
-            if(a>0){
-              log.info(stationCode+"场站"+fileCreateLog.getFileName()+"文件下载成功");
+            if (a > 0) {
+              log.info(stationCode + "场站" + fileCreateLog.getFileName() + "文件下载成功");
             }
-          }else{
+          } else {
             log.info("文件已经下载过了");
           }
         }
@@ -71,8 +68,7 @@ public class DownLoadService {
         log.error("文件下载失败", e);
       }
     }
-	}
-
+  }
 
 
 }

+ 88 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/EquipmentAttributeService.java

@@ -0,0 +1,88 @@
+package com.jiayue.ipfcst.console.service;
+
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.data.constant.enums.EquipmentTypeEnum;
+import com.jiayue.ipfcst.common.data.entity.EquipmentAttribute;
+import com.jiayue.ipfcst.common.data.repository.EquipmentAttributeRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * 装置的状态描述表的操作service类
+ *
+ * @author 修唯xiuwei
+ * @version 3.0
+ */
+@Service
+public class EquipmentAttributeService {
+
+  /**
+   * 操作仓库
+   */
+  @Autowired
+  EquipmentAttributeRepository equipmentAttributeRepository;
+  @Autowired
+  ElectricFieldService electricFieldService;
+
+
+  /**
+   * 查找符合条件的设备属性
+   *
+   * @param equipmentAttribute 设备属性
+   * @return EquipmentAttribute 设备属性列表
+   */
+  public List<EquipmentAttribute> get(EquipmentAttribute equipmentAttribute) {
+    return this.equipmentAttributeRepository.findAll(Example.of(equipmentAttribute));
+  }
+
+  /**
+   * 查所有的设备属性
+   *
+   * @return EquipmentAttribute 设备属性列表
+   */
+  public List<EquipmentAttribute> getAll() {
+    return this.equipmentAttributeRepository.findAll();
+  }
+
+
+  /**
+   * 获取某类设备的状态数据描述属性
+   * 查询设备属性by设备类型
+   * 分页
+   *
+   * @param equipmentType 设备类型
+   * @return EquipmentAttribute 设备属性
+   */
+  public Page<EquipmentAttribute> findByEquipmentType(String equipmentType, Integer page, Integer size) {
+    Pageable pageable = PageRequest.of(page - 1, size);
+    EquipmentTypeEnum equipmentTypeEnum = EquipmentTypeEnum.valueOf(equipmentType);
+    return equipmentAttributeRepository.findAllByEquipmentType(equipmentTypeEnum, pageable);
+  }
+
+
+  /**
+   * 删除
+   */
+  public void delete(Integer id) throws BusinessException {
+    if (StringUtils.isEmpty(id)) {
+      throw new BusinessException("设备属性id不能为空!");
+    } else {
+      equipmentAttributeRepository.deleteById(id);
+    }
+  }
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  public void saveCloud(List<EquipmentAttribute> beans) {
+    equipmentAttributeRepository.deleteAll();
+    equipmentAttributeRepository.saveAll(beans);
+  }
+}

+ 385 - 406
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/FileAnalysisService.java

@@ -18,12 +18,15 @@ import org.apache.commons.lang.time.DateFormatUtils;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
-import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.nio.charset.StandardCharsets;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 解析电科院NWP和DQ文件
@@ -38,63 +41,93 @@ import java.util.*;
 @Slf4j
 public class FileAnalysisService extends BaseService {
 
-	ElectricFieldService electricFieldService;
+  ElectricFieldService electricFieldService;
 
-	ForecastPowerShortTermService forecastPowerShortTermService;
+  ForecastPowerShortTermService forecastPowerShortTermService;
 
-	HolidayCalendarRepository holidayCalendarRepository;
+  HolidayCalendarRepository holidayCalendarRepository;
 
-	NwpService nwpService;
+  NwpService nwpService;
 
-	FileAnalysisRecordService fileAnalysisRecordService;
+  FileAnalysisRecordService fileAnalysisRecordService;
 
-	OverHaulPlanService overHaulPlanService;
+  OverHaulPlanService overHaulPlanService;
 
-	SysParameterService sysParameterService;
+  SysParameterService sysParameterService;
 
-	ElectricFieldRepository electricFieldRepository;
+  ElectricFieldRepository electricFieldRepository;
 
-	HolidayCalendarService holidayCalendarService;
+  HolidayCalendarService holidayCalendarService;
 
+  public static void mvFile(File file, String fdPath) {
+    try {
+      FileUtils.copyFile(file, new File(fdPath), true);
+    } catch (IOException e) {
+      log.error("文件移动错误", e);
+    }
+  }
+
+  /**
+   * 创建备份文件夹
+   */
+  public static String mkDirForTime(String targetRoot, String format) {
+    String path;
+    File file;
+    if (StringUtils.isNotEmpty(format)) {
+      long current = System.currentTimeMillis();
+      path = DateFormatUtils.format(current, format);
+      file = new File(targetRoot + File.separator + path + File.separator);
+
+    } else {
+      file = new File(targetRoot + File.separator);
+    }
 
+    if (!file.exists() && !file.isFile()) {
 
-	@SneakyThrows
-	public void analysisJob() {
-		log.info("-----------------开始执行文件解析任务----------------------");
-		long timeD = 15 * 60 * 1000;
-		Long currentDate = DateTimeUtil.getMillisecondsSubDay();//今日凌晨
-		boolean flag = false;
-		List<ElectricField> electricFieldList = electricFieldService.getAll();
+      if (file.mkdir()) {
+        log.info("已创建文件夹");
+      } else {
+        log.info("创建文件夹失败,路径:" + file.getPath());
+      }
+    }
+    return file.getPath() + File.separator;
+  }
+
+  @SneakyThrows
+  public void analysisJob() {
+    log.info("-----------------开始执行文件解析任务----------------------");
+    long timeD = 15 * 60 * 1000;
+    Long currentDate = DateTimeUtil.getMillisecondsSubDay();//今日凌晨
+    boolean flag;
+    List<ElectricField> electricFieldList = electricFieldService.getAll();
     List<String> eList = new ArrayList<>();
-    for(ElectricField electricField : electricFieldList){
+    for (ElectricField electricField : electricFieldList) {
       eList.add(electricField.getStationCode());
     }
-		//String path = FileUtil.getDownloadFilePath() + File.separator + "new";
+    //String path = FileUtil.getDownloadFilePath() + File.separator + "new";
     String path = FileUtil.getDownloadFilePath();
     //downloadFile
-		File dirFile = new File(path);
-		//判断该目录是否存在,不存在时创建
-		if (!dirFile.exists()) {
-			dirFile.mkdirs();
-		}
-		log.info("系统扫描路径【" + dirFile.getPath() + "】");
-    for(String stationCode : eList){
+    File dirFile = new File(path);
+    //判断该目录是否存在,不存在时创建
+    if (!dirFile.exists()) {
+      dirFile.mkdirs();
+    }
+    log.info("系统扫描路径【" + dirFile.getPath() + "】");
+    for (String stationCode : eList) {
       // downLoadFile/场站编号/new
-      //String dirFiles = dirFile.getPath()+File.separator+ stationCode+ File.separator + "new";
-      String dirFiles = "/Users/wanghongchen/fsdownload"+File.separator+ stationCode+ File.separator + "new";
-      File  filePath = new File(dirFiles);
+      String dirFiles = dirFile.getPath() + File.separator + stationCode + File.separator + "new";
+      //String dirFiles = "/Users/wanghongchen/fsdownload"+File.separator+ stationCode+ File.separator + "new";
+      File filePath = new File(dirFiles);
       if (!filePath.exists()) {
         filePath.mkdirs();
       }
       Collection<File> files = FileUtils.listFiles(filePath, new String[]{"RB"}, false);
       String dayStr = new SimpleDateFormat("yyyyMMdd").format(new Date());//当前时间格式化为年月日
-      if (files != null && files.size() > 0) {
+      if (files.size() > 0) {
         for (File file : files) {
           flag = false;
-          boolean sfqbxf = false;
-          boolean startConsole = false;
           String fileName = file.getName();
-          if (fileName.indexOf(dayStr) < 0) {
+          if (!fileName.contains(dayStr)) {
             file.delete();
             log.info(fileName + "不是当天的文件,删除!");
             break;
@@ -103,7 +136,7 @@ public class FileAnalysisService extends BaseService {
             //假期文件
             if (file.getName().startsWith("JH")) {
               List<HolidayCalendar> listJq = fileAnalysisJqTerm(file);
-              if (listJq != null && listJq.size() > 0) {
+              if (listJq.size() > 0) {
                 holidayCalendarRepository.deleteAll();
                 holidayCalendarRepository.saveAll(listJq);
                 flag = true;
@@ -113,9 +146,9 @@ public class FileAnalysisService extends BaseService {
             }
             if (file.getName().startsWith("DQ")) {
               try {
-                List<ForecastPowerShortTerm> listDq = fileAnalysisShortTerm(file, currentDate,stationCode);
-                ForecastPowerShortTerm forecastPowerShortTerm = null;
-                if (listDq != null && listDq.size() > 0) {
+                List<ForecastPowerShortTerm> listDq = fileAnalysisShortTerm(file, currentDate, stationCode);
+                ForecastPowerShortTerm forecastPowerShortTerm;
+                if (listDq.size() > 0) {
                   //如果数据不全,进行补入
                   while (listDq.get(listDq.size() - 1).getForecastTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
                     forecastPowerShortTerm = new ForecastPowerShortTerm();
@@ -130,7 +163,7 @@ public class FileAnalysisService extends BaseService {
                     //短期数据修正
                     Long startTime = listDq.get(0).getForecastTime();
                     Long endTime = listDq.get(listDq.size() - 1).getForecastTime();//删除相同时间数据
-                    forecastPowerShortTermService.deleteBetweenAndGenTime(startTime, endTime, listDq,stationCode);
+                    forecastPowerShortTermService.deleteBetweenAndGenTime(startTime, endTime, listDq, stationCode);
                     flag = true;
                   } catch (Exception e) {
                     log.error("保存短期数据报错", e);
@@ -147,10 +180,10 @@ public class FileAnalysisService extends BaseService {
             }
             if (file.getName().startsWith("NWP")) {
               try {
-                List<Nwp> listNwp = fileAnalysisNwp(file,stationCode);
-                Nwp nwpData = null;
+                List<Nwp> listNwp = fileAnalysisNwp(file, stationCode);
+                Nwp nwpData;
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                if (listNwp != null && listNwp.size() > 0) {
+                if (listNwp.size() > 0) {
                   while (listNwp.get(listNwp.size() - 1).getPreTime() < DateTimeUtil.getMillisecondsSubDay() + 4 * 24 * 60 * 60 * 1000 - timeD) {
                     nwpData = new Nwp();
                     long time = 0;
@@ -195,13 +228,12 @@ public class FileAnalysisService extends BaseService {
                     listNwp.add(nwpData);
                   }
                 } else {
-                  flag = false;
                   log.info(file.getName() + "文件数据内容为空、不能正常解析 、移除该文件、执行数据修正功能");
                 }
                 //保存NWP实时数据
                 Long startTime = listNwp.get(0).getPreTime();
                 Long endTime = listNwp.get(listNwp.size() - 1).getPreTime();//删除相同时间数据
-                nwpService.deleteBetweenAndPreTime(startTime, endTime, listNwp,stationCode);
+                nwpService.deleteBetweenAndPreTime(startTime, endTime, listNwp, stationCode);
                 flag = true;
               } catch (Exception e) {
                 log.error("解析NWP文件失败", e);
@@ -210,378 +242,325 @@ public class FileAnalysisService extends BaseService {
             }
             if (flag) {
               //文件解析成功之后,保存记录
-              saveFileParsingRecord(file, "1",stationCode);
+              saveFileParsingRecord(file, "1", stationCode);
               //移除文件备份到临时文件下
               moveFile(file);
-              if (startConsole){
-                //重启console程序
-                Runtime.getRuntime().exec("service console restart");
-              }
             } else {
               //文件解析失败之后,保存记录
-              saveFileParsingRecord(file, "0",stationCode);
+              saveFileParsingRecord(file, "0", stationCode);
               //移除文件备份到error文件下
               moveFileError(file);
             }
           }
         }
-      } else {
       }
       log.info("-----------------执行文件解析任务完成----------------------");
     }
-	}
-
-	public static void mvFile(File file, String fdPath) {
-		try {
-			FileUtils.copyFile(file, new File(fdPath), true);
-		} catch (IOException e) {
-			log.error("文件移动错误", e);
-		}
-	}
-
-	/**
-	 * NWP解析
-	 *
-	 * @param file 文件路径
-	 * @return 样例集合
-	 */
-	private List<Nwp> fileAnalysisNwp(File file,String stationCode) {
-		List<Nwp> listNwp = new ArrayList<>();
-		if (file.renameTo(file)) {
-			InputStreamReader readNwp = null;
-			BufferedReader bufferedReaderNwp = null;
-			try {
-				readNwp = new InputStreamReader(new FileInputStream(file), "utf-8");//考虑到编码格式
-				bufferedReaderNwp = new BufferedReader(readNwp);
-				String fileName = file.getName();
-				fileName = fileName.substring(fileName.indexOf("_") + 1, fileName.lastIndexOf("."));
-				String lineTxt;
-				Nwp nwpData = null;
-				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 (datas != null && datas.length > 0) {
-							//过滤当天的数据
-							//if (sdf.parse(datas[5]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 * 60 *
-							// 1000) {
-							nwpData = new Nwp();
-
-							//将截取的文件放入nwpData中
-							nwpData.setFarmId(datas[1]);
-							nwpData.setScDate(datas[2]);
-							nwpData.setScTime(datas[3]);
-							nwpData.setPreDate(datas[4]);
-							nwpData.setPreTime(sdf.parse(datas[5]).getTime());//采集时间 与 短期预测时间关联
-							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));
-							nwpData.setStationCode(stationCode);
-							listNwp.add(nwpData);
-							//}
-						}
-					}
-				}
-			} catch (IOException | ParseException | RuntimeException e) {
-				log.error("系统错误:", e);
-				// 进行告警
-				String name = "NWP文件解析失败";
-				String describe = "请查看NWP文件格式是否正常";
-				String solution = "请修改NWP文件内容";
-				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);
-			}
-		}
-		return listNwp;
-	}
-
-
-	/**
-	 * 假期解析
-	 *
-	 * @param file 文件路径
-	 * @return 样例集合
-	 */
-	private List<HolidayCalendar> fileAnalysisJqTerm(File file) {
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		List<HolidayCalendar> holidayCalendars = new ArrayList<>();
-		// 当文件未被使用时,进行解析上报
-		if (file.renameTo(file)) {
-			InputStreamReader read = null;
-			BufferedReader bufferedReader = null;
-			String stringLine;
-			HolidayCalendar holiday;
-			try {
-				read = new InputStreamReader(new FileInputStream(file), "utf-8");
-				bufferedReader = new BufferedReader(read);
-				while ((stringLine = bufferedReader.readLine()) != null) {
-					String[] string_arr = stringLine.split("\t");
-					if (string_arr.length == 7 && string_arr[0].startsWith("#")) {
-						holiday = new HolidayCalendar();
-						holiday.setId(Integer.parseInt(string_arr[1] + ""));
-						holiday.setName(string_arr[2] + "");
-						holiday.setStartTime(sdf.parse(string_arr[3]).getTime());
-						holiday.setEndTime(sdf.parse(string_arr[4]).getTime());
-						holiday.setDays(Integer.parseInt(string_arr[5] + ""));
-						if (string_arr[6].equals("1")) {
-							holiday.setHolidayTypeEnum(HolidayTypeEnum.valueOf(string_arr[6]));
-						}
-						holidayCalendars.add(holiday);
-					}
-				}
-			} catch (IOException | ParseException | RuntimeException e) {
-				log.error("系统错误:", e);
-				// 进行告警
-				String name = "假期文件解析失败";
-				String describe = "请查看假期文件格式是否正常";
-				String solution = "请修改假期文件内容";
-
-				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(bufferedReader, read);
-			}
-		}
-		return holidayCalendars;
-	}
-
-	/**
-	 * 短期解析
-	 *
-	 * @param file        文件路径
-	 * @param currentDate 当前时间
-	 * @return 样例集合
-	 */
-	private List<ForecastPowerShortTerm> fileAnalysisShortTerm(File file, Long currentDate,String stationCode) {
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		List<ForecastPowerShortTerm> forecastPowerShortTerm = new ArrayList<>();
-		// 当文件未被使用时,进行解析上报
-		if (file.renameTo(file)) {
-			InputStreamReader read = null;
-			BufferedReader bufferedReader = null;
-			String stringLine;
-			ForecastPowerShortTerm stf;
-			try {
-				read = new InputStreamReader(new FileInputStream(file), "utf-8");
-				bufferedReader = new BufferedReader(read);
-				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])) {
-                  //过滤当天的数据
-                //if (sdf.parse(string_arr[2]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 *
-                // 60 * 1000) {
-                stf = new ForecastPowerShortTerm();
-                stf.setFpValue(new BigDecimal(string_arr[3] + ""));
-                stf.setForecastTime(sdf.parse(string_arr[2]).getTime());
-                stf.setGenDate(new Date(currentDate));
-                stf.setPredictionModelEnum(PredictionModelEnum.E1);
-                stf.setStationCode(stationCode);
-                forecastPowerShortTerm.add(stf);
-                // }
-						}
-					}
-				}
-			} 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(bufferedReader, read);
-			}
-		}
-		return forecastPowerShortTerm;
-	}
-
-	/**
-	 * 移动文件到临时目录下
-	 *
-	 * @param file 文件
-	 */
-	private void moveFile(File file) {
-		// 移动文件到处理目录
-		File destFile = new File(file.getPath().replaceFirst("new", "backupsTemp"));
-		log.info("move file :{}, dest file:{}", file, destFile);
-		if (destFile.exists()) {
-			destFile.delete();
-		}
-		try {
-			FileUtils.moveFile(file, destFile);
-		} catch (IOException e) {
-			log.error("系统移除文件错误:", e);
-			// 进行告警
-		}
-		moveFileBackups(destFile.getParent());
-	}
-
-	/**
-	 * 移动文件到处理目录
-	 *
-	 * @param filePath 文件路径
-	 */
-	private void moveFileBackups(String filePath) {
-		String targetRoot = filePath.replaceFirst("backupsTemp", "backups");
-		String path = mkDirForTime(targetRoot, null);
-		path = mkDirForTime(path, "yyyyMMdd");
-		// 移动文件夹内容
-		File sourceFile = new File(filePath);
-		if (sourceFile.exists()) {
-			try {
-				File[] files = sourceFile.listFiles();
-				if (files != null && files.length > 0) {
-					for (File f : files) {
-						if (f.renameTo(new File(path + f.getName()))) {
-							log.info("move file :{}, dest file:{}", path, f.getName());
-						}
-					}
-				}
-			} catch (Exception e) {
-				// 进行告警
-			}
-		}
-	}
-
-	/**
-	 * 移动文件到处理错误目录下
-	 *
-	 * @param file 文件
-	 */
-	private void moveFileError(File file) {
-		File destFile = new File(file.getPath().replaceFirst("new", "error"));
-		if (destFile.exists()) {
-			destFile.delete();
-		}
-		try {
-			FileUtils.moveFile(file, destFile);
-		} catch (IOException e) {
-			log.error(file.getName() + "文件解析失败", e);
-		}
-	}
-
-	/**
-	 * 创建备份文件夹
-	 *
-	 * @param targetRoot
-	 * @param format
-	 * @return
-	 */
-	public static String mkDirForTime(String targetRoot, String format) {
-		String path = null;
-		File file = null;
-		if (StringUtils.isNotEmpty(format)) {
-			Long current = System.currentTimeMillis();
-			path = DateFormatUtils.format(current, format);
-			file = new File(targetRoot + File.separator + path + File.separator);
-
-		} else {
-			file = new File(targetRoot + File.separator);
-		}
-
-		if (!file.exists() && !file.isFile()) {
-
-			if (file.mkdir()) {
-				log.info("已创建文件夹");
-			} else {
-				log.info("创建文件夹失败,路径:" + file.getPath());
-			}
-		}
-		return file.getPath() + File.separator;
-	}
-
-	/**
-	 * 保存文件解析记录
-	 *
-	 * @param file       文件信息
-	 * @param fileStatus 文件解析状态 1:表示解析成功 0:解析失败
-	 */
-	private void saveFileParsingRecord(File file, String fileStatus,String staticCode) {
-		String fileType = "";
-		if (file.getName().startsWith("JH")) {
-			fileType = "JH";//假期文件
-		} else if (file.getName().startsWith("DQ")) {
-			fileType = "DQ";//短期文件
-		} else {
-			fileType = "NWP";//NWP文件
-		}
-		FileAnalysisRecord fileParsingRecord = new FileAnalysisRecord();
-		fileParsingRecord.setFileTitle(file.getName());
-		fileParsingRecord.setFileType(fileType);
-		fileParsingRecord.setFileStatus(fileStatus);
-		fileParsingRecord.setFilePath(file.getPath());
-		fileParsingRecord.setFileDescription(DateTimeUtil.getStringDate() + " 正常解析文件");
-		fileParsingRecord.setStationCode(staticCode);
-		fileAnalysisRecordService.save(fileParsingRecord);
-	}
-
-
-	/**
-	 * 关闭文件流
-	 *
-	 * @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);
-		}
-	}
+  }
+
+  /**
+   * NWP解析
+   *
+   * @param file 文件路径
+   * @return 样例集合
+   */
+  private List<Nwp> fileAnalysisNwp(File file, String stationCode) {
+    List<Nwp> listNwp = new ArrayList<>();
+    if (file.renameTo(file)) {
+      InputStreamReader readNwp = null;
+      BufferedReader bufferedReaderNwp = null;
+      try {
+        readNwp = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8.name());//考虑到编码格式
+        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中
+            nwpData.setFarmId(datas[1]);
+            nwpData.setScDate(datas[2]);
+            nwpData.setScTime(datas[3]);
+            nwpData.setPreDate(datas[4]);
+            nwpData.setPreTime(sdf.parse(datas[5]).getTime());//采集时间 与 短期预测时间关联
+            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));
+            nwpData.setStationCode(stationCode);
+            listNwp.add(nwpData);
+            //}
+          }
+        }
+      } 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);
+      }
+    }
+    return listNwp;
+  }
+
+  /**
+   * 假期解析
+   *
+   * @param file 文件路径
+   * @return 样例集合
+   */
+  private List<HolidayCalendar> fileAnalysisJqTerm(File file) {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    List<HolidayCalendar> holidayCalendars = new ArrayList<>();
+    // 当文件未被使用时,进行解析上报
+    if (file.renameTo(file)) {
+      InputStreamReader read = null;
+      BufferedReader bufferedReader = null;
+      String stringLine;
+      HolidayCalendar holiday;
+      try {
+        read = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
+        bufferedReader = new BufferedReader(read);
+        while ((stringLine = bufferedReader.readLine()) != null) {
+          String[] string_arr = stringLine.split("\t");
+          if (string_arr.length == 7 && string_arr[0].startsWith("#")) {
+            holiday = new HolidayCalendar();
+            holiday.setId(Integer.parseInt(string_arr[1] + ""));
+            holiday.setName(string_arr[2] + "");
+            holiday.setStartTime(sdf.parse(string_arr[3]).getTime());
+            holiday.setEndTime(sdf.parse(string_arr[4]).getTime());
+            holiday.setDays(Integer.parseInt(string_arr[5] + ""));
+            if (string_arr[6].equals("1")) {
+              holiday.setHolidayTypeEnum(HolidayTypeEnum.valueOf(string_arr[6]));
+            }
+            holidayCalendars.add(holiday);
+          }
+        }
+      } 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(bufferedReader, read);
+      }
+    }
+    return holidayCalendars;
+  }
+
+  /**
+   * 短期解析
+   *
+   * @param file        文件路径
+   * @param currentDate 当前时间
+   * @return 样例集合
+   */
+  private List<ForecastPowerShortTerm> fileAnalysisShortTerm(File file, Long currentDate, String stationCode) {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    List<ForecastPowerShortTerm> forecastPowerShortTerm = new ArrayList<>();
+    // 当文件未被使用时,进行解析上报
+    if (file.renameTo(file)) {
+      InputStreamReader read = null;
+      BufferedReader bufferedReader = null;
+      String stringLine;
+      ForecastPowerShortTerm stf;
+      try {
+        read = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
+        bufferedReader = new BufferedReader(read);
+        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])) {
+              //过滤当天的数据
+              //if (sdf.parse(string_arr[2]).getTime() >= TimeUtils.getMillisecondsSubDay() + 24 * 60 *
+              // 60 * 1000) {
+              stf = new ForecastPowerShortTerm();
+              stf.setFpValue(new BigDecimal(string_arr[3] + ""));
+              stf.setForecastTime(sdf.parse(string_arr[2]).getTime());
+              stf.setGenDate(new Date(currentDate));
+              stf.setPredictionModelEnum(PredictionModelEnum.E1);
+              stf.setStationCode(stationCode);
+              forecastPowerShortTerm.add(stf);
+              // }
+            }
+          }
+        }
+      } 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(bufferedReader, read);
+      }
+    }
+    return forecastPowerShortTerm;
+  }
+
+  /**
+   * 移动文件到临时目录下
+   *
+   * @param file 文件
+   */
+  private void moveFile(File file) {
+    // 移动文件到处理目录
+    File destFile = new File(file.getPath().replaceFirst("new", "backupsTemp"));
+    log.info("move file :{}, dest file:{}", file, destFile);
+    if (destFile.exists()) {
+      destFile.delete();
+    }
+    try {
+      FileUtils.moveFile(file, destFile);
+    } catch (IOException e) {
+      log.error("系统移除文件错误:", e);
+      // 进行告警
+    }
+    moveFileBackups(destFile.getParent());
+  }
+
+  /**
+   * 移动文件到处理目录
+   *
+   * @param filePath 文件路径
+   */
+  private void moveFileBackups(String filePath) {
+    String targetRoot = filePath.replaceFirst("backupsTemp", "backups");
+    String path = mkDirForTime(targetRoot, null);
+    path = mkDirForTime(path, "yyyyMMdd");
+    // 移动文件夹内容
+    File sourceFile = new File(filePath);
+    if (sourceFile.exists()) {
+      try {
+        File[] files = sourceFile.listFiles();
+        if (files != null && files.length > 0) {
+          for (File f : files) {
+            if (f.renameTo(new File(path + f.getName()))) {
+              log.info("move file :{}, dest file:{}", path, f.getName());
+            }
+          }
+        }
+      } catch (Exception e) {
+        // 进行告警
+      }
+    }
+  }
+
+  /**
+   * 移动文件到处理错误目录下
+   *
+   * @param file 文件
+   */
+  private void moveFileError(File file) {
+    File destFile = new File(file.getPath().replaceFirst("new", "error"));
+    if (destFile.exists()) {
+      destFile.delete();
+    }
+    try {
+      FileUtils.moveFile(file, destFile);
+    } catch (IOException e) {
+      log.error(file.getName() + "文件解析失败", e);
+    }
+  }
+
+  /**
+   * 保存文件解析记录
+   *
+   * @param file       文件信息
+   * @param fileStatus 文件解析状态 1:表示解析成功 0:解析失败
+   */
+  private void saveFileParsingRecord(File file, String fileStatus, String staticCode) {
+    String fileType;
+    if (file.getName().startsWith("JH")) {
+      fileType = "JH";//假期文件
+    } else if (file.getName().startsWith("DQ")) {
+      fileType = "DQ";//短期文件
+    } else {
+      fileType = "NWP";//NWP文件
+    }
+    FileAnalysisRecord fileParsingRecord = new FileAnalysisRecord();
+    fileParsingRecord.setFileTitle(file.getName());
+    fileParsingRecord.setFileType(fileType);
+    fileParsingRecord.setFileStatus(fileStatus);
+    fileParsingRecord.setFilePath(file.getPath());
+    fileParsingRecord.setFileDescription(DateTimeUtil.getStringDate() + " 正常解析文件");
+    fileParsingRecord.setStationCode(staticCode);
+    fileAnalysisRecordService.save(fileParsingRecord);
+  }
+
+
+  /**
+   * 关闭文件流
+   *
+   * @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);
+    }
+  }
 }

+ 143 - 51
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ForecastPowerUltraShortTermService.java

@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -57,8 +58,8 @@ public class ForecastPowerUltraShortTermService extends BaseService {
    * @param endTime   结束时间
    */
   @Transactional(propagation = Propagation.REQUIRED)
-  public void buildForecastPowerUltraShortTerm(@NotNull final Long startTime, @NotNull final Long endTime,String stationCode) {
-    this.getForecastPowerUltraShortTerm(startTime, endTime,stationCode);
+  public void buildForecastPowerUltraShortTerm(@NotNull final Long startTime, @NotNull final Long endTime, String stationCode) {
+    this.getForecastPowerUltraShortTerm(startTime, endTime, stationCode);
   }
 
   /**
@@ -71,40 +72,40 @@ public class ForecastPowerUltraShortTermService extends BaseService {
   @SuppressWarnings("WeakerAccess")
   @Transactional(propagation = Propagation.REQUIRED)
   public List<ForecastPowerUltraShortTermHis> getForecastPowerUltraShortTerm(@NotNull final Long startTime, @NotNull final Long endTime, @NotNull final String stationCode) {
-    log.info(stationCode+"开始获取超短期实时预测功率" + DateFormatUtils.format(startTime, "yyyy-MM-dd HH:mm:ss") + " 至 " + DateFormatUtils.format(endTime, "yyyy-MM-dd HH:mm:ss"));
+    log.info(stationCode + "开始获取超短期实时预测功率" + DateFormatUtils.format(startTime, "yyyy-MM-dd HH:mm:ss") + " 至 " + DateFormatUtils.format(endTime, "yyyy-MM-dd HH:mm:ss"));
     // 查询场站信息
     ElectricField electricFieldInfo = electricFieldService.getSingleStation(stationCode);
     // 查询预测时间点对应的开机容量
     Map<Long, BigDecimal> openCapacityMap = null;
     try {
-      openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricFieldInfo.getCapacity(),stationCode);
+      openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricFieldInfo.getCapacity(), stationCode);
     } catch (BusinessException e) {
-      log.error(stationCode+"超短期数据生成获取开机容量出错:" + CommonUtil.printStackTraceToString(e));
+      log.error(stationCode + "超短期数据生成获取开机容量出错:" + CommonUtil.printStackTraceToString(e));
     }
     Long monentTime = 0L;
     try {
       monentTime = DateMomentUtil.getMomentTime(new Date().getTime(), 1, 15 * 60 * 1000L);
     } catch (Exception e) {
-      log.error(stationCode+"获取当前时刻错误",e);
+      log.error(stationCode + "获取当前时刻错误", e);
     }
 
     List<ForecastPowerUltraShortTerm> forecastPowerUltraShortTermList = new ArrayList<>();
-    List<ForecastPowerUltraShortTerm> tempList = this.forecastPowerUltraShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime,stationCode);
-    for (ForecastPowerUltraShortTerm f:tempList){
-      if (Integer.parseInt(DateFormatUtils.format(f.getForecastTime(),"mm"))%15==0){
+    List<ForecastPowerUltraShortTerm> tempList = this.forecastPowerUltraShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
+    for (ForecastPowerUltraShortTerm f : tempList) {
+      if (Integer.parseInt(DateFormatUtils.format(f.getForecastTime(), "mm")) % 15 == 0) {
         forecastPowerUltraShortTermList.add(f);
       }
     }
 
     Long momentTime = 15 * 60 * 1000L; // 15分钟一个时刻
     Integer moments = Math.toIntExact((endTime - startTime) / momentTime + 1);
-    log.info(stationCode+"所需时间moments个数:"+moments);
-    log.info(stationCode+"获取所需记录数:" + forecastPowerUltraShortTermList.size());
+    log.info(stationCode + "所需时间moments个数:" + moments);
+    log.info(stationCode + "获取所需记录数:" + forecastPowerUltraShortTermList.size());
     if (moments > forecastPowerUltraShortTermList.size()) {
       Map<Long, List<ForecastPowerUltraShortTerm>> forecastPowerShortTermsMap = forecastPowerUltraShortTermList.stream().collect(Collectors.groupingBy(ForecastPowerUltraShortTerm::getForecastTime));
       for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
         if (forecastPowerShortTermsMap.get(tempTime) == null) {
-          log.info(stationCode+"文件超短期缺点:"+tempTime+" forecastPowerShortTermsMap里个数:"+forecastPowerShortTermsMap.size());
+          log.info(stationCode + "文件超短期缺点:" + tempTime + " forecastPowerShortTermsMap里个数:" + forecastPowerShortTermsMap.size());
           BigDecimal tempValue;
           if (ElectricFieldTypeEnum.E1.equals(electricFieldInfo.getElectricFieldTypeEnum())) {
             if (DateTimeUtil.checkInSunriseAndSunset(startTime, electricFieldInfo.getLongitude().doubleValue(), electricFieldInfo.getLatitude().doubleValue())) {
@@ -122,8 +123,8 @@ public class ForecastPowerUltraShortTermService extends BaseService {
           forecastPowerUltraShortTerm.setForecastTime(tempTime);
           forecastPowerUltraShortTerm.setFpValue(tempValue);
           forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E4);
-          forecastPowerUltraShortTerm.setCoefficientValue(new BigDecimal(-0.99).setScale(2,BigDecimal.ROUND_HALF_UP));
-          forecastPowerUltraShortTerm.setDifferenceValue(new BigDecimal(-0.99).setScale(2,BigDecimal.ROUND_HALF_UP));
+          forecastPowerUltraShortTerm.setCoefficientValue(new BigDecimal(-0.99).setScale(2, BigDecimal.ROUND_HALF_UP));
+          forecastPowerUltraShortTerm.setDifferenceValue(new BigDecimal(-0.99).setScale(2, BigDecimal.ROUND_HALF_UP));
           forecastPowerUltraShortTerm.setStationCode(stationCode);
           // 保存超短期实时预测记录
           this.forecastPowerUltraShortTermRepository.save(forecastPowerUltraShortTerm);
@@ -131,7 +132,7 @@ public class ForecastPowerUltraShortTermService extends BaseService {
         }
       }
     }
-    log.info(stationCode+"生成超短期实时预测功率记录数:" + forecastPowerUltraShortTermList.size());
+    log.info(stationCode + "生成超短期实时预测功率记录数:" + forecastPowerUltraShortTermList.size());
     // 按预测时刻升序
     forecastPowerUltraShortTermList.sort(Comparator.comparing(ForecastPowerUltraShortTerm::getForecastTime));
 
@@ -164,7 +165,7 @@ public class ForecastPowerUltraShortTermService extends BaseService {
 //    List<ForecastPowerUltraShortTermHis> forecastPowerUltraShortTermHiss = forecastPowerUltraShortTermHiss1.stream().filter(t -> t.getForecastHowLongAgo() <=16).collect(Collectors.toList());
     // 获取实际功率替换超短期点位参数
     Integer replacePoint = 0;
-    String realpower_replace_cdq = sysParameterService.getSysParameter("realpower_replace_cdq", "0",stationCode);
+    String realpower_replace_cdq = sysParameterService.getSysParameter("realpower_replace_cdq", "0", stationCode);
     replacePoint = Integer.valueOf(realpower_replace_cdq);
     if (replacePoint <= forecastPowerUltraShortTermHiss.size() && replacePoint > 0) {
       Long pre5Time = 0l;
@@ -173,10 +174,10 @@ public class ForecastPowerUltraShortTermService extends BaseService {
         // 获取前5分钟时刻
         pre5Time = DateMomentUtil.getMomentTime(systemDate.getTime() - 5 * 60 * 1000, 1, 5 * 60 * 1000L);
       } catch (Exception e) {
-        log.error(stationCode+"超短期数据用实际功率替换生成时刻步长错误", e);
+        log.error(stationCode + "超短期数据用实际功率替换生成时刻步长错误", e);
         pre5Time = DateMomentUtil.getDayStartTime(systemDate.getTime());
       }
-      List<PowerStationStatusData> realPowerList = powerStationStatusDataRepository.findByTimeBetweenAndStationCode(new Date(pre5Time), new Date(pre5Time + 5 * 60 * 1000 - 1000),stationCode);
+      List<PowerStationStatusData> realPowerList = powerStationStatusDataRepository.findByTimeBetweenAndStationCode(new Date(pre5Time), new Date(pre5Time + 5 * 60 * 1000 - 1000), stationCode);
       if (realPowerList.size() > 0) {
         // 按时间降序排列
         realPowerList.sort(Comparator.comparing(PowerStationStatusData::getTime).reversed());
@@ -190,17 +191,17 @@ public class ForecastPowerUltraShortTermService extends BaseService {
       }
     }
 
-    String lowerPredictionLimit = super.getSysParameter("LowerPredictionLimit", "0",stationCode);
+    String lowerPredictionLimit = super.getSysParameter("LowerPredictionLimit", "0", stationCode);
     BigDecimal lpl = new BigDecimal(lowerPredictionLimit);
 
-    forecastPowerUltraShortTermHiss.forEach(s->{
-      if(s.getAbleValue().compareTo(lpl)==-1){
+    forecastPowerUltraShortTermHiss.forEach(s -> {
+      if (s.getAbleValue().compareTo(lpl) == -1) {
         s.setAbleValue(lpl);
       }
     });
 
     // 删除当前时刻标记时间生成的超短期历史记录
-    this.forecastPowerUltraShortTermHisRepository.deleteNowMoment(startTime, endTime, new Date(monentTime),stationCode);
+    this.forecastPowerUltraShortTermHisRepository.deleteNowMoment(startTime, endTime, new Date(monentTime), stationCode);
     // 保存超短期历史记录
     this.forecastPowerUltraShortTermHisRepository.saveAll(forecastPowerUltraShortTermHiss);
     return forecastPowerUltraShortTermHiss;
@@ -216,34 +217,33 @@ public class ForecastPowerUltraShortTermService extends BaseService {
     try {
       electricFieldList = super.getMultipleStation();
     } catch (BusinessException e) {
-      log.error("生成超短期实时获取多场站失败",e);
+      log.error("生成超短期实时获取多场站失败", e);
     }
 
-    if (electricFieldList.isEmpty()){
+    if (electricFieldList.isEmpty()) {
       log.error("没有找到场站,不能执行超短期实时数据生成");
-    }
-    else{
-      for (ElectricField electricField:electricFieldList){
+    } else {
+      for (ElectricField electricField : electricFieldList) {
         String stationCode = electricField.getStationCode();
         // 根据场站类型执行相应超短期预测
         try {
-          String cdqUpMin = super.getSysParameter("CDQ_UP_MIN", "0",stationCode);
-          Long currentTime = System.currentTimeMillis()+ Integer.parseInt(cdqUpMin) * 1000 * 60;
-          String llcdq_point = sysParameterService.getSysParameter("FILE_LLCDQ_POINT", "16",stationCode);
+          String cdqUpMin = super.getSysParameter("CDQ_UP_MIN", "0", stationCode);
+          Long currentTime = System.currentTimeMillis() + Integer.parseInt(cdqUpMin) * 1000 * 60;
+          String llcdq_point = sysParameterService.getSysParameter("FILE_LLCDQ_POINT", "16", stationCode);
           Integer forecastPoints = Integer.parseInt(llcdq_point);
           Integer forecastMinutes = forecastPoints * 15;
 
           // 超短期提前N分钟生成文件
           Long startTime = DateMomentUtil.getMomentTime(currentTime, 1, 15 * 60 * 1000L);
           // 结束时间增加15分钟为了防止文件先生成,实时表中最后一个时间点没有点位的问题
-          Long endTime = DateUtils.addMinutes(new Date(startTime), forecastMinutes).getTime()+1000 * 60 * 15L;
+          Long endTime = DateUtils.addMinutes(new Date(startTime), forecastMinutes).getTime() + 1000 * 60 * 15L;
           // 查询该时间段内的短期预测功率
-          List<ForecastPowerShortTerm> forecastPowerShortTermList = this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime,stationCode);
+          List<ForecastPowerShortTerm> forecastPowerShortTermList = this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
           Map<Long, List<ForecastPowerShortTerm>> forecastPowerShortTermsMap =
             forecastPowerShortTermList.stream().collect(Collectors.groupingBy(ForecastPowerShortTerm::getForecastTime));
           Map<Long, BigDecimal> openCapacityMap = null;
           try {
-            openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricField.getCapacity(),stationCode);
+            openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricField.getCapacity(), stationCode);
           } catch (BusinessException e) {
             log.error("预测数据生成获取开机容量出错:" + CommonUtil.printStackTraceToString(e));
           }
@@ -256,7 +256,7 @@ public class ForecastPowerUltraShortTermService extends BaseService {
               if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
                 forecastPowerShortTerms = forecastPowerShortTermService.generateSolarPowerShortTerm(tempTime, openCapacityMap.get(tempTime), electricField);
               } else {
-                forecastPowerShortTerms = forecastPowerShortTermService.generateWindPowerShortTerm(tempTime, openCapacityMap.get(tempTime),stationCode);
+                forecastPowerShortTerms = forecastPowerShortTermService.generateWindPowerShortTerm(tempTime, openCapacityMap.get(tempTime), stationCode);
               }
               addForecastPowerShortTermList.add(forecastPowerShortTerms);
             }
@@ -271,10 +271,10 @@ public class ForecastPowerUltraShortTermService extends BaseService {
 
           if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
             // 光伏电站
-            this.executeForecastForlight(forecastPowerShortTermList, electricField.getCapacity(),stationCode);
+            this.executeForecastForlight(forecastPowerShortTermList, electricField.getCapacity(), stationCode);
           } else if (ElectricFieldTypeEnum.E2.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
             // 风力电场
-            this.executeForecastForWind(forecastPowerShortTermList, electricField.getCapacity(),stationCode);
+            this.executeForecastForWind(forecastPowerShortTermList, electricField.getCapacity(), stationCode);
           } else {
             log.error("场站类型非法!");
           }
@@ -293,28 +293,28 @@ public class ForecastPowerUltraShortTermService extends BaseService {
    * @param forecastPowerShortTermList 短期预测结果集
    * @param capacity                   装机容量
    */
-  private List<ForecastPowerUltraShortTerm> executeForecastForWind(final List<ForecastPowerShortTerm> forecastPowerShortTermList, final BigDecimal capacity,String stationCode) {
+  private List<ForecastPowerUltraShortTerm> executeForecastForWind(final List<ForecastPowerShortTerm> forecastPowerShortTermList, final BigDecimal capacity, String stationCode) {
     List<ForecastPowerUltraShortTerm> forecastPowerUltraShortTermList = new ArrayList<>();
     ForecastPowerUltraShortTerm forecastPowerUltraShortTerm;
     //获取系统参数cdqjsfs,超短期计算方式,0为默认乘系数的方式,1为根据可用功率计算的方式
-    String cdqjsfs = electricFieldService.getSysParameter("cdqjsfs", "1",stationCode);
+    String cdqjsfs = electricFieldService.getSysParameter("cdqjsfs", "1", stationCode);
     log.info("参数cdqjsfs值为:" + cdqjsfs + ",超短期计算方式,0为默认乘系数的方式,1为根据可用功率计算的方式。");
-    BigDecimal stPower, ustPower,ustPowers;
+    BigDecimal stPower, ustPower, ustPowers;
     // 判断查询可用功率结果是否为空,如果不为空根据平均可用功率与短期预测结果的偏差值进行计算超短期结果,否则超短期=短期*随机系数
     // 查询当前时间点标记时间前10分钟的可用功率
     ForecastPowerShortTerm currentForecastPowerShortTerm = forecastPowerShortTermList.get(0);
     Date currentTime = new Date(currentForecastPowerShortTerm.getForecastTime());
     Date startTime = DateUtils.addMinutes(currentTime, -10);
     Date endTime = DateUtils.addMinutes(currentTime, 1);
-    List<PowerStationStatusData> powerStationStatusDataList = this.powerStationStatusDataRepository.findByTimeBetweenAndStationCode(startTime, endTime,stationCode);
+    List<PowerStationStatusData> powerStationStatusDataList = this.powerStationStatusDataRepository.findByTimeBetweenAndStationCode(startTime, endTime, stationCode);
     List<PowerStationStatusData> filterList = powerStationStatusDataList.stream().filter(t -> t.getAbleValue().compareTo(new BigDecimal("-1")) == 1).collect(Collectors.toList());
-    String coe = super.getSysParameter("CDQ_COE", "1.05",stationCode);
+    String coe = super.getSysParameter("CDQ_COE", "1.05", stationCode);
 
     Long monentTime = 0L;
     try {
       monentTime = DateMomentUtil.getMomentTime(new Date().getTime(), 1, 15 * 60 * 1000L);
     } catch (Exception e) {
-      log.error("获取当前时刻错误",e);
+      log.error("获取当前时刻错误", e);
     }
     if (filterList.size() > 0) {
       BigDecimal sumAbleValue = filterList.stream().map(PowerStationStatusData::getAbleValue)
@@ -338,9 +338,9 @@ public class ForecastPowerUltraShortTermService extends BaseService {
           forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E4);
         } else {
           BigDecimal xzjdq = deviationValue.add(stPower).setScale(2, BigDecimal.ROUND_HALF_UP);
-          String cdqjsfsZbxz = electricFieldService.getSysParameter("cdqjsfsZbxz", "0.4",stationCode);
+          String cdqjsfsZbxz = electricFieldService.getSysParameter("cdqjsfsZbxz", "0.4", stationCode);
           log.debug("参数cdqjsfsZbxz值为:" + cdqjsfsZbxz + ",超短期计算方式,可用和短期的差值加短期占比。");
-          String cdqjsfsZbdq = electricFieldService.getSysParameter("cdqjsfsZbdq", "0.6",stationCode);
+          String cdqjsfsZbdq = electricFieldService.getSysParameter("cdqjsfsZbdq", "0.6", stationCode);
           log.debug("参数cdqjsfsZbdq值为:" + cdqjsfsZbdq + ",超短期计算方式,短期占比。");
           ustPower = xzjdq.multiply(new BigDecimal(cdqjsfsZbxz)).setScale(2, BigDecimal.ROUND_HALF_UP).add(stPower.multiply(new BigDecimal(cdqjsfsZbdq)).setScale(2, BigDecimal.ROUND_HALF_UP));
           if (ustPower.doubleValue() > capacity.doubleValue()) {
@@ -349,11 +349,11 @@ public class ForecastPowerUltraShortTermService extends BaseService {
           } else if (ustPower.doubleValue() < 0) {
             // 如果超短期结果小于0,则超短期结果为0
             forecastPowerUltraShortTerm.setFpValue(BigDecimal.ZERO);
-          }else{
-            if(cdqjsfs.equals("1")){
+          } else {
+            if (cdqjsfs.equals("1")) {
               forecastPowerUltraShortTerm.setFpValue(ustPower);
               forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E5);
-            }else{
+            } else {
               forecastPowerUltraShortTerm.setFpValue(ustPowers);
               forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E9);
             }
@@ -375,7 +375,7 @@ public class ForecastPowerUltraShortTermService extends BaseService {
         forecastPowerUltraShortTerm.setForecastTime(forecastPowerShortTermList.get(i).getForecastTime());
         forecastPowerUltraShortTerm.setPredictionModelEnum(PredictionModelEnum.E9);
         forecastPowerUltraShortTerm.setCoefficientValue(ustPower);
-        forecastPowerUltraShortTerm.setDifferenceValue(new BigDecimal(-0.99).setScale(2,BigDecimal.ROUND_HALF_UP));
+        forecastPowerUltraShortTerm.setDifferenceValue(new BigDecimal(-0.99).setScale(2, BigDecimal.ROUND_HALF_UP));
         forecastPowerUltraShortTerm.setFpValue(ustPower);
         forecastPowerUltraShortTerm.setGenDate(new Date(monentTime));
         forecastPowerUltraShortTerm.setStationCode(stationCode);
@@ -383,15 +383,107 @@ public class ForecastPowerUltraShortTermService extends BaseService {
       }
     }
     // 保存超短期预测结果
-    this.forecastPowerUltraShortTermRepository.deleteByForecastTimeBetweenAndStationCode(forecastPowerShortTermList.get(1).getForecastTime(), forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime(),stationCode);
+    this.forecastPowerUltraShortTermRepository.deleteByForecastTimeBetweenAndStationCode(forecastPowerShortTermList.get(1).getForecastTime(), forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime(), stationCode);
     this.forecastPowerUltraShortTermRepository.saveAll(forecastPowerUltraShortTermList);
 
     return forecastPowerUltraShortTermList;
   }
 
-  private void executeForecastForlight(final List<ForecastPowerShortTerm> forecastPowerShortTermList, final BigDecimal capacity,String stationCode) {
+  private void executeForecastForlight(final List<ForecastPowerShortTerm> forecastPowerShortTermList, final BigDecimal capacity, String stationCode) {
     // 暂时光超短期预测方法=风超短期预测方法
-    this.executeForecastForWind(forecastPowerShortTermList, capacity,stationCode);
+    this.executeForecastForWind(forecastPowerShortTermList, capacity, stationCode);
+  }
+
+
+  /**
+   * 根据提前多久,开始结束时间查询历史超短期 yh
+   *
+   * @param startTime 开始时间
+   * @param endTime   结束时间
+   * @param ago       提前多久预测
+   * @return 结果集
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByForecastTimeBetweenAndForecastHowLongAgoOrderByForecastTime(Long startTime, Long endTime, Integer ago) {
+    Map<String, Object> map = new HashMap<>();
+    List<ForecastPowerUltraShortTermHis> list = forecastPowerUltraShortTermHisRepository.findByForecastTimeBetweenAndForecastHowLongAgo(startTime, endTime, ago);
+    list.sort(Comparator.comparing(ForecastPowerUltraShortTermHis::getForecastTime));
+    long timeStep = 900000L;
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    List<String> times = new ArrayList<>();
+    List<Float> datas = new ArrayList<>();
+    if (startTime % timeStep != 0) {
+      startTime = startTime - (startTime % timeStep) + timeStep;
+    }
+    if (list != null && list.size() > 0) {
+      for (Long i = startTime; i < endTime; i = i + timeStep) {
+        long finalI = i;
+        List<ForecastPowerUltraShortTermHis> filterList = list.stream().filter(t -> t.getForecastTime() == finalI).collect(Collectors.toList());
+        if (filterList != null && filterList.size() > 0) {
+          datas.add(filterList.get(0).getAbleValue().floatValue());
+        } else {
+          datas.add(null);
+        }
+
+        times.add(sdf.format(new Date(finalI)));
+      }
+    }
+    map.put("times", times);
+    map.put("datas", datas);
+
+    return map;
+
   }
 
+  /**
+   * 超短期查询16个点数据 tl
+   *
+   * @param startTime 开始时间
+   * @return 结果集
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public Map<String, Object> findByForecastRealTimeUltraShortTerm16(Long startTime, String stationCode) {
+    Long endTime = startTime + 60 * 60 * 1000 * 24;
+//    List<Map<String,Object>> valueList16 = new ArrayList<>();
+    //取出16点数据存入集合中
+    Map<String, Object> realPowerMap = new HashMap<>();
+    List<ForecastPowerUltraShortTermHis> forecastPowerUltraShortTermHisList = forecastPowerUltraShortTermHisRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
+    for (int p = 1; p <= 16; p++) {
+
+      int finalP = p;
+      List<ForecastPowerUltraShortTermHis> filterList = forecastPowerUltraShortTermHisList.stream().filter(t -> t.getForecastHowLongAgo() == finalP).collect(Collectors.toList());
+
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      long timeStep = 900000L;
+      if (startTime % timeStep != 0) {
+        startTime = startTime - (startTime % timeStep);
+      }
+      List<Float> ableDatas = new ArrayList<>();
+      List<String> times = new ArrayList<>();
+
+      for (long i = startTime; i < endTime; i = i + 900000L) {
+        long finalI = i;
+        List<ForecastPowerUltraShortTermHis> p1 = filterList.stream().filter(t -> t.getForecastTime() == finalI).collect(Collectors.toList());
+        if (p1 != null && p1.size() > 0) {
+
+          if (p1.get(0).getAbleValue().compareTo(new BigDecimal(-99)) == 0) {
+            ableDatas.add(0f);
+          } else {
+            ableDatas.add(p1.get(0).getAbleValue().floatValue());
+          }
+        } else {
+          ableDatas.add(null);
+        }
+      }
+      realPowerMap.put("value" + p, ableDatas);
+    }
+
+    //Map<String, Object> map = powerStationStatusDataService.findByTimeBetweenForContrast(new Date(startTime), new Date(endTime), 900000l);
+    Map<String, Object> map = new HashMap<>();
+    ElectricField electricField = electricFieldService.getSingleStation(stationCode);
+    map.put("value", realPowerMap);
+    map.put("capacity", electricField.getCapacity());
+    return map;
+
+  }
 }

+ 178 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ReceiveDataService.java

@@ -0,0 +1,178 @@
+package com.jiayue.ipfcst.console.service;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.jiayue.ipfcst.common.core.exception.BusinessException;
+import com.jiayue.ipfcst.common.core.util.DateTimeUtil;
+import com.jiayue.ipfcst.common.data.entity.*;
+import com.jiayue.ipfcst.common.data.repository.InverterStatusDataRepository;
+import com.jiayue.ipfcst.common.data.repository.WeatherStationStatusDataRepository;
+import com.jiayue.ipfcst.common.data.repository.WindTowerStatusDataRepository;
+import com.jiayue.ipfcst.common.data.repository.WindTurbineStatusDataRepository;
+import com.jiayue.ipfcst.console.dto.ResponseResults;
+import com.jiayue.ipfcst.console.dto.ResponseRows;
+import com.jiayue.ipfcst.console.util.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 接收数据service类
+ *
+ * @author whc
+ */
+@Service
+@Slf4j
+public class ReceiveDataService {
+  @Autowired
+  ElectricFieldService electricFieldService;
+  @Autowired
+  WindTowerInfoService windTowerInfoService;
+  @Autowired
+  WindTurbineInfoService windTurbineInfoService;
+  @Autowired
+  WeatherStationInfoService weatherStationInfoService;
+  @Autowired
+  InverterInfoService inverterInfoService;
+  @Autowired
+  DataPointService dataPointService;
+  @Autowired
+  WeatherStationStatusDataRepository weatherStationStatusDataRepository;
+  @Autowired
+  InverterStatusDataRepository inverterStatusDataRepository;
+  @Autowired
+  WindTurbineStatusDataRepository windTurbineStatusDataRepository;
+  @Autowired
+  WindTowerStatusDataRepository windTowerStatusDataRepository;
+  @Autowired
+  RedisUtils redisUtils;
+  @Autowired
+  EquipmentAttributeService equipmentAttributeService;
+
+
+  public void receive() {
+    List<ElectricField> electricFieldList = electricFieldService.getAll();
+    //每个场站请求一次
+    for (ElectricField electricField : electricFieldList) {
+      log.info(electricField.getName() + "开始请求数据");
+      Long startTime = DateTimeUtil.getCurrentTimeForMinute().getTime();
+      Long endTime = startTime + 60000L;
+      try {
+        //通用查询
+        if (electricField.getElectricFieldTypeEnum().getCode() == 1) {
+          //气象站
+          List<WeatherStationInfo> weatherStationInfoList = weatherStationInfoService.get(electricField.getStationCode());
+          //逆变器
+          List<InverterInfo> inverterInfoList = inverterInfoService.getByStationCode(electricField.getStationCode());
+          //按设备请求
+          for (WeatherStationInfo weatherStationInfo : weatherStationInfoList) {
+            HashMap<String, Object> paramMap = new HashMap<>();
+            paramMap.put("deviceIds", weatherStationInfo.getEquipmentNo());
+            paramMap.put("startTime", startTime);
+            paramMap.put("endTime", endTime);
+            String body = HttpUtil.post("https://10.220.57.13:7085/dataService/v1/getTaosData", paramMap);
+            AnalysisData(body, weatherStationInfo.getId(), weatherStationInfo.getEquipmentType().getCode(), electricField);
+          }
+          for (InverterInfo inverterInfo : inverterInfoList) {
+            HashMap<String, Object> paramMap = new HashMap<>();
+            paramMap.put("deviceIds", inverterInfo.getEquipmentNo());
+            paramMap.put("startTime", startTime);
+            paramMap.put("endTime", endTime);
+            String body = HttpUtil.post("https://10.220.57.13:7085/dataService/v1/getTaosData", paramMap);
+            AnalysisData(body, inverterInfo.getId(), inverterInfo.getEquipmentType().getCode(), electricField);
+          }
+        } else {
+          //测风塔
+          List<WindTowerInfo> windTowerInfoList = windTowerInfoService.get(electricField.getStationCode());
+          //风机
+          List<WindTurbineInfo> windTurbineInfoList = windTurbineInfoService.getByStationCode(electricField.getStationCode());
+          for (WindTowerInfo windTowerInfo : windTowerInfoList) {
+            HashMap<String, Object> paramMap = new HashMap<>();
+            paramMap.put("deviceIds", windTowerInfo.getEquipmentNo());
+            paramMap.put("startTime", startTime);
+            paramMap.put("endTime", endTime);
+            String body = HttpUtil.post("https://10.220.57.13:7085/dataService/v1/getTaosData", paramMap);
+            AnalysisData(body, windTowerInfo.getId(), windTowerInfo.getEquipmentType().getCode(), electricField);
+          }
+          for (WindTurbineInfo windTurbineInfo : windTurbineInfoList) {
+            HashMap<String, Object> paramMap = new HashMap<>();
+            paramMap.put("deviceIds", windTurbineInfo.getEquipmentNo());
+            paramMap.put("startTime", startTime);
+            paramMap.put("endTime", endTime);
+            String body = HttpUtil.post("https://10.220.57.13:7085/dataService/v1/getTaosData", paramMap);
+            AnalysisData(body, windTurbineInfo.getId(), windTurbineInfo.getEquipmentType().getCode(), electricField);
+          }
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  /**
+   * 解析数据
+   *
+   * @param boby          所有数据
+   * @param equipmentId   设备id
+   * @param equipmentType 设备类型
+   * @param electricField 场站对象
+   */
+  public void AnalysisData(String boby, Integer equipmentId, Integer equipmentType, ElectricField electricField) throws BusinessException {
+    List<DataPoint> dataPointList = dataPointService.getByEquipmentType(equipmentType);
+    JSONObject jsonObject = JSONUtil.parseObj(boby);
+    ResponseResults results = (ResponseResults) jsonObject.get("results");
+    ResponseRows rows = results.getRows();
+    String[] value = rows.getValues();
+    String[] sensorIds = results.getSensorIds();
+    Map<String, String> map = new HashMap<>();
+    map.put("equipmentNo", equipmentId.toString());
+    map.put("time", new Date(rows.getTimestamp()).toString());
+    for (DataPoint dataPoint : dataPointList) {
+      for (int i = 0; i < sensorIds.length; i++) {
+        if (dataPoint.getMeasuringPoint().equals(sensorIds[i])) {
+          map.put(dataPoint.getEquipmentAttribute().getFieldName(), value[i]);
+        }
+      }
+    }
+    //光
+    if (electricField.getElectricFieldTypeEnum().getCode() == 1) {
+      WeatherStationInfo weatherStationInfo = weatherStationInfoService.get(equipmentId);
+      if (weatherStationInfo != null) {
+        redisUtils.hmset("qxz-" + electricField.getStationCode() + "-" + equipmentId, map);
+        WeatherStationStatusData weatherStationStatusData = JSON.parseObject(JSON.toJSONString(map), WeatherStationStatusData.class);
+        weatherStationStatusDataRepository.save(weatherStationStatusData);
+      } else {
+        InverterInfo inverterInfo = inverterInfoService.get(equipmentId);
+        if (inverterInfo != null) {
+          redisUtils.hmset("nbq-" + electricField.getStationCode() + "-" + equipmentId, map);
+          InverterStatusData inverterStatusData = JSON.parseObject(JSON.toJSONString(map), InverterStatusData.class);
+          inverterStatusDataRepository.save(inverterStatusData);
+        }
+      }
+    } else {
+      //风
+      WindTurbineInfo windTurbineInfo = windTurbineInfoService.get(equipmentId);
+      if (windTurbineInfo != null) {
+        redisUtils.hmset("fj-" + electricField.getStationCode() + "-" + equipmentId, map);
+        WindTurbineStatusData windTurbineStatusData = JSON.parseObject(JSON.toJSONString(map), WindTurbineStatusData.class);
+        windTurbineStatusDataRepository.save(windTurbineStatusData);
+      } else {
+        WindTowerInfo windTowerInfo = windTowerInfoService.get(equipmentId);
+        if (windTowerInfo != null) {
+          redisUtils.hmset("cft-" + electricField.getStationCode() + "-" + equipmentId, map);
+          WindTowerStatusData windTowerStatusData = JSON.parseObject(JSON.toJSONString(map), WindTowerStatusData.class);
+          windTowerStatusDataRepository.save(windTowerStatusData);
+        }
+      }
+
+    }
+  }
+
+}

+ 17 - 0
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/WindTowerInfoService.java

@@ -3,6 +3,7 @@ package com.jiayue.ipfcst.console.service;
 import com.jiayue.ipfcst.common.core.exception.BusinessException;
 import com.jiayue.ipfcst.common.data.entity.WeatherStationInfo;
 import com.jiayue.ipfcst.common.data.entity.WindTowerInfo;
+import com.jiayue.ipfcst.common.data.entity.WindTurbineInfo;
 import com.jiayue.ipfcst.common.data.repository.WindTowerInfoRepository;
 import com.jiayue.ipfcst.common.data.service.BaseService;
 import lombok.extern.slf4j.Slf4j;
@@ -101,6 +102,22 @@ public class WindTowerInfoService extends BaseService {
     return resultList.stream().sorted(Comparator.comparing(WindTowerInfo::getStationCode)).collect(Collectors.toList());
   }
 
+  /**
+   * 查询测风塔
+   *
+   * @param no 测风塔编号
+   * @return 测风塔
+   * @throws BusinessException 业务异常
+   */
+  @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+  public WindTowerInfo get(final Integer no) throws BusinessException {
+    Optional<WindTowerInfo> optional = this.windTowerInfoRepository.findById(no);
+    if (optional.isPresent()) {
+      return optional.get();
+    } else {
+      throw new BusinessException("测风塔不存在!");
+    }
+  }
 
   /**
    * 获取到所有的测风塔   create by xiuwei

+ 3 - 3
ipfcst-console/src/main/resources/application.yml

@@ -7,9 +7,9 @@ server:
     key-store-type: JKS
 spring:
   redis:
-    host: 127.0.0.1
+    host: 192.168.1.205
     port: 6379
-    password: 'jiayue'
+    password: jiayue
     maxIdle: 10
     maxTotal: 30
     maxWaitMillis: 1500
@@ -38,7 +38,7 @@ spring:
       # 数据源配置
       username: root
       password: '!QAZ2root'
-      url: jdbc:mysql://127.0.0.1:3306/focus?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+      url: jdbc:mysql://localhost:3306/focus?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
       driver-class-name: com.mysql.cj.jdbc.Driver
       # 初始化 最小 最大
       initial-size: 10

+ 40 - 0
ipfcst-console/src/main/resources/sql/t_data_point.sql

@@ -0,0 +1,40 @@
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.PwrAt.Ra.F32', '2', 3100);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.PwrReact.Ra.F32', '2', 3101);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.PF.Ra.F32', '2', 3102);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.DC.Ra.F32', '2', 3104);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.Other.Ra.F32.day', '2', 3105);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.TotEgyAt.Wt.F32', '2', 3107);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('SC.TurSt.Rs.S.QH', '2', 3099);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.Temp.Ra.F32', '1', 1105);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.Hum.Ra.F32', '1', 1107);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.Pres.Ra.F32', '1', 1106);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.Wdir.Ra.F32', '1', 1110);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.WSpd.Ra.F32', '1', 1109);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.TRadio.Ra.F32', '1', 1101);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.DRadio.Ra.F32', '1', 1102);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.SRadio.Ra.F32', '1', 1103);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.SSHour.Ra.F32.day', '1', 1111);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.TRadio.Ra.F32.day', '1', 1112);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.DRadio.Ra.F32.day', '1', 1113);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.SRadio.Ra.F32.day', '1', 1114);
+INSERT INTO t_data_point (C_MEASURING_POINT, C_EQUIPMENT_TYPE, C_EQUIPMENT_ATTRIBUTE_ID)
+VALUES ('MELT.Bool.Rd.b0.0004', '1', 1100;

+ 284 - 0
ipfcst-console/src/main/resources/sql/t_equipment_attribute.sql

@@ -0,0 +1,284 @@
+ALTER TABLE t_equipment_attribute MODIFY COLUMN `C_EXPLANATION` varchar(50) DEFAULT NULL;
+ALTER TABLE t_equipment_attribute MODIFY COLUMN  `C_FIELD_NAME` varchar(90) DEFAULT NULL;
+ALTER TABLE t_equipment_attribute MODIFY COLUMN `C_MEASUREMENT_UNITS` varchar(5) DEFAULT NULL;
+ALTER TABLE t_equipment_attribute MODIFY COLUMN `C_EQUIPMENT_TYPE` varchar(200) DEFAULT NULL;
+ALTER TABLE t_equipment_attribute MODIFY COLUMN `C_STATION_CODE` varchar(255) DEFAULT NULL;
+ALTER TABLE t_equipment_attribute MODIFY COLUMN C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM VARCHAR ( 200 ) DEFAULT NULL;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 97, '系统自动判断是否限电', 'isRationingByAutoControl', '', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 97) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 98, '人工判断是否限电', 'isRationingByManualControl', '', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 98) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 99, '场站状态', 'status', '', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 99) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 100, '实际功率', 'realValue', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 101, '可用功率', 'ableValue', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 102, '理论功率', 'theoryValue', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 103, '开机容量', 'openCapacity', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 104, '装机容量', 'capacity', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 105, '站内受阻功率', 'onSiteObstructed', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 106, '站外受阻功率', 'offSiteObstructed', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 107, '并网设备数', 'onGridNum', '', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 108, '样板机理论功率', 'referencePowerBySample', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 108) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 109, '测风/光法理论功率', 'referencePowerByMeasuring', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 109) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 112, '样板机可用功率', 'ablePowerBySample', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 112) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 113, '测风/光法可用功率', 'ablePowerByMeasuring', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 113) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 110, '日发电量', 'dailyOutPut', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 110) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 111, '日上网电量', 'dailyGridOutPut', 'MW', 'POWERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 111) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 190, '备用字段1', 'data1', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 190) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 191, '备用字段2', 'data2', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 191) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 192, '备用字段3', 'data3', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 192) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 193, '备用字段4', 'data4', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 193) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 194, '备用字段5', 'data5', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 194) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 195, '备用字段6', 'data6', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 195) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 196, '备用字段7', 'data7', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 196) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 197, '备用字段8', 'data8', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 197) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 198, '备用字段9', 'data9', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 198) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 199, '备用字段10', 'data10', '', 'POWERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 199) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1100, '状态', 'status', '', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1101, '总辐射', 'globalR', 'W/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1102, '直辐射', 'directR', 'W/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1103, '散辐射', 'diffuseR', 'W/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1104, '斜面辐射', 'obliqueR', 'W/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1105, '环境温度', 'airT', '℃', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1106, '气压', 'p', 'KPa', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1107, '湿度', 'rh', '%', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1108, '光伏电池板温度', 'cellT', '℃', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1108) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1109, '风速', 'ws', 'm/s', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1109) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1110, '风向', 'wd', '°', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1110) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1111, '日照小时数', 'hourDA', '', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1111) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1112, '总辐射日累计', 'globalRDA', 'MJ/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1112) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1113, '直辐射日累计', 'directRDA', 'MJ/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1113) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1114, '散射辐射日累计', 'diffuseRDA', 'MJ/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1114) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1115, '斜面辐射日累计', 'obliqueRDA', 'MJ/㎡', 'WEATHERSTATION',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1115) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1990, '备用字段1', 'data1', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1990) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1991, '备用字段2', 'data2', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1991) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1992, '备用字段3', 'data3', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1992) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1993, '备用字段4', 'data4', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1993) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1994, '备用字段5', 'data5', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1994) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1995, '备用字段6', 'data6', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1995) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1996, '备用字段7', 'data7', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1996) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1997, '备用字段8', 'data8', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1997) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1998, '备用字段9', 'data9', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1998) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 1999, '备用字段10', 'data10', '', 'WEATHERSTATION',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 1999) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2099, '状态', 'status', '', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2099) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2100, '有功', 'activePower', 'kW', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2101, '无功', 'reactivePower', 'kVar', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2102, '功率因数', 'powerFactor', '', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2103, '电压', 'voltage', 'V', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2104, '电流', 'electricalCurrent', 'A', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2105, '当日发电量', 'dayElectricQuantity', 'kW·h', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2106, '当日并网小时数', 'dayGridConnectedHours', '', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2107, '转速', 'windWheelRatedSpeed', 'rpm', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2108, '风速', 'ws', 'm/s', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2108) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2109, '风向', 'wd', '°', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2109) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2110, '温度', 't', '℃', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2110) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2111, '桨距角', 'pitchAngle', '°', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2111) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2112, '累积发电量', 'cumulativeGeneratedEnergy', 'MW·h', 'WINDTURBINE',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2112) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2990, '备用字段1', 'data1', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2990) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2991, '备用字段2', 'data2', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2991) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2992, '备用字段3', 'data3', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2992) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2993, '备用字段4', 'data4', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2993) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2994, '备用字段5', 'data5', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2994) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2995, '备用字段6', 'data6', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2995) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2996, '备用字段7', 'data7', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2996) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2997, '备用字段8', 'data8', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2997) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2998, '备用字段9', 'data9', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2998) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 2999, '备用字段10', 'data10', '', 'WINDTURBINE',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 2999) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3099, '状态', 'status', '', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3099) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3100, '有功', 'activePower', 'kW', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3101, '无功', 'reactivePower', 'kVar', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3102, '功率因数', 'powerFactor', '', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3103, '电压', 'voltage', 'V', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3104, '电流', 'electricalCurrent', 'A', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3105, '当日发电量', 'dayElectricQuantity', 'kW·h', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3106, '当日并网小时数', 'dayGridConnectedHours', '', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3107, '累积发电量', 'cumulativeGeneratedEnergy', 'MW·h', 'INVERTER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3990, '备用字段1', 'data1', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3990) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3991, '备用字段2', 'data2', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3991) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3992, '备用字段3', 'data3', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3992) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3993, '备用字段4', 'data4', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3993) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3994, '备用字段5', 'data5', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3994) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3995, '备用字段6', 'data6', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3995) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3996, '备用字段7', 'data7', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3996) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3997, '备用字段8', 'data8', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3997) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3998, '备用字段9', 'data9', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3998) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 3999, '备用字段10', 'data10', '', 'INVERTER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 3999) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4100, '运行状态', 'status', '', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4101, '瞬时温度', 'tInst', '℃', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4102, '最大温度', 'tMax', '℃', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4103, '最小温度', 'tMin', '℃', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4104, '平均温度', 'tAve', '℃', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4105, '温度标准差', 'tSta', '℃', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4106, '瞬时湿度', 'rhInst', '%', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4107, '最大湿度', 'rhMax', '%', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4108, '最小湿度', 'rhMin', '%', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4108) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4109, '平均湿度', 'rhAve', '%', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4109) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4110, '湿度标准差', 'rhSta', '%', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4110) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4111, '瞬时气压', 'paInst', 'KPa', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4111) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4112, '最大气压', 'paMax', 'KPa', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4112) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4113, '最小气压', 'paMin', 'KPa', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4113) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4114, '平均气压', 'paAve', 'KPa', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4114) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4115, '气压标准差', 'paSta', 'KPa', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4115) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4116, '10米瞬时风速', 'wsInst10', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4116) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4117, '10米最大风速', 'wsMax10', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4117) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4118, '10米最小风速', 'wsMin10', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4118) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4119, '10米平均风速', 'wsAve10', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4119) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4120, '10米风速标准差', 'wsSta10', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4120) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4121, '10米瞬时风向', 'wdInst10', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4121) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4122, '10米最大风向', 'wdMax10', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4122) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4123, '10米最小风向', 'wdMin10', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4123) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4124, '10米平均风向', 'wdAve10', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4124) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4125, '10米风向标准差', 'wdSta10', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4125) ;
+/*INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4126, '20米瞬时风速', 'wsInst20', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4126) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4127, '20米最大风速', 'wsMax20', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4127) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4128, '20米最小风速', 'wsMin20', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4128) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4129, '20米平均风速', 'wsAve20', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4129) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4130, '20米风速标准差', 'wsSta20', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4130) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4131, '20米瞬时风向', 'wdInst20', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4131) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4132, '20米最大风向', 'wdMax20', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4132) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4133, '20米最小风向', 'wdMin20', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4133) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4134, '20米平均风向', 'wdAve20', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4134) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4135, '20米风向标准差', 'wdSta20', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4135) ;*/
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4136, '30米瞬时风速', 'wsInst30', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4136) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4137, '30米最大风速', 'wsMax30', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4137) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4138, '30米最小风速', 'wsMin30', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4138) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4139, '30米平均风速', 'wsAve30', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4139) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4140, '30米风速标准差', 'wsSta30', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4140) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4141, '30米瞬时风向', 'wdInst30', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4141) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4142, '30米最大风向', 'wdMax30', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4142) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4143, '30米最小风向', 'wdMin30', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4143) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4144, '30米平均风向', 'wdAve30', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4144) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4145, '30米风向标准差', 'wdSta30', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4145) ;
+/*INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4146, '40米瞬时风速', 'wsInst40', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4146) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4147, '40米最大风速', 'wsMax40', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4147) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4148, '40米最小风速', 'wsMin40', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4148) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4149, '40米平均风速', 'wsAve40', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4149) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4150, '40米风速标准差', 'wsSta40', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4150) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4151, '40米瞬时风向', 'wdInst40', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4151) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4152, '40米最大风向', 'wdMax40', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4152) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4153, '40米最小风向', 'wdMin40', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4153) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4154, '40米平均风向', 'wdAve40', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4154) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4155, '40米风向标准差', 'wdSta40', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4155) ;*/
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4156, '50米瞬时风速', 'wsInst50', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4156) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4157, '50米最大风速', 'wsMax50', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4157) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4158, '50米最小风速', 'wsMin50', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4158) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4159, '50米平均风速', 'wsAve50', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4159) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4160, '50米风速标准差', 'wsSta50', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4160) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4161, '50米瞬时风向', 'wdInst50', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4161) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4162, '50米最大风向', 'wdMax50', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4162) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4163, '50米最小风向', 'wdMin50', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4163) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4164, '50米平均风向', 'wdAve50', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4164) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4165, '50米风向标准差', 'wdSta50', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4165) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4166, '60米瞬时风速', 'wsInst60', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4166) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4167, '60米最大风速', 'wsMax60', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4167) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4168, '60米最小风速', 'wsMin60', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4168) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4169, '60米平均风速', 'wsAve60', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4169) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4170, '60米风速标准差', 'wsSta60', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4170) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4171, '60米瞬时风向', 'wdInst60', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4171) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4172, '60米最大风向', 'wdMax60', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4172) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4173, '60米最小风向', 'wdMin60', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4173) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4174, '60米平均风向', 'wdAve60', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4174) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4175, '60米风向标准差', 'wdSta60', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4175) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4176, '70米瞬时风速', 'wsInst70', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4176) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4177, '70米最大风速', 'wsMax70', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4177) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4178, '70米最小风速', 'wsMin70', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4178) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4179, '70米平均风速', 'wsAve70', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4179) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4180, '70米风速标准差', 'wsSta70', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4180) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4181, '70米瞬时风向', 'wdInst70', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4181) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4182, '70米最大风向', 'wdMax70', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4182) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4183, '70米最小风向', 'wdMin70', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4183) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4184, '70米平均风向', 'wdAve70', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4184) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4185, '70米风向标准差', 'wdSta70', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4185) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4186, '80米瞬时风速', 'wsInst80', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4186) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4187, '80米最大风速', 'wsMax80', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4187) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4188, '80米最小风速', 'wsMin80', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4188) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4189, '80米平均风速', 'wsAve80', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4189) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4190, '80米风速标准差', 'wsSta80', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4190) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4191, '80米瞬时风向', 'wdInst80', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4191) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4192, '80米最大风向', 'wdMax80', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4192) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4193, '80米最小风向', 'wdMin80', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4193) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4194, '80米平均风向', 'wdAve80', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4194) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4195, '80米风向标准差', 'wdSta80', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4195) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4196, '90米瞬时风速', 'wsInst90', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4196) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4197, '90米最大风速', 'wsMax90', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4197) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4198, '90米最小风速', 'wsMin90', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4198) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4199, '90米平均风速', 'wsAve90', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4199) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4200, '90米风速标准差', 'wsSta90', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4200) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4201, '90米瞬时风向', 'wdInst90', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4201) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4202, '90米最大风向', 'wdMax90', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4202) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4203, '90米最小风向', 'wdMin90', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4203) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4204, '90米平均风向', 'wdAve90', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4204) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4205, '90米风向标准差', 'wdSta90', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4205) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4206, '100米瞬时风速', 'wsInst100', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4206) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4207, '100米最大风速', 'wsMax100', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4207) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4208, '100米最小风速', 'wsMin100', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4208) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4209, '100米平均风速', 'wsAve100', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4209) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4210, '100米风速标准差', 'wsSta100', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4210) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4211, '100米瞬时风向', 'wdInst100', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4211) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4212, '100米最大风向', 'wdMax100', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4212) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4213, '100米最小风向', 'wdMin100', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4213) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4214, '100米平均风向', 'wdAve100', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4214) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4215, '100米风向标准差', 'wdSta100', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4215) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4216, '110米瞬时风速', 'wsInst110', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4216) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4217, '110米最大风速', 'wsMax110', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4217) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4218, '110米最小风速', 'wsMin110', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4218) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4219, '110米平均风速', 'wsAve110', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4219) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4220, '110米风速标准差', 'wsSta110', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4220) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4221, '110米瞬时风向', 'wdInst110', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4221) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4222, '110米最大风向', 'wdMax110', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4222) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4223, '110米最小风向', 'wdMin110', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4223) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4224, '110米平均风向', 'wdAve110', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4224) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4225, '110米风向标准差', 'wdSta110', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4225) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4226, '轮毂高瞬时风速', 'wsInstHubHeight', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4226) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4227, '轮毂高最大风速', 'wsMaxHubHeight', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4227) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4228, '轮毂高最小风速', 'wsMinHubHeight', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4228) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4229, '轮毂高平均风速', 'wsAveHubHeight', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4229) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4230, '轮毂高风速标准差', 'wsStaHubHeight', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4230) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4231, '轮毂高瞬时风向', 'wdInstHubHeight', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4231) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4232, '轮毂高最大风向', 'wdMaxHubHeight', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4232) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4233, '轮毂高最小风向', 'wdMinHubHeight', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4233) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4234, '轮毂高平均风向', 'wdAveHubHeight', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4234) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4235, '轮毂高风向标准差', 'wdStaHubHeight', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4235) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4236, '空气密度', 'airDensity', 'Kg/m³', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4236) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4237, '120米瞬时风速', 'wsInst120', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4237) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4238, '120米最大风速', 'wsMax120', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4238) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4239, '120米最小风速', 'wsMin120', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4239) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4240, '120米平均风速', 'wsAve120', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4240) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4241, '120米风速标准差', 'wsSta120', 'm/s', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4241) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4242, '120米瞬时风向', 'wdInst120', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4242) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4243, '120米最大风向', 'wdMax120', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4243) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4244, '120米最小风向', 'wdMin120', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4244) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4245, '120米平均风向', 'wdAve120', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4245) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4246, '120米风向标准差', 'wdSta120', '°', 'WINDTOWER',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4246) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4990, '备用字段1', 'data1', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4990) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4991, '备用字段2', 'data2', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4991) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4992, '备用字段3', 'data3', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4992) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4993, '备用字段4', 'data4', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4993) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4994, '备用字段5', 'data5', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4994) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4995, '备用字段6', 'data6', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4995) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4996, '备用字段7', 'data7', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4996) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4997, '备用字段8', 'data8', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4997) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4998, '备用字段9', 'data9', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4998) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 4999, '备用字段10', 'data10', '', 'WINDTOWER',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 4999) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6100, '全场出力上限', 'upperLimitOfWholeStation', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6100) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6101, '全厂出力下限', 'lowerLimitOfWholeStation', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6101) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6102, '全场响应速率', 'speedRateOfWholeStation', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6102) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6103, '全场目标定值返回值', 'targetValueOfWholeStation', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6103) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6104, 'AGC投/退', 'AGCOnOrOff', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6104) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6105, 'AGC远方/就地', 'AGCRemoteOrOnTheSpot', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6105) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6106, 'AGC增出力闭锁', 'AGCIncreaseOutputAtresia', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6106) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6107, 'AGC减出力闭锁', 'AGCDecreaseOutputAtresia', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6107) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6108, '升压变高压侧母线电压上限值', 'upperLimitOfBoosterHighPressureSideBusVoltage', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6108) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6109, '升压变高压侧母线电压下限值', 'lowerLimitOfBoosterHighPressureSideBusVoltage', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6109) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6110, 'AVC投/退', 'AVCOnOrOff', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6110) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6111, 'AVC远方/就地', 'AVCRemoteOrOnTheSpot', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6111) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6112, 'AVC增出力闭锁', 'AVCIncreaseOutputAtresia', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6112) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6113, 'AVC减出力闭锁', 'AVCDecreaseOutputAtresia', NULL, 'AGC_AVC',  NULL, 'INVARIANT' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6113) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6990, '备用字段1', 'data1', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6990) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6991, '备用字段2', 'data2', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6991) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6992, '备用字段3', 'data3', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6992) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6993, '备用字段4', 'data4', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6993) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6994, '备用字段5', 'data5', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6994) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6995, '备用字段6', 'data6', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6995) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6996, '备用字段7', 'data7', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6996) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6997, '备用字段8', 'data8', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6997) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6998, '备用字段9', 'data9', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6998) ;
+INSERT INTO t_equipment_attribute(C_ID,C_EXPLANATION,C_FIELD_NAME,C_MEASUREMENT_UNITS,C_EQUIPMENT_TYPE,C_STATION_CODE, C_EQUIPMENT_ATTRIBUTE_TYPE_ENUM)  select 6999, '备用字段10', 'data10', '', 'AGC_AVC',  NULL, 'SPARE' from dual where not exists (select C_ID from t_equipment_attribute where C_ID = 6999) ;
+