From eb51b2364e9a3fbe806fde61fa255660a098fc8b Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Thu, 24 Jun 2021 14:06:41 +0800
Subject: [PATCH] Merge branch 'dev' of http://blit.7drlb.com:8888/r/moral into dev

---
 screen-job/src/main/java/com/moral/api/service/DeviceService.java                       |   20 
 screen-api/src/main/java/com/moral/api/service/impl/GroupServiceImpl.java               |   32 
 screen-api/src/main/java/com/moral/api/service/GroupMenuService.java                    |    2 
 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-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java                |   83 +
 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                                       |   13 
 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-api/src/main/java/com/moral/api/service/impl/UserGroupServiceImpl.java           |   16 
 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                                    |    5 
 screen-api/src/main/java/com/moral/api/controller/MenuController.java                   |    4 
 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-manage/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java           |   25 
 screen-job/src/main/java/com/moral/api/config/redis/RedisConfig.java                    |   67 +
 screen-manage/src/main/resources/application-dev.yml                                    |    9 
 screen-job/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java          |    9 
 screen-manage/src/main/resources/mapper/HistoryHourlyMapper.xml                         |   17 
 screen-api/src/main/java/com/moral/api/entity/Group.java                                |    2 
 screen-manage/src/main/resources/mapper/DeviceMapper.xml                                |    8 
 myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java                         |    3 
 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                     |   81 +
 .gitignore                                                                              |    5 
 screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java                        |   50 +
 screen-job/src/main/resources/logback-spring.xml                                        |   56 +
 screen-api/src/main/java/com/moral/api/service/GroupService.java                        |    9 
 screen.iml                                                                              |  125 ++
 pom.xml                                                                                 |    9 
 screen-api/src/main/java/com/moral/api/controller/GroupController.java                  |   37 
 screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java             |  123 ++
 screen-api/src/main/java/com/moral/api/kafka/consumer/SecondsDataConsumer.java          |    2 
 screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java       |   31 
 screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java         |    4 
 screen-api/src/main/java/com/moral/api/service/UserService.java                         |   12 
 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-api/src/main/java/com/moral/api/entity/User.java                                 |    7 
 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                      |   32 
 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-api/src/main/java/com/moral/api/service/impl/GroupMenuServiceImpl.java           |    6 
 screen-manage/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java           |  175 ++-
 screen-api/src/main/java/com/moral/api/controller/LoginController.java                  |   32 
 screen-api/src/main/java/com/moral/api/controller/UserController.java                   |   31 
 myBatisPlusGenerator/myBatisPlusGenerator.iml                                           |  137 +++
 screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java         |   13 
 screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java          |   77 +
 screen-api/src/main/java/com/moral/api/service/UserGroupService.java                    |    3 
 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 +
 83 files changed, 2,355 insertions(+), 309 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9a8a286..fae67da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,8 @@
 myBatisPlusGenerator/src/test/
 screen-common/src/main/resources/
 screen-manage/src/test/
+/home
+/screen-api/screen-api.iml
+/screen-job/screen-job.iml
+/screen-common/screen-common.iml
+/screen-manage/screen-manage.iml
\ No newline at end of file
diff --git a/myBatisPlusGenerator/myBatisPlusGenerator.iml b/myBatisPlusGenerator/myBatisPlusGenerator.iml
new file mode 100644
index 0000000..9128d11
--- /dev/null
+++ b/myBatisPlusGenerator/myBatisPlusGenerator.iml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.velocity:velocity-engine-core:2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.10.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:18.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.xiaoymin:swagger-bootstrap-ui:1.9.6" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.2.12.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-streams:2.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:connect-json:2.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:connect-api:2.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.rocksdb:rocksdbjni:5.15.10" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-clients:2.2.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.luben:zstd-jni:1.3.8-1" level="project" />
+    <orderEntry type="library" name="Maven: org.lz4:lz4-java:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.1.7.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.16" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.16" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.kaptcha:kaptcha:2.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" />
+    <orderEntry type="library" name="Maven: com.xuxueli:xxl-job-core:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.45.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.groovy:groovy:2.5.9" level="project" />
+    <orderEntry type="library" name="Maven: com.googlecode.aviator:aviator:5.2.5" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java b/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java
index 23d5672..1ace387 100644
--- a/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java
+++ b/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java
@@ -43,7 +43,7 @@
         // ������������
         GlobalConfig gc = new GlobalConfig();
         //String projectPath = System.getProperty("user.dir");
-        String projectPath="C:\\Users\\cdl\\Desktop\\comProject\\newProject\\moral\\screen-manage\\";
+        String projectPath="D:\\tools\\IdeaProjects\\moral\\screen-job";
         gc.setOutputDir(projectPath + "/src/main/java");
         gc.setAuthor("moral");
         gc.setOpen(false);
@@ -67,6 +67,7 @@
 
         // ���������������
         DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC");
         dsc.setUrl("jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
diff --git a/pom.xml b/pom.xml
index 247deb0..10090e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@
         <swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version>
         <spring.kafka.version>2.2.2</spring.kafka.version>
         <xxl-job.version>2.3.0</xxl-job.version>
+        <aviator.version>5.2.5</aviator.version>
     </properties>
 
 
@@ -51,7 +52,6 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
@@ -126,6 +126,13 @@
             <artifactId>xxl-job-core</artifactId>
             <version>${xxl-job.version}</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
+        <dependency>
+            <groupId>com.googlecode.aviator</groupId>
+            <artifactId>aviator</artifactId>
+            <version>${aviator.version}</version>
+        </dependency>
+
     </dependencies>
 
 
diff --git a/screen-api/src/main/java/com/moral/api/controller/GroupController.java b/screen-api/src/main/java/com/moral/api/controller/GroupController.java
index 3223ef9..302b910 100644
--- a/screen-api/src/main/java/com/moral/api/controller/GroupController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/GroupController.java
@@ -17,7 +17,6 @@
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.moral.api.entity.Group;
 import com.moral.api.service.GroupService;
@@ -25,6 +24,7 @@
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.constant.ResultMessage;
 import com.moral.util.PageResult;
+import com.moral.util.WebUtils;
 
 @Slf4j
 @Api(tags = {"���������"})
@@ -57,21 +57,16 @@
 
     @ApiOperation(value = "���������", notes = "���������")
     @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "���id", required = true, paramType = "query", dataType = "int"),
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
-    @RequestMapping(value = "delete", method = RequestMethod.POST)
-    public ResultMessage delete(@RequestBody Group group) {
-        if (group.getId() == null) {
+    @RequestMapping(value = "delete", method = RequestMethod.GET)
+    public ResultMessage delete(Integer id) {
+        if (id == null) {
             return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
                     ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
         }
-        QueryWrapper<Group> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("id", group.getId());
-        group = groupService.getOne(queryWrapper);
-        if (group == null) {
-            return ResultMessage.fail(ResponseCodeEnum.ACCOUNT_NOT_EXIST.getCode(), ResponseCodeEnum.ACCOUNT_NOT_EXIST.getMsg());
-        }
-        groupService.deleteGroup(group);
+        groupService.deleteGroup(id);
         return ResultMessage.ok();
     }
 
@@ -80,8 +75,7 @@
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
     @RequestMapping(value = "update", method = RequestMethod.POST)
-    public ResultMessage update(@RequestBody Group group, HttpServletRequest request) {
-        String token = request.getHeader("token");
+    public ResultMessage update(@RequestBody Group group) {
         Map<String, Object> result = groupService.updateGroup(group);
         if (!result.isEmpty()) {
             return ResultMessage.fail((int) result.get("code"), result.get("msg").toString());
@@ -98,8 +92,9 @@
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
             @ApiImplicitParam(name = "groupName", value = "������������������", required = false, paramType = "query", dataType = "String")
     })
-    @RequestMapping(value = "select", method = RequestMethod.POST)
-    public ResultMessage select(@RequestBody Map<String, Object> parameters) {
+    @RequestMapping(value = "select", method = RequestMethod.GET)
+    public ResultMessage select(HttpServletRequest request) {
+        Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null);
         Page<Group> userPage = groupService.selectGroups(parameters);
         PageResult<Group> pageResult = new PageResult<>(
                 userPage.getTotal(), userPage.getPages(), userPage.getRecords()
@@ -109,12 +104,18 @@
 
     @ApiOperation(value = "���������������������ids", notes = "���������������������ids")
     @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "������id", required = true, paramType = "query", dataType = "int"),
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
-    @RequestMapping(value = "get-group-ids", method = RequestMethod.GET)
+    @RequestMapping(value = "getGroupIds", method = RequestMethod.GET)
     public ResultMessage getGroupIds(Integer userId) {
-        List<Integer> groupIds = userGroupService.getGroupIds(userId);
-        return ResultMessage.ok(groupIds);
+        System.out.println(userId);
+        if (userId == null) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
+                    ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
+        List<Map<String, Object>> groups = groupService.getGroupIds(userId);
+        return ResultMessage.ok(groups);
     }
 
     @ApiOperation(value = "���������������", notes = "���������������")
diff --git a/screen-api/src/main/java/com/moral/api/controller/LoginController.java b/screen-api/src/main/java/com/moral/api/controller/LoginController.java
index 2f34eee..ea704fe 100644
--- a/screen-api/src/main/java/com/moral/api/controller/LoginController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/LoginController.java
@@ -7,6 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -22,7 +23,6 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.SysConfig;
 import com.moral.api.service.SysConfigService;
-import com.moral.api.service.UserLogService;
 import com.moral.api.service.UserService;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
@@ -50,25 +50,35 @@
                     ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
         }
         Map<String, Object> result = userService.login(parameters);
-        if (!result.containsKey("data")) {
+        if (!result.containsKey("token")) {
             return ResultMessage.fail((int) result.get("code"), (String) result.get("msg"));
         }
-        Map<String, Object> data = (Map<String, Object>) result.get("data");
-        return ResultMessage.ok(data);
+        return ResultMessage.ok(result);
     }
 
-    @ApiOperation(value = "������", notes = "������")
-    @RequestMapping(value = "logout", method = RequestMethod.POST)
+    @ApiOperation(value = "������������������", notes = "������������������")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
-    public ResultMessage logout(@RequestBody Map<String, Object> parameters, HttpServletRequest request) {
-        if (!parameters.containsKey("uid")) {
+    @RequestMapping(value = "getUserInfo", method = RequestMethod.POST)
+    public ResultMessage getUserInfo(HttpServletRequest request) {
+        String token = request.getHeader("token");
+        Map<String, Object> result = userService.getUserInfo(token);
+        return ResultMessage.ok(result);
+    }
+
+    @ApiOperation(value = "������", notes = "������")
+    @RequestMapping(value = "logout", method = RequestMethod.GET)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
+    })
+    public ResultMessage logout(Integer userId, HttpServletRequest request) {
+        if (userId == null) {
             return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
                     ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
         }
         String token = request.getHeader("token");
-        TokenUtils.destoryToken(parameters.get("uid").toString(), token);
+        TokenUtils.destoryToken(userId.toString(), token);
         return ResultMessage.ok();
     }
 
@@ -79,9 +89,9 @@
         queryWrapper.eq(Constants.FRONT_VERIFICATIONCODE_COLUMN, Constants.FRONT_ERIFICATIONCODE_VALUE);
         SysConfig sysConfig = sysConfigService.getOne(queryWrapper);
         if (Constants.VERFICATIONCODE_OPEN.equals(sysConfig.getCode())) {
-            return new ResultMessage(ResponseCodeEnum.VERIFICATION_OPEN,null);
+            return new ResultMessage(ResponseCodeEnum.VERIFICATION_OPEN, null);
         }
-        return new ResultMessage(ResponseCodeEnum.VERIFICATION_CLOSE,null);
+        return new ResultMessage(ResponseCodeEnum.VERIFICATION_CLOSE, null);
     }
 
     @ApiOperation(value = "���������������", notes = "���������������")
diff --git a/screen-api/src/main/java/com/moral/api/controller/MenuController.java b/screen-api/src/main/java/com/moral/api/controller/MenuController.java
index f8b69ba..7ae682a 100644
--- a/screen-api/src/main/java/com/moral/api/controller/MenuController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/MenuController.java
@@ -67,7 +67,7 @@
     @ApiImplicitParams({
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
     })
-    @RequestMapping(value = "select", method = RequestMethod.POST)
+    @RequestMapping(value = "select", method = RequestMethod.GET)
     public ResultMessage select(HttpServletRequest request) {
         String token = request.getHeader("token");
         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(token);
@@ -80,7 +80,7 @@
     @ApiImplicitParams({
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
-    @RequestMapping(value = "get-menu-ids", method = RequestMethod.GET)
+    @RequestMapping(value = "getMenuIds", method = RequestMethod.GET)
     public ResultMessage getMenuIds(Integer groupId) {
         List<Integer> menusIds = groupMenuService.getMenusIds(groupId);
         return ResultMessage.ok(menusIds);
diff --git a/screen-api/src/main/java/com/moral/api/controller/UserController.java b/screen-api/src/main/java/com/moral/api/controller/UserController.java
index ba6d30a..39b7c5a 100644
--- a/screen-api/src/main/java/com/moral/api/controller/UserController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/UserController.java
@@ -24,6 +24,7 @@
 import com.moral.constant.ResponseCodeEnum;
 import com.moral.constant.ResultMessage;
 import com.moral.util.PageResult;
+import com.moral.util.WebUtils;
 
 @Slf4j
 @Api(tags = {"������������"})
@@ -40,6 +41,7 @@
     })
     @RequestMapping(value = "insert", method = RequestMethod.POST)
     public ResultMessage insert(@RequestBody User user) {
+        System.out.println(user);
         if (user.getAccount().isEmpty() || user.getPassword().isEmpty()) {
             return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
                     ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
@@ -53,22 +55,16 @@
 
     @ApiOperation(value = "������������", notes = "������������")
     @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "������id", required = true, paramType = "query", dataType = "int"),
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
     })
-    @RequestMapping(value = "delete", method = RequestMethod.POST)
-    public ResultMessage delete(@RequestBody User user) {
-        if (user.getId() == null) {
+    @RequestMapping(value = "delete", method = RequestMethod.GET)
+    public ResultMessage delete(Integer id) {
+        if (id == null) {
             return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
                     ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
         }
-        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("id", user.getId());
-        user = userService.getOne(queryWrapper);
-        if (user == null) {
-            return ResultMessage.fail(ResponseCodeEnum.ACCOUNT_NOT_EXIST.getCode(),
-                    ResponseCodeEnum.ACCOUNT_NOT_EXIST.getMsg());
-        }
-        userService.deleteUser(user);
+        userService.deleteUser(id);
         return ResultMessage.ok();
     }
 
@@ -91,8 +87,8 @@
 
     @ApiOperation(value = "������������������������", notes = "������������������������")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "page", value = "���������", required = false, paramType = "query", dataType = "Integer"),
-            @ApiImplicitParam(name = "size", value = "������������", required = false, paramType = "query", dataType = "Integer"),
+            @ApiImplicitParam(name = "page", value = "���������", required = false, paramType = "query", dataType = "int"),
+            @ApiImplicitParam(name = "size", value = "������������", required = false, paramType = "query", dataType = "int"),
             @ApiImplicitParam(name = "order", value = "������������", required = false, paramType = "query", dataType = "String"),
             @ApiImplicitParam(name = "orderType", value = "������������������������0������������1", defaultValue = "0", required = false, paramType = "query", dataType = "String"),
             @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String"),
@@ -103,8 +99,13 @@
             @ApiImplicitParam(name = "wechat", value = "������������������", required = false, paramType = "query", dataType = "String"),
 
     })
-    @RequestMapping(value = "select", method = RequestMethod.POST)
-    public ResultMessage select(@RequestBody Map<String, Object> parameters) {
+    @RequestMapping(value = "select", method = RequestMethod.GET)
+    public ResultMessage select(HttpServletRequest request) {
+        Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null);
+        if (!parameters.containsKey("page") || !parameters.containsKey("size")) {
+            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(),
+                    ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
+        }
         Page<User> userPage = userService.selectUsers(parameters);
         PageResult<User> pageResult = new PageResult<>(
                 userPage.getTotal(), userPage.getPages(), userPage.getRecords()
diff --git a/screen-api/src/main/java/com/moral/api/entity/Group.java b/screen-api/src/main/java/com/moral/api/entity/Group.java
index dc0d63e..0b79a9b 100644
--- a/screen-api/src/main/java/com/moral/api/entity/Group.java
+++ b/screen-api/src/main/java/com/moral/api/entity/Group.java
@@ -22,7 +22,7 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
-@TableName("`groupMenu`")
+@TableName("`group`")
 public class Group extends Model<Group> {
 
     private static final long serialVersionUID = 1L;
diff --git a/screen-api/src/main/java/com/moral/api/entity/User.java b/screen-api/src/main/java/com/moral/api/entity/User.java
index 678ff19..cf22cd8 100644
--- a/screen-api/src/main/java/com/moral/api/entity/User.java
+++ b/screen-api/src/main/java/com/moral/api/entity/User.java
@@ -13,9 +13,7 @@
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-
-import javax.persistence.Transient;
-
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -93,7 +91,8 @@
     /**
      * ������������
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date expireTime;
 
     /**
diff --git a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondsDataConsumer.java b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondsDataConsumer.java
index 710e4a9..6b412cd 100644
--- a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondsDataConsumer.java
+++ b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondsDataConsumer.java
@@ -19,7 +19,7 @@
  * @Date 2021/6/15 14:49
  * @Version TODO
  **/
-@Component
+//@Component
 public class SecondsDataConsumer implements ConsumerSeekAware {
 
     @KafkaListener(topics = "test",groupId = "SecondsDataGroup3")
diff --git a/screen-api/src/main/java/com/moral/api/service/GroupMenuService.java b/screen-api/src/main/java/com/moral/api/service/GroupMenuService.java
index 45edad9..70d23fb 100644
--- a/screen-api/src/main/java/com/moral/api/service/GroupMenuService.java
+++ b/screen-api/src/main/java/com/moral/api/service/GroupMenuService.java
@@ -16,7 +16,9 @@
  */
 public interface GroupMenuService extends IService<GroupMenu> {
 
+    //������������
     void allotMenus(Map<String, Object> parameters);
 
+    //���������������������������������������
     List<Integer> getMenusIds(Integer groupId);
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/GroupService.java b/screen-api/src/main/java/com/moral/api/service/GroupService.java
index 02c1ea8..cde76b5 100644
--- a/screen-api/src/main/java/com/moral/api/service/GroupService.java
+++ b/screen-api/src/main/java/com/moral/api/service/GroupService.java
@@ -18,12 +18,19 @@
  */
 public interface GroupService extends IService<Group> {
 
+    //���������������������
     Map<String, Object> addGroup(Group group);
 
-    void deleteGroup(Group group);
+    //���������������������
+    void deleteGroup(Integer id);
 
+    //���������������������
     Map<String, Object> updateGroup(Group group);
 
+    //���������������������������
     Page<Group> selectGroups(Map<String, Object> parameters);
 
+    //���������������������������
+    List<Map<String, Object>> getGroupIds(Integer userId);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/UserGroupService.java b/screen-api/src/main/java/com/moral/api/service/UserGroupService.java
index 4bf9c24..8743a60 100644
--- a/screen-api/src/main/java/com/moral/api/service/UserGroupService.java
+++ b/screen-api/src/main/java/com/moral/api/service/UserGroupService.java
@@ -1,6 +1,5 @@
 package com.moral.api.service;
 
-import java.util.List;
 import java.util.Map;
 
 import com.moral.api.entity.UserGroup;
@@ -16,7 +15,7 @@
  */
 public interface UserGroupService extends IService<UserGroup> {
 
+    //���������������������������
     void allotGroups(Map<String, Object> parameters);
 
-    List<Integer> getGroupIds(Integer userId);
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/UserService.java b/screen-api/src/main/java/com/moral/api/service/UserService.java
index 5680a37..90e5581 100644
--- a/screen-api/src/main/java/com/moral/api/service/UserService.java
+++ b/screen-api/src/main/java/com/moral/api/service/UserService.java
@@ -20,18 +20,28 @@
  */
 public interface UserService extends IService<User> {
 
+    //������
     Map<String, Object> login(Map<String, Object> parameters);
 
+    //������token������������������
+    Map<String,Object> getUserInfo(String token);
+
+    //������������
     Map<String, Object> getMenus(Map<String, Object> parameters);
 
+    //������������
     Map<String, Object> addUser(User user);
 
-    void deleteUser(User user);
+    //������������
+    void deleteUser(Integer userId);
 
+    //������������
     Map<String, Object> updateUser(User user);
 
+    //������������������
     Page<User> selectUsers(Map<String, Object> parameters);
 
+    //������������������������������������
     UserBO selectUserInfo(Map<String, Object> parameters);
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/GroupMenuServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/GroupMenuServiceImpl.java
index 7ddf506..ec6709b 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/GroupMenuServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/GroupMenuServiceImpl.java
@@ -20,6 +20,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -62,7 +63,7 @@
         deleteWrapper.eq("group_id", groupId).eq("channel_key", Constants.WEB_CHANNEL);
         groupMenuMapper.delete(deleteWrapper);
         List<String> menus = new ArrayList<>();
-        if (menuIds != null && !menuIds.isEmpty()) {
+        if (!ObjectUtils.isEmpty(menuIds)) {
             menuIds.forEach(menuId -> {
                 menus.add(menuMapper.selectById(menuId).getName());
                 GroupMenu groupMenu = new GroupMenu();
@@ -74,10 +75,9 @@
             });
         }
 
-
         //������
         String groupName = groupMapper.selectById((Integer) parameters.get("groupId")).getGroupName();
-        String content = "���������" + groupName + "������������������" + menus.toString();
+        String content = "���������" + groupName + "������������������" + menus;
         operationLogUtils.insertLog(request, content, Constants.UPDATE_OPERATE_TYPE);
     }
 
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/GroupServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/GroupServiceImpl.java
index f03442c..166a709 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/GroupServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/GroupServiceImpl.java
@@ -2,6 +2,7 @@
 
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -80,21 +81,22 @@
     }
 
     @Override
-    public void deleteGroup(Group group) {
+    public void deleteGroup(Integer id) {
         //������������group
-        group.setIsDelete(Constants.DELETE);
-        groupMapper.updateById(group);
+        UpdateWrapper<Group> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", id).set("is_delete", Constants.DELETE);
+        groupMapper.update(null, updateWrapper);
         //������group_menu
         UpdateWrapper<GroupMenu> deleteGroupWrapper = new UpdateWrapper<>();
-        deleteGroupWrapper.eq("group_id", group.getId());
+        deleteGroupWrapper.eq("group_id", id);
         groupMenuMapper.delete(deleteGroupWrapper);
         //������user_group
         UpdateWrapper<UserGroup> deleteUserGroupWrapper = new UpdateWrapper<>();
-        deleteUserGroupWrapper.eq("group_id", group.getId());
+        deleteUserGroupWrapper.eq("group_id", id);
         userGroupMapper.delete(deleteUserGroupWrapper);
         //������
         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
-        String content = "���������������" + group.getGroupName();
+        String content = "���������������" + groupMapper.selectById(id).getGroupName();
         operationLogUtils.insertLog(request, content, Constants.DELETE_OPERATE_TYPE);
     }
 
@@ -136,7 +138,8 @@
         Integer orgId = (Integer) orgInfo.get("id");
         QueryWrapper<Group> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("organization_id", orgId)
-                .eq("is_delete", Constants.NOT_DELETE);
+                .eq("is_delete", Constants.NOT_DELETE)
+                .ne("group_name", "admin");
         Object order = parameters.get("order");
         Object orderType = parameters.get("orderType");
         Object groupName = parameters.get("groupName");
@@ -145,18 +148,9 @@
             queryWrapper.like("group_name", groupName);
         }
 
-        //������������
-        if (!parameters.containsKey("page")) {
-            parameters.put("page", 0);
-        }
-        if (!parameters.containsKey("size")) {
-            parameters.put("size", 10);
-        }
-
         int page = Integer.parseInt(parameters.get("page").toString());
         int size = Integer.parseInt(parameters.get("size").toString());
         Page<Group> pageData = new Page<>(page, size);
-        //������������,������id������
         //������������,������create_time������
         if (order != null && orderType != null) {
             if (Constants.ORDER_ASC.equals(orderType)) {
@@ -171,4 +165,10 @@
         return pageData;
     }
 
+    @Override
+    public List<Map<String, Object>> getGroupIds(Integer userId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("userId", userId);
+        return groupMapper.selectUserGroup(params);
+    }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserGroupServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserGroupServiceImpl.java
index 4515798..bcdc290 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/UserGroupServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/UserGroupServiceImpl.java
@@ -5,7 +5,6 @@
 import java.util.Map;
 import java.util.Objects;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.moral.api.entity.UserGroup;
 import com.moral.api.mapper.GroupMapper;
@@ -20,6 +19,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -62,7 +62,7 @@
         deleteWrapper.eq("user_id", userId);
         userGroupMapper.delete(deleteWrapper);
         List<String> groups = new ArrayList<>();
-        if (groupIds != null && !groupIds.isEmpty()) {
+        if (!ObjectUtils.isEmpty(groupIds)) {
             groupIds.forEach(groupId -> {
                 groups.add(groupMapper.selectById(groupId).getGroupName());
                 UserGroup userGroup = new UserGroup();
@@ -75,17 +75,7 @@
 
         //������
         String account = userMapper.selectById((Integer) parameters.get("userId")).getAccount();
-        String content = "������������" + account + "���������������" + groups.toString();
+        String content = "������������" + account + "���������������" + groups;
         operationLogUtils.insertLog(request, content, Constants.UPDATE_OPERATE_TYPE);
-    }
-
-    @Override
-    public List<Integer> getGroupIds(Integer userId) {
-        QueryWrapper<UserGroup> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("user_id", userId).eq("is_delete", Constants.NOT_DELETE);
-        List<UserGroup> userGroups = userGroupMapper.selectList(queryWrapper);
-        List<Integer> groupIds = new ArrayList<>();
-        userGroups.forEach(userGroup -> groupIds.add(userGroup.getGroupId()));
-        return groupIds;
     }
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
index 9a82667..12dad29 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -1,9 +1,11 @@
 package com.moral.api.service.impl;
 
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -57,6 +59,7 @@
  * @since 2021-03-09
  */
 @Service
+@Slf4j
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 
     @Autowired
@@ -76,7 +79,6 @@
 
     @Value("${AES.KEY}")
     private String AESKey;
-
 
     @Override
     public UserBO selectUserInfo(Map<String, Object> parameters) {
@@ -153,14 +155,12 @@
         try {
             //������token������������redis
             String token = TokenUtils.getToken(userBo.getId().toString(), userInfo);
-            Map<String, Object> data = new HashMap<>();
-            data.put("token", token);
-            data.put("user", userInfo);
-            result.put("data", data);
+            result.put("token", token);
         } catch (Exception e) {
             log.error("token���������������" + e.getMessage());
             result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode());
             result.put("msg", ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg());
+            return result;
         }
         //������
         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
@@ -172,6 +172,12 @@
         userLog.setContent("������������������" + userBo.getAccount());
         userLogMapper.insert(userLog);
         return result;
+    }
+
+    @Override
+    public Map<String, Object> getUserInfo(String token) {
+        Map<String, Object> userInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(token);
+        return userInfo;
     }
 
     @Override
@@ -195,10 +201,10 @@
         oneMenu.forEach(o -> {
             Map<String, Object> menuMap = new LinkedHashMap<>();
             menuMap.put("id", o.getId());
-            menuMap.put("name", o.getName());
+            menuMap.put("label", o.getName());
             menuMap.put("url", o.getUrl());
             menuMap.put("icon", o.getIcon());
-            menuMap.put("child", getMenusByRecursion(o, allMenus));
+            menuMap.put("children", getMenusByRecursion(o, allMenus));
             newList.add(menuMap);
         });
         resultMap.put("menus", newList);
@@ -242,24 +248,25 @@
         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("account", user.getAccount()).eq("is_delete", Constants.NOT_DELETE);
         //������������������������
-        if (user.selectOne(queryWrapper) != null) {
+        if (user.selectCount(queryWrapper) > 0) {
             result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode());
             result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg());
             return result;
         }
-        //������������������
+        //������������
         if (!RegexUtils.checkAccount(user.getAccount())) {
             result.put("code", ResponseCodeEnum.ACCOUNT_INVALID.getCode());
             result.put("msg", ResponseCodeEnum.ACCOUNT_INVALID.getMsg());
             return result;
         }
-        //������������������
-        if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) {
+
+        //������������
+        if (!ObjectUtils.isEmpty(user.getEmail()) && !RegexUtils.checkEmail(user.getEmail())) {
             result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode());
             result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg());
             return result;
         }
-        //������������������
+        //������������
         String password = user.getPassword();
         //������������
         password = AESUtils.decrypt(password, AESKey);
@@ -268,8 +275,8 @@
             result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg());
             return result;
         }
-        //���������������������
-        if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) {
+        //���������������
+        if (!ObjectUtils.isEmpty(user.getMobile()) && !RegexUtils.checkMobile(user.getMobile())) {
             result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode());
             result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg());
             return result;
@@ -304,19 +311,20 @@
 
     @Override
     @Transactional
-    public void deleteUser(User user) {
-        String userId = user.getId().toString();
+    public void deleteUser(Integer userId) {
+        User user = userMapper.selectById(userId);
         //������������user
-        user.setIsDelete(Constants.DELETE);
-        userMapper.updateById(user);
+        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.eq("id", userId).set("is_delete", Constants.DELETE);
+        userMapper.update(null, updateWrapper);
         //������user_group
         UpdateWrapper<UserGroup> deleteWrapper = new UpdateWrapper<>();
         deleteWrapper.eq("user_id", userId);
         userGroupMapper.delete(deleteWrapper);
-        //������redis
-        if (TokenUtils.hHasKey(userId)) {
-            String token = TokenUtils.hget(userId).toString();
-            TokenUtils.destoryToken(userId, token);
+        //������redis
+        if (TokenUtils.hHasKey(userId.toString())) {
+            String token = TokenUtils.hget(userId.toString()).toString();
+            TokenUtils.destoryToken(userId.toString(), token);
         }
         //������
         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
@@ -330,25 +338,36 @@
         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
         String token = request.getHeader("token");
 
+        Map<String, Object> result = new HashMap<>();
         //���������������
         Map<String, Object> update = JSONObject.parseObject(JSON.toJSONString(user), Map.class);
-        Map<String, Object> result = new HashMap<>();
         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(token);
         User beforeUser = userMapper.selectById(user.getId());
         Map<String, Object> before = JSONObject.parseObject(JSON.toJSONString(beforeUser), Map.class);
-        String account = beforeUser.getAccount();
+        /*String account = beforeUser.getAccount();
         //account������������
-        user.setAccount(account);
+        user.setAccount(account);*/
+        System.out.println(user);
+        if (!ObjectUtils.isEmpty(user.getAccount())) {
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("is_delete", Constants.NOT_DELETE).eq("account", user.getAccount());
+            if (userMapper.selectCount(queryWrapper) > 0) {
+                result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode());
+                result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg());
+                return result;
+            }
+        }
 
         //������������
-        if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) {
+        if (!ObjectUtils.isEmpty(user.getEmail()) && !RegexUtils.checkEmail(user.getEmail())) {
             result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode());
             result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg());
             return result;
         }
         //������������
         String password = user.getPassword();
-        if (password != null) {
+        System.out.println("password==" + password);
+        if (!ObjectUtils.isEmpty(password)) {
             //������������
             password = AESUtils.decrypt(password, AESKey);
             if (!RegexUtils.checkPassword(password)) {
@@ -359,7 +378,7 @@
         }
 
         //���������������������
-        if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) {
+        if (!ObjectUtils.isEmpty(user.getMobile()) && !RegexUtils.checkMobile(user.getMobile())) {
             result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode());
             result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg());
             return result;
@@ -404,7 +423,6 @@
             }
         }
         operationLogUtils.insertLog(request, content.toString(), Constants.UPDATE_OPERATE_TYPE);
-
         return result;
     }
 
@@ -417,7 +435,8 @@
         Map<String, Object> orgInfo = (Map<String, Object>) currentUserInfo.get("organization");
         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("organization_id", orgInfo.get("id"))
-                .eq("is_delete", Constants.NOT_DELETE);
+                .eq("is_delete", Constants.NOT_DELETE)
+                .eq("is_admin", false);
         Object order = parameters.get("order");
         Object orderType = parameters.get("orderType");
         Object account = parameters.get("account");
@@ -442,8 +461,8 @@
             queryWrapper.like("wechat", wechat);
         }
 
-        Integer page = (Integer) parameters.get("page");
-        Integer size = (Integer) parameters.get("size");
+        int page = Integer.parseInt(parameters.get("page").toString());
+        int size = Integer.parseInt(parameters.get("size").toString());
         Page<User> pageData = new Page<>(page, size);
         //������������,������create_time������
         if (order != null && orderType != null) {
diff --git a/screen-api/src/main/resources/application-dev.yml b/screen-api/src/main/resources/application-dev.yml
index 3ec8fff..e8c8b6b 100644
--- a/screen-api/src/main/resources/application-dev.yml
+++ b/screen-api/src/main/resources/application-dev.yml
@@ -13,8 +13,10 @@
 spring:
   profiles:
     active: dev
+    include:
+      moduleFormColumn
   application:
-    name: screen-manage
+    name: screen-api
   redis:
     host: r-bp1xdlb9wfc6zt0msp.redis.rds.aliyuncs.com
     port: 6379
@@ -90,14 +92,11 @@
     enable:
       auto:
         commit: false
-    group:
-      id: test
-    servers: 192.168.0.191:9092
+    servers: 172.16.44.65:9092,172.16.44.67:9092,172.16.44.66: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: 172.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..36edc9d 100644
--- a/screen-api/src/main/resources/mapper/GroupMapper.xml
+++ b/screen-api/src/main/resources/mapper/GroupMapper.xml
@@ -12,11 +12,6 @@
         <result column="is_delete" property="isDelete"/>
     </resultMap>
 
-    <resultMap id="GroupResultMap" type="java.util.LinkedHashMap">
-        <id column="id" property="id"/>
-        <result column="group_name" property="groupName"/>
-    </resultMap>
-
     <select id="selectUserGroup" resultMap="GroupResultMap">
         SELECT g.id,g.group_name
         FROM `group` g,`user_group` ug
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..05e95cd 100644
--- a/screen-common/src/main/java/com/moral/constant/RedisConstants.java
+++ b/screen-common/src/main/java/com/moral/constant/RedisConstants.java
@@ -32,19 +32,31 @@
     /*
      * ������������������
      * */
-    public static final String DEVICE = "device";
+    public static final String DEVICE = "device_";
 
     /*
-     * ������������������������
+     * ���������������������������������������������������������������
+     * ���������������hash
+     * key���mac
+     * value���Device
+     * ���������������Map<String,Device>
      * */
-    public static final String STATE = "state";
+    public static final String DEVICE_INFO = "device_alarm_info";
 
     /*
-    * ���������������������������������������������������������������
-    * ���������������hash
-    * key���mac
-    * value���Device
-    * ���������������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_";
+
+    /*
+     * ������������������
+     * */
+    public static final String AQI_DATA = "aqi_";
+
+
 }
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/jobHandler/TestHandler.java b/screen-job/src/main/java/com/moral/api/jobHandler/TestHandler.java
deleted file mode 100644
index 9f0cf69..0000000
--- a/screen-job/src/main/java/com/moral/api/jobHandler/TestHandler.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.moral.api.jobHandler;
-
-import org.springframework.stereotype.Component;
-
-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 TestHandler{
-
-    @XxlJob("testJobHandler")
-    public ReturnT<String> execute(){
-        //���������������
-        String param = XxlJobHelper.getJobParam();
-        System.out.println(param);
-        System.out.println("������������������");
-        return ReturnT.SUCCESS;
-    }
-
-}
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..8850e00
--- /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..8ce1e76 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,11 +12,12 @@
 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;
 
-/*@Configuration
-@EnableKafka*/
+@Configuration
+@EnableKafka
 public class KafkaConsumerConfig {
     @Value("${kafka.consumer.servers}")
     private String servers;
@@ -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/config/kafka/KafkaProducerConfig.java b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java
index ef5b141..a5603f1 100644
--- a/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java
+++ b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java
@@ -13,8 +13,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/*@Configuration
-@EnableKafka*/
+@Configuration
+@EnableKafka
 public class KafkaProducerConfig {
     @Value("${kafka.producer.servers}")
     private String servers;
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 a3e07fc..13865dc 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..54c9d35 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,126 @@
 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.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 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();
+        //System.out.println(record.offset() + "===>" + msg);
+        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 = deviceService.adjustDeviceData(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 9365ad2..fcf29d3 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,9 +1,11 @@
 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;
@@ -11,17 +13,20 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import com.moral.api.util.CacheUtils;
+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;
 
@@ -45,6 +50,7 @@
  * @since 2021-05-11
  */
 @Service
+@Slf4j
 public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
 
     @Autowired
@@ -77,45 +83,28 @@
     @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);
-        return deviceInfo;
+        return (Map<String, Object>) redisTemplate.opsForValue().get(RedisConstants.DEVICE + mac);
     }
 
     /*
      * ������������������redis
      */
     private void setDeviceInfoToRedis(String mac, Map<String, Object> deviceInfo) {
-        redisTemplate.opsForValue().set(getDeviceKey(mac), deviceInfo);
+        redisTemplate.opsForValue().set(RedisConstants.DEVICE + mac, deviceInfo);
     }
 
     /*
      * ���redis������������������
      */
     private void delDeviceInfoFromRedis(String mac) {
-        redisTemplate.delete(getDeviceKey(mac));
-    }
-
-    /*
-     * ���������������������redis������key
-     */
-    private String getDeviceKey(String mac) {
-        return keysConnect(RedisConstants.DEVICE, mac);
-    }
-
-    //redis key������
-    private String keysConnect(String... keys) {
-        StringBuilder key = new StringBuilder(keys[0]);
-        for (int i = 1; i < keys.length; i++) {
-            key.append("_");
-            key.append(keys[i]);
-        }
-        return key.toString().toLowerCase();
+        redisTemplate.delete(RedisConstants.DEVICE + mac);
     }
 
     @Override
@@ -126,7 +115,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���������������������
@@ -145,17 +134,17 @@
     @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);
+        deleteOrganizationUnitAlarm(orgId, versionId);
         //������deviceInfo������
         CacheUtils.flushDeviceAlarmInfo();
         //������������������
@@ -171,7 +160,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());
         }
@@ -179,14 +168,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);
@@ -283,13 +272,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) {
@@ -318,7 +309,6 @@
         result.put("item", items);
         return result;
     }
-
 
     @Override
     public Map<String, Object> selectDeviceInfoById(Integer deviceId) {
@@ -389,6 +379,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);
@@ -425,27 +418,89 @@
     }
 
     @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) {
+        String mac = deviceData.get("mac").toString();
+        //���redis������������������
+        Map<String, Object> adjustFormula = redisTemplate.opsForHash().entries(RedisConstants.ADJUST + mac);
+        if (!ObjectUtils.isEmpty(adjustFormula)) {
+            Map<String, Object> deviceInfo = getDeviceByMac(mac);
+            Map<String, Object> monitorPoint = (Map<String, Object>) deviceInfo.get("monitorPoint");
+            Object areaCode = monitorPoint.get("areaCode");
+            Object cityCode = monitorPoint.get("cityCode");
+
+            Map<String, Object> aqiMap = redisTemplate.opsForHash().entries(RedisConstants.AQI_DATA + areaCode);
+            if (ObjectUtils.isEmpty(aqiMap)) {
+                aqiMap = redisTemplate.opsForHash().entries(RedisConstants.AQI_DATA + cityCode);
+            }
+            return adjustDataUtils.adjust(deviceData, adjustFormula, ObjectUtils.isEmpty(aqiMap) ? null : aqiMap);
+        }
+        return 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);
@@ -459,19 +514,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/service/impl/SensorServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java
index 537ffe4..23301f1 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java
@@ -3,10 +3,8 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.moral.api.entity.ManageRole;
-import com.moral.api.entity.Sensor;
-import com.moral.api.entity.SysDictData;
-import com.moral.api.entity.VersionSensorUnit;
+import com.moral.api.entity.*;
+import com.moral.api.mapper.OrganizationUnitAlarmMapper;
 import com.moral.api.mapper.SensorMapper;
 import com.moral.api.mapper.SysDictDataMapper;
 import com.moral.api.mapper.VersionSensorUnitMapper;
@@ -52,6 +50,9 @@
 
     @Autowired(required = false)
     private SysDictDataMapper sysDictDataMapper;
+
+    @Autowired(required = false)
+    private OrganizationUnitAlarmMapper organizationUnitAlarmMapper;
 
     @Autowired
     LogUtils logUtils;
@@ -131,6 +132,14 @@
             return resultMap;
         }
         sensorMapper.updateSensor(updateSensorMap);
+        if (!ObjectUtils.isEmpty(updateSensorMap.get("code"))&&!oldSensor.getCode().equals(updateSensorMap.get("code"))){
+            QueryWrapper<OrganizationUnitAlarm> wrapper_OUA = new QueryWrapper<>();
+            wrapper_OUA.eq("is_delete",Constants.NOT_DELETE);
+            wrapper_OUA.eq("sensor_code",oldSensor.getCode());
+            OrganizationUnitAlarm organizationUnitAlarm = new OrganizationUnitAlarm();
+            organizationUnitAlarm.setSensorCode(updateSensorMap.get("code").toString());
+            organizationUnitAlarmMapper.update(organizationUnitAlarm,wrapper_OUA);
+        }
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String content = "������������:"+oldSensor.getName()+";";
         for (Object key:updateSensorMap.keySet()) {
@@ -269,6 +278,14 @@
         VersionSensorUnit versionSensorUnit = new VersionSensorUnit();
         versionSensorUnit.setIsDelete(Constants.DELETE);
         versionSensorUnitMapper.update(versionSensorUnit,wrapper_Version);
+        if (!ObjectUtils.isEmpty(sensor.getCode())&&!sensor.getCode().equals("")){
+            QueryWrapper<OrganizationUnitAlarm> wrapper_OUA = new QueryWrapper<>();
+            wrapper_OUA.eq("is_delete",Constants.NOT_DELETE);
+            wrapper_OUA.eq("sensor_code",sensor.getCode());
+            OrganizationUnitAlarm organizationUnitAlarm = new OrganizationUnitAlarm();
+            organizationUnitAlarm.setIsDelete(Constants.DELETE);
+            organizationUnitAlarmMapper.update(organizationUnitAlarm,wrapper_OUA);
+        }
         //������������������
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String content = "������������:"+sensor.getName()+";";
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..1f1deba
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/util/AdjustDataUtils.java
@@ -0,0 +1,81 @@
+package com.moral.api.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+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.util.DateUtils;
+
+@Slf4j
+@Component
+public class AdjustDataUtils {
+    //���������������
+    public Map<String, Object> adjust(Map<String, Object> deviceData, Map<String, Object> adjustFormula, Map<String, Object> aqiMap) {
+        try {
+            Object dataTime = deviceData.get("DataTime");
+            //���������������������������
+            long time = Math.round(new Double((String) dataTime) / 1000) * 1000L;
+            long finalTime = DateUtils.dataToTimeStampTime(new Date(time), DateUtils.HH_mm_ss_EN).getTime();
+            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> sensorFormulas = (List<DeviceAdjustValue>) adjustFormula.get(key);
+                    if (ObjectUtils.isEmpty(sensorFormulas)) {
+                        deviceData.put(key, measuredValue);
+                        continue;
+                    }
+
+                    //���������������������������������
+                    DeviceAdjustValue deviceAdjustValue = sensorFormulas.stream()
+                            .filter(o -> o.getStartTime().getTime() <= finalTime && o.getEndTime().getTime() > finalTime)
+                            .findFirst().get();
+                    String formula = deviceAdjustValue.getValue();
+                    if (StringUtils.isEmpty(formula)) {
+                        deviceData.put(key, measuredValue);
+                        continue;
+                    }
+
+                    Expression expression = AviatorEvaluator.compile(formula);
+                    Map<String, Object> env = new HashMap<>();
+                    if (formula.contains("aqi")) {
+                        Object aqiValue = null;
+                        if (aqiMap != null) {
+                            aqiValue = aqiMap.get(key);
+                        }
+                        env.put("aqi", ObjectUtils.isEmpty(aqiValue) ? 0F : Float.parseFloat((String) aqiValue));
+                    }
+                    if (formula.contains("vocs")) {
+                        Object vocsValue = ObjectUtils.isEmpty(deviceData.get("a99054")) ? 0F : deviceData.get("a99054");
+                        env.put("vocs", vocsValue);
+                    }
+                    if (formula.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..16c7e70 100644
--- a/screen-manage/src/main/resources/application-dev.yml
+++ b/screen-manage/src/main/resources/application-dev.yml
@@ -92,14 +92,11 @@
     enable:
       auto:
         commit: false
-    group:
-      id: test
-    servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092
+    servers: 172.16.44.65:9092,172.16.44.67:9092,172.16.44.66: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
@@ -107,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: 172.16.44.65:9092,172.16.44.67:9092,172.16.44.66:9092
 mvc:
   interceptor:
     exclude:
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
diff --git a/screen.iml b/screen.iml
new file mode 100644
index 0000000..5933ffe
--- /dev/null
+++ b/screen.iml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+      <excludeFolder url="file://$MODULE_DIR$/home/moral/soft/log/screen-manage/%d{yyyy-MM-dd}" />
+      <excludeFolder url="file://$MODULE_DIR$/home/moral/soft/log/screen-manage/2021-06-08" />
+      <excludeFolder url="file://$MODULE_DIR$/home/moral/soft/log/springAppName_IS_UNDEFINED" />
+      <excludeFolder url="file://$MODULE_DIR$/home" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.10.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.31" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.10" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:18.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.xiaoymin:swagger-bootstrap-ui:1.9.6" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.18" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.2.12.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-streams:2.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:connect-json:2.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:connect-api:2.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.rocksdb:rocksdbjni:5.15.10" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-clients:2.2.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.luben:zstd-jni:1.3.8-1" level="project" />
+    <orderEntry type="library" name="Maven: org.lz4:lz4-java:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.1.7.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.16" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.16" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.kaptcha:kaptcha:2.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.13.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.14.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" />
+    <orderEntry type="library" name="Maven: com.xuxueli:xxl-job-core:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.45.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.groovy:groovy:2.5.9" level="project" />
+    <orderEntry type="library" name="Maven: com.googlecode.aviator:aviator:5.2.5" level="project" />
+  </component>
+</module>
\ No newline at end of file

--
Gitblit v1.8.0