diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/src/main/java/com/casic/util/WebSocket.java b/src/main/java/com/casic/util/WebSocket.java index 1ee283f..4503c06 100644 --- a/src/main/java/com/casic/util/WebSocket.java +++ b/src/main/java/com/casic/util/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.util; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -17,6 +18,7 @@ * 此注解相当于设置访问URL */ @Component +@Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; @@ -29,24 +31,24 @@ this.session = session; webSockets.add(this); sessionPool.put(userId, session); - System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("{}【websocket消息】有新的连接,总数为: {}", userId, webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); - System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + log.info("【websocket消息】连接断开,总数为: {}",webSockets.size()); } @OnMessage public void onMessage(String message) { - System.out.println("【websocket消息】收到客户端消息:" + message); + log.info("【websocket消息】收到客户端消息: {}", message); } // 此为广播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { - System.out.println("【websocket消息】广播消息:" + message); + log.info("【websocket消息】广播消息: {}", message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { @@ -57,7 +59,7 @@ // 发送列表消息 public void sendListMessage(List userIds, String message) { - System.out.println("【websocket消息】列表消息:" + message); + log.info("【websocket消息】列表消息: {}", message); for (String userId : userIds) { Session session = sessionPool.get(userId); if (session != null) { @@ -70,26 +72,9 @@ } } - // 发送列表消息 - -// public void sendListMessage(List userIds, Object data){ -// System.out.println("【websocket消息】列表消息:"+data); -// for (String userId : userIds) { -// Session session = sessionPool.get(userId); -// if (session != null) { -// try { -//// session.getAsyncRemote().sendText(message); -// session.getAsyncRemote().sendObject(data); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } - // 此为单点消息 public void sendOneMessage(String userId, String message) { - System.out.println("【websocket消息】单点消息:" + message); + log.info("【websocket消息】单点消息: {}", message); Session session = sessionPool.get(userId); if (session != null) { try { diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/src/main/java/com/casic/util/WebSocket.java b/src/main/java/com/casic/util/WebSocket.java index 1ee283f..4503c06 100644 --- a/src/main/java/com/casic/util/WebSocket.java +++ b/src/main/java/com/casic/util/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.util; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -17,6 +18,7 @@ * 此注解相当于设置访问URL */ @Component +@Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; @@ -29,24 +31,24 @@ this.session = session; webSockets.add(this); sessionPool.put(userId, session); - System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("{}【websocket消息】有新的连接,总数为: {}", userId, webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); - System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + log.info("【websocket消息】连接断开,总数为: {}",webSockets.size()); } @OnMessage public void onMessage(String message) { - System.out.println("【websocket消息】收到客户端消息:" + message); + log.info("【websocket消息】收到客户端消息: {}", message); } // 此为广播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { - System.out.println("【websocket消息】广播消息:" + message); + log.info("【websocket消息】广播消息: {}", message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { @@ -57,7 +59,7 @@ // 发送列表消息 public void sendListMessage(List userIds, String message) { - System.out.println("【websocket消息】列表消息:" + message); + log.info("【websocket消息】列表消息: {}", message); for (String userId : userIds) { Session session = sessionPool.get(userId); if (session != null) { @@ -70,26 +72,9 @@ } } - // 发送列表消息 - -// public void sendListMessage(List userIds, Object data){ -// System.out.println("【websocket消息】列表消息:"+data); -// for (String userId : userIds) { -// Session session = sessionPool.get(userId); -// if (session != null) { -// try { -//// session.getAsyncRemote().sendText(message); -// session.getAsyncRemote().sendObject(data); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } - // 此为单点消息 public void sendOneMessage(String userId, String message) { - System.out.println("【websocket消息】单点消息:" + message); + log.info("【websocket消息】单点消息: {}", message); Session session = sessionPool.get(userId); if (session != null) { try { diff --git a/src/main/resources/config/application-dz.yml b/src/main/resources/config/application-dz.yml index d1474a4..64eaf8a 100644 --- a/src/main/resources/config/application-dz.yml +++ b/src/main/resources/config/application-dz.yml @@ -1,4 +1,5 @@ - +server: + port: 11307 ################### spring配置 ################### spring: datasource: @@ -9,8 +10,8 @@ session: store-type: redis redis: - host: 10.80.1.124 - port: 31681 + host: 10.80.0.171 + port: 6379 password: redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer @@ -24,10 +25,11 @@ init: enable: false spring-session-open: false #开启spring session - no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm + no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm,/websocket/* logging: - level.root: error - level.com.casic: info + level: + root: error + com.casic: info file: path: logs/ name: missiles.log \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/src/main/java/com/casic/util/WebSocket.java b/src/main/java/com/casic/util/WebSocket.java index 1ee283f..4503c06 100644 --- a/src/main/java/com/casic/util/WebSocket.java +++ b/src/main/java/com/casic/util/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.util; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -17,6 +18,7 @@ * 此注解相当于设置访问URL */ @Component +@Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; @@ -29,24 +31,24 @@ this.session = session; webSockets.add(this); sessionPool.put(userId, session); - System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("{}【websocket消息】有新的连接,总数为: {}", userId, webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); - System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + log.info("【websocket消息】连接断开,总数为: {}",webSockets.size()); } @OnMessage public void onMessage(String message) { - System.out.println("【websocket消息】收到客户端消息:" + message); + log.info("【websocket消息】收到客户端消息: {}", message); } // 此为广播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { - System.out.println("【websocket消息】广播消息:" + message); + log.info("【websocket消息】广播消息: {}", message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { @@ -57,7 +59,7 @@ // 发送列表消息 public void sendListMessage(List userIds, String message) { - System.out.println("【websocket消息】列表消息:" + message); + log.info("【websocket消息】列表消息: {}", message); for (String userId : userIds) { Session session = sessionPool.get(userId); if (session != null) { @@ -70,26 +72,9 @@ } } - // 发送列表消息 - -// public void sendListMessage(List userIds, Object data){ -// System.out.println("【websocket消息】列表消息:"+data); -// for (String userId : userIds) { -// Session session = sessionPool.get(userId); -// if (session != null) { -// try { -//// session.getAsyncRemote().sendText(message); -// session.getAsyncRemote().sendObject(data); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } - // 此为单点消息 public void sendOneMessage(String userId, String message) { - System.out.println("【websocket消息】单点消息:" + message); + log.info("【websocket消息】单点消息: {}", message); Session session = sessionPool.get(userId); if (session != null) { try { diff --git a/src/main/resources/config/application-dz.yml b/src/main/resources/config/application-dz.yml index d1474a4..64eaf8a 100644 --- a/src/main/resources/config/application-dz.yml +++ b/src/main/resources/config/application-dz.yml @@ -1,4 +1,5 @@ - +server: + port: 11307 ################### spring配置 ################### spring: datasource: @@ -9,8 +10,8 @@ session: store-type: redis redis: - host: 10.80.1.124 - port: 31681 + host: 10.80.0.171 + port: 6379 password: redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer @@ -24,10 +25,11 @@ init: enable: false spring-session-open: false #开启spring session - no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm + no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm,/websocket/* logging: - level.root: error - level.com.casic: info + level: + root: error + com.casic: info file: path: logs/ name: missiles.log \ No newline at end of file diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index f354d1d..65e0809 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -10,7 +10,7 @@ pathmatch: matching-strategy: ant_path_matcher server: - port: 11314 + port: 11307 mybatis-plus: global-config: enable-sql-runner: true @@ -30,22 +30,23 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 + host: 10.80.0.171 port: 6379 - password: ew5T4K3#203lwh + password: config-prefix: 'Casic:' #下发配置,key前缀 apn: "dashoa.sc.iot" # 平台对应的apn appName: "XLJCYJ" #应用名称-泄露监测预警 appUrl: "http://10.80.12.33" #普光服务的url online: cron: 0 0 0/1 * * ? # 多长时间判断离线 - transfer-user: - cron: 0 0/1 * * * ? # 数据同步,每天凌晨0点、中午12点各进行同步一次 0 0 0,12 * * ? - partition: - cron: 0 0 0 * * ? - data-day: 3 #多少天为离线 + data-day: 1 #多少天为离线 type: 14 #硫化氢 + sms: + url: http://10.75.240.177/send + name: zhangb9987 + token: 4D0E6A690C1845E0A8DF76D8C9C5E6B2 + system-name: "采气厂硫化氢泄漏监测系统" swagger: enable: true - groupName: "硫化氢课题" \ No newline at end of file + groupName: "采气厂硫化氢泄漏监测系统" \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/src/main/java/com/casic/util/WebSocket.java b/src/main/java/com/casic/util/WebSocket.java index 1ee283f..4503c06 100644 --- a/src/main/java/com/casic/util/WebSocket.java +++ b/src/main/java/com/casic/util/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.util; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -17,6 +18,7 @@ * 此注解相当于设置访问URL */ @Component +@Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; @@ -29,24 +31,24 @@ this.session = session; webSockets.add(this); sessionPool.put(userId, session); - System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("{}【websocket消息】有新的连接,总数为: {}", userId, webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); - System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + log.info("【websocket消息】连接断开,总数为: {}",webSockets.size()); } @OnMessage public void onMessage(String message) { - System.out.println("【websocket消息】收到客户端消息:" + message); + log.info("【websocket消息】收到客户端消息: {}", message); } // 此为广播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { - System.out.println("【websocket消息】广播消息:" + message); + log.info("【websocket消息】广播消息: {}", message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { @@ -57,7 +59,7 @@ // 发送列表消息 public void sendListMessage(List userIds, String message) { - System.out.println("【websocket消息】列表消息:" + message); + log.info("【websocket消息】列表消息: {}", message); for (String userId : userIds) { Session session = sessionPool.get(userId); if (session != null) { @@ -70,26 +72,9 @@ } } - // 发送列表消息 - -// public void sendListMessage(List userIds, Object data){ -// System.out.println("【websocket消息】列表消息:"+data); -// for (String userId : userIds) { -// Session session = sessionPool.get(userId); -// if (session != null) { -// try { -//// session.getAsyncRemote().sendText(message); -// session.getAsyncRemote().sendObject(data); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } - // 此为单点消息 public void sendOneMessage(String userId, String message) { - System.out.println("【websocket消息】单点消息:" + message); + log.info("【websocket消息】单点消息: {}", message); Session session = sessionPool.get(userId); if (session != null) { try { diff --git a/src/main/resources/config/application-dz.yml b/src/main/resources/config/application-dz.yml index d1474a4..64eaf8a 100644 --- a/src/main/resources/config/application-dz.yml +++ b/src/main/resources/config/application-dz.yml @@ -1,4 +1,5 @@ - +server: + port: 11307 ################### spring配置 ################### spring: datasource: @@ -9,8 +10,8 @@ session: store-type: redis redis: - host: 10.80.1.124 - port: 31681 + host: 10.80.0.171 + port: 6379 password: redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer @@ -24,10 +25,11 @@ init: enable: false spring-session-open: false #开启spring session - no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm + no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm,/websocket/* logging: - level.root: error - level.com.casic: info + level: + root: error + com.casic: info file: path: logs/ name: missiles.log \ No newline at end of file diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index f354d1d..65e0809 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -10,7 +10,7 @@ pathmatch: matching-strategy: ant_path_matcher server: - port: 11314 + port: 11307 mybatis-plus: global-config: enable-sql-runner: true @@ -30,22 +30,23 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 + host: 10.80.0.171 port: 6379 - password: ew5T4K3#203lwh + password: config-prefix: 'Casic:' #下发配置,key前缀 apn: "dashoa.sc.iot" # 平台对应的apn appName: "XLJCYJ" #应用名称-泄露监测预警 appUrl: "http://10.80.12.33" #普光服务的url online: cron: 0 0 0/1 * * ? # 多长时间判断离线 - transfer-user: - cron: 0 0/1 * * * ? # 数据同步,每天凌晨0点、中午12点各进行同步一次 0 0 0,12 * * ? - partition: - cron: 0 0 0 * * ? - data-day: 3 #多少天为离线 + data-day: 1 #多少天为离线 type: 14 #硫化氢 + sms: + url: http://10.75.240.177/send + name: zhangb9987 + token: 4D0E6A690C1845E0A8DF76D8C9C5E6B2 + system-name: "采气厂硫化氢泄漏监测系统" swagger: enable: true - groupName: "硫化氢课题" \ No newline at end of file + groupName: "采气厂硫化氢泄漏监测系统" \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f02731e..f80e854 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@
+ cn.hutool + hutool-all + 5.8.31 + + + mysql mysql-connector-java 8.0.16 diff --git a/src/main/java/com/casic/config/CorsConfig.java b/src/main/java/com/casic/config/CorsConfig.java deleted file mode 100644 index 1615fb8..0000000 --- a/src/main/java/com/casic/config/CorsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -//package com.casic.config; -// -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.cors.CorsConfiguration; -//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -//import org.springframework.web.filter.CorsFilter; -// -///** -// * 基础框架 - 跨域请求配置 -// */ -//@Configuration -//public class CorsConfig { -// @Bean -// public CorsFilter corsFilter() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// source.registerCorsConfiguration("/**", buildConfig()); -// return new CorsFilter(source); -// } -// -// private CorsConfiguration buildConfig() { -// CorsConfiguration corsConfiguration = new CorsConfiguration(); -// // 1允许任何域名使用 -// corsConfiguration.addAllowedOrigin("*"); -// // 2允许任何头 -// corsConfiguration.addAllowedHeader("*"); -// // 3允许任何方法(post、get等) -// corsConfiguration.addAllowedMethod("*"); -// return corsConfiguration; -// } -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/Knife4jConfiguration.java b/src/main/java/com/casic/config/Knife4jConfiguration.java deleted file mode 100644 index 726a42f..0000000 --- a/src/main/java/com/casic/config/Knife4jConfiguration.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.casic.config; -// -//import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import springfox.documentation.builders.ApiInfoBuilder; -//import springfox.documentation.builders.PathSelectors; -//import springfox.documentation.builders.RequestHandlerSelectors; -//import springfox.documentation.spi.DocumentationType; -//import springfox.documentation.spring.web.plugins.Docket; -// -//@Configuration -//@EnableKnife4j -//public class Knife4jConfiguration { -// -// @Value(value = "${swagger.enable}") -// public boolean enable; -// @Value(value = "${swagger.groupName}") -// public String groupName; -// -// @Bean(value = "dockerBean") -// public Docket dockerBean() { -// return new Docket(DocumentationType.SWAGGER_2) -// .apiInfo(new ApiInfoBuilder() -// //描述字段支持Markdown语法 -// .description("# Knife4j RESTful APIs") -// .termsOfServiceUrl("https://doc.casic.com/") -// .version("1.0") -// .build()) -// //分组名称 -// .groupName(groupName) -// .select() -// .apis(RequestHandlerSelectors.basePackage("com.casic")) -// .paths(PathSelectors.any()).build().enable(enable); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/com/casic/config/task/TaskConfigurer.java b/src/main/java/com/casic/config/task/TaskConfigurer.java index 6a64d1c..5cd850e 100644 --- a/src/main/java/com/casic/config/task/TaskConfigurer.java +++ b/src/main/java/com/casic/config/task/TaskConfigurer.java @@ -5,7 +5,6 @@ import com.casic.service.UserDataDelayReceiver; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @@ -25,14 +24,8 @@ @Value("${casic.device.online.cron}") private String onlineStateCron; - @Value("${casic.device.transfer-user.cron}") - private String transferUserCron; - @Value("${casic.device.partition.cron}") - private String partitionCron; private final DeviceDataService deviceDataService; - private final UserDataDelayReceiver userDataDelayReceiver; - private final IPartitionStrategyService partitionStrategyService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { @@ -40,17 +33,7 @@ triggerContext -> { return new CronTrigger(onlineStateCron).nextExecutionTime(triggerContext); }); - TriggerTask transferUserTask = new TriggerTask(getUserData(), - triggerContext -> { - return new CronTrigger(transferUserCron).nextExecutionTime(triggerContext); - }); - TriggerTask partitionTask = new TriggerTask(createPartition(), - triggerContext -> { - return new CronTrigger(partitionCron).nextExecutionTime(triggerContext); - }); taskRegistrar.addTriggerTask(onlineStateTask); - taskRegistrar.addTriggerTask(transferUserTask); - taskRegistrar.addTriggerTask(partitionTask); } private Runnable nextDayDevice() { @@ -62,32 +45,4 @@ } }; } - - /** - * 定时同步普光 - */ - private Runnable getUserData() { - return new Runnable() { - @Override - public void run() { - log.info("同步数据的任运行..."); - userDataDelayReceiver.saveNewUserData(); - } - }; - } - - /** - * 定时同步普光 - */ - private Runnable createPartition() { - return new Runnable() { - @Override - public void run() { - log.info("定时构建硫化氢数据分区表任务运行..."); - partitionStrategyService.createPartition("DATA_H2S", "data_h2s_log"); - } - }; - - } - } \ No newline at end of file diff --git a/src/main/java/com/casic/controller/DeviceDataController.java b/src/main/java/com/casic/controller/DeviceDataController.java deleted file mode 100644 index e6ae7bc..0000000 --- a/src/main/java/com/casic/controller/DeviceDataController.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.casic.controller; -// -//import com.alibaba.fastjson.JSON; -//import com.casic.service.DeviceDataService; -//import com.casic.service.ThirdDataService; -//import lombok.RequiredArgsConstructor; -//import org.springframework.web.bind.annotation.*; -// -//import java.util.Map; -// -//@RestController -//@RequestMapping("/device") -//@RequiredArgsConstructor -//public class DeviceDataController { -// -// private final DeviceDataService deviceDataService; -// -// @RequestMapping("/recent-data") -// public Object getDeviceRecentData(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "recentNum", required = true) String recentNum, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceRecentData(deviceType, recentNum, devcode); -// } -// -// @RequestMapping("/data/list-page") -// public Object getDeviceListPage(@RequestParam(value = "deviceType", required = true) String deviceType, -// @RequestParam(value = "currentIndex", required = true) Integer currentIndex, -// @RequestParam(value = "pageSize", required = true) Integer pageSize, -// @RequestParam(value = "devcode", required = false) String devcode) { -// return deviceDataService.getDeviceListPage(deviceType, currentIndex, pageSize, devcode); -// } -// -// @RequestMapping("/level/{deviceType}") -// public Object getLevelList(@PathVariable("deviceType")String deviceType) { -// return deviceDataService.getLevel(deviceType); -// } -// -// -// -//} diff --git a/src/main/java/com/casic/dao/BusWellInfoMapper.java b/src/main/java/com/casic/dao/BusWellInfoMapper.java new file mode 100644 index 0000000..102dd78 --- /dev/null +++ b/src/main/java/com/casic/dao/BusWellInfoMapper.java @@ -0,0 +1,17 @@ +package com.casic.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.model.BusWellInfo; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 闸井信息表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-05-13 + */ +public interface BusWellInfoMapper extends BaseMapper { + BusWellInfo getWellListByCode(@Param("wellCode") String wellCode); +} diff --git a/src/main/java/com/casic/model/BusWellInfo.java b/src/main/java/com/casic/model/BusWellInfo.java new file mode 100644 index 0000000..88c9430 --- /dev/null +++ b/src/main/java/com/casic/model/BusWellInfo.java @@ -0,0 +1,163 @@ +package com.casic.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 闸井信息表 + *

+ * + * @author lwh + * @since 2019-05-13 + */ +@EqualsAndHashCode(callSuper = true) +@TableName("bus_well_info") +@Data +public class BusWellInfo extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 井盖编号 + */ + @TableField("WELL_CODE") + private String wellCode; + /** + * 井盖名称 + */ + @TableField("WELL_NAME") + private String wellName; + /** + * 井深 + */ + @TableField("DEEP") + private Float deep; + /** + * 区域 + */ + @TableField("AREA") + private String area; + + /** + * 区域 + */ + @TableField("ROAD") + private String road; + /** + * 第三方坐标系X + */ + @TableField("COORDINATE_X") + private String coordinateX; + /** + * 第三方坐标Y + */ + @TableField("COORDINATE_Y") + private String coordinateY; + /** + * 百度纬度 + */ + @TableField("LAT_BAIDU") + private String latBaidu; + /** + * 百度经度 + */ + @TableField("LNG_BAIDU") + private String lngBaidu; + /** + * 高德经度 + */ + @TableField("LNG_GAODE") + private String lngGaode; + /** + * 高德纬度 + */ + @TableField("LAT_GAODE") + private String latGaode; + /** + * 位置 + */ + @TableField("POSITION") + private String position; + /** + * 部门编号 + */ + @TableField("DEPTID") + private Long deptid; + /** + * 路标图片路径集合 + */ + @TableField("PHOTOS") + private String photos; + /** + * 备注 + */ + @TableField("NOTES") + private String notes; + /** + * 井类型 + */ + @TableField("WELL_TYPE") + private String wellType; + /** + * 责任人 + */ + @TableField("STAFF") + private String staff; + /** + * 电话 + */ + @TableField("TEL") + private String tel; + /** + * 时间戳 + */ + @TableField("TS") + private Date ts; + /** + * 是否有效 + */ + @TableField("VALID") + private String valid; + /** + * 布防状态 + */ + @TableField("BFZT") + private String bfzt; + + /** + * 维护单位/小组id + */ + @TableField("RESPONSIBLE_DEPT") + private Long responsibleDept; + + /** + * 井标签备用1 + */ + @TableField("WELL_FLAG_1") + private String wellFlag1; + + /** + * 井标签备用2 + */ + @TableField("WELL_FLAG_2") + private String wellFlag2; + + /** + * 井标签备用3 + */ + @TableField("WELL_FLAG_3") + private String wellFlag3; +} diff --git a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java index e156160..2feb154 100644 --- a/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java +++ b/src/main/java/com/casic/service/impl/ThirdDataServiceImpl.java @@ -1,17 +1,21 @@ package com.casic.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.dao.AlarmRecordMapper; +import com.casic.dao.BusWellInfoMapper; import com.casic.dao.DataH2sMapper; import com.casic.enums.H2sParamsEnum; import com.casic.model.AlarmRecord; +import com.casic.model.BusWellInfo; import com.casic.model.DataH2s; import com.casic.model.User; import com.casic.service.ThirdDataService; import com.casic.util.RedisCommon; +import com.casic.util.SMSSendUtil; import com.casic.util.WebSocket; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +39,9 @@ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); private final RedisCommon redisCommon; private final AlarmRecordMapper alarmRecordMapper; + private final BusWellInfoMapper wellMapper; private final WebSocket webSocket; + private final SMSSendUtil smsUtil; private final DataScopeBuilder dataScopeBuilder; @Value("${casic.device.apn}") @@ -58,7 +64,7 @@ } } } catch (DataAccessException dae) { - log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage()); + log.error("设备上报数据异常,设备传入的json是{},异常信息{}", h2sDataMap, dae.getMessage()); } return defaultDeliveryConfig(null); } @@ -78,16 +84,19 @@ //判断是否有下发配置必须 map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201); if (ObjectUtils.isNotEmpty(configDataMap) && configDataMap.containsKey("interval")) { - configDataMap.put("interval", (String) configDataMap.get("interval")); - configDataMap.put("port", (String) configDataMap.get("port")); - configDataMap.put("apn",apn); - configDataMap.put("period", (String) configDataMap.get("period")); - configDataMap.put("repeat", (String) configDataMap.get("repeat")); - + configDataMap.put("interval", String.valueOf(configDataMap.get("interval"))); + configDataMap.put("port", String.valueOf(configDataMap.get("port"))); + configDataMap.put("apn", apn); + configDataMap.put("period", String.valueOf(configDataMap.get("period")) ); + configDataMap.put("repeat", String.valueOf(configDataMap.get("repeat")) ); + configDataMap.put("thresh", String.valueOf(configDataMap.get("thresh")) ); } map.put("params", configDataMap); //可省略 map.put("timeout", 30000); + if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("发送配置信息到things board: {}", map); + } return map; } @@ -128,6 +137,7 @@ checkAlarm(dataH2s); Map configDataMap = redisCommon.getMsg(devcode); if (ObjectUtils.isNotEmpty(configDataMap)) { + log.info("有需要下发的配置项: {}", configDataMap); return defaultDeliveryConfig(configDataMap); } } @@ -160,11 +170,19 @@ } if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) { String status = "0"; - this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); - if (Float.valueOf(dataH2s.getStrength()) > ruleValue) { + int currAlarmCount = this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status); + if (Float.parseFloat(dataH2s.getStrength()) > ruleValue) { Long id = this.baseMapper.getDeviceId(dataH2s.getDevcode()); alarmRecordMapper.insert(buildAlarmRecord(dataH2s, id)); - threadPoolExecutor.execute(() -> sendAlarm("浓度超限", this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 推送websocket 一直超限可以一直推送websocket消息 + threadPoolExecutor.execute(() -> sendAlarm("硫化氢浓度超限", dataH2s.getDevcode(), dataH2s.getStrength(), + this.baseMapper.getDeptIdsByDevcode(dataH2s.getDevcode()))); + + // 是新报警的时候才推送报警短信 + if (currAlarmCount == 0) { + threadPoolExecutor.execute(() -> sendAlarmSms("检测到硫化氢浓度超限", dataH2s.getWellCode(), dataH2s.getStrength(), dataH2s.getUptime())); + } } } } @@ -184,7 +202,7 @@ } // PC推送 - private void sendAlarm(String msg, Long deptId) { + private void sendAlarm(String msg, String devCode, String value, Long deptId) { List userIds = new ArrayList<>(); List userList = dataScopeBuilder.DataScopeProvider(deptId); for (User user : userList) { @@ -194,51 +212,25 @@ Map map = new HashMap(); map.put("message", msg); map.put("type", "alarm"); + map.put("deviceNo", devCode); + map.put("value", value); webSocket.sendListMessage(userIds, JSON.toJSONString(map)); } else { log.info("告警消息找不到责任人,pc端未推送:" + msg); } } - // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20" - // + "设备" + devcode + "发生了压力超标,压力值为" + presss - private void alarmPushBuilder(String devcode, String presss) { -// ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S"); -// AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData(); -// if (alarmPushConfig.getEnable().equals(1)) { -// if (alarmPushConfig.getWebsocketAlarm().equals(1)) { -// String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "," -// + "设备" + devcode + "发生了压力超标,压力值为" + presss; -// try { -// messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8")); -// } catch (UnsupportedEncodingException uee) { -// log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage()); -// } -// } -// if (alarmPushConfig.getShortMessageAlarm().equals(1)) { -// JSONArray msglist = new JSONArray(); -// JSONObject msgMap = new JSONObject(); -// msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())); -// msgMap.put("devcode", devcode); -// msgMap.put("value", presss); -// msgMap.put("content", "压力超标"); -// String phoneJson = ""; -// List aliSignNameList = new ArrayList<>(); -// String aliSignName = aliYunConfig.getSignNameJson(); -// if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) { -// String[] phones = alarmPushConfig.getPhoneArray().split(","); -// List phoneList = new ArrayList<>(); -// for (String phone : phones) { -// msglist.add(msgMap); -// phoneList.add(phone); -// aliSignNameList.add(aliSignName); -// } -// phoneJson = JSONObject.toJSONString(phoneList); -// } -// sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList)); -// } -// } + private void sendAlarmSms(String msg, String wellCode, String value, String alarmTime) { + BusWellInfo wellInfo = wellMapper.getWellListByCode(wellCode); + if (null != wellInfo && ObjectUtil.isNotEmpty(wellInfo.getTel())) { + // 拼接报警信息 + String content = msg + "," + // 发现硫化氢泄漏, + "点位:" + wellInfo.getWellName() + ",详细位置:" + wellInfo.getPosition() + "," + // 点位:名称,位置, + "浓度值:" + value + "ppm," + // 浓度值 + "时间:" + alarmTime + "," + // 时间 + "请及时处理。"; // 请及时处理。 + + smsUtil.sendSms(wellInfo.getTel(), content); + } } - - } diff --git a/src/main/java/com/casic/util/SMSSendUtil.java b/src/main/java/com/casic/util/SMSSendUtil.java new file mode 100644 index 0000000..cd9c452 --- /dev/null +++ b/src/main/java/com/casic/util/SMSSendUtil.java @@ -0,0 +1,41 @@ +package com.casic.util; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpRequest; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * 此注解相当于设置访问URL + */ +@Component +@Data +@Slf4j +@ConfigurationProperties(prefix = "casic.sms") +public class SMSSendUtil { + + private String url; + private String name; + private String token; + private String systemName; + + public void sendSms(String phoneNums, String content) { + log.info("向【{}】发送短信:【{}】", phoneNums, content); + + Map params = new HashMap<>(); + params.put("name", name); + params.put("token", token); + params.put("phoneNums", phoneNums); + params.put("content", systemName + ":" + content); + + HttpResponse httpResponse = HttpRequest.post(url).form(params).execute(); + String result = httpResponse.body(); + log.debug("短信接口调用返回{}", result); + } +} diff --git a/src/main/java/com/casic/util/WebSocket.java b/src/main/java/com/casic/util/WebSocket.java index 1ee283f..4503c06 100644 --- a/src/main/java/com/casic/util/WebSocket.java +++ b/src/main/java/com/casic/util/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.util; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.OnClose; @@ -17,6 +18,7 @@ * 此注解相当于设置访问URL */ @Component +@Slf4j @ServerEndpoint("/websocket/{userId}") public class WebSocket { private Session session; @@ -29,24 +31,24 @@ this.session = session; webSockets.add(this); sessionPool.put(userId, session); - System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + log.info("{}【websocket消息】有新的连接,总数为: {}", userId, webSockets.size()); } @OnClose public void onClose() { webSockets.remove(this); - System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + log.info("【websocket消息】连接断开,总数为: {}",webSockets.size()); } @OnMessage public void onMessage(String message) { - System.out.println("【websocket消息】收到客户端消息:" + message); + log.info("【websocket消息】收到客户端消息: {}", message); } // 此为广播消息 public void sendAllMessage(String message) { for (WebSocket webSocket : webSockets) { - System.out.println("【websocket消息】广播消息:" + message); + log.info("【websocket消息】广播消息: {}", message); try { webSocket.session.getAsyncRemote().sendText(message); } catch (Exception e) { @@ -57,7 +59,7 @@ // 发送列表消息 public void sendListMessage(List userIds, String message) { - System.out.println("【websocket消息】列表消息:" + message); + log.info("【websocket消息】列表消息: {}", message); for (String userId : userIds) { Session session = sessionPool.get(userId); if (session != null) { @@ -70,26 +72,9 @@ } } - // 发送列表消息 - -// public void sendListMessage(List userIds, Object data){ -// System.out.println("【websocket消息】列表消息:"+data); -// for (String userId : userIds) { -// Session session = sessionPool.get(userId); -// if (session != null) { -// try { -//// session.getAsyncRemote().sendText(message); -// session.getAsyncRemote().sendObject(data); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } - // 此为单点消息 public void sendOneMessage(String userId, String message) { - System.out.println("【websocket消息】单点消息:" + message); + log.info("【websocket消息】单点消息: {}", message); Session session = sessionPool.get(userId); if (session != null) { try { diff --git a/src/main/resources/config/application-dz.yml b/src/main/resources/config/application-dz.yml index d1474a4..64eaf8a 100644 --- a/src/main/resources/config/application-dz.yml +++ b/src/main/resources/config/application-dz.yml @@ -1,4 +1,5 @@ - +server: + port: 11307 ################### spring配置 ################### spring: datasource: @@ -9,8 +10,8 @@ session: store-type: redis redis: - host: 10.80.1.124 - port: 31681 + host: 10.80.0.171 + port: 6379 password: redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer @@ -24,10 +25,11 @@ init: enable: false spring-session-open: false #开启spring session - no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm + no-login-urls: /job/updateSinkJob,/user/login/token,/push/data,/config/confirm,/websocket/* logging: - level.root: error - level.com.casic: info + level: + root: error + com.casic: info file: path: logs/ name: missiles.log \ No newline at end of file diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index f354d1d..65e0809 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -10,7 +10,7 @@ pathmatch: matching-strategy: ant_path_matcher server: - port: 11314 + port: 11307 mybatis-plus: global-config: enable-sql-runner: true @@ -30,22 +30,23 @@ device: redis: invalid-time: 86400 - host: 127.0.0.1 + host: 10.80.0.171 port: 6379 - password: ew5T4K3#203lwh + password: config-prefix: 'Casic:' #下发配置,key前缀 apn: "dashoa.sc.iot" # 平台对应的apn appName: "XLJCYJ" #应用名称-泄露监测预警 appUrl: "http://10.80.12.33" #普光服务的url online: cron: 0 0 0/1 * * ? # 多长时间判断离线 - transfer-user: - cron: 0 0/1 * * * ? # 数据同步,每天凌晨0点、中午12点各进行同步一次 0 0 0,12 * * ? - partition: - cron: 0 0 0 * * ? - data-day: 3 #多少天为离线 + data-day: 1 #多少天为离线 type: 14 #硫化氢 + sms: + url: http://10.75.240.177/send + name: zhangb9987 + token: 4D0E6A690C1845E0A8DF76D8C9C5E6B2 + system-name: "采气厂硫化氢泄漏监测系统" swagger: enable: true - groupName: "硫化氢课题" \ No newline at end of file + groupName: "采气厂硫化氢泄漏监测系统" \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0c7ac9 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + + + + ${LOG_PATH}/missiles_error.log + + + + + + ${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + error + ACCEPT + DENY + + + + + + + + ${LOG_PATH}/missiles_total.log + + + + + + ${LOG_PATH}/total/log-total-%d{yyyy-MM-dd}.%i.log + + + + 10MB + + + + + true + + + + ${FILE_LOG_PATTERN} + utf-8 + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/BusWellInfoMapper.xml b/src/main/resources/mapper/BusWellInfoMapper.xml new file mode 100644 index 0000000..dc1c692 --- /dev/null +++ b/src/main/resources/mapper/BusWellInfoMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID AS id, WELL_CODE AS "wellCode", WELL_NAME AS "wellName", DEEP AS deep, + COORDINATE_X AS "coordinateX", COORDINATE_Y AS "coordinateY", LAT_BAIDU AS "latBaidu", + LNG_BAIDU AS "lngBaidu", LNG_GAODE AS "lngGaode", LAT_GAODE AS "latGaode", AREA AS area, + POSITION AS position, DEPTID AS deptid, PHOTOS AS photos, NOTES AS notes, + WELL_TYPE AS "wellType", STAFF AS staff, TEL AS tel, TS AS ts, VALID AS valid, + BFZT AS bfzt,RESPONSIBLE_DEPT AS "responsibleDept",ROAD AS road + + + + + +