Browse Source

监视后台更新

shilin 3 years ago
parent
commit
c3906513ac
100 changed files with 11291 additions and 0 deletions
  1. 27 0
      web/monitor-web-hb/src/main/java/com/gyee/SpringbootStart.java
  2. 19 0
      web/monitor-web-hb/src/main/java/com/gyee/SpringbootWebInitializer.java
  3. 77 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/config/AsyncConfig.java
  4. 76 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/config/ThreadPoolConfig.java
  5. 133 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/controller/AsyncController.java
  6. 57 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/service/AsyncService.java
  7. 63 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/service/impl/AsyncServiceImpl.java
  8. 41 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/util/SmsUtil.java
  9. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/BaseController.java
  10. 34 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/BaseService.java
  11. 268 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/PageInfo.java
  12. 419 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/AppRedisCacheManager.java
  13. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/ApplicationContextHolder.java
  14. 383 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/IGlobalCache.java
  15. 72 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/MybatisRedisCache.java
  16. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/RedisConfig.java
  17. 31 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/RedisUtils.java
  18. 13 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/AjaxStatus.java
  19. 25 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ExportConfig.java
  20. 30 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/FileConfig.java
  21. 85 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/KaptchaConfig.java
  22. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/MybatisConfig.java
  23. 34 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/PageHelperConf.java
  24. 83 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/Swagger.java
  25. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/TemperatureConfig.java
  26. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ThreadPoolTaskConfig.java
  27. 206 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/V2Config.java
  28. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ZmConfig.java
  29. 45 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/monitor/LeaderConfig.java
  30. 45 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/monitor/StatusConfig.java
  31. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSource.java
  32. 77 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceAspect.java
  33. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceContextHolder.java
  34. 13 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceType.java
  35. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DynamicDataSource.java
  36. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/domain/AjaxResult.java
  37. 80 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/druid/RemoveDruidAdConfig.java
  38. 141 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/GlobalExceptionResolver.java
  39. 65 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/QiNiuException.java
  40. 17 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/demo/DemoModeException.java
  41. 55 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/enums/QiNiuErrorEnum.java
  42. 41 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/file/FileNameLengthLimitExceededException.java
  43. 73 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/file/InvalidExtensionException.java
  44. 37 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/feign/IAdapterService.java
  45. 30 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/feign/RemoteServiceBuilder.java
  46. 83 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/ClassUtil.java
  47. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/ExcelExport.java
  48. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/FileUploadUtils.java
  49. 110 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/FileUtils.java
  50. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/interceptor/MyInterceptor.java
  51. 108 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/interceptor/MyWebAppConfigurer.java
  52. 31 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/log/Log.java
  53. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/log/LogAspect.java
  54. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/AbstractQuartzJob.java
  55. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzConfig.java
  56. 23 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzDisallowConcurrentExecution.java
  57. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzJobExecution.java
  58. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzSchedulerUtil.java
  59. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/ScheduleConstants.java
  60. 191 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/utils/JobInvokeUtil.java
  61. 590 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/Constant.java
  62. 397 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/ConstantTR.java
  63. 377 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/InitialRedis.java
  64. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/InitialRunner.java
  65. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/SpringUtils.java
  66. 20 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/WpEnum.java
  67. 89 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/CharsetKit.java
  68. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/Convert.java
  69. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/ConvertUtil.java
  70. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/KaptchaTextCreator.java
  71. 148 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/ClientInboundChannelInterceptor.java
  72. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketCache.java
  73. 241 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketConfig.java
  74. 68 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketLoginOutEvent.java
  75. 30 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebsocketMessageService.java
  76. 501 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/AdminController.java
  77. 43 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/FanStatusQueryExportController/FanStatusQueryExportController.java
  78. 67 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/IndexController.java
  79. 92 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/StandardPointTable/StandardPointTableController.java
  80. 227 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/benchmarking/BenchmarkingController.java
  81. 200 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/compare/CompareController.java
  82. 660 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/contrast/ContrastController.java
  83. 89 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/export/GoldenController.java
  84. 39 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/file/ExcelExportController.java
  85. 206 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindpowerDetailChartController.java
  86. 1277 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailChartController.java
  87. 326 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailLineChartController.java
  88. 276 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailPieChartAController.java
  89. 380 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineGoodnessDetailController.java
  90. 98 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbinegoodnessController.java
  91. 133 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/EarlyWarnKnowledgeController.java
  92. 134 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/FaultKnowledgeController.java
  93. 122 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthMainController.java
  94. 144 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthOperationController.java
  95. 495 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthSubController.java
  96. 81 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/LossPowerRateHealthController.java
  97. 80 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/PartBjController.java
  98. 123 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/ReliabilityAnalysisController.java
  99. 97 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/StopAnalysisController.java
  100. 0 0
      web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/WindTurbineCurveController.java

+ 27 - 0
web/monitor-web-hb/src/main/java/com/gyee/SpringbootStart.java

@@ -0,0 +1,27 @@
+package com.gyee;
+
+import com.gyee.frame.common.spring.InitialRedis;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+
+
+/**
+ * 项目启动方法
+ * @author gyee
+ *
+ */
+@EnableCaching
+@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
+public class SpringbootStart {
+
+    public static void main(String[] args) throws Exception {
+
+
+        SpringApplication.run(SpringbootStart.class, args);
+//        InitialRedis initialRedis=new InitialRedis();
+//        System.out.println("初始化开始!");
+//        initialRedis.intialWindturbinepowercurvefitting();
+    }
+}

+ 19 - 0
web/monitor-web-hb/src/main/java/com/gyee/SpringbootWebInitializer.java

@@ -0,0 +1,19 @@
+package com.gyee;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+* @ClassName: SpringbootWebInitializer
+* @Description: web容器中进行部署
+* @author gyee
+* @date 2018年8月18日
+*
+*/
+public class SpringbootWebInitializer  extends SpringBootServletInitializer{
+	@Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+    {
+        return application.sources(SpringbootStart.class);
+    }
+}

+ 77 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/config/AsyncConfig.java

@@ -0,0 +1,77 @@
+//package com.gyee.frame.common.async.config;
+//
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.scheduling.annotation.AsyncConfigurer;
+//import org.springframework.scheduling.annotation.EnableAsync;
+//
+//import java.lang.reflect.Method;
+//import java.util.Arrays;
+//
+///**
+// * AsyncConfig
+// *
+// * @author wliduo[i@dolyw.com]
+// * @date 2020/5/19 17:58
+// */
+//@Configuration
+//@EnableAsync
+//public class AsyncConfig implements AsyncConfigurer {
+//
+//    /**
+//     * logger
+//     */
+//    private static final Logger logger = LoggerFactory.getLogger(AsyncConfig.class);
+//
+//    /**
+//     * 这里不实现了,使用 ThreadPoolConfig 里的线程池即可
+//     *
+//     * @param
+//     * @return java.util.concurrent.Executor
+//     * @throws
+//     * @author wliduo[i@dolyw.com]
+//     * @date 2020/5/19 18:00
+//     */
+//    /*@Override
+//    public Executor getAsyncExecutor() {
+//        return null;
+//    }*/
+//
+//    /**
+//     * 只能捕获无返回值的异步方法,有返回值的被主线程处理
+//     *
+//     * @param
+//     * @return org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler
+//     * @throws
+//     * @author wliduo[i@dolyw.com]
+//     * @date 2020/5/20 10:16
+//     */
+//    @Override
+//    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+//        return new CustomAsyncExceptionHandler();
+//    }
+//
+//    /***
+//     * 处理异步方法中未捕获的异常
+//     *
+//     * @author wliduo[i@dolyw.com]
+//     * @date 2020/5/19 19:16
+//     */
+//    class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
+//
+//        @Override
+//        public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
+//            logger.info("Exception message - {}", throwable.getMessage());
+//            logger.info("Method name - {}", method.getName());
+//            logger.info("Parameter values - {}", Arrays.toString(obj));
+//            if (throwable instanceof Exception) {
+//                Exception exception = (Exception) throwable;
+//                logger.info("exception:{}", exception.getMessage());
+//            }
+//            throwable.printStackTrace();
+//        }
+//
+//    }
+//}

+ 76 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/config/ThreadPoolConfig.java

@@ -0,0 +1,76 @@
+package com.gyee.frame.common.async.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.*;
+
+/**
+ * 线程池配置
+ *
+ * @author wliduo
+ * @date 2019/2/15 14:36
+ */
+@Configuration
+public class ThreadPoolConfig {
+
+    /**
+     * logger
+     */
+    private final static Logger logger = LoggerFactory.getLogger(ThreadPoolConfig.class);
+
+    @Value("${asyncThreadPool.corePoolSize}")
+    private int corePoolSize;
+
+    @Value("${asyncThreadPool.maxPoolSize}")
+    private int maxPoolSize;
+
+    @Value("${asyncThreadPool.queueCapacity}")
+    private int queueCapacity;
+
+    @Value("${asyncThreadPool.keepAliveSeconds}")
+    private int keepAliveSeconds;
+
+    @Value("${asyncThreadPool.awaitTerminationSeconds}")
+    private int awaitTerminationSeconds;
+
+    @Value("${asyncThreadPool.threadNamePrefix}")
+    private String threadNamePrefix;
+
+    /**
+     * 线程池配置
+     * @param
+     * @return java.util.concurrent.Executor
+     * @author wliduo
+     * @date 2019/2/15 14:44
+     */
+    @Bean(name = "threadPoolTaskExecutor")
+    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
+        logger.info("---------- 线程池开始加载 ----------");
+        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
+        // 核心线程池大小
+        threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
+        // 最大线程数
+        threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
+        // 队列容量
+        threadPoolTaskExecutor.setQueueCapacity(keepAliveSeconds);
+        // 活跃时间
+        threadPoolTaskExecutor.setKeepAliveSeconds(queueCapacity);
+        // 主线程等待子线程执行时间
+        threadPoolTaskExecutor.setAwaitTerminationSeconds(awaitTerminationSeconds);
+        // 线程名字前缀
+        threadPoolTaskExecutor.setThreadNamePrefix(threadNamePrefix);
+        // RejectedExecutionHandler:当pool已经达到max-size的时候,如何处理新任务
+        // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
+        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 初始化
+        threadPoolTaskExecutor.initialize();
+        logger.info("---------- 线程池加载完成 ----------");
+        return threadPoolTaskExecutor;
+    }
+
+}

+ 133 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/controller/AsyncController.java

@@ -0,0 +1,133 @@
+package com.gyee.frame.common.async.controller;
+
+
+import com.gyee.frame.common.async.service.AsyncService;
+import com.gyee.frame.common.async.util.SmsUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.concurrent.Future;
+
+/**
+ * AsyncController
+ *
+ * @author wliduo[i@dolyw.com]
+ * @date 2020/5/19 14:46
+ */
+@RestController
+@RequestMapping("/async")
+public class AsyncController {
+
+    /**
+     * logger
+     */
+    private final static Logger logger = LoggerFactory.getLogger(AsyncController.class);
+
+    @Resource
+    private AsyncService asyncService;
+
+    @Autowired
+    private SmsUtil smsUtil;
+
+    /**
+     * 可以看到无返回值异步方法出现异常,主线程还是继续执行完成
+     *
+     * @param
+     * @return void
+     * @throws
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 9:53
+     */
+    @GetMapping("/run1")
+    public String run1() throws Exception {
+        asyncService.task1();
+        logger.info("run1开始执行");
+        Thread.sleep(5000);
+        logger.info("run1执行完成");
+        return "run1 success";
+    }
+
+    /**
+     * 可以看到有返回值异步方法出现异常,异常抛给主线程处理,导致主线程也被中断执行
+     *
+     * @param
+     * @return java.lang.String
+     * @throws
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:15
+     */
+    @GetMapping("/run2")
+    public String run2() throws Exception {
+        Future<String> future = asyncService.task2();
+        // get()方法阻塞主线程,直到执行完成
+        String result = future.get();
+        logger.info("run2开始执行");
+        Thread.sleep(5000);
+        logger.info("run2执行完成");
+        return result;
+    }
+
+    /**
+     * 多个异步执行
+     *
+     * @param
+     * @return java.lang.String
+     * @throws
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:26
+     */
+    @GetMapping("/run3")
+    public String run3() throws Exception {
+        logger.info("run3开始执行");
+        long start = System.currentTimeMillis();
+        Future<String> future3 = asyncService.task3();
+        Future<String> future4 = asyncService.task4();
+        // 这样与下面是一样的
+        logger.info(future3.get());
+        logger.info(future4.get());
+        // 先判断是否执行完成
+        boolean run3Done = Boolean.FALSE;
+        while (true) {
+            if (future3.isDone() && future4.isDone()) {
+                // 执行完成
+                run3Done = Boolean.TRUE;
+                break;
+            }
+            if (future3.isCancelled() || future4.isCancelled()) {
+                // 取消情况
+                break;
+            }
+        }
+        if (run3Done) {
+            logger.info(future3.get());
+            logger.info(future4.get());
+        } else {
+            // 其他异常情况
+        }
+        long end = System.currentTimeMillis();
+        logger.info("run3执行完成,执行时间: {}", end - start);
+        return "run3 success";
+    }
+
+    /**
+     * 工具类异步
+     *
+     * @param
+     * @return java.lang.String
+     * @throws
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:59
+     */
+    @GetMapping("/sms")
+    public String sms() throws Exception {
+        logger.info("run1开始执行");
+        smsUtil.sendCode("15912347896", "135333");
+        logger.info("run1执行完成");
+        return "send sms success";
+    }
+}

+ 57 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/service/AsyncService.java

@@ -0,0 +1,57 @@
+package com.gyee.frame.common.async.service;
+
+import java.util.concurrent.Future;
+
+/**
+ * AsyncService
+ *
+ * @author wliduo[i@dolyw.com]
+ * @date 2020/5/19 14:18
+ */
+public interface AsyncService {
+
+    /**
+     * 任务1
+     *
+     * @param
+     * @return void
+     * @throws Exception e
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/19 14:45
+     */
+    void task1() throws Exception;
+
+    /**
+     * 任务2
+     *
+     * @param
+     * @return java.util.concurrent.Future<java.lang.String>
+     * @throws Exception e
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:04
+     */
+    Future<String> task2() throws Exception;
+
+    /**
+     * 任务3
+     *
+     * @param
+     * @return java.util.concurrent.Future<java.lang.String>
+     * @throws Exception e
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:20
+     */
+    Future<String> task3() throws Exception;
+
+    /**
+     * 任务4
+     *
+     * @param
+     * @return java.util.concurrent.Future<java.lang.String>
+     * @throws Exception e
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:20
+     */
+    Future<String> task4() throws Exception;
+
+}

+ 63 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/service/impl/AsyncServiceImpl.java

@@ -0,0 +1,63 @@
+package com.gyee.frame.common.async.service.impl;
+
+
+import com.gyee.frame.common.async.service.AsyncService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.AsyncResult;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.Future;
+
+/**
+ * AsyncServiceImpl
+ *
+ * @author wliduo[i@dolyw.com]
+ * @date 2020/5/19 14:24
+ */
+@Service
+public class AsyncServiceImpl implements AsyncService {
+
+    /**
+     * logger
+     */
+    private final static Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
+
+    @Override
+    @Async("threadPoolTaskExecutor")
+    public void task1() throws Exception {
+        logger.info("task1开始执行");
+        Thread.sleep(3000);
+        logger.info("task1执行结束");
+        throw new RuntimeException("出现异常");
+    }
+
+    @Override
+    @Async("threadPoolTaskExecutor")
+    public Future<String> task2() throws Exception {
+        logger.info("task2开始执行");
+        Thread.sleep(3000);
+        logger.info("task2执行结束");
+        throw new RuntimeException("出现异常");
+        // return new AsyncResult<String>("task2 success");
+    }
+
+    @Override
+    @Async("threadPoolTaskExecutor")
+    public Future<String> task3() throws Exception {
+        logger.info("task3开始执行");
+        Thread.sleep(3000);
+        logger.info("task3执行结束");
+        return new AsyncResult<String>("task3 success");
+    }
+
+    @Override
+    @Async("threadPoolTaskExecutor")
+    public Future<String> task4() throws Exception {
+        logger.info("task4开始执行");
+        Thread.sleep(3000);
+        logger.info("task4执行结束");
+        return new AsyncResult<String>("task4 success");
+    }
+}

+ 41 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/async/util/SmsUtil.java

@@ -0,0 +1,41 @@
+package com.gyee.frame.common.async.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * SmsUtil
+ *
+ * @author wliduo[i@dolyw.com]
+ * @date 2020/5/20 10:50
+ */
+@Component
+public class SmsUtil {
+
+    private static final Logger logger = LoggerFactory.getLogger(SmsUtil.class);
+
+    /**
+     * 异步发送短信
+     *
+     * @param phone
+	 * @param code
+     * @return void
+     * @throws
+     * @author wliduo[i@dolyw.com]
+     * @date 2020/5/20 10:53
+     */
+    @Async
+    public void sendCode(String phone, String code) {
+        logger.info("开始发送验证码...");
+        // 模拟调用接口发验证码的耗时
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        logger.info("发送成功: {}", phone);
+    }
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/BaseController.java


+ 34 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/BaseService.java

@@ -0,0 +1,34 @@
+package com.gyee.frame.common.base;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+/**
+ * 抽象类BaseService
+* @ClassName: BaseService
+* @Description: Service实现这个
+* @author gyee
+* @date 2018年6月3日
+*
+ */
+public interface BaseService<T,T2> {
+	
+    int deleteByPrimaryKey(String id);
+
+    int insertSelective(T record);
+
+    T selectByPrimaryKey(String id);
+   
+    int updateByPrimaryKeySelective(T record);
+    
+    int updateByExampleSelective(@Param("record") T record, @Param("example") T2 example);
+
+    int updateByExample(@Param("record") T record, @Param("example") T2 example);
+    
+    List<T> selectByExample(T2 example);
+
+    long countByExample(T2 example);
+
+    int deleteByExample(T2 example);
+
+}

+ 268 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/base/PageInfo.java

@@ -0,0 +1,268 @@
+package com.gyee.frame.common.base;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.github.pagehelper.Page;
+
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class PageInfo<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+    //当前页
+    private int pageNum;
+    //每页的数量
+    private int pageSize;
+    //当前页的数量
+    private int size;
+    //由于startRow和endRow不常用,这里说个具体的用法
+    //可以在页面中"显示startRow到endRow 共size条数据"
+
+    //当前页面第一个元素在数据库中的行号
+    private int startRow;
+    //当前页面最后一个元素在数据库中的行号
+    private int endRow;
+    //总记录数
+    private long total;
+    //总页数
+    private int pages;
+    //结果集
+    private List<T> list;
+
+    //第一页
+    private int firstPage;
+    //前一页
+    private int prePage;
+    //下一页
+    private int nextPage;
+    //最后一页
+    private int lastPage;
+
+    //是否为第一页
+    private boolean isFirstPage = false;
+    //是否为最后一页
+    private boolean isLastPage = false;
+    //是否有前一页
+    private boolean hasPreviousPage = false;
+    //是否有下一页
+    private boolean hasNextPage = false;
+    //导航页码数
+    private int navigatePages;
+    //所有导航页号
+    private int[] navigatepageNums;
+
+    /**
+     * 包装Page对象
+     *
+     * @param list
+     */
+    public PageInfo(List<T> list) {
+        this(list, 8);
+    }
+
+    /**
+     * 包装Page对象
+     *
+     * @param list          page结果
+     * @param navigatePages 页码数量
+     */
+    public PageInfo(List<T> list, int navigatePages) {
+        if (list instanceof Page) {
+            Page page = (Page) list;
+            this.pageNum = page.getPageNum();
+            this.pageSize = page.getPageSize();
+
+            this.total = page.getTotal();
+            this.pages = page.getPages();
+            this.list = page;
+            this.size = page.size();
+            //由于结果是>startRow的,所以实际的需要+1
+            if (this.size == 0) {
+                this.startRow = 0;
+                this.endRow = 0;
+            } else {
+                this.startRow = page.getStartRow() + 1;
+                //计算实际的endRow(最后一页的时候特殊)
+                this.endRow = this.startRow - 1 + this.size;
+            }
+            this.navigatePages = navigatePages;
+            //计算导航页
+            calcNavigatepageNums();
+            //计算前后页,第一页,最后一页
+            calcPage();
+            //判断页面边界
+            judgePageBoudary();
+        }
+    }
+
+    /**
+     * 计算导航页
+     */
+    private void calcNavigatepageNums() {
+        //当总页数小于或等于导航页码数时
+        if (pages <= navigatePages) {
+            navigatepageNums = new int[pages];
+            for (int i = 0; i < pages; i++) {
+                navigatepageNums[i] = i + 1;
+            }
+        } else { //当总页数大于导航页码数时
+            navigatepageNums = new int[navigatePages];
+            int startNum = pageNum - navigatePages / 2;
+            int endNum = pageNum + navigatePages / 2;
+
+            if (startNum < 1) {
+                startNum = 1;
+                //(最前navigatePages页
+                for (int i = 0; i < navigatePages; i++) {
+                    navigatepageNums[i] = startNum++;
+                }
+            } else if (endNum > pages) {
+                endNum = pages;
+                //最后navigatePages页
+                for (int i = navigatePages - 1; i >= 0; i--) {
+                    navigatepageNums[i] = endNum--;
+                }
+            } else {
+                //所有中间页
+                for (int i = 0; i < navigatePages; i++) {
+                    navigatepageNums[i] = startNum++;
+                }
+            }
+        }
+    }
+
+    /**
+     * 计算前后页,第一页,最后一页
+     */
+    private void calcPage() {
+        if (navigatepageNums != null && navigatepageNums.length > 0) {
+            firstPage = navigatepageNums[0];
+            lastPage = navigatepageNums[navigatepageNums.length - 1];
+            if (pageNum > 1) {
+                prePage = pageNum - 1;
+            }
+            if (pageNum < pages) {
+                nextPage = pageNum + 1;
+            }
+        }
+    }
+
+    /**
+     * 判定页面边界
+     */
+    private void judgePageBoudary() {
+        isFirstPage = pageNum == 1;
+        isLastPage = pageNum == pages;
+        hasPreviousPage = pageNum > 1;
+        hasNextPage = pageNum < pages;
+    }
+
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public int getPageNum() {
+        return pageNum;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public int getStartRow() {
+        return startRow;
+    }
+
+    public int getEndRow() {
+        return endRow;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public int getPages() {
+        return pages;
+    }
+
+    public List<T> getList() {
+        return list;
+    }
+
+    public int getFirstPage() {
+        return firstPage;
+    }
+
+    public int getPrePage() {
+        return prePage;
+    }
+
+    public int getNextPage() {
+        return nextPage;
+    }
+
+    public int getLastPage() {
+        return lastPage;
+    }
+
+    public boolean isIsFirstPage() {
+        return isFirstPage;
+    }
+
+    public boolean isIsLastPage() {
+        return isLastPage;
+    }
+
+    public boolean isHasPreviousPage() {
+        return hasPreviousPage;
+    }
+
+    public boolean isHasNextPage() {
+        return hasNextPage;
+    }
+
+    public int getNavigatePages() {
+        return navigatePages;
+    }
+
+    public int[] getNavigatepageNums() {
+        return navigatepageNums;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuffer sb = new StringBuffer("PageInfo{");
+        sb.append("pageNum=").append(pageNum);
+        sb.append(", pageSize=").append(pageSize);
+        sb.append(", size=").append(size);
+        sb.append(", startRow=").append(startRow);
+        sb.append(", endRow=").append(endRow);
+        sb.append(", total=").append(total);
+        sb.append(", pages=").append(pages);
+        sb.append(", list=").append(list);
+        sb.append(", firstPage=").append(firstPage);
+        sb.append(", prePage=").append(prePage);
+        sb.append(", nextPage=").append(nextPage);
+        sb.append(", lastPage=").append(lastPage);
+        sb.append(", isFirstPage=").append(isFirstPage);
+        sb.append(", isLastPage=").append(isLastPage);
+        sb.append(", hasPreviousPage=").append(hasPreviousPage);
+        sb.append(", hasNextPage=").append(hasNextPage);
+        sb.append(", navigatePages=").append(navigatePages);
+        sb.append(", navigatepageNums=");
+        if (navigatepageNums == null){
+        	sb.append("null");
+        }else {
+            sb.append('[');
+            for (int i = 0; i < navigatepageNums.length; ++i){
+            	sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]);
+            }
+            sb.append(']');
+        }
+        sb.append('}');
+        return sb.toString();
+    }
+}

+ 419 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/AppRedisCacheManager.java

@@ -0,0 +1,419 @@
+package com.gyee.frame.common.cache;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description: 移动端Redis缓存实现类
+ * @author: YuXD
+ * @create: 2021-01-05 10:40
+ **/
+@Getter
+@AllArgsConstructor
+public final class AppRedisCacheManager implements IGlobalCache {
+
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Override
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    @Override
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    @Override
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    @Override
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    @Override
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    @Override
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    @Override
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    @Override
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    @Override
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    @Override
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    @Override
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public boolean lSetAll(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().leftPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().leftPushIfPresent(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().leftPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean lSetAll(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().leftPushAll(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean rSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean rSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean rSetAll(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    @Override
+    public boolean rSetAll(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    @Override
+    public void rangeRemove(String key, Long stard, Long end) {
+        try {
+            redisTemplate.opsForList().trim(key, stard, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/ApplicationContextHolder.java


+ 383 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/IGlobalCache.java

@@ -0,0 +1,383 @@
+package com.gyee.frame.common.cache;
+
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 系统全局Cache接口,具体缓存方式需要实现该接口
+ *
+ * @author YuXD
+ * @date 2021-01-05 10:38
+ * @since v1.0
+ */
+public interface IGlobalCache {
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return
+     */
+    boolean expire(String key, long time);
+
+    /**
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    long getExpire(String key);
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    boolean hasKey(String key);
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    void del(String... key);
+// ============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    Object get(String key);
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    boolean set(String key, Object value);
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    boolean set(String key, Object value, long time);
+
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    long incr(String key, long delta);
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    long decr(String key, long delta);
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    Object hget(String key, String item);
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    Map<Object, Object> hmget(String key);
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    boolean hmset(String key, Map<String, Object> map);
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  键
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    boolean hmset(String key, Map<String, Object> map, long time);
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    boolean hset(String key, String item, Object value);
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    boolean hset(String key, String item, Object value, long time);
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    void hdel(String key, Object... item);
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    boolean hHasKey(String key, String item);
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return
+     */
+    double hincr(String key, String item, double by);
+
+    /**
+     * hash递减
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return
+     */
+    double hdecr(String key, String item, double by);
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return
+     */
+    Set<Object> sGet(String key);
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    boolean sHasKey(String key, Object value);
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    long sSet(String key, Object... values);
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    键
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    long sSetAndTime(String key, long time, Object... values);
+
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    long sGetSetSize(String key);
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    long setRemove(String key, Object... values);
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   键
+     * @param start 开始
+     * @param end   结束 0 到 -1代表所有值
+     * @return
+     */
+    List<Object> lGet(String key, long start, long end);
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+    long lGetListSize(String key);
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   键
+     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    Object lGetIndex(String key, long index);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    boolean lSet(String key, Object value);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    boolean lSet(String key, Object value, long time);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    boolean lSetAll(String key, List<Object> value);
+
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    boolean lSetAll(String key, List<Object> value, long time);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+
+    boolean rSet(String key, Object value);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+
+    boolean rSet(String key, Object value, long time);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    boolean rSetAll(String key, List<Object> value);
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    boolean rSetAll(String key, List<Object> value, long time);
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    boolean lUpdateIndex(String key, long index, Object value);
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    long lRemove(String key, long count, Object value);
+
+    /**
+     * 从redis集合中移除[start,end]之间的元素
+     *
+     * @param key
+     * @param stard
+     * @param end
+     * @return
+     */
+    void rangeRemove(String key, Long stard, Long end);
+
+    /**
+     * 返回当前redisTemplate
+     *
+     * @return
+     */
+    RedisTemplate getRedisTemplate();
+}

+ 72 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/MybatisRedisCache.java

@@ -0,0 +1,72 @@
+//package com.gyee.frame.common.cache;
+//
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.data.redis.core.RedisTemplate;
+//import org.apache.ibatis.cache.Cache;
+//import java.util.concurrent.locks.ReadWriteLock;
+//import java.util.concurrent.locks.ReentrantReadWriteLock;
+//
+//public class MybatisRedisCache implements Cache {
+//    private static final Logger log = LoggerFactory.getLogger(MybatisRedisCache.class);
+//    private String id;
+//    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+//    //private static final long EXPIRE_TIME_IN_MINUTES = 30; // redis过期时间
+//
+//
+//    public MybatisRedisCache(String id) {
+//        this.id = id;
+//    }
+//
+//    private RedisTemplate<Object, Object> getRedisTemplate(){
+//        return ApplicationContextHolder.getBean("redisTemplate");
+//    }
+//
+//    @Override
+//    public String getId() {
+//        return id;
+//    }
+//
+//    @Override
+//    public void putObject(Object key, Object value) {
+//        RedisTemplate redisTemplate = getRedisTemplate();
+//        redisTemplate.boundHashOps(getId()).put(key, value);
+//        log.info("[结果放入到缓存中: " + key + "=" + value+" ]");
+//
+//    }
+//
+//    @Override
+//    public Object getObject(Object key) {
+//        RedisTemplate redisTemplate = getRedisTemplate();
+//        Object value = redisTemplate.boundHashOps(getId()).get(key);
+//        log.info("[从缓存中获取了: " + key + "=" + value+" ]");
+//        return value;
+//    }
+//
+//    @Override
+//    public Object removeObject(Object key) {
+//        RedisTemplate redisTemplate = getRedisTemplate();
+//        Object value = redisTemplate.boundHashOps(getId()).delete(key);
+//        log.info("[从缓存删除了: " + key + "=" + value+" ]");
+//        return value;
+//    }
+//
+//    @Override
+//    public void clear() {
+//        RedisTemplate redisTemplate = getRedisTemplate();
+//        redisTemplate.delete(getId());
+//        log.info("清空缓存!!!");
+//    }
+//
+//    @Override
+//    public int getSize() {
+//        RedisTemplate redisTemplate = getRedisTemplate();
+//        Long size = redisTemplate.boundHashOps(getId()).size();
+//        return size == null ? 0 : size.intValue();
+//    }
+//
+//    @Override
+//    public ReadWriteLock getReadWriteLock() {
+//        return readWriteLock;
+//    }
+//}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/RedisConfig.java


+ 31 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/cache/RedisUtils.java

@@ -0,0 +1,31 @@
+package com.gyee.frame.common.cache;
+
+import org.springframework.stereotype.Service;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+import javax.annotation.Resource;
+@Service
+public class RedisUtils {
+
+    @Resource
+    private  JedisPool jedisPool;
+
+
+
+    public  String get(String key, int indexdb) {
+        Jedis jedis = null;
+        String value = null;
+
+        try {
+            jedis = jedisPool.getResource();//获取一个jedis实例
+            jedis.select(indexdb);
+            value = jedis.get(key);
+        } catch (Exception e) {
+        System.out.println(e.getMessage());
+        } finally {
+            jedis.close();
+        }
+        return value;
+    }
+}

+ 13 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/AjaxStatus.java

@@ -0,0 +1,13 @@
+package com.gyee.frame.common.conf;
+
+public enum  AjaxStatus {
+    success(200),
+    error(500),
+    logineroor(501),
+    loginexpire(502);
+
+    public int code;
+    AjaxStatus(int c) {
+        code = c;
+    }
+}

+ 25 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ExportConfig.java

@@ -0,0 +1,25 @@
+package com.gyee.frame.common.conf;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 庚顿数据导出配置
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "exportcode")
+public class ExportConfig {
+
+    private List<String> template1;
+
+    private Map<String, String> template2swdl;
+
+    private Map<String, String> template2swgl;
+
+    private Map<String, String> template2cft;
+}

+ 30 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/FileConfig.java

@@ -0,0 +1,30 @@
+package com.gyee.frame.common.conf;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ * 
+ * @author gyee
+ */
+@Component
+@ConfigurationProperties(prefix = "spring.servlet.multipart")
+public class FileConfig
+{
+    /**单个文件大小*/
+    private static String maxFileSize;
+
+	public static String getMaxFileSize() {
+		maxFileSize=maxFileSize.replace("MB", "");
+		return maxFileSize;
+	}
+
+	public void setMaxFileSize(String maxFileSize) {
+		FileConfig.maxFileSize = maxFileSize;
+	}
+   
+	
+	
+	
+}

+ 85 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/KaptchaConfig.java

@@ -0,0 +1,85 @@
+package com.gyee.frame.common.conf;
+
+import java.util.Properties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+
+/**
+ * 谷歌验证码配置文件
+ * @author gyee
+ * @date: 2018年9月12日 上午11:02:13
+ */
+@Configuration
+public class KaptchaConfig {
+	 @Bean(name = "captchaProducer")
+	    public DefaultKaptcha getKaptchaBean()
+	    {
+	        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+	        Properties properties = new Properties();
+	        //是否有边框  默认为true  我们可以自己设置yes,no  
+	        properties.setProperty("kaptcha.border", "yes");
+	        //边框颜色   默认为Color.BLACK  
+	        properties.setProperty("kaptcha.border.color", "105,179,90");
+	        //验证码文本字符颜色  默认为Color.BLACK  
+	        properties.setProperty("kaptcha.textproducer.font.color", "blue");
+	        //验证码图片宽度  默认为200
+	        properties.setProperty("kaptcha.image.width", "200");
+	        //验证码图片高度  默认为50
+	        properties.setProperty("kaptcha.image.height", "50");
+	        // 验证码文本字符大小  默认为40
+	        properties.setProperty("kaptcha.textproducer.font.size", "40");
+	        //session key
+	        properties.setProperty("kaptcha.session.key", "kaptchaCode");
+	        // 验证码文本字符间距  默认为2  
+	        properties.setProperty("kaptcha.textproducer.char.spac", "35");
+	        //验证码文本字符长度  默认为5  
+	        properties.setProperty("kaptcha.textproducer.char.length", "4");
+	        //验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) 
+	        properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
+	        //验证码噪点颜色   默认为Color.BLACK  
+	        properties.setProperty("kaptcha.noise.color", "white");
+	        Config config = new Config(properties);
+	        defaultKaptcha.setConfig(config);
+	        return defaultKaptcha;
+	    }
+
+	    @Bean(name = "captchaProducerMath")
+	    public DefaultKaptcha getKaptchaBeanMath()
+	    {
+	        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+	        Properties properties = new Properties();
+	        //是否有边框 默认为true 我们可以自己设置yes,no
+	        properties.setProperty("kaptcha.border", "yes");
+	        //边框颜色 默认为Color.BLACK
+	        properties.setProperty("kaptcha.border.color", "158,167,179");
+	        //验证码文本字符颜色 默认为Color.BLACK
+	        properties.setProperty("kaptcha.textproducer.font.color", "blue");
+	        //验证码图片宽度 默认为200
+	        properties.setProperty("kaptcha.image.width", "100");
+	        //验证码图片高度 默认为50
+	        properties.setProperty("kaptcha.image.height", "30");
+	        //验证码文本字符大小 默认为40
+	        properties.setProperty("kaptcha.textproducer.font.size", "30");
+	        //KAPTCHA_SESSION_KEY
+	        properties.setProperty("kaptcha.session.key", "kaptchaCodeMath");
+	        //验证码文本生成器
+	        properties.setProperty("kaptcha.textproducer.impl", "com.gyee.frame.common.support.KaptchaTextCreator");
+	        //验证码文本字符间距 默认为2
+	        properties.setProperty("kaptcha.textproducer.char.spac", "5");
+	        //验证码文本字符长度 默认为5
+	        properties.setProperty("kaptcha.textproducer.char.length", "6");
+	        //验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
+	        properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
+	        //验证码噪点颜色 默认为Color.BLACK
+	        properties.setProperty("kaptcha.noise.color", "white");
+	        //干扰实现类
+	        properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");
+	        //图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
+	        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
+	        Config config = new Config(properties);
+	        defaultKaptcha.setConfig(config);
+	        return defaultKaptcha;
+	    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/MybatisConfig.java


+ 34 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/PageHelperConf.java

@@ -0,0 +1,34 @@
+package com.gyee.frame.common.conf;
+
+import java.util.Properties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.github.pagehelper.PageHelper;
+
+/**
+* 分页插件配置类
+* @ClassName: PageHelperConf
+* @Description: 这里用一句话描述这个类的作用
+* @author gyee
+* @date 2018年6月3日
+*
+ */
+@Configuration
+public class PageHelperConf {
+
+    /**
+     * 分页插件处理
+     * @return
+     */
+    @Bean
+    public PageHelper pageHelper() {
+        PageHelper pageHelper = new PageHelper();
+        Properties properties = new Properties();
+        properties.setProperty("offsetAsPageNum", "true");
+        properties.setProperty("rowBoundsWithCount", "true");
+        properties.setProperty("reasonable", "true");
+        properties.setProperty("dialect", "mysql");    //配置mysql数据库的方言
+        pageHelper.setProperties(properties);
+        return pageHelper;
+    }
+}

+ 83 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/Swagger.java

@@ -0,0 +1,83 @@
+package com.gyee.frame.common.conf;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import javax.annotation.Resource;
+
+/**
+* Swagger 配置文件
+* @ClassName: Swagger
+* @Description: 配置文件
+* @author gyee
+* @date 2018年6月3日
+*
+ */
+@Configuration(value="true")
+@EnableSwagger2 //启动swagger注解 启动服务,浏览器输入"http://localhost:8080/swagger-ui.html"
+public class Swagger  implements WebMvcConfigurer {
+
+
+	@Resource
+	private V2Config v2Config;
+
+	@Bean
+	public Docket createRestApi() {
+		return new Docket(DocumentationType.SWAGGER_2)
+				.host(v2Config.getSwaggerip())
+				// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+				.apiInfo(apiInfo())
+				// 设置哪些接口暴露给Swagger展示
+				.select()
+				 // 扫描所有有注解的api,用这种方式更灵活
+				.apis(RequestHandlerSelectors.basePackage("com.gyee"))
+				// 扫描指定包中的swagger注解
+				//.apis(RequestHandlerSelectors.basePackage("com.gyee.frame.controller"))
+				// 扫描所有 .apis(RequestHandlerSelectors.any())
+				.paths(PathSelectors.any())
+				.build();
+	}
+	
+	private ApiInfo apiInfo() {
+		return new ApiInfoBuilder()
+				//设置标题
+				.title("API文档")
+				//描述
+				.description("项目")
+				 //作者信息
+                //.contact(new Contact(v2Config.getName(), null, V2Config.getEmail_account()))
+                //服务条款URL
+				.termsOfServiceUrl("")
+				//版本
+				.version("版本号:"+v2Config.getVersion())
+				.build();
+	}
+
+	@Override
+
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+
+		// 解决静态资源无法访问
+
+		registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
+
+		// 解决swagger无法访问
+
+		registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+
+		// 解决swagger的js文件无法访问
+
+		registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+
+	}
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/TemperatureConfig.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ThreadPoolTaskConfig.java


+ 206 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/V2Config.java

@@ -0,0 +1,206 @@
+package com.gyee.frame.common.conf;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ * 
+ * @author gyee
+ */
+@Component
+@ConfigurationProperties(prefix = "gyee")
+public class V2Config
+{
+    /** 项目名称 */
+    private String name;
+    /** 版本 */
+    private String version;
+    /** 版权年份 */
+    private String copyrightYear;
+    /** 上传路径 */
+    private static String defaultBaseDir;
+    /** 是否开启 上传static **/
+    private static String isstatic;
+    /** 开启存放静态文件夹后目录 **/
+    private static String isroot_dir;
+    /** 邮箱发送smtp */
+    private static String email_smtp;
+    /** 发送邮箱端口 */
+    private static String email_port;
+    /** 发送邮箱登录账号 */
+    private static String email_account;
+    /** 发送邮箱登录密码 */
+    private static String email_password;
+    /** 演示模式 **/
+    private static String demoEnabled;
+    /** 滚动验证码 **/
+    private static Boolean rollVerification;
+    /** 实时数据库 **/
+    private  static String realtimedataBase;
+    /**数据适配器网址 **/
+    private static String baseurl;
+    /** swaggerip指定IP **/
+    private  static  String swaggerip;
+    /** 小数位数 **/
+    private  static  Integer digit;
+    /** 气象采集指定IP **/
+    private  static  String weatherurl;
+    /** 区域公司key指定IP **/
+    private  static  String weatherqygs;
+
+    public static String getWeatherurl() {
+        return weatherurl;
+    }
+
+    public  void setWeatherurl(String weatherurl) {
+        V2Config.weatherurl = weatherurl;
+    }
+
+    public static String getWeatherqygs() {
+        return weatherqygs;
+    }
+
+    public  void setWeatherqygs(String weatherqygs) {
+        V2Config.weatherqygs = weatherqygs;
+    }
+
+    public static  Integer getDigit() {
+        return digit;
+    }
+
+    public  void setDigit(Integer digit) {
+        this.digit = digit;
+    }
+
+    public  static String getSwaggerip() {
+        return swaggerip;
+    }
+
+    public  void setSwaggerip(String swaggerip) {
+        this.swaggerip = swaggerip;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getCopyrightYear()
+    {
+        return copyrightYear;
+    }
+
+    public void setCopyrightYear(String copyrightYear)
+    {
+        this.copyrightYear = copyrightYear;
+    }
+
+
+	public static String getDefaultBaseDir() {
+		return defaultBaseDir;
+	}
+
+	public  void setDefaultBaseDir(String defaultBaseDir) {
+		V2Config.defaultBaseDir = defaultBaseDir;
+	}
+
+	public static String getIsstatic() {
+		return isstatic;
+	}
+
+	public  void setIsstatic(String isstatic) {
+
+        V2Config.isstatic = isstatic;
+	}
+
+	public static String getIsroot_dir() {
+		return isroot_dir;
+	}
+
+	public void setIsroot_dir(String isroot_dir) {
+
+        V2Config.isroot_dir = isroot_dir;
+	}
+
+	public static String getEmail_smtp() {
+		return email_smtp;
+	}
+
+	public void setEmail_smtp(String email_smtp) {
+		V2Config.email_smtp = email_smtp;
+	}
+
+	public static String getEmail_port() {
+		return email_port;
+	}
+
+	public void setEmail_port(String email_port) {
+		V2Config.email_port = email_port;
+	}
+
+	public static String getEmail_account() {
+		return email_account;
+	}
+
+	public void setEmail_account(String email_account) {
+		V2Config.email_account = email_account;
+	}
+
+	public static String getEmail_password() {
+		return email_password;
+	}
+
+	public void setEmail_password(String email_password) {
+		V2Config.email_password = email_password;
+	}
+
+	public static String getDemoEnabled() {
+		return demoEnabled;
+	}
+
+	public void setDemoEnabled(String demoEnabled) {
+		V2Config.demoEnabled = demoEnabled;
+	}
+
+	public static Boolean getRollVerification() {
+		return rollVerification;
+	}
+
+	public void setRollVerification(Boolean rollVerification) {
+		V2Config.rollVerification = rollVerification;
+	}
+
+
+
+
+    public static String getRealtimedataBase() {
+        return realtimedataBase;
+    }
+
+    public  void setRealtimedataBase(String realtimedataBase) {
+        V2Config.realtimedataBase = realtimedataBase;
+    }
+    public static String getBaseurl() {
+        return baseurl;
+    }
+
+    public  void setBaseurl(String baseurl) {
+        V2Config.baseurl = baseurl;
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/ZmConfig.java


+ 45 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/monitor/LeaderConfig.java

@@ -0,0 +1,45 @@
+package com.gyee.frame.common.conf.monitor;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+import org.springframework.stereotype.Component;
+
+
+@Component
+@PropertySources({
+        @PropertySource("classpath:config/leader.properties"),
+})
+public class LeaderConfig {
+
+    @Value("${Leader.FDL}")
+    private String FDL;
+    @Value("${Leader.FS}")
+    private String FS;
+    @Value("${Leader.GL}")
+
+    private String GL;
+    public String getFDL() {
+        return FDL;
+    }
+
+    public void setFDL(String FDL) {
+        this.FDL = FDL;
+    }
+
+    public String getFS() {
+        return FS;
+    }
+
+    public void setFS(String FS) {
+        this.FS = FS;
+    }
+
+    public String getGL() {
+        return GL;
+    }
+
+    public void setGL(String GL) {
+        this.GL = GL;
+    }
+}

+ 45 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/conf/monitor/StatusConfig.java

@@ -0,0 +1,45 @@
+package com.gyee.frame.common.conf.monitor;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+import org.springframework.stereotype.Component;
+
+
+@Component
+@PropertySources({
+        @PropertySource("classpath:config/status.properties"),
+})
+public class StatusConfig {
+
+    @Value("${Status.FDL}")
+    private String FDL;
+    @Value("${Status.FS}")
+    private String FS;
+    @Value("${Status.GL}")
+
+    private String GL;
+    public String getFDL() {
+        return FDL;
+    }
+
+    public void setFDL(String FDL) {
+        this.FDL = FDL;
+    }
+
+    public String getFS() {
+        return FS;
+    }
+
+    public void setFS(String FS) {
+        this.FS = FS;
+    }
+
+    public String getGL() {
+        return GL;
+    }
+
+    public void setGL(String GL) {
+        this.GL = GL;
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSource.java


+ 77 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceAspect.java

@@ -0,0 +1,77 @@
+package com.gyee.frame.common.dataSources;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import com.gyee.frame.util.StringUtils;
+
+import java.lang.reflect.Method;
+/**
+ * 多数据源处理
+ * @ClassName: DataSourceAspect
+ * @author gyee
+ * @date 2019-12-07 18:40
+ */
+@Aspect
+@Component
+@Order(1)
+//@EnableAsync
+public class DataSourceAspect {
+	//private static final Logger log = LoggerFactory.getLogger(DataSourceAspect.class);
+
+	@Pointcut("@annotation(com.gyee.frame.common.dataSources.DataSource)")
+    public void dsPointCut()
+    {
+
+    }
+
+	@Around("dsPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable
+    {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+
+        Method method = signature.getMethod();
+
+        DataSource dataSource = method.getAnnotation(DataSource.class);
+
+        if (null!=dataSource)
+        {
+            DataSourceContextHolder.setDataSource(dataSource.value().name());
+        }
+
+        try
+        {
+            return point.proceed();
+        }
+        finally
+        {
+            // 销毁数据源 在执行方法之后
+        	DataSourceContextHolder.clearDataSource();
+        }
+    }
+
+	 /**
+     * 获取需要切换的数据源
+     */
+    public DataSource getDataSource(ProceedingJoinPoint point)
+    {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Class<? extends Object> targetClass = point.getTarget().getClass();
+        DataSource targetDataSource = targetClass.getAnnotation(DataSource.class);
+        if (StringUtils.isNotNull(targetDataSource))
+        {
+            return targetDataSource;
+        }
+        else
+        {
+            Method method = signature.getMethod();
+            DataSource dataSource = method.getAnnotation(DataSource.class);
+            return dataSource;
+        }
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceContextHolder.java


+ 13 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DataSourceType.java

@@ -0,0 +1,13 @@
+package com.gyee.frame.common.dataSources;
+
+/**
+ * 列出所有数据源
+ * @ClassName: DataSourceType
+ * @author gyee
+ * @date 2019-12-06 21:02
+ */
+public enum DataSourceType {
+	MASTER,
+	SLAVE,
+	TICKET
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/dataSources/DynamicDataSource.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/domain/AjaxResult.java


+ 80 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/druid/RemoveDruidAdConfig.java

@@ -0,0 +1,80 @@
+package com.gyee.frame.common.druid;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.*;
+import java.io.IOException;
+
+
+/**
+ * 类名称:RemoveDruidAdConfig
+ * 类描述: 去除druid底部的广告配置类
+ *
+ * @author: taohongchao
+ * 创建时间:2019/2/15 13:14
+ * Version 1.0
+ */
+
+@Configuration
+@ConditionalOnWebApplication
+@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
+@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true)
+public class RemoveDruidAdConfig {
+
+
+    /**
+     * 方法名: removeDruidAdFilterRegistrationBean
+     * 方法描述:  除去页面底部的广告
+     * @param properties
+     * @return org.springframework.boot.web.servlet.FilterRegistrationBean
+     * @throws
+     */
+    @SuppressWarnings("rawtypes")
+	@Bean
+    public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) {
+        // 获取web监控页面的参数
+        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+        // 提取common.js的配置路径
+        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+
+        final String filePath = "support/http/resources/js/common.js";
+
+        //创建filter进行过滤
+        Filter filter = new Filter() {
+            @Override
+            public void init(FilterConfig filterConfig) throws ServletException {
+            }
+
+            @Override
+            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+                chain.doFilter(request, response);
+                // 重置缓冲区,响应头不会被重置
+                response.resetBuffer();
+                // 获取common.js
+                String text = Utils.readFromResource(filePath);
+                // 正则替换banner, 除去底部的广告信息
+                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+                response.getWriter().write(text);
+            }
+
+            @Override
+            public void destroy() {
+            }
+        };
+        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<Filter>();
+        registrationBean.setFilter(filter);
+        registrationBean.addUrlPatterns(commonJsPattern);
+        return registrationBean;
+    }
+}
+

+ 141 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/GlobalExceptionResolver.java

@@ -0,0 +1,141 @@
+package com.gyee.frame.common.exception;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.shiro.authz.AuthorizationException;
+import org.apache.shiro.authz.UnauthenticatedException;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.ModelAndView;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.common.exception.demo.DemoModeException;
+import com.gyee.frame.util.ServletUtils;
+import org.thymeleaf.exceptions.TemplateInputException;
+
+/**
+ * 全局异常处理
+ * @author gyee
+ * @date: 2018年9月9日 下午10:52:55
+ */
+@RestControllerAdvice
+public class GlobalExceptionResolver{
+	private static Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class);
+	
+	
+	
+	 /**
+     * 权限校验失败 如果请求为ajax返回json,普通请求跳转页面
+     */
+    @ExceptionHandler(AuthorizationException.class)
+    public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e)
+    {
+		//开发环境打印异常,正式环境请注销
+    	logger.error(" 权限校验异常》》"+e.getMessage(), e);
+        if (ServletUtils.isAjaxRequest(request))
+        {
+            return AjaxResult.error(e.getMessage());
+        }
+        else
+        {
+        	ModelAndView mv;
+        	//shiro异常拦截 
+          if(e instanceof UnauthorizedException){
+          	//未授权异常
+              mv = new ModelAndView("/error/403");
+              return mv;
+          }else if(e instanceof UnauthenticatedException){
+          	//未认证异常
+              mv = new ModelAndView("/error/403");
+              return mv;
+          }
+          else {
+              mv = new ModelAndView();
+              return mv;
+  
+          }
+        }
+    }
+	
+	
+   
+    
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(BindException.class)
+    public AjaxResult validatedBindException(BindException e)
+    {
+    	logger.error("自定义验证异常", e);
+        String message = e.getAllErrors().get(0).getDefaultMessage();
+        return AjaxResult.error(message);
+    }
+    
+    
+    /**
+     * 请求方式不支持
+     */
+    @ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
+    public AjaxResult handleException(HttpRequestMethodNotSupportedException e)
+    {
+    	logger.error("请求方式不支持异常:", e);
+        return AjaxResult.error("不支持' " + e.getMethod() + "'请求");
+    }
+  
+    
+    
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class) 
+    public ModelAndView handle(Exception e){ 
+    	logger.error("系统异常:", e);
+	    ModelAndView mv = new ModelAndView(); 
+	    mv.addObject("message", e.getMessage()); 
+	    mv.setViewName("/error/999"); 
+	    return mv; 
+    }
+    
+    /**
+     * 演示模式异常
+     */
+    @ExceptionHandler(DemoModeException.class)
+    public AjaxResult demoModeException(DemoModeException e)
+    {
+        return AjaxResult.error("演示模式,不允许操作");
+    }
+    
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    public AjaxResult notFount(RuntimeException e)
+    {
+    	logger.error("运行时异常:", e);
+        return AjaxResult.error("运行时异常:" + e.getMessage());
+    }
+
+    /**
+     * 拦截自定义异常
+     */
+    @ExceptionHandler(QiNiuException.class)
+    public AjaxResult qiniuException(QiNiuException e)
+    {
+        logger.error(e.getMessage());
+        return AjaxResult.error(e.getCode(), e.getMessage());
+    }
+
+
+    @ExceptionHandler(TemplateInputException.class)
+    public AjaxResult templateException(TemplateInputException e)
+    {
+        logger.error(e.getMessage());
+        return AjaxResult.error(e.getMessage());
+    }
+
+}

+ 65 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/QiNiuException.java

@@ -0,0 +1,65 @@
+package com.gyee.frame.common.exception;
+
+import com.gyee.frame.common.exception.enums.QiNiuErrorEnum;
+
+/**
+ * QiNiuException
+ *
+ * @author bobbi
+ * @date 2018/10/07 13:54
+ * @email 571002217@qq.com
+ * @description 自定义异常
+ */
+public class QiNiuException extends RuntimeException{
+	private static final long serialVersionUID = 1L;
+	private String msg;
+    private int code = 500;
+
+    public QiNiuException(){
+        super(QiNiuErrorEnum.UNKNOWN.getMsg());
+        this.msg= QiNiuErrorEnum.UNKNOWN.getMsg();
+    }
+
+
+    public QiNiuException(QiNiuErrorEnum eEnum, Throwable e){
+        super(eEnum.getMsg(),e);
+        this.msg=eEnum.getMsg();
+        this.code=eEnum.getCode();
+    }
+
+    public QiNiuException(QiNiuErrorEnum eEnum){
+        this.msg=eEnum.getMsg();
+        this.code=eEnum.getCode();
+    }
+
+    public QiNiuException(String exception){
+       this.msg=exception;
+    }
+
+
+	public String getMsg() {
+		return msg;
+	}
+
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+
+	public int getCode() {
+		return code;
+	}
+
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public QiNiuException(String msg, int code) {
+		super();
+		this.msg = msg;
+		this.code = code;
+	}
+    
+}

+ 17 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/demo/DemoModeException.java

@@ -0,0 +1,17 @@
+package com.gyee.frame.common.exception.demo;
+
+/**
+ * 演示模式异常
+* @ClassName: DemoModeException
+* @author gyee
+* @date 2019-11-08 15:45
+*
+ */
+public class DemoModeException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public DemoModeException()
+    {
+    }
+}

+ 55 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/enums/QiNiuErrorEnum.java

@@ -0,0 +1,55 @@
+package com.gyee.frame.common.exception.enums;
+
+/**
+ * QiNiuErrorEnum
+ * @description error类型枚举类
+ */
+public enum QiNiuErrorEnum {
+
+    // 系统错误
+    UNKNOWN(500,"系统内部错误,请联系管理员"),
+    PATH_NOT_FOUND(404,"路径不存在,请检查路径"),
+    NO_AUTH(403,"没有权限,请联系管理员"),
+    DUPLICATE_KEY(501,"数据库中已存在该记录"),
+    TOKEN_GENERATOR_ERROR(502,"token生成失败"),
+    NO_UUID(503,"uuid为空"),
+    SQL_ILLEGAL(504,"sql非法"),
+	TEMPLATE_NO_SUPPORT(505,"模板不支持"),
+
+    //用户权限错误
+    INVALID_TOKEN(1001,"token不合法"),
+
+    //七牛OSS错误
+    OSS_CONFIG_ERROR(10050,"七牛配置信息错误"),
+    OSS_UPLOAD_ERROR(10051,"OSSBookNote上传失败"),
+
+	//数据库错误
+	ERROR_CONNECT(4005, "数据库连接异常"),
+	ERROR_DATA(4006, "数据查询失败");
+
+    private int code;
+    private String msg;
+	public int getCode() {
+		return code;
+	}
+	public void setCode(int code) {
+		this.code = code;
+	}
+	public String getMsg() {
+		return msg;
+	}
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	/**
+	 * @param code
+	 * @param msg
+	 * @author gyee
+	 * @Date 2019年11月20日 下午9:28:34
+	 */
+	private QiNiuErrorEnum(int code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+	
+}

+ 41 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/file/FileNameLengthLimitExceededException.java

@@ -0,0 +1,41 @@
+package com.gyee.frame.common.exception.file;
+
+import org.apache.commons.fileupload.FileUploadException;
+
+/**
+ * 文件名超长 误异常类
+ * 
+ * @author gyee
+ */
+public class FileNameLengthLimitExceededException extends FileUploadException
+{
+
+    private static final long serialVersionUID = 1L;
+    private int length;
+    private int maxLength;
+    private String filename;
+
+    public FileNameLengthLimitExceededException(String filename, int length, int maxLength)
+    {
+        super("file name : [" + filename + "], length : [" + length + "], max length : [" + maxLength + "]");
+        this.length = length;
+        this.maxLength = maxLength;
+        this.filename = filename;
+    }
+
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    public int getLength()
+    {
+        return length;
+    }
+
+    public int getMaxLength()
+    {
+        return maxLength;
+    }
+
+}

+ 73 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/exception/file/InvalidExtensionException.java

@@ -0,0 +1,73 @@
+package com.gyee.frame.common.exception.file;
+
+import java.util.Arrays;
+import org.apache.commons.fileupload.FileUploadException;
+
+/**
+ * 文件上传 误异常类
+ * 
+ * @author gyee
+ */
+public class InvalidExtensionException extends FileUploadException
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private String[] allowedExtension;
+    private String extension;
+    private String filename;
+
+    public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
+    {
+        super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
+        this.allowedExtension = allowedExtension;
+        this.extension = extension;
+        this.filename = filename;
+    }
+
+    public String[] getAllowedExtension()
+    {
+        return allowedExtension;
+    }
+
+    public String getExtension()
+    {
+        return extension;
+    }
+
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    public static class InvalidImageExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidFlashExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidMediaExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+}

+ 37 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/feign/IAdapterService.java

@@ -0,0 +1,37 @@
+package com.gyee.frame.common.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.frame.model.custom.export.TsPointData;
+import com.gyee.frame.util.golden.timeseries.TsData;
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+
+public interface IAdapterService {
+
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/latest?keys={points}")
+    JSONObject getLatest(@Param(value = "points") String points);
+
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/history/snap?tagName={tagName}&startTs={startTs}&endTs={endTs}&interval={interval}")
+    List<TsPointData> getHistorySnap(@Param(value = "tagName") String tagName, @Param(value = "startTs") long startTs,
+                                     @Param(value = "endTs") long endTs, @Param(value = "interval") Integer interval);
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/history/raw?tagName={tagName}&startTs={startTs}&endTs={endTs}")
+    List<TsPointData> getHistoryRaw(@Param(value = "tagName") String tagName, @Param(value = "startTs") long startTs,
+                                     @Param(value = "endTs") long endTs);
+
+    @Headers({"Content-Type: application/json", "Accept: application/json"})
+    @RequestLine("GET /ts/history/section?tagNames={tagNames}&ts={ts}")
+    List<TsPointData> getHistorySection(@Param(value = "tagNames") String tagNames, @Param(value = "ts") long ts);
+
+}

+ 30 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/feign/RemoteServiceBuilder.java

@@ -0,0 +1,30 @@
+package com.gyee.frame.common.feign;
+
+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.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Slf4j
+@Configuration
+public class RemoteServiceBuilder {
+
+    @Value("${goldenUrl:http://10.155.32.4:8011}")
+    private String shardingUrlString;
+
+    @Bean
+    public IAdapterService ShardingService() {
+        return Feign.builder()
+                .encoder(new JacksonEncoder())
+                .decoder(new JacksonDecoder())
+                .options(new Request.Options(5000, 600000))
+                .retryer(new Retryer.Default(10000, 10000, 3))
+                .target(IAdapterService.class, shardingUrlString);
+    }
+}

+ 83 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/ClassUtil.java

@@ -0,0 +1,83 @@
+package com.gyee.frame.common.file;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author:
+ * @Date:
+ * @Description:关于类的操作的工具类
+ */
+public final class ClassUtil {
+
+    private ClassUtil() {
+        throw new Error("工具类不允许实例化!");
+    }
+
+    /**
+     * 获取类属性
+     * @param targetObj 要获取属性的类
+     * @return 含有类属性的集合
+     */
+    public static Field[] getClassAttribute(Object targetObj){
+
+        Class<?> objectClass = targetObj.getClass();
+        return objectClass.getDeclaredFields();
+
+    }
+
+    /**
+     * 获取对象的所有get或set方法
+     * @param targetObj 要获取属性的类
+     * @param methodKeyword get或者set关键字
+     * @return 含有类get或set方法的集合
+     */
+    public static List<Method> getMethod(Object targetObj,String methodKeyword){
+        List<Method> methodList = new ArrayList<>();
+
+        Class<?> objectClass = targetObj.getClass();
+
+        Field[] field = objectClass.getDeclaredFields();
+        for (int i = 0;i<field.length;i++){
+
+            if(!field[i].getName().equals("serialVersionUID"))
+            {
+
+                //获取属性名并组装方法名
+                String fieldName = field[i].getName();
+                String getMethodName = methodKeyword
+                        + fieldName.substring(0, 1).toUpperCase()
+                        + fieldName.substring(1);
+
+                try {
+                    Method method = objectClass.getMethod(getMethodName,new Class[]{});
+                    methodList.add(method);
+                } catch (NoSuchMethodException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        }
+        return methodList;
+    }
+
+    /**
+     * 获取对象的所有get方法
+     * @param targetObj 要获取属性的类
+     * @return 含有类方法的集合
+     */
+    public static List<Method> getMethodGet(Object targetObj){
+        return getMethod(targetObj,"get");
+    }
+
+    /**
+     * 获取对象的所有set方法
+     * @param targetObj 要获取属性的类
+     * @return 含有类方法的集合
+     */
+    public static List<Method> getMethodSet(Object targetObj){
+        return getMethod(targetObj,"set");
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/ExcelExport.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/FileUploadUtils.java


+ 110 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/file/FileUtils.java

@@ -0,0 +1,110 @@
+package com.gyee.frame.common.file;
+
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.ClassUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+
+/**
+ * 文件处理工具类
+ *
+ * @author gyee
+ * @date: 2018年9月22日 下午10:33:31
+ */
+public class FileUtils {
+
+    // 设置目标文件的映射路径
+    @Value("classpath:static/syz")
+    private Resource syz;
+
+    private FileUtils() {
+    }
+
+    /**
+     * 输出指定文件的byte数组
+     *
+     * @return
+     */
+    public static void writeBytes(String filePath, OutputStream os) throws IOException {
+        FileInputStream fis = null;
+        try {
+            File file = new File(filePath);
+            if (!file.exists()) {
+                throw new FileNotFoundException(filePath);
+            }
+            fis = new FileInputStream(file);
+            byte[] b = new byte[1024];
+            int length;
+            while ((length = fis.read(b)) > 0) {
+                os.write(b, 0, length);
+            }
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+            if (fis != null) {
+                try {
+                    fis.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param filePath 文件
+     * @return
+     */
+    public static boolean deleteFile(String filePath) {
+        boolean flag = false;
+        File file = new File(filePath);
+        // 路径为文件且不为空则进行删除
+        if (file.isFile() && file.exists()) {
+            file.delete();
+            flag = true;
+        }
+        return flag;
+    }
+
+    /**
+     * 读取图片地址 输出到页面
+     *
+     * @param request
+     * @param response
+     * @param fileurl
+     * @throws IOException
+     */
+    public static void readIMGTohtml(HttpServletRequest request, HttpServletResponse response, String fileurl) throws IOException {
+        //设置发送到客户端的响应内容类型
+        response.setContentType("image/*");
+        //读取本地图片输入流
+        try (FileInputStream inputStream = new FileInputStream(fileurl); OutputStream out = response.getOutputStream()) {
+            int i = inputStream.available();
+            //byte数组用于存放图片字节数据
+            byte[] buff = new byte[i];
+            inputStream.read(buff);
+            out.write(buff);
+        }
+    }
+
+
+
+
+
+
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/interceptor/MyInterceptor.java


+ 108 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/interceptor/MyWebAppConfigurer.java

@@ -0,0 +1,108 @@
+package com.gyee.frame.common.interceptor;
+
+import com.gyee.frame.common.conf.V2Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.*;
+
+/**
+ * 拦截器
+* @ClassName: MyWebAppConfigurer
+* @author gyee
+* @date 2018年6月3日
+*
+ */
+@Configuration
+public class MyWebAppConfigurer  extends  WebMvcConfigurationSupport  {
+	
+	private static Logger logger=LoggerFactory.getLogger(WebMvcConfigurationSupport.class);
+	/**
+     * 默认上传的地址
+     */
+    private  String defaultBaseDir = V2Config.getDefaultBaseDir();
+    
+    /**
+     * 静态文件夹后目录
+     */
+    private  String isrootDir=V2Config.getIsroot_dir();
+    
+    /**
+     * 是否上传到static
+     */
+    private   String isstatic=V2Config.getIsstatic();
+	
+	
+	/** 解决跨域问题 **/
+	@Override
+	public void addCorsMappings(CorsRegistry registry){
+
+
+        registry.addMapping("/**")
+			// 设置允许跨域请求的域名
+			.allowedOrigins("*")
+			// 是否允许证书
+			.allowCredentials(true)
+			// 设置允许的方法
+			.allowedMethods("GET", "POST", "DELETE", "PUT")
+			// 设置允许的header属性
+			.allowedHeaders("*")
+				// 跨域允许时间
+			.maxAge(3600);
+			super.addCorsMappings(registry);
+
+	}
+	
+	/** 添加拦截器 **/
+	@Override
+	protected void addInterceptors(InterceptorRegistry registry){
+	//	registry.addInterceptor(new MyInterceptor());
+		super.addInterceptors(registry);
+	}
+	
+	/** 这里配置视图解析器 **/
+	@Override
+	protected void configureViewResolvers(ViewResolverRegistry registry){
+		super.configureViewResolvers(registry);
+	}
+	
+	/** 配置内容裁决的一些选项 **/
+	@Override
+	protected void configureContentNegotiation(ContentNegotiationConfigurer configurer){
+		super.configureContentNegotiation(configurer);
+	}
+	
+	/** 视图跳转控制器 **/
+	@Override
+	protected void addViewControllers(ViewControllerRegistry registry) {
+		
+		super.addViewControllers(registry);
+	}
+	
+	
+	/** 静态资源处理 **/
+	@Override
+    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
+		//配置虚拟路径为项目得static下面
+        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+        if(!"Y".equals(isstatic)) {
+        	 //配置上传路径为D盘
+            registry.addResourceHandler("/static/file_upload/**").addResourceLocations("file:"+defaultBaseDir);
+            logger.info("初始化文件上传路径为项目【"+defaultBaseDir+"】路径");
+        }else {
+        	logger.info("初始化文件上传路径为项目【"+isrootDir+"】路径");
+        }
+       
+    }
+	/** 默认静态资源处理器 **/
+	
+	protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+		//super.configureDefaultServletHandling(configurer);
+		//configurer.enable("stati");
+		configurer.enable();
+	}
+	
+	
+	
+	
+}

+ 31 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/log/Log.java

@@ -0,0 +1,31 @@
+package com.gyee.frame.common.log;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义操作日志记录注解
+ * @author gyee
+ * @date: 2018年9月30日 下午3:36:05
+ */
+@Target({ ElementType.PARAMETER, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log
+{
+    /** 模块 */
+    String title() default "";
+
+    /** 功能 */
+    String action() default "";
+
+    /** 渠道 */
+    String channel() default "1";//1后台
+
+    /** 是否保存请求的参数 */
+    boolean isSaveRequestData() default true;
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/log/LogAspect.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/AbstractQuartzJob.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzConfig.java


+ 23 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzDisallowConcurrentExecution.java

@@ -0,0 +1,23 @@
+package com.gyee.frame.common.quartz;
+
+import com.gyee.frame.common.quartz.utils.JobInvokeUtil;
+import com.gyee.frame.model.auto.SysQuartzJob;
+
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+
+/**
+ * 定时任务处理(禁止并发执行)
+ * 
+ * @author jan 橙寂
+ *
+ */
+@DisallowConcurrentExecution
+public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob
+{
+    @Override
+    protected void doExecute(JobExecutionContext context, SysQuartzJob sysJob) throws Exception
+    {
+        JobInvokeUtil.invokeMethod(sysJob);
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzJobExecution.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/QuartzSchedulerUtil.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/ScheduleConstants.java


+ 191 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/quartz/utils/JobInvokeUtil.java

@@ -0,0 +1,191 @@
+package com.gyee.frame.common.quartz.utils;
+
+import com.gyee.frame.common.spring.SpringUtils;
+import com.gyee.frame.model.auto.SysQuartzJob;
+import com.gyee.frame.util.StringUtils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 任务执行工具
+ *
+ * @author ruoyi
+ */
+public class JobInvokeUtil
+{
+    /**
+     * 执行方法
+     *
+     * @param sysJob 系统任务
+     */
+    public static void invokeMethod(SysQuartzJob sysJob) throws Exception
+    {
+        String invokeTarget = sysJob.getInvokeTarget();
+        String beanName = getBeanName(invokeTarget);
+        String methodName = getMethodName(invokeTarget);
+        List<Object[]> methodParams = getMethodParams(invokeTarget);
+
+        if (!isValidClassName(beanName))
+        {
+            Object bean = SpringUtils.getBean(beanName);
+            if (null != bean) {
+                invokeMethod(bean, methodName, methodParams);
+            }else {
+                System.out.println("找不到class["+ beanName +"]");
+            }
+        }
+        else
+        {
+            Object bean = Class.forName(beanName).newInstance();
+            if (null != bean) {
+                invokeMethod(bean, methodName, methodParams);
+            }else {
+                System.out.println("找不到class["+ beanName +"]");
+            }
+        }
+    }
+
+    /**
+     * 调用任务方法
+     *
+     * @param bean 目标对象
+     * @param methodName 方法名称
+     * @param methodParams 方法参数
+     */
+    private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
+            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
+            InvocationTargetException
+    {
+        if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
+        {
+            Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
+            method.invoke(bean, getMethodParamsValue(methodParams));
+        }
+        else
+        {
+            Method method = bean.getClass().getDeclaredMethod(methodName);
+            method.invoke(bean);
+        }
+    }
+
+    /**
+     * 校验是否为为class包名
+     * 
+     * @param str 名称
+     * @return true是 false否
+     */
+    public static boolean isValidClassName(String invokeTarget)
+    {
+        return StringUtils.countMatches(invokeTarget, ".") > 1;
+    }
+
+    /**
+     * 获取bean名称
+     * 
+     * @param invokeTarget 目标字符串
+     * @return bean名称
+     */
+    public static String getBeanName(String invokeTarget)
+    {
+        String beanName = StringUtils.substringBefore(invokeTarget, "(");
+        return StringUtils.substringBeforeLast(beanName, ".");
+    }
+
+    /**
+     * 获取bean方法
+     * 
+     * @param invokeTarget 目标字符串
+     * @return method方法
+     */
+    public static String getMethodName(String invokeTarget)
+    {
+        String methodName = StringUtils.substringBefore(invokeTarget, "(");
+        return StringUtils.substringAfterLast(methodName, ".");
+    }
+
+    /**
+     * 获取method方法参数相关列表
+     * 
+     * @param invokeTarget 目标字符串
+     * @return method方法相关参数列表
+     */
+    public static List<Object[]> getMethodParams(String invokeTarget)
+    {
+        String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
+        if (StringUtils.isEmpty(methodStr))
+        {
+            return null;
+        }
+        String[] methodParams = methodStr.split(",");
+        List<Object[]> classs = new LinkedList<>();
+        for (int i = 0; i < methodParams.length; i++)
+        {
+            String str = StringUtils.trimToEmpty(methodParams[i]);
+            // String字符串类型,包含'
+            if (StringUtils.contains(str, "'"))
+            {
+                classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class });
+            }
+            // boolean布尔类型,等于true或者false
+            else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false"))
+            {
+                classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
+            }
+            // long长整形,包含L
+            else if (StringUtils.containsIgnoreCase(str, "L"))
+            {
+                classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class });
+            }
+            // double浮点类型,包含D
+            else if (StringUtils.containsIgnoreCase(str, "D"))
+            {
+                classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class });
+            }
+            // 其他类型归类为整形
+            else
+            {
+                classs.add(new Object[] { Integer.valueOf(str), Integer.class });
+            }
+        }
+        return classs;
+    }
+
+    /**
+     * 获取参数类型
+     * 
+     * @param methodParams 参数相关列表
+     * @return 参数类型列表
+     */
+    public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
+    {
+        Class<?>[] classs = new Class<?>[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams)
+        {
+            classs[index] = (Class<?>) os[1];
+            index++;
+        }
+        return classs;
+    }
+
+    /**
+     * 获取参数值
+     * 
+     * @param methodParams 参数相关列表
+     * @return 参数值列表
+     */
+    public static Object[] getMethodParamsValue(List<Object[]> methodParams)
+    {
+        Object[] classs = new Object[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams)
+        {
+            classs[index] = (Object) os[0];
+            index++;
+        }
+        return classs;
+    }
+}

File diff suppressed because it is too large
+ 590 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/Constant.java


+ 397 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/ConstantTR.java

@@ -0,0 +1,397 @@
+package com.gyee.frame.common.spring;
+
+/**
+ * 
+ * 
+ * 项目名称:nxfd 类名称:Constant 类描述: 创建人:石林 创建时间:2014-3-4 上午10:07:03 修改人:shilinno1
+ * 修改时间:2014-3-4 上午10:07:03 修改备注:
+ * 
+ * @version
+ * 
+ */
+public class ConstantTR {
+
+	public static final String QSZSWDL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0136"; // 全省上网电量
+	public static final String AQTS = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0220"; // 全省安全天数
+	public static final String QSZZGL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0135"; // 全省总功率
+	public static final String QSZRFDL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0088"; // 全省日累计发电量
+	public static final String QSZYFDL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0146"; // 全省月累计发电量
+	public static final String QSZNFDL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0037"; // 全省年累计发电量
+
+	public static final String FCRFDL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0088"; // 风场日累计发电量
+	public static final String FCYFDL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0146"; // 风场月累计发电量
+	public static final String FCNFDL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0037"; // 风场年累计发电量
+	public static final String GFRFDL = "JSFW.NX_GD_GDC_XX_XX_XXX_XXX_CI0088"; // 光伏日累计发电量
+	public static final String GFYFDL = "JSFW.NX_GD_GDC_XX_XX_XXX_XXX_CI0146"; // 光伏月累计发电量
+	public static final String GFNFDL = "JSFW.NX_GD_GDC_XX_XX_XXX_XXX_CI0037"; // 光伏年累计发电量
+	public static final String JPEYHT = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0216"; // 减排二氧化碳
+	public static final String JYBM = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0217"; // 节约标煤
+	public static final String JPEYHL = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0218"; // 减排二氧化硫
+	public static final String JYS = "JSFW.NX_GD_XXX_XX_XX_XXX_XXX_CI0219"; // 节约水
+	public static final String FCSWDL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0136"; // 风场上网电量
+	public static final String FCZGL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0135"; // 风场总功率
+	public static final String FCFS = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0134"; // 风场风速
+	public static final String GFSWDL = "JSFW.NX_GD_GDC_XX_XX_XXX_XXX_CI0136"; // 光伏上网电量
+	public static final String GFZGL = "JSFW.NX_GD_GDC_XX_XX_XXX_XXX_CI0135"; // 光伏总功率
+	public static final String FCQFDL = "JSFW.NX_GD_FDC_XX_XX_XXX_XXX_CI0110"; // 风电日欠发损失电
+
+	
+	
+	/******************************************** 麻黄山风电场 *****************************************/
+	public static final String JSFW_MHSFJZD ="MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0215"; //麻黄山风机是否中断
+	public static final String JSFW_MHSDQZD ="MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0216";//麻黄山电气是否中断
+	public static final String JSFW_MHSCFTZD ="MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0218";//麻黄山测风塔是否中断
+	public static final String JSFW_MHSDJLZD ="MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0217";//麻黄山电计量是否中断
+	public static final String JSFW_MHSAGCZD ="MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0219";//麻黄山AGC是否中断
+	
+	
+	
+	
+	
+	
+	public static final String JSFW_MHRFDLB = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0088"; // 麻黄山日发电量
+	public static final String JSFW_MHYFDLB = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0146"; // 麻黄山月发电量
+	public static final String JSFW_MHNFDLB = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0037"; // 麻黄山年发电量
+	public static final String JSFW_MHSWDLB = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0136"; // 麻黄山上网电量
+	public static final String JSFW_MHSSZGL = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0135"; // 麻黄山总功率
+	public static final String JSFW_MHSSFS = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0134"; // 麻黄山风速
+	public static final String JSFW_MHRQFSS = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0110"; // 麻黄山日欠发损失电量
+	public static final String MHSFGL_AI000305 = "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_FGLTEM"; // 麻黄山测风塔温度
+	public static final String MHSFGL_AI000306 = "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_FGLHUM"; // 麻黄山测风塔湿度
+	public static final String MHSFGL_AI000307 = "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_FGLPRE"; // 麻黄山测风塔压强
+	public static final String MHSDQ_DI000006 = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0006"; // 111断路器位置
+	public static final String MHSDQ_DI000141 = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0141"; // 301断路器合闸位置
+	public static final String MHSDQ_DI000363 = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0363"; // [风场Ⅰ线9611CS]断路器位置
+	public static final String MHSDQ_DI000423 = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0423"; // [风场Ⅱ线9611CS]断路器位置
+	public static final String MHSDQ_DI000483 = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0483"; // [风场Ⅲ线9611CS]断路器位置
+
+	public static final String MHSDQ_101DLQ = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0006"; // 101断路器位置
+	public static final String MHSDQ_102DLQ = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0006"; // 102断路器位置
+	public static final String MHSDQ_302DLQ = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0141"; // 302断路器合闸位置
+	public static final String MHSDQ_321DLQ = "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_DI0985"; // 321断路器合闸位置
+
+	public static final String MHSFGL_AI000314 = "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_FGLS70";// 麻黄山70m风速
+	public static final String MHSFGL_AI000315 = "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_FGLD70";// 麻黄山70m风向
+	/******************************************** 麻黄山风电场 *****************************************/
+
+	/******************************************** 石板泉风电场 *****************************************/
+	public static final String JSFW_SBQFJZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0215"; //石板泉风机是否中断
+	public static final String JSFW_SBQDQZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0216";//石板泉电气是否中断
+	public static final String JSFW_SBQCFTZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0218";//石板泉测风塔是否中断
+	public static final String JSFW_SBQDJLZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0217";//石板泉电计量是否中断
+	public static final String JSFW_SBQAGCZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0219";//石板泉AGC是否中断
+
+	
+	
+	
+	
+	
+	
+	public static final String JSFW_SBRFDLB = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0088"; // 石板泉日发电量
+	public static final String JSFW_SBYFDLB = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0146"; // 石板泉月发电量
+	public static final String JSFW_SBNFDLB = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0037"; // 石板泉年发电量
+	public static final String JSFW_SBSWDLB = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0136"; // 石板泉上网电量
+	public static final String JSFW_SBSSZGL = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0135"; // 石板泉总功率
+	public static final String JSFW_SBSSFS = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0134"; // 石板泉风速
+	public static final String JSFW_SBRQFSS = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0110"; // 石板泉日欠发损失电量
+	public static final String SBQFGL_AI000305 = "SBQFJ.NX_GD_SBQF_FJ_P4_L9_100_AI0165"; // 石板泉测风塔温度
+	
+//	public static final String SBQFGL_AI000305 = "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_FGLTEM"; // 石板泉测风塔温度
+
+	public static final String SBQFGL_AI000319 = "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_FGLHUM"; // 石板泉测风塔湿度
+	public static final String SBQFGL_AI000320 = "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_FGLPRE"; // 石板泉测风塔压强
+
+	public static final String SBQDQ_DI000001 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0001"; // 1#进线路测控装置断路器111
+	public static final String SBQDQ_DI000161 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0161"; // 1号主变测控装置高压侧断路器101
+	public static final String SBQDQ_DI000175 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0175"; // 1号主变测控装置低压侧断路器301
+	public static final String SBQDQ_DI000966 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0966"; // 35kV1A出线保护断路器312
+	public static final String SBQDQ_DI001030 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI1030"; // 35kV1B出线保护断路器313
+	public static final String SBQDQ_DI001158 = "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_DI1158"; // 35kV1C出线保护断路器314
+
+	public static final String SBQDQ_DI000081 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0081"; // 2#进线路测控装置断路器121合闸
+	public static final String SBQDQ_DI000241 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0241"; // 2号主变测控装置高压侧断路器102合闸
+	public static final String SBQDQ_DI000255 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0255"; // 2号主变测控装置低压侧断路器302合位
+	public static final String SBQDQ_DI001419 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI1419"; // 35kV2A出线保护321断路器合位
+	public static final String SBQDQ_DI001483 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI1483"; // 35kV2B出线保护322断路器合位
+	public static final String SBQDQ_DI001611 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI1611"; // 35kV2C出线保护323断路器合位
+
+	public static final String SBQDQ_DI002536 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI2569"; // 35kV1A出线保护断路器331
+	public static final String SBQDQ_DI002600 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI2633"; // 35kV1B出线保护断路器332
+	public static final String SBQDQ_DI002915 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI2915"; // 2#进线路测控装置断路器151合闸
+	public static final String SBQDQ_DI000425 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI0425"; // 2号主变测控装置高压侧断路器105合闸
+	// public static final String SBQDQ_DI000255="SBQDQ_DI000255";
+	// //2号主变测控装置低压侧断路器305合位
+	public static final String SBQDQ_DI003272 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3305"; // 35kV2A出线保护351断路器合位
+	public static final String SBQDQ_DI003336 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3369"; // 35kV2B出线保护352断路器合位
+	public static final String SBQDQ_DI003400 = "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_DI3433"; // 35kV2C出线保护353断路器合位
+
+	public static final String SBQFGL_AI000327 = "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_FGLS70";// 石板泉70m风速
+	public static final String SBQFGL_AI000328 = "SBQFGL.NX_GD_SBQF_YC_P1_L1_001_FGLD70";// 石板泉70m风向
+	/******************************************* 石板泉风电场 *****************************************/
+
+	/******************************************** 青山风电场 *****************************************/
+	public static final String JSFW_QSFJZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0215"; //石板泉风机是否中断
+	public static final String JSFW_QSDQZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0216";//石板泉电气是否中断
+	public static final String JSFW_QSCFTZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0218";//石板泉测风塔是否中断
+	public static final String JSFW_QSDJLZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0217";//石板泉电计量是否中断
+	public static final String JSFW_QSAGCZD ="SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0219";//石板泉AGC是否中断
+
+	
+	
+	
+	
+	
+	
+	
+	public static final String QSRFDL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0088"; // 青山日发电量
+	public static final String QSYFDL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0146"; // 青山月发电量
+	public static final String QSNFDL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0037"; // 青山年发电量
+	public static final String QSSWDL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0136"; // 青山上网电量
+	public static final String QSZGL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0135"; // 青山总功率
+	public static final String QSFS = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0134"; // 青山风速
+	public static final String QSQFDL = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0110"; // 青山日欠发损失电量
+	public static final String QSWD = "QSFGL.NX_GD_QSF_YC_P1_L1_001_CFT019"; // 青山测风塔温度
+	// public static final String QSWD = "QSFGL_AI000323"; // 青山测风塔湿度
+	public static final String QSFGL_AI000324 = "QSFGL.NX_GD_QSF_YC_P1_L1_001_CFT020"; // 青山测风塔压强
+	public static final String QSPJFS = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0134"; // 青山平均风速
+
+	public static final String QSDQ_DI000377 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI0377"; // 110kV线路测控隔刀111-1分位
+	public static final String QSDQ_DI000530 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI0530"; // 1#主变测控断路器101分
+	public static final String QSDQ_DI000858 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI0858"; // 2#主变测控断路器102
+	public static final String QSDQ_DI000193 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI0193"; // 35kV公用测控1#主变35KV手车分
+	public static final String QSDQ_DI000195 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI0195"; // 35kV公用测控2#主变35KV手车分
+	public static final String QSDQ_DI001186 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1186"; // 35kVI段集线线路1A311断路器
+	public static final String QSDQ_DI001232 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1232"; // 35kVI段集线线路1B312断路器
+	public static final String QSDQ_DI001278 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1278"; // 35kVI段集线线路1C313断路器
+	public static final String QSDQ_DI001416 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1416"; // 35kV分段300断路器
+	public static final String QSDQ_DI001462 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1462"; // 35kVII段集线线路2A323断路器
+	public static final String QSDQ_DI001508 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1508"; // 35kVII段集线线路2B324断路器
+	public static final String QSDQ_DI001554 = "QSDQ.NX_GD_QSF_DQ_P1_L1_001_DI1554"; // 35kVII段集线线路2C325断路器
+
+	public static final String SLDQ_DI000103 = "SLDQ.NX_GD_QSF_DQ_P1_L1_001_DI0071";
+	public static final String SLDQ_DI000303 = "SLDQ.NX_GD_QSF_DQ_P1_L1_001_DI0123";
+	public static final String SLDQ_DI000331 = "SLDQ.NX_GD_QSF_DQ_P1_L1_001_DI1615";
+	public static final String SLDQ_DI000332 = "SLDQ.NX_GD_QSF_DQ_P1_L1_001_DI1701";
+
+	public static final String QSFGL_AI000313 = "QSFGL.NX_GD_QSF_YC_P1_L1_001_CFT009";// 青山70m风速
+	public static final String QSFGL_AI000314 = "QSFGL.NX_GD_QSF_YC_P1_L1_001_CFT010";// 青山70m风向
+	/******************************************** 青山风电场 *****************************************/
+
+	/******************************************** 牛首山风电场 *****************************************/
+	public static final String NSSRFDL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0088"; // 牛首山日发电量
+	public static final String NSSYFDL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0146"; // 牛首山月发电量
+	public static final String NSSNFDL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0037"; // 牛首山年发电量
+	public static final String NSSSWDL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0136"; // 牛首山上网电量
+	public static final String NSSZGL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0135"; // 牛首山总功率
+	public static final String NSSFS = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0134"; // 牛首山风速
+	public static final String NSSQFDL = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0110"; // 牛首山日欠发损失电量
+	//public static final String NSSWD = "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_FGLTEM"; // 牛首山测风塔温度
+	public static final String NSSWD = "NSSFJ.NX_GD_NSSF_FJ_P1_L2_013_AI0056"; // 牛首山测风塔温度
+	
+	public static final String NSSFGL_AI000306 = "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_FGLHUM"; // 牛首山测风塔湿度
+	public static final String NSSFGL_AI000307 = "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_FGLPRE"; // 牛首山测风塔压强
+	public static final String NSSPJFS = "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0134"; // 牛首山平均风速
+
+	public static final String NSSZ111 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0003"; // 首风II甲线111开关位置
+	public static final String NSSZ101 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0019"; // 101开关位置
+	public static final String NSSZ102 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0034"; // 102开关位置
+	public static final String NSSZ301 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0025"; // 301开关位置
+	public static final String NSSZ302 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0040"; // 302开关位置
+	public static final String NSSZ312 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0070"; // 集电线路一312开关位置
+	public static final String NSSZ313 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0076"; // 集电线路二313开关位置
+	public static final String NSSZ314 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0082"; // 集电线路三314开关位置
+	public static final String NSSZ321 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0098"; // 集电线路四321开关位置
+	public static final String NSSZ322 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0104"; // 集电线路五322开关位置
+	public static final String NSSZ323 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0110"; // 集电线路六323开关位置
+	public static final String NSSZ121 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0011"; // 首风II乙线121开关位置
+	public static final String NSSZ103 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0049"; // 103开关位置
+	public static final String NSSZ303 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0055"; // 303开关位置
+	public static final String NSSZ351 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0126"; // 集电线路七351开关位置
+	public static final String NSSZ353 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0132"; // 集电线路八353开关位置
+	public static final String NSSZ354 = "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_DI0138"; // 集电线路九354开关位置
+
+	public static final String NSSDQ_AI000703 = "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_FGLS70";// 牛首山70m风速
+	public static final String NSSDQ_AI000704 = "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_FGLD70";// 牛首山70m风向
+	/******************************************** 牛首山风电场 *****************************************/
+
+	/******************************************** 大武口风电场 *****************************************/
+	public static final String DWKRFDL = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0088"; // 大武口日发电量
+	public static final String DWKYFDL = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0146"; // 大武口月发电量
+	public static final String DWKNFDL = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0037"; // 大武口年发电量
+	public static final String DWKSWDL = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0136"; // 大武口上网电量
+	public static final String DWKZGL = "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0002"; // 大武口总功率
+	public static final String DWKFS = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0134";// 大武口日照强度;
+	// public static final String DWKFS =
+	// "DWKGF.NX_GD_DWKG_GF_P1_L2_010_AI0672";// "JSFW_DWSSFS";
+	// //
+	// 大武口日照强度
+	//public static final String DWKWD = "DWKGGL.NX_GD_DWKG_YC_P1_L1_001_QXZ004"; // 大武口测风塔温度
+	public static final String DWKWD = "DWKGF.NX_GD_DWKG_GF_P1_L2_010_AI0663"; // 大武口测风塔温度
+	
+	public static final String DWKPJFS = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0134"; // 大武口平均风速
+
+	public static final String DWKZ310 = "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_DI0024"; // 35kV出线柜310开关位置
+	public static final String DWKZ314 = "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_DI0027"; // 35kV#1光伏进线柜314开关位置
+	public static final String DWKZ315 = "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_DI0028"; // 35kV#2光伏进线柜315开关位置
+	/******************************************** 大武口风电场 *****************************************/
+
+	/******************************************** 平罗电场 *****************************************/
+	public static final String PLRFDL = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0088"; // 平罗日发电量
+	public static final String PLYFDL = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0146"; // 平罗月发电量
+	public static final String PLNFDL = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0037"; // 平罗年发电量
+	public static final String PLSWDL = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0136"; // 平罗上网电量
+	public static final String PLZGL = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0135"; // 平罗总功率
+	public static final String PLFS = "PLGGL.NX_GD_PLG_YC_P1_L1_001_QXZ0001"; // 平罗日照强度
+	public static final String PLWD = "PLGGL.NX_GD_PLG_YC_P1_L1_001_QXZ004"; // 平罗测风塔温度
+	public static final String PLPJFS = "PLGGL.NX_GD_PLG_YC_P1_L1_001_QXZ0001"; // 平罗平均风速
+
+	// 平罗1
+	public static final String PLZ1310 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0001"; // 35kV出线柜310开关位置
+	public static final String PLZ1313 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0005"; // I期313开关断路器合位
+	public static final String PLZ1314 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0007"; // I期314开关断路器合位
+	public static final String PLZ1315 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0009"; // I期315开关断路器合位
+	public static final String PLZ1316 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0011"; // I期316开关断路器合位
+	public static final String PLZ1317 = "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_DI0013"; // I期317开关断路器合位
+	// 平罗2
+	public static final String PLZ2310 = "PLSJ2.NX_GD_PLG_DD_P1_L1_001_DI0001"; // 20#逆变器电网交流过压
+	public static final String PLZ2322 = "PLSJ2.NX_GD_PLG_DD_P1_L1_001_DI0017"; // 20#逆变器防雷器故障
+	public static final String PLZ2323 = "PLSJ2.NX_GD_PLG_DD_P1_L1_001_DI0019"; // 20#逆变器防反放电保护
+	/******************************************** 平罗电场 *****************************************/
+
+	/******************************************** 马场湖风电场 *****************************************/
+
+	public static final String MCHRFDL = "JSFW_MCRFDLB"; // 马场湖日发电量
+	public static final String MCHYFDL = "JSFW_MCYFDLB"; // 马场湖月发电量
+	public static final String MCHNFDL = "JSFW_MCNFDLB"; // 马场湖年发电量
+	public static final String MCHSWDL = "JSFW_MCSWDLB"; // 马场湖上网电量
+	public static final String MCHZGL = "JSFW_MCSSZGL"; // 马场湖总功率
+	public static final String MCHFS = "JSFW_MCSSFSX"; // 马场湖日照强度
+	public static final String MCHWD = "MCHGGL_AI000308"; // 马场湖测风塔温度
+	public static final String MCHPJFS = "JSFW_MCSSFS"; // 马场湖平均风速
+
+	public static final String MCHZ511 = "MCHDQ_DI110749"; // 马场湖光伏开关站xj-断路器位置
+	public static final String MCHZ510 = "MCHDQ_DI110027"; // 马场湖光伏开关站10ah-3
+	// 1#进线柜-断路器位置
+	public static final String MCHZ512 = "MCHDQ_DI110317"; // 马场湖光伏开关站10ah-4
+	// 2#进线-断路器位置
+	public static final String MCHZ513 = "MCHDQ_DI110197"; // 马场湖光伏开关站10ah-5
+	// 3#进线-断路器位置
+	public static final String MCHZ514 = "MCHDQ_DI110080"; // 马场湖光伏开关站10ah-14
+	// 电容器-断路器位置
+	public static final String MCHZ515 = "MCHDQ_DI110137"; // 马场湖光伏开关站10ah-7
+	// 5#进线-断路器位置
+	public static final String MCHZ516 = "MCHDQ_DI110377"; // 马场湖光伏开关站10ah-8
+	// 6#进线-断路器位置
+	public static final String MCHZ517 = "MCHDQ_DI110437"; // 马场湖光伏开关站10ah-9
+	// 7#进线-断路器位置
+	public static final String MCHZ518 = "MCHDQ_DI110497"; // 马场湖光伏开关站10ah-10
+	// 8#进线-断路器位置
+	public static final String MCHZ519 = "MCHDQ_DI110557"; // 马场湖光伏开关站10ah-11
+	// 9#进线-断路器位置
+	public static final String MCHZ520 = "MCHDQ_DI110617"; // 马场湖光伏开关站10ah-12
+	// 10#进线-断路器位置
+	/******************************************** 马场湖风电场 *****************************************/
+
+	/******************************************** 宣和风电场 *****************************************/
+	public static final String XHRFDL = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0088"; // 宣和日发电量
+	public static final String XHYFDL = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0146"; // 宣和月发电量
+	public static final String XHNFDL = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0037"; // 宣和年发电量
+	public static final String XHSWDL = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0136"; // 宣和上网电量
+	public static final String XHZGL = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0002"; // 宣和总功率
+	public static final String XHFS = "XHGGL.NX_GD_XHG_YC_P1_L1_001_QXZ001"; // 宣和日照强度
+																				// XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0192
+	// public static final String XHFS =
+	// "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0134"; // 宣和日照强度
+	public static final String XHWD = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0134"; // 宣和测风塔温度
+	public static final String XHPJFS = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0134"; // 宣和平均风速
+
+	public static final String XHZ311 = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0001"; // 35kV草光I线开关位置
+	public static final String XHZ313 = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0025"; // 35kV1#进线313开关位置
+	public static final String XHZ314 = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0027"; // 35kV2#进线314开关位置
+	public static final String XHZ316 = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0031"; // 35kV4#进线316开关位置
+	public static final String XHZ315 = "XHDQ.NX_GD_XHG_DQ_P1_L1_001_DI0029"; // 35kV3#进线315开关位置
+	/******************************************** 宣和风电场 *****************************************/
+
+	/******************************************** 海子井风电场 *****************************************/
+	public static final String HZJWD = "HZJGDCJSFW.NX_GD_HZJG_XX_XX_XXX_XXX_CI0134"; // 宣和测风塔温度
+	public static final String HZJPJFS = "HZJGDCJSFW.NX_GD_HZJG_XX_XX_XXX_XXX_CI0134"; // 宣和平均风速
+	/******************************************** 海子井风电场 *****************************************/
+
+	/******************************************** 香山风电场 *****************************************/
+	public static final String XSRFDL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0088"; // 香山日发电量
+	public static final String XSYFDL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0146"; // 香山月发电量
+	public static final String XSNFDL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0037"; // 香山年发电量
+	public static final String XSSWDL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0136"; // 香山上网电量
+	public static final String XSZGL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0135"; // 香山总功率
+	public static final String XSFS = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0134"; // 香山风速
+	public static final String XSQFDL = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0110"; // 香山日欠发损失电量
+
+	public static final String XSWD = "XSFGL.NX_GD_XSF_YC_P1_L1_001_FGLTEM"; // 香山测风塔温度
+	public static final String XSFGL_AI000007 = "XSFGL.NX_GD_XSF_YC_P1_L1_001_FGLHUM"; // 香山测风塔湿度
+	public static final String XSFGL_AI000008 = "XSFGL.NX_GD_XSF_YC_P1_L1_001_FGLPRE"; // 香山测风塔压强
+	public static final String XSPJFS = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0134"; // 香山平均风速
+
+	public static final String XSDQ_DI000034 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI0034"; // #111断路器
+	public static final String XSDQ_DI000169 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI0169"; // 101断路器
+	public static final String XSDQ_DI000308 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI0308"; // 102断路器
+	public static final String XSDQ_DI000192 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI0192"; // 301断路器
+	public static final String XSDQ_DI000331 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI0331"; // 302断路器
+	// 香山电气点没有,采用类似点,目前不一定准确
+	public static final String XSDQ_DI000850 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1368"; // 311断路器
+	public static final String XSDQ_DI000915 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1629"; // 312断路器
+	public static final String XSDQ_DI001210 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1501"; // 323断路器
+	public static final String XSDQ_DI001145 = "XSDQ.NX_GD_XSF_DQ_P1_L1_001_DI1501"; // 322断路器
+
+	public static final String XSFGL_AI000003 = "XSFGL.NX_GD_XSF_YC_P1_L1_001_FGLS70";// 香山70m风速
+	public static final String XSFGL_AI000005 = "XSFGL.NX_GD_XSF_YC_P1_L1_001_FGLD70";// 香山70m风向
+	/******************************************** 香山风电场 *****************************************/
+
+	public static final String DWKGDCJSFW_CI0195 = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0195"; // 风机设备在线状态
+	public static final String DWKGDCJSFW_CI0196 = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0196"; // 升压站在线状态
+	public static final String DWKGDCJSFW_CI0197 = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0197"; // 电计量在线状态
+	public static final String DWKGDCJSFW_CI0198 = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0198"; // 测风塔在线状态
+	public static final String DWKGDCJSFW_CI0199 = "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0199"; // agc在线状态
+
+	public static final String MHSFCJSFW_CI0215 = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0215"; // 风机设备在线状态
+	public static final String MHSFCJSFW_CI0216 = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0216"; // 升压站在线状态
+	public static final String MHSFCJSFW_CI0217 = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0217"; // 电计量在线状态
+	public static final String MHSFCJSFW_CI0218 = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0218"; // 测风塔在线状态
+	public static final String MHSFCJSFW_CI0219 = "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0219"; // agc在线状态
+
+	public static final String NSSFCJSFW_CI0215 = "NSSFCJSFW_NX_GD_NSSF_XX_XX_XXX_XXX_CI0215"; // 风机设备在线状态
+	public static final String NSSFCJSFW_CI0216 = "NSSFCJSFW_NX_GD_NSSF_XX_XX_XXX_XXX_CI0216"; // 升压站在线状态
+	public static final String NSSFCJSFW_CI0217 = "NSSFCJSFW_NX_GD_NSSF_XX_XX_XXX_XXX_CI0217"; // 电计量在线状态
+	public static final String NSSFCJSFW_CI0218 = "NSSFCJSFW_NX_GD_NSSF_XX_XX_XXX_XXX_CI0218"; // 测风塔在线状态
+	public static final String NSSFCJSFW_CI0219 = "NSSFCJSFW_NX_GD_NSSF_XX_XX_XXX_XXX_CI0219"; // agc在线状态
+
+	public static final String PLGDCJSFW_CI0195 = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0195"; // 风机设备在线状态
+	public static final String PLGDCJSFW_CI0196 = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0196"; // 升压站在线状态
+	public static final String PLGDCJSFW_CI0197 = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0197"; // 电计量在线状态
+	public static final String PLGDCJSFW_CI0198 = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0198"; // 测风塔在线状态
+	public static final String PLGDCJSFW_CI0199 = "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0199"; // agc在线状态
+
+	public static final String QSFCJSFW_CI0215 = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0215"; // 风机设备在线状态
+	public static final String QSFCJSFW_CI0216 = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0216"; // 升压站在线状态
+	public static final String QSFCJSFW_CI0217 = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0217"; // 电计量在线状态
+	public static final String QSFCJSFW_CI0218 = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0218"; // 测风塔在线状态
+	public static final String QSFCJSFW_CI0219 = "QSFCJSFW.NX_GD_QSF_XX_XX_XXX_XXX_CI0219"; // agc在线状态
+
+	public static final String SBQFCJSFW_CI0215 = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0215"; // 风机设备在线状态
+	public static final String SBQFCJSFW_CI0216 = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0216"; // 升压站在线状态
+	public static final String SBQFCJSFW_CI0217 = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0217"; // 电计量在线状态
+	public static final String SBQFCJSFW_CI0218 = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0218"; // 测风塔在线状态
+	public static final String SBQFCJSFW_CI0219 = "SBQFCJSFW.NX_GD_SBQF_XX_XX_XXX_XXX_CI0219"; // agc在线状态
+
+	public static final String XHGDCJSFW_CI0195 = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0195"; // 风机设备在线状态
+	public static final String XHGDCJSFW_CI0196 = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0196"; // 升压站在线状态
+	public static final String XHGDCJSFW_CI0197 = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0197"; // 电计量在线状态
+	public static final String XHGDCJSFW_CI0198 = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0198"; // 测风塔在线状态
+	public static final String XHGDCJSFW_CI0199 = "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0199"; // agc在线状态
+
+	public static final String XSFCJSFW_CI0215 = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0215"; // 风机设备在线状态
+	public static final String XSFCJSFW_CI0216 = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0216"; // 升压站在线状态
+	public static final String XSFCJSFW_CI0217 = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0217"; // 电计量在线状态
+	public static final String XSFCJSFW_CI0218 = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0218"; // 测风塔在线状态
+	public static final String XSFCJSFW_CI0219 = "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0219"; // agc在线状态
+
+}

+ 377 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/InitialRedis.java

@@ -0,0 +1,377 @@
+package com.gyee.frame.common.spring;
+
+import com.alibaba.fastjson.JSON;
+import com.gyee.frame.common.cache.IGlobalCache;
+import com.gyee.frame.model.auto.*;
+import com.gyee.frame.model.custom.PointData;
+import com.gyee.frame.service.WindPowerstationTestingPoint2Service;
+import com.gyee.frame.service.WindTurbineTestingPointAiService;
+import com.gyee.frame.service.WindturbinepowercurvefittingService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.IRealTimeDataBaseUtil;
+import com.gyee.frame.util.RealTimeDataBaseFactory;
+
+import java.text.DecimalFormat;
+import java.util.*;
+
+
+public  class InitialRedis {
+
+    public static Map<String, Map<Double, Windturbinepowercurvefitting>> wpcmap = new HashMap<String, Map<Double, Windturbinepowercurvefitting>>();
+
+
+    IRealTimeDataBaseUtil realApiUtil = RealTimeDataBaseFactory.createRealTimeDataBase();
+
+    public  void intialWindturbinepowercurvefitting() throws Exception {
+
+
+        WindturbinepowercurvefittingService windturbinepowercurvefittingService= SpringUtils.getBean("windturbinepowercurvefittingService");
+        IGlobalCache globalCache= SpringUtils.getBean("globalCache");
+
+        WindturbinepowercurvefittingExample windturbinepowercurvefittingExample = new WindturbinepowercurvefittingExample();
+        windturbinepowercurvefittingExample.setOrderByClause("WINDTURBINEID ASC,speed ASC");
+        List<Windturbinepowercurvefitting> wpclist = windturbinepowercurvefittingService.selectByExample(windturbinepowercurvefittingExample);
+
+        if (!wpclist.isEmpty()) {
+            for (Windturbinepowercurvefitting wc : wpclist) {
+                if (wpcmap.containsKey(wc.getWindturbineid())) {
+                    Map<Double, Windturbinepowercurvefitting> map = wpcmap.get(wc.getWindturbineid());
+                    map.put(wc.getSpeed(), wc);
+                } else {
+                    Map<Double, Windturbinepowercurvefitting> map = new HashMap<Double, Windturbinepowercurvefitting>();
+                    map.put(wc.getSpeed(), wc);
+                    wpcmap.put(wc.getWindturbineid(), map);
+                }
+            }
+        }
+
+        globalCache.set("wpcmap", JSON.toJSONString(wpcmap));
+    }
+
+
+    public  void intialWpScatter() throws Exception {
+
+
+
+        WindPowerstationTestingPoint2Service windPowerstationTestingPoint2Service= SpringUtils.getBean("windPowerstationTestingPoint2Service");
+        WindTurbineTestingPointAiService windTurbineTestingPointAiService= SpringUtils.getBean("windTurbineTestingPointAiService");
+        IGlobalCache globalCache= SpringUtils.getBean("globalCache");
+
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+
+        int month=cal.get(Calendar.MONTH)+1;
+
+
+        cal.set(Calendar.MONTH, 0);
+
+        for(int j=0;j<month;j++)
+        {
+            List<List<Double>> vos = new ArrayList<List<Double>>();
+            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+            Date beginDate = cal.getTime();
+            Date endDate =null;
+            if(month-1==cal.get(Calendar.MONTH))
+            {
+                cal = Calendar.getInstance();
+               //cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+                endDate = cal.getTime();
+            }else
+            {
+                cal.add(Calendar.MONTH,1);;
+                endDate = cal.getTime();
+            }
+
+
+            for(Windpowerstation wp:InitialRunner.wpls)
+            {
+                String wpId=wp.getId();
+                WindPowerStationTestingPoint gl = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SJGL);
+                WindPowerStationTestingPoint fs = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SSFS);
+
+                int daynum = DateUtils.daysDiff(beginDate, endDate);
+                long pried = 600 ;
+                long count = 6 * 24 * daynum;
+
+                DecimalFormat dcmFmt = new DecimalFormat("0.00");
+                List<PointData> gls = realApiUtil.getHistoryDatasSnap(gl, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+                List<PointData> fss = realApiUtil.getHistoryDatasSnap(fs, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+
+                if (!gls.isEmpty() && !fss.isEmpty()) {
+                    for (int i = 0; i < fss.size(); i++) {
+
+                        List<Double> ds = new ArrayList<Double>();
+
+                        double f = fss.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        f = gls.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        vos.add(ds);
+                    }
+                }
+
+               // cal.add(Calendar.MONTH,1);
+                StringBuilder sb=new StringBuilder();
+                sb.append("scatter_").append(wpId).append("_").append(j+1);
+                globalCache.set(String.valueOf(sb), JSON.toJSONString(vos));
+                System.out.println(String.valueOf(sb.append("完成")));
+            }
+        }
+
+
+
+    }
+
+
+
+    public  void intialPjScatter() throws Exception {
+
+
+
+        WindPowerstationTestingPoint2Service windPowerstationTestingPoint2Service= SpringUtils.getBean("windPowerstationTestingPoint2Service");
+        WindTurbineTestingPointAiService windTurbineTestingPointAiService= SpringUtils.getBean("windTurbineTestingPointAiService");
+        IGlobalCache globalCache= SpringUtils.getBean("globalCache");
+
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+
+        int month=cal.get(Calendar.MONTH)+1;
+
+
+        cal.set(Calendar.MONTH, 0);
+
+        for(int j=0;j<month;j++)
+        {
+            List<List<Double>> vos = new ArrayList<List<Double>>();
+            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+            Date beginDate = cal.getTime();
+            Date endDate =null;
+            if(month-1==cal.get(Calendar.MONTH))
+            {
+                cal = Calendar.getInstance();
+                //cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+                endDate = cal.getTime();
+            }else
+            {
+                cal.add(Calendar.MONTH,1);;
+                endDate = cal.getTime();
+            }
+
+
+            for(Project pj:InitialRunner.pjls)
+            {
+                String wpId=pj.getId();
+                WindPowerStationTestingPoint gl = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SJGL);
+                WindPowerStationTestingPoint fs = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SSFS);
+
+                int daynum = DateUtils.daysDiff(beginDate, endDate);
+                long pried = 600 ;
+                long count = 6 * 24 * daynum;
+
+                DecimalFormat dcmFmt = new DecimalFormat("0.00");
+                List<PointData> gls = realApiUtil.getHistoryDatasSnap(gl, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+                List<PointData> fss = realApiUtil.getHistoryDatasSnap(fs, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+
+                if (!gls.isEmpty() && !fss.isEmpty()) {
+                    for (int i = 0; i < fss.size(); i++) {
+
+                        List<Double> ds = new ArrayList<Double>();
+
+                        double f = fss.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        f = gls.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        vos.add(ds);
+                    }
+                }
+
+                // cal.add(Calendar.MONTH,1);
+                StringBuilder sb=new StringBuilder();
+                sb.append("scatter_").append(wpId).append("_").append(j+1);
+                globalCache.set(String.valueOf(sb), JSON.toJSONString(vos));
+                System.out.println(String.valueOf(sb.append("完成")));
+            }
+        }
+
+
+
+    }
+
+
+
+    public  void intialLnScatter() throws Exception {
+
+
+
+        WindPowerstationTestingPoint2Service windPowerstationTestingPoint2Service= SpringUtils.getBean("windPowerstationTestingPoint2Service");
+        WindTurbineTestingPointAiService windTurbineTestingPointAiService= SpringUtils.getBean("windTurbineTestingPointAiService");
+        IGlobalCache globalCache= SpringUtils.getBean("globalCache");
+
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+
+        int month=cal.get(Calendar.MONTH)+1;
+
+
+        cal.set(Calendar.MONTH, 0);
+
+        for(int j=0;j<month;j++)
+        {
+            List<List<Double>> vos = new ArrayList<List<Double>>();
+            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+            Date beginDate = cal.getTime();
+            Date endDate =null;
+            if(month-1==cal.get(Calendar.MONTH))
+            {
+                cal = Calendar.getInstance();
+                //cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+                endDate = cal.getTime();
+            }else
+            {
+                cal.add(Calendar.MONTH,1);;
+                endDate = cal.getTime();
+            }
+
+
+            for(Line wp:InitialRunner.linels)
+            {
+                String wpId=wp.getId();
+                WindPowerStationTestingPoint gl = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SJGL);
+                WindPowerStationTestingPoint fs = windPowerstationTestingPoint2Service.getWindPowerStationTestingPoint2(wpId, Constant.TPOINT_WP_SSFS);
+
+                int daynum = DateUtils.daysDiff(beginDate, endDate);
+                long pried = 600 ;
+                long count = 6 * 24 * daynum;
+
+                DecimalFormat dcmFmt = new DecimalFormat("0.00");
+                List<PointData> gls = realApiUtil.getHistoryDatasSnap(gl, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+                List<PointData> fss = realApiUtil.getHistoryDatasSnap(fs, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+
+                if (!gls.isEmpty() && !fss.isEmpty()) {
+                    for (int i = 0; i < fss.size(); i++) {
+
+                        List<Double> ds = new ArrayList<Double>();
+
+                        double f = fss.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        f = gls.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        vos.add(ds);
+                    }
+                }
+
+                // cal.add(Calendar.MONTH,1);
+                StringBuilder sb=new StringBuilder();
+                sb.append("scatter_").append(wpId).append("_").append(j+1);
+                globalCache.set(String.valueOf(sb), JSON.toJSONString(vos));
+                System.out.println(String.valueOf(sb.append("完成")));
+            }
+        }
+
+
+
+    }
+
+
+    public  void intialWtScatter() throws Exception {
+
+
+        WindTurbineTestingPointAiService windTurbineTestingPointAiService= SpringUtils.getBean("windTurbineTestingPointAiService");
+        IGlobalCache globalCache= SpringUtils.getBean("globalCache");
+
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+
+        int month=cal.get(Calendar.MONTH)+1;
+
+
+        cal.set(Calendar.MONTH, 0);
+
+
+            List<List<Double>> vos = new ArrayList<List<Double>>();
+            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+            Date beginDate = cal.getTime();
+            Date endDate =null;
+            if(month-1==cal.get(Calendar.MONTH))
+            {
+                cal = Calendar.getInstance();
+                //cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+                endDate = cal.getTime();
+            }else
+            {
+                cal.add(Calendar.MONTH,1);;
+                endDate = cal.getTime();
+            }
+
+
+            for(Windturbine wt:InitialRunner.wtls)
+            {
+                String wpId=wt.getId();
+                WindTurbineTestingPointAi gl = windTurbineTestingPointAiService.getWindTurbineTestingPointAi2(wpId, Constant.TPOINT_WT_FJGL);
+                WindTurbineTestingPointAi fs = windTurbineTestingPointAiService.getWindTurbineTestingPointAi2(wpId, Constant.TPOINT_WT_FJSSFS);
+
+                int daynum = DateUtils.daysDiff(beginDate, endDate);
+                long pried = 600 ;
+                long count = 6 * 24 * daynum;
+
+                DecimalFormat dcmFmt = new DecimalFormat("0.00");
+                List<PointData> gls = realApiUtil.getHistoryDatasSnap(gl, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+                List<PointData> fss = realApiUtil.getHistoryDatasSnap(fs, beginDate.getTime() / 1000, endDate.getTime() / 1000, count, pried);
+
+
+                if (!gls.isEmpty() && !fss.isEmpty()) {
+                    for (int i = 0; i < fss.size(); i++) {
+
+                        List<Double> ds = new ArrayList<Double>();
+
+                        double f = fss.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        f = gls.get(i).getPointValueInDouble();
+                        ds.add(Double.valueOf(dcmFmt.format(f)));
+                        vos.add(ds);
+                    }
+                }
+
+                // cal.add(Calendar.MONTH,1);
+                StringBuilder sb=new StringBuilder();
+                sb.append("scatter_").append(wpId).append("_").append(month);
+                globalCache.set(String.valueOf(sb), JSON.toJSONString(vos));
+                System.out.println(String.valueOf(sb.append("完成")));
+            }
+
+
+
+
+    }
+
+    public static void main(String[]args) throws Exception {
+
+//        SpringApplication.run(SpringbootStart.class, args);
+//
+//        InitialRedis initialRedis=new InitialRedis();
+//        //初始化风机拟合功率
+//      // initialRedis.intialWindturbinepowercurvefitting();
+//
+//        //初始化场站没有散点图
+//        initialRedis.intialWpScatter();
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/InitialRunner.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/SpringUtils.java


+ 20 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/spring/WpEnum.java

@@ -0,0 +1,20 @@
+package com.gyee.frame.common.spring;
+
+public  enum  WpEnum {
+
+    MHS_FDC("MHS_FDC"),
+    NSS_FDC("NSS_FDC"),
+    QS_FDC("QS_FDC"),
+    SBQ_FDC("SBQ_FDC"),
+    XS_FDC("XS_FDC"),
+    DWK_GDC("DWK_GDC"),
+    PL_GDC("PL_GDC"),
+    XH_GDC("XH_GDC"),
+    MCH_GDC("MCH_GDC"),
+    HZJ_GDC("HZJ_GDC");
+
+    public String id;
+    WpEnum(final  String c) {
+        id = c;
+    }
+}

+ 89 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/CharsetKit.java

@@ -0,0 +1,89 @@
+package com.gyee.frame.common.support;
+
+import com.gyee.frame.util.StringUtils;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 字符集工具类
+ * 
+ * @author fc
+ *
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 转换为Charset对象
+     * 
+     * @param charset 字符集,为空则返回默认字符集
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            srcCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 系统字符集编码
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/Convert.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/ConvertUtil.java


+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/support/KaptchaTextCreator.java


+ 148 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/ClientInboundChannelInterceptor.java

@@ -0,0 +1,148 @@
+package com.gyee.frame.common.websocket;
+
+import com.gyee.frame.common.quartz.QuartzSchedulerUtil;
+import com.gyee.frame.util.StringUtils;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
+import org.springframework.messaging.simp.stomp.StompCommand;
+import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
+import org.springframework.messaging.support.ChannelInterceptor;
+import org.springframework.messaging.support.MessageHeaderAccessor;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * websocket建立链接的时候获取headeri里认证的参数拦截器。
+ */
+@Component
+public class ClientInboundChannelInterceptor extends QuartzSchedulerUtil.SocketTaskUtil implements ChannelInterceptor {
+
+
+    private String AUTHTOKEN="authToken";
+    @Override
+    public Message<?> preSend(Message<?> message, MessageChannel channel) {
+        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
+        if (StompCommand.CONNECT.equals(accessor.getCommand())) {
+            Object raw = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS);
+
+            String topic=null;
+            String authToken=null;
+            if (raw instanceof Map) {
+                Object name = ((Map) raw).get("topic");
+                LinkedList<String> temp=(LinkedList<String>) name;
+                topic=temp.get(0);
+                Object authTokenobj = ((Map) raw).get("authToken");
+                 temp=(LinkedList<String>) authTokenobj;
+                authToken=temp.get(0);
+            }
+            //String authToken =String.valueOf(message.getHeaders().get(SimpMessageHeaderAccessor.SESSION_ID_HEADER));
+
+           // String authToken =String.valueOf(message.getHeaders().get(AUTHTOKEN));
+            if(StringUtils.notEmp(topic) && !topic.equals("undefined") && StringUtils.notEmp(authToken) && !authToken.equals("undefined")) {
+
+
+                //判断是否为带参操作
+                if(topic.indexOf(WebSocketConfig.PARAM)!=-1)
+                {
+                    if (StringUtils.notEmp(authToken)) {
+                        //判断带参sessionMAP中是否包含authToken
+                        if (WebSocketConfig.sessionparamcacheMap.containsKey(authToken)) {
+                            //通过sessionId获得topicSET集合
+                            CopyOnWriteArraySet<String> set = WebSocketConfig.sessionparamcacheMap.get(authToken);
+                            //截取topic/****/中的功能描述
+                            String temptoptic=topic.substring(topic.indexOf("/")+1);
+                            temptoptic=temptoptic.substring(0,temptoptic.indexOf("/"));
+                            //遍历SET中的主体
+                            for(String str:set)
+                            {
+                                //截取str/****/中的功能描述
+                                String tempstr=str.substring(str.indexOf("/")+1);
+                                tempstr=tempstr.substring(0,tempstr.indexOf("/"));
+                                //判断str的功能描述和topic的功能描述是否一致
+                                if(temptoptic.equals(tempstr))
+                                {
+                                    //功能描述一致,移除相同功能的主题,保证每个sessionid相同功能只能通过传参订阅一个主题
+                                    set.remove(str);
+                                    //提供过str主题获得sessionidSET集合
+                                    CopyOnWriteArraySet<String> sessionIdset = WebSocketConfig.websocketparamcacheMap.get(str);
+                                    //移除主题中的sessionId
+                                    sessionIdset.remove(authToken);
+                                    //如果sessionIdset记录为空,移除websocketparamcacheMap的主题
+                                    if(sessionIdset.size()==0)
+                                    {
+                                        WebSocketConfig.websocketparamcacheMap.remove(str);
+                                    }
+
+                                }
+                            }
+                            //添加新的主题
+                            set.add(topic);
+                            WebSocketConfig.sessionparamcacheMap.put(authToken, set);
+                        } else {
+                            CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>();
+                            set.add(topic);
+                            WebSocketConfig.sessionparamcacheMap.put(authToken, set);
+                        }
+
+
+                    }
+
+                    if (WebSocketConfig.websocketparamcacheMap.containsKey(topic)) {
+                        CopyOnWriteArraySet<String> set = WebSocketConfig.websocketparamcacheMap.get(topic);
+                        set.add(authToken);
+                        WebSocketConfig.websocketparamcacheMap.put(topic, set);
+                    } else {
+                        CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>();
+                        set.add(authToken);
+                        WebSocketConfig.websocketparamcacheMap.put(topic, set);
+                    }
+                }else
+                {
+                    if (WebSocketConfig.websocketcacheMap.containsKey(topic)) {
+                        CopyOnWriteArraySet<String> set = WebSocketConfig.websocketcacheMap.get(topic);
+                        set.add(authToken);
+                        WebSocketConfig.websocketcacheMap.put(topic, set);
+                    } else {
+                        CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>();
+                        set.add(authToken);
+                        WebSocketConfig.websocketcacheMap.put(topic, set);
+                    }
+
+
+                    if (StringUtils.notEmp(authToken)) {
+                        if (WebSocketConfig.sessioncacheMap.containsKey(authToken)) {
+                            CopyOnWriteArraySet<String> set = WebSocketConfig.sessioncacheMap.get(authToken);
+                            set.add(topic);
+                            WebSocketConfig.sessioncacheMap.put(authToken, set);
+                        } else {
+                            CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>();
+                            set.add(topic);
+                            WebSocketConfig.sessioncacheMap.put(authToken, set);
+                        }
+
+
+                    }
+                }
+
+
+                if(topic.indexOf(WebSocketConfig.PARAM)!=-1)
+                {
+
+//                    String wtid=topic.substring(topic.indexOf(PARAM)+6);
+                    topic=topic.substring(0,topic.indexOf("_"));
+                    this.restartJob(topic);
+                }else
+                {
+                    this.restartJob(topic);
+                }
+
+            }
+
+        }
+        return message;
+    }
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketCache.java


+ 241 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketConfig.java

@@ -0,0 +1,241 @@
+package com.gyee.frame.common.websocket;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.messaging.converter.MessageConverter;
+import org.springframework.messaging.simp.config.ChannelRegistration;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * @descrition: 前台测试代码在 test/resources/websockettest.html
+ */
+
+@Configuration
+@EnableWebSocketMessageBroker
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
+
+    public static final String PARAM="param_";
+    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> websocketcacheMap = new ConcurrentHashMap();
+    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> sessioncacheMap = new ConcurrentHashMap();
+
+    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> websocketparamcacheMap = new ConcurrentHashMap();
+    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> sessionparamcacheMap = new ConcurrentHashMap();
+    //
+    @Resource
+    private ClientInboundChannelInterceptor clientInboundChannelInterceptor;
+
+    /**
+     * 注册stomp端点,主要是起到连接作用
+     *
+     * @param stompEndpointRegistry
+     */
+    @Override
+    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
+        stompEndpointRegistry
+                .addEndpoint("/gyee-websocket")  //端点名称
+                //.setHandshakeHandler() 握手处理,主要是连接的时候认证获取其他数据验证等
+                //.addInterceptors() 拦截处理,和http拦截类似
+                .setAllowedOrigins("*");//跨域
+     //  .withSockJS(); //使用sockJS1启用该行代码,使用VUE注释该行代码
+
+    }
+//    /**
+//     * 采用自定义拦截器,获取connect时候传递的参数
+//     *
+//     * @param registration
+//     */
+//    @Override
+//    public void configureClientInboundChannel(ChannelRegistration registration) {
+//        registration.interceptors(clientInboundChannelInterceptor);
+//    }
+
+
+//    /**
+//     * 注册相关服务
+//     *
+//     * @param registry
+//     */
+//    @Override
+//    public void configureMessageBroker(MessageBrokerRegistry registry) {
+//
+//        registry.enableSimpleBroker("/topic", "/queue");
+//        //客户端名称前缀
+//        registry.setApplicationDestinationPrefixes("/app");
+//        //用户名称前
+//        registry.setUserDestinationPrefix("/userDataSet");
+//    }
+
+    /**
+     * 配置消息代理
+     * @param registry
+     */
+    @Override
+    public void configureMessageBroker(MessageBrokerRegistry registry)
+    {
+        /*
+         *  enableStompBrokerRelay 配置外部的STOMP服务,需要安装额外的支持 比如rabbitmq或activemq
+         * 1. 配置代理域,可以配置多个,此段代码配置代理目的地的前缀为 /topicTest 或者 /userTest
+         *    我们就可以在配置的域上向客户端推送消息
+         * 3. 可以通过 setRelayHost 配置代理监听的host,默认为localhost
+         * 4. 可以通过 setRelayPort 配置代理监听的端口,默认为61613
+         * 5. 可以通过 setClientLogin 和 setClientPasscode 配置账号和密码
+         * 6. setxxx这种设置方法是可选的,根据业务需要自行配置,也可以使用默认配置
+         */
+        //registry.enableStompBrokerRelay("/topicTest","/userTest")
+        //.setRelayHost("rabbit.someotherserver")
+        //.setRelayPort(62623);
+        //.setClientLogin("userName")
+        //.setClientPasscode("password")
+        //;
+
+        // 自定义调度器,用于控制心跳线程
+        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+        // 线程池线程数,心跳连接开线程
+        taskScheduler.setPoolSize(1);
+        // 线程名前缀
+        taskScheduler.setThreadNamePrefix("websocket-heartbeat-thread-");
+        // 初始化
+        taskScheduler.initialize();
+
+        /*
+         * spring 内置broker对象
+         * 1. 配置代理域,可以配置多个,此段代码配置代理目的地的前缀为 /topicTest 或者 /userTest
+         *    我们就可以在配置的域上向客户端推送消息
+         * 2,进行心跳设置,第一值表示server最小能保证发的心跳间隔毫秒数, 第二个值代码server希望client发的心跳间隔毫秒数
+         * 3. 可以配置心跳线程调度器 setHeartbeatValue这个不能单独设置,不然不起作用,要配合setTaskScheduler才可以生效
+         *    调度器我们可以自己写一个,也可以自己使用默认的调度器 new DefaultManagedTaskScheduler()
+         */
+        registry.enableSimpleBroker("/topic","/queue")
+                .setHeartbeatValue(new long[]{10000,10000})
+                .setTaskScheduler(taskScheduler);
+        /*
+         *  "/app" 为配置应用服务器的地址前缀,表示所有以/app 开头的客户端消息或请求
+         *  都会路由到带有@MessageMapping 注解的方法中
+         */
+        registry.setApplicationDestinationPrefixes("/app");
+
+        /*
+         *  1. 配置一对一消息前缀, 客户端接收一对一消息需要配置的前缀 如“'/user/'+userid + '/message'”,
+         *     是客户端订阅一对一消息的地址 stompClient.subscribe js方法调用的地址
+         *  2. 使用@SendToUser发送私信的规则不是这个参数设定,在框架内部是用UserDestinationMessageHandler处理,
+         *     而不是而不是 AnnotationMethodMessageHandler 或  SimpleBrokerMessageHandler
+         *     or StompBrokerRelayMessageHandler,是在@SendToUser的URL前加“user+sessionId"组成
+         */
+        registry.setUserDestinationPrefix("/user");
+
+        /*
+         * 自定义路径分割符
+         * 注释掉的这段代码添加的分割符为. 分割是类级别的@messageMapping和方法级别的@messageMapping的路径
+         * 例如类注解路径为 “topic”,方法注解路径为“hello”,那么客户端JS stompClient.send 方法调用的路径为“/app/topic.hello”
+         * 注释掉此段代码后,类注解路径“/topic”,方法注解路径“/hello”,JS调用的路径为“/app/topic/hello”
+         */
+        //registry.setPathMatcher(new AntPathMatcher("."));
+
+    }
+
+
+    /**
+     * 配置发送与接收的消息参数,可以指定消息字节大小,缓存大小,发送超时时间
+     * @param registration
+     */
+    @Override
+    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
+        /*
+         * 1. setMessageSizeLimit 设置消息缓存的字节数大小 字节
+         * 2. setSendBufferSizeLimit 设置websocket会话时,缓存的大小 字节
+         * 3. setSendTimeLimit 设置消息发送会话超时时间,毫秒
+         */
+        registration.setMessageSizeLimit(1024*10)
+                .setSendBufferSizeLimit(1024*10)
+                .setSendTimeLimit(10000);
+    }
+
+    /**
+     * 设置输入消息通道的线程数,默认线程为1,可以自己自定义线程数,最大线程数,线程存活时间
+     * @param registration
+     */
+    @Override
+    public void configureClientInboundChannel(ChannelRegistration registration) {
+
+        /*
+         * 配置消息线程池
+         * 1. corePoolSize 配置核心线程池,当线程数小于此配置时,不管线程中有无空闲的线程,都会产生新线程处理任务
+         * 2. maxPoolSize 配置线程池最大数,当线程池数等于此配置时,不会产生新线程
+         * 3. keepAliveSeconds 线程池维护线程所允许的空闲时间,单位秒
+         */
+        registration.taskExecutor().corePoolSize(10)
+                .maxPoolSize(20)
+                .keepAliveSeconds(60);
+        /*
+         * 添加stomp自定义拦截器,可以根据业务做一些处理
+         * springframework 4.3.12 之后版本此方法废弃,代替方法 interceptors(ChannelInterceptor... interceptors)
+         * 消息拦截器,实现ChannelInterceptor接口
+         */
+        registration.interceptors(clientInboundChannelInterceptor);
+    }
+
+    /**
+     *设置输出消息通道的线程数,默认线程为1,可以自己自定义线程数,最大线程数,线程存活时间
+     * @param registration
+     */
+    @Override
+    public void configureClientOutboundChannel(ChannelRegistration registration) {
+        registration.taskExecutor().corePoolSize(100)
+                .maxPoolSize(1000)
+                .keepAliveSeconds(60);
+        //registration.setInterceptors(new WebSocketChannelInterceptor());
+    }
+
+    /**
+     * 添加自定义的消息转换器,spring 提供多种默认的消息转换器,
+     * 返回false,不会添加消息转换器,返回true,会添加默认的消息转换器,当然也可以把自己写的消息转换器添加到转换链中
+     * @param list
+     * @return
+     */
+    @Override
+    public boolean configureMessageConverters(List<MessageConverter> list) {
+        return true;
+    }
+
+//    /**
+//     * 自定义控制器方法的参数类型,有兴趣可以百度google HandlerMethodArgumentResolver这个的用法
+//     * @param list
+//     */
+//    @Override
+//    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
+//
+//    }
+//
+//    /**
+//     * 自定义控制器方法返回值类型,有兴趣可以百度google HandlerMethodReturnValueHandler这个的用法
+//     * @param list
+//     */
+//    @Override
+//    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {
+//
+//    }
+//
+//    /**
+//     * 拦截器加入 spring ioc容器
+//     * @return
+//     */
+//    @Bean
+//    public WebSocketChannelInterceptor webSocketChannelInterceptor()
+//    {
+//        return new WebSocketChannelInterceptor();
+//    }
+
+
+
+}
+
+

+ 68 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebSocketLoginOutEvent.java

@@ -0,0 +1,68 @@
+package com.gyee.frame.common.websocket;
+
+import com.gyee.frame.common.quartz.QuartzSchedulerUtil;
+import com.gyee.frame.util.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+public class WebSocketLoginOutEvent extends QuartzSchedulerUtil.SocketTaskUtil {
+
+    public void loginOut(String authToken) {
+
+        if(StringUtils.notEmp(authToken) && !authToken.equals("null"))
+        {
+            if(WebSocketConfig.sessioncacheMap.containsKey(authToken))
+            {
+                CopyOnWriteArraySet<String> sessionIdset=WebSocketConfig.sessioncacheMap.get(authToken);
+
+                for(String topic:sessionIdset)
+                {
+                    if(WebSocketConfig.websocketcacheMap.containsKey(topic))
+                    {
+                        CopyOnWriteArraySet<String> set=WebSocketConfig.websocketcacheMap.get(topic);
+                        set.remove(authToken);
+                        WebSocketConfig.websocketcacheMap.put(topic,set);
+
+                        if(set.size()==0)
+                        {
+                            WebSocketConfig.websocketcacheMap.remove(topic);
+                            this.deleteJob(topic);
+                        }
+                    }
+
+                    sessionIdset.remove(topic);
+                }
+                WebSocketConfig.sessioncacheMap.remove(authToken);
+            }
+
+
+            if(WebSocketConfig.sessionparamcacheMap.containsKey(authToken))
+            {
+                CopyOnWriteArraySet<String> sessionIdset=WebSocketConfig.sessionparamcacheMap.get(authToken);
+
+                for(String topic:sessionIdset)
+                {
+                    if(WebSocketConfig.websocketparamcacheMap.containsKey(topic))
+                    {
+                        CopyOnWriteArraySet<String> set=WebSocketConfig.websocketparamcacheMap.get(topic);
+                        set.remove(authToken);
+                        WebSocketConfig.websocketparamcacheMap.put(topic,set);
+
+                        if(set.size()==0)
+                        {
+                            WebSocketConfig.websocketparamcacheMap.remove(topic);
+                            this.deleteJob(topic);
+                        }
+                    }
+
+                    sessionIdset.remove(topic);
+                }
+                WebSocketConfig.sessionparamcacheMap.remove(authToken);
+            }
+        }
+
+    }
+
+}

+ 30 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/common/websocket/WebsocketMessageService.java

@@ -0,0 +1,30 @@
+package com.gyee.frame.common.websocket;
+
+import com.alibaba.fastjson.JSON;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.util.StringUtils;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+@Component
+public class WebsocketMessageService
+{
+
+    @Resource
+    private SimpMessagingTemplate simpMessagingTemplate;
+
+
+    public void SendAlertToAll(String destination, Object sendData)
+    {
+        if (StringUtils.notEmp(sendData)) {
+            simpMessagingTemplate.convertAndSend(destination, AjaxResult.successData(AjaxStatus.success.code, JSON.toJSONString(sendData)));
+        } else {
+            simpMessagingTemplate.convertAndSend(destination, AjaxResult.successData(AjaxStatus.error.code, "数据传输错误"));
+        }
+
+    }
+}

+ 501 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/AdminController.java

@@ -0,0 +1,501 @@
+package com.gyee.frame.controller;
+
+import com.google.code.kaptcha.Constants;
+import com.gyee.frame.common.base.BaseController;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.conf.V2Config;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.common.websocket.WebSocketLoginOutEvent;
+import com.gyee.frame.model.auto.SysNotice;
+import com.gyee.frame.model.auto.TsysUser;
+import com.gyee.frame.model.custom.BootstrapTree;
+import com.gyee.frame.model.custom.ElementNode;
+import com.gyee.frame.model.custom.TitleVo;
+import com.gyee.frame.model.custom.TokenUser;
+import com.gyee.frame.shiro.config.ShiroService;
+import com.gyee.frame.shiro.util.ShiroUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 后台方法
+ * 
+ * @ClassName: HomeController
+ * @author gyee
+ * @date 2019-10-21 00:10
+ *
+ */
+@Controller
+@RequestMapping("/admin")
+@CrossOrigin
+@Api(value = "后台管理接口" ,tags="后台管理接口")
+public class AdminController extends BaseController {
+	private static Logger logger = LoggerFactory.getLogger(AdminController.class);
+
+	private String prefix = "admin";
+	private String AUTHTOKEN="authToken";
+	@Resource
+	private ShiroService shiroService;
+	@Resource
+	private WebSocketLoginOutEvent webSocketLoginOutEvent;
+
+	@ApiOperation(value = "首页", notes = "首页")
+	@GetMapping("/index")
+	public String index(HttpServletRequest request) {
+		// 获取菜单栏
+		BootstrapTree bootstrapTree = sysPermissionService.getbooBootstrapTreePerm(ShiroUtils.getUserId());
+		request.getSession().setAttribute("bootstrapTree", bootstrapTree);
+		request.getSession().setAttribute("sessionUserName", ShiroUtils.getUser().getNickname());
+		// 获取公告信息
+		List<SysNotice> notices = sysNoticeService.getuserNoticeNotRead(ShiroUtils.getUser(), 0);
+		request.getSession().setAttribute("notices", notices);
+		return prefix + "/index";
+	}
+
+	@ApiOperation(value = "局部刷新区域", notes = "局部刷新区域")
+	@GetMapping("/main")
+	public String main(ModelMap map) {
+		setTitle(map, new TitleVo("首页", "首页", true, "欢迎进入", true, false));
+		return prefix + "/main";
+	}
+
+	/**
+	 * 请求到登陆界面
+	 * 
+	 * @return
+	 */
+	@ApiOperation(value = "请求到登陆界面", notes = "请求到登陆界面")
+	@GetMapping("/login")
+	public String login(ModelMap modelMap) {
+		try {
+			if ((null != SecurityUtils.getSubject() && SecurityUtils.getSubject().isAuthenticated())
+					|| SecurityUtils.getSubject().isRemembered()) {
+				return "redirect:/" + prefix + "/index";
+			} else {
+				System.out.println("--进行登录验证..验证开始");
+
+				modelMap.put("RollVerification", V2Config.getRollVerification());
+				System.out.println("V2Config.getRollVerification()>>>" + V2Config.getRollVerification());
+				return "login";
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return "login";
+	}
+
+	/**
+	 * 用户登陆验证
+	 * 
+	 * @param user
+	 * @param redirectAttributes
+	 * @param rememberMe
+	 * @param request
+	 * @return
+	 */
+//	@ApiOperation(value = "用户登陆验证", notes = "用户登陆验证")
+	@PostMapping("/login")
+	@ResponseBody
+	public AjaxResult login(TsysUser user, String code, RedirectAttributes redirectAttributes, boolean rememberMe,
+			HttpServletRequest request) {
+		// ModelAndView view =new ModelAndView();
+		Boolean yz = false;
+		if (V2Config.getRollVerification()) {// 滚动验证
+			yz = true;
+		} else {// 图片验证
+			String scode = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+			yz = StringUtils.isNotEmpty(scode) && StringUtils.isNotEmpty(code) && scode.equals(code);
+		}
+		// 判断验证码
+		if (yz) {
+			String userName = user.getUsername();
+			Subject currentUser = SecurityUtils.getSubject();
+
+			// 是否验证通过
+			if (!currentUser.isAuthenticated()) {
+				UsernamePasswordToken token = new UsernamePasswordToken(userName, user.getPassword());
+				try {
+//					if (rememberMe) {
+					if (true) {
+						token.setRememberMe(true);
+					}
+					// 存入用户
+					currentUser.login(token);
+					if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+						// 若为前后端分离版本,则可把sessionId返回,作为分离版本的请求头authToken
+						// String authToken = ShiroUtils.getSessionId();
+						// return AjaxResult.successData(200, authToken);
+						return AjaxResult.success();
+					} else {
+						return AjaxResult.error(500, "未知账户");
+					}
+				} catch (UnknownAccountException uae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,未知账户");
+					return AjaxResult.error(500, "未知账户");
+				} catch (IncorrectCredentialsException ice) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误的凭证");
+					return AjaxResult.error(500, "用户名或密码不正确");
+				} catch (LockedAccountException lae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,账户已锁定");
+					return AjaxResult.error(500, "账户已锁定");
+				} catch (ExcessiveAttemptsException eae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误次数过多");
+					return AjaxResult.error(500, "用户名或密码错误次数过多");
+				} catch (AuthenticationException ae) {
+					// 通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,堆栈轨迹如下");
+					ae.printStackTrace();
+					return AjaxResult.error(500, "用户名或密码不正确");
+				}
+			} else {
+				if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+					// 跳转到 get请求的登陆方法
+					// view.setViewName("redirect:/"+prefix+"/index");
+					return AjaxResult.success();
+				} else {
+					return AjaxResult.error(500, "未知账户");
+				}
+			}
+		} else {
+			return AjaxResult.error(500, "验证码不正确!");
+		}
+
+	}
+
+
+	/**
+	 * 用户登陆验证
+	 *
+	 * @param user
+	 * @param request
+	 * @return
+	 */
+	@ApiOperation(value = "用户登陆验证", notes = "用户登陆验证")
+	@PostMapping("/loginvue")
+	@ResponseBody
+	public AjaxResult loginvue(TsysUser user,
+							HttpServletRequest request) {
+		// ModelAndView view =new ModelAndView();
+
+			String userName = user.getUsername();
+			Subject currentUser = SecurityUtils.getSubject();
+			String customtoken = request.getHeader(AUTHTOKEN);
+
+				if(StringUtils.notEmp(customtoken))
+				{
+					TokenUser customuser = shiroService.findToken(customtoken);
+					/**
+					 * user == null 表示第一次登录
+					 */
+					if (customuser == null)
+					{
+						return initialLogin(user, userName, currentUser);
+					}else
+					{
+						long expireTime = customuser.getExpireTime();
+						long nowTime = new Date().getTime();
+						/**
+						 * 判断登录是否过期
+						 */
+						if (nowTime - expireTime > shiroService.EXPIRE)
+						{
+							return AjaxResult.error(AjaxStatus.loginexpire.code, "账号已过期请重新登录");
+						}else
+						{
+							Map<String, Object> result = new HashMap<>();
+							result.put(AUTHTOKEN, customtoken);
+							result.put("user", customuser);
+							return AjaxResult.successData(AjaxStatus.success.code, result);
+						}
+
+					}
+				}else
+				{
+					return initialLogin(user, userName, currentUser);
+				}
+
+
+	}
+
+	private AjaxResult initialLogin(TsysUser user, String userName, Subject currentUser) {
+		// 是否验证通过
+		if (!currentUser.isAuthenticated()) {
+			UsernamePasswordToken token = new UsernamePasswordToken(userName, user.getPassword());
+			try {
+				token.setRememberMe(true);
+				// 存入用户
+				currentUser.login(token);
+
+				Map<String, Object> authToken = shiroService.createToken(ShiroUtils.getUser());
+
+				if(authToken.containsKey(AUTHTOKEN))
+				{
+					return AjaxResult.successData(AjaxStatus.success.code, authToken);
+				}else
+				{
+					return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+				}
+
+//							if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+//
+//								// 若为前后端分离版本,则可把sessionId返回,作为分离版本的请求头authToken
+//								String sessionId = ShiroUtils.getSessionId();
+//								return AjaxResult.successData(AjaxStatus.success.code, sessionId);
+////
+//							} else {
+//								return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+//							}
+			} catch (UnknownAccountException uae) {
+				logger.info("对用户[" + userName + "]进行登录验证..验证未通过,未知账户");
+				return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+			} catch (IncorrectCredentialsException ice) {
+				logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误的凭证");
+				return AjaxResult.error(AjaxStatus.logineroor.code, "用户名或密码不正确");
+			} catch (LockedAccountException lae) {
+				logger.info("对用户[" + userName + "]进行登录验证..验证未通过,账户已锁定");
+				return AjaxResult.error(AjaxStatus.logineroor.code, "账户已锁定");
+			} catch (ExcessiveAttemptsException eae) {
+				logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误次数过多");
+				return AjaxResult.error(AjaxStatus.logineroor.code, "用户名或密码错误次数过多");
+			} catch (AuthenticationException ae) {
+				// 通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
+				logger.info("对用户[" + userName + "]进行登录验证..验证未通过,堆栈轨迹如下");
+				ae.printStackTrace();
+				return AjaxResult.error(AjaxStatus.logineroor.code, "用户名或密码不正确");
+			}
+		} else {
+			if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+				// 跳转到 get请求的登陆方法
+				// view.setViewName("redirect:/"+prefix+"/index");
+				Map<String, Object> authToken = shiroService.createToken(ShiroUtils.getUser());
+
+				if(authToken.containsKey(AUTHTOKEN))
+				{
+					return AjaxResult.successData(AjaxStatus.success.code, authToken);
+				}else
+				{
+					return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+				}
+			} else {
+				return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+			}
+		}
+	}
+
+
+	@ApiOperation(value = "获取用户菜单", notes = "获取用户菜单")
+	@PostMapping("/usermenu")
+	@ResponseBody
+	public AjaxResult usermenu(HttpServletRequest request) {
+
+		//String authToken=request.getParameter(AUTHTOKEN);
+		String customtoken = request.getHeader(AUTHTOKEN);
+
+		if(StringUtils.notEmp(customtoken))
+		{
+			TokenUser customuser = shiroService.findToken(customtoken);
+
+			if(customuser ==null)
+			{
+				return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+			}else
+			{
+				// 获取菜单栏
+				List<ElementNode> menuTree = sysPermissionService.getTreePerm(customuser.getLaborNum());
+
+				return AjaxResult.successData(200, menuTree);
+			}
+
+		}else {
+			return AjaxResult.error(AjaxStatus.logineroor.code, "未知账户");
+		}
+
+	}
+	/**
+	 * 手机登录
+	 * @param user
+	 * @param rememberMe
+	 * @param request
+	 * @return
+	 * @author gyee
+	 * @Date 2020年12月7日 上午12:54:28
+	 */
+	@ApiOperation(value = "手机登录", notes = "手机登录")
+	@PostMapping("/API/login")
+	@ResponseBody
+	public AjaxResult APIlogin(TsysUser user,boolean rememberMe,HttpServletRequest request) {
+		// ModelAndView view =new ModelAndView();
+		Boolean yz = true;
+//		if (V2Config.getRollVerification()) {// 滚动验证
+//			yz = true;
+//		} else {// 图片验证
+//			String scode = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+//			yz = StringUtils.isNotEmpty(scode) && StringUtils.isNotEmpty(code) && scode.equals(code);
+//		}
+		System.out.println("/API/login手机请求");
+		// 判断验证码
+		if (yz) {
+			String userName = user.getUsername();
+			Subject currentUser = SecurityUtils.getSubject();
+			// 是否验证通过
+			if (!currentUser.isAuthenticated()) {
+				UsernamePasswordToken token = new UsernamePasswordToken(userName, user.getPassword());
+				try {
+					if (rememberMe) {
+						token.setRememberMe(true);
+					}
+					// 存入用户
+					currentUser.login(token);
+					if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+						// 若为前后端分离版本,则可把sessionId返回,作为分离版本的请求头authToken
+						 String authToken = ShiroUtils.getSessionId();
+						 return AjaxResult.successData(200, authToken);
+						//return AjaxResult.success();
+					} else {
+						return AjaxResult.error(500, "未知账户");
+					}
+				} catch (UnknownAccountException uae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,未知账户");
+					return AjaxResult.error(500, "未知账户");
+				} catch (IncorrectCredentialsException ice) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误的凭证");
+					return AjaxResult.error(500, "用户名或密码不正确");
+				} catch (LockedAccountException lae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,账户已锁定");
+					return AjaxResult.error(500, "账户已锁定");
+				} catch (ExcessiveAttemptsException eae) {
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,错误次数过多");
+					return AjaxResult.error(500, "用户名或密码错误次数过多");
+				} catch (AuthenticationException ae) {
+					// 通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景
+					logger.info("对用户[" + userName + "]进行登录验证..验证未通过,堆栈轨迹如下");
+					ae.printStackTrace();
+					return AjaxResult.error(500, "用户名或密码不正确");
+				}
+			} else {
+				if (StringUtils.isNotNull(ShiroUtils.getUser())) {
+					// 跳转到 get请求的登陆方法
+					// view.setViewName("redirect:/"+prefix+"/index");
+					 String authToken = ShiroUtils.getSessionId();
+					 return AjaxResult.successData(200, authToken);
+				} else {
+					return AjaxResult.error(500, "未知账户");
+				}
+			}
+		} else {
+			return AjaxResult.error(500, "验证码不正确!");
+		}
+
+	}
+
+	/**
+	 * 退出登陆
+	 * 
+	 * @return
+	 */
+//	@ApiOperation(value = "退出登陆", notes = "退出登陆")
+	@GetMapping("/Loginout")
+
+	public String LoginOut(HttpServletRequest request, HttpServletResponse response) {
+		// 在这里执行退出系统前需要清空的数据
+		Subject subject = SecurityUtils.getSubject();
+		// 注销
+		subject.logout();
+		return "redirect:/" + prefix + "/login";
+	}
+
+	@ApiOperation(value = "退出登陆", notes = "退出登陆")
+	@PostMapping("/Loginoutvue")
+	@ResponseBody
+	public AjaxResult Loginoutvue(HttpServletRequest request, HttpServletResponse response) {
+		// 在这里执行退出系统前需要清空的数据
+		Subject subject = SecurityUtils.getSubject();
+		// shiro注销
+		subject.logout();
+
+		String authToken = request.getHeader(AUTHTOKEN);
+		if(StringUtils.notEmp(authToken))
+		{
+			//websocekt退出
+			webSocketLoginOutEvent.loginOut(authToken);
+			//令牌退出
+			shiroService.logout(authToken);
+		}
+
+		return AjaxResult.success();
+	}
+
+
+	@ApiOperation(value = "WEBSOCKET缓存", notes = "WEBSOCKET缓存")
+	@PostMapping("/websocketdisconnect")
+	@ResponseBody
+	public AjaxResult websocketdisconnect(HttpServletRequest request, HttpServletResponse response) {
+
+
+		String authToken = request.getHeader(AUTHTOKEN);
+		if(StringUtils.notEmp(authToken))
+		{
+			//websocekt退出
+			webSocketLoginOutEvent.loginOut(authToken);
+		}
+
+		return AjaxResult.success();
+	}
+
+	/**** 页面测试 ****/
+	@ApiOperation(value = "404页面", notes = "404页面")
+	@GetMapping("Out404")
+	public String Out404(HttpServletRequest request, HttpServletResponse response) {
+
+		return "redirect:/error/404";
+	}
+
+	@GetMapping("Out403")
+	@ApiOperation(value = "403页面", notes = "403页面")
+	public String Out403(HttpServletRequest request, HttpServletResponse response) {
+
+		return "redirect:/error/403";
+	}
+
+	@ApiOperation(value = "500页面", notes = "500页面")
+	@GetMapping("Out500")
+	public String Out500(HttpServletRequest request, HttpServletResponse response) {
+
+		return "redirect:/error/500";
+	}
+
+	/**
+	 * 权限测试跳转页面
+	 * 
+	 * @param request
+	 * @param response
+	 * @return
+	 */
+	@ApiOperation(value = "权限测试跳转页面", notes = "权限测试跳转页面")
+	@GetMapping("Outqx")
+	@RequiresPermissions("system:user:asd")
+	public String Outqx(HttpServletRequest request, HttpServletResponse response) {
+
+		return "redirect:/error/500";
+	}
+	/**** 页面测试EDN ****/
+}

+ 43 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/FanStatusQueryExportController/FanStatusQueryExportController.java

@@ -0,0 +1,43 @@
+package com.gyee.frame.controller.FanStatusQueryExportController;
+
+import com.gyee.frame.service.FanStatusQueryExportService.FanStatusQueryExportService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/FanStatusQueryExport")
+public class FanStatusQueryExportController {
+
+    @Resource
+    FanStatusQueryExportService fanStatusQueryExportService;
+
+    //获取所有风机
+    @CrossOrigin(origins  = "*",maxAge = 3600)
+    @GetMapping("/FanName")
+    @ResponseBody
+    public List<Map<String, Object>> getFanName(@RequestBody  String windpowerstationid){
+
+        return fanStatusQueryExportService.getFanName(windpowerstationid.substring(0,windpowerstationid.length()-1));
+    }
+
+
+    //根据风机id和风机状态
+    @CrossOrigin(origins  = "*",maxAge = 3600)
+    @GetMapping("/FjStatus")
+
+    @ResponseBody
+    public List<Map<String, Object>> getFjStatus( @RequestBody Map<String, Object> map){
+
+        String name = (String) map.get("name");
+        String satuscode = (String) map.get("satuscode");
+        String starttime = (String) map.get("starttime");
+        String stoptime = (String) map.get("stoptime");
+
+        return fanStatusQueryExportService.getFjStatus(name,satuscode,starttime,stoptime);
+    }
+
+
+}

+ 67 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/IndexController.java

@@ -0,0 +1,67 @@
+package com.gyee.frame.controller;
+
+import com.gyee.frame.common.base.BaseController;
+import com.gyee.frame.common.conf.V2Config;
+import com.gyee.frame.model.custom.TitleVo;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * 如果有前台这儿写前台访问方法
+ * @ClassName: IndexController
+ * @author gyee
+ * @date 2019-10-21 00:15
+ */
+@Controller
+public class IndexController extends BaseController{
+	
+	/**
+	 * 前台访问 域名:端口 例如:localhost:80的get请求
+	 * @param map
+	 * @return
+	 * @author gyee
+	 * @Date 2019年11月20日 下午10:55:13
+	 */
+	@ApiOperation(value="前台",notes="前台")
+	@GetMapping("/")
+	public String index(ModelMap modelMap) {
+		String str="前台";
+		setTitle(modelMap, new TitleVo("列表", str+"管理", true,"欢迎进入"+str+"页面", true, false));
+		Subject currentUser = SecurityUtils.getSubject();
+
+
+		try {
+			if ((null != SecurityUtils.getSubject() && SecurityUtils.getSubject().isAuthenticated())
+					|| SecurityUtils.getSubject().isRemembered()) {
+				return "redirect:/admin/index";
+			} else {
+				System.out.println("--进行登录验证..验证开始");
+
+				modelMap.put("RollVerification", V2Config.getRollVerification());
+				System.out.println("V2Config.getRollVerification()>>>" + V2Config.getRollVerification());
+				return "login";
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return "login";
+	}
+	/**
+	 * 前台访问/index的get请求
+	 * @param map
+	 * @return
+	 * @author gyee
+	 * @Date 2019年11月20日 下午10:54:56
+	 */
+	@ApiOperation(value="前台",notes="前台")
+	@GetMapping("/index")
+	public String index2(ModelMap map) {
+		String str="前台";
+		setTitle(map, new TitleVo("列表", str+"管理", true,"欢迎进入"+str+"页面", true, false));
+		return "index";
+	}
+}

+ 92 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/StandardPointTable/StandardPointTableController.java

@@ -0,0 +1,92 @@
+package com.gyee.frame.controller.StandardPointTable;
+
+
+import com.gyee.frame.service.StandardPointTable.StandardPointTableService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 标准点表
+ * @author 马晓霞
+ * @email maxiaoxia@gyee-china.com
+ * @date 2021-1-9 17:00:04
+ */
+
+@RestController
+@RequestMapping("/UnionTable")
+public class StandardPointTableController {
+
+    List<Map<String,Object>> unionData= new ArrayList<>();
+
+    @Resource
+    private StandardPointTableService standardPointTableService;
+
+    /**
+     * 数据库表名
+     *
+     * @param
+     * @return 返回数据库表名
+     */
+    @GetMapping("/tableNames")
+    public List<String> getTableName() {
+        return standardPointTableService.getTableName();
+    }
+
+    /**
+     * 查询列名
+     * @param tableName 表名
+     * @return
+     */
+    @CrossOrigin(origins  = "*",maxAge = 3600)
+    @GetMapping("/columns")
+    @ResponseBody
+    public  List<String> getAllColumns(@RequestBody String tableName){
+
+        return standardPointTableService.getAllColumns(tableName.substring(0,tableName.length()-1 ));
+    }
+
+    /**
+     * 联合表
+     * @param map 表名,列名,excel数据
+     * @return 联合表
+     */
+    @CrossOrigin(origins  = "*",maxAge = 3600)
+    @ResponseBody
+    @GetMapping("/tableData")
+    public List<Map<String, Object>> getDataByColumns(  @RequestBody Map<String, Object> map) {
+
+        String tableName = (String) map.get("tableName");
+        List columnsName  = (List)map.get("columnsName");
+        List<Map<String, Object>> excelData  = (List) map.get("excelData");
+
+        String stringColumnsName="";
+        for (int i=0; i<columnsName.size();i++) {
+            stringColumnsName +=columnsName.get(i)+(i==columnsName.size()-1 ? "":",");
+        }
+        unionData = standardPointTableService.getDataByColumns(tableName,stringColumnsName,excelData);
+        return unionData;
+    }
+
+    /**
+     * 将上面展示出来的数据保存到数据库
+     *
+     * @param tableName 数据库表名
+     */
+    @GetMapping("/saveData")
+    @ResponseBody
+    @CrossOrigin(origins  = "*",maxAge = 3600)
+    public String saveTableData(@RequestBody String tableName) {
+
+        standardPointTableService.saveData(unionData,tableName.substring(0,tableName.length()-1 ));
+
+        return "保存成功";
+    }
+
+}
+
+

+ 227 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/benchmarking/BenchmarkingController.java

@@ -0,0 +1,227 @@
+package com.gyee.frame.controller.benchmarking;
+
+import com.github.pagehelper.PageInfo;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.Windturbineinfodaytop;
+import com.gyee.frame.model.auto.Windturbineinfodaytop2;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.model.custom.ValueVo;
+import com.gyee.frame.service.Windturbineinfodaytop2Service;
+import com.gyee.frame.service.WindturbineinfodaytopService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/benchmarking")
+@Api(value = "等级评估功能",tags =  "等级评估功能")
+public class BenchmarkingController {
+//    @Resource
+//    private Windturbineinfodaytop3Service windturbineinfodaytop2Service;
+    @Resource
+    private Windturbineinfodaytop2Service windturbineinfodaytop2Service;
+    @Resource
+    private WindturbineinfodaytopService windturbineinfodaytopService;
+
+    /**查询等级评估日所有信息**/
+
+    @GetMapping("/gadaylist")
+    @ResponseBody
+    @ApiOperation(value = "查询等级评估日所有信息", notes = "查询等级评估日所有信息")
+    @ApiImplicitParams({
+
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult gadaylist(String wpId, String recorddate) {
+
+        Date tempDate=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            tempDate=DateUtils.parseDate(recorddate);
+        }
+        List<Windturbineinfodaytop2> ls=windturbineinfodaytop2Service.gadaylist(wpId,tempDate);
+
+        if(ls !=null && !ls.isEmpty())
+        {
+            return	AjaxResult.successData(AjaxStatus.success.code,ls);
+        }else
+        {
+            return	AjaxResult.successData(AjaxStatus.success.code,ls);
+        }
+
+    }
+    /**按页查询等级评估日所有信息**/
+    @GetMapping("/gadaylistByPage")
+    @ResponseBody
+    @ApiOperation(value = "按页查询等级评估日所有信息", notes = "按页查询等级评估日所有信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "Tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult gadaylistByPage(Tablepar tablepar,String wpId, String recorddate) {
+
+        Date tempDate=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            tempDate=DateUtils.parseDate(recorddate);
+        }
+        PageInfo<Windturbineinfodaytop2> ls=windturbineinfodaytop2Service.gadaylistByPage(tablepar,wpId,tempDate);
+
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+    /**按页查询等级评估月所有信息**/
+    @GetMapping("/gamonthlistByPage")
+    @ResponseBody
+    @ApiOperation(value = "按页查询等级评估月所有信息", notes = "按页查询等级评估月所有信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "Tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "year", value = "年", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "month", value = "月", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult gamonthlistByPage(Tablepar tablepar,String wpId, String year,String month) {
+
+
+        PageInfo<Windturbineinfodaytop2> ls=windturbineinfodaytop2Service.gamonthlistByPage(tablepar,wpId,year,month);
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+    /**按页查询等级评估年所有信息**/
+    @GetMapping("/gayearlistByPage")
+    @ResponseBody
+    @ApiOperation(value = "按页查询等级评估年所有信息", notes = "按页查询等级评估年所有信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "Tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "year", value = "年", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult gayearlistByPage(Tablepar tablepar,String wpId, String year) {
+
+
+        PageInfo<Windturbineinfodaytop2> ls=windturbineinfodaytop2Service.gayearlistByPage(tablepar,wpId,year);
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+    /**按等级评估ID查询相应信息返回玫瑰图**/
+    @GetMapping("/wtchart")
+    @ResponseBody
+    @ApiOperation(value = "按等级评估ID查询相应信息返回玫瑰图", notes = "按等级评估ID查询相应信息返回玫瑰图")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gaid1", value = "等级评估对象编号1", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "gaid2", value = "等级评估对象编号2", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult wtchart(String gaid1,String gaid2) {
+
+
+        if (StringUtils.isNotEmpty(gaid1) && StringUtils.isNotEmpty(gaid2))
+        {
+            List<ValueVo> ls1=windturbineinfodaytop2Service.wtchart(gaid1);
+            List<ValueVo> ls2=windturbineinfodaytop2Service.wtchart(gaid2);
+
+            Map<String,List<ValueVo>> map=new HashMap();
+
+            map.put("gaid1",ls1);
+            map.put("gaid2",ls2);
+
+            return	AjaxResult.successData(AjaxStatus.success.code,map);
+        }
+
+         return	AjaxResult.error(AjaxStatus.error.code,null);
+    }
+
+    /**按等级评估ID查询相应详细信息**/
+    @GetMapping("/wtinfo")
+    @ResponseBody
+    @ApiOperation(value = "按等级评估ID查询相应详细信息", notes = "按等级评估ID查询相应详细信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "gaid1", value = "等级评估对象编号1", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "gaid2", value = "等级评估对象编号2", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult wtinfo(String gaid1,String gaid2) {
+
+
+        if (StringUtils.isNotEmpty(gaid1) && StringUtils.isNotEmpty(gaid2))
+        {
+            Map<String,Windturbineinfodaytop2> map=new HashMap();
+
+            Windturbineinfodaytop2 wtd1=windturbineinfodaytop2Service.selectByPrimaryKey(gaid1);
+            Windturbineinfodaytop2 wtd2=windturbineinfodaytop2Service.selectByPrimaryKey(gaid2);
+
+            map.put("gaid1",wtd1);
+            map.put("gaid2",wtd2);
+
+            return	AjaxResult.successData(AjaxStatus.success.code,map);
+        }
+
+        return	AjaxResult.error(AjaxStatus.error.code,null);
+    }
+
+
+    @GetMapping("/gadayhistlist")
+    @ResponseBody
+    @ApiOperation(value = "查询日历史信息", notes = "查询日历史信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult gadayhistlist(Tablepar tablepar,String wtId, String recorddate) {
+
+        Date tempDate=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            tempDate=DateUtils.parseDate(recorddate);
+        }
+        List<Windturbineinfodaytop> ls=windturbineinfodaytopService.gadayhistlist(wtId,tempDate);
+
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+
+    @GetMapping("/gamonthhistlist")
+    @ResponseBody
+    @ApiOperation(value = "查询月历史信息", notes = "查询月历史信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "year", value = "年", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "month", value = "月", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult gamonthhistlist(String wtId, String year,String month) {
+
+
+        List<Windturbineinfodaytop> ls=windturbineinfodaytopService.gamonthhistlist(wtId,year,month);
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+    /**按页查询等级评估年所有信息**/
+    @GetMapping("/gayearhistlist")
+    @ResponseBody
+    @ApiOperation(value = "查询年历史信息", notes = "查询年历史信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "year", value = "年", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult gayearhistlist(Tablepar tablepar,String wtId, String year) {
+
+
+        List<Windturbineinfodaytop> ls=windturbineinfodaytopService.gayearhistlist(wtId,year);
+
+        return	AjaxResult.successData(AjaxStatus.success.code,ls);
+
+    }
+}

+ 200 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/compare/CompareController.java

@@ -0,0 +1,200 @@
+package com.gyee.frame.controller.compare;
+
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.service.compare.CompareService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Controller
+@RequestMapping("/compare")
+@Api(value = "单机横向对比功能",tags =  "单机横向对比功能")
+public class CompareController {
+    @Resource
+    private CompareService compareService;
+
+    /**查询日横向对比列表**/
+    @GetMapping("/compareDayList")
+    @ResponseBody
+    @ApiOperation(value = "查询日横向对比列表", notes = "查询日横向对比列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareDayList(String windturbineid,String recorddate) {
+
+
+        AjaxResult ajaxResult=compareService.compareDayList(windturbineid, DateUtils.parseStrtoDate(recorddate)) ;
+
+        return ajaxResult;
+
+    }
+    /**创建日风资源图表**/
+    @GetMapping("/fzyDay")
+    @ResponseBody
+    @ApiOperation(value = "创建日风资源图表", notes = "创建日风资源图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult fzyDay(String windturbineid,String recorddate) {
+
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+        AjaxResult ajaxResult=compareService.fzyDay(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /**查询日横向对比下方图表**/
+    @GetMapping("/compareDayChat")
+    @ResponseBody
+    @ApiOperation(value = "查询日横向对比下方图表", notes = "查询日横向对比下方图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareDayChat(String windturbineid,String recorddate) {
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+
+        AjaxResult ajaxResult=compareService.compareDayChat(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /***********************************************************************************************************************/
+
+    /**查询月横向对比列表**/
+    @GetMapping("/compareMonthList")
+    @ResponseBody
+    @ApiOperation(value = "查询月横向对比列表", notes = "查询月横向对比列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareMonthList(String windturbineid,String recorddate) {
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+
+        AjaxResult ajaxResult=compareService.compareMonthList(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /**创建月风资源图表**/
+    @GetMapping("/fzyMonth")
+    @ResponseBody
+    @ApiOperation(value = "创建月风资源图表", notes = "创建月风资源图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult fzyMonth(String windturbineid,String recorddate) {
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+
+        AjaxResult ajaxResult=compareService.fzyMonth(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /**查询月横向对比下方图表**/
+    @GetMapping("/compareMonthChat")
+    @ResponseBody
+    @ApiOperation(value = "查询月横向对比下方图表", notes = "查询月横向对比下方图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareMonthChat(String windturbineid,String recorddate) {
+
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+        AjaxResult ajaxResult=compareService.compareMonthChat(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+
+
+    /***********************************************************************************************************************/
+
+    /**查询年横向对比列表**/
+    @GetMapping("/compareYearList")
+    @ResponseBody
+    @ApiOperation(value = "查询年横向对比列表", notes = "查询年横向对比列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareYearList(String windturbineid,String recorddate) {
+
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+        AjaxResult ajaxResult=compareService.compareYearList(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /**创建年风资源图表**/
+    @GetMapping("/fzyYear")
+    @ResponseBody
+    @ApiOperation(value = "创建年风资源图表", notes = "创建年风资源图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult fzyYear(String windturbineid,String recorddate) {
+
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+        AjaxResult ajaxResult=compareService.fzyYear(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+    /**查询年横向对比下方图表**/
+    @GetMapping("/compareYearChat")
+    @ResponseBody
+    @ApiOperation(value = "查询年横向对比下方图表", notes = "查询年横向对比下方图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "windturbineid", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult compareYearChat(String windturbineid,String recorddate) {
+        Date beginDate_d=null;
+        if (StringUtils.isNotEmpty(recorddate))
+        {
+            beginDate_d= DateUtils.parseDate(recorddate);
+        }
+
+        AjaxResult ajaxResult=compareService.compareYearChat(windturbineid,beginDate_d) ;
+
+        return ajaxResult;
+
+    }
+
+}

+ 660 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/contrast/ContrastController.java

@@ -0,0 +1,660 @@
+package com.gyee.frame.controller.contrast;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.custom.BenchMarkVo;
+import com.gyee.frame.model.custom.ConditionVo;
+import com.gyee.frame.model.custom.DataVo;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.service.contrast.*;
+import com.gyee.frame.util.BenchmarkUtil;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+@Controller
+@RequestMapping("/contrast")
+@Api(value = "对标管理管理",tags =  "对标管理管理")
+public class ContrastController {
+
+    @Resource
+    private ContrastWpService contrastWpService;
+    @Resource
+    private ContrastPjService contrastPjService;
+    @Resource
+    private ContrastWtService contrastWtService;
+    @Resource
+    private ContrastZjService contrastZjService;
+    @Resource
+    private ContrastLnService contrastLnService;
+
+    /**
+     * 查询性能对标列表
+     **/
+    @GetMapping("/benchmarkLossList")
+    @ResponseBody
+    @ApiOperation(value = "查询性能对标列表", notes = "查询性能对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkLossList(Tablepar tablepar, String wpId, String beginDate, String endDate) {
+
+        List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastWpService.benchmarkLossList(wpId, beginDate,  endDate);
+
+
+            if (vos != null && !vos.isEmpty()) {
+                BenchmarkUtil bu = new BenchmarkUtil();
+                vos = bu.getBenchMarkOrder(vos);
+                //默认综合排序,不需要从新排序,除非指定字段排序
+                if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+                {
+                    vos = bu.getBenchMarkOrder(vos,tablepar);
+                }
+                return AjaxResult.successData(AjaxStatus.success.code, vos);
+            } else {
+                return AjaxResult.successData(AjaxStatus.success.code, vos);
+            }
+
+    }
+
+    /**
+     * 查询场内对标列表信息
+     **/
+    @GetMapping("/benchmarkWpList")
+    @ResponseBody
+    @ApiOperation(value = "查询场内对标列表", notes = "查询场内对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkWpList(Tablepar tablepar, String wpId, String beginDate, String endDate) {
+
+        List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastWpService.benchmarkWpList(wpId, beginDate,  endDate);
+
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+    /**
+     * 查询场内风机列表信息
+     **/
+    @GetMapping("/benchmarkWpInWtList")
+    @ResponseBody
+    @ApiOperation(value = "查询场内对标风机对标列表", notes = "查询场内对标风机对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkWpInWtList(Tablepar tablepar, String wpId,String wtId, String beginDate, String endDate) {
+
+        List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastWtService.benchmarkWpInWtList(wpId,wtId,beginDate, endDate);
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**
+     * 查询场际对标列表信息
+     **/
+    @GetMapping("/benchmarkWpOutList")
+    @ResponseBody
+    @ApiOperation(value = "查询场际对标列表", notes = "查询场际对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkWpOutList(Tablepar tablepar, String wpId, String beginDate, String endDate) {
+
+
+        List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastWpService.benchmarkWpOutList(wpId, beginDate,  endDate);
+
+
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**
+     * 查询场际对标图表
+     **/
+    @GetMapping("/findWpPowerOutChat")
+    @ResponseBody
+    @ApiOperation(value = "查询场际对标图表", notes = "查询场际对标图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult findWpPowerOutChat(String wpId, String beginDate, String endDate) throws Exception {
+        List<String> wpids = new ArrayList<String>();
+        if (StringUtils.notEmp(wpId)) {
+            if (wpId.indexOf(",") != -1) {
+                String[] strs = wpId.split(",");
+                if (strs.length > 0) {
+                    for (int i = 0; i < strs.length; i++) {
+                        wpids.add(strs[i]);
+                    }
+                }
+            } else {
+                wpids.add(wpId);
+            }
+
+        }
+
+        Date begin = DateUtils.parseDate(beginDate);
+        Date end = DateUtils.parseDate(endDate);
+
+        List<DataVo> vos =new ArrayList<>();
+
+            vos = contrastWpService.findWpPowerChat(wpids, begin, end);
+
+
+        if (vos != null && !vos.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+    }
+
+
+    /**
+     * 查询项目对标列表信息
+     **/
+    @GetMapping("/benchmarkPjList")
+    @ResponseBody
+    @ApiOperation(value = "查询项目对标列表", notes = "查询项目对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "pjId", value = "项目编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkPjList(Tablepar tablepar, String wpId,String pjId, String beginDate, String endDate) {
+
+          List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastPjService.benchmarkPjList(wpId,pjId, beginDate,  endDate);
+
+
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**
+     * 查询项目对标图表
+     **/
+    @GetMapping("/findPjPowerChat")
+    @ResponseBody
+    @ApiOperation(value = "查询项目对标图表", notes = "查询项目对标图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "pjId", value = "项目编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult findPjPowerChat(String wpId,String pjId, String beginDate, String endDate) throws Exception {
+
+        List<DataVo> vos =new ArrayList<>();
+
+            vos = contrastPjService.findPjPowerChat(wpId,pjId, beginDate, endDate);
+
+
+
+        if (vos != null && !vos.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+    }
+
+    /**
+     * 查询线路对标列表信息
+     **/
+    @GetMapping("/benchmarkLnList")
+    @ResponseBody
+    @ApiOperation(value = "查询线路对标列表", notes = "查询线路对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "lnId", value = "线路编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkLnList(Tablepar tablepar, String wpId,String lnId, String beginDate, String endDate) {
+
+
+        List<BenchMarkVo> vos =new ArrayList<>();
+
+
+            vos =contrastLnService.benchmarkLnList(wpId,lnId, beginDate,  endDate);
+
+
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**
+     * 查询线路对标图表
+     **/
+    @GetMapping("/findLnPowerChat")
+    @ResponseBody
+    @ApiOperation(value = "查询线路对标列表", notes = "查询线路对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "lnId", value = "线路编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult findLnPowerChat(String wpId,String lnId, String beginDate, String endDate) throws Exception {
+
+        List<DataVo> vos =new ArrayList<>();
+
+
+        vos = contrastLnService.findLnPowerChat(wpId,lnId, beginDate, endDate);
+
+        if (vos != null && !vos.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+    }
+    /**
+     * 查询风机列表信息
+     **/
+    @GetMapping("/benchmarkWtList")
+    @ResponseBody
+    @ApiOperation(value = "查询风机对标列表", notes = "查询风机对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkWtList(Tablepar tablepar, String wpId,String wtId, String beginDate, String endDate) {
+
+        List<BenchMarkVo> vos =contrastWtService.benchmarkWtList(wpId,wtId, beginDate,  endDate);
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+
+
+
+    /**
+     * 新增值际对标
+     **/
+    @GetMapping("/addBenchmarkZj")
+    @ResponseBody
+    @ApiOperation(value = "新增值际对标", notes = "新增值际对标")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "month", value = "月份", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "zjs", value = "值际类型 1:上旬,2:中旬,3:下旬", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult addBenchmarkZj(HttpServletRequest request,Tablepar tablepar, String wpId, String year, String month, String zjs) {
+
+        List<BenchMarkVo> vos=null;
+        // List<BenchMarkVo> vos =contrastWtService.benchmarkWtList(wpId,wtId,beginDate, endDate);
+
+        contrastZjService.addBenchmarkZj(request, wpId, year, month, zjs);
+
+
+        if (null != request.getSession().getAttribute("bmvos")) {
+            vos = (List<BenchMarkVo>) request.getSession().getAttribute("bmvos");
+        } else {
+            vos =new ArrayList<>();
+
+        }
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**
+     * 值际对标列表
+     **/
+    @GetMapping("/benchmarkZjList")
+    @ResponseBody
+    @ApiOperation(value = "查询值际对标列表", notes = "查询值际对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query")})
+
+    public AjaxResult benchmarkZjList(HttpServletRequest request,Tablepar tablepar) {
+
+        List<BenchMarkVo> vos=null;
+
+        if (null != request.getSession().getAttribute("bmvos")) {
+            vos = (List<BenchMarkVo>) request.getSession().getAttribute("bmvos");
+        } else {
+            vos =new ArrayList<>();
+
+        }
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+
+    /**
+     * 查询值际风机列表信息
+     **/
+    @GetMapping("/benchmarkZjWtList")
+    @ResponseBody
+    @ApiOperation(value = "查询风机对标列表", notes = "查询风机对标列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页对象", required = true, dataType = "tablepar", paramType = "query"),
+            @ApiImplicitParam(name = "cid", value = "值际对标编号", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult benchmarkZjWtList(HttpServletRequest request,Tablepar tablepar, String cid) {
+        List<BenchMarkVo> vos=new ArrayList<>();
+        Map<String, List<ConditionVo>> ctmap = null;
+        if (null != request.getSession().getAttribute("bmwtvos")) {
+            ctmap = (Map<String, List<ConditionVo>>) request.getSession().getAttribute("bmwtvos");
+        } else {
+            ctmap = new HashMap<String, List<ConditionVo>>();
+        }
+
+        if (StringUtils.notEmp(cid) && ctmap.containsKey(cid)) {
+            List<ConditionVo> ctvos = ctmap.get(cid);
+            Map<String, BenchMarkVo> bmmap = new HashMap<String, BenchMarkVo>();
+            for (ConditionVo ct : ctvos) {
+
+                String wpId = ct.getWpId();
+                String beginDate = ct.getBeginDate();
+                String endDate =ct.getEndDate();
+
+                bmmap=contrastWtService.benchmarkZjInWtList(wpId,null,beginDate,endDate);
+            }
+
+            Set<Map.Entry<String, BenchMarkVo>> set = bmmap.entrySet();
+            for (Iterator<Map.Entry<String, BenchMarkVo>> it = set.iterator(); it.hasNext();) {
+                Map.Entry<String, BenchMarkVo> entry = (Map.Entry<String, BenchMarkVo>) it.next();
+                // System.out.println(entry.getKey() + "--->" +
+                // entry.getValue());
+                BenchMarkVo bm = entry.getValue();
+                totalBenchmarkInfo(bm);
+                vos.add(bm);
+            }
+        }
+
+        if (vos != null && !vos.isEmpty()) {
+            BenchmarkUtil bu = new BenchmarkUtil();
+            vos = bu.getBenchMarkOrder(vos);
+            //默认综合排序,不需要从新排序,除非指定字段排序
+            if(StringUtils.notEmp(tablepar) && StringUtils.isNotEmpty(tablepar.getOrderByColumn()) )
+            {
+                vos = bu.getBenchMarkOrder(vos,tablepar);
+            }
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+
+    private void totalBenchmarkInfo(BenchMarkVo bm) {
+        double scadafdl = bm.getScadafdl(); // scada发电量
+        double qfss = bm.getQfss();// 欠发损失发电量
+        double gzss = bm.getGzss();// 故障损失发电量
+        double whss = bm.getWhss();// 维护损失发电量
+        double xdss = bm.getXdss();// 限电损失发电量
+        double llfdl = scadafdl + qfss + gzss + whss + xdss;// 理论发电量
+
+        if (llfdl != 0) {
+            double temp = xdss;
+
+            BigDecimal b1 = new BigDecimal(temp);
+            BigDecimal b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 弃风率
+            bm.setQfl(temp);
+            temp = qfss;
+
+            b1 = new BigDecimal(temp);
+            b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 性能损失率
+            bm.setXnssl(temp);
+
+            temp = gzss;
+
+            b1 = new BigDecimal(temp);
+            b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 故障损失率
+            bm.setGzssl(temp);
+
+            temp = whss;
+
+            b1 = new BigDecimal(temp);
+            b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 检修损失率
+            bm.setJxssl(temp);
+            temp = 0;
+
+            b1 = new BigDecimal(temp);
+            b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 受累损失率
+            bm.setSlssl(temp);
+            temp = scadafdl;
+
+            b1 = new BigDecimal(temp);
+            b2 = new BigDecimal(llfdl);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 风能利用率
+            bm.setFnlyl(temp);
+            // 受累损失电量
+            bm.setSlssl(0.0);
+        } else {
+            // temp 风能利用率
+            bm.setFnlyl(0.0);
+            // temp 故障损失率
+            bm.setGzssl(0.0);
+            // temp 检修损失率
+            bm.setJxssl(0.0);
+            // temp 弃风率
+            bm.setQfl(0.0);
+            // temp 受累损失率
+            bm.setSlssl(0.0);
+            // 受累损失电量
+            bm.setSlssl(0.0);
+            // temp 性能损失率
+            bm.setXnssl(0.0);
+        }
+
+        if (bm.getFwzcs() != 0) {
+
+            double temp1 = bm.getFwcs();// 5分钟复位及时次数
+            double temp2 = bm.getFwzcs();// 总复位次数
+
+            double temp = 0;
+
+            BigDecimal b1 = new BigDecimal(temp1);
+            BigDecimal b2 = new BigDecimal(temp2);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+            // temp 复位及时率
+            bm.setFwjsl(temp);
+        } else {
+            bm.setFwjsl(100.0);
+        }
+
+        if (bm.getZtzcs() != 0) {
+
+            double temp1 = bm.getZtcs();// 小于3米5分钟转换及时次数
+            double temp2 = bm.getZtzcs();// 小于3米状态转换总次数
+
+            double temp = 0;
+
+            BigDecimal b1 = new BigDecimal(temp1);
+            BigDecimal b2 = new BigDecimal(temp2);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+
+            // temp 状态转换及时率
+            bm.setZtzhjsl(temp);
+        } else {
+            bm.setZtzhjsl(100.0);
+        }
+
+        if (bm.getXqzcs() != 0) {
+
+            double temp1 = bm.getXqcs();// 消缺及时次数
+            double temp2 = bm.getXqzcs();// 故障总次数
+
+            double temp = 0;
+
+            BigDecimal b1 = new BigDecimal(temp1);
+            BigDecimal b2 = new BigDecimal(temp2);
+
+            temp = b1.divide(b2, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).doubleValue();
+
+            // temp 消缺及时率
+            bm.setXqjsl(temp);
+        } else {
+            bm.setXqjsl(100.0);
+        }
+    }
+}
+

+ 89 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/export/GoldenController.java

@@ -0,0 +1,89 @@
+package com.gyee.frame.controller.export;
+
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.service.WindpowerstationService;
+import com.gyee.frame.service.export.GoldenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@RestController
+@RequestMapping("/export")
+@Api(value = "golden数据导出功能",tags =  "golden数据导出功能")
+public class GoldenController {
+
+    @Resource
+    private GoldenService goldenService;
+    @Resource
+    private WindpowerstationService stationService;
+
+    /**
+     * 查询所有的场站
+     *
+     * @return
+     */
+    @GetMapping("/databases")
+    @ApiOperation(value = "查询风电场", notes = "查询风电场")
+    public AjaxResult getDatabases() {
+        List<Map<String, String>> list = stationService.findStationAll();
+        return AjaxResult.successData(AjaxStatus.success.code, list);
+    }
+
+
+
+    /**
+     * 通过模板导出单个风机数据
+     *
+     * @param station  场站
+     * @param wtId     风机ID
+     * @param id       模板ID
+     * @param startTs  开始时间
+     * @param endTs    结束时间
+     * @param interval 时间间隔
+     * @return
+     */
+//    @GetMapping("/history/snap")
+//    public AjaxResult getHistory(
+//            @RequestParam(value = "station") String station,
+//            @RequestParam(value = "wtId", required = false) String wtId,
+//            @RequestParam(value = "templateId") Integer id,
+//            @RequestParam(value = "startTs") Long startTs,
+//            @RequestParam(value = "endTs") Long endTs,
+//            @RequestParam(value = "interval", required = false) Optional<Integer> interval) {
+//
+//        int val = interval.isPresent() ? interval.get() : 1800;
+//
+//        List<Object> list = goldenService.getHistoryDataSingle(station, wtId, id, startTs, endTs, val);
+//        return AjaxResult.successData(AjaxStatus.success.code, list);
+//    }
+
+    /**
+     * 通过模板导出所有风机数据
+     *
+     * @param id       模板ID
+     * @param startTs  开始时间
+     * @param endTs    结束时间
+     * @param interval 时间间隔
+     * @return
+     */
+    @GetMapping("/history/all")
+    public AjaxResult getHistoryAll(
+            @RequestParam(value = "station") String station,
+            @RequestParam(value = "templateId") Integer id,
+            @RequestParam(value = "startTs") Long startTs,
+            @RequestParam(value = "endTs") Long endTs,
+            @RequestParam(value = "interval", required = false) Optional<Integer> interval) {
+
+        int val = interval.isPresent() ? interval.get() : 1800;
+
+        Map<String, List<Object>> map = goldenService.getHistoryDataAll(station, id, startTs, endTs, val);
+        return AjaxResult.successData(AjaxStatus.success.code, map);
+    }
+}

+ 39 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/file/ExcelExportController.java

@@ -0,0 +1,39 @@
+package com.gyee.frame.controller.file;
+
+
+import com.gyee.frame.common.file.ExcelExport;
+import com.gyee.frame.model.auto.Alertrule2;
+import com.gyee.frame.service.Alertrule2ervice;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@RestController
+@RequestMapping("/excelexport")
+@Api(value = "excle数据导出功能",tags =  "excle数据导出功能")
+public class ExcelExportController {
+
+    @Resource
+    private Alertrule2ervice alertrule2ervice;
+
+    /**
+     * 信息导出
+     */
+    @GetMapping("/excelexport")
+    public void exprotExcel(HttpServletResponse response){
+
+        //将查询到的数据导出
+        List<Alertrule2> studentExportList=alertrule2ervice.getAlertruleAllList() ;
+        //创建一个数组用于设置表头
+        String[] arr = new String[]{"年级","学号","姓名","专业","二级学院","联系方式","性别"};
+        String heardName="学生信息表";
+        //调用Excel导出工具类
+        ExcelExport.export(response,studentExportList,arr,heardName,6);
+    }
+
+}

+ 206 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindpowerDetailChartController.java

@@ -0,0 +1,206 @@
+package com.gyee.frame.controller.goodness;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.service.*;
+import com.gyee.frame.service.goodness.WindturbinegoodnessService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 风场风资源图表
+ */
+@Controller
+@RequestMapping("/goodness")
+@Api(value = "风场风资源图表", tags = "风场风资源图表")
+public class WindpowerDetailChartController {
+    @Resource
+    private WindturbinegoodnessService windturbinegoodnessService;
+    @Resource
+    private InputoroutputspeedtotalService inputoroutputspeedtotalServicenegoodnessService;
+    @Resource
+    private WarningRecordsService warningRecordsService;
+    @Resource
+    private Brownoutsevent2Service brownoutsevent2Service;
+    @Resource
+    private Shutdownevent2Service shutdownevent2Service;
+    @Resource
+    private WarningInfoDayService warningInfoDayService;
+    @Resource
+    private WindturbineanalysisdayService windturbineanalysisdayService;
+    @Resource
+    private WindturbineinfodayService windturbineinfodayService;
+    @Resource
+    private WindturbinecurvefittingService windturbinecurvefittingService;
+    @Resource
+    private WindturbinethewindinfoService windturbinethewindinfoService;
+    @Resource
+    private WindpowerstationthewindinfoService windpowerstationthewindinfoService;
+
+    private String jfplday;
+    private String jfplmonth;
+    private String jfplyear;
+
+
+    /*
+     * 风场日最大风速
+     */
+    @GetMapping("/wprzdfs")
+    @ResponseBody
+    @ApiOperation(value = "风场日最大风速", notes = "风场日最大风速")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wprzdfs(String wpId, String recorddate) {
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        map = windpowerstationthewindinfoService.wprzdfs(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+    /*
+     * 风场月最大风速
+     */
+    @GetMapping("/wpyzdfs")
+    @ResponseBody
+    @ApiOperation(value = "风场月最大风速", notes = "风场月最大风速")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wpyzdfs(String wpId, String recorddate) {
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        map = windpowerstationthewindinfoService.wpyzdfs(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+
+    /*
+     * 风场年最大风速
+     */
+    @GetMapping("/wpnzdfs")
+    @ResponseBody
+    @ApiOperation(value = "风场年最大风速", notes = "风场年最大风速")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wpnzdfs(String wpId, String recorddate) {
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        map = windpowerstationthewindinfoService.wpnzdfs(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+
+    /*
+     * 风场日风向频率
+     */
+    @GetMapping("/wprfxpl")
+    @ResponseBody
+    @ApiOperation(value = "风场日风向频率", notes = "风场日风向频率")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wprfxpl(String wpId, String recorddate) {
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        map = windpowerstationthewindinfoService.wprfxpl(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+
+    /*
+     * 风场月风向频率
+     */
+    @GetMapping("/wpyfxpl")
+    @ResponseBody
+    @ApiOperation(value = "风场月风向频率", notes = "风场月风向频率")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wpyfxpl(String wpId, String recorddate) {
+        Map<String, Object> map = new HashMap<String, Object>();
+
+
+        map = windpowerstationthewindinfoService.wpyfxpl(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+    /*
+     * 风场年风向频率
+     */
+    @GetMapping("/wpnfxpl")
+    @ResponseBody
+    @ApiOperation(value = "风场年风向频率", notes = "风场年风向频率")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wpnfxpl(String wpId, String recorddate) {
+        Map<String, Object> map = new HashMap<String, Object>();
+
+
+        map = windpowerstationthewindinfoService.wpnfxpl(wpId, recorddate);
+
+
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+
+}
+
+
+
+
+}

File diff suppressed because it is too large
+ 1277 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailChartController.java


+ 326 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailLineChartController.java

@@ -0,0 +1,326 @@
+package com.gyee.frame.controller.goodness;
+
+import com.alibaba.fastjson.JSONArray;
+import com.github.pagehelper.PageInfo;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.Brownoutsevent2;
+import com.gyee.frame.model.auto.Inputoroutputspeedtotal;
+import com.gyee.frame.model.auto.WarningRecords;
+import com.gyee.frame.model.custom.DataVo;
+import com.gyee.frame.model.custom.EchartDataVo;
+import com.gyee.frame.model.custom.ShutdowneventVo;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.service.*;
+import com.gyee.frame.service.goodness.WindturbinegoodnessService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * 风机区间图表功能展示
+ */
+@Controller
+@RequestMapping("/goodness")
+@Api(value = "单机信息总览风机区间图表",tags =  "单机信息总览风机区间图表")
+public class WindturbineDetailLineChartController {
+    @Resource
+    private WindturbinegoodnessService windturbinegoodnessService;
+    @Resource
+    private InputoroutputspeedtotalService inputoroutputspeedtotalServicenegoodnessService;
+    @Resource
+    private WarningRecordsService warningRecordsService;
+    @Resource
+    private Brownoutsevent2Service brownoutsevent2Service;
+    @Resource
+    private Shutdownevent2Service shutdownevent2Service;
+    @Resource
+    private WarningInfoDayService warningInfoDayService;
+    @Resource
+    private WindturbineanalysisdayService windturbineanalysisdayService;
+    @Resource
+    private WindturbineinfodayService windturbineinfodayService;
+    @Resource
+    private WindturbinecurvefittingService windturbinecurvefittingService;
+    @Resource
+    private WindturbinethewindinfoService windturbinethewindinfoService;
+    @Resource
+    private WindpowerstationthewindinfoService windpowerstationthewindinfoService;
+
+
+    /**
+     * 获得功率曲线数据查询
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/findWtRealPowerChar")
+    @ResponseBody
+    @ApiOperation(value = "查询功率曲线数据信息", notes = "查询功率曲线数据信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult findWtRealPowerChar(String wtId, String recorddate) throws Exception {
+        Date date = DateUtils.parseStrtoDate(recorddate);
+        List<DataVo> result = windturbinegoodnessService.findWtRealPowerChar(wtId, date);
+
+//
+//        System.out.println( JSONArray.toJSON(result));
+
+        if (result != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        }
+    }
+    /**
+     * 获得曲线区间区分功能数据查询
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/getplotBands")
+    @ResponseBody
+    @ApiOperation(value = "获得曲线区间区分功能数据", notes = "获得曲线区间区分功能数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult getplotBands(String wtId, String recorddate) throws Exception {
+        Date date = DateUtils.parseStrtoDate(recorddate);
+        List<List<EchartDataVo>> result = windturbinegoodnessService.getplotBands(wtId, date);
+
+//
+       System.out.println( JSONArray.toJSON(result));
+
+        if (result != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        }
+    }
+
+    /**
+     * 获取切入风速
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/getInputSmall")
+    @ResponseBody
+    @ApiOperation(value = "获取切入风速", notes = "获取切入风速")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult getInputSmall(String wtId, String recorddate) throws Exception {
+        Date date = DateUtils.parseStrtoDate(recorddate);
+        double inputsmall=0.0;
+        List<Inputoroutputspeedtotal> ls = inputoroutputspeedtotalServicenegoodnessService.getInputoroutputspeedtotal(wtId, date);
+        if(!ls.isEmpty())
+        {
+            Inputoroutputspeedtotal is=ls.get(0);
+            if(StringUtils.notEmp(is) && StringUtils.notEmp(is.getMonthinputsmall()) )
+            {
+                inputsmall=is.getMonthinputsmall();
+            }else
+            {
+                inputsmall=3.0;
+            }
+
+        }
+        return AjaxResult.successData(AjaxStatus.success.code, inputsmall);
+    }
+
+    /**
+     * 获取24小时功率曲线
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/findRealPowerCharBy24")
+    @ResponseBody
+    @ApiOperation(value = "获取24小时功率曲线", notes = "获取24小时功率曲线")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult findRealPowerCharBy24(String wtId, String recorddate) throws Exception {
+        List<DataVo> resultList = new ArrayList<>();
+        if (StringUtils.notEmp(recorddate) && StringUtils.notEmp(wtId)) {
+
+            resultList = windturbinegoodnessService.findRealPowerCharBy24(wtId, DateUtils.parseDate(recorddate));
+        }
+
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+
+    /*
+     * 单台风机当日报警记录
+     */
+    @GetMapping("/bjjllist")
+    @ResponseBody
+    @ApiOperation(value = "单台风机当日报警记录", notes = "单台风机当日报警记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult bjjllist(Tablepar tablepar, String wtId, String recorddate) {
+
+        PageInfo<WarningRecords> resultList =new PageInfo<>();
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate))
+        {
+            Calendar cal = Calendar.getInstance();
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+
+            cal.setTime(DateUtils.parseStrtoDate(recorddate));
+            Date beginDate = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            Date endDate = cal.getTime();
+
+            resultList = warningRecordsService.getWarningRecordsList(tablepar, wtId, beginDate, endDate);
+
+        }
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+    /*
+     * 单台风机当日停机记录
+     */
+    @GetMapping("/gzjllist")
+    @ResponseBody
+    @ApiOperation(value = "单台风机当日停机记录", notes = "单台风机当日停机记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult gzjllist(Tablepar tablepar, String wtId, String recorddate) {
+
+        PageInfo<ShutdowneventVo> resultList =new PageInfo<>();
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate))
+        {
+            Calendar cal = Calendar.getInstance();
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+
+            cal.setTime(DateUtils.parseStrtoDate(recorddate));
+            Date beginDate = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            Date endDate = cal.getTime();
+
+            resultList = shutdownevent2Service.getShutdowneventList(tablepar, wtId, beginDate, endDate);
+
+        }
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+    /*
+     * 单台风机当日限电记录
+     */
+    @GetMapping("/xdjllist")
+    @ResponseBody
+    @ApiOperation(value = "单台风机当日限电记录", notes = "单台风机当日限电记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult xdjllist(Tablepar tablepar, String wtId, String recorddate) {
+
+        PageInfo<Brownoutsevent2> resultList = new PageInfo<>();
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate))
+        {
+            Calendar cal = Calendar.getInstance();
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+
+            cal.setTime(DateUtils.parseStrtoDate(recorddate));
+            Date beginDate = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            Date endDate = cal.getTime();
+
+             resultList = brownoutsevent2Service.getBrownoutsevent2List(tablepar, wtId, beginDate, endDate);
+
+
+        }
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+    /**
+     * 获取区域弹出列表信息
+     *
+
+     */
+    @GetMapping("/plotBandAjax")
+    @ResponseBody
+    @ApiOperation(value = "获取区域弹出列表信息", notes = "获取区域弹出列表信息")
+    @ApiImplicitParams({
+
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始时间", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束时间", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult plotBandAjax(String wtId,String beginDate,String endDate) throws Exception {
+
+        Map<String, String> map = new HashMap<>();
+
+
+            if (StringUtils.notEmp(wtId) && StringUtils.notEmp(beginDate) && StringUtils.notEmp(endDate) ) {
+
+                    map=windturbinegoodnessService.getPlotBand(wtId,beginDate,endDate);
+                    if (map != null) {
+                        return AjaxResult.successData(AjaxStatus.success.code, map);
+                    } else {
+                        return AjaxResult.successData(AjaxStatus.success.code, map);
+                    }
+
+            }
+
+        return AjaxResult.successData(AjaxStatus.success.code, map);
+    }
+
+
+}

+ 276 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineDetailPieChartAController.java

@@ -0,0 +1,276 @@
+package com.gyee.frame.controller.goodness;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.Inputoroutputspeedtotal2;
+import com.gyee.frame.model.custom.DataVo;
+import com.gyee.frame.service.Inputoroutputspeedtotal2Service;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 单机性能分析列表
+ */
+@Controller
+@RequestMapping("/goodness")
+@Api(value = "单机信息总览饼图",tags =  "单机信息总览饼图")
+public class WindturbineDetailPieChartAController {
+    @Resource
+    private Inputoroutputspeedtotal2Service inputoroutputspeedtotal2Service;
+
+    /**
+     * 饼图图表
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     */
+    @GetMapping("/pieChart")
+    @ResponseBody
+    @ApiOperation(value = "查询等级评估日所有信息", notes = "查询等级评估日所有信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "类型 1:日小风切入,2:月小风切入,3:月小风切入,4:日小风停机,5:月小风停机,6:年小风停机", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult pieChart( String wtId, String recorddate,String type) {
+
+        List<DataVo> vos=new ArrayList<>();
+
+        if (StringUtils.notEmp(recorddate) && StringUtils.notEmp(wtId) && StringUtils.notEmp(type)) {
+
+            Date date=DateUtils.parseDate(recorddate);
+            List<Inputoroutputspeedtotal2> ls = inputoroutputspeedtotal2Service.getInputoroutputspeedtotal2(wtId,date);
+
+            if (!ls.isEmpty()) {
+
+                vos=new ArrayList<DataVo>();
+                Inputoroutputspeedtotal2 io = ls.get(0);
+
+                DataVo vo1 = new DataVo();
+                DataVo vo2 = new DataVo();
+                DataVo vo3 = new DataVo();
+                DataVo vo4 = new DataVo();
+                DataVo vo5 = new DataVo();
+                DataVo vo6 = new DataVo();
+                DataVo vo7 = new DataVo();
+                switch (Integer.valueOf(type)) {
+                    case 1:// 日小风切入
+                        vo1.setName("日小于2风");
+                        vo1.setValue1(io.getDaya1());
+                        vo1.setValue2(io.getDaya8());
+
+                        vo2.setName("日2-2.5风");
+                        vo2.setValue1(io.getDaya2());
+                        vo2.setValue2(io.getDaya9());
+
+                        vo3.setName("日2.5-3风");
+                        vo3.setValue1(io.getDaya3());
+                        vo3.setValue2(io.getDaya10());
+
+                        vo4.setName("日3-3.5风");
+                        vo4.setValue1(io.getDaya4());
+                        vo4.setValue2(io.getDaya11());
+
+                        vo5.setName("日3.5-4风");
+                        vo5.setValue1(io.getDaya5());
+                        vo5.setValue2(io.getDaya12());
+
+                        vo6.setName("日4-5风");
+                        vo6.setValue1(io.getDaya6());
+                        vo6.setValue2(io.getDaya13());
+
+                        vo7.setName("日大于5风");
+                        vo7.setValue1(io.getDaya7());
+                        vo7.setValue2(io.getDaya14());
+
+                        break;
+                    case 2:// 月小风切入
+                        vo1.setName("月小于2风");
+                        vo1.setValue1(io.getMontha1());
+                        vo1.setValue2(io.getMontha8());
+
+                        vo2.setName("月2-2.5风");
+                        vo2.setValue1(io.getMontha2());
+                        vo2.setValue2(io.getMontha9());
+
+                        vo3.setName("月2.5-3风");
+                        vo3.setValue1(io.getMontha3());
+                        vo3.setValue2(io.getMontha10());
+
+                        vo4.setName("月3-3.5风");
+                        vo4.setValue1(io.getMontha4());
+                        vo4.setValue2(io.getMontha11());
+
+                        vo5.setName("月3.5-4风");
+                        vo5.setValue1(io.getMontha5());
+                        vo5.setValue2(io.getMontha12());
+
+                        vo6.setName("月4-5风");
+                        vo6.setValue1(io.getMontha6());
+                        vo6.setValue2(io.getMontha13());
+
+                        vo7.setName("月大于5风");
+                        vo7.setValue1(io.getMontha7());
+                        vo7.setValue2(io.getMontha14());
+
+                        break;
+                    case 3: // 年小风切入
+                        vo1.setName("年小于2风");
+                        vo1.setValue1(io.getYeara1());
+                        vo1.setValue2(io.getYeara8());
+
+                        vo2.setName("年2-2.5风");
+                        vo2.setValue1(io.getYeara2());
+                        vo2.setValue2(io.getYeara9());
+
+                        vo3.setName("年2.5-3风");
+                        vo3.setValue1(io.getYeara3());
+                        vo3.setValue2(io.getYeara10());
+
+                        vo4.setName("年3-3.5风");
+                        vo4.setValue1(io.getYeara4());
+                        vo4.setValue2(io.getYeara11());
+
+                        vo5.setName("年3.5-4风");
+                        vo5.setValue1(io.getYeara5());
+                        vo5.setValue2(io.getYeara12());
+
+                        vo6.setName("年4-5风");
+                        vo6.setValue1(io.getYeara6());
+                        vo6.setValue2(io.getYeara13());
+
+                        vo7.setName("年大于5风");
+                        vo7.setValue1(io.getYeara7());
+                        vo7.setValue2(io.getYeara14());
+
+                        break;
+                    case 4:// 日小风停机
+                        vo1.setName("日小于2风");
+                        vo1.setValue1(io.getDayb1());
+                        vo1.setValue2(io.getDayb8());
+
+                        vo2.setName("日2-2.5风");
+                        vo2.setValue1(io.getDayb2());
+                        vo2.setValue2(io.getDayb9());
+
+                        vo3.setName("日2.5-3风");
+                        vo3.setValue1(io.getDayb3());
+                        vo3.setValue2(io.getDayb10());
+
+                        vo4.setName("日3-3.5风");
+                        vo4.setValue1(io.getDayb4());
+                        vo4.setValue2(io.getDayb11());
+
+                        vo5.setName("日3.5-4风");
+                        vo5.setValue1(io.getDayb5());
+                        vo5.setValue2(io.getDayb12());
+
+                        vo6.setName("日4-5风");
+                        vo6.setValue1(io.getDayb6());
+                        vo6.setValue2(io.getDayb13());
+
+                        vo7.setName("日大于5风");
+                        vo7.setValue1(io.getDayb7());
+                        vo7.setValue2(io.getDayb14());
+
+                        break;
+                    case 5:// 月小风停机
+                        vo1.setName("月小于2风");
+                        vo1.setValue1(io.getMonthb1());
+                        vo1.setValue2(io.getMonthb8());
+
+                        vo2.setName("月2-2.5风");
+                        vo2.setValue1(io.getMonthb2());
+                        vo2.setValue2(io.getMonthb9());
+
+                        vo3.setName("月2.5-3风");
+                        vo3.setValue1(io.getMonthb3());
+                        vo3.setValue2(io.getMonthb10());
+
+                        vo4.setName("月3-3.5风");
+                        vo4.setValue1(io.getMonthb4());
+                        vo4.setValue2(io.getMonthb11());
+
+                        vo5.setName("月3.5-4风");
+                        vo5.setValue1(io.getMonthb5());
+                        vo5.setValue2(io.getMonthb12());
+
+                        vo6.setName("月4-5风");
+                        vo6.setValue1(io.getMonthb6());
+                        vo6.setValue2(io.getMonthb13());
+
+                        vo7.setName("月大于5风");
+                        vo7.setValue1(io.getMonthb7());
+                        vo7.setValue2(io.getMonthb14());
+
+                        break;
+                    case 6: // 年小风停机
+                        vo1.setName("年小于2风");
+                        vo1.setValue1(io.getYearb1());
+                        vo1.setValue2(io.getYearb8());
+
+                        vo2.setName("年2-2.5风");
+                        vo2.setValue1(io.getYearb2());
+                        vo2.setValue2(io.getYearb9());
+
+                        vo3.setName("年2.5-3风");
+                        vo3.setValue1(io.getYearb3());
+                        vo3.setValue2(io.getYearb10());
+
+                        vo4.setName("年3-3.5风");
+                        vo4.setValue1(io.getYearb4());
+                        vo4.setValue2(io.getYearb11());
+
+                        vo5.setName("年3.5-4风");
+                        vo5.setValue1(io.getYearb5());
+                        vo5.setValue2(io.getYearb12());
+
+                        vo6.setName("年4-5风");
+                        vo6.setValue1(io.getYearb6());
+                        vo6.setValue2(io.getYearb13());
+
+                        vo7.setName("年大于5风");
+                        vo7.setValue1(io.getYearb7());
+                        vo7.setValue2(io.getYearb14());
+
+                        break;
+                    default:
+                        break;
+                }
+
+                vos.add(vo1);
+                vos.add(vo2);
+                vos.add(vo3);
+                vos.add(vo4);
+                vos.add(vo5);
+                vos.add(vo6);
+                vos.add(vo7);
+            }
+
+        }
+
+        if (vos != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+    }
+
+
+
+}

+ 380 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbineGoodnessDetailController.java

@@ -0,0 +1,380 @@
+package com.gyee.frame.controller.goodness;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.common.spring.InitialRunner;
+import com.gyee.frame.model.auto.*;
+import com.gyee.frame.model.custom.DataVo;
+import com.gyee.frame.model.custom.SawVo;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.model.custom.ValueVo;
+import com.gyee.frame.service.*;
+import com.gyee.frame.service.goodness.WindturbinegoodnessService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * 风机明细信息页面
+ */
+@Controller
+@RequestMapping("/goodness")
+@Api(value = "单机信息总览详细信息",tags =  "单机信息总览详细信息")
+public class WindturbineGoodnessDetailController {
+    @Resource
+    private WindturbinegoodnessService windturbinegoodnessService;
+    @Resource
+    private InputoroutputspeedtotalService inputoroutputspeedtotalServicenegoodnessService;
+    @Resource
+    private WarningRecordsService warningRecordsService;
+    @Resource
+    private Brownoutsevent2Service brownoutsevent2Service;
+    @Resource
+    private Shutdownevent2Service shutdownevent2Service;
+    @Resource
+    private WarningInfoDayService warningInfoDayService;
+    @Resource
+    private WindturbineanalysisdayService windturbineanalysisdayService;
+    @Resource
+    private WindturbineinfodayService windturbineinfodayService;
+    @Resource
+    private WindturbinecurvefittingService windturbinecurvefittingService;
+    @Resource
+    private WindturbinethewindinfoService windturbinethewindinfoService;
+    @Resource
+    private WindpowerstationthewindinfoService windpowerstationthewindinfoService;
+
+    private String jfpl;
+
+
+    /**
+     * 获得明细页面显示信息
+     *
+     * @param wtId
+     * @param recorddate
+     * @return
+     */
+    @GetMapping("/wadAjax")
+    @ResponseBody
+    @ApiOperation(value = "查询明细页面显示信息", notes = "查询明细页面显示信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult wadAjax(String wtId, String recorddate) {
+
+        Windturbineanalysisday wtday = new Windturbineanalysisday();
+        if (StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate)) {
+            Date date = DateUtils.parseDate(recorddate);
+            List<Windturbineanalysisday> wadls = windturbineanalysisdayService.comparelist(wtId, date);
+
+            List<WindTurbineInfoDay> wtdls = windturbineinfodayService.getWindturbineinfo(wtId, date);
+
+            if (null != wadls && !wadls.isEmpty() && null != wtdls && !wtdls.isEmpty()) {
+
+                wtday = wadls.get(0);
+                WindTurbineInfoDay wt = wtdls.get(0);
+                double fdl = null != wt.getGeneratingcapacity2() ? wt.getGeneratingcapacity2() : 0.0;
+                double gz = null != wt.getLossofpower2() ? wt.getLossofpower2() : 0.0;
+                double jx = null != wt.getLossofpower3() ? wt.getLossofpower3() : 0.0;
+                double qf = null != wt.getLossofpower4() ? wt.getLossofpower4() : 0.0;
+                double xd = null != wt.getLossofpower1() ? wt.getLossofpower1() : 0.0;
+                double sl1 = null != wt.getMainlossin() ? wt.getMainlossin() : 0.0;
+                double sl2 = null != wt.getFaultlossin() ? wt.getFaultlossin() : 0.0;
+                double sl3 = null != wt.getElectriclossout() ? wt.getElectriclossout() : 0.0;
+                double sl4 = null != wt.getWeatherlossout() ? wt.getWeatherlossout() : 0.0;
+
+                wtday.setC4(StringUtils.round(fdl + gz + jx + qf + xd + sl1 + sl2 + sl3 + sl4, 2));
+                wtday.setC31(StringUtils.round(gz + jx + qf + xd + sl1 + sl2 + sl3 + sl4, 2));
+                wtday.setC5(getMonthC5(wtId, date));
+            }
+
+        }
+        if (null != wtday) {
+            return AjaxResult.successData(AjaxStatus.success.code, wtday);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, wtday);
+        }
+
+    }
+
+
+    private double getMonthC5(String wtId, Date recorddate) {
+
+        List<WindTurbineInfoDay> wtdls;
+
+        Calendar c = Calendar.getInstance();
+        c.setTime(recorddate);
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        Date beginDate = DateUtils.truncate(c.getTime());
+        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Date endate = DateUtils.truncate(c.getTime());
+
+        wtdls = windturbineinfodayService.getWindturbineinfo(beginDate, endate, wtId);
+        double fdl = 0.0;
+        double gz = 0.0;
+        double jx = 0.0;
+        double qf = 0.0;
+        double xd = 0.0;
+        double sl1 = 0.0;
+        double sl2 = 0.0;
+        double sl3 = 0.0;
+        double sl4 = 0.0;
+        if (null != wtdls && !wtdls.isEmpty()) {
+            for (WindTurbineInfoDay wt : wtdls) {
+                fdl = fdl + (null != wt.getGeneratingcapacity2() ? wt.getGeneratingcapacity2() : 0.0);
+                gz = gz + (null != wt.getLossofpower2() ? wt.getLossofpower2() : 0.0);
+                jx = jx + (null != wt.getLossofpower3() ? wt.getLossofpower3() : 0.0);
+                qf = qf + (null != wt.getLossofpower4() ? wt.getLossofpower4() : 0.0);
+                xd = xd + (null != wt.getLossofpower1() ? wt.getLossofpower1() : 0.0);
+                sl1 = sl1 + (null != wt.getMainlossin() ? wt.getMainlossin() : 0.0);
+                sl2 = sl2 + (null != wt.getFaultlossin() ? wt.getFaultlossin() : 0.0);
+                sl3 = sl3 + (null != wt.getElectriclossout() ? wt.getElectriclossout() : 0.0);
+                sl4 = sl4 + (null != wt.getWeatherlossout() ? wt.getWeatherlossout() : 0.0);
+            }
+            return StringUtils.round(fdl + gz + jx + qf + xd + sl1 + sl2 + sl3 + sl4, 2);
+        }
+        return 0.0;
+    }
+
+    /*
+     * 单台风机当月报警排行
+     */
+    @GetMapping("/bjphlist")
+    @ResponseBody
+    @ApiOperation(value = "单台风机当月报警排行", notes = "单台风机当月报警排行")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult bjphlist(Tablepar tablepar, String wtId, String recorddate) {
+        List<SawVo> resultList =new ArrayList<>();
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate))
+        {
+
+            Calendar cal = Calendar.getInstance();
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+
+            cal.setTime(DateUtils.parseStrtoDate(recorddate));
+            Date beginDate = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            Date endDate = cal.getTime();
+           resultList = warningRecordsService.getWarningRecordsTop5(tablepar, wtId, beginDate, endDate);
+
+        }
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+    /*
+     * 获取明细页面功率曲线
+     */
+    @GetMapping("/glchat")
+    @ResponseBody
+    @ApiOperation(value = "获取明细页面功率曲线", notes = "获取明细页面功率曲线")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult glchat(String wtId, String recorddate) {
+
+        List<DataVo> datavos = new ArrayList<>();
+        if (StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate)) {
+            Date date = DateUtils.parseStrtoDate(recorddate);
+            Map<String, Map<String, ModelPower>> modelPowermap = InitialRunner.modelPowermap;
+            Map<String, Windturbine> wtmap = InitialRunner.wtmap;
+            Map<String, ModelPower> map = null;
+
+            List<Windturbinecurvefitting> wcls = windturbinecurvefittingService.comparechatAjax(wtId, date);
+            if (!wcls.isEmpty()) {
+                if (wtmap.containsKey(wtId)) {
+                    Windturbine wt = wtmap.get(wtId);
+                    if (modelPowermap.containsKey(wt.getModelid())) {
+                        map = modelPowermap.get(wt.getModelid());
+                    }
+                }
+                double temp = 0.0;
+                for (Windturbinecurvefitting wc : wcls) {
+                    DataVo vo = new DataVo();
+
+                    int c = (int) wc.getSpeed().intValue();
+
+                    if (c == wc.getSpeed()) {
+                        vo.setValue1(wc.getSpeed());// 风速
+                        vo.setValue2(wc.getActualpower());// 实际拟合功率
+                        vo.setValue3(wc.getOptimalpower());// 最优拟合功率
+
+                        if (null != map && StringUtils.notEmp(wc.getSpeed()) && map.containsKey(String.valueOf(wc.getSpeed()))) {
+                            ModelPower mp = map.get(String.valueOf(wc.getSpeed()));
+                            vo.setValue4(mp.getEnsurepower());// 保证功率曲线
+                            temp = mp.getEnsurepower();
+                        } else {
+                            vo.setValue4(temp);// 保证功率曲线
+                        }
+
+                        datavos.add(vo);
+                    }
+
+                }
+            }
+        }
+        if (datavos != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, datavos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, datavos);
+        }
+    }
+
+    /*
+     * 获取风机风资源
+     */
+    @GetMapping("/fjfzy")
+    @ResponseBody
+    @ApiOperation(value = "获取风机风资源", notes = "获取风机风资源")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult fjfzy(String wtId, String recorddate) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        List<ValueVo> vos = new ArrayList<ValueVo>();
+        if (StringUtils.notEmp(wtId) && StringUtils.notEmp(recorddate)) {
+
+            Date date = DateUtils.parseDate(recorddate);
+            List<Windturbinethewindinfo> wtdls = windturbinethewindinfoService.fzy(wtId, date);
+
+
+            if (!wtdls.isEmpty()) {
+
+                Windturbinethewindinfo winfo = wtdls.get(0);
+                int c = (int) winfo.getCb().intValue();
+
+                jfpl = "静风频率为" + c;
+                for (int i = 0; i < 16; i++) {
+                    ValueVo vo = new ValueVo();
+
+                    switch (i) {
+                        case 0:
+                            // vo.setName("N("+winfo.getN4()+"/"+winfo.getN()+")");
+                            vo.setName("N");
+                            vo.setData1(winfo.getN2());
+                            break;
+                        case 1:
+                            // vo.setName("NNE("+winfo.getNne4()+"/"+winfo.getNne()+")");
+                            vo.setName("NNE");
+                            vo.setData1(winfo.getNne2());
+                            break;
+                        case 2:
+                            // vo.setName("NE("+winfo.getNe4()+"/"+winfo.getNe()+")");
+                            vo.setName("NE");
+                            vo.setData1(winfo.getNe2());
+                            break;
+                        case 3:
+                            // vo.setName("ENE("+winfo.getEne4()+"/"+winfo.getEne()+")");
+                            vo.setName("ENE");
+                            vo.setData1(winfo.getEne2());
+
+                            break;
+                        case 4:
+                            // vo.setName("E("+winfo.getE4()+"/"+winfo.getE()+")");
+                            vo.setName("E");
+                            vo.setData1(winfo.getE2());
+                            break;
+                        case 5:
+                            // vo.setName("ESE("+winfo.getEse()+"/"+winfo.getEse()+")");
+                            vo.setName("ESE");
+                            vo.setData1(winfo.getEse2());
+                            break;
+                        case 6:
+                            // vo.setName("SE("+winfo.getSe4()+"/"+winfo.getSe()+")");
+                            vo.setName("SE");
+                            vo.setData1(winfo.getSe2());
+                            break;
+                        case 7:
+                            // vo.setName("SSE("+winfo.getSse4()+"/"+winfo.getSse()+")");
+                            vo.setName("SSE");
+                            vo.setData1(winfo.getSse2());
+                            break;
+                        case 8:
+                            // vo.setName("S("+winfo.getS4()+"/"+winfo.getS()+")");
+                            vo.setName("S");
+                            vo.setData1(winfo.getS2());
+                            break;
+                        case 9:
+                            // vo.setName("SSW("+winfo.getSsw4()+"/"+winfo.getSsw()+")");
+                            vo.setName("SSW");
+                            vo.setData1(winfo.getSsw2());
+                            break;
+                        case 10:
+                            // vo.setName("SW("+winfo.getSw4()+"/"+winfo.getSw()+")");
+                            vo.setName("SW");
+                            vo.setData1(winfo.getSw2());
+                            break;
+                        case 11:
+                            // vo.setName("WSW("+winfo.getWsw4()+"/"+winfo.getWsw()+")");
+                            vo.setName("WSW");
+                            vo.setData1(winfo.getWsw2());
+
+                            break;
+                        case 12:
+                            // vo.setName("W("+winfo.getW4()+"/"+winfo.getW()+")");
+                            vo.setName("W");
+                            vo.setData1(winfo.getW2());
+                            break;
+                        case 13:
+                            // vo.setName("WNW("+winfo.getWnw4()+"/"+winfo.getWnw()+")");
+                            vo.setName("WNW");
+                            vo.setData1(winfo.getWnw2());
+                            break;
+                        case 14:
+                            // vo.setName("NW("+winfo.getNw4()+"/"+winfo.getNw()+")");
+                            vo.setName("NW");
+                            vo.setData1(winfo.getNw2());
+                            break;
+                        case 15:
+                            // vo.setName("NNW("+winfo.getNnw4()+"/"+winfo.getNnw()+")");
+                            vo.setName("NNW");
+                            vo.setData1(winfo.getNnw2());
+                            break;
+
+                        default:
+                            break;
+                    }
+
+                    vos.add(vo);
+                }
+
+
+                map.put("jfpl", jfpl);
+                map.put("data", vos);
+            }
+
+
+        }
+        if (map != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        }
+    }
+
+
+
+}

+ 98 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/goodness/WindturbinegoodnessController.java

@@ -0,0 +1,98 @@
+package com.gyee.frame.controller.goodness;
+
+import com.github.pagehelper.PageInfo;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.Windturbineanalysisday;
+import com.gyee.frame.model.auto.Windturbinegoodness;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.service.WindturbineanalysisdayService;
+import com.gyee.frame.service.goodness.WindturbinegoodnessService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 单机性能分析列表
+ */
+@Controller
+@RequestMapping("/goodness")
+@Api(value = "单机信息总览首页",tags =  "单机信息总览首页")
+public class WindturbinegoodnessController {
+    @Resource
+    private WindturbinegoodnessService windturbinegoodnessService;
+    @Resource
+    private WindturbineanalysisdayService windturbineanalysisdayService;
+
+
+    /**
+     * 获得单机性能总览列表信息
+     *
+     * @param tablepar
+     * @param wpId
+     * @param recorddate
+     * @return
+     */
+    @GetMapping("/windturbinegoodness")
+    @ResponseBody
+    @ApiOperation(value = "获得单机性能总览列表信息", notes = "获得单机性能总览列表信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult windturbinegoodness(Tablepar tablepar, String wpId, String recorddate) {
+
+        PageInfo<Windturbinegoodness> resultList = windturbinegoodnessService.windturbinegoodnessList(tablepar, wpId, recorddate);
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+
+    /**
+     * 获得单机性能总览历史列表信息
+     *
+     * @param tablepar
+     * @param wtId
+     * @param beginDate
+     * @param endDate
+     * @return
+     */
+    @GetMapping("/goodhistorylist")
+    @ResponseBody
+    @ApiOperation(value = "获得单机性能总览历史列表信息", notes = "获得单机性能总览历史列表信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult goodhistorylist(Tablepar tablepar, String wtId, String beginDate, String endDate) {
+        List<Windturbineanalysisday> resultList =new ArrayList<>();
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(beginDate) && StringUtils.notEmp(endDate) )
+        {
+            resultList = windturbineanalysisdayService.goodhistorylist(tablepar,wtId, DateUtils.parseDate(beginDate),  DateUtils.parseDate(endDate));
+        }
+        if (resultList != null) {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, resultList);
+        }
+    }
+
+}

+ 133 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/EarlyWarnKnowledgeController.java

@@ -0,0 +1,133 @@
+package com.gyee.frame.controller.health;
+
+import com.github.pagehelper.PageInfo;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.Alertrule2;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.service.Alertrule2ervice;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+@Controller
+@RequestMapping("/earlyWarnKnowledge")
+@Api(value = "预警知识" ,tags =  "预警知识")
+public class EarlyWarnKnowledgeController {
+
+    @Resource
+    private Alertrule2ervice alertrule2ervice;
+
+
+    @GetMapping("/earlyWarnKnowledgeList")
+    @ResponseBody
+    @ApiOperation(value = "预警知识列表", notes = "预警知识列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "name", value = "预警名称", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "category", value = "预警类型", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "rank", value = "预警级别", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult earlyWarnKnowledgeList(Tablepar tablepar, String name, String category, String rank) {
+
+
+        PageInfo<Alertrule2> pageInfo = new PageInfo<>();
+
+
+        pageInfo = alertrule2ervice.getAlertruleList(tablepar, name, category, rank);
+
+        if (null!=pageInfo) {
+            return AjaxResult.successData(AjaxStatus.success.code, pageInfo);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, pageInfo);
+        }
+
+    }
+
+    @GetMapping("/findFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "通过主键查询预警知识", notes = "通过主键查询预警知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult findFaultknowledge(String id) {
+
+
+        Alertrule2  po = new Alertrule2();
+
+        po = alertrule2ervice.findAlertrule2ById(id);
+
+        if (null!=po) {
+            return AjaxResult.successData(AjaxStatus.success.code, po);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, po);
+        }
+
+    }
+    @GetMapping("/updateFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "修改预警知识", notes = "修改预警知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "po", value = "预警知识对象", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult updateFaultknowledge(Alertrule2 po) {
+
+        int result =-1;
+        if(StringUtils.notEmp(po) && StringUtils.notEmp(po.getId()))
+        {
+            result =alertrule2ervice.updateAlertrule2(po);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+    }
+    @GetMapping("/insertFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "新增预警知识", notes = "新增预警知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "po", value = "预警知识对象", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult insertFaultknowledge(Alertrule2 po) {
+
+        int result =-1;
+        if(StringUtils.notEmp(po) )
+        {
+            result = alertrule2ervice.insertAlertrule2(po);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+
+    }
+    @GetMapping("/deleteFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "删除预警知识", notes = "删除预警知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "预警知识编号", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult deleteFaultknowledge(String id) {
+
+        int result =-1;
+        if(StringUtils.notEmp(id))
+        {
+            result =alertrule2ervice.deleteAlertrule2(id);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+    }
+
+
+}

+ 134 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/FaultKnowledgeController.java

@@ -0,0 +1,134 @@
+package com.gyee.frame.controller.health;
+
+import com.github.pagehelper.PageInfo;
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.P3DeviceFault;
+import com.gyee.frame.model.custom.Tablepar;
+import com.gyee.frame.service.health.FaultKnowledgeService;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+@Controller
+@RequestMapping("/faultknowledge")
+@Api(value = "故障知识" ,tags =  "故障知识")
+public class FaultKnowledgeController {
+
+    @Resource
+    private FaultKnowledgeService faultKnowledgeService;
+
+
+
+    @GetMapping("/faultknowledgeList")
+    @ResponseBody
+    @ApiOperation(value = "故障知识列表", notes = "故障知识列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tablepar", value = "分页排序对象", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "name", value = "故障名称", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "halttype", value = "停机类型", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "faultlevel", value = "故障级别", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult faultknowledgeList(Tablepar tablepar, String name, String halttype, String faultlevel) {
+
+
+        PageInfo<P3DeviceFault> pageInfo = new PageInfo<>();
+
+
+        pageInfo = faultKnowledgeService.findP3DeviceFaultList(tablepar, name, halttype, faultlevel);
+
+        if (null!=pageInfo) {
+            return AjaxResult.successData(AjaxStatus.success.code, pageInfo);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, pageInfo);
+        }
+
+    }
+
+    @GetMapping("/findFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "通过主键查询故障知识", notes = "通过主键查询故障知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult findFaultknowledge(String id) {
+
+
+        P3DeviceFault  po = new P3DeviceFault();
+
+        po = faultKnowledgeService.findP3DeviceFaultById(id);
+
+        if (null!=po) {
+            return AjaxResult.successData(AjaxStatus.success.code, po);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, po);
+        }
+
+    }
+    @GetMapping("/updateFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "修改故障知识", notes = "修改故障知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "po", value = "故障知识对象", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult updateFaultknowledge(P3DeviceFault po) {
+
+        int result =-1;
+        if(StringUtils.notEmp(po) && StringUtils.notEmp(po.getId()))
+        {
+            result =faultKnowledgeService.updateP3DeviceFault(po);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+    }
+    @GetMapping("/insertFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "新增故障知识", notes = "新增故障知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "po", value = "故障知识对象", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult insertFaultknowledge(P3DeviceFault po) {
+
+        int result =-1;
+        if(StringUtils.notEmp(po) )
+        {
+            result = faultKnowledgeService.insertP3DeviceFault(po);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+
+    }
+    @GetMapping("/deleteFaultknowledge")
+    @ResponseBody
+    @ApiOperation(value = "删除故障知识", notes = "删除故障知识")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "故障知识编号", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult deleteFaultknowledge(String id) {
+
+        int result =-1;
+        if(StringUtils.notEmp(id))
+        {
+            result =faultKnowledgeService.deleteP3DeviceFault(id);
+        }
+        if (result!=-1) {
+            return AjaxResult.successData(AjaxStatus.success.code, result);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, result);
+        }
+    }
+
+
+}

+ 122 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthMainController.java

@@ -0,0 +1,122 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.service.health.HealthMainService;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/healthmain")
+@Api(value = "健康管理主页面" ,tags =  "健康管理主页面")
+public class HealthMainController {
+
+    @Resource
+    private HealthMainService healthMainService;
+
+
+    @GetMapping("/findAllChart")
+    @ResponseBody
+    @ApiOperation(value = "获得健康状态情况图表", notes = "获得健康状态情况图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "num", value = "结果数量", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult findAllChart(String wpId, String num, String type) throws Exception {
+
+
+        Map<String, Object[]>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(wpId) && StringUtils.notEmp(num) && StringUtils.notEmp(type))
+        {
+            map = healthMainService.findAllChart(wpId,Integer.valueOf(num), Integer.valueOf(type));
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    @GetMapping("/findAllMap")
+    @ResponseBody
+    @ApiOperation(value = "获得全省健康状态基础数据", notes = "获得全省健康状态基础数据")
+    @ApiImplicitParams({
+           })
+    public AjaxResult findAllMap() throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        map = healthMainService.findAllMap();
+
+        if (null!=map && !map.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    @GetMapping("/findWpMap")
+    @ResponseBody
+    @ApiOperation(value = "获得场站健康状态基础数据", notes = "获得场站健康状态基础数据")
+    @ApiImplicitParams({
+    })
+    public AjaxResult findWpMap(String wpId) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+
+        if(StringUtils.notEmp(wpId))
+        {
+            map = healthMainService.findWpMap(wpId);
+        }
+
+
+        if (null!=map && !map.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+
+    @GetMapping("/findHealthMatrixMap")
+    @ResponseBody
+    @ApiOperation(value = "获得健康矩阵", notes = "获得健康矩阵")
+    @ApiImplicitParams({
+    })
+    public AjaxResult findHealthMatrixMap() throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+
+        map = healthMainService.findHealthMatrixMap();
+
+
+        if (null!=map && !map.isEmpty()) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+}

+ 144 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthOperationController.java

@@ -0,0 +1,144 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.custom.SimpleVo;
+import com.gyee.frame.service.ShutdowneventService;
+import com.gyee.frame.service.WarningRecordsService;
+import com.gyee.frame.service.health.HealthOperationService;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/healthoperation")
+@Api(value = "健康管理主页面" ,tags =  "健康管理主页面")
+public class HealthOperationController {
+
+    @Resource
+    private HealthOperationService healthOperationService;
+    @Resource
+    private ShutdowneventService shutdowneventService;
+    @Resource
+    private WarningRecordsService warningRecordsService;
+
+
+    @GetMapping("/countWpwarn")
+    @ResponseBody
+    @ApiOperation(value = "近7天报警事件统计 type 1风场2项目", notes = "近7天报警事件统计 ype 1风场2项目")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult countWpwarn(String type) throws Exception {
+
+
+        List<SimpleVo> vos = new ArrayList<>();
+
+        if(StringUtils.notEmp(type))
+        {
+            if(type.equals("1"))
+            {
+                vos = warningRecordsService.countWpwarnByWp();
+            }else  if(type.equals("2"))
+            {
+                vos = warningRecordsService.countWpwarnByPj();
+            }
+
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, vos);
+        }
+
+    }
+
+    @GetMapping("/countStop")
+    @ResponseBody
+    @ApiOperation(value = "近7天停机事件统计 type 1风场2项目", notes = "近7天停机事件统计 ype 1风场2项目")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult countStop(String type) throws Exception {
+
+
+        List<SimpleVo> vos = new ArrayList<>();
+
+        if(StringUtils.notEmp(type))
+        {
+            if(type.equals("1"))
+            {
+                vos = shutdowneventService.countStopByWp();
+            }else  if(type.equals("2"))
+            {
+                vos = shutdowneventService.countStopByPj();
+            }
+
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, vos);
+        }
+
+    }
+    @GetMapping("/countWpOrProStatus")
+    @ResponseBody
+    @ApiOperation(value = "健康状态占比图表 type 1风场2项目", notes = "健康状态占比图表 type 1风场2项目")
+    @ApiImplicitParams({
+                @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult countWpOrProStatus(String type) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(type))
+        {
+            map = healthOperationService.countWpOrProStatus(type);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    @GetMapping("/findWpOrProStatusForHistory")
+    @ResponseBody
+    @ApiOperation(value = "健康状态曲线图表 type 1风场2项目 status 1良好2注意", notes = "健康状态曲线图表 type 1风场2项目 status 1良好2注意")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态", required = true, dataType = "string", paramType = "query")})
+    public AjaxResult findWpOrProStatusForHistory(String type, String status) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(type) && StringUtils.notEmp(status))
+        {
+            map = healthOperationService.findWpOrProStatusForHistory(type,status);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+}

+ 495 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/HealthSubController.java

@@ -0,0 +1,495 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.custom.*;
+import com.gyee.frame.service.health.HealthSubService;
+import com.gyee.frame.service.weather.WeatherDay5Service;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Controller
+@RequestMapping("/healthsub")
+@Api(value = "健康管理风机页面" ,tags =  "健康管理风机页面")
+public class HealthSubController {
+
+    @Resource
+    private HealthSubService healthSubService;
+
+    @Resource
+    private WeatherDay5Service weatherDay5Service;
+
+
+    @GetMapping("/findWtHealthInfo")
+    @ResponseBody
+    @ApiOperation(value = "获取健康管理风机信息", notes = "获取健康管理风机信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult findWtHealthInfo(String wtId) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+
+            Calendar cal = Calendar.getInstance();
+
+            Date recodedate = DateUtils.truncate(cal.getTime());
+            //获取故障类型和风机健康得分
+            Map<String,String>  stoptypemap = healthSubService.findWtInfo(wtId);
+            //获取健康管理风机部件基础信息
+            Map<String, Map<String, Object>>  partmap = healthSubService.findPartHealthInfo(wtId);
+            //故障数据统计
+            List<GzfxVo>  gzls = healthSubService.initalGzjfx(wtId,recodedate);
+            //预警数据统计
+            List<YjfxVo>  yjls = healthSubService.initalYjfx(wtId,recodedate);
+            //部件运行数据
+            List<YxfxVo>  bjyxls = healthSubService.initalYxfx(wtId,recodedate);
+            //获得日、月等级评估
+            List<XnfxVo>  djpgls = healthSubService.initalXnfx(wtId,cal);
+            //当日停机
+            List<ShutdowneventVo>  stopls = healthSubService.initalShutdown(wtId);
+            //各个区间曲线偏差率
+            List<QxpcVo>  qxpcls = healthSubService.findQxpcList(wtId);
+            //温度范围
+            List<YxfxVo>  wdls = healthSubService.findWdList(wtId);
+            //获得健康评价列表
+            List<ValueVo>  jkls = healthSubService.findJudgmentList(wtId);
+
+
+            map.put("stoptypemap",stoptypemap);
+            map.put("partmap",partmap);
+            map.put("gzls",gzls);
+            map.put("yjls",yjls);
+            map.put("bjyxls",bjyxls);
+            map.put("djpgls",djpgls);
+            map.put("stopls",stopls);
+            map.put("qxpcls",qxpcls);
+            map.put("wdls",wdls);
+            map.put("jkls",jkls);
+
+
+
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    @GetMapping("/findWtHealthInfo1")
+    @ResponseBody
+    @ApiOperation(value = "获取健康管理风机信息", notes = "获取健康管理风机信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult findWtHealthInfo1(String wtId) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+
+            Calendar cal = Calendar.getInstance();
+
+            Date recodedate = DateUtils.truncate(cal.getTime());
+//            //获取故障类型和风机健康得分
+//            Map<String,String>  stoptypemap = healthSubService.findWtInfo(wtId);
+//            //获取健康管理风机部件基础信息
+//            Map<String, Map<String, Object>>  partmap = healthSubService.findPartHealthInfo(wtId);
+//            //故障数据统计
+//            List<GzfxVo>  gzls = healthSubService.initalGzjfx(wtId,recodedate);
+//            //预警数据统计
+//            List<YjfxVo>  yjls = healthSubService.initalYjfx(wtId,recodedate);
+//            //部件运行数据
+//            List<YxfxVo>  bjyxls = healthSubService.initalYxfx(wtId,recodedate);
+//            //获得日、月等级评估
+//            List<XnfxVo>  djpgls = healthSubService.initalXnfx(wtId,cal);
+//            //当日停机
+//            List<ShutdowneventVo>  stopls = healthSubService.initalShutdown(wtId);
+//            //各个区间曲线偏差率
+//            List<QxpcVo>  qxpcls = healthSubService.findQxpcList(wtId);
+//            //温度范围
+//            List<YxfxVo>  wdls = healthSubService.findWdList(wtId);
+//            //获得健康评价列表
+//            List<ValueVo>  jkls = healthSubService.findJudgmentList(wtId);
+//
+//
+//            map.put("stoptypemap",stoptypemap);
+//            map.put("partmap",partmap);
+//            map.put("gzls",gzls);
+//            map.put("yjls",yjls);
+//            map.put("bjyxls",bjyxls);
+//            map.put("djpgls",djpgls);
+//            map.put("stopls",stopls);
+//            map.put("qxpcls",qxpcls);
+//            map.put("wdls",wdls);
+//            map.put("jkls",jkls);
+
+            //获取故障类型和风机健康得分
+            Map<String,String>  stoptypemap = healthSubService.findWtInfo(wtId);
+            //获取健康管理风机部件基础信息
+            Map<String, Map<String, Object>>  partmap = healthSubService.findPartHealthInfo(wtId);
+            //故障数据统计
+            List<GzfxVo>  gzls = healthSubService.initalGzjfx(wtId,recodedate);
+            //预警数据统计
+            List<YjfxVo>  yjls = healthSubService.initalYjfx(wtId,recodedate);
+
+
+            map.put("stoptypemap",stoptypemap);
+            map.put("partmap",partmap);
+            map.put("gzls",gzls);
+            map.put("yjls",yjls);
+
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+/********************************************************************************************************/
+
+
+@GetMapping("/findWtHealthInfo2")
+@ResponseBody
+@ApiOperation(value = "获取健康管理风机信息", notes = "获取健康管理风机信息")
+@ApiImplicitParams({
+        @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+})
+public AjaxResult findWtHealthInfo2(String wtId) throws Exception {
+
+
+    Map<String, Object>  map = new HashMap<>();
+
+    if(StringUtils.notEmp(wtId))
+    {
+
+
+        Calendar cal = Calendar.getInstance();
+
+        Date recodedate = DateUtils.truncate(cal.getTime());
+
+        //部件运行数据
+        List<YxfxVo>  bjyxls = healthSubService.initalYxfx(wtId,recodedate);
+        //获得日、月等级评估
+        List<XnfxVo>  djpgls = healthSubService.initalXnfx(wtId,cal);
+        //当日停机
+        List<ShutdowneventVo>  stopls = healthSubService.initalShutdown(wtId);
+
+
+        map.put("bjyxls",bjyxls);
+        map.put("djpgls",djpgls);
+        map.put("stopls",stopls);
+
+    }
+
+    if (null!=map) {
+        return AjaxResult.successData(AjaxStatus.success.code, map);
+    } else {
+        return AjaxResult.successData(AjaxStatus.error.code, map);
+    }
+
+}
+
+    /********************************************************************************************************/
+
+    @GetMapping("/findWtHealthInfo3")
+    @ResponseBody
+    @ApiOperation(value = "获取健康管理风机信息", notes = "获取健康管理风机信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult findWtHealthInfo3(String wtId) throws Exception {
+
+
+        Map<String, Object>  map = new HashMap<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+
+            Calendar cal = Calendar.getInstance();
+
+            Date recodedate = DateUtils.truncate(cal.getTime());
+
+            //各个区间曲线偏差率
+            List<QxpcVo>  qxpcls = healthSubService.findQxpcList(wtId);
+            //温度范围
+            List<YxfxVo>  wdls = healthSubService.findWdList(wtId);
+            //获得健康评价列表
+            List<ValueVo>  jkls = healthSubService.findJudgmentList(wtId);
+
+
+            map.put("qxpcls",qxpcls);
+            map.put("wdls",wdls);
+            map.put("jkls",jkls);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    /********************************************************************************************************/
+
+    @GetMapping("/gadaytop5")
+    @ResponseBody
+    @ApiOperation(value = "获得等级评估前5数据", notes = "获得等级评估前5数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult gadaytop5(String wtId) throws Exception {
+
+
+        Map<String, Object> map = new HashMap<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+            map = healthSubService.gadaytop5(wtId);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+
+    @GetMapping("/queryStopTop10")
+    @ResponseBody
+    @ApiOperation(value = "获取最新的十次停机事件", notes = "获取最新的十次停机事件")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult queryStopTop10(String wtId) throws Exception {
+
+
+        List<ShutdowneventVo> vos = new ArrayList<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+            vos = healthSubService.queryStopTop10(wtId);
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, vos);
+        }
+
+    }
+
+
+    @GetMapping("/getWtMttrandMtbfByBj")
+    @ResponseBody
+    @ApiOperation(value = "获取风机部件MTTR和MTBF  数组 0健康状态、1部件名称 2 7天健康状态 3 故障进度 4 mtbf 5 mttr 6损失电量", notes = "获取风机部件MTTR和MTBF 数组 0健康状态、1部件名称 2 7天健康状态 3 故障进度 4 mtbf 5 mttr 6损失电量")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult getWtMttrandMtbfByBj(String wtId) throws Exception {
+
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+            map = healthSubService.getWtMttrandMtbfByBj(wtId);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+    @GetMapping("/getWeatherRealDay5Info")
+    @ResponseBody
+    @ApiOperation(value = "获取近5天气象数据", notes = "获取近5天气象数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult getWeatherRealDay5Info(String wpId) throws Exception {
+
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        if(StringUtils.notEmp(wpId))
+        {
+
+            map = weatherDay5Service.getWeatherRealDay5Info(wpId);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+
+
+    @GetMapping("/findPowerChar")
+    @ResponseBody
+    @ApiOperation(value = "获得实际功率和理论功率曲线", notes = "获得实际功率和理论功率曲线")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult findPowerChar(String wtId) throws Exception {
+
+
+        Map<String, Object[]> map = new HashMap<>();
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+            map = healthSubService.findPowerChar(wtId);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+/**************************************************************************************************************************************************/
+
+    @GetMapping("/hsFjValueIndex")
+    @ResponseBody
+    @ApiOperation(value = "获取部件图表", notes = "获取部件图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult hsFjValueIndex(String wtId) throws Exception {
+
+
+        ActivityVo vo = new ActivityVo();
+
+        if(StringUtils.notEmp(wtId))
+        {
+            Calendar cal = Calendar.getInstance();
+
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+
+
+            Date endDate = cal.getTime();
+
+            cal.add(Calendar.DAY_OF_MONTH, -1);
+            Date beginDate = cal.getTime();
+            vo = healthSubService.hsFjValueIndex(wtId,beginDate,endDate);
+        }
+
+        if (null!=vo) {
+            return AjaxResult.successData(AjaxStatus.success.code, vo);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, vo);
+        }
+
+    }
+
+
+    @GetMapping("/findWtHisValueForBj")
+    @ResponseBody
+    @ApiOperation(value = "获取风机部件健康曲线图表", notes = "获取风机部件健康曲线图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult findWtHisValueForBj(String wtId) throws Exception {
+
+
+        Map<String,Object> map = new HashMap();
+
+
+        if(StringUtils.notEmp(wtId))
+        {
+
+            map = healthSubService.findWtHisValueForBj(wtId);
+        }
+
+        if (null!=map) {
+            return AjaxResult.successData(AjaxStatus.success.code, map);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, map);
+        }
+
+    }
+
+
+    @GetMapping("/hsFjValueIndexByPart")
+    @ResponseBody
+    @ApiOperation(value = "获取风机健康部件曲线图", notes = "获取风机健康部件曲线图")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "type", value = "部件类型", required = true, dataType = "string", paramType = "query")
+    })
+    public AjaxResult hsFjValueIndexByPart(String wtId,String type) throws Exception {
+
+        Map<String, Object> result = new HashMap<String, Object>();
+        ActivityVo vo=new ActivityVo();
+
+        if(StringUtils.notEmp(wtId) && StringUtils.notEmp(type))
+        {
+            if (type.equals("1")) {
+                vo = healthSubService.getWTChart(wtId);
+            } else if (type.equals("2")) {
+                vo = healthSubService.getClxChart(wtId);
+            } else if (type.equals("3")) {
+                vo = healthSubService.getFdjChart(wtId);
+            } else if (type.equals("4")) {
+                vo = healthSubService.getKzysChart(wtId);
+            } else if (type.equals("5")) {
+                vo = healthSubService.getJcxtChart(wtId);
+            }
+
+            result.put(wtId, healthSubService.getrealValue(wtId, type));
+        }
+
+
+        result.put("activity", vo);
+
+        if (null!=vo) {
+            return AjaxResult.successData(AjaxStatus.success.code, vo);
+        } else {
+            return AjaxResult.successData(AjaxStatus.error.code, vo);
+        }
+
+    }
+
+}

+ 81 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/LossPowerRateHealthController.java

@@ -0,0 +1,81 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.LossPowerRate;
+import com.gyee.frame.service.LossPowerRateService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+@RequestMapping("/losspowerratehealth")
+@Api(value = "性能损失走势" ,tags =  "性能损失走势")
+public class LossPowerRateHealthController {
+
+    @Resource
+    private LossPowerRateService lossPowerRateService;
+
+    /**性能损失走势列表**/
+    @GetMapping("/losspowerrateList")
+    @ResponseBody
+    @ApiOperation(value = "性能损失走势列表", notes = "性能损失走势列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult losspowerrateList(String wtId,String beginDate,String endDate) throws Exception {
+
+       List<LossPowerRate>  vos = new ArrayList<LossPowerRate>();
+        if (StringUtils.notEmp(wtId) && StringUtils.notEmp(beginDate) && StringUtils.notEmp(endDate))
+        {
+            vos=lossPowerRateService.getLossPowerRateListBywtId(wtId, DateUtils.parseStrtoDate(beginDate), DateUtils.parseStrtoDate(endDate));
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**性能损失走势图表**/
+    @GetMapping("/getChartlist")
+    @ResponseBody
+    @ApiOperation(value = "性能损失走势图表", notes = "性能损失走势图表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风机编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "beginDate", value = "开始日期", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult getChartlist(String wtId,String beginDate,String endDate) throws Exception {
+
+        List<List<List<Object>>>  vos = new ArrayList<>();
+        if (StringUtils.notEmp(wtId) && StringUtils.notEmp(beginDate) && StringUtils.notEmp(endDate))
+        {
+            vos=lossPowerRateService.getChartlist(wtId, DateUtils.parseStrtoDate(beginDate), DateUtils.parseStrtoDate(endDate));
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+}

+ 80 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/PartBjController.java

@@ -0,0 +1,80 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.custom.PartbjcountVo;
+import com.gyee.frame.model.custom.WindturbinebjCountVo;
+import com.gyee.frame.service.health.PartBjService;
+import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+@RequestMapping("/partbj")
+@Api(value = "批次报警分析" ,tags =  "批次报警分析")
+public class PartBjController {
+
+    @Resource
+    private PartBjService partBjService;
+
+    /**批次报警分析**/
+    @GetMapping("/partbjList")
+    @ResponseBody
+    @ApiOperation(value = "批次报警分析主列表", notes = "批次报警分析主列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult partbjList(String recorddate) throws Exception {
+
+        List<PartbjcountVo> vos = new ArrayList<PartbjcountVo>();
+        if (StringUtils.notEmp(recorddate))
+        {
+            vos=partBjService.getPartBjCountList(DateUtils.parseStrtoDate(recorddate));
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    /**批次报警分析**/
+    @GetMapping("/partbjsubList")
+    @ResponseBody
+    @ApiOperation(value = "批次报警分析明细列表", notes = "批次报警分析明细列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lnid", value = "线路编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "part", value = "部件编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "recorddate", value = "日期", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult partbjsubList(String lnid, String part, String recorddate) throws Exception {
+
+        List<WindturbinebjCountVo> vos = new ArrayList<WindturbinebjCountVo>();
+        if (StringUtils.notEmp(recorddate))
+        {
+            vos=partBjService.getWindturbinebjCountVoList(lnid,  part,DateUtils.parseStrtoDate(recorddate));
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+}

+ 123 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/ReliabilityAnalysisController.java

@@ -0,0 +1,123 @@
+package com.gyee.frame.controller.health;
+
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.common.feign.RemoteServiceBuilder;
+import com.gyee.frame.mapper.auto.WindturbineMapper;
+import com.gyee.frame.model.auto.*;
+import com.gyee.frame.model.custom.export.TsPointData;
+import com.gyee.frame.service.Alertrule2ervice;
+import com.gyee.frame.service.WindTurbineTestingPointAiService;
+import com.gyee.frame.service.WindTurbineTestingPointDiService;
+import com.gyee.frame.service.health.MetricsService;
+import com.gyee.frame.service.health.MetricsUniformCodeService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/analysis")
+@Api(value = "可靠性分析" ,tags =  "可靠性分析")
+public class ReliabilityAnalysisController {
+
+    @Resource
+    private Alertrule2ervice alertrule2ervice;
+    @Resource
+    private RemoteServiceBuilder remoteService;
+    @Resource
+    private MetricsService metricsService;
+    @Resource
+    private MetricsUniformCodeService uniformCodeService;
+    @Resource
+    private WindTurbineTestingPointAiService windAIService;
+    @Resource
+    private WindTurbineTestingPointDiService windDIService;
+    @Autowired
+    private WindturbineMapper windturbineMapper;
+
+
+    /**
+     * 查询报警规则中点的数据
+     * @param station
+     * @param wtId
+     * @param name
+     * @param startTs
+     * @param endTs
+     * @return
+     */
+    @GetMapping("/detail")
+    public AjaxResult analysisDetails(
+            @RequestParam(name = "station") String station,
+            @RequestParam(name = "wtId") String wtId,
+            @RequestParam(name = "name") String name,
+            @RequestParam(name = "startTs") long startTs,
+            @RequestParam(name = "endTs") long endTs,
+            @RequestParam(name = "interval", required = false) Optional<Integer> interval){
+
+        List<Object> list = new ArrayList<>();
+        Windturbine wtmid = windturbineMapper.selectByPrimaryKey(wtId);
+
+        List<String> codes = alertrule2ervice.getUniformCodeByNameAndStation(name, station, wtmid.getModelid());
+        if (codes == null || codes.size() == 0)
+            return AjaxResult.successData(AjaxStatus.success.code, list);
+
+        for (String code : codes){
+            Map<String, Object> map = new HashMap<>();
+            if (code.startsWith("AI")){
+                WindTurbineTestingPointAi windAI = windAIService.getWindTurbineTestingPointAi2(wtId, code);
+                List<TsPointData> data = null;
+                if (interval.isPresent() && interval.get() > 0)
+                    data = remoteService.ShardingService().getHistorySnap(windAI.getId(), startTs, endTs, interval.get());
+                else
+                    data = remoteService.ShardingService().getHistoryRaw(windAI.getId(), startTs, endTs);
+
+                // 查询点的单位和描述属性
+                String unit = "--";
+                String desc = "----";
+                /*List<MetricsUniformCode> metricsList = uniformCodeService.getListByStationAndUniforCode(station, windAI.getUniformcode());
+                if (metricsList != null && metricsList.size() > 0) {
+                    MetricsUniformCode metricsUniformCode = metricsList.get(0);
+                    List<Metrics> metrics = metricsService.getMetricsByMetricsId(metricsUniformCode.getMetricid());
+                    if (metrics != null && metrics.size() > 0){
+                        unit = metrics.get(0).getUnitname();
+                        desc = metrics.get(1).getMetricname();
+                    }
+                }*/
+                MetricsCode metrics=uniformCodeService.getListName(wtId,windAI.getUniformcode());
+                String nm = metrics==null?"":metrics.getName();
+                map.put("unit", unit);
+                map.put("name", nm);
+                map.put("data", data);
+
+                list.add(map);
+            }
+        }
+
+        return AjaxResult.successData(AjaxStatus.success.code, list);
+    }
+
+
+    @Resource
+    WindTurbineTestingPointAiService windTurbineTestingPointAiService;
+
+    @GetMapping("/test")
+    public AjaxResult get(){
+        List<String> list = alertrule2ervice.getUniformCodeByNameAndStations();
+
+        List<String> modelID = alertrule2ervice.getModelID();
+
+
+//        for (String model : modelID)
+//            System.out.println(model);
+
+        List<String> winds = windTurbineTestingPointAiService.findPointByUniformcode(list, modelID);
+
+        return AjaxResult.successData(AjaxStatus.success.code, winds);
+    }
+
+}

+ 97 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/StopAnalysisController.java

@@ -0,0 +1,97 @@
+package com.gyee.frame.controller.health;
+
+import com.gyee.frame.common.conf.AjaxStatus;
+import com.gyee.frame.common.domain.AjaxResult;
+import com.gyee.frame.model.auto.StopAnalysismainVo;
+import com.gyee.frame.model.custom.StopAnalysisNodeVo;
+import com.gyee.frame.service.stopanalysis.StopAnalysisStaticService;
+import com.gyee.frame.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+@RequestMapping("/stopanalysis")
+@Api(value = "故障诊断" ,tags =  "故障诊断")
+public class StopAnalysisController {
+
+    @Resource
+    private StopAnalysisStaticService stopAnalysisStaticService;
+
+
+    @GetMapping("/stopAnalysisList")
+    @ResponseBody
+    @ApiOperation(value = "故障诊断列表", notes = "故障诊断列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "modelId", value = "模型编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "typeId", value = "时间类型", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult stopAnalysisList( String wpId, String modelId, String typeId) throws Exception {
+
+        List<StopAnalysismainVo> vos = new ArrayList<StopAnalysismainVo>();
+        if (StringUtils.notEmp(wpId) && StringUtils.notEmp(modelId)&& StringUtils.notEmp(typeId))
+        {
+
+            vos=stopAnalysisStaticService.stopAnalysisList(wpId, modelId, typeId);
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    @GetMapping("/stopAnalysisTree")
+    @ResponseBody
+    @ApiOperation(value = "故障诊断部件树", notes = "故障诊断部件树")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wtId", value = "风场编号", required = true, dataType = "string", paramType = "query")})
+
+    public AjaxResult stopAnalysisTree( String mainId,String wtId, String values) throws Exception {
+
+        List<StopAnalysisNodeVo> vos = new ArrayList<StopAnalysisNodeVo>();
+        if (StringUtils.notEmp(mainId) && StringUtils.notEmp(wtId) && StringUtils.notEmp(values))
+        {
+
+            vos=stopAnalysisStaticService.findLocationTreeByWtId(mainId,wtId,values);
+        }
+
+        if (null!=vos) {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        } else {
+            return AjaxResult.successData(AjaxStatus.success.code, vos);
+        }
+
+    }
+
+    @GetMapping("/saveStopAnalysis")
+    @ResponseBody
+    @ApiOperation(value = "保存故障诊断结果", notes = "保存故障诊断结果")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "wpId", value = "风场编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "modelId", value = "模型编号", required = true, dataType = "string", paramType = "query"),
+            @ApiImplicitParam(name = "typeId", value = "时间类型", required = true, dataType = "string", paramType = "query")})
+
+        public AjaxResult saveStopAnalysis( String wpId, String modelId, String typeId) throws Exception {
+
+
+        stopAnalysisStaticService.saveStopAnalysis(wpId, modelId, typeId);
+
+        return AjaxResult.successData(AjaxStatus.success.code, "保存成功!");
+
+    }
+
+}

+ 0 - 0
web/monitor-web-hb/src/main/java/com/gyee/frame/controller/health/WindTurbineCurveController.java


Some files were not shown because too many files changed in this diff