From 69d00365e9f099b26c4fc7a298cabeb131956d8a Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Wed, 23 Jun 2021 14:35:05 +0800 Subject: [PATCH] 定时任务,kafka --- screen-job/src/main/java/com/moral/api/service/DeviceService.java | 20 screen-job/src/main/java/com/moral/api/entity/HistoryDaily.java | 36 + screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java | 21 screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java | 11 screen-manage/src/main/java/com/moral/api/controller/DeviceController.java | 2 screen-api/src/main/resources/application-dev.yml | 9 screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java | 16 screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java | 33 screen-job/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java | 21 screen-job/src/main/java/com/moral/api/entity/HistoryAqi.java | 45 + screen-api/src/main/resources/mapper/GroupMapper.xml | 2 screen-common/src/main/java/com/moral/util/DateUtils.java | 42 screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java | 12 screen-manage/src/main/java/com/moral/api/service/DeviceService.java | 6 screen-job/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml | 25 screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | 63 + screen-job/src/main/java/com/moral/api/config/redis/RedisConfig.java | 67 + screen-manage/src/main/resources/application-dev.yml | 3 screen-job/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java | 9 screen-manage/src/main/resources/mapper/HistoryHourlyMapper.xml | 17 screen-manage/src/main/resources/mapper/DeviceMapper.xml | 8 screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java | 16 screen-job/src/main/java/com/moral/api/task/CreateTableTask.java | 52 + screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java | 27 screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java | 64 + screen-manage/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java | 34 screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java | 97 ++ screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java | 50 + screen-job/src/main/resources/logback-spring.xml | 56 + screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java | 127 +++ screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java | 31 screen-manage/src/main/java/com/moral/api/entity/HistoryHourly.java | 51 + screen-job/src/main/java/com/moral/api/config/xxljob/XxlJobConfig.java | 68 ++ screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java | 74 ++ screen-common/src/main/java/com/moral/constant/Constants.java | 5 screen-job/src/main/java/com/moral/api/task/JudgeOffLineDeviceTask.java | 28 screen-api/src/main/resources/mapper/GroupMenuMapper.xml | 22 screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java | 69 ++ screen-common/src/main/java/com/moral/constant/RedisConstants.java | 11 screen-api/src/main/resources/mapper/MenuMapper.xml | 17 screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java | 20 screen-job/src/main/resources/mapper/DeviceMapper.xml | 29 screen-common/src/main/java/com/moral/constant/KafkaConstants.java | 16 screen-job/src/main/resources/mapper/CityAqiConfigMapper.xml | 13 screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java | 149 +++- screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java | 9 screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java | 77 ++ screen-job/src/main/resources/mapper/HistoryDailyMapper.xml | 19 screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java | 10 screen-job/src/main/resources/mapper/HistoryAqiMapper.xml | 12 screen-job/src/main/java/com/moral/api/mapper/HistoryAqiMapper.java | 17 /dev/null | 4 screen-job/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java | 15 screen-manage/src/main/java/com/moral/api/controller/TestController.java | 25 screen-job/src/main/java/com/moral/api/task/HistoryAqiInsertTask.java | 27 screen-manage/src/main/java/com/moral/api/service/HistoryHourlyService.java | 20 screen-job/src/main/resources/application-dev.yml | 1 screen-manage/src/main/java/com/moral/api/service/HistoryMinutelyService.java | 2 screen-manage/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | 20 screen-job/src/main/java/com/moral/api/entity/Device.java | 132 +++ screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml | 50 + 61 files changed, 1,890 insertions(+), 144 deletions(-) diff --git a/screen-api/src/main/resources/application-dev.yml b/screen-api/src/main/resources/application-dev.yml index 3ec8fff..03d4b28 100644 --- a/screen-api/src/main/resources/application-dev.yml +++ b/screen-api/src/main/resources/application-dev.yml @@ -13,6 +13,8 @@ spring: profiles: active: dev + include: + moduleFormColumn application: name: screen-manage redis: @@ -90,14 +92,11 @@ enable: auto: commit: false - group: - id: test servers: 192.168.0.191:9092 session: timeout: 6000 - topic: test_topic zookeeper: - connect: 192.168.0.16:2181,192.168.0.17:2181,192.168.0.18:2181 + connect: 172.16.44.65:2181,172.16.44.67:2181,172.16.44.66:2181 producer: batch: size: 4096 @@ -105,7 +104,7 @@ memory: 40960 linger: 1 retries: 0 - servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 + servers: 72.16.44.65:9092,172.16.44.67:9092,172.16.44.66:9092 mvc: interceptor: exclude: diff --git a/screen-api/src/main/resources/mapper/GroupMapper.xml b/screen-api/src/main/resources/mapper/GroupMapper.xml index 1123a96..9fbdc8d 100644 --- a/screen-api/src/main/resources/mapper/GroupMapper.xml +++ b/screen-api/src/main/resources/mapper/GroupMapper.xml @@ -17,7 +17,7 @@ <result column="group_name" property="groupName"/> </resultMap> - <select id="selectUserGroup" resultMap="GroupResultMap"> + <select id="selectUserGroup" resultMap="BaseResultMap"> SELECT g.id,g.group_name FROM `group` g,`user_group` ug WHERE ug.user_id = #{userId} diff --git a/screen-api/src/main/resources/mapper/GroupMenuMapper.xml b/screen-api/src/main/resources/mapper/GroupMenuMapper.xml index 5930463..f0a661b 100644 --- a/screen-api/src/main/resources/mapper/GroupMenuMapper.xml +++ b/screen-api/src/main/resources/mapper/GroupMenuMapper.xml @@ -2,16 +2,16 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.moral.api.mapper.GroupMenuMapper"> - <!-- ������������������������ --> - <resultMap id="BaseResultMap" type="com.moral.api.entity.GroupMenu"> - <id column="id" property="id" /> - <result column="group_id" property="groupId" /> - <result column="menu_id" property="menuId" /> - <result column="channel_key" property="channelKey" /> - <result column="organization_id" property="organizationId" /> - <result column="create_time" property="createTime" /> - <result column="update_time" property="updateTime" /> - <result column="is_delete" property="isDelete" /> - </resultMap> + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.GroupMenu"> + <id column="id" property="id"/> + <result column="group_id" property="groupId"/> + <result column="menu_id" property="menuId"/> + <result column="channel_key" property="channelKey"/> + <result column="organization_id" property="organizationId"/> + <result column="create_time" property="createTime"/> + <result column="update_time" property="updateTime"/> + <result column="is_delete" property="isDelete"/> + </resultMap> </mapper> \ No newline at end of file diff --git a/screen-api/src/main/resources/mapper/MenuMapper.xml b/screen-api/src/main/resources/mapper/MenuMapper.xml index bfe661a..2634fdb 100644 --- a/screen-api/src/main/resources/mapper/MenuMapper.xml +++ b/screen-api/src/main/resources/mapper/MenuMapper.xml @@ -20,7 +20,7 @@ </sql> <select id="selectUserMenu" resultMap="BaseResultMap"> - select + SELECT <include refid="Base_Column_List"/> FROM `user_group` ug,`group_menu` gm,`menu` m WHERE ug.user_id = #{userId} @@ -33,14 +33,13 @@ </select> <select id="selectOrganizationMenu" resultMap="BaseResultMap"> - select - <include refid="Base_Column_List"/> - FROM `menu` m, `organization_menu` om - WHERE om.organization_id = #{orgId} - AND m.id = om.menu_id - AND om.channel_key = 0 - AND om.menu_id = m.id - AND om.is_delete = 0 + SELECT + DISTINCT m.id, m.name, m.url, m.icon, m.parent_id, m.order, m.create_time, m.update_time + FROM `menu` m, `group_menu` gm + WHERE gm.organization_id = #{orgId} + AND m.id = gm.menu_id + AND gm.channel_key = 0 + AND gm.is_delete = 0 AND m.is_delete = 0 </select> </mapper> \ No newline at end of file diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java index a56abbd..535af51 100644 --- a/screen-common/src/main/java/com/moral/constant/Constants.java +++ b/screen-common/src/main/java/com/moral/constant/Constants.java @@ -120,5 +120,10 @@ * */ public static final String UN_ADJUST = "unadjust"; + /* + * ��������������������� + * */ + public static final String DEVICE_STATE_OFFLINE = "4"; + } diff --git a/screen-common/src/main/java/com/moral/constant/KafkaConstants.java b/screen-common/src/main/java/com/moral/constant/KafkaConstants.java index 8f904d1..e1d6e80 100644 --- a/screen-common/src/main/java/com/moral/constant/KafkaConstants.java +++ b/screen-common/src/main/java/com/moral/constant/KafkaConstants.java @@ -5,15 +5,25 @@ /** * ������������������ */ - public static final String TOPIC_MINUTE = "test_topic"; + public static final String TOPIC_MINUTE = "minute"; /** * ������������������ */ public static final String TOPIC_HOUR = "hour"; + /* + * ��������������� + * */ + public static final String TOPIC_SECOND = "test"; + /** - * ��������� + * ������������������������������������������ */ - public static final String GROUP_ID = "test"; + public static final String GROUP_ID_INSERT = "insert"; + + /** + * ��������������������������������� + */ + public static final String GROUP_ID_STATE = "state"; } diff --git a/screen-common/src/main/java/com/moral/constant/RedisConstants.java b/screen-common/src/main/java/com/moral/constant/RedisConstants.java index dd34339..bbc6324 100644 --- a/screen-common/src/main/java/com/moral/constant/RedisConstants.java +++ b/screen-common/src/main/java/com/moral/constant/RedisConstants.java @@ -47,4 +47,15 @@ * ���������������Map<String,Device> * */ public static final String DEVICE_INFO = "device_alarm_info"; + + /* + * ������������������������ + * */ + public static final String ADJUST = "adjust"; + + /* + * ������������������ + * */ + public static final String DEVICE_DATA = "data"; + } diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java index cbc63a2..f5ecd8a 100644 --- a/screen-common/src/main/java/com/moral/util/DateUtils.java +++ b/screen-common/src/main/java/com/moral/util/DateUtils.java @@ -67,6 +67,14 @@ * ������������(HH:mm:ss) */ public static final String HH_mm_ss_EN = "HH:mm:ss"; + /* + * ������������(yyyy-MM-dd HH:mm) + * */ + public static final String yyyy_MM_dd_HH_mm_EN = "yyyy-MM-dd HH:mm"; + /* + * ������������(yyyy-MM-dd HH) + * */ + public static final String yyyy_MM_dd_HH_EN = "yyyy-MM-dd HH"; /** * DateFormat������ */ @@ -443,14 +451,14 @@ } /** - * @Description: ������������������day��������������� - * @Param: [date, day] - * @return: java.util.Date - * @Author: ��������� - * @Date: 2021/3/30 - */ + * @Description: ������������������day��������������� + * @Param: [date, day] + * @return: java.util.Date + * @Author: ��������� + * @Date: 2021/3/30 + */ public static Date getDateOfDay(Date date, int day) { - if(date==null) + if (date == null) return null; Calendar now = Calendar.getInstance(TimeZone.getDefault()); now.setTime(date); @@ -1293,11 +1301,23 @@ return date; } + //������������������������������������ + public static Date convertDate(Date date) { + String dateString = dateToDateString(date, yyyy_MM_dd_HH_mm_EN); + return getDate(dateString, yyyy_MM_dd_HH_mm_EN); + } + + //��������������������������������� + public static Date dataToTimeStampTime(Date time, String dateFormat) { + String dateString = dateToDateString(time, dateFormat); + try { + return getDateFormat(dateFormat).parse(dateString); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } public static void main(String[] args) throws InterruptedException { - Date date1 = new Date(); - Thread.sleep(1000); - Date date2 = new Date(); - System.out.println(DateUtils.compareDateStr(date1, date2)); + System.out.println(new Date().getTime()); } } diff --git a/screen-job/src/main/java/com/moral/api/config/redis/RedisConfig.java b/screen-job/src/main/java/com/moral/api/config/redis/RedisConfig.java new file mode 100644 index 0000000..1b34bb0 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/config/redis/RedisConfig.java @@ -0,0 +1,67 @@ +package com.moral.api.config.redis; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; + + +@Configuration +public class RedisConfig { + + @Bean(name = "redisTemplate") + @ConditionalOnMissingBean(StringRedisTemplate.class) //������������������ ���������������������RedisTemplate ������������ ������������������ + public RedisTemplate<String, Object> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key������String������������������ + redisTemplate.setKeySerializer(stringRedisSerializer); + // hash���key���������String������������������ + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // valuevalue������jackson��������������� + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + // hash���value������jackson��������������� + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + public RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key������String������������������ + redisTemplate.setKeySerializer(stringRedisSerializer); + // hash���key���������String������������������ + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // valuevalue������jackson��������������� + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + // hash���value������jackson��������������� + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/screen-job/src/main/java/com/moral/api/config/xxl/XxlJobConfig.java b/screen-job/src/main/java/com/moral/api/config/xxl/XxlJobConfig.java deleted file mode 100644 index fc087e1..0000000 --- a/screen-job/src/main/java/com/moral/api/config/xxl/XxlJobConfig.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.moral.api.config.xxl; - - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; - -@Configuration -@ComponentScan(basePackages = "com.moral.api.jobHandler") -@Slf4j -public class XxlJobConfig { - - @Value("${xxl.job.admin.addresses}") - private String adminAddresses; - - @Value("${xxl.job.executor.appname}") - private String appName; - - @Value("${xxl.job.executor.ip}") - private String ip; - - @Value("${xxl.job.executor.port}") - private Integer port; - - @Value("${xxl.job.accessToken}") - private String accessToken; - - @Value("${xxl.job.executor.logpath}") - private String logPath; - - @Value("${xxl.job.executor.logretentiondays}") - private Integer logRetentionDays; - - @Bean - public XxlJobSpringExecutor xxlJobSpringExecutor(){ - log.info("xxl jon config init"); - XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); - xxlJobSpringExecutor.setAdminAddresses(adminAddresses); - xxlJobSpringExecutor.setAppname(appName); - xxlJobSpringExecutor.setIp(ip); - xxlJobSpringExecutor.setPort(port); - xxlJobSpringExecutor.setAccessToken(accessToken); - xxlJobSpringExecutor.setLogPath(logPath); - xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); - return xxlJobSpringExecutor; - } - - @Override - public String toString() { - return "XxlJobConfig{" + - "adminAddresses='" + adminAddresses + '\'' + - ", appName='" + appName + '\'' + - ", ip='" + ip + '\'' + - ", port=" + port + - ", accessToken='" + accessToken + '\'' + - ", logPath='" + logPath + '\'' + - ", logRetentionDays=" + logRetentionDays + - '}'; - } - - public XxlJobConfig() { - } - - public XxlJobConfig(String adminAddresses, String appName, String ip, Integer port, String accessToken, String logPath, Integer logRetentionDays) { - this.adminAddresses = adminAddresses; - this.appName = appName; - this.ip = ip; - this.port = port; - this.accessToken = accessToken; - this.logPath = logPath; - this.logRetentionDays = logRetentionDays; - } - - public String getAdminAddresses() { - return adminAddresses; - } - - public void setAdminAddresses(String adminAddresses) { - this.adminAddresses = adminAddresses; - } - - public String getAppName() { - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public String getAccessToken() { - return accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - public String getLogPath() { - return logPath; - } - - public void setLogPath(String logPath) { - this.logPath = logPath; - } - - public Integer getLogRetentionDays() { - return logRetentionDays; - } - - public void setLogRetentionDays(Integer logRetentionDays) { - this.logRetentionDays = logRetentionDays; - } -} diff --git a/screen-job/src/main/java/com/moral/api/config/xxljob/XxlJobConfig.java b/screen-job/src/main/java/com/moral/api/config/xxljob/XxlJobConfig.java new file mode 100644 index 0000000..ccb076d --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/config/xxljob/XxlJobConfig.java @@ -0,0 +1,68 @@ +package com.moral.api.config.xxljob; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; + +@Configuration +@ComponentScan(basePackages = "com.moral.api.job") +@Slf4j +public class XxlJobConfig { + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.executor.appname}") + private String appName; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private Integer port; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private Integer logRetentionDays; + + @Bean + public XxlJobSpringExecutor xxlJobSpringExecutor() { + log.info("xxl jon config init"); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appName); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + return xxlJobSpringExecutor; + } + + /** + * ������������������������������������������������������ "spring-cloud-commons" ��������� "InetUtils" ������������������������IP��� + * + * 1������������������ + * <dependency> + * <groupId>org.springframework.cloud</groupId> + * <artifactId>spring-cloud-commons</artifactId> + * <version>${version}</version> + * </dependency> + * + * 2������������������������������������������ + * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' + * + * 3���������IP + * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); + */ +} diff --git a/screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java b/screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java new file mode 100644 index 0000000..4c95fa0 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java @@ -0,0 +1,50 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * ������������aqi������������ + * </p> + * + * @author moral + * @since 2021-06-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class CityAqiConfig extends Model<CityAqiConfig> { + + private static final long serialVersionUID = 1L; + + /** + * ������id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * ������code + */ + private String cityCode; + + /** + * ������������ + */ + private String cityName; + + /** + * ���������������������������id + */ + private Integer cityId; + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/screen-job/src/main/java/com/moral/api/entity/Device.java b/screen-job/src/main/java/com/moral/api/entity/Device.java new file mode 100644 index 0000000..842a27f --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/Device.java @@ -0,0 +1,132 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * ��������� + * </p> + * + * @author moral + * @since 2021-06-22 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class Device extends Model<Device> { + + private static final long serialVersionUID = 1L; + + /** + * ������id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * ������������ + */ + private String name; + + /** + * mac��� + */ + private String mac; + + /** + * ������������ + */ + private String address; + + /** + * ������ + */ + private Double longitude; + + /** + * ������ + */ + private Double latitude; + + /** + * ��������������������������������� + */ + private String state; + + /** + * ���������id���������������������������������manage_account + */ + private String operateIds; + + /** + * ������id + */ + private Integer monitorPointId; + + /** + * ������id + */ + private Integer organizationId; + + /** + * ������������id + */ + private Integer deviceVersionId; + + /** + * ��������������������������� + */ + private String profession; + + /** + * ���������������1������������2������������3������������������������������������ + */ + private String tech; + + /** + * ������������������������������������ + */ + private String detector; + + /** + * ������������������������������ + */ + private String purchaser; + + /** + * ������(������)������ + */ + private LocalDateTime createTime; + + /** + * ������������ + */ + private LocalDateTime updateTime; + + /** + * ������������ + */ + private LocalDateTime installTime; + + /** + * ������������,0���������������1��������� + */ + private String isDelete; + + /** + * ������������������������ + */ + private String extend; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/screen-job/src/main/java/com/moral/api/entity/HistoryAqi.java b/screen-job/src/main/java/com/moral/api/entity/HistoryAqi.java new file mode 100644 index 0000000..95327da --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/HistoryAqi.java @@ -0,0 +1,45 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * ������aqi��������� + * </p> + * + * @author moral + * @since 2021-06-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class HistoryAqi extends Model<HistoryAqi> { + + private static final long serialVersionUID = 1L; + + /** + * ������code + */ + private String cityCode; + + /** + * ������ + */ + private Date time; + + /** + * ������ + */ + private String value; + + + @Override + protected Serializable pkVal() { + return null; + } + +} diff --git a/screen-job/src/main/java/com/moral/api/entity/HistoryDaily.java b/screen-job/src/main/java/com/moral/api/entity/HistoryDaily.java new file mode 100644 index 0000000..b24913d --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/entity/HistoryDaily.java @@ -0,0 +1,36 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * + * </p> + * + * @author moral + * @since 2021-06-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class HistoryDaily extends Model<HistoryDaily> { + + private static final long serialVersionUID = 1L; + + private String mac; + + private Date time; + + private String value; + + + @Override + protected Serializable pkVal() { + return null; + } + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java b/screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java new file mode 100644 index 0000000..825f5ac --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.CityAqiConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ������������aqi������������ Mapper ������ + * </p> + * + * @author moral + * @since 2021-06-15 + */ +public interface CityAqiConfigMapper extends BaseMapper<CityAqiConfig> { + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java b/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java new file mode 100644 index 0000000..4bb2d15 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/DeviceMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.Device; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ��������� Mapper ������ + * </p> + * + * @author moral + * @since 2021-06-22 + */ +public interface DeviceMapper extends BaseMapper<Device> { + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryAqiMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryAqiMapper.java new file mode 100644 index 0000000..87650be --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryAqiMapper.java @@ -0,0 +1,17 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.HistoryAqi; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ������aqi��������� Mapper ������ + * </p> + * + * @author moral + * @since 2021-06-15 + */ +public interface HistoryAqiMapper extends BaseMapper<HistoryAqi> { + +} + diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java new file mode 100644 index 0000000..0159fde --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryDailyMapper.java @@ -0,0 +1,21 @@ +package com.moral.api.mapper; + +import java.util.List; +import java.util.Map; + +import com.moral.api.entity.HistoryDaily; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * Mapper ������ + * </p> + * + * @author moral + * @since 2021-06-11 + */ +public interface HistoryDailyMapper extends BaseMapper<HistoryDaily> { + + void insertHistoryDaily(List<HistoryDaily> list); + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java new file mode 100644 index 0000000..40c1caa --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryFiveMinutelyMapper.java @@ -0,0 +1,15 @@ +package com.moral.api.mapper; + + +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface HistoryFiveMinutelyMapper { + + void createTable(String timeUnits); + + void insertHistoryFiveMinutely(@Param("list") List<Map<String, Object>> list, @Param("timeUnits") String timeUnits); + +} diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java new file mode 100644 index 0000000..dd466df --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java @@ -0,0 +1,11 @@ +package com.moral.api.mapper; + +import java.util.List; +import java.util.Map; + +public interface HistoryMinutelyMapper { + + void createTable(String timeUnits); + + List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String,Object> params); +} diff --git a/screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java b/screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java new file mode 100644 index 0000000..26e6691 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java @@ -0,0 +1,20 @@ +package com.moral.api.service; + +import java.util.List; + +import com.moral.api.entity.CityAqiConfig; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ������������aqi������������ ��������� + * </p> + * + * @author moral + * @since 2021-06-15 + */ +public interface CityAqiConfigService extends IService<CityAqiConfig> { + + List<CityAqiConfig> getCityAqiConfigs(); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/DeviceService.java b/screen-job/src/main/java/com/moral/api/service/DeviceService.java new file mode 100644 index 0000000..f33824e --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/DeviceService.java @@ -0,0 +1,20 @@ +package com.moral.api.service; + +import com.moral.api.entity.Device; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ��������� ��������� + * </p> + * + * @author moral + * @since 2021-06-22 + */ +public interface DeviceService extends IService<Device> { + + void judgeOffLineDevice(); + + void updateDeviceState(Device device); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java b/screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java new file mode 100644 index 0000000..078a270 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java @@ -0,0 +1,10 @@ +package com.moral.api.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.moral.api.entity.HistoryAqi; + +public interface HistoryAqiService extends IService<HistoryAqi> { + + void insertHistoryAqi(); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java new file mode 100644 index 0000000..b08dd7b --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java @@ -0,0 +1,21 @@ +package com.moral.api.service; + +import java.util.List; +import java.util.Map; + +import com.moral.api.entity.HistoryDaily; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ��������� + * </p> + * + * @author moral + * @since 2021-06-11 + */ +public interface HistoryDailyService extends IService<HistoryDaily> { + + void insertHistoryDaily(List<HistoryDaily> list); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java new file mode 100644 index 0000000..23ad4ef --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java @@ -0,0 +1,9 @@ +package com.moral.api.service; + +public interface HistoryFiveMinutelyService { + + void createTable(String timeUnits); + + void insertHistoryFiveMinutely(); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java new file mode 100644 index 0000000..7b614af --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java @@ -0,0 +1,12 @@ +package com.moral.api.service; + +import java.util.List; +import java.util.Map; + +public interface HistoryMinutelyService { + + void createTable(String timeUnits); + + List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String, Object> params); + +} diff --git a/screen-job/src/main/java/com/moral/api/service/Test.java b/screen-job/src/main/java/com/moral/api/service/Test.java deleted file mode 100644 index 7b34503..0000000 --- a/screen-job/src/main/java/com/moral/api/service/Test.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.moral.api.service; - -public class Test { -} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java new file mode 100644 index 0000000..5d7aca6 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java @@ -0,0 +1,31 @@ +package com.moral.api.service.impl; + +import com.moral.api.entity.CityAqiConfig; +import com.moral.api.mapper.CityAqiConfigMapper; +import com.moral.api.service.CityAqiConfigService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * <p> + * ������������aqi������������ ��������������� + * </p> + * + * @author moral + * @since 2021-06-15 + */ +@Service +public class CityAqiConfigServiceImpl extends ServiceImpl<CityAqiConfigMapper, CityAqiConfig> implements CityAqiConfigService { + + @Autowired + private CityAqiConfigMapper cityAqiConfigMapper; + + @Override + public List<CityAqiConfig> getCityAqiConfigs() { + return cityAqiConfigMapper.selectList(null); + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java new file mode 100644 index 0000000..265c405 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java @@ -0,0 +1,69 @@ +package com.moral.api.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.moral.api.entity.Device; +import com.moral.api.mapper.DeviceMapper; +import com.moral.api.service.DeviceService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.constant.Constants; +import com.moral.constant.RedisConstants; +import com.moral.util.DateUtils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * <p> + * ��������� ��������������� + * </p> + * + * @author moral + * @since 2021-06-22 + */ +@Service +public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService { + + @Autowired + private DeviceMapper deviceMapper; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public void judgeOffLineDevice() { + QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); + queryWrapper.ne("state", Constants.DEVICE_STATE_OFFLINE); + //������������������������ + List<Device> devices = deviceMapper.selectList(queryWrapper); + for (Device device : devices) { + Map<String, Object> data = getDataFromRedis(device.getMac()); + device.setState(Constants.DEVICE_STATE_OFFLINE); + if (data != null && data.containsKey("DataTime")) { + long time = Long.parseLong(data.get("DataTime").toString()); + //��������������������������������� + if (DateUtils.getDateOfMin(new Date(time), 2).getTime() < new Date().getTime()) { + updateDeviceState(device); + } + } else { + updateDeviceState(device); + } + } + } + + @Override + public void updateDeviceState(Device device) { + UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", device.getId()).set("state", device.getState()); + deviceMapper.update(null, updateWrapper); + } + + private Map<String, Object> getDataFromRedis(String mac) { + return (Map<String, Object>) redisTemplate.opsForValue().get(RedisConstants.DEVICE_DATA + "_" + mac); + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java new file mode 100644 index 0000000..0fadead --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java @@ -0,0 +1,77 @@ +package com.moral.api.service.impl; + +import com.alibaba.fastjson.JSON; +import com.moral.api.entity.CityAqiConfig; +import com.moral.api.entity.HistoryAqi; +import com.moral.api.mapper.HistoryAqiMapper; +import com.moral.api.service.CityAqiConfigService; +import com.moral.api.service.HistoryAqiService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import org.springframework.web.client.RestTemplate; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * <p> + * ������aqi��������� ��������������� + * </p> + * + * @author moral + * @since 2021-06-15 + */ +@Service +@Slf4j +public class HistoryAqiServiceImpl extends ServiceImpl<HistoryAqiMapper, HistoryAqi> implements HistoryAqiService { + + @Autowired + private HistoryAqiMapper historyAqiMapper; + + @Autowired + private CityAqiConfigService cityAqiConfigService; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public void insertHistoryAqi() { + RestTemplate restTemplate = new RestTemplate(); + //������aqi������������ + List<CityAqiConfig> cityAqiConfigs = cityAqiConfigService.getCityAqiConfigs(); + for (CityAqiConfig cityAqiConfig : cityAqiConfigs) { + Map<String, Object> mjMap = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=aqi", Map.class, cityAqiConfig.getCityId()); + if (ObjectUtils.isEmpty(mjMap)) { + continue; + } + HistoryAqi historyAqi = new HistoryAqi(); + //city_code + String cityCode = cityAqiConfig.getCityCode(); + historyAqi.setCityCode(cityCode); + Map<String, Object> value = new HashMap<>(); + Map<String, Object> data = (Map<String, Object>) ((Map) mjMap.get("data")).get("aqi"); + //������������ + historyAqi.setTime(new Date(Long.parseLong(data.get("pubtime").toString()))); + value.put("PM25", data.get("pm25C")); + value.put("PM10", data.get("pm10C")); + value.put("SO2", data.get("so2C")); + value.put("NO2", data.get("no2C")); + value.put("CO", data.get("coC")); + value.put("O3", data.get("o3C")); + value.put("AQI", data.get("value")); + //������ + historyAqi.setValue(JSON.toJSONString(value)); + //��������������������� + historyAqiMapper.insert(historyAqi); + //������redis + redisTemplate.opsForHash().putAll("aqi_" + cityCode, value); + } + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java new file mode 100644 index 0000000..07b3958 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java @@ -0,0 +1,33 @@ +package com.moral.api.service.impl; + +import com.moral.api.entity.HistoryDaily; +import com.moral.api.mapper.HistoryDailyMapper; +import com.moral.api.service.HistoryDailyService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * <p> + * ��������������� + * </p> + * + * @author moral + * @since 2021-06-11 + */ +@Service +public class HistoryDailyServiceImpl extends ServiceImpl<HistoryDailyMapper, HistoryDaily> implements HistoryDailyService { + + @Autowired + private HistoryDailyMapper historyDailyMapper; + + @Override + public void insertHistoryDaily(List<HistoryDaily> list) { + System.out.println(list); + historyDailyMapper.insertHistoryDaily(list); + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java new file mode 100644 index 0000000..fb85a9d --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java @@ -0,0 +1,64 @@ +package com.moral.api.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSON; +import com.moral.api.mapper.HistoryFiveMinutelyMapper; +import com.moral.api.service.HistoryFiveMinutelyService; +import com.moral.api.service.HistoryMinutelyService; +import com.moral.util.DateUtils; + +@Service +public class HistoryFiveMinutelyServiceImpl implements HistoryFiveMinutelyService { + + @Autowired + private HistoryFiveMinutelyMapper historyFiveMinutelyMapper; + + @Autowired + private HistoryMinutelyService historyMinutelyService; + + @Override + public void createTable(String timeUnits) { + historyFiveMinutelyMapper.createTable(timeUnits); + } + + @Override + public void insertHistoryFiveMinutely() { + Map<String, Object> params = new HashMap<>(); + //������������������������ + Date start = DateUtils.convertDate(DateUtils.getDateOfMin(-5)); + //������������������������ + Date end = DateUtils.convertDate(new Date()); + params.put("start", start); + params.put("end", end); + //��������������� + String timeUnits = DateUtils.dateToDateString(start, DateUtils.yyyyMM_EN); + params.put("timeUnits", timeUnits); + + //������ + + params.put("sensorKeys", null); + + historyMinutelyService.getHistoryFiveMinutelyData(params); + /*List<Map<String, Object>> list = new ArrayList<>(); + Map<String, Object> map = new HashMap<>(); + map.put("mac", "123456"); + Date date = new Date(); + map.put("time", date); + Map<String, Object> value = new HashMap<>(); + value.put("e1", 10); + value.put("e2", 20); + map.put("value", JSON.toJSONString(value)); + list.add(map);*/ + + historyFiveMinutelyMapper.insertHistoryFiveMinutely(null, null); + } +} diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java new file mode 100644 index 0000000..730ef35 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java @@ -0,0 +1,27 @@ +package com.moral.api.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +import com.moral.api.mapper.HistoryMinutelyMapper; +import com.moral.api.service.HistoryMinutelyService; + +@Service +public class HistoryMinutelyServiceImpl implements HistoryMinutelyService { + + @Autowired + private HistoryMinutelyMapper historyMinutelyMapper; + + @Override + public void createTable(String timeUnits) { + historyMinutelyMapper.createTable(timeUnits); + } + + @Override + public List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String, Object> params) { + return historyMinutelyMapper.getHistoryFiveMinutelyData(params); + } +} diff --git a/screen-job/src/main/java/com/moral/api/task/CreateTableTask.java b/screen-job/src/main/java/com/moral/api/task/CreateTableTask.java new file mode 100644 index 0000000..2fab184 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/task/CreateTableTask.java @@ -0,0 +1,52 @@ +package com.moral.api.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.moral.api.service.HistoryFiveMinutelyService; +import com.moral.api.service.HistoryMinutelyService; +import com.moral.constant.Constants; +import com.moral.util.DateUtils; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; + +@Component +public class CreateTableTask { + + @Autowired + private HistoryFiveMinutelyService historyFiveMinutelyService; + + @Autowired + private HistoryMinutelyService historyMinutelyService; + + + //��������������������� + @XxlJob("createHistoryMinutelyTable") + public ReturnT createHistoryMinutelyTable() { + String timeUnits = DateUtils.getDateStringOfMon(1, DateUtils.yyyyMM_EN); + try { + //������������������ + historyMinutelyService.createTable(timeUnits); + //������������������ + historyMinutelyService.createTable(timeUnits + "_" + Constants.UN_ADJUST); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } + + //5��������������������� + @XxlJob("createHistoryFiveMinutelyTable") + public ReturnT createHistoryFiveMinutelyTable() { + String timeUnits = DateUtils.getDateStringOfMon(1, DateUtils.yyyyMM_EN); + try { + historyFiveMinutelyService.createTable(timeUnits); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } +} diff --git a/screen-job/src/main/java/com/moral/api/task/HistoryAqiInsertTask.java b/screen-job/src/main/java/com/moral/api/task/HistoryAqiInsertTask.java new file mode 100644 index 0000000..603e2d2 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/task/HistoryAqiInsertTask.java @@ -0,0 +1,27 @@ +package com.moral.api.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.moral.api.service.HistoryAqiService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; + +@Component +public class HistoryAqiInsertTask { + + @Autowired + private HistoryAqiService historyAqiService; + + @XxlJob("insertHistoryAqi") + public ReturnT insertHistoryAqi() { + try { + historyAqiService.insertHistoryAqi(); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } +} diff --git a/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java b/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java new file mode 100644 index 0000000..eb9b6af --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java @@ -0,0 +1,74 @@ +package com.moral.api.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSON; +import com.moral.api.entity.HistoryDaily; +import com.moral.api.service.HistoryDailyService; +import com.moral.api.service.HistoryFiveMinutelyService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; + +@Component +public class HistoryTableInsertTask { + + @Autowired + private HistoryDailyService historyDailyService; + + @Autowired + private HistoryFiveMinutelyService historyFiveMinutelyService; + + //5������������������ + @XxlJob("insertHistoryFiveMinutely") + public ReturnT insertHistoryFiveMinutely() { + try { + /* List<Map<String, Object>> list = new ArrayList<>(); + Map<String, Object> map = new HashMap<>(); + map.put("mac", "123456"); + Date date = new Date(); + map.put("time", date); + Map<String, Object> value = new HashMap<>(); + value.put("e1", 10); value.put("e2", 20); + map.put("value", JSON.toJSONString(value)); + list.add(map); + String timeUnits = DateUtils.dateToDateString(date, DateUtils.yyyyMM_EN);*/ + + historyFiveMinutelyService.insertHistoryFiveMinutely(); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } + + //��������������� + @XxlJob("insertHistoryDaily") + public ReturnT insertHistoryDaily() { + try { + List<HistoryDaily> list = new ArrayList<>(); + HistoryDaily historyDaily = new HistoryDaily(); + historyDaily.setMac("123456"); + historyDaily.setTime(new Date()); + Map<String, Object> value = new HashMap<>(); + value.put("e1", 1); + value.put("e2", 2); + historyDaily.setValue(JSON.toJSONString(value)); + for (int i = 0; i < 20000; i++) { + list.add(historyDaily); + } + historyDailyService.insertHistoryDaily(list); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } +} diff --git a/screen-job/src/main/java/com/moral/api/task/JudgeOffLineDeviceTask.java b/screen-job/src/main/java/com/moral/api/task/JudgeOffLineDeviceTask.java new file mode 100644 index 0000000..aa5d7a6 --- /dev/null +++ b/screen-job/src/main/java/com/moral/api/task/JudgeOffLineDeviceTask.java @@ -0,0 +1,28 @@ +package com.moral.api.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.moral.api.service.DeviceService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; + +@Component +public class JudgeOffLineDeviceTask { + + @Autowired + private DeviceService deviceService; + + //������������������������ + @XxlJob("judgeOffLineDevice") + public ReturnT judgeOffLineDevice() { + try { + deviceService.judgeOffLineDevice(); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } +} diff --git a/screen-job/src/main/resources/application-dev.yml b/screen-job/src/main/resources/application-dev.yml index d996a3c..248edec 100644 --- a/screen-job/src/main/resources/application-dev.yml +++ b/screen-job/src/main/resources/application-dev.yml @@ -81,6 +81,7 @@ logging: config: classpath:logback.xml + xxl: job: admin: diff --git a/screen-job/src/main/resources/logback-spring.xml b/screen-job/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..d830e7a --- /dev/null +++ b/screen-job/src/main/resources/logback-spring.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <include resource="org/springframework/boot/logging/logback/defaults.xml"/> + + <springProperty scope="context" name="springAppName" source="spring.application.name"/> + <!-- ��������������������������������� --> + <property name="LOG_FILE" value="/home/moral/soft/log/${springAppName}"/> + <!-- ������������������������������ --> + <property name="CONSOLE_LOG_PATTERN" + value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%X{logseq}]{faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> + + <property name="FILE_LOG_PATTERN" + value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{logseq}] [%thread] %X{T} [%level] %logger.%method:%line %msg%n"/> + + <!-- ���������Appender --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <encoder> + <pattern>${CONSOLE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + <!-- ������������Appender --> + <appender name="screenJobLog" class="ch.qos.logback.classic.sift.SiftingAppender"> + <discriminator> + <key>taskId</key> + <defaultValue>default</defaultValue> + </discriminator> + <sift> + <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> + + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <file>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <maxFileSize>30MB</maxFileSize> + <fileNamePattern>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}-%d{yyyy-MM-dd}.log%i.log</fileNamePattern> + <maxHistory>30</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${FILE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + </sift> + </appender> + + + <root level="INFO"> + <appender-ref ref="console"/> + <appender-ref ref="screenJobLog"/> + </root> +</configuration> diff --git a/screen-job/src/main/resources/mapper/CityAqiConfigMapper.xml b/screen-job/src/main/resources/mapper/CityAqiConfigMapper.xml new file mode 100644 index 0000000..a465401 --- /dev/null +++ b/screen-job/src/main/resources/mapper/CityAqiConfigMapper.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.CityAqiConfigMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqiConfig"> + <id column="id" property="id"/> + <result column="city_code" property="cityCode"/> + <result column="city_name" property="cityName"/> + <result column="city_id" property="cityId"/> + </resultMap> + +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/DeviceMapper.xml b/screen-job/src/main/resources/mapper/DeviceMapper.xml new file mode 100644 index 0000000..493dc7b --- /dev/null +++ b/screen-job/src/main/resources/mapper/DeviceMapper.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.DeviceMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.Device"> + <id column="id" property="id" /> + <result column="name" property="name" /> + <result column="mac" property="mac" /> + <result column="address" property="address" /> + <result column="longitude" property="longitude" /> + <result column="latitude" property="latitude" /> + <result column="state" property="state" /> + <result column="operate_ids" property="operateIds" /> + <result column="monitor_point_id" property="monitorPointId" /> + <result column="organization_id" property="organizationId" /> + <result column="device_version_id" property="deviceVersionId" /> + <result column="profession" property="profession" /> + <result column="tech" property="tech" /> + <result column="detector" property="detector" /> + <result column="purchaser" property="purchaser" /> + <result column="create_time" property="createTime" /> + <result column="update_time" property="updateTime" /> + <result column="install_time" property="installTime" /> + <result column="is_delete" property="isDelete" /> + <result column="extend" property="extend" /> + </resultMap> + +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/HistoryAqiMapper.xml b/screen-job/src/main/resources/mapper/HistoryAqiMapper.xml new file mode 100644 index 0000000..24658a1 --- /dev/null +++ b/screen-job/src/main/resources/mapper/HistoryAqiMapper.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.HistoryAqiMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryAqi"> + <result column="city_code" property="cityCode" /> + <result column="time" property="time" /> + <result column="value" property="value" /> + </resultMap> + +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/HistoryDailyMapper.xml b/screen-job/src/main/resources/mapper/HistoryDailyMapper.xml new file mode 100644 index 0000000..f1582cd --- /dev/null +++ b/screen-job/src/main/resources/mapper/HistoryDailyMapper.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.HistoryDailyMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryDaily"> + <result column="mac" property="mac"/> + <result column="time" property="time"/> + <result column="value" property="value"/> + </resultMap> + + <insert id="insertHistoryDaily" parameterType="com.moral.api.entity.HistoryDaily"> + INSERT INTO history_daily + VALUES + <foreach collection="list" item="item" separator=","> + (#{item.mac},#{item.time},#{item.value}) + </foreach> + </insert> +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml b/screen-job/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml new file mode 100644 index 0000000..13de990 --- /dev/null +++ b/screen-job/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.HistoryFiveMinutelyMapper"> + + <update id="createTable" parameterType="String"> + CREATE TABLE IF NOT EXISTS `history_five_minutely_${timeUnits}` ( + `mac` VARCHAR (20) DEFAULT NULL COMMENT '������mac', + `time` datetime DEFAULT NULL COMMENT '������������', + `value` json DEFAULT NULL COMMENT '������', + KEY `idx_mac` (`mac`), + KEY `idx_time` (`time`), + KEY `idx_mac_time` (`mac`,`time`) + ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '5���������������' + </update> + + <insert id="insertHistoryFiveMinutely"> + INSERT INTO + history_five_minutely_${timeUnits} + VALUES + <foreach collection="list" item="item" separator=","> + (#{item.mac}, #{item.time}, #{item.value}) + </foreach> + </insert> + +</mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml b/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml new file mode 100644 index 0000000..d705dd2 --- /dev/null +++ b/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.HistoryMinutelyMapper"> + + <update id="createTable" parameterType="String"> + CREATE TABLE IF NOT EXISTS `history_minutely_${timeUnits}` ( + `mac` VARCHAR (20) DEFAULT NULL COMMENT '������mac', + `time` datetime DEFAULT NULL COMMENT '������������', + `value` json DEFAULT NULL COMMENT '������', + `version` INT (11) DEFAULT NULL COMMENT '������', + KEY `idx_mac` (`mac`), + KEY `idx_time` (`time`), + KEY `idx_mac_time` (`mac`,`time`) + ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '���������������' + </update> + + <select id="getHistoryFiveMinutelyData" resultType="java.util.LinkedHashMap"> + SELECT + mac + <foreach collection="sensorKeys" open="," separator="," item="sensorKey"> + <choose> + <when test="sensorKey=='e23[0]'"> + ROUND((CASE WHEN AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))<![CDATA[>]]>0 AND + AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI()))<![CDATA[>]]>0 + THEN + ATAN(AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))/AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI())))*180/PI() + WHEN AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))>0 AND + AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI()))<![CDATA[<]]>0 + THEN + (ATAN(AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))/AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI())))*180/PI())+180 + WHEN AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))<![CDATA[<]]>0 AND + AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI()))<![CDATA[<]]>0 + THEN + (ATAN(AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))/AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI())))*180/PI())+180 + ELSE + (ATAN(AVG(value->'$.e18[0]'*SIN((value->'$.e23[0]'/180)*PI()))/AVG(value->'$.e18[0]'*COS((value->'$.e23[0]'/180)*PI())))*180/PI())+360 + END),3) AS '${sensorKey}' + </when> + <otherwise> + ROUND(AVG(value->'$.${sensorKey}[0]'),3) AS '${sensorKey}' + </otherwise> + </choose> + </foreach> + FROM + history_minutely_${timeUnits} + WHERE time <![CDATA[>=]]> #{start} AND time <![CDATA[<]]> #{end} + GROUP BY mac + </select> + +</mapper> \ No newline at end of file diff --git a/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java index 9d983d0..4d6652a 100644 --- a/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java +++ b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java @@ -2,7 +2,6 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.common.serialization.StringDeserializer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,6 +12,7 @@ import org.springframework.kafka.core.DefaultKafkaConsumerFactory; import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; import org.springframework.kafka.listener.ContainerProperties; + import java.util.HashMap; import java.util.Map; @@ -27,8 +27,6 @@ private String sessionTimeout; @Value("${kafka.consumer.auto.commit.interval}") private String autoCommitInterval; - @Value("${kafka.consumer.groupMenu.id}") - private String groupId; @Value("${kafka.consumer.auto.offset.reset}") private String autoOffsetReset; @Value("${kafka.consumer.concurrency}") @@ -41,16 +39,12 @@ factory.setConcurrency(concurrency); factory.getContainerProperties().setPollTimeout(1500); factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE); - - /*factory.setBatchListener(true);//@KafkaListener ������������ ���������������������Kafka���������������������ConsumerConfig.MAX_POLL_RECORDS_CONFIG - factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);//������������������������������*/ return factory; } public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } - public Map<String, Object> consumerConfigs() { Map<String, Object> propsMap = new HashMap<>(); @@ -60,7 +54,6 @@ propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout); propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); - propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset); return propsMap; } diff --git a/screen-manage/src/main/java/com/moral/api/controller/DeviceController.java b/screen-manage/src/main/java/com/moral/api/controller/DeviceController.java index 8b0f88e..bb495c8 100644 --- a/screen-manage/src/main/java/com/moral/api/controller/DeviceController.java +++ b/screen-manage/src/main/java/com/moral/api/controller/DeviceController.java @@ -56,7 +56,7 @@ //������mac��������������� QueryWrapper<Device> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac", device.getMac()); - if (deviceService.getOne(queryWrapper) != null) { + if (deviceService.count(queryWrapper) > 0) { return ResultMessage.fail(ResponseCodeEnum.MAC_IS_EXIST.getCode(), ResponseCodeEnum.MAC_IS_EXIST.getMsg()); } deviceService.insert(device); diff --git a/screen-manage/src/main/java/com/moral/api/controller/TestController.java b/screen-manage/src/main/java/com/moral/api/controller/TestController.java index 3cb3911..81bb874 100644 --- a/screen-manage/src/main/java/com/moral/api/controller/TestController.java +++ b/screen-manage/src/main/java/com/moral/api/controller/TestController.java @@ -4,6 +4,7 @@ import com.moral.api.entity.Test; import com.moral.api.service.TestService; import com.moral.api.util.CacheUtils; +import com.moral.constant.KafkaConstants; import com.moral.constant.ResultMessage; import com.moral.redis.RedisUtil; import com.moral.util.PageResult; @@ -101,15 +102,31 @@ } /** - * kafka������ + * ������������kafka������ */ @ApiOperation(value = "kafka������", notes = "kafka������") @ApiImplicitParams({ + @ApiImplicitParam(name = "data", value = "data", required = true, paramType = "query", dataType = "String"), @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String") }) - @RequestMapping(value = "kafkaTest", method = RequestMethod.GET) - public void kafkaTest() { - kafkaTemplate.send("test_topic", "{'mac': 'p5dnd1234567','DataTime':1623058244104,'e1':10,'e2':20,'ver':2}"); + @RequestMapping(value = "minuteKafkaTest", method = RequestMethod.GET) + public void minuteKafkaTest(String data) { + System.out.println(data); + kafkaTemplate.send(KafkaConstants.TOPIC_MINUTE, data); + } + + /** + * ������������kafka������ + */ + @ApiOperation(value = "kafka������", notes = "kafka������") + @ApiImplicitParams({ + @ApiImplicitParam(name = "data", value = "data", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String") + }) + @RequestMapping(value = "hourKafkaTest", method = RequestMethod.GET) + public void hourKafkaTest(String data) { + System.out.println(data); + kafkaTemplate.send(KafkaConstants.TOPIC_HOUR, data); } @GetMapping("testToken") diff --git a/screen-manage/src/main/java/com/moral/api/entity/HistoryHourly.java b/screen-manage/src/main/java/com/moral/api/entity/HistoryHourly.java new file mode 100644 index 0000000..08c64b6 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/entity/HistoryHourly.java @@ -0,0 +1,51 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.io.Serializable; +import java.util.Date; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * ������������������ + * </p> + * + * @author moral + * @since 2021-06-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class HistoryHourly extends Model<HistoryHourly> { + + private static final long serialVersionUID = 1L; + + /** + * ������mac + */ + private String mac; + + /** + * ������������ + */ + private Date time; + + /** + * ������ + */ + private String value; + + /** + * ������ + */ + private Integer version; + + + @Override + protected Serializable pkVal() { + return null; + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java index af6c8cc..cc98e98 100644 --- a/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java +++ b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java @@ -1,37 +1,128 @@ package com.moral.api.kafka.consumer; -import com.moral.api.constant.TopicConstants; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.support.Acknowledgment; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; -import java.util.Random; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; -@Component +import com.alibaba.fastjson.JSON; +import com.moral.api.service.DeviceService; +import com.moral.api.service.HistoryHourlyService; +import com.moral.api.service.HistoryMinutelyService; +import com.moral.api.util.AdjustDataUtils; +import com.moral.constant.KafkaConstants; +import com.moral.constant.RedisConstants; + +//@Component @Slf4j public class KafkaConsumer { -/* *//** - * ��������������������������������� - * @param record - * @param ack - * @throws Exception - *//* - @KafkaListener(topics = TopicConstants.TEST_TOPIC_MESSAGE,groupId = "test") - public void listenTest(ConsumerRecord<String, String> record , Acknowledgment ack) throws Exception { + @Autowired + private HistoryMinutelyService historyMinutelyService; + + @Autowired + private HistoryHourlyService historyHourlyService; + + @Autowired + private DeviceService deviceService; + + @Autowired + private AdjustDataUtils adjustDataUtils; + + @Autowired + private RedisTemplate redisTemplate; + + //������������ + @KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, groupId = KafkaConstants.GROUP_ID_INSERT, containerFactory = "kafkaListenerContainerFactory") + public void listenMinute(ConsumerRecord<String, String> record, Acknowledgment ack) { String msg = record.value(); - System.out.println(msg); - if (new Random().nextInt(100)<50){ - log.info(String.format("kafka ������������������---------------- listen1 topic = %s, offset = %d, value = %s ", record.topic(), record.offset(), record.value())); + try { + Map<String, Object> data = JSON.parseObject(msg, HashMap.class); + Object mac = data.get("mac"); + Object time = data.get("DataTime"); + Object ver = data.get("ver"); + if (StringUtils.isEmpty(ver) || StringUtils.isEmpty(time) || StringUtils.isEmpty(mac)) { + log.warn("some properties is null, param{}", msg); + ack.acknowledge(); + return; + } + + //������������ + data = data.entrySet().stream() + .filter(map -> { + String key = map.getKey(); + return !(key.contains("Min") || key.contains("Max") || key.contains("Cou")); + }).collect(Collectors.toMap(m -> m.getKey().replaceAll("-Avg", ""), Map.Entry::getValue)); + data.remove("time"); + //��������������� + historyMinutelyService.insertHistoryMinutely(data); ack.acknowledge(); + } catch (Exception e) { + //log.error("param{}" + msg); } + } - }*/ + //������������ + @KafkaListener(topics = KafkaConstants.TOPIC_HOUR, groupId = KafkaConstants.GROUP_ID_INSERT, containerFactory = "kafkaListenerContainerFactory") + public void listenHour(ConsumerRecord<String, String> record, Acknowledgment ack) { + String msg = record.value(); + try { + Map<String, Object> data = JSON.parseObject(msg, HashMap.class); + Object mac = data.get("mac"); + Object time = data.get("DataTime"); + Object ver = data.get("ver"); + if (StringUtils.isEmpty(ver) || StringUtils.isEmpty(time) || StringUtils.isEmpty(mac)) { + log.warn("some properties is null, param{}", msg); + ack.acknowledge(); + return; + } + //������������ + data = data.entrySet().stream() + .filter(map -> { + String key = map.getKey(); + return !(key.contains("Min") || key.contains("Max") || key.contains("Cou")); + }).collect(Collectors.toMap(m -> m.getKey().replaceAll("-Avg", ""), Map.Entry::getValue)); + data.remove("time"); + //��������������� + historyHourlyService.insertHistoryHourly(data); + ack.acknowledge(); + } catch (Exception e) { + //log.error("param{}" + msg); + } + } - - - + //������������������������������������������������������ + @KafkaListener(topics = KafkaConstants.TOPIC_SECOND, groupId = KafkaConstants.GROUP_ID_STATE, containerFactory = "kafkaListenerContainerFactory") + public void listenSecond(ConsumerRecord<String, String> record, Acknowledgment ack) { + String msg = record.value(); + try { + Map<String, Object> data = JSON.parseObject(msg, HashMap.class); + Object mac = data.get("mac"); + Object time = data.get("DataTime"); + Object ver = data.get("ver"); + if (StringUtils.isEmpty(ver) || StringUtils.isEmpty(time) || StringUtils.isEmpty(mac)) { + log.warn("some properties is null, param{}", msg); + ack.acknowledge(); + return; + } + //������������ + data = adjustDataUtils.adjust(data); + //������redis + redisTemplate.opsForValue().set(RedisConstants.DEVICE_DATA + "_" + mac, data); + //��������������������������� + deviceService.judgeDeviceState(data); + ack.acknowledge(); + } catch (Exception e) { + //log.error("param{}" + msg); + } + } } diff --git a/screen-manage/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java new file mode 100644 index 0000000..46898e3 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java @@ -0,0 +1,20 @@ +package com.moral.api.mapper; + +import java.util.Map; + +import com.moral.api.entity.HistoryHourly; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * ��������� Mapper ������ + * </p> + * + * @author moral + * @since 2021-06-04 + */ +public interface HistoryHourlyMapper extends BaseMapper<HistoryHourly> { + + void insertHistoryHourlyUnAdjust(Map<String, Object> params); + +} diff --git a/screen-manage/src/main/java/com/moral/api/service/DeviceService.java b/screen-manage/src/main/java/com/moral/api/service/DeviceService.java index 5fac936..0d3fa02 100644 --- a/screen-manage/src/main/java/com/moral/api/service/DeviceService.java +++ b/screen-manage/src/main/java/com/moral/api/service/DeviceService.java @@ -56,9 +56,9 @@ Map<String, Object> getDeviceByMac(String mac); //������������������ - Map<String, Object> adjustDeviceData(Map<String, Object> deviceData, Map<String, Object> deviceInfo); + Map<String, Object> adjustDeviceData(Map<String, Object> deviceData); - //��������������������������� - Map<String, Object> judgeDeviceState(Map<String, Object> data, Map<String, Object> deviceInfo); + //��������������������������� + void judgeDeviceState(Map<String, Object> data); } diff --git a/screen-manage/src/main/java/com/moral/api/service/HistoryHourlyService.java b/screen-manage/src/main/java/com/moral/api/service/HistoryHourlyService.java new file mode 100644 index 0000000..1a5a63e --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/service/HistoryHourlyService.java @@ -0,0 +1,20 @@ +package com.moral.api.service; + +import java.util.Map; + +import com.moral.api.entity.HistoryHourly; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * ��������� ��������� + * </p> + * + * @author moral + * @since 2021-06-04 + */ +public interface HistoryHourlyService extends IService<HistoryHourly> { + + void insertHistoryHourly(Map<String, Object> data); + +} diff --git a/screen-manage/src/main/java/com/moral/api/service/HistoryMinutelyService.java b/screen-manage/src/main/java/com/moral/api/service/HistoryMinutelyService.java index 4834d08..91c4fa6 100644 --- a/screen-manage/src/main/java/com/moral/api/service/HistoryMinutelyService.java +++ b/screen-manage/src/main/java/com/moral/api/service/HistoryMinutelyService.java @@ -13,6 +13,6 @@ */ public interface HistoryMinutelyService { - void insertHistoryMinutely(Map<String, Object> deviceData); + void insertHistoryMinutely(Map<String, Object> data); } diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java index 9e06f36..c1b48df 100644 --- a/screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java +++ b/screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java @@ -1,26 +1,31 @@ package com.moral.api.service.impl; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.Expression; import com.moral.api.entity.*; import com.moral.api.mapper.*; import com.moral.api.pojo.vo.device.DeviceVO; import com.moral.api.service.DeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.util.AdjustDataUtils; import com.moral.api.util.LogUtils; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.ConvertUtils; import com.moral.util.DateUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -28,10 +33,12 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; @@ -44,6 +51,7 @@ * @since 2021-05-11 */ @Service +@Slf4j public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService { @Autowired @@ -76,13 +84,14 @@ @Autowired private VersionSensorUnitMapper versionSensorUnitMapper; - + @Autowired + private AdjustDataUtils adjustDataUtils; /* * ���redis������������������ * */ private Map<String, Object> getDeviceInfoFromRedis(String mac) { - Map<String, Object> deviceInfo = (Map<String, Object>) redisTemplate.opsForValue().get(RedisConstants.DEVICE + mac); + Map<String, Object> deviceInfo = (Map<String, Object>) redisTemplate.opsForValue().get(getDeviceKey(mac)); return deviceInfo; } @@ -107,6 +116,13 @@ return keysConnect(RedisConstants.DEVICE, mac); } + /* + * ���redis������������������ + * */ + private Map<String, Object> getOrgAlarmConfigFromRedis(String orId) { + return null; + } + //redis key������ private String keysConnect(String... keys) { StringBuilder key = new StringBuilder(keys[0]); @@ -125,7 +141,7 @@ deviceMapper.insert(device); Map<String, Object> deviceInfo = selectDeviceInfoById(device.getId()); //��������������������������� - insertOrganizationUnitAlarm(orgId,device.getDeviceVersionId()); + insertOrganizationUnitAlarm(orgId, device.getDeviceVersionId()); //������������������������redis String mac = device.getMac(); //���redis��������������������� @@ -142,17 +158,13 @@ @Override @Transactional public void delete(Integer deviceId) { + Device device = deviceMapper.selectById(deviceId); UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", deviceId).set("is_delete", Constants.DELETE); deviceMapper.update(null, updateWrapper); - Device device = deviceMapper.selectById(deviceId); String mac = device.getMac(); //���redis��������������������� delDeviceInfoFromRedis(mac); - //��������������������������� - Integer versionId = device.getDeviceVersionId(); - Integer orgId = device.getOrganizationId(); - deleteOrganizationUnitAlarm(orgId,versionId); //������������������ HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); StringBuilder content = new StringBuilder(); @@ -166,7 +178,7 @@ Integer deviceId = device.getId(); Device oldDevice = deviceMapper.selectById(deviceId); //���������������������������������������������������������������������������������id������������ - if(!ObjectUtils.isEmpty(device.getMonitorPointId())){ + if (!ObjectUtils.isEmpty(device.getMonitorPointId())) { MonitorPoint monitorPoint = monitorPointMapper.selectById(device.getMonitorPointId()); device.setOrganizationId(monitorPoint.getOrganizationId()); } @@ -174,14 +186,14 @@ Device updateDevice = deviceMapper.selectById(deviceId); String mac = updateDevice.getMac(); //��������������������������� - Integer oldOrgId = oldDevice.getOrganizationId(); - Integer newOrgId = updateDevice.getOrganizationId(); - Integer oldVersionId = oldDevice.getDeviceVersionId(); - Integer newVersionId = updateDevice.getDeviceVersionId(); - if(!oldOrgId.equals(newOrgId)||!oldVersionId.equals(newVersionId)){ - deleteOrganizationUnitAlarm(oldOrgId,oldVersionId); - insertOrganizationUnitAlarm(newOrgId,newVersionId); - } + Integer oldOrgId = oldDevice.getOrganizationId(); + Integer newOrgId = updateDevice.getOrganizationId(); + Integer oldVersionId = oldDevice.getDeviceVersionId(); + Integer newVersionId = updateDevice.getDeviceVersionId(); + if (!oldOrgId.equals(newOrgId) || !oldVersionId.equals(newVersionId)) { + deleteOrganizationUnitAlarm(oldOrgId, oldVersionId); + insertOrganizationUnitAlarm(newOrgId, newVersionId); + } //���redis��������������������� delDeviceInfoFromRedis(mac); Map<String, Object> deviceInfo = selectDeviceInfoById(deviceId); @@ -276,13 +288,15 @@ queryWrapper.eq("monitor_point_id", mpId); } + //��������������������� if (name != null) { queryWrapper.like("name", name); } + + //mac������������ if (mac != null) { queryWrapper.like("mac", mac); } - //������������,������create_time������ if (order != null && orderType != null) { @@ -311,7 +325,6 @@ result.put("item", items); return result; } - @Override public Map<String, Object> selectDeviceInfoById(Integer deviceId) { @@ -382,6 +395,9 @@ MonitorPoint monitorPoint = device.getMonitorPoint(); mpInfo.put("id", monitorPoint.getId()); mpInfo.put("name", monitorPoint.getName()); + mpInfo.put("areaCode", monitorPoint.getAreaCode()); + mpInfo.put("cityCode", monitorPoint.getCityCode()); + mpInfo.put("provinceCode", monitorPoint.getProvinceCode()); deviceInfo.put("monitorPoint", mpInfo); setDeviceInfoToRedis(mac, deviceInfo); @@ -418,27 +434,74 @@ } @Override - public Map<String, Object> adjustDeviceData(Map<String, Object> deviceData, Map<String, Object> deviceInfo) { - return null; + public Map<String, Object> adjustDeviceData(Map<String, Object> deviceData) { + return adjustDataUtils.adjust(deviceData); } @Override - public Map<String, Object> judgeDeviceState(Map<String, Object> deviceData, Map<String, Object> deviceInfo) { - return null; + public void judgeDeviceState(Map<String, Object> deviceData) { + String mac = deviceData.remove("mac").toString(); + Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac); + Version version = device.getVersion(); + List<Sensor> sensors = version.getSensors(); + Expression expression; + int state = 1; + for (Sensor sensor : sensors) { + //������������������ + String alarmLevel = sensor.getAlarmLevel(); + if (StringUtils.isEmpty(alarmLevel)) { + continue; + } + List<Double> list = JSONObject.parseObject(alarmLevel, List.class); + String sensorCode = sensor.getCode(); + //������������ + String formula = sensor.getFormula(); + //������������������������ + String sensorValue = (String) deviceData.get(sensorCode); + double value = Double.parseDouble(String.format("%.3f", sensorValue)); + //������������ + if (formula != null) { + //������������������ + sensorValue = formula.replace("{0}", sensorValue); + expression = AviatorEvaluator.compile(sensorValue); + value = Double.parseDouble(String.format("%.3f", expression.execute())); + } + int sensorState = judgeState(list, value); + if (sensorState > state) { + state = sensorState; + } + } + //������������������ + UpdateWrapper<Device> updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", device.getId()).set("state", state); + deviceMapper.update(null, updateWrapper); } - private void insertOrganizationUnitAlarm(Integer orgId,Integer versionId){ + //��������������������������� + private int judgeState(List<Double> levels, Double data) { + int state = 1; + for (int i = levels.size() - 1; i >= 0; i--) { + Double level = levels.get(i); + if (data >= level) { + state = i + 2; + break; + } + } + return state; + } + + private void insertOrganizationUnitAlarm(Integer orgId, Integer versionId) { QueryWrapper<OrganizationUnitAlarm> queryOrganizationVersionWrapper = new QueryWrapper<>(); - queryOrganizationVersionWrapper.eq("organization_id",orgId); - queryOrganizationVersionWrapper.eq("version_id",versionId); - queryOrganizationVersionWrapper.eq("is_delete",Constants.NOT_DELETE); + queryOrganizationVersionWrapper.eq("organization_id", orgId); + queryOrganizationVersionWrapper.eq("version_id", versionId); + queryOrganizationVersionWrapper.eq("is_delete", Constants.NOT_DELETE); List<OrganizationUnitAlarm> organizationUnitAlarms = organizationUnitAlarmMapper.selectList(queryOrganizationVersionWrapper); - if(ObjectUtils.isEmpty(organizationUnitAlarms)){ - QueryWrapper<VersionSensorUnit> queryVersionSensorUnitWrapper =new QueryWrapper<>(); - queryVersionSensorUnitWrapper.eq("version_id",versionId); - queryVersionSensorUnitWrapper.eq("is_delete",Constants.NOT_DELETE); + if (ObjectUtils.isEmpty(organizationUnitAlarms)) { + QueryWrapper<VersionSensorUnit> queryVersionSensorUnitWrapper = new QueryWrapper<>(); + queryVersionSensorUnitWrapper.eq("version_id", versionId); + queryVersionSensorUnitWrapper.eq("is_delete", Constants.NOT_DELETE); List<VersionSensorUnit> versionSensorUnits = versionSensorUnitMapper.selectList(queryVersionSensorUnitWrapper); - if(!ObjectUtils.isEmpty(versionSensorUnits)){ + if (!ObjectUtils.isEmpty(versionSensorUnits)) { for (VersionSensorUnit versionSensorUnit : versionSensorUnits) { OrganizationUnitAlarm organizationUnitAlarm = new OrganizationUnitAlarm(); organizationUnitAlarm.setOrganizationId(orgId); @@ -452,19 +515,19 @@ } } - private void deleteOrganizationUnitAlarm(Integer orgId,Integer versionId){ + private void deleteOrganizationUnitAlarm(Integer orgId, Integer versionId) { QueryWrapper<Device> queryOrganizationVersionWrapper = new QueryWrapper<>(); - queryOrganizationVersionWrapper.eq("organization_id",orgId); - queryOrganizationVersionWrapper.eq("device_version_id",versionId); - queryOrganizationVersionWrapper.eq("is_delete",Constants.NOT_DELETE); + queryOrganizationVersionWrapper.eq("organization_id", orgId); + queryOrganizationVersionWrapper.eq("device_version_id", versionId); + queryOrganizationVersionWrapper.eq("is_delete", Constants.NOT_DELETE); List<Device> devices = deviceMapper.selectList(queryOrganizationVersionWrapper); - if(ObjectUtils.isEmpty(devices)){//������������������������������������������������������ + if (ObjectUtils.isEmpty(devices)) {//������������������������������������������������������ UpdateWrapper deleteWrapper = new UpdateWrapper(); - deleteWrapper.eq("organization_id",orgId); - deleteWrapper.eq("version_id",versionId); - deleteWrapper.eq("is_delete",Constants.NOT_DELETE); - deleteWrapper.set("is_delete",Constants.DELETE); - organizationUnitAlarmMapper.update(null,deleteWrapper); + deleteWrapper.eq("organization_id", orgId); + deleteWrapper.eq("version_id", versionId); + deleteWrapper.eq("is_delete", Constants.NOT_DELETE); + deleteWrapper.set("is_delete", Constants.DELETE); + organizationUnitAlarmMapper.update(null, deleteWrapper); } } } diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java new file mode 100644 index 0000000..26598b6 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java @@ -0,0 +1,63 @@ +package com.moral.api.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.moral.api.entity.HistoryHourly; +import com.moral.api.mapper.HistoryHourlyMapper; +import com.moral.api.service.DeviceService; +import com.moral.api.service.HistoryHourlyService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.constant.Constants; +import com.moral.util.DateUtils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * <p> + * ��������� ��������������� + * </p> + * + * @author moral + * @since 2021-06-04 + */ +@Service +public class HistoryHourlyServiceImpl extends ServiceImpl<HistoryHourlyMapper, HistoryHourly> implements HistoryHourlyService { + + @Autowired + private HistoryHourlyMapper historyHourlyMapper; + + @Autowired + private DeviceService deviceService; + + @Override + public void insertHistoryHourly(Map<String, Object> data) { + Map<String, Object> dataAdjust = new HashMap<>(data); + String mac = data.remove("mac").toString(); + Date time = DateUtils.dataToTimeStampTime(new Date(new Long((String) data.remove("DataTime"))), DateUtils.yyyy_MM_dd_HH_EN); + Integer version = (Integer) data.remove("ver"); + Map<String, Object> result = new HashMap<>(data); + result.put("mac", mac); + result.put("time", time); + result.put("version", version); + result.put("timeUnits", Constants.UN_ADJUST); + result.put("value", JSONObject.toJSONString(data)); + //��������������������������� + historyHourlyMapper.insertHistoryHourlyUnAdjust(result); + + //������������ + dataAdjust = deviceService.adjustDeviceData(dataAdjust); + dataAdjust.remove("mac"); + dataAdjust.remove("DataTime"); + dataAdjust.remove("ver"); + HistoryHourly historyHourly = new HistoryHourly(); + historyHourly.setMac(mac); + historyHourly.setTime(time); + historyHourly.setVersion(version); + historyHourly.setValue(JSONObject.toJSONString(dataAdjust)); + historyHourlyMapper.insert(historyHourly); + } +} diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java index 6df638c..9360a70 100644 --- a/screen-manage/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java +++ b/screen-manage/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.Map; -import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.moral.api.mapper.HistoryMinutelyMapper; import com.moral.api.service.DeviceService; import com.moral.api.service.HistoryMinutelyService; @@ -24,30 +24,31 @@ private DeviceService deviceService; @Override - public void insertHistoryMinutely(Map<String, Object> deviceData) { + public void insertHistoryMinutely(Map<String, Object> data) { Map<String, Object> result = new HashMap<>(); - Object mac = deviceData.remove("mac"); + Map<String, Object> dataAdjust = new HashMap<>(data); + Object mac = data.remove("mac"); result.put("mac", mac); - result.put("version", deviceData.remove("ver")); - Date time = new Date((Long) deviceData.remove("DataTime")); - result.put("time", DateUtils.dateToDateString(time)); - result.put("value", JSON.toJSONString(deviceData)); + result.put("version", data.remove("ver")); + Date time = new Date(new Long((String) data.remove("DataTime"))); + result.put("time", DateUtils.dataToTimeStampTime(time,DateUtils.yyyy_MM_dd_HH_mm_EN)); + result.put("value", JSONObject.toJSONString(data)); String timeUnits = DateUtils.dateToDateString(time, DateUtils.yyyyMM_EN); result.put("timeUnits", tableSuffix(timeUnits, Constants.UN_ADJUST)); - //��������� + + //��������������������������� historyMinutelyMapper.insertHistoryMinutely(result); - //������������ - Map<String, Object> deviceInfo = deviceService.getDeviceByMac(mac.toString()); - - //��������������������������������������� + //������������ + dataAdjust = deviceService.adjustDeviceData(dataAdjust); + dataAdjust.remove("mac"); + dataAdjust.remove("DataTime"); + dataAdjust.remove("ver"); result.put("timeUnits", timeUnits); - deviceData = deviceService.adjustDeviceData(deviceData, deviceInfo); - result.put("value", JSON.toJSONString(deviceData)); + result.put("value", JSONObject.toJSONString(dataAdjust)); historyMinutelyMapper.insertHistoryMinutely(result); - //������������������ - Map<String, Object> deviceState = deviceService.judgeDeviceState(deviceData, deviceInfo); + } //��������� @@ -59,5 +60,4 @@ } return key.toString(); } - } diff --git a/screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java b/screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java new file mode 100644 index 0000000..36fdf60 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java @@ -0,0 +1,97 @@ +package com.moral.api.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSON; +import com.googlecode.aviator.AviatorEvaluator; +import com.googlecode.aviator.Expression; +import com.moral.api.entity.DeviceAdjustValue; +import com.moral.api.service.DeviceService; +import com.moral.constant.RedisConstants; +import com.moral.util.DateUtils; + +@Slf4j +@Component +public class AdjustDataUtils { + + @Autowired + private DeviceService deviceService; + + @Autowired + private RedisTemplate redisTemplate; + + public Map<String, Object> adjust(Map<String, Object> deviceData) { + try { + Object dataTime = deviceData.get("DataTime"); + String mac = deviceData.get("mac").toString(); + //��������������������������� + long time = Math.round(new Double((String) dataTime) / 1000) * 1000L; + long finalTime = DateUtils.dataToTimeStampTime(new Date(time), DateUtils.HH_mm_ss_EN).getTime(); + //������������ + Map<String, Object> deviceInfo = deviceService.getDeviceByMac(mac); + Map<String, Object> monitorPoint = (Map<String, Object>) deviceInfo.get("monitorPoint"); + Object areaCode = monitorPoint.get("areaCode"); + Object cityCode = monitorPoint.get("cityCode"); + for (String key : deviceData.keySet()) { + if (!key.equals("mac") && !key.equals("time") && !key.equals("DataTime") && !key.equals("ver") && !key.contains("Flag")) { + //��������� + Object measuredValue = deviceData.get(key); + List<DeviceAdjustValue> adjustValues = (List<DeviceAdjustValue>) redisTemplate.opsForHash().get(RedisConstants.ADJUST + "_" + mac, key); + if (ObjectUtils.isEmpty(adjustValues)) { + deviceData.put(key, measuredValue); + continue; + } + + //��������������������������������� + DeviceAdjustValue deviceAdjustValue = adjustValues.stream() + .filter(o -> o.getStartTime().getTime() <= finalTime && o.getEndTime().getTime() > finalTime) + .findFirst().get(); + String adjustValue = deviceAdjustValue.getValue(); + if (ObjectUtils.isEmpty(adjustValue)) { + deviceData.put(key, measuredValue); + continue; + } + + Expression expression = AviatorEvaluator.compile(adjustValue); + Map<String, Object> env = new HashMap<>(); + if (adjustValue.contains("aqi")) { + Object aqiValue = redisTemplate.opsForHash().get("aqi_" + areaCode, key); + if (ObjectUtils.isEmpty(aqiValue)) { + aqiValue = redisTemplate.opsForHash().get("aqi_" + cityCode, key); + } + env.put("aqi", ObjectUtils.isEmpty(aqiValue) ? 0F : Float.parseFloat((String) aqiValue)); + } + if (adjustValue.contains("vocs")) { + Object vocsValue = ObjectUtils.isEmpty(deviceData.get("a99054")) ? 0F : deviceData.get("a99054"); + env.put("vocs", vocsValue); + } + if (adjustValue.contains("cel")) { + env.put("cel", Float.parseFloat((String) measuredValue)); + } + //������ + measuredValue = expression.execute(env); + //������������ + if (Float.parseFloat(measuredValue.toString()) < 0 && !"a01001".equals(measuredValue)) { + measuredValue = 0F; + } + deviceData.put(key, Double.parseDouble(String.format("%.3f", measuredValue))); + + } + } + } catch (Exception e) { + log.error("param[0] deviceData:" + JSON.toJSONString(deviceData)); + log.error(e.getMessage()); + } + return deviceData; + } + +} diff --git a/screen-manage/src/main/resources/application-dev.yml b/screen-manage/src/main/resources/application-dev.yml index 4a6899a..e81262e 100644 --- a/screen-manage/src/main/resources/application-dev.yml +++ b/screen-manage/src/main/resources/application-dev.yml @@ -92,12 +92,9 @@ enable: auto: commit: false - group: - id: test servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 session: timeout: 6000 - topic: test_topic zookeeper: connect: 192.168.0.16:2181,192.168.0.17:2181,192.168.0.18:2181 producer: diff --git a/screen-manage/src/main/resources/mapper/DeviceMapper.xml b/screen-manage/src/main/resources/mapper/DeviceMapper.xml index 6e7f549..d1c0809 100644 --- a/screen-manage/src/main/resources/mapper/DeviceMapper.xml +++ b/screen-manage/src/main/resources/mapper/DeviceMapper.xml @@ -49,7 +49,9 @@ <association property="monitorPoint" javaType="com.moral.api.entity.MonitorPoint"> <result column="mp_id" property="id"/> <result column="mp_name" property="name"/> - <result column="mp_address" property="address"/> + <result column="mp_area_code" property="areaCode"/> + <result column="mp_city_code" property="cityCode"/> + <result column="mp_province_code" property="provinceCode"/> </association> <!--������--> @@ -116,7 +118,9 @@ o.`name` org_name, mp.id mp_id, mp.`name` mp_name, - mp.address mp_address, + mp.area_code mp_area_code, + mp.city_code mp_city_code, + mp.province_code mp_province_code, ma.id operate_id, v.id version_id, v.`name` version_name, diff --git a/screen-manage/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-manage/src/main/resources/mapper/HistoryHourlyMapper.xml new file mode 100644 index 0000000..a2dde7f --- /dev/null +++ b/screen-manage/src/main/resources/mapper/HistoryHourlyMapper.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.moral.api.mapper.HistoryHourlyMapper"> + + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryHourly"> + <result column="mac" property="mac"/> + <result column="time" property="time"/> + <result column="value" property="value"/> + <result column="version" property="version"/> + </resultMap> + + <insert id="insertHistoryHourlyUnAdjust"> + INSERT INTO history_hourly_${timeUnits} VALUES (#{mac}, #{time}, #{value}, #{version}) + </insert> + +</mapper> \ No newline at end of file -- Gitblit v1.8.0