Browse Source

load hive文件优化,改为hive sql执行;
kudu数据插入优化,改为kuduclient执行

chenminghua 2 years ago
parent
commit
e1f8c1f9e2
87 changed files with 2854 additions and 670 deletions
  1. 107 57
      gyee-sample-impala/pom.xml
  2. 2 0
      gyee-sample-impala/src/main/java/com/gyee/impala/GyeeSampleImpalaApplication.java
  3. 56 0
      gyee-sample-impala/src/main/java/com/gyee/impala/ImpalaInsertTest.java
  4. 54 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/base/PageInfo.java
  5. 10 1
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/GyeeConfig.java
  6. 4 4
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/MapperGenerator.java
  7. 50 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/ThreadPoolConfig.java
  8. 46 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/DecisionDataSourceConfig.java
  9. 70 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/HiveDataSourceConfig.java
  10. 59 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/KuduDataSourceConfig.java
  11. 1 1
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/MasterDataSourceConfig.java
  12. 1 2
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/SlaveDataSourceConfig.java
  13. 120 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/jsch/ChannelSftpFactory.java
  14. 85 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/config/jsch/JSchConfig.java
  15. 2 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/constant/Constants.java
  16. 6 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/feign/RemoteServiceBuilder.java
  17. 7 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/result/ResultCode.java
  18. 37 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/ExitDisposable.java
  19. 40 12
      gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/InitialRunner.java
  20. 2 9
      gyee-sample-impala/src/main/java/com/gyee/impala/common/util/ExcelUtil.java
  21. 118 9
      gyee-sample-impala/src/main/java/com/gyee/impala/common/util/FileUtil.java
  22. 26 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/util/JudeSystem.java
  23. 90 0
      gyee-sample-impala/src/main/java/com/gyee/impala/common/util/NumberUtil.java
  24. 23 24
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/AnalyseScatterController.java
  25. 7 15
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/BasicQueryConditionsController.java
  26. 70 34
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/CaseFaultController.java
  27. 19 7
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/CasePerformanceController.java
  28. 8 8
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowBasicController.java
  29. 2 2
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowFaultProcessController.java
  30. 2 2
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowMaintenanceController.java
  31. 84 0
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/PowerCurveController.java
  32. 39 0
      gyee-sample-impala/src/main/java/com/gyee/impala/controller/WeatherController.java
  33. 16 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/decision/WfNwpDataMapper.java
  34. 9 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/PowercurvebasicMapper.java
  35. 32 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/PowercurvefittingMapper.java
  36. 7 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/WeatheractualMapper.java
  37. 26 0
      gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/WeatherforecastMapper.java
  38. 8 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/ToData.java
  39. 32 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/custom/PowerCurveCondition.java
  40. 3 3
      gyee-sample-impala/src/main/java/com/gyee/impala/model/custom/TsDoubleData.java
  41. 61 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/decision/WfNwpData.java
  42. 2 2
      gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Caseperformance.java
  43. 66 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Powercurvebasic.java
  44. 18 4
      gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Powercurvefitting.java
  45. 31 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Weatheractual.java
  46. 52 0
      gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Weatherforecast.java
  47. 0 1
      gyee-sample-impala/src/main/java/com/gyee/impala/schdule/TaskPerformance.java
  48. 58 0
      gyee-sample-impala/src/main/java/com/gyee/impala/schdule/TaskWeather.java
  49. 161 143
      gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/AnalyseScatterService.java
  50. 87 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/FileUploadService.java
  51. 5 3
      gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/GoldenService.java
  52. 119 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/SftpFileService.java
  53. 27 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/decision/WfNwpDataService.java
  54. 44 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/decision/WfNwpDataServiceImpl.java
  55. 58 38
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultServiceImpl.java
  56. 34 8
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CaseperformanceServiceImpl.java
  57. 198 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/PowercurvebasicServiceImpl.java
  58. 72 17
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/PowercurvefittingServiceImpl.java
  59. 12 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WeatheractualSrviceImpl.java
  60. 60 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WeatherforecastServiceImpl.java
  61. 0 3
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WindpowerstationServiceImpl.java
  62. 0 26
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WindturbineServiceImpl.java
  63. 4 2
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/FaultsnapServiceImpl.java
  64. 4 2
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/Windturbinetestingpointai2ServiceImpl.java
  65. 1 8
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/CasefaultService.java
  66. 9 1
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/CaseperformanceService.java
  67. 56 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/PowercurvebasicService.java
  68. 23 3
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/PowercurvefittingService.java
  69. 7 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WeatheractualService.java
  70. 34 0
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WeatherforecastService.java
  71. 0 7
      gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WindturbineService.java
  72. 3 1
      gyee-sample-impala/src/main/java/com/gyee/impala/service/slave/FaultsnapService.java
  73. 3 1
      gyee-sample-impala/src/main/java/com/gyee/impala/service/slave/Windturbinetestingpointai2Service.java
  74. 42 7
      gyee-sample-impala/src/main/resources/application.yaml
  75. 23 0
      gyee-sample-impala/src/main/resources/mapper/decision/WfNwpDataMapper.xml
  76. 29 0
      gyee-sample-impala/src/main/resources/mapper/master/PowercurvebasicMapper.xml
  77. 12 5
      gyee-sample-impala/src/main/resources/mapper/master/PowercurvefittingMapper.xml
  78. 25 0
      gyee-sample-impala/src/main/resources/mapper/master/WeatheractualMapper.xml
  79. 26 0
      gyee-sample-impala/src/main/resources/mapper/master/WeatherforecastMapper.xml
  80. BIN
      gyee-sample-impala/src/main/resources/template/fault.xlsx
  81. 8 7
      gyee-sample-impala/src/test/java/com/gyee/impala/FaultHistoryFilterTest.java
  82. 0 21
      src/main/java/com/gyee/impala/controller/Windturbinetestingpointai2Controller.java
  83. 0 16
      src/main/java/com/gyee/impala/mapper/Windturbinetestingpointai2Mapper.java
  84. 0 86
      src/main/java/com/gyee/impala/model/Windturbinetestingpointai2.java
  85. 0 16
      src/main/java/com/gyee/impala/service/Windturbinetestingpointai2Service.java
  86. 0 20
      src/main/java/com/gyee/impala/service/impl/Windturbinetestingpointai2ServiceImpl.java
  87. 0 32
      src/main/resources/mapper/Windturbinetestingpointai2Mapper.xml

+ 107 - 57
gyee-sample-impala/pom.xml

@@ -28,8 +28,29 @@
         </dependency>
 
         <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
 
@@ -42,14 +63,10 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>1.18.12</version>
+            <optional>true</optional>
         </dependency>
 
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jdbc</artifactId>
-        </dependency>
-        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
@@ -59,32 +76,11 @@
             <version>11.2.0.3</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid-spring-boot-starter</artifactId>
-            <version>1.1.10</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-aop</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-cache</artifactId>
-        </dependency>
-
         <!--常用工具类 -->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.4</version>
-        </dependency>
         <!-- 热部署 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -99,16 +95,12 @@
             <version>1.10</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-            <optional>true</optional>
-        </dependency>
 
+        <!-- sftp上传依赖包 -->
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.9</version>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+            <version>0.1.54</version>
         </dependency>
 
         <!--quartz依赖-->
@@ -160,39 +152,97 @@
             <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
         <!--</dependency>-->
 
-        <!--常用工具类 -->
+        <!--解析excel-  xls-->
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
         </dependency>
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.4</version>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
         </dependency>
 
         <dependency>
-            <groupId>com.oracle</groupId>
-            <artifactId>ojdbc6</artifactId>
-            <version>11.2.0.3</version>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+            <version>2.8.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
-
-        <!--解析excel-->
         <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>easyexcel</artifactId>
-            <version>2.2.4</version>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-client</artifactId>
+            <version>2.8.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
-        <!--xls-->
         <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>3.17</version>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-hdfs</artifactId>
+            <version>2.8.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
+
         <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>3.17</version>
+            <groupId>org.apache.kudu</groupId>
+            <artifactId>kudu-client</artifactId>
+            <version>1.11.0</version>
+        </dependency>
+
+        <!--hive驱动 -->
+        <dependency>
+            <groupId>org.apache.hive</groupId>
+            <artifactId>hive-jdbc</artifactId>
+            <version>2.1.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.eclipse.jetty.aggregate</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-1.2-api</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-api</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-core</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-slf4j-impl</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j-web</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
 

+ 2 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/GyeeSampleImpalaApplication.java

@@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 
@@ -12,6 +13,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
  * 禁用springboot默认加载的application.properties单数据源配置
  * 关闭springBoot关于mybatisPlus的一些自动注入
  */
+@EnableAsync
 @EnableCaching
 @EnableScheduling
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

+ 56 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/ImpalaInsertTest.java

@@ -0,0 +1,56 @@
+package com.gyee.impala;
+
+import java.sql.*;
+
+public class ImpalaInsertTest {
+
+    private static String JDBC_DRIVER="com.cloudera.impala.jdbc41.Driver";
+    private static String CONNECTION_URL="jdbc:impala://192.168.1.64:21050/gyee_sample_kudu";
+    //定义数据库连接
+    static Connection conn=null;
+    //定义PreparedStatement对象
+    static PreparedStatement ps=null;
+    //定义查询的结果集
+    static ResultSet rs= null;
+
+    public static void main(String[] args) {
+        try {
+            Class.forName(JDBC_DRIVER);
+            conn = DriverManager.getConnection(CONNECTION_URL);
+
+            String sql = "insert into table casefault(id, stationen, faulttype, faultcode, symptom) values(?,?,?,?,?) ";
+
+            ps = conn.prepareStatement(sql);
+
+            ps.setString(1, "123431");
+            ps.setString(2, "QS_FDC");
+            ps.setString(3, "发电测试故障");
+            ps.setString(4, "FDJ");
+            ps.setString(5, "我就是测试一下");
+
+            ps.execute();
+
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (ps != null) {
+                try {
+                    ps.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            if (conn != null) {
+                try {
+                    conn.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+}

+ 54 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/base/PageInfo.java

@@ -0,0 +1,54 @@
+package com.gyee.impala.common.base;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 针对hive的分页操作
+ */
+@Data
+public class PageInfo<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**每页数量*/
+    private int size;
+    /**总条数*/
+    private int total;
+    /**当前页*/
+    private int current;
+    /**总页数*/
+    private int pages;
+
+    private List<T> list;
+
+
+    public PageInfo(List<T> list, int size, int total, int current, int pages) {
+        this.size = size;
+        this.total = total;
+        this.current = current;
+        this.pages = pages;
+        this.list = list;
+    }
+
+    /**
+     * 数据包装
+     * @return
+     */
+    public Object getData(){
+        Map<String, Object> map = new HashMap<>();
+
+        map.put("list", this.list);
+        map.put("current", this.current);
+        map.put("pages", this.pages);
+        map.put("size", this.size);
+        map.put("total", this.total);
+
+        return map;
+    }
+}

+ 10 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/GyeeConfig.java

@@ -10,5 +10,14 @@ import org.springframework.stereotype.Component;
 public class GyeeConfig {
 
     /**数据适配器网址 **/
-    private String baseurl;
+    private String goldenUrl;
+
+    /***数据模板路径  windows*/
+    private String templatePathWindow;
+
+    /***数据模板路径  linux*/
+    private String templatePathLinux;
+
+    /****kudu的连接地址*/
+    private String kuduHost;
 }

+ 4 - 4
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/MapperGenerator.java

@@ -27,7 +27,7 @@ public class MapperGenerator {
     //作者
     private static String authorName = "chenmh";
     //要生成的表名
-    private static String[] tables = {"WINDTURBINETESTINGPOINTAI2"};
+    private static String[] tables = {""};
     //table前缀
     private static String prefix = "";
 
@@ -40,9 +40,9 @@ public class MapperGenerator {
 //    private static String password = "";
 
     private static String driverName = "oracle.jdbc.driver.OracleDriver";
-    private static String url = "jdbc:oracle:thin:@192.168.1.105:1521:gdnxfd";
-    private static String username = "nxfdprod";
-    private static String password = "gdnxfd123";
+    private static String url = "jdbc:oracle:thin:@10.155.32.7:1521:ORCL";
+    private static String username = "gyee";
+    private static String password = "FRWIND";
 
     public static void main(String[] args) {
         AutoGenerator gen = new AutoGenerator();

+ 50 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/ThreadPoolConfig.java

@@ -0,0 +1,50 @@
+package com.gyee.impala.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+
+@Configuration
+public class ThreadPoolConfig {
+    /**
+     *   默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
+     *	当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
+     *  当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝
+     */
+
+    /** 核心线程数(默认线程数) */
+    private static final int corePoolSize = 20;
+    /** 最大线程数 */
+    private static final int maxPoolSize = 40;
+    /** 允许线程空闲时间(单位:默认为秒) */
+    private static final int keepAliveTime = 60;
+    /** 缓冲队列大小 */
+    private static final int queueCapacity = 200;
+    /** 允许等待最长时间 */
+    private static final int awaitTime = 15;
+    /** 线程池名前缀 */
+    private static final String threadNamePrefix = "GYEE-Thread-";
+
+
+    @Bean
+    public ThreadPoolTaskExecutor taskExecutor(){
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(corePoolSize);
+        executor.setMaxPoolSize(maxPoolSize);
+        executor.setQueueCapacity(queueCapacity);
+        executor.setKeepAliveSeconds(keepAliveTime);
+        executor.setThreadNamePrefix(threadNamePrefix);
+        executor.setAwaitTerminationSeconds(awaitTime);
+
+        // 线程池对拒绝任务的处理策略
+        // CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 初始化
+        executor.initialize();
+        return executor;
+    }
+
+}

+ 46 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/DecisionDataSourceConfig.java

@@ -0,0 +1,46 @@
+package com.gyee.impala.common.config.datasource;
+
+
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+/**
+ * 智能营销oracle数据源
+ */
+@Configuration
+@MapperScan(basePackages = "com.gyee.impala.mapper.decision",sqlSessionFactoryRef = "decisionSqlSessionFactory")
+public class DecisionDataSourceConfig {
+
+    @Bean(name = "decision")
+    @ConfigurationProperties("spring.datasource.druid.decision")
+    public DataSource decisionDataSource(){
+        return DataSourceBuilder.create().build();
+    }
+
+    @Bean(name = "decisionSqlSessionFactory")
+    public SqlSessionFactory decisionSqlSessionFactory(@Qualifier("decision") DataSource dataSource) throws Exception {
+        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(dataSource);
+
+        sessionFactoryBean.setMapperLocations(
+                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/decision/*.xml"));
+
+        return sessionFactoryBean.getObject();
+    }
+
+    @Bean("decisionSqlSessionFactory")
+    public SqlSessionTemplate decisionSqlSessionTemplate(
+            @Qualifier("decisionSqlSessionFactory") SqlSessionFactory sessionFactory) {
+        return new SqlSessionTemplate(sessionFactory);
+    }
+}

+ 70 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/HiveDataSourceConfig.java

@@ -0,0 +1,70 @@
+package com.gyee.impala.common.config.datasource;
+
+
+import com.gyee.impala.common.config.jsch.JSchConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+@Slf4j
+@Component
+public class HiveDataSourceConfig {
+
+    @Autowired
+    JSchConfig jSchConfig;
+    private Connection conn = null;
+
+    @Bean
+    public void init(){
+        try {
+            if (conn == null){
+                Class.forName(jSchConfig.getDriver());
+                conn = DriverManager.getConnection(jSchConfig.getUrl(), "", "");
+            }
+        }catch (Exception e){
+            e.getStackTrace();
+            log.error(e.getMessage());
+        }
+    }
+
+
+    public void execute(String sql){
+        if (conn == null)
+            init();
+
+        Statement stmt = null;
+        try {
+            stmt = conn.createStatement();
+            stmt.execute(sql);
+            log.info("======= load hive 成功 =======");
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (stmt != null) {
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    public void close(){
+        if (conn != null) {
+            try {
+                conn.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+}

+ 59 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/KuduDataSourceConfig.java

@@ -0,0 +1,59 @@
+package com.gyee.impala.common.config.datasource;
+
+import com.gyee.impala.common.config.GyeeConfig;
+import com.gyee.impala.common.config.jsch.JSchConfig;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kudu.client.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+/**
+ * kudu的 jdbc api
+ * 由于impala操作kudu的insert很慢
+ * 使用原生的kudu api
+ */
+@Slf4j
+@Data
+@Component
+public class KuduDataSourceConfig {
+
+    @Autowired
+    private GyeeConfig gyeeConfig;
+
+    // 对于Kudu操作,获取KuduClient客户端实例对象
+    public KuduClient kuduClient = null;
+
+
+    @Bean
+    public void initKuDu(){
+        if (kuduClient == null)
+            kuduClient = new KuduClient
+                    .KuduClientBuilder(gyeeConfig.getKuduHost() + ":7051")
+                    .defaultOperationTimeoutMs(6000)
+                    .build();
+    }
+
+
+    public KuduSession kuduSession(){
+        //获取KuduSession会话对象
+        KuduSession kuduSession = kuduClient.newSession();
+        // TODO: 设置手动刷新数据到表中
+        kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
+        // 批量插入的缓冲区条目数
+        kuduSession.setMutationBufferSpace(2000);
+        return kuduSession;
+    }
+
+
+    public void close(){
+        if (kuduClient != null) {
+            try {
+                kuduClient.close();
+            } catch (KuduException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 1 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/MasterDataSourceConfig.java

@@ -22,9 +22,9 @@ import javax.sql.DataSource;
  *@Version 1.0
  *
  * 大数据 kudu 库
+ * 通过impala连接kudu\hive
  *
  **/
-
 @Configuration
 @MapperScan(basePackages = "com.gyee.impala.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
 public class MasterDataSourceConfig {

+ 1 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/datasource/SlaveDataSourceConfig.java

@@ -9,13 +9,12 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
 import javax.sql.DataSource;
 
 /**
- * 三区oracle
+ * 三区oracle数据源
  */
 @Configuration
 @MapperScan(basePackages = "com.gyee.impala.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")

+ 120 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/jsch/ChannelSftpFactory.java

@@ -0,0 +1,120 @@
+package com.gyee.impala.common.config.jsch;
+
+
+import com.jcraft.jsch.*;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.BasePooledObjectFactory;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+
+
+@Slf4j
+@Data
+public class ChannelSftpFactory extends BasePooledObjectFactory<ChannelSftp> {
+
+    private String protocol;//协议
+    private String host;// host
+    private Integer port;// 端口
+    private String username;// 用户
+    private String password;// 密码
+
+
+    public ChannelSftpFactory(String protocol, String host, Integer port, String username, String password) {
+        this.protocol = protocol;
+        this.host = host;
+        this.port = port;
+        this.username = username;
+        this.password = password;
+    }
+
+    // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
+    private static final String SESSION_CONFIG_STRICT_HOST_KEY_CHECKING = "StrictHostKeyChecking";
+
+    @Override
+    public ChannelSftp create(){
+        return null;
+    }
+
+    @Override
+    public PooledObject<ChannelSftp> makeObject() throws Exception {
+        JSch jsch = new JSch();
+        Session session = createSession(jsch, host, username, port);
+
+        Channel channel = session.openChannel(protocol);
+        channel.connect(10000);
+
+        return new DefaultPooledObject(channel);
+    }
+
+
+    @Override
+    public PooledObject<ChannelSftp> wrap(ChannelSftp channelSftp) {
+        return new DefaultPooledObject<>(channelSftp);
+    }
+
+
+    @Override
+    public void destroyObject(PooledObject<ChannelSftp> sftpPooled) throws Exception {
+        ChannelSftp sftp = sftpPooled.getObject();
+        try {
+            if (sftp != null) {
+                if (sftp.isConnected()) {
+                    sftp.disconnect();
+                } else if (sftp.isClosed()) {
+                    log.info("sftp连接已关闭");
+                }
+                if (null != sftp.getSession()) {
+                    sftp.getSession().disconnect();
+                }
+            }
+        } catch (JSchException e) {
+            log.error("关闭sftp连接失败: {}", e);
+            e.printStackTrace();
+            throw new Exception("关闭sftp连接失败");
+        }
+    }
+
+    @Override
+    public boolean validateObject(PooledObject<ChannelSftp> sftpPooled) {
+        try {
+            ChannelSftp sftp = sftpPooled.getObject();
+            if (sftp != null) {
+                return (sftp.isConnected() && sftp.getSession().isConnected());
+            }
+        } catch (JSchException e) {
+            log.error("sftp连接校验失败: {}", e);
+            e.printStackTrace();
+            throw new RuntimeException("sftp连接校验失败");
+        }
+        return false;
+    }
+
+    /**
+     * 创建session
+     *
+     * @param jsch
+     * @param host
+     * @param username
+     * @param port
+     * @return
+     * @throws Exception
+     */
+    private Session createSession(JSch jsch, String host, String username, Integer port) throws Exception {
+        Session session = null;
+        if (port <= 0) {
+            session = jsch.getSession(username, host);
+        } else {
+            session = jsch.getSession(username, host, port);
+        }
+        if (session == null) {
+            throw new RuntimeException(host + " sftp建立连接session is null");
+        }
+
+        session.setPassword(password);
+        session.setConfig(SESSION_CONFIG_STRICT_HOST_KEY_CHECKING, "no");
+        session.connect(2000);
+
+        return session;
+    }
+}

+ 85 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/config/jsch/JSchConfig.java

@@ -0,0 +1,85 @@
+package com.gyee.impala.common.config.jsch;
+
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.ChannelSftp;
+import lombok.Data;
+import org.apache.commons.pool2.impl.AbandonedConfig;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "hiveconfig")
+public class JSchConfig {
+
+    private String protocols;//sftp协议
+    private String host;// host
+    private Integer port;// 端口
+    private String username;// 用户
+    private String password;// 密码
+    private String path; //上传目录
+    private String driver; //hive的驱动
+    private String url;  //hive的url
+
+    public ChannelSftpFactory sftpFactory;
+
+    public GenericObjectPool<ChannelSftp> channelSftpPool;//连接池
+    public GenericObjectPool<ChannelExec> channelExecPool;//连接池
+
+    /**
+     * @Title: getSftpSocket
+     * @Description: 获取连接
+     * @param: @return
+     * @return: ChannelSftp
+     * @throws
+     */
+    public ChannelSftp getSftpSocket(){
+        try {
+            if(null == this.channelSftpPool){
+                initPoolSftp();
+            }
+            return this.channelSftpPool.borrowObject();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * @Title: returnSftpSocket
+     * @Description: 归还连接
+     * @param: @param jsch
+     * @return: void
+     * @throws
+     */
+    public void returnSftpSocket(ChannelSftp sftp){
+        this.channelSftpPool.returnObject(sftp);
+    }
+
+
+    /**
+     * @Title: initPoolSftp
+     * @Description: 初始化连接池  sftp
+     * @param:
+     * @return: void
+     * @throws
+     */
+    private void initPoolSftp(){
+        GenericObjectPoolConfig config=new GenericObjectPoolConfig();
+        config.setMinIdle(5);
+        config.setMaxTotal(5);
+        config.setMaxWaitMillis(60000);
+        sftpFactory = new ChannelSftpFactory(protocols, host, port, username, password);
+        this.channelSftpPool = new GenericObjectPool<>(sftpFactory, config);
+        AbandonedConfig abandonedConfig = new AbandonedConfig();
+        abandonedConfig.setRemoveAbandonedOnMaintenance(true); //在Maintenance的时候检查是否有泄漏
+        abandonedConfig.setRemoveAbandonedOnBorrow(true); //borrow 的时候检查泄漏
+        abandonedConfig.setRemoveAbandonedTimeout(60); //如果一个对象borrow之后60秒还没有返还给pool,认为是泄漏的对象
+        this.channelSftpPool.setAbandonedConfig(abandonedConfig);
+        this.channelSftpPool.setTimeBetweenEvictionRunsMillis(60000); //60秒运行一次维护任务
+    }
+}

+ 2 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/constant/Constants.java

@@ -17,6 +17,8 @@ public class Constants {
     public static final String FJZT = "FJZT";
     // 风机风速
     public static final String POINT_SPEED = "AI022";
+    // 风机日发电量
+    public static final String POINT_QUANTITY = "RFDL";
     // 风机实发功率
     public static final String POINT_POWER = "AI130";
     // 风机理论功率

+ 6 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/feign/RemoteServiceBuilder.java

@@ -1,11 +1,13 @@
 package com.gyee.impala.common.feign;
 
+import com.gyee.impala.common.config.GyeeConfig;
 import feign.Feign;
 import feign.Request;
 import feign.Retryer;
 import feign.jackson.JacksonDecoder;
 import feign.jackson.JacksonEncoder;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -15,11 +17,15 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class RemoteServiceBuilder {
 
+    @Autowired
+    private GyeeConfig config;
+
     @Value("${goldenUrl:http://10.155.32.4:8011}")
     private String shardingUrlString;
 
     @Bean
     public IAdapterService ShardingService() {
+        shardingUrlString = config.getGoldenUrl();
         return Feign.builder()
                 .encoder(new JacksonEncoder())
                 .decoder(new JacksonDecoder())

+ 7 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/result/ResultCode.java

@@ -12,9 +12,16 @@ public enum ResultCode {
 
     /* 默认失败 */
     ERROR(4000, "失败"),
+    ERROR_FILE_NO(4001, "文件未找到"),
+    ERROR_FILE_TYPE(4002, "文件类型不正确"),
+    ERROR_FILE_DATA(4003, "数据为空"),
+    ERROR_DATA_TYPE(4004, "数据格式不正确"),
     ERROR_CONNECT(4005, "数据库连接异常"),
     ERROR_DATA(4006, "数据库操作失败"),
     ERROR_DATA_REPEAT(4007, "数据已存在"),
+    ERROR_DATA_DIR(4008, "目录创建失败"),
+    ERROR_DATA_FILE(4009, "文件上传失败"),
+
 
     /* 参数错误:1000~1999 */
     PARAM_NOT_VALID(1001, "参数无效"),

+ 37 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/ExitDisposable.java

@@ -0,0 +1,37 @@
+package com.gyee.impala.common.spring;
+
+import com.gyee.impala.common.config.datasource.HiveDataSourceConfig;
+import com.gyee.impala.common.config.datasource.KuduDataSourceConfig;
+import com.gyee.impala.common.config.jsch.JSchConfig;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ExitCodeGenerator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExitDisposable implements DisposableBean, ExitCodeGenerator {
+
+    @Autowired
+    private JSchConfig config;
+    @Autowired
+    private KuduDataSourceConfig kuduConfig;
+    @Autowired
+    private HiveDataSourceConfig hiveConfig;
+
+    @Override
+    public void destroy() throws Exception {
+        kuduConfig.close();
+        System.out.println("############   kudu 资源已释放   ##############");
+
+        hiveConfig.close();
+        System.out.println("############   hive 资源已释放   ##############");
+
+        config.getSftpFactory().destroyObject(config.getSftpFactory().makeObject());
+        System.out.println("############   sftp 资源已释放   ##############");
+    }
+
+    @Override
+    public int getExitCode() {
+        return 0;
+    }
+}

+ 40 - 12
gyee-sample-impala/src/main/java/com/gyee/impala/common/spring/InitialRunner.java

@@ -1,9 +1,12 @@
 package com.gyee.impala.common.spring;
 
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.model.master.Knowfaulttype;
+import com.gyee.impala.model.master.Powercurvebasic;
 import com.gyee.impala.model.master.Windpowerstation;
 import com.gyee.impala.model.master.Windturbine;
-import com.gyee.impala.service.master.WindpowerstationService;
-import com.gyee.impala.service.master.WindturbineService;
+import com.gyee.impala.service.master.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
@@ -20,23 +23,48 @@ public class InitialRunner implements CommandLineRunner {
     private WindturbineService windturbineService;
     @Resource
     private WindpowerstationService windpowerstationService;
+    @Autowired
+    private PowercurvebasicService powercurvebasicService;
+    @Autowired
+    private PowercurvefittingService fittingService;
+    @Autowired
+    private KnowfaulttypeService faulttypeService;
 
 
-    // 场站所有信息
+    /**场站所有信息**/
     public static List<Windpowerstation> wpList = new ArrayList<>();
-    // 场站的风机
+    /**场站的风机**/
     public static Map<String, List<Windturbine>> wtMap = new HashMap<>();
+    /** <MHS_FDC, 麻黄山风电场> **/
+    public static Map<String, String> stationMap = new HashMap<>();
+    /**所有的风机**/
+    public static List<Windturbine> wtList = new ArrayList<>();
+    /**功率曲线预处理数据表格数据 key:time+wtId  value:当前风机的总条数 **/
+    public static Map<String, Integer> scatterMap = new HashMap<>();
+    /**根据排序缓存**/
+    public static List<Powercurvebasic> powerCurveList = new ArrayList<>();
+    /***故障  <FDJ,发电机故障>  类型*/
+    public static Map<String, String> faultTypeMap = new HashMap<>();
+    public static List<Knowfaulttype> faultTypeList = new ArrayList<>();
 
 
     @Override
     public void run(String... args) throws Exception {
-//        wpList = windpowerstationService.getAll();
-//
-//        if (wpList != null && wpList.size() > 0){
-//            for (Windpowerstation station : wpList){
-//                List<Windturbine> winds = windturbineService.getWindTurbineId(station.getId());
-//                wtMap.put(station.getId(), winds);
-//            }
-//        }
+        System.out.println(">>>>>>>>>>>>>>>服务启动,正在缓存数据<<<<<<<<<<<<<<");
+
+        List<Windpowerstation> stations = windpowerstationService.getAll();
+        wpList = stations;
+        stations.stream().forEach(obj -> {
+            List<Windturbine> wts = windturbineService.getWindTurbineId(obj.getId());
+            stationMap.put(obj.getId(), obj.getName());
+            wtMap.put(obj.getId(), wts);
+            wtList.addAll(wts);
+        });
+
+        List<Knowfaulttype> faultType = faulttypeService.getAll();
+        faultTypeList = faultType;
+        faultType.stream().forEach(obj -> faultTypeMap.put(obj.getFaultcode(), obj.getFaulttype()));
+
+        System.out.println(">>>>>>>>>>>>>>>数据缓存完成<<<<<<<<<<<<<<");
     }
 }

+ 2 - 9
gyee-sample-impala/src/main/java/com/gyee/impala/common/util/ExcelUtil.java

@@ -1,13 +1,7 @@
 package com.gyee.impala.common.util;
 
-import com.alibaba.excel.ExcelWriter;
-import com.alibaba.excel.support.ExcelTypeEnum;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.hssf.usermodel.HSSFCell;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -15,7 +9,6 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.util.StringUtils;
 
 import java.io.*;
-import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -164,10 +157,10 @@ public class ExcelUtil {
      * @return 1-XLS文件,2-XLSX文件,3-文件类型错误
      */
     public static int checkFile(String fileName) {
-        if (fileName.endsWith("xlsx")) {
+        if (fileName.endsWith(".xlsx")) {
             return 1;
         }
-        if (fileName.endsWith("xls")) {
+        if (fileName.endsWith(".xls")) {
             return 2;
         }
 

+ 118 - 9
gyee-sample-impala/src/main/java/com/gyee/impala/common/util/FileUtil.java

@@ -1,11 +1,17 @@
 package com.gyee.impala.common.util;
 
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.result.ResultCode;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.util.List;
 
 @Slf4j
@@ -13,29 +19,29 @@ public class FileUtil {
 
     /**
      * 写入文件
+     *
      * @param fileName
      * @param list
      */
-    public static void writeFile(String fileName, List<String> list){
-        File file = null;
+    public static void writeFile(String fileName, List<String> list) {
         BufferedWriter bw = null;
 
         if (list == null || list.size() < 0)
             return;
 
         try {
-            file = new File("D://" + fileName + ".txt");
+            File file = new File(fileName);
             if (file.exists()) file.delete();
             else file.createNewFile();
 
             bw = new BufferedWriter(new FileWriter(file, false));
 
-            for (String str : list){
+            for (String str : list) {
                 bw.write(str);
                 bw.flush();
             }
 
-        } catch (Exception e){
+        } catch (Exception e) {
             log.error(e.getMessage());
         } finally {
             try {
@@ -45,4 +51,107 @@ public class FileUtil {
             }
         }
     }
+
+    /**
+     * 写入文件
+     *
+     * @param path
+     * @param fileName
+     * @param inputStream
+     */
+    public static void writeFile(String path, String fileName, InputStream inputStream) {
+        OutputStream os = null;
+        try {
+            byte[] bs = new byte[1024];
+            int len;
+
+            File file = new File(path);
+            if (!file.exists()) {
+                file.mkdirs();
+            }
+            os = new FileOutputStream(file.getPath() + File.separator + fileName);
+            // 开始读取
+            while ((len = inputStream.read(bs)) != -1) {
+                os.write(bs, 0, len);
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        } finally {
+            // 完毕,关闭所有链接
+            try {
+                os.close();
+                inputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+                log.error(e.getMessage());
+            }
+        }
+    }
+
+
+    // String -> InputStream
+    public static InputStream convertStringToInputStream(String content) {
+
+        InputStream result = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
+        return result;
+
+    }
+
+
+    /**
+     * 加载文件
+     *
+     * @param fileName
+     * @return
+     */
+    public static void download(String fileName, HttpServletResponse response) {
+        FileInputStream fis = null;
+        BufferedInputStream bis = null;
+        try {
+            // 获取文件
+            File file = new File(fileName);
+            // 清空缓冲区,状态码和响应头(headers)
+            response.reset();
+            // 设置ContentType,响应内容为二进制数据流,编码为utf-8,此处设定的编码是文件内容的编码
+            response.setContentType("application/octet-stream;charset=utf-8");
+            // 以(Content-Disposition: attachment; filename="filename.jpg")格式设定默认文件名,设定utf编码,此处的编码是文件名的编码,使能正确显示中文文件名
+            response.setHeader("Content-Disposition", "attachment;fileName=" + file.getName() + ";filename*=utf-8''" + URLEncoder.encode(file.getName(), "utf-8"));
+
+            // 实现文件下载
+            byte[] buffer = new byte[1024];
+            fis = new FileInputStream(file);
+            bis = new BufferedInputStream(fis);
+            // 获取字节流
+            OutputStream os = response.getOutputStream();
+            int i = bis.read(buffer);
+            while (i != -1) {
+                os.write(buffer, 0, i);
+                i = bis.read(buffer);
+            }
+        } catch (FileNotFoundException e) {
+            throw new CustomException(ResultCode.ERROR_FILE_NO);
+        } catch (Exception e) {
+            throw new CustomException(ResultCode.ERROR);
+        } finally {
+            if (bis != null) {
+                try {
+                    bis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 26 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/util/JudeSystem.java

@@ -0,0 +1,26 @@
+package com.gyee.impala.common.util;
+
+
+/**
+ * 判断当前系统
+ */
+public class JudeSystem {
+
+    public static boolean isLinux() {
+        return System.getProperty("os.name").toLowerCase().contains("linux");
+    }
+
+    public static boolean isWindows() {
+        return System.getProperty("os.name").toLowerCase().contains("windows");
+    }
+
+    public static String judgeSystem() {
+        if (isLinux()) {
+            return "linux";
+        } else if (isWindows()) {
+            return "windows";
+        } else {
+            return "other system";
+        }
+    }
+}

+ 90 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/common/util/NumberUtil.java

@@ -0,0 +1,90 @@
+package com.gyee.impala.common.util;
+
+
+import java.math.BigDecimal;
+
+/**
+ * 数字转换中文
+ */
+public class NumberUtil {
+
+    private NumberUtil() { }
+
+    /**
+     * 中文数字
+     */
+    private static final String[] CN_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
+    /**
+     * 中文数字单位
+     */
+    private static final String[] CN_UNIT = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"};
+    /**
+     * 特殊字符:负
+     */
+    private static final String CN_NEGATIVE = "负";
+    /**
+     * 特殊字符:点
+     */
+    private static final String CN_POINT = "点";
+    /**
+     * int 转 中文数字
+     * 支持到int最大值
+     *
+     * @param intNum 要转换的整型数
+     * @return 中文数字
+     */
+    public static String int2chineseNum(int intNum) {
+        StringBuffer sb = new StringBuffer();
+        boolean isNegative = false;
+        if (intNum < 0) {
+            isNegative = true;
+            intNum *= -1;
+        }
+        int count = 0;
+        while(intNum > 0) {
+            sb.insert(0, CN_NUM[intNum % 10] + CN_UNIT[count]);
+            intNum = intNum / 10;
+            count++;
+        }
+        if (isNegative)
+            sb.insert(0, CN_NEGATIVE);
+        return sb.toString().replaceAll("零[千百十]", "零").replaceAll("零+万", "万")
+                .replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
+                .replaceAll("零+", "零").replaceAll("零$", "");
+    }
+    /**
+     * bigDecimal 转 中文数字
+     * 整数部分只支持到int的最大值
+     *
+     * @param bigDecimalNum 要转换的BigDecimal数
+     * @return 中文数字
+     */
+    public static String bigDecimal2chineseNum(BigDecimal bigDecimalNum) {
+        if (bigDecimalNum == null)
+            return CN_NUM[0];
+        StringBuffer sb = new StringBuffer();
+        //将小数点后面的零给去除
+        String numStr = bigDecimalNum.abs().stripTrailingZeros().toPlainString();
+        String[] split = numStr.split("\\.");
+        String integerStr = int2chineseNum(Integer.parseInt(split[0]));
+        sb.append(integerStr);
+        //如果传入的数有小数,则进行切割,将整数与小数部分分离
+        if (split.length == 2) {
+            //有小数部分
+            sb.append(CN_POINT);
+            String decimalStr = split[1];
+            char[] chars = decimalStr.toCharArray();
+            for (int i = 0; i < chars.length; i++) {
+                int index = Integer.parseInt(String.valueOf(chars[i]));
+                sb.append(CN_NUM[index]);
+            }
+        }
+        //判断传入数字为正数还是负数
+        int signum = bigDecimalNum.signum();
+        if (signum == -1) {
+            sb.insert(0, CN_NEGATIVE);
+        }
+        return sb.toString();
+    }
+
+}

+ 23 - 24
gyee-sample-impala/src/main/java/com/gyee/impala/controller/AnalyseScatterController.java

@@ -5,9 +5,12 @@ import com.alibaba.fastjson.JSONObject;
 import com.gyee.impala.common.result.JsonResult;
 import com.gyee.impala.common.result.ResultCode;
 import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.model.custom.PowerCurveCondition;
 import com.gyee.impala.model.custom.YawValuesVo;
+import com.gyee.impala.model.master.Powercurvebasic;
 import com.gyee.impala.service.custom.AnalyseScatterService;
 import com.gyee.impala.service.custom.GoldenService;
+import com.gyee.impala.service.master.PowercurvebasicService;
 import com.gyee.impala.service.slave.WindturbinewindyawService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -27,6 +30,8 @@ public class AnalyseScatterController {
     @Autowired
     private AnalyseScatterService scatterService;
     @Autowired
+    private PowercurvebasicService powercurvebasicService;
+    @Autowired
     private GoldenService goldenService;
 
 
@@ -40,17 +45,33 @@ public class AnalyseScatterController {
      */
     @PostMapping("/list")
     public JSONObject getScatterItem(String station, String wtId, String time){
-        Map<String, List<List<Double>>> result = scatterService.getScatterList(station, wtId, time);
+        Map<String, List<List<Object>>> result = scatterService.getScatterList(station, wtId, time);
 
         if (null != result) {
             return JsonResult.successData(ResultCode.SUCCESS, result);
         } else {
-            return JsonResult.error(ResultCode.ERROR);
+            return JsonResult.error(ResultCode.ERROR_DATA);
         }
     }
 
 
     /**
+     * 功率曲线拟合数据预处理
+     * @param obj  帅选条件
+     * @return
+     */
+    @PostMapping("/preprocess")
+    public JSONObject dataPreprocess(@RequestBody PowerCurveCondition obj){
+        if (obj == null)
+            return JsonResult.success(ResultCode.ERROR);
+
+        scatterService.dataPreprocess(obj);
+
+        return JsonResult.success(ResultCode.SUCCESS);
+    }
+
+
+    /**
      * 偏航对风 通过计算服务取数
      * @param wtId
      * @param time
@@ -74,28 +95,6 @@ public class AnalyseScatterController {
         }
     }
 
-    /**
-     * 偏航对风 通过测点自己计算
-     * @param wtId
-     * @param time
-     * @return
-     */
-    @PostMapping("/range/cal")
-    public JSONObject getTotalRangeCal(String wtId, String time){
-        Calendar cal = Calendar.getInstance();
-        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
-        long startTime = cal.getTime().getTime();
-        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
-        long endTime = cal.getTime().getTime();
-
-        scatterService.getTotalRangeCal(wtId, startTime, endTime);
-
-//        if (null != list) {
-//            return JsonResult.successData(ResultCode.SUCCESS, list);
-//        } else {
-            return JsonResult.error(ResultCode.ERROR);
-//        }
-    }
 
     @GetMapping("/test")
     public JSONObject test(String point, long start, long end){

+ 7 - 15
gyee-sample-impala/src/main/java/com/gyee/impala/controller/BasicQueryConditionsController.java

@@ -4,13 +4,11 @@ package com.gyee.impala.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.impala.common.result.JsonResult;
 import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.spring.InitialRunner;
 import com.gyee.impala.model.master.Knowfaulttype;
 import com.gyee.impala.model.master.Windpowerstation;
 import com.gyee.impala.model.master.Windturbine;
-import com.gyee.impala.service.custom.TablePropService;
-import com.gyee.impala.service.master.KnowfaulttypeService;
 import com.gyee.impala.service.master.WindpowerstationService;
-import com.gyee.impala.service.master.WindturbineService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -27,16 +25,10 @@ import java.util.List;
 @CrossOrigin
 @RestController
 @RequestMapping("/basic")
-public class BasicQueryConditionsController {
+public class BasicQueryController {
 
     @Autowired
     private WindpowerstationService windpowerstationService;
-    @Autowired
-    private TablePropService tablePropService;
-    @Autowired
-    private WindturbineService windturbineService;
-    @Autowired
-    private KnowfaulttypeService knowfaulttypeServicet;
 
 
     @GetMapping("/test")
@@ -64,7 +56,7 @@ public class BasicQueryConditionsController {
     @GetMapping("/station/all")
     @ResponseBody
     public JSONObject stationAll(){
-        List<Windpowerstation> list = windpowerstationService.getAll();
+        List<Windpowerstation> list = InitialRunner.wpList;
         return JsonResult.successData(ResultCode.SUCCESS, list);
     }
 
@@ -76,7 +68,7 @@ public class BasicQueryConditionsController {
     @GetMapping("/widget/condition")
     @ResponseBody
     public JSONObject faultTypeAll(){
-        List<Knowfaulttype> list = knowfaulttypeServicet.getAll();
+        List<Knowfaulttype> list = InitialRunner.faultTypeList;
         return JsonResult.successData(ResultCode.SUCCESS, list);
     }
 
@@ -88,7 +80,7 @@ public class BasicQueryConditionsController {
     @GetMapping("/windturbine/all")
     @ResponseBody
     public JSONObject windsAll(String station){
-        List<Windturbine> list = windturbineService.getWindTurbineId(station);
+        List<Windturbine> list = InitialRunner.wtMap.get(station);
         return JsonResult.successData(ResultCode.SUCCESS, list);
     }
 
@@ -113,7 +105,7 @@ public class BasicQueryConditionsController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
@@ -125,7 +117,7 @@ public class BasicQueryConditionsController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 }

+ 70 - 34
gyee-sample-impala/src/main/java/com/gyee/impala/controller/CaseFaultController.java

@@ -1,29 +1,44 @@
 package com.gyee.impala.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.gyee.impala.common.config.GyeeConfig;
 import com.gyee.impala.common.result.JsonResult;
 import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.spring.InitialRunner;
+import com.gyee.impala.common.util.FileUtil;
+import com.gyee.impala.common.util.JudeSystem;
 import com.gyee.impala.model.master.Casefault;
+import com.gyee.impala.service.custom.FileUploadService;
 import com.gyee.impala.service.master.CasefaultService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 
 /**
  * 故障样本库操作
  */
+@Slf4j
 @CrossOrigin
 @RestController
 @RequestMapping("/case")
 public class CaseFaultController {
 
     @Autowired
+    private GyeeConfig config;
+    @Autowired
+    private FileUploadService fileUploadService;
+    @Autowired
     private CasefaultService casefaultService;
 
     /**
      * 根据条件查询故障
+     *
      * @param station  场站
      * @param model    风机型号
      * @param widget   故障部件
@@ -35,76 +50,97 @@ public class CaseFaultController {
      */
     @GetMapping("/fault/list")
     public JSONObject faultAll(String station, String[] model, String[] widget,
-                               String st, String et, String category, Long[] ids){
+                               String st, String et, String category, Long[] ids) {
 
         List<Casefault> list = casefaultService.getAll(station, model, widget, st, et, category, ids);
         return JsonResult.successData(ResultCode.SUCCESS, list);
     }
 
 
-
     /**
      * 批量新增或修改数据
+     *
      * @param list
      * @return
      */
     @PostMapping("/fault/insert")
-    public JSONObject faultInsert(@RequestBody List<Casefault> list){
-        boolean flag = casefaultService.insertOrUpdate(list);
-        if (flag){
-            return JsonResult.success(ResultCode.SUCCESS);
-        }
-
-        return JsonResult.error(ResultCode.ERROR);
+    public JSONObject faultInsert(@RequestBody List<Casefault> list) {
+        casefaultService.insertBatch(list);
+        return JsonResult.success(ResultCode.SUCCESS);
     }
 
-//    /**
-//     * 新增样本案例
-//     * @param obj
-//     * @return
-//     */
-//    @PostMapping("/item/insert")
-//    public JSONObject faultInsert(@RequestBody Casefault obj){
-//        boolean flag = casefaultService.insertItem(obj);
-//        if (flag){
-//            return JsonResult.success(ResultCode.SUCCESS);
-//        }
-//
-//        return JsonResult.error(ResultCode.ERROR);
-//    }
-
 
     /**
      * 编辑样本案例
+     *
      * @param obj
      * @return
      */
-    @PostMapping("/item/edit")
-    public JSONObject faultEdit(@RequestBody Casefault obj){
-        System.out.println(obj.toString());
+    @PostMapping("/fault/edit")
+    public JSONObject faultEdit(@RequestBody Casefault obj) {
         boolean flag = casefaultService.editItem(obj);
-        if (flag){
+        if (flag) {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
     /**
      * 删除样本案例
+     *
      * @param id
      * @return
      */
-    @PostMapping("/item/delete")
-    @ResponseBody
-    public JSONObject faultDelete(String id){
+    @GetMapping("/fault/delete")
+    public JSONObject faultDelete(String id) {
         boolean flag = casefaultService.deleteItem(id);
-        if (flag){
+        if (flag) {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
+    }
+
+
+    /**
+     * 下载故障样本库的导入模板
+     *
+     * @param template
+     * @return
+     */
+    @GetMapping("/download/template")
+    public void downloadTemplate(HttpServletResponse response,
+                                 @RequestParam(value = "template", required = false) String template) {
+        String fileName = null;
+        String path = JudeSystem.isWindows() ? config.getTemplatePathWindow() : config.getTemplatePathLinux();
+        if (StringUtils.isEmpty(template) || template.equals("fault")) {
+            fileName = "fault.xlsx";
+        }
+        FileUtil.download(path + fileName, response);
+    }
+
+
+    /**
+     * 上传故障样本数据
+     *
+     * @return
+     */
+    @PostMapping("/upload/file")
+    public JSONObject uploadFile(@RequestParam("file") MultipartFile file) {
+        // 得到上传时的文件名
+        String originName = file.getOriginalFilename();
+        if (!originName.endsWith(".xlsx") && !originName.endsWith(".xls")) {
+            return JsonResult.error(ResultCode.ERROR_FILE_TYPE);
+        }
+
+        boolean flag = fileUploadService.resolveFaultExcel(file);
+        if (flag) {
+            return JsonResult.success(ResultCode.SUCCESS);
+        } else {
+            return JsonResult.error(ResultCode.ERROR);
+        }
     }
 
 }

+ 19 - 7
gyee-sample-impala/src/main/java/com/gyee/impala/controller/CasePerformanceController.java

@@ -1,12 +1,10 @@
 package com.gyee.impala.controller;
 
 
-
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.impala.common.result.JsonResult;
 import com.gyee.impala.common.result.ResultCode;
 import com.gyee.impala.model.master.Caseperformance;
-import com.gyee.impala.service.custom.GoldenService;
 import com.gyee.impala.service.master.CaseperformanceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -37,8 +35,6 @@ public class CasePerformanceController {
     @Autowired
     private CaseperformanceService caseperformanceService;
 
-    @Autowired
-    private GoldenService goldenService;
 
     /**
      * 获取样本数据
@@ -71,7 +67,7 @@ public class CasePerformanceController {
         if (flag) {
             return JsonResult.success(ResultCode.SUCCESS);
         }
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
@@ -88,7 +84,7 @@ public class CasePerformanceController {
         if (flag) {
             return JsonResult.success(ResultCode.SUCCESS);
         }
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -103,7 +99,23 @@ public class CasePerformanceController {
         if (flag) {
             return JsonResult.success(ResultCode.SUCCESS);
         }
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
+    }
+
+
+    /**
+     * 批量新增或修改数据
+     * @param list
+     * @return
+     */
+    @PostMapping("/performance/insert")
+    public JSONObject faultInsert(@RequestBody @RequestParam(required = false) List<Caseperformance> list){
+        boolean flag = caseperformanceService.insertOrUpdate(list);
+        if (flag){
+            return JsonResult.success(ResultCode.SUCCESS);
+        }
+
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 

+ 8 - 8
gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowBasicController.java

@@ -54,7 +54,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -69,7 +69,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
@@ -86,7 +86,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
@@ -114,7 +114,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -129,7 +129,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
 
@@ -146,7 +146,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -182,7 +182,7 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -214,6 +214,6 @@ public class KnowBasicController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 }

+ 2 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowFaultProcessController.java

@@ -77,7 +77,7 @@ public class KnowFaultProcessController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -92,6 +92,6 @@ public class KnowFaultProcessController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 }

+ 2 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/controller/KnowMaintenanceController.java

@@ -54,7 +54,7 @@ public class KnowMaintenanceController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 
     /**
@@ -69,6 +69,6 @@ public class KnowMaintenanceController {
             return JsonResult.success(ResultCode.SUCCESS);
         }
 
-        return JsonResult.error(ResultCode.ERROR);
+        return JsonResult.error(ResultCode.ERROR_DATA);
     }
 }

+ 84 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/controller/PowerCurveController.java

@@ -0,0 +1,84 @@
+package com.gyee.impala.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.impala.common.result.JsonResult;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.service.master.PowercurvebasicService;
+import com.gyee.impala.service.master.PowercurvefittingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+
+/**
+ * 功率曲线拟合
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/powercurve")
+public class PowerCurveController {
+
+
+    @Autowired
+    private PowercurvebasicService powercurvebasicService;
+    @Autowired
+    private PowercurvefittingService fittingService;
+
+
+    /**
+     * 功率曲线拟合的侧边栏树状结构
+     * @return
+     */
+    @GetMapping("/tree")
+    public JSONObject getTreeData(){
+        Object object = powercurvebasicService.getListTree();
+        return JsonResult.successData(ResultCode.SUCCESS, object);
+    }
+
+
+    /**
+     * 分页散点图的表格数据
+     * @return
+     */
+    @GetMapping("/list")
+    public JSONObject getDataPage(@RequestParam("station") String station,
+                                  @RequestParam("wtid") String wtId,
+                                  @RequestParam("time") String time,
+                                  @RequestParam("pagenum") int pageNum,
+                                  @RequestParam("pagesize") int pageSize){
+
+        Object obj = fittingService.getDataPage(station, wtId, time, pageNum, pageSize);
+
+        return JsonResult.successData(ResultCode.SUCCESS, obj);
+    }
+
+
+    /**
+     * 数据预处理模块,数据删除
+     * @return
+     */
+    @GetMapping("/delete")
+    public JSONObject deletePowerCurveBasic(@RequestParam("station") String station,
+                                            @RequestParam("wtid") String wtId,
+                                            @RequestParam ("time") String time,
+                                            @RequestParam("ids") String... ids){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(DateUtil.parseStrtoDate(time, DateUtil.YYYY_MM));
+        String st = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        String et = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+
+        // 删除基本表数据
+        boolean flag = powercurvebasicService.deleteList(ids);
+        if (flag) {
+            // 删除散点表数据
+            Arrays.asList(ids).forEach(id -> fittingService.deleteItem(station, wtId, st, et));
+            return JsonResult.successData(ResultCode.SUCCESS, flag);
+        }
+        else{
+            return JsonResult.error(ResultCode.ERROR_DATA);
+        }
+    }
+}

+ 39 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/controller/WeatherController.java

@@ -0,0 +1,39 @@
+package com.gyee.impala.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.impala.common.result.JsonResult;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.model.master.Weatherforecast;
+import com.gyee.impala.service.master.WeatherforecastService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 天气数据
+ * 预测数据、实际数据
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/weather")
+public class WeatherController {
+
+    @Autowired
+    private WeatherforecastService forecastService;
+
+
+    /**
+     * 预测数据
+     * @return
+     */
+    @GetMapping("/forecast/list")
+    public JSONObject getForecastData(@RequestParam("station") String station,
+                                  @RequestParam("st") String st,
+                                  @RequestParam("et") String et){
+
+        List<Weatherforecast> list = forecastService.getListByStationAndTime(station, st, et);
+        return JsonResult.successData(ResultCode.SUCCESS, list);
+    }
+}

+ 16 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/decision/WfNwpDataMapper.java

@@ -0,0 +1,16 @@
+package com.gyee.impala.mapper.decision;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.impala.model.decision.WfNwpData;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-03-18
+ */
+public interface WfNwpDataMapper extends BaseMapper<WfNwpData> {
+
+}

+ 9 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/PowercurvebasicMapper.java

@@ -0,0 +1,9 @@
+package com.gyee.impala.mapper.master;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.impala.model.master.Powercurvebasic;
+
+
+public interface PowercurvebasicMapper extends BaseMapper<Powercurvebasic> {
+
+}

+ 32 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/PowercurvefittingMapper.java

@@ -2,7 +2,39 @@ package com.gyee.impala.mapper.master;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.impala.model.master.Powercurvebasic;
 import com.gyee.impala.model.master.Powercurvefitting;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 public interface PowercurvefittingMapper extends BaseMapper<Powercurvefitting> {
+
+    /**
+     *  分页查询
+     * @param station
+     * @param wtId
+     * @param st  开始时间
+     * @param et  结束时间
+     * @param stNum  开始条数
+     * @param etNum  结束条数
+     * @return
+     */
+    @Select("select t.* from (select * ,(row_number() over(order by time)) rn " +
+            "from powercurvefitting where stationen = #{station} and " +
+            "windturbineid = #{wtid} and time >= #{st} and time <= #{et}) " +
+            "t where t.rn between #{stnum} and #{etnum}")
+    List<Powercurvefitting> selectListByPage(@Param("station") String station,
+                                             @Param("wtid")  String wtId,
+                                             @Param("st")  String st,
+                                             @Param("et") String et,
+                                             @Param("stnum") int stNum,
+                                             @Param("etnum") int etNum);
+
+
+    @Select("truncate table powercurvefitting where stationen = #{station} and " +
+            "windturbineid = #{wtid} and time >= #{st} and time <= #{et}")
+    void deleteItem(@Param("station") String station, @Param("wtid")  String wtId,
+                    @Param("st")  String st, @Param("et") String et);
 }

+ 7 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/WeatheractualMapper.java

@@ -0,0 +1,7 @@
+package com.gyee.impala.mapper.master;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.impala.model.master.Weatheractual;
+
+public interface WeatheractualMapper extends BaseMapper<Weatheractual> {
+}

+ 26 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/mapper/master/WeatherforecastMapper.java

@@ -0,0 +1,26 @@
+package com.gyee.impala.mapper.master;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.impala.model.master.Weatherforecast;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+public interface WeatherforecastMapper extends BaseMapper<Weatherforecast> {
+
+
+
+    @Select("SELECT * from weatherforecast where time = (SELECT max(time) as time " +
+            "from weatherforecast where stationen = #{station} order by time desc) and stationen = #{station}")
+    List<Weatherforecast> getOneMaxTimeByStation(@Param("station") String station);
+
+
+    @Select("select * from weatherforecast w, (select MAX(filetime) as a, time  from \n" +
+            "weatherforecast where substr(time,15,5)='00:00' and time >= #{st}" +
+            "and time <= #{et} and stationen = #{station} group by  time) as t \n" +
+            "where w.filetime = t.a and w.time = t.time and stationen = #{station};")
+    List<Weatherforecast> getListByStationAndTime(@Param("station") String station,
+                                           @Param("st") String st,
+                                           @Param("et") String et);
+}

+ 8 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/ToData.java

@@ -0,0 +1,8 @@
+package com.gyee.impala.model;
+
+
+public interface ToData<Object> {
+
+    Object toData(Object t);
+
+}

+ 32 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/custom/PowerCurveCondition.java

@@ -0,0 +1,32 @@
+package com.gyee.impala.model.custom;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 功率曲线拟合时的帅选条件实体类
+ */
+@Data
+public class PowerCurveCondition {
+
+    private String id;
+    private String stationen;
+    private List<String> windturbineid;
+    /***对应 windturbineid 的单条*/
+    private String wtId;
+    private Integer intervals;
+    private String time;
+    private boolean connected;
+    private boolean correct;
+    private boolean connected10;
+    private boolean prestop10;
+    private boolean curveoffset;
+    private Integer levels;
+    private String remark;
+    private String category;
+    private String startting;
+    private String endtime;
+
+}

+ 3 - 3
gyee-sample-impala/src/main/java/com/gyee/impala/model/custom/TsDoubleData.java

@@ -25,12 +25,12 @@ public class TsDoubleData {
     }
 
     public double getDoubleValue() {
+//        BigDecimal bg = new BigDecimal(doubleValue);
+//        double v = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
         return doubleValue;
     }
 
     public void setDoubleValue(double doubleValue) {
-        BigDecimal bg = new BigDecimal(doubleValue);
-        double v = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-        this.doubleValue = v;
+        this.doubleValue = doubleValue;
     }
 }

+ 61 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/decision/WfNwpData.java

@@ -0,0 +1,61 @@
+package com.gyee.impala.model.decision;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("WF_NWP_DATA")
+public class WfNwpData extends Model<WfNwpData> {
+
+    private static final long serialVersionUID=1L;
+
+      @TableId("WINDPLANT_NO")
+    private Integer windplantNo;
+
+    @TableField("NWP_TYPE")
+    private Integer nwpType;
+
+    @TableField("FILE_TIME")
+    private Integer fileTime;
+
+    @TableField("DATA_TIME")
+    private Date dataTime;
+
+    @TableField("WIND_SPEED")
+    private Float windSpeed;
+
+    @TableField("TEMPERATURE")
+    private Float temperature;
+
+    @TableField("WIND_DIR")
+    private Float windDir;
+
+    @TableField("HUMIDITY")
+    private Float humidity;
+
+    @TableField("AIR_PRESSURE")
+    private Float airPressure;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.windplantNo;
+    }
+
+}

+ 2 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Caseperformance.java

@@ -21,7 +21,7 @@ public class Caseperformance extends Model<Caseperformance> {
 
     private static final long serialVersionUID = 1L;
 
-    private Long id;
+    private String id;
 
     private Integer tag;
 
@@ -35,7 +35,7 @@ public class Caseperformance extends Model<Caseperformance> {
 
     private Double intervals;
 
-    private Integer algtype;
+    private String algtype;
 
     private String stationcn;
 

+ 66 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Powercurvebasic.java

@@ -0,0 +1,66 @@
+package com.gyee.impala.model.master;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.gyee.impala.model.ToData;
+import com.gyee.impala.model.custom.PowerCurveCondition;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.poi.ss.formula.functions.T;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("Powercurvebasic")
+public class Powercurvebasic extends Model<Powercurvebasic> implements ToData<Object> {
+
+    private static final long serialVersionUID=1L;
+
+    private String id;
+    private String stationen;
+    private String windturbineid;
+    private Integer intervals;
+    private String time;
+    private boolean connected;
+    private boolean correct;
+    private boolean connected10;
+    private boolean prestop10;
+    private boolean curveoffset;
+    private Integer levels;
+    private String remark;
+    private String category;
+    private String starttime;
+    private String endtime;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+
+    @Override
+    public Object toData(Object t) {
+        PowerCurveCondition p = (PowerCurveCondition) t;
+        if (p == null)
+            return null;
+
+        Powercurvebasic basic = new Powercurvebasic();
+        basic.setStationen(p.getStationen());
+        basic.setWindturbineid(p.getWtId());
+        basic.setIntervals(p.getIntervals());
+        basic.setTime(p.getTime());
+        basic.setConnected(p.isConnected());
+        basic.setCorrect(p.isCorrect());
+        basic.setConnected10(p.isConnected10());
+        basic.setPrestop10(p.isPrestop10());
+        basic.setCurveoffset(p.isCurveoffset());
+        basic.setLevels(p.getLevels());
+        basic.setRemark(p.getRemark());
+        basic.setCategory(p.getCategory());
+
+        return basic;
+    }
+}

+ 18 - 4
gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Powercurvefitting.java

@@ -17,17 +17,31 @@ public class Powercurvefitting extends Model<Powercurvefitting> {
 
     private String id;
 
-    private String station;
+    private String stationen;
 
     private String windturbineid;
 
     private String time;
 
-    private String scatter;
+    private Double speed;
 
-    private String lineactual;
+    private Double power;
 
-    private String lineoptimal;
+    private Double rotate;
+
+    private Integer status;
+
+    private Double quantity;
+
+    private Integer curveoffset;
+
+    private Double direction;
+
+    private Double angle;
+
+    private String starttime;
+
+    private String endtime;
 
     private String remark;
 

+ 31 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Weatheractual.java

@@ -0,0 +1,31 @@
+package com.gyee.impala.model.master;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("weatheractual")
+public class Weatheractual extends Model<Weatheractual> {
+
+    private String id;
+    private String stationen;
+    private String stationcn;
+    private String time;
+    private Double speed;
+    private Double temperature;
+    private Double direction;
+    private Double humidity;
+    private Double pressure;
+    private String remark;
+    private String category;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+}

+ 52 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/model/master/Weatherforecast.java

@@ -0,0 +1,52 @@
+package com.gyee.impala.model.master;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.model.ToData;
+import com.gyee.impala.model.decision.WfNwpData;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("weatherforecast")
+public class Weatherforecast extends Model<Weatherforecast> implements ToData<Object> {
+
+    private String id;
+    private String stationen;
+    private String stationcn;
+    private int filetime;
+    private String time;
+    private Double speed;
+    private Double temperature;
+    private Double direction;
+    private Double humidity;
+    private Double pressure;
+    private String remark;
+    private String category;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public Object toData(Object t) {
+        WfNwpData wd = (WfNwpData) t;
+        if (wd == null)
+            return null;
+
+        Weatherforecast obj = new Weatherforecast();
+        obj.setFiletime(Integer.valueOf(wd.getFileTime()));
+        obj.setTime(DateUtil.format(wd.getDataTime(), DateUtil.YYYY_MM_DD_HH_MM_SS));
+        obj.setSpeed(Double.valueOf(wd.getWindSpeed()));
+        obj.setTemperature(Double.valueOf(wd.getTemperature()));
+        obj.setDirection(Double.valueOf(wd.getWindDir()));
+        obj.setHumidity(Double.valueOf(wd.getHumidity()));
+        obj.setPressure(Double.valueOf(wd.getAirPressure()));
+        return obj;
+    }
+}

+ 0 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/schdule/TaskPerformance.java

@@ -61,7 +61,6 @@ public class TaskPerformance {
             if (i > 10)
                 break;
 
-            System.out.println("======: " + listNSS.get(i).getId());
             Windturbinepoint wp_zs = windturbinepointService.getItemByWtIdAndUniformCode(listNSS.get(i).getId(), FDJZS);
             Windturbinepoint wp_zt = windturbinepointService.getItemByWtIdAndUniformCode(listNSS.get(i).getId(), FJMXZT);
             Windturbinepoint wp_qf = windturbinepointService.getItemByWtIdAndUniformCode(listNSS.get(i).getId(), RSSQFZT);

+ 58 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/schdule/TaskWeather.java

@@ -0,0 +1,58 @@
+package com.gyee.impala.schdule;
+
+
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.model.decision.WfNwpData;
+import com.gyee.impala.model.master.Weatherforecast;
+import com.gyee.impala.service.decision.WfNwpDataService;
+import com.gyee.impala.service.master.WeatherforecastService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class TaskWeather {
+
+
+    @Autowired
+    private WfNwpDataService nwpDataService;
+    @Autowired
+    private WeatherforecastService forecastService;
+
+    private static Map<Integer, String> MAP_STATION = new HashMap<>();
+
+    static {
+        MAP_STATION.put(1, "NSS_FDC");
+        MAP_STATION.put(2, "QS_FDC");
+        MAP_STATION.put(3, "SBQ_FDC");
+        MAP_STATION.put(4, "XS_FDC");
+        MAP_STATION.put(5, "MHS_FDC");
+    }
+
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void weatherForecastTask(){
+        MAP_STATION.forEach((k, v) -> {
+            Weatherforecast forecast = forecastService.getOneMaxTimeByStation(v);
+            if (forecast == null)
+                return;
+            String time = forecast.getTime();
+            List<WfNwpData> ls = nwpDataService.getListByStationAndTime(k, DateUtil.parseStrtoDate(time, DateUtil.YYYY_MM_DD_HH_MM_SS), null);
+
+            List<Weatherforecast> list = new ArrayList<>();
+            ls.stream().forEach(obj -> {
+                Weatherforecast wf = (Weatherforecast) new Weatherforecast().toData(obj);
+                wf.toData(obj);
+                wf.setStationen(v);
+                list.add(wf);
+            });
+
+            forecastService.insertBatch(list);
+        });
+    }
+}

+ 161 - 143
gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/AnalyseScatterService.java

@@ -1,26 +1,28 @@
 package com.gyee.impala.service.custom;
 
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
+import com.gyee.impala.common.config.datasource.HiveDataSourceConfig;
+import com.gyee.impala.common.config.jsch.JSchConfig;
 import com.gyee.impala.common.constant.Constants;
 import com.gyee.impala.common.exception.CustomException;
 import com.gyee.impala.common.feign.RemoteServiceBuilder;
 import com.gyee.impala.common.result.ResultCode;
-import com.gyee.impala.common.util.Base64Util;
 import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.common.util.FileUtil;
+import com.gyee.impala.common.util.SnowFlakeUtil;
+import com.gyee.impala.model.custom.PowerCurveCondition;
 import com.gyee.impala.model.custom.TsDoubleData;
+import com.gyee.impala.model.master.Powercurvebasic;
 import com.gyee.impala.model.master.Powercurvefitting;
-import com.gyee.impala.model.master.Windturbinepoint;
 import com.gyee.impala.model.slave.Windturbinecurvefittingmonth;
 import com.gyee.impala.model.slave.Windturbinetestingpointai2;
+import com.gyee.impala.service.master.PowercurvebasicService;
 import com.gyee.impala.service.master.PowercurvefittingService;
-import com.gyee.impala.service.master.WindturbinepointService;
 import com.gyee.impala.service.slave.WindturbinecurvefittingmonthService;
 import com.gyee.impala.service.slave.Windturbinetestingpointai2Service;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.text.DecimalFormat;
@@ -33,139 +35,178 @@ import java.util.*;
 @Service
 public class AnalyseScatterService {
 
-    // 读取golden数据库的时间间隔
-    private final int interval = 1200;
-
-    @Autowired
-    private WindturbinepointService windturbinepointService;
     @Autowired
-    private Windturbinetestingpointai2Service windturbinetestingpointai2Service;
+    private Windturbinetestingpointai2Service pointAi2Service;
     @Autowired
     private PowercurvefittingService powercurvefittingService;
     @Autowired
-    private WindturbinecurvefittingmonthService windturbinecurvefittingmonthService;
+    private PowercurvebasicService powercurvebasicService;
+    @Autowired
+    private WindturbinecurvefittingmonthService fittingService;
     @Autowired
     private RemoteServiceBuilder remoteServiceBuilder;
     @Autowired
-    private GoldenService goldenService;
+    private SftpFileService fileService;
+    @Autowired
+    private HiveDataSourceConfig hiveConfig;
+    @Autowired
+    private JSchConfig config;
 
 
     /**
-     * 偏航对风 通过计算服务取数
+     * 数据预处理
+     *
+     * @param condition
+     */
+    @Async
+    public void dataPreprocess(PowerCurveCondition condition){
+        //对多台风机操作
+        condition.getWindturbineid().stream().forEach(wtId -> {
+            List<Powercurvebasic> list = powercurvebasicService.getList(condition.getStationen(), wtId, condition.getTime());
+            if (list != null && list.size() > 0)
+                return;
+
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(DateUtil.parseStrtoDate(condition.getTime(), DateUtil.YYYY_MM));
+            cal.set(Calendar.HOUR_OF_DAY, cal.getActualMinimum(Calendar.HOUR_OF_DAY));
+            long st = cal.getTime().getTime();
+            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+            long et = cal.getTime().getTime();
+
+            int interval = condition.getIntervals();
+            String station = condition.getStationen();
+            try {
+                /**********************   数据预处理需要的测点    ******************************/
+                List<Windturbinetestingpointai2> power = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.POINT_POWER);
+                List<Windturbinetestingpointai2> speed = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.POINT_SPEED);
+
+                // 数据库(oracle)配置问题, 可能有空值
+                List<Windturbinetestingpointai2> rotate = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.FDJZS);
+                if (rotate == null)
+                    rotate = pointAi2Service
+                            .getListByStationAndCode(station, wtId, Constants.FDJZSB);
+                List<Windturbinetestingpointai2> status = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.FJZT);
+                List<Windturbinetestingpointai2> fdl = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.POINT_QUANTITY);
+                List<Windturbinetestingpointai2> ssqfzt = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.RSSQFZT);
+                List<Windturbinetestingpointai2> direct = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.POINT_WIND_DIRECT);
+                List<Windturbinetestingpointai2> angle = pointAi2Service
+                        .getListByStationAndCode(station, wtId, Constants.POINT_WIND_ANGLE);
+                /**********************   数据预处理需要的测点    ******************************/
+
+
+                /**********************   数据存储到hive   ******************************/
+                List<TsDoubleData> dataPower = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(power.size() > 0 ? power.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataSpeed = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(speed.size() > 0 ? speed.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataRotate = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(rotate.size() > 0 ? rotate.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataStatus = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(status.size() > 0 ? status.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataFdl = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(fdl.size() > 0 ? fdl.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataQfzt = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(ssqfzt.size() > 0 ? ssqfzt.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataDirect = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(direct.size() > 0 ? direct.get(0).getId() : "", st, et, interval);
+                List<TsDoubleData> dataAngle = remoteServiceBuilder.ShardingService()
+                        .getHistorySnapAI(angle.size() > 0 ? angle.get(0).getId() : "", st, et, interval);
+
+                StringBuffer sb = new StringBuffer();
+                for (int i = 0; i < dataPower.size(); i++) {
+                    sb.append(SnowFlakeUtil.generateId()).append("^");
+                    sb.append(condition.getStationen()).append("^");
+                    sb.append(wtId).append("^");
+                    sb.append(DateUtil.format(dataPower.get(i).getTs(), DateUtil.YYYY_MM_DD_HH_MM_SS)).append("^");
+                    sb.append(dataPower.size() > 0 ? dataPower.get(i).getDoubleValue() : 0).append("^");
+                    sb.append(dataSpeed.size() > 0 ? dataSpeed.get(i).getDoubleValue() : 0).append("^");
+                    sb.append(dataRotate.size() > 0 ? dataRotate.get(i).getDoubleValue() : 0).append("^");
+                    sb.append((int) dataStatus.get(i).getDoubleValue()).append("^");
+                    sb.append(dataFdl.size() > 0 ? dataFdl.get(i).getDoubleValue() : 0).append("^");
+                    sb.append((int) dataQfzt.get(i).getDoubleValue()).append("^");
+                    sb.append(dataDirect.size() > 0 ? dataDirect.get(i).getDoubleValue() : 0).append("^");
+                    sb.append(dataAngle.size() > 0 ? dataAngle.get(i).getDoubleValue() : 0).append("^^^^\n");
+                }
+
+                String fileName = station + "_" + wtId + "_" + condition.getTime() + ".txt";
+                /**上传文件**/
+                fileService.uploadFile(fileName, FileUtil.convertStringToInputStream(sb.toString()));
+                /**文件load到hive表**/
+                String sql = "load data local inpath '" + config.getPath() + "/" + fileName + "' into table gyee_sample_kudu.powercurvefitting";
+                hiveConfig.execute(sql);
+                /**********************   数据存储到kudu   ******************************/
+                condition.setWtId(wtId);
+                powercurvebasicService.insertItem((Powercurvebasic) new Powercurvebasic().toData(condition));
+            } catch (Exception e) {
+                e.getStackTrace();
+                log.error(e.getMessage());
+                throw new CustomException(ResultCode.ERROR_DATA);
+            }
+        });
+    }
+
+
+    /**
+     * 查询散点数据 (散点,实际功率,最有功率)
+     *
      * @param station
      * @param wtId
      * @param time
      * @return
      */
-    public Map<String, List<List<Double>>> getScatterList(String station, String wtId, String time) {
-        Map<String, List<List<Double>>> result = new HashMap<>();
+    public Map<String, List<List<Object>>> getScatterList(String station, String wtId, String time) {
+        Map<String, List<List<Object>>> result = new HashMap<>();
 
-        List<List<Double>> scatter = new ArrayList<>();  //散点
-        List<List<Double>> actual = new ArrayList<>(); //实际功率
-        List<List<Double>> optimal = new ArrayList<>(); //最优功率
+        List<List<Object>> scatter = new ArrayList<>(); //散点
+        List<List<Object>> actual = new ArrayList<>(); //实际功率
+        List<List<Object>> optimal = new ArrayList<>(); //最优功率
 
         Calendar cal = Calendar.getInstance();
-        Powercurvefitting item = powercurvefittingService.getOne(station, wtId, time);
-
-        if (item != null) {
-            // 缓存有数据直接使用缓存
-        } else {
-            // 缓存没数据,先查golden,在缓存
-            cal.setTime(DateUtil.dateTime(DateUtil.YYYY_MM, time));
-            int year = cal.get(Calendar.YEAR);
-            int month = cal.get(Calendar.MONTH);
-
-            time = year + "-" + StringUtils.leftPad(String.valueOf(month + 1), 2, "0");
-
-            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
-            long startTime = cal.getTime().getTime();
-            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
-            long endTime = cal.getTime().getTime();
-
-            try{
-    //            /** --------------  散点图  风速、功率  -------------**/
-                Windturbinetestingpointai2 power = windturbinetestingpointai2Service.getItemByStationAndCode(station, wtId, Constants.POINT_POWER);
-                Windturbinetestingpointai2 speed = windturbinetestingpointai2Service.getItemByStationAndCode(station, wtId, Constants.POINT_SPEED);
-                Windturbinetestingpointai2 status = windturbinetestingpointai2Service.getItemByStationAndCode(station, wtId, Constants.FJZT);
-
-                List<TsDoubleData> listPower = remoteServiceBuilder.ShardingService().getHistorySnapAI(power.getId(), startTime, endTime, interval);
-                List<TsDoubleData> listSpeed = remoteServiceBuilder.ShardingService().getHistorySnapAI(speed.getId(), startTime, endTime, interval);
-                /** --------------  散点图  风速、功率  -------------**/
-
-                DecimalFormat dcmFmt = new DecimalFormat("0.00");
-                if (!listPower.isEmpty() && !listSpeed.isEmpty()) {
-                    for (int j = 0; j < listPower.size(); j++) {
-                        List<Double> ds = new ArrayList<>();
-
-                        double f = listSpeed.get(j).getDoubleValue();
-                        ds.add(Double.valueOf(dcmFmt.format(f)));
-                        f = listPower.get(j).getDoubleValue() < 0 ? 0 : listPower.get(j).getDoubleValue();
-                        ds.add(Double.valueOf(dcmFmt.format(f)));
-                        scatter.add(ds);
-                    }
+        cal.setTime(DateUtil.parseStrtoDate(time, DateUtil.YYYY_MM));
+        int year = cal.get(Calendar.YEAR);
+        int month = cal.get(Calendar.MONTH);
+        String st = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        String et = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+
+        try {
+            /**查询散点**/
+            DecimalFormat df = new DecimalFormat("0.00");
+            List<Powercurvefitting> list = powercurvefittingService.getList(station, wtId, st, et);
+            list.stream().forEach(obj -> {
+                List<Object> ls = new ArrayList<>();
+                ls.add(Double.valueOf(df.format(obj.getSpeed())));
+                ls.add(Double.valueOf(df.format(obj.getPower())));
+                ls.add(obj.getTime());
+                scatter.add(ls);
+            });
+
+            /**查询功率**/
+            List<Windturbinecurvefittingmonth> curve = fittingService.getListByWtIdAndYearAndMonth(wtId, String.valueOf(year), String.valueOf(month));
+            curve.stream().forEach(cv -> {
+                List<Object> ap = new ArrayList<>();
+                List<Object> op = new ArrayList<>();
+                int c = cv.getSpeed().intValue();
+
+                if (c == cv.getSpeed()) {
+                    ap.add(cv.getSpeed());
+                    ap.add(cv.getActualpower());// 实际拟合功率
+                    op.add(cv.getSpeed());// 风速
+                    op.add(cv.getOptimalpower());// 最优拟合功率
+                    actual.add(ap);
+                    optimal.add(op);
                 }
-
-
-                /** --------------  散点图  风速、功率  -------------**/
-    //
-    //            List<List<Long>> listStatus = goldenService.getConnectData(status.getId(), startTime, endTime);
-    ////            if (listStatus.size() > 0){
-    ////                for (int i = 0; i< listStatus.size(); i++){
-    ////                    for (List<Long> ls : listStatus){
-    ////                        List<TsDoubleData> listPower = remoteServiceBuilder.ShardingService().getHistorySnapAI(power.getId(), ls.get(0), ls.get(1), interval);
-    ////                        List<TsDoubleData> listSpeed = remoteServiceBuilder.ShardingService().getHistorySnapAI(speed.getId(), ls.get(0), ls.get(1), interval);
-    ////                        /** --------------  散点图  风速、功率  -------------**/
-    ////
-    ////                        DecimalFormat dcmFmt = new DecimalFormat("0.00");
-    ////                        if (!listPower.isEmpty() && !listSpeed.isEmpty()) {
-    ////                            for (int j = 0; j < listPower.size(); j++) {
-    ////                                List<Double> ds = new ArrayList<>();
-    ////
-    ////                                double f = listSpeed.get(j).getDoubleValue();
-    ////                                ds.add(Double.valueOf(dcmFmt.format(f)));
-    ////                                f = listPower.get(j).getDoubleValue() < 0 ? 0 : listPower.get(j).getDoubleValue();
-    ////                                ds.add(Double.valueOf(dcmFmt.format(f)));
-    ////                                scatter.add(ds);
-    ////                            }
-    ////                        }
-    ////                    }
-    ////                }
-    ////            }
-
-                List<Windturbinecurvefittingmonth> curve = windturbinecurvefittingmonthService.getListByWtIdAndYearAndMonth(wtId, String.valueOf(year), String.valueOf(month));
-                for (Windturbinecurvefittingmonth wc : curve) {
-                    List<Double> ap = new ArrayList<>();
-                    List<Double> op = new ArrayList<>();
-                    int c = wc.getSpeed().intValue();
-
-                    if (c == wc.getSpeed()) {
-                        ap.add(wc.getSpeed());
-                        ap.add(wc.getActualpower());// 实际拟合功率
-                        op.add(wc.getSpeed());// 风速
-                        op.add(wc.getOptimalpower());// 最优拟合功率
-                        actual.add(ap);
-                        optimal.add(op);
-                    }
-                }
-
-
-                //新风机的拟合数据插入缓存
-//                Powercurvefitting temp = new Powercurvefitting();
-//                temp.setStation(station);
-//                temp.setWindturbineid(wtId);
-//                temp.setTime(time);
-//                System.out.println("===" + Base64Util.encode(scatter.toString()).length());
-//                temp.setScatter(Base64Util.encode(scatter.toString()));
-//                temp.setLineactual(Base64Util.encode(actual.toString()));
-//                temp.setLineoptimal(Base64Util.encode(optimal.toString()));
-//                temp.setRemark("1");
-//                temp.setCategory("1");
-//                powercurvefittingService.insertItem(temp);
-
-            } catch (CustomException e) {
-                log.error(e.getMessage());
-                throw new CustomException(ResultCode.ERROR_DATA);
-            }
+            });
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
         }
 
         result.put("scatter", scatter);
@@ -176,27 +217,4 @@ public class AnalyseScatterService {
     }
 
 
-    public void getTotalRangeCal(String wtId, long startTime, long endTime) {
-        try{
-            /** --------------  对风偏差  风速、风向  -------------**/
-            Windturbinepoint direct = windturbinepointService.getItemByWtIdAndUniformCode(wtId, Constants.POINT_WIND_DIRECT);
-            Windturbinepoint angle = windturbinepointService.getItemByWtIdAndUniformCode(wtId, Constants.POINT_WIND_ANGLE);
-            List<TsDoubleData> listDirect = remoteServiceBuilder.ShardingService().getHistorySnapAI(direct.getPoint(), startTime, endTime, interval);
-            List<TsDoubleData> listAngle = remoteServiceBuilder.ShardingService().getHistorySnapAI(angle.getPoint(), startTime, endTime, interval);
-            /** --------------  对风偏差  风速、风向  -------------**/
-
-        } catch (CustomException e) {
-            log.error(e.getMessage());
-            throw new CustomException(ResultCode.ERROR_DATA);
-        }
-    }
-
-
-    public static void main(String[] args){
-        StringBuilder sb = new StringBuilder();
-        for(int i = 0; i < 200000; i++)
-            sb.append("A");
-
-        System.out.println(sb.toString().length());
-    }
 }

+ 87 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/FileUploadService.java

@@ -0,0 +1,87 @@
+package com.gyee.impala.service.custom;
+
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.common.util.ExcelUtil;
+import com.gyee.impala.model.master.Casefault;
+import com.gyee.impala.service.master.CasefaultService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class FileUploadService {
+
+    @Autowired
+    private CasefaultService casefaultService;
+
+    /**
+     * 解析excel文件保存故障样本
+     * @param file
+     * @return
+     */
+    public boolean resolveFaultExcel(MultipartFile file){
+        List<Casefault> list = new ArrayList<>();
+        InputStream is = null;
+        try {
+            SimpleDateFormat format = new SimpleDateFormat(DateUtil.YYYY_MM_DD_HH_MM_SS);
+            is = file.getInputStream();
+            Workbook wb = null;
+            if (ExcelUtil.checkFile(file.getOriginalFilename()) == 1) {
+                wb = new XSSFWorkbook(is);
+            } else if (ExcelUtil.checkFile(file.getOriginalFilename()) == 2) {
+                wb = new HSSFWorkbook(is);
+            }
+            // 解析文件  读第一个sheet
+            Sheet sheet = wb.getSheetAt(0);
+            // 第一行是标题,不解析
+            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+                Row row = sheet.getRow(i);
+                if (row == null)
+                    continue;
+
+                Casefault obj = new Casefault();
+                obj.setTag((int) row.getCell(0).getNumericCellValue());
+                obj.setStationcn(row.getCell(1).getStringCellValue());
+                obj.setStationen(row.getCell(2).getStringCellValue());
+                obj.setWindturbineid(row.getCell(3).getStringCellValue());
+                obj.setModel(row.getCell(4).getStringCellValue());
+                obj.setFaulttype(row.getCell(5).getStringCellValue());
+                obj.setFaultcode(row.getCell(6).getStringCellValue());
+                obj.setSymptom(row.getCell(7).getStringCellValue());
+                obj.setStarttime(format.format(row.getCell(8).getDateCellValue()));
+                obj.setEndtime(format.format(row.getCell(9, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).getDateCellValue()));
+                obj.setManufacturer(row.getCell(10).getStringCellValue());
+                obj.setCategory(row.getCell(11).getStringCellValue());
+                list.add(obj);
+            }
+
+            casefaultService.insertBatch(list);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomException(ResultCode.ERROR_DATA_TYPE);
+        } finally {
+            if (is == null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return true;
+    }
+}

+ 5 - 3
gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/GoldenService.java

@@ -6,7 +6,6 @@ import com.gyee.impala.common.exception.CustomException;
 import com.gyee.impala.common.feign.RemoteServiceBuilder;
 import com.gyee.impala.common.result.ResultCode;
 import com.gyee.impala.common.util.DateUtil;
-import com.gyee.impala.model.custom.TsBooleanData;
 import com.gyee.impala.model.custom.TsDoubleData;
 import com.gyee.impala.model.master.Caseperformance;
 import com.gyee.impala.model.master.Windturbinepoint;
@@ -16,6 +15,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.*;
 
 @Slf4j
@@ -44,7 +45,6 @@ public class GoldenService {
         List<Map> list = new ArrayList<>();
 
         try {
-
             for (String point : points) {
                 Windturbinepoint w = windturbinepointService.getByPoint(point);
                 List<TsDoubleData> data = new ArrayList<>();
@@ -54,6 +54,8 @@ public class GoldenService {
                 } else {
                     data = remoteService.ShardingService().getHistorySnapAI(point, startTs, endTs, interval);
                 }
+                /**保留2位小数**/
+                data.stream().forEach(obj -> obj.setDoubleValue(new BigDecimal(obj.getDoubleValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue()));
                 m.put("name", w.getPointdes());
                 m.put("code", w.getWidgetcode());
                 m.put("point", w.getPoint());
@@ -83,7 +85,7 @@ public class GoldenService {
         try {
             for (String id : ids) {
                 String[] codes = new String[]{Constants.POINT_SPEED, Constants.POINT_POWER};
-                Caseperformance cp = caseperformanceService.getPerformanceByid(id);
+                Caseperformance cp = caseperformanceService.getPerformanceById(id);
 
                 //查询测点名
                 List<Windturbinepoint> winds = windturbinepointService.getListByStationAndWtIdAndUniformCode(cp.getStationen(), cp.getWindturbineid(), codes);

+ 119 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/custom/SftpFileService.java

@@ -0,0 +1,119 @@
+package com.gyee.impala.service.custom;
+
+import com.gyee.impala.common.config.jsch.JSchConfig;
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.util.FileUtil;
+import com.gyee.impala.common.util.JudeSystem;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.SftpException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStream;
+import java.util.Arrays;
+
+
+/**
+ * 功率曲线过滤的数据 sftp 上传到目录‘/gyee/dataprocess’
+ */
+@Service
+@Slf4j
+public class SftpFileService {
+
+    @Autowired
+    private JSchConfig config;
+
+
+    /**
+     * @Title: createDirs @Description: 创建层级目录 @param: @param
+     * dirPath @param: @param jsch @param: @return @return: boolean @throws
+     */
+    private boolean createDirs(String dirPath, ChannelSftp sftp) {
+        if (dirPath != null && !dirPath.isEmpty() && sftp != null) {
+            String[] dirs = Arrays.stream(dirPath.split("/")).filter(StringUtils::hasLength).toArray(String[]::new);
+
+            try {
+                // 进入到"/"
+                sftp.cd("/");
+            } catch (SftpException e) {
+                e.printStackTrace();
+            }
+
+            for (String dir : dirs) {
+                try {
+                    sftp.cd(dir);
+                } catch (Exception e) {
+                    try {
+                        sftp.mkdir(dir);
+                    } catch (SftpException e1) {
+                        log.error("[sftp创建目录失败]:{}", dir, e1);
+                        e1.printStackTrace();
+                        throw new CustomException(ResultCode.ERROR_DATA_DIR);
+                    }
+                    try {
+                        sftp.cd(dir);
+                    } catch (SftpException e1) {
+                        log.error("[sftp切换目录失败]:{}", dir, e1);
+                        e1.printStackTrace();
+                        throw new CustomException(ResultCode.ERROR_DATA_DIR);
+                    }
+                }
+            }
+
+            return true;
+        }
+        return false;
+    }
+
+
+    /**
+     * linux部署 直接写入文件
+     * windows部署 通过sftp上传文件
+     * @param fileName
+     * @param in
+     */
+    public void uploadFile(String fileName, InputStream in) {
+        if (JudeSystem.isWindows()){
+            ChannelSftp sftp = config.getSftpSocket();
+            try {
+                boolean dirs = this.createDirs(config.getPath(), sftp);
+                if (!dirs) {
+                    log.error("sftp创建目录失败", config.getPath());
+                    throw new CustomException(ResultCode.ERROR_DATA_FILE);
+                }
+
+                sftp.put(in, fileName);
+
+                log.info("linux文件上传成功{}", fileName);
+
+            } catch (Exception e) {
+                log.error("上传文件失败", fileName, e);
+                throw new CustomException(ResultCode.ERROR_DATA_FILE);
+            } finally {
+                config.returnSftpSocket(sftp);
+            }
+        } else if (JudeSystem.isLinux()){
+            FileUtil.writeFile(config.getPath(), fileName, in);
+        }
+    }
+
+
+    public boolean deleteFile(String targetPath) {
+        ChannelSftp sftp = null;
+        try {
+            sftp = config.getSftpSocket();
+            sftp.cd(config.getPath());
+            sftp.rm(targetPath);
+            return true;
+        } catch (Exception e) {
+            log.error("删除文件失败", targetPath, e);
+            e.printStackTrace();
+            throw new RuntimeException("删除文件失败");
+        } finally {
+            config.returnSftpSocket(sftp);
+        }
+    }
+}

+ 27 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/decision/WfNwpDataService.java

@@ -0,0 +1,27 @@
+package com.gyee.impala.service.decision;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.impala.model.decision.WfNwpData;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-03-18
+ */
+public interface WfNwpDataService extends IService<WfNwpData> {
+
+    /**
+     * 通过场站和时间查询
+     * @param stationId
+     * @param st
+     * @param et
+     * @return
+     */
+    List<WfNwpData> getListByStationAndTime(Integer stationId, Date st, Date et);
+}

+ 44 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/decision/WfNwpDataServiceImpl.java

@@ -0,0 +1,44 @@
+package com.gyee.impala.service.impl.decision;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.impala.common.base.ExcludeQueryWrapper;
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.mapper.decision.WfNwpDataMapper;
+import com.gyee.impala.model.decision.WfNwpData;
+import com.gyee.impala.service.decision.WfNwpDataService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2022-03-18
+ */
+@Service
+public class WfNwpDataServiceImpl extends ServiceImpl<WfNwpDataMapper, WfNwpData> implements WfNwpDataService {
+
+
+    @Override
+    public List<WfNwpData> getListByStationAndTime(Integer stationId, Date st, Date et) {
+        ExcludeQueryWrapper<WfNwpData> wrapper = new ExcludeQueryWrapper<>();
+        wrapper.eq("WINDPLANT_NO", stationId)
+                .gt("DATA_TIME", st)
+                .le("DATA_TIME", et)
+                .eq("NWP_TYPE", 7)
+                .orderByAsc("DATA_TIME");
+
+        try{
+            return baseMapper.selectList(wrapper);
+        } catch (CustomException e){
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+}

+ 58 - 38
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultServiceImpl.java

@@ -2,8 +2,8 @@ package com.gyee.impala.service.impl.master;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.gyee.impala.common.base.ExcludeQueryWrapper;
+import com.gyee.impala.common.config.datasource.KuduDataSourceConfig;
 import com.gyee.impala.common.exception.CustomException;
-import com.gyee.impala.common.feign.RemoteServiceBuilder;
 import com.gyee.impala.common.result.ResultCode;
 import com.gyee.impala.common.util.DateUtil;
 import com.gyee.impala.common.util.SnowFlakeUtil;
@@ -11,11 +11,9 @@ import com.gyee.impala.model.master.Casefault;
 import com.gyee.impala.mapper.master.CasefaultMapper;
 import com.gyee.impala.service.master.CasefaultService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.kudu.client.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import java.util.List;
 
 /**
@@ -30,7 +28,7 @@ import java.util.List;
 public class CasefaultServiceImpl extends ServiceImpl<CasefaultMapper, Casefault> implements CasefaultService {
 
     @Autowired
-    private RemoteServiceBuilder serviceBuilder;
+    private KuduDataSourceConfig kuduConfig;
 
     @Override
     public List<Casefault> getAll(String station, String[] model, String[] widget, String st, String et,String category, Long[] ids) {
@@ -61,33 +59,20 @@ public class CasefaultServiceImpl extends ServiceImpl<CasefaultMapper, Casefault
     }
 
 
-    @Transactional
     @Override
-    public boolean insertOrUpdate(List<Casefault> list) {
-        boolean flag = false;
-
-        if (list == null || list.size() < 0)
-            return flag;
+    public void insertBatch(List<Casefault> list) {
+        if (list == null || list.size() == 0)
+            throw new CustomException(ResultCode.ERROR_DATA);
 
         try{
-            for (Casefault fault : list){
-                if (StringUtils.isEmpty(fault.getId())) {
-                    // 新增
-                    fault.setId(SnowFlakeUtil.generateId());
-                    fault.setCreatetime(DateUtil.getCurrentDate());
-                }
-            }
-
-            flag = saveOrUpdateBatch(list, list.size());
-
-        } catch (CustomException e) {
+            insert(list);
+        } catch (Exception e) {
             log.error(e.getMessage());
             throw new CustomException(ResultCode.ERROR_DATA);
         }
-
-        return flag;
     }
 
+
     @Override
     public boolean editItem(Casefault obj) {
         try {
@@ -99,20 +84,6 @@ public class CasefaultServiceImpl extends ServiceImpl<CasefaultMapper, Casefault
         }
     }
 
-    @Override
-    public boolean insertItem(Casefault obj) {
-        try {
-            // 设置一个新ID
-            if (obj != null && StringUtils.isEmpty(obj.getId()))
-                obj.setId(SnowFlakeUtil.generateId());
-
-            baseMapper.insert(obj);
-            return true;
-        } catch (CustomException e) {
-            log.error(e.getMessage());
-            throw new CustomException(ResultCode.ERROR_DATA);
-        }
-    }
 
     @Override
     public boolean deleteItem(String id) {
@@ -127,4 +98,53 @@ public class CasefaultServiceImpl extends ServiceImpl<CasefaultMapper, Casefault
             throw new CustomException(ResultCode.ERROR_DATA);
         }
     }
+
+
+    /**
+     * 由于mybatis-plus存储的中文乱码
+     * 采用原生写法
+     * @param list
+     * @return
+     */
+    private void insert(List<Casefault> list) throws KuduException {
+        KuduTable kuduTable = kuduConfig.kuduClient.openTable("impala::gyee_sample_kudu.casefault");
+        KuduSession kuduSession = kuduConfig.kuduSession();
+        int i = 0;
+        for (Casefault fault : list){
+            Insert insert = kuduTable.newInsert();
+            // 获取Row对象,设置插入的值
+            PartialRow row = insert.getRow();
+            row.addObject("id", SnowFlakeUtil.generateId());
+            row.addObject("tag", fault.getTag());
+            row.addObject("faultid", fault.getFaultid());
+            row.addObject("stationcn", fault.getStationcn());
+            row.addObject("windturbineid", fault.getWindturbineid());
+            row.addObject("faulttype", fault.getFaulttype());
+            row.addObject("faultcode", fault.getFaultcode());
+            row.addObject("symptom", fault.getSymptom());
+            row.addObject("symptomcode", fault.getSymptomcode());
+            row.addObject("starttime", fault.getStarttime());
+            row.addObject("endtime", fault.getEndtime());
+            row.addObject("manufacturer", fault.getManufacturer());
+            row.addObject("model", fault.getModel());
+            row.addObject("stationen", fault.getStationen());
+            row.addObject("remark", fault.getRemark());
+            row.addObject("category", fault.getCategory());
+            row.addObject("createtime", DateUtil.getCurrentDate());
+
+            // 先不提交kudu
+            kuduSession.apply(insert);
+            i ++;
+            if (i % 2000 == 0)
+                kuduSession.flush(); //批量写入kudu
+        }
+
+        // 最后,补加一条批量写入
+        kuduSession.flush();
+
+        // 关闭和kudu的会话
+        kuduSession.close();
+    }
+
 }
+

+ 34 - 8
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CaseperformanceServiceImpl.java

@@ -67,20 +67,22 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
 
     @Override
     public boolean addPerformance(Caseperformance performance) {
+        boolean flag = false;
         try {
             // 设置一个新ID
-            if (performance != null && performance.getId() <= 0)
-                performance.setId(Long.valueOf(SnowFlakeUtil.generateId()));
+            if (StringUtils.isEmpty(performance.getId()))
+                performance.setId(SnowFlakeUtil.generateId());
 
             int code = baseMapper.insert(performance);
             if (code > 0) {
-                return true;
+                flag = true;
             }
-            return false;
         } catch (CustomException e) {
             log.error(e.getMessage());
             throw new CustomException(ResultCode.ERROR_DATA);
         }
+
+        return flag;
     }
 
     @Override
@@ -116,7 +118,7 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
     }
 
     @Override
-    public Caseperformance getPerformanceByid(String id) {
+    public Caseperformance getPerformanceById(String id) {
         Caseperformance cp = baseMapper.selectById(id);
         return cp;
     }
@@ -127,7 +129,7 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
 
         try {
             String[] codes = new String[]{Constants.POINT_SPEED, Constants.POINT_POWER};
-            Caseperformance cp = getPerformanceByid(id);
+            Caseperformance cp = getPerformanceById(id);
 
             //查询测点名
             List<Windturbinepoint> winds = windturbinepointService.getListByStationAndWtIdAndUniformCode(cp.getStationen(), cp.getWindturbineid(), codes);
@@ -164,7 +166,6 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
         }
     }
 
-
     @Override
     public Map<String, List> getCurveScatter(String[] ids, int interval, Integer type) {
         Map<String, List> maps = new HashMap<>();
@@ -295,6 +296,31 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
         }
     }
 
+    @Override
+    public boolean insertOrUpdate(List<Caseperformance> list) {
+        boolean flag = false;
+
+        if (list == null || list.size() < 0)
+            return flag;
+
+        try{
+            list.stream().forEach(obj -> {
+                if (StringUtils.isEmpty(obj.getId())) {
+                    // 新增
+                    obj.setId(SnowFlakeUtil.generateId());
+                }
+            });
+
+            flag = saveOrUpdateBatch(list, list.size());
+
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+
+        return flag;
+    }
+
     /**
      * 查询单台风机风速功率
      *
@@ -311,7 +337,7 @@ public class CaseperformanceServiceImpl extends ServiceImpl<CaseperformanceMappe
 
             String[] codes = new String[]{Constants.POINT_SPEED, Constants.POINT_POWER, Constants.POINT_POWER_LLGL};
             //单台风机
-            Caseperformance cp = getPerformanceByid(id);
+            Caseperformance cp = getPerformanceById(id);
             //查询测点名
             List<Windturbinepoint> winds = windturbinepointService.getListByStationAndWtIdAndUniformCode(cp.getStationen(), cp.getWindturbineid(), codes);
             //golden适配器取数据

+ 198 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/PowercurvebasicServiceImpl.java

@@ -0,0 +1,198 @@
+package com.gyee.impala.service.impl.master;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.result.ResultCode;
+import com.gyee.impala.common.spring.InitialRunner;
+import com.gyee.impala.common.util.DateUtil;
+import com.gyee.impala.common.util.SnowFlakeUtil;
+import com.gyee.impala.mapper.master.PowercurvebasicMapper;
+import com.gyee.impala.model.master.Powercurvebasic;
+import com.gyee.impala.service.master.PowercurvebasicService;
+import com.gyee.impala.service.master.PowercurvefittingService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class PowercurvebasicServiceImpl extends ServiceImpl<PowercurvebasicMapper, Powercurvebasic> implements PowercurvebasicService {
+
+    @Autowired
+    private PowercurvefittingService fittingService;
+
+
+    @Override
+    public List<Powercurvebasic> getList(String station, String wtId, String time) {
+        QueryWrapper<Powercurvebasic> wrapper = new QueryWrapper<>();
+        wrapper.eq("stationen", station)
+                .eq("windturbineid", wtId)
+                .eq("time", time);
+
+        try {
+            return baseMapper.selectList(wrapper);
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+
+    @Override
+    public boolean insertItem(Powercurvebasic obj) {
+        if (obj == null)
+            return false;
+
+        try {
+            if (StringUtils.isBlank(obj.getId()))
+                obj.setId(SnowFlakeUtil.generateId());
+
+            baseMapper.insert(obj);
+            return true;
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+
+    @Override
+    public boolean insertBatch(List<Powercurvebasic> list) {
+        if (list == null || list.size() == 0)
+            return false;
+
+        try {
+            for (Powercurvebasic obj : list)
+                obj.setId(SnowFlakeUtil.generateId());
+
+            saveBatch(list, list.size());
+            return true;
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+
+    @Override
+    public Powercurvebasic getOne(String id) {
+        QueryWrapper<Powercurvebasic> wrapper = new QueryWrapper<>();
+        wrapper.eq("id", id);
+
+        try {
+            return baseMapper.selectOne(wrapper);
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+
+    @Override
+    public List<Powercurvebasic> getListOrderBy(boolean isAsc, String... column) {
+        QueryWrapper<Powercurvebasic> wrapper = new QueryWrapper<>();
+        wrapper.orderBy(true, isAsc, column);
+
+        try {
+            return baseMapper.selectList(wrapper);
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+
+    @Override
+    public List<Object> getListTree() {
+        List<Object> result = new ArrayList<>();
+        try {
+            List<Powercurvebasic> list = getListOrderBy(true, "intervals,time");
+            if (list == null || list.size() == 0)
+                return null;
+            /**多层分组**/
+            Map<Integer, Map<String, Map<String, List<Powercurvebasic>>>> collect = list.stream().
+                    collect(Collectors.groupingBy(Powercurvebasic::getIntervals,
+                            Collectors.groupingBy(Powercurvebasic::getTime,
+                                    Collectors.groupingBy(Powercurvebasic::getStationen))));
+
+            /**排序**/
+            Map<Integer, Map<String, Map<String, List<Powercurvebasic>>>> map = new TreeMap<>();
+            collect.forEach((k, v) -> {
+                Map<String, Map<String, List<Powercurvebasic>>> mp = new TreeMap<>();
+                collect.get(k).forEach(mp::put);
+                map.put(k, mp);
+            });
+
+            map.forEach((k, v) -> {
+                String key = (k / 60) < 1 ? "1秒钟" : (k / 60) + "分钟";
+                List<Object> l1 = new ArrayList<>();
+                Map<String, Object> map1 = new HashMap<>();
+
+                map.get(k).forEach((k1, v1) -> {
+                    List<Object> l2 = new ArrayList<>();
+                    Map<String, Object> map2 = new HashMap<>();
+                    map.get(k).get(k1).forEach((k2, v2) -> {
+                        Map<String, Object> map3 = new HashMap<>();
+                        map3.put("windturbineid", k2);
+                        map3.put("children", v2);
+                        l2.add(map3);
+                    });
+
+                    map2.put("windturbineid", k1);
+                    map2.put("children", l2);
+                    l1.add(map2);
+                });
+
+                map1.put("windturbineid", key);
+                map1.put("children", l1);
+                result.add(map1);
+            });
+
+            /***由于hive分页难操作,故先查询总条数*/
+            cacheCount(list);
+
+            return result;
+        } catch (CustomException e) {
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+    @Override
+    public boolean deleteList(String... id) {
+        try{
+            int i = baseMapper.deleteBatchIds(Arrays.asList(id));
+            if (i > 0)
+                return true;
+        } catch (CustomException e){
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+
+        return false;
+    }
+
+
+    @Async
+    public void cacheCount(List<Powercurvebasic> list) {
+        Calendar cal = Calendar.getInstance();
+        list.stream().forEach(obj -> {
+            String key = obj.getTime() + obj.getWindturbineid();
+            if (!InitialRunner.scatterMap.containsKey(key)) {
+                cal.setTime(DateUtil.parseStrtoDate(obj.getTime(), DateUtil.YYYY_MM));
+                String st = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+                cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+                String et = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+                int count = fittingService.selectCount(obj.getStationen(), obj.getWindturbineid(), st, et);
+                InitialRunner.scatterMap.put(key, count);
+            }
+        });
+    }
+
+}

+ 72 - 17
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/PowercurvefittingServiceImpl.java

@@ -2,51 +2,106 @@ package com.gyee.impala.service.impl.master;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.gyee.impala.common.base.ExcludeQueryWrapper;
+import com.gyee.impala.common.base.PageInfo;
 import com.gyee.impala.common.exception.CustomException;
 import com.gyee.impala.common.result.ResultCode;
-import com.gyee.impala.common.util.SnowFlakeUtil;
+import com.gyee.impala.common.spring.InitialRunner;
+import com.gyee.impala.common.util.DateUtil;
 import com.gyee.impala.mapper.master.PowercurvefittingMapper;
 import com.gyee.impala.model.master.Powercurvefitting;
 import com.gyee.impala.service.master.PowercurvefittingService;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
+import java.util.List;
+
 
 @Service
 public class PowercurvefittingServiceImpl extends ServiceImpl<PowercurvefittingMapper, Powercurvefitting> implements PowercurvefittingService {
 
-
     @Override
-    public Powercurvefitting getOne(String station, String wtId, String time) {
+    public List<Powercurvefitting> getList(String station, String wtId, String st, String et) {
         QueryWrapper<Powercurvefitting> wrapper = new QueryWrapper<>();
 
-        wrapper.eq("station", station)
+        wrapper.eq("stationen", station)
                 .eq("windturbineid", wtId)
-                .eq("time", time);
+                .ge("time", st)
+                .le("time", et);
         try {
-            Powercurvefitting obj = baseMapper.selectOne(wrapper);
-
-            return obj;
-
+            return baseMapper.selectList(wrapper);
         } catch (CustomException e){
             log.error(e.getMessage());
             throw new CustomException(ResultCode.ERROR_DATA);
         }
     }
 
-    @Override
-    public boolean insertItem(Powercurvefitting obj) {
-        try {
-            // 设置一个新ID
-            if (obj != null)
-                obj.setId(SnowFlakeUtil.generateId());
 
-            baseMapper.insert(obj);
+    @Override
+    public boolean insertBatch(List<Powercurvefitting> obj) {
+        if (obj == null || obj.size() == 0)
+            return false;
 
+        try {
+            saveBatch(obj, obj.size());
             return true;
         } catch (CustomException e) {
             log.error(e.getMessage());
             throw new CustomException(ResultCode.ERROR_DATA);
         }
     }
+
+    @Override
+    public int selectCount(String station, String wtId, String st, String et) {
+        QueryWrapper<Powercurvefitting> wrapper = new QueryWrapper<>();
+        wrapper.eq("stationen", station)
+                .eq("windturbineid", wtId)
+                .ge("time", st)
+                .le("time", et);
+        try {
+            return baseMapper.selectCount(wrapper);
+        } catch (CustomException e){
+            log.error(e.getMessage());
+            throw new CustomException(ResultCode.ERROR_DATA);
+        }
+    }
+
+    @Override
+    public Object getDataPage(String station, String wtId, String time, int currentPage, int pageSize) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(DateUtil.parseStrtoDate(time, DateUtil.YYYY_MM));
+        String st = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        String et = DateUtil.format(cal.getTimeInMillis(), DateUtil.YYYY_MM_DD_HH_MM_SS);
+
+        try{
+            if (!InitialRunner.scatterMap.containsKey(time + wtId))
+                return null;
+
+            int total = InitialRunner.scatterMap.get(time + wtId);
+            int pages = (int) Math.ceil((double)total/pageSize);
+            List<Powercurvefitting> list = baseMapper.selectListByPage(station, wtId, st, et, (currentPage - 1) * pageSize + 1, currentPage * pageSize);
+            return new PageInfo(list, pageSize, total, currentPage, pages).getData();
+        } catch (CustomException e){
+            log.error(e.getMessage());
+        }
+
+        return null;
+    }
+
+    @Override
+    public void deleteItem(String station, String wtId, String st, String et) {
+        try{
+            baseMapper.deleteItem(station, wtId, st, et);
+        } catch (CustomException e){
+            log.error(e.getMessage());
+        }
+    }
+
+
+    public static void main(String[] args){
+
+        int count = (int) Math.ceil(2592 / 5);
+        System.out.println((int) Math.ceil((double)2592 / 5));
+        System.out.println(count);
+    }
 }

+ 12 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WeatheractualSrviceImpl.java

@@ -0,0 +1,12 @@
+package com.gyee.impala.service.impl.master;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.impala.mapper.master.WeatheractualMapper;
+import com.gyee.impala.model.master.Weatheractual;
+import com.gyee.impala.service.master.WeatheractualService;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class WeatheractualSrviceImpl extends ServiceImpl<WeatheractualMapper, Weatheractual> implements WeatheractualService {
+}

+ 60 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WeatherforecastServiceImpl.java

@@ -0,0 +1,60 @@
+package com.gyee.impala.service.impl.master;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.impala.common.exception.CustomException;
+import com.gyee.impala.common.util.SnowFlakeUtil;
+import com.gyee.impala.mapper.master.WeatherforecastMapper;
+import com.gyee.impala.model.master.Weatherforecast;
+import com.gyee.impala.service.master.WeatherforecastService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Slf4j
+@Service
+public class WeatherforecastServiceImpl extends ServiceImpl<WeatherforecastMapper, Weatherforecast> implements WeatherforecastService {
+
+    @Override
+    public List<Weatherforecast> getListByStationAndTime(String station, String st, String et) {
+        try {
+            return baseMapper.getListByStationAndTime(station, st, et);
+        }catch (CustomException e){
+            log.error(e.getMessage());
+        }
+
+        return null;
+    }
+
+    @Override
+    public Weatherforecast getOneMaxTimeByStation(String stationEn) {
+        try {
+            List<Weatherforecast> list = baseMapper.getOneMaxTimeByStation(stationEn);
+            if (list != null && list.size() > 0)
+                return list.get(0);
+
+        }catch (CustomException e){
+            log.error(e.getMessage());
+        }
+
+        return null;
+    }
+
+    @Override
+    public void insertBatch(List<Weatherforecast> list) {
+        if (list == null || list.size() == 0)
+            return;
+
+        try{
+            list.stream().forEach(obj ->{
+                if (StringUtils.isEmpty(obj.getId()))
+                    obj.setId(SnowFlakeUtil.generateId());
+            });
+            saveBatch(list, list.size());
+        } catch (Exception e){
+            log.error(e.getMessage());
+        }
+    }
+}

+ 0 - 3
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WindpowerstationServiceImpl.java

@@ -21,12 +21,9 @@ import java.util.List;
  * @author chenmh
  * @since 2021-10-15
  */
-@Cacheable(value = "windpowerstation")
 @Service
 public class WindpowerstationServiceImpl extends ServiceImpl<WindpowerstationMapper, Windpowerstation> implements WindpowerstationService {
 
-
-    @Cacheable(value = "station")
     @Override
     public List<Windpowerstation> getAll() {
         List<Windpowerstation> list = new ArrayList<>();

+ 0 - 26
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/WindturbineServiceImpl.java

@@ -25,35 +25,9 @@ import java.util.Map;
  * @author chenmh
  * @since 2021-10-20
  */
-@Cacheable(value = "windturbine")
 @Service
 public class WindturbineServiceImpl extends ServiceImpl<WindturbineMapper, Windturbine> implements WindturbineService {
 
-    @Cacheable(value = "windturbineall")
-    @Override
-    public List<Object> getWindTurbineAll(String station) {
-        List<Object> list = new ArrayList<>();
-        try {
-            ExcludeQueryWrapper<Windturbine> wrapper = new ExcludeQueryWrapper<>();
-            wrapper.eq("station", station);
-
-            List<Windturbine> winds = baseMapper.selectList(wrapper);
-            if (winds != null && winds.size() > 0){
-                for (Windturbine wind : winds){
-                    Map<String, String> map = new HashMap<>();
-                    map.put(wind.getId(), wind.getName());
-                    list.add(map);
-                }
-            }
-        } catch (CustomException e){
-            log.error(e.getMessage());
-            throw new CustomException(ResultCode.ERROR_DATA);
-        }
-
-        return list;
-    }
-
-    @Cacheable(value = "windturbineid")
     @Override
     public List<Windturbine> getWindTurbineId(String station) {
         try {

+ 4 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/FaultsnapServiceImpl.java

@@ -10,6 +10,8 @@ import com.gyee.impala.model.slave.Faultsnap;
 import com.gyee.impala.service.slave.FaultsnapService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -23,14 +25,14 @@ import org.springframework.stereotype.Service;
 public class FaultsnapServiceImpl extends ServiceImpl<FaultsnapMapper, Faultsnap> implements FaultsnapService {
 
     @Override
-    public Faultsnap getOneByStationIDAndWtIDAndRank(String stationId, String wtId, String rank) {
+    public List<Faultsnap> getOneByStationIDAndWtIDAndRank(String stationId, String wtId, String rank) {
         ExcludeQueryWrapper<Faultsnap> wrapper = new ExcludeQueryWrapper<>();
 
         wrapper.eq("stationid", stationId)
                 .eq("windturbineid", wtId)
                 .eq("rank", rank);
         try {
-            return baseMapper.selectOne(wrapper);
+            return baseMapper.selectList(wrapper);
         } catch (Exception e) {
             log.error(e.getMessage());
             throw new CustomException(ResultCode.ERROR_DATA);

+ 4 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/slave/Windturbinetestingpointai2ServiceImpl.java

@@ -12,6 +12,8 @@ import com.gyee.impala.service.slave.Windturbinetestingpointai2Service;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务实现类
@@ -26,14 +28,14 @@ public class Windturbinetestingpointai2ServiceImpl extends ServiceImpl<Windturbi
 
     @Cacheable(value = "windturbinepointaicode")
     @Override
-    public Windturbinetestingpointai2 getItemByStationAndCode(String station, String wtId, String uniformCode) {
+    public List<Windturbinetestingpointai2> getListByStationAndCode(String station, String wtId, String uniformCode) {
         ExcludeQueryWrapper<Windturbinetestingpointai2> wrapper = new ExcludeQueryWrapper<>();
         try {
             wrapper.eq("windpowerstationid", station)
                     .eq("windturbineid", wtId)
                     .in("uniformcode", uniformCode);
 
-            Windturbinetestingpointai2 point = baseMapper.selectOne(wrapper);
+            List<Windturbinetestingpointai2> point = baseMapper.selectList(wrapper);
 
             return point;
 

+ 1 - 8
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/CasefaultService.java

@@ -33,7 +33,7 @@ public interface CasefaultService extends IService<Casefault> {
      * @param list
      * @return
      */
-    boolean insertOrUpdate(List<Casefault> list);
+    void insertBatch(List<Casefault> list);
 
     /**
      * 编辑数据
@@ -43,13 +43,6 @@ public interface CasefaultService extends IService<Casefault> {
     boolean editItem(Casefault obj);
 
     /**
-     * 新建数据
-     * @param obj
-     * @return
-     */
-    boolean insertItem(Casefault obj);
-
-    /**
      * 通过id删除数据
      * @param id
      * @return

+ 9 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/CaseperformanceService.java

@@ -63,7 +63,7 @@ public interface CaseperformanceService extends IService<Caseperformance> {
      * @param id 样本id
      * @return
      */
-    Caseperformance getPerformanceByid(String id);
+    Caseperformance getPerformanceById(String id);
 
 
     /**
@@ -101,9 +101,17 @@ public interface CaseperformanceService extends IService<Caseperformance> {
      * @param interval
      * @param tag
      * @param st
+     *
      * @param et
      * @return
      */
      List getPerformanceList(String station, String interval, Integer tag, String st, String et);
 
+
+    /**
+     * 批量插入或更新
+     * @param list
+     * @return
+     */
+    boolean insertOrUpdate(List<Caseperformance> list);
 }

+ 56 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/PowercurvebasicService.java

@@ -0,0 +1,56 @@
+package com.gyee.impala.service.master;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.impala.model.master.Powercurvebasic;
+
+import java.util.List;
+
+
+public interface PowercurvebasicService extends IService<Powercurvebasic> {
+
+
+    List<Powercurvebasic> getList(String station, String wtId, String time);
+
+
+    /**
+     * 批量插入数据
+     * @param obj
+     * @return
+     */
+    boolean insertItem(Powercurvebasic obj);
+
+
+    /**
+     * 批量插入数据
+     * @param list
+     * @return
+     */
+    boolean insertBatch(List<Powercurvebasic> list);
+
+
+
+    Powercurvebasic getOne(String id);
+
+
+    /**
+     * 通过排序获取数据
+     * @param isAsc
+     * @param column
+     * @return
+     */
+    List<Powercurvebasic> getListOrderBy(boolean isAsc, String... column);
+
+
+    /**
+     * 按照时间间隔、时间、场站、风机ID分类
+     * @return
+     */
+    List<Object> getListTree();
+
+
+    /**
+     * 删除数据
+     * @param id
+     */
+    boolean deleteList(String... id);
+}

+ 23 - 3
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/PowercurvefittingService.java

@@ -3,6 +3,8 @@ package com.gyee.impala.service.master;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.gyee.impala.model.master.Powercurvefitting;
 
+import java.util.List;
+
 /**
  * 缓存的风功率数据
  */
@@ -12,15 +14,33 @@ public interface PowercurvefittingService extends IService<Powercurvefitting> {
      * 通过风机ID和时间查询缓存的风功率数据
      * @param station
      * @param wtId
-     * @param time
+     * @param st  et
      * @return
      */
-    Powercurvefitting getOne(String station, String wtId, String time);
+    List<Powercurvefitting> getList(String station, String wtId, String st, String et);
 
     /**
      * 插入数据
      * @param obj
      * @return
      */
-    boolean insertItem(Powercurvefitting obj);
+    boolean insertBatch(List<Powercurvefitting> obj);
+
+
+    int selectCount(String station, String wtId, String st, String et);
+
+
+    /**
+     * 分页查询
+     * @param station
+     * @param wtId
+     * @param time
+     * @param currentPage
+     * @param pageSize
+     * @return
+     */
+    Object getDataPage(String station, String wtId, String time, int currentPage, int pageSize);
+
+
+    void deleteItem(String station, String wtId, String st, String et);
 }

+ 7 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WeatheractualService.java

@@ -0,0 +1,7 @@
+package com.gyee.impala.service.master;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.impala.model.master.Weatheractual;
+
+public interface WeatheractualService extends IService<Weatheractual> {
+}

+ 34 - 0
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WeatherforecastService.java

@@ -0,0 +1,34 @@
+package com.gyee.impala.service.master;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.impala.model.master.Weatherforecast;
+
+import java.util.List;
+
+public interface WeatherforecastService extends IService<Weatherforecast> {
+
+
+    /**
+     * 通过场站、起始时间查询数据
+     * @param st
+     * @param et
+     * @return
+     */
+    List<Weatherforecast> getListByStationAndTime(String station, String st, String et);
+
+
+    /**
+     * 查询该场站时间最大的一条数据
+     * @param stationEn
+     * @return
+     */
+    Weatherforecast getOneMaxTimeByStation(String stationEn);
+
+
+    /**
+     * 批量插入数据
+     * @param list
+     */
+    void insertBatch(List<Weatherforecast> list);
+
+}

+ 0 - 7
gyee-sample-impala/src/main/java/com/gyee/impala/service/master/WindturbineService.java

@@ -20,12 +20,5 @@ public interface WindturbineService extends IService<Windturbine> {
      * @param station
      * @return
      */
-    List<Object> getWindTurbineAll(String station);
-
-    /**
-     * 获取场站的所有风机
-     * @param station
-     * @return
-     */
     List<Windturbine> getWindTurbineId(String station);
 }

+ 3 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/service/slave/FaultsnapService.java

@@ -4,6 +4,8 @@ package com.gyee.impala.service.slave;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.gyee.impala.model.slave.Faultsnap;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务类
@@ -22,6 +24,6 @@ public interface FaultsnapService extends IService<Faultsnap> {
      * @param rank
      * @return
      */
-    Faultsnap getOneByStationIDAndWtIDAndRank(String stationId, String wtId, String rank);
+    List<Faultsnap> getOneByStationIDAndWtIDAndRank(String stationId, String wtId, String rank);
 
 }

+ 3 - 1
gyee-sample-impala/src/main/java/com/gyee/impala/service/slave/Windturbinetestingpointai2Service.java

@@ -4,6 +4,8 @@ package com.gyee.impala.service.slave;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.gyee.impala.model.slave.Windturbinetestingpointai2;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务类
@@ -21,5 +23,5 @@ public interface Windturbinetestingpointai2Service extends IService<Windturbinet
      * @param uniformCode 统一编码
      * @return
      */
-    Windturbinetestingpointai2 getItemByStationAndCode(String station, String wtId, String uniformCode);
+    List<Windturbinetestingpointai2> getListByStationAndCode(String station, String wtId, String uniformCode);
 }

+ 42 - 7
gyee-sample-impala/src/main/resources/application.yaml

@@ -1,6 +1,11 @@
 gyee:
   # golden实时适配器的url
-  baseurl: http://10.155.32.4:8011
+  golden-url: http://10.155.32.4:8011
+  # 故障样本数据导入模板路径
+  template-path-window: D://java//kudu//template//
+  template-path-linux: /gyee/java/template/
+  # kudu的host
+  kudu-host: 192.168.1.65
 
 server:
   port: 9002
@@ -21,29 +26,59 @@ spring:
       #kudu数据库
       master:
         driver-class-name: com.cloudera.impala.jdbc41.Driver
-        jdbc-url: jdbc:impala://192.168.1.62:21050/gyee_sample_kudu
+        jdbc-url: jdbc:impala://192.168.1.64:21050/gyee_sample_kudu
 
-      #oracle数据库
+      #三区oracle数据库
       slave:
         jdbc-url: jdbc:oracle:thin:@192.168.1.105:1521:gdnxfd
         username: nxfdprod
         password: gdnxfd123
         driver-class-name: oracle.jdbc.OracleDriver
-      max-active: 5
+
+      #网源oracle数据库 -- 数据采集
+      decision:
+        jdbc-url: jdbc:oracle:thin:@10.155.32.7:1521:ORCL
+        username: gyee
+        password: FRWIND
+        driver-class-name: oracle.jdbc.OracleDriver
+      max-active: 3
       initial-size: 1
       min-idle: 3
       max-wait: 60000
-      time-between-eviction-runs-millis: 60000
-      min-evictable-idle-time-millis: 300000
-      test-while-idle: true
+      # 每次使用连接时进行校验,会影响系统性能。默认为false
       test-on-borrow: false
+      #
       test-on-return: false
+      # 验证使用的SQL语句
       validation-query: SELECT 1
+      # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
+      while: true
+      # 每30秒运行一次空闲连接回收器(默认-1)
+      time-between-eviction-runs-millis: 60000
+      # 池中的连接空闲30分钟后被回收(默认30分钟)
+      min-evictable-idle-time-millis: 1800000
+
+
+####################三区大数据服务器 SFTP  hive 配置####################
+hiveconfig:
+  protocols: sftp
+  host: 192.168.1.60
+  port: 22
+  username: root
+  password: Admin@2019
+  path: /gyee/dataprocess
+  driver: org.apache.hive.jdbc.HiveDriver
+  url: jdbc:hive2://192.168.1.60:10000/default
+####################三区大数据服务器 SFTP EXEC 配置####################
+
 
 ####################Mybatis Plus配置####################
 mybatis-plus:
   configuration:
     map-underscore-to-camel-case: true # 数据库下划线自动转驼峰标示关闭
+    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+####################Mybatis Plus配置####################
+
 
 logging:
   level:

+ 23 - 0
gyee-sample-impala/src/main/resources/mapper/decision/WfNwpDataMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.impala.mapper.decision.WfNwpDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.impala.model.decision.WfNwpData">
+        <id column="WINDPLANT_NO" property="windplantNo" />
+        <result column="NWP_TYPE" property="nwpType" />
+        <result column="FILE_TIME" property="fileTime" />
+        <result column="DATA_TIME" property="dataTime" />
+        <result column="WIND_SPEED" property="windSpeed" />
+        <result column="TEMPERATURE" property="temperature" />
+        <result column="WIND_DIR" property="windDir" />
+        <result column="HUMIDITY" property="humidity" />
+        <result column="AIR_PRESSURE" property="airPressure" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        WINDPLANT_NO, NWP_TYPE, FILE_TIME, DATA_TIME, WIND_SPEED, TEMPERATURE, WIND_DIR, HUMIDITY, AIR_PRESSURE
+    </sql>
+
+</mapper>

+ 29 - 0
gyee-sample-impala/src/main/resources/mapper/master/PowercurvebasicMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.impala.mapper.master.PowercurvebasicMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.impala.model.master.Powercurvebasic">
+        <id column="id" property="id" />
+        <result column="stationen" property="stationen" />
+        <result column="windturbineid" property="windturbineid" />
+        <result column="intervals" property="intervals" />
+        <result column="time" property="time" />
+        <result column="starttime" property="starttime" />
+        <result column="endtime" property="endtime" />
+        <result column="connected" property="connected" />
+        <result column="correct" property="correct" />
+        <result column="connected10" property="connected10" />
+        <result column="prestop10" property="prestop10" />
+        <result column="curveoffset" property="curveoffset" />
+        <result column="levels" property="levels" />
+        <result column="remark" property="remark" />
+        <result column="category" property="category" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,stationen,windturbineid,intervals,time,starttime,endtime,connected,correct,connected10,prestop10,curveoffset,levels,remark,category
+    </sql>
+
+</mapper>

+ 12 - 5
gyee-sample-impala/src/main/resources/mapper/master/PowercurvefittingMapper.xml

@@ -5,19 +5,26 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.gyee.impala.model.master.Powercurvefitting">
         <id column="id" property="id" />
-        <result column="station" property="station" />
+        <result column="stationen" property="stationen" />
         <result column="windturbineid" property="windturbineid" />
         <result column="time" property="time" />
-        <result column="scatter" property="scatter" />
-        <result column="lineactual" property="lineactual" />
-        <result column="lineoptimal" property="lineoptimal" />
+        <result column="speed" property="speed" />
+        <result column="power" property="power" />
+        <result column="rotate" property="rotate" />
+        <result column="status" property="status" />
+        <result column="quantity" property="quantity" />
+        <result column="curveoffset" property="curveoffset" />
+        <result column="direction" property="direction" />
+        <result column="angle" property="angle" />
+        <result column="starttime" property="starttime" />
+        <result column="endtime" property="endtime" />
         <result column="remark" property="remark" />
         <result column="category" property="category" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, station, windturbineid, time, line, scatter
+        id, stationen, windturbineid, time, starttime, endtime, power, rotatespeed, status, quantity, curveoffset, direction, angle, remark, category
     </sql>
 
 </mapper>

+ 25 - 0
gyee-sample-impala/src/main/resources/mapper/master/WeatheractualMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.impala.mapper.master.WeatheractualMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.impala.model.master.Weatheractual">
+        <id column="id" property="id" />
+        <result column="stationen" property="stationen" />
+        <result column="stationcn" property="stationcn" />
+        <result column="time" property="time" />
+        <result column="speed" property="speed" />
+        <result column="temperature" property="temperature" />
+        <result column="direction" property="direction" />
+        <result column="humidity" property="humidity" />
+        <result column="pressure" property="pressure" />
+        <result column="remark" property="remark" />
+        <result column="category" property="category" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, stationen, stationcn, time, speed, temperature, direction, humidity, pressure, remark, category
+    </sql>
+
+</mapper>

+ 26 - 0
gyee-sample-impala/src/main/resources/mapper/master/WeatherforecastMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.impala.mapper.master.WeatherforecastMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.impala.model.master.Weatherforecast">
+        <id column="id" property="id" />
+        <result column="stationen" property="stationen" />
+        <result column="stationcn" property="stationcn" />
+        <result column="filetime" property="filetime" />
+        <result column="time" property="time" />
+        <result column="speed" property="speed" />
+        <result column="temperature" property="temperature" />
+        <result column="direction" property="direction" />
+        <result column="humidity" property="humidity" />
+        <result column="pressure" property="pressure" />
+        <result column="remark" property="remark" />
+        <result column="category" property="category" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, stationen, stationcn, filetime, time, speed, temperature, direction, humidity, pressure, remark, category
+    </sql>
+
+</mapper>

BIN
gyee-sample-impala/src/main/resources/template/fault.xlsx


+ 8 - 7
gyee-sample-impala/src/test/java/com/gyee/impala/FaultHistoryFilterTest.java

@@ -38,8 +38,8 @@ public class FaultHistoryFilterTest {
     @Autowired
     private FaulthistoryService faulthistoryService;
 
-    private final String FILE_NAME = "D:\\document\\大数据\\大数据训练样本库\\样本库故障数据表\\业主维修故障数据\\风机故障数据.xlsx";
-    private final String FILE_NAME_WRITE = "D:\\document\\大数据\\大数据训练样本库\\样本库故障数据表\\业主维修故障数据\\风机故障数据过滤.xls";
+    private final String FILE_NAME = "D:\\document\\大数据\\大数据训练样本库\\样本库故障数据表\\业主维修故障数据\\石板泉.xlsx";
+    private final String FILE_NAME_WRITE = "D:\\document\\大数据\\大数据训练样本库\\样本库故障数据表\\业主维修故障数据\\石板泉过略.xls";
 
     @Test
     public void faultFilterTest(){
@@ -92,14 +92,15 @@ public class FaultHistoryFilterTest {
                 Date starttime = row.getCell(9).getDateCellValue();
                 String stationen = row.getCell(13, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK).toString();
 
-                Faultsnap snap = faultsnapService.getOneByStationIDAndWtIDAndRank(stationen, wtId, "5");
-                if (snap == null)
+                System.out.println(stationen + wtId);
+                List<Faultsnap> lists = faultsnapService.getOneByStationIDAndWtIDAndRank(stationen, wtId, "5");
+                if (lists == null || lists.size() == 0)
                     continue;
-
-                // 时间提起那小时
+                Faultsnap snap = lists.get(0);
+                // 时间提起那2小时
                 Calendar cal = Calendar.getInstance();
                 cal.setTime(starttime);
-                cal.set(Calendar.HOUR , Calendar.HOUR -24);
+                cal.set(Calendar.HOUR , Calendar.HOUR -100);
                 Date s = cal.getTime();
                 List<Faulthistory> list = faulthistoryService.getListBySnapIdAndFaultTime(snap.getId(), s, starttime);
 

+ 0 - 21
src/main/java/com/gyee/impala/controller/Windturbinetestingpointai2Controller.java

@@ -1,21 +0,0 @@
-package com.gyee.impala.controller;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author chenmh
- * @since 2022-03-02
- */
-@RestController
-@RequestMapping("/windturbinetestingpointai2")
-public class Windturbinetestingpointai2Controller {
-
-}
-

+ 0 - 16
src/main/java/com/gyee/impala/mapper/Windturbinetestingpointai2Mapper.java

@@ -1,16 +0,0 @@
-package com.gyee.impala.mapper;
-
-import com.gyee.impala.model.Windturbinetestingpointai2;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- *  Mapper 接口
- * </p>
- *
- * @author chenmh
- * @since 2022-03-02
- */
-public interface Windturbinetestingpointai2Mapper extends BaseMapper<Windturbinetestingpointai2> {
-
-}

+ 0 - 86
src/main/java/com/gyee/impala/model/Windturbinetestingpointai2.java

@@ -1,86 +0,0 @@
-package com.gyee.impala.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 
- * </p>
- *
- * @author chenmh
- * @since 2022-03-02
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName("WINDTURBINETESTINGPOINTAI2")
-public class Windturbinetestingpointai2 extends Model<Windturbinetestingpointai2> {
-
-    private static final long serialVersionUID=1L;
-
-      @TableId("ID")
-    private String id;
-
-    @TableField("CODE")
-    private String code;
-
-    @TableField("NAME")
-    private String name;
-
-    @TableField("MODEL")
-    private String model;
-
-    @TableField("VALUEUNIT")
-    private String valueunit;
-
-    @TableField("ENGLISHNAME")
-    private String englishname;
-
-    @TableField("TYPEID")
-    private String typeid;
-
-    @TableField("MODELID")
-    private String modelid;
-
-    @TableField("MAXVAL")
-    private String maxval;
-
-    @TableField("MINVAL")
-    private String minval;
-
-    @TableField("REASONABLEMAXVAL")
-    private String reasonablemaxval;
-
-    @TableField("REASONABLEMINVAL")
-    private String reasonableminval;
-
-    @TableField("WINDTURBINEID")
-    private String windturbineid;
-
-    @TableField("UNIFORMCODE")
-    private String uniformcode;
-
-    @TableField("SHORTID")
-    private String shortid;
-
-    @TableField("LONGID")
-    private String longid;
-
-    @TableField("WINDPOWERSTATIONID")
-    private String windpowerstationid;
-
-    @TableField("REALTIMEID")
-    private String realtimeid;
-
-
-    @Override
-    protected Serializable pkVal() {
-        return this.id;
-    }
-
-}

+ 0 - 16
src/main/java/com/gyee/impala/service/Windturbinetestingpointai2Service.java

@@ -1,16 +0,0 @@
-package com.gyee.impala.service;
-
-import com.gyee.impala.model.Windturbinetestingpointai2;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * <p>
- *  服务类
- * </p>
- *
- * @author chenmh
- * @since 2022-03-02
- */
-public interface Windturbinetestingpointai2Service extends IService<Windturbinetestingpointai2> {
-
-}

+ 0 - 20
src/main/java/com/gyee/impala/service/impl/Windturbinetestingpointai2ServiceImpl.java

@@ -1,20 +0,0 @@
-package com.gyee.impala.service.impl;
-
-import com.gyee.impala.model.Windturbinetestingpointai2;
-import com.gyee.impala.mapper.Windturbinetestingpointai2Mapper;
-import com.gyee.impala.service.Windturbinetestingpointai2Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- *  服务实现类
- * </p>
- *
- * @author chenmh
- * @since 2022-03-02
- */
-@Service
-public class Windturbinetestingpointai2ServiceImpl extends ServiceImpl<Windturbinetestingpointai2Mapper, Windturbinetestingpointai2> implements Windturbinetestingpointai2Service {
-
-}

+ 0 - 32
src/main/resources/mapper/Windturbinetestingpointai2Mapper.xml

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.gyee.impala.mapper.Windturbinetestingpointai2Mapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.gyee.impala.model.Windturbinetestingpointai2">
-        <id column="ID" property="id" />
-        <result column="CODE" property="code" />
-        <result column="NAME" property="name" />
-        <result column="MODEL" property="model" />
-        <result column="VALUEUNIT" property="valueunit" />
-        <result column="ENGLISHNAME" property="englishname" />
-        <result column="TYPEID" property="typeid" />
-        <result column="MODELID" property="modelid" />
-        <result column="MAXVAL" property="maxval" />
-        <result column="MINVAL" property="minval" />
-        <result column="REASONABLEMAXVAL" property="reasonablemaxval" />
-        <result column="REASONABLEMINVAL" property="reasonableminval" />
-        <result column="WINDTURBINEID" property="windturbineid" />
-        <result column="UNIFORMCODE" property="uniformcode" />
-        <result column="SHORTID" property="shortid" />
-        <result column="LONGID" property="longid" />
-        <result column="WINDPOWERSTATIONID" property="windpowerstationid" />
-        <result column="REALTIMEID" property="realtimeid" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        ID, CODE, NAME, MODEL, VALUEUNIT, ENGLISHNAME, TYPEID, MODELID, MAXVAL, MINVAL, REASONABLEMAXVAL, REASONABLEMINVAL, WINDTURBINEID, UNIFORMCODE, SHORTID, LONGID, WINDPOWERSTATIONID, REALTIMEID
-    </sql>
-
-</mapper>