andyliu 2 mesi fa
commit
841a27e373
100 ha cambiato i file con 5504 aggiunte e 0 eliminazioni
  1. 29 0
      .gitignore
  2. BIN
      libs/gbase.1.0.5.jar
  3. 312 0
      pom.xml
  4. 27 0
      sql.properties
  5. 130 0
      src/main/java/com/shkpr/service/warncore/AlamWarnAnalyCoreMain.java
  6. 52 0
      src/main/java/com/shkpr/service/warncore/SpringContextUtil.java
  7. 246 0
      src/main/java/com/shkpr/service/warncore/commtools/CommTool.java
  8. 157 0
      src/main/java/com/shkpr/service/warncore/commtools/HttpTool.java
  9. 551 0
      src/main/java/com/shkpr/service/warncore/commtools/TimeTool.java
  10. 116 0
      src/main/java/com/shkpr/service/warncore/components/LocalDynamicDataSource.java
  11. 62 0
      src/main/java/com/shkpr/service/warncore/components/locks/BaseLockMgr.java
  12. 5 0
      src/main/java/com/shkpr/service/warncore/components/locks/CommParamLockMgr.java
  13. 137 0
      src/main/java/com/shkpr/service/warncore/components/locks/CountDownLatchEx.java
  14. 6 0
      src/main/java/com/shkpr/service/warncore/components/locks/TaskLockMgr.java
  15. 26 0
      src/main/java/com/shkpr/service/warncore/components/validators/IntInitOrRange.java
  16. 30 0
      src/main/java/com/shkpr/service/warncore/components/validators/IntInitOrRangeV.java
  17. 25 0
      src/main/java/com/shkpr/service/warncore/components/validators/ListNullOrSize.java
  18. 26 0
      src/main/java/com/shkpr/service/warncore/components/validators/ListNullOrSizeV.java
  19. 25 0
      src/main/java/com/shkpr/service/warncore/components/validators/StrNullOrSize.java
  20. 25 0
      src/main/java/com/shkpr/service/warncore/components/validators/StrNullOrSizeV.java
  21. 37 0
      src/main/java/com/shkpr/service/warncore/configuration/CaffeineConfiguration.java
  22. 57 0
      src/main/java/com/shkpr/service/warncore/configuration/DBMgrConfiguration.java
  23. 74 0
      src/main/java/com/shkpr/service/warncore/configuration/GlobalParamConfiguration.java
  24. 108 0
      src/main/java/com/shkpr/service/warncore/configuration/MainSourceConfiguration.java
  25. 35 0
      src/main/java/com/shkpr/service/warncore/configuration/RestTemplateConfig.java
  26. 45 0
      src/main/java/com/shkpr/service/warncore/configuration/RetryTemplateConfig.java
  27. 90 0
      src/main/java/com/shkpr/service/warncore/configuration/ScheduleTaskConfiguration.java
  28. 40 0
      src/main/java/com/shkpr/service/warncore/configuration/TaskQueueConfiguration.java
  29. 53 0
      src/main/java/com/shkpr/service/warncore/configuration/ValidatorConfiguration.java
  30. 96 0
      src/main/java/com/shkpr/service/warncore/configuration/WebMvcConfiguration.java
  31. 71 0
      src/main/java/com/shkpr/service/warncore/configuration/WebSecurityConfiguration.java
  32. 114 0
      src/main/java/com/shkpr/service/warncore/constants/ApiURI.java
  33. 17 0
      src/main/java/com/shkpr/service/warncore/constants/CommDefine.java
  34. 22 0
      src/main/java/com/shkpr/service/warncore/constants/DataTagDefine.java
  35. 35 0
      src/main/java/com/shkpr/service/warncore/constants/GroupTagDefine.java
  36. 71 0
      src/main/java/com/shkpr/service/warncore/constants/LogFlagBusiType.java
  37. 16 0
      src/main/java/com/shkpr/service/warncore/constants/MsgNotifyDefine.java
  38. 7 0
      src/main/java/com/shkpr/service/warncore/constants/MultiResHandleMode.java
  39. 21 0
      src/main/java/com/shkpr/service/warncore/constants/ReportFormDefine.java
  40. 5 0
      src/main/java/com/shkpr/service/warncore/constants/SiteDataType.java
  41. 6 0
      src/main/java/com/shkpr/service/warncore/constants/SiteType.java
  42. 27 0
      src/main/java/com/shkpr/service/warncore/constants/SiteTypeReport.java
  43. 19 0
      src/main/java/com/shkpr/service/warncore/constants/TaskQueueDataTypeEx.java
  44. 37 0
      src/main/java/com/shkpr/service/warncore/constants/UrlMethodType.java
  45. 17 0
      src/main/java/com/shkpr/service/warncore/constants/UserCurStateType.java
  46. 14 0
      src/main/java/com/shkpr/service/warncore/constants/UserRoleType.java
  47. 6 0
      src/main/java/com/shkpr/service/warncore/constants/ZoneDataType.java
  48. 7 0
      src/main/java/com/shkpr/service/warncore/constants/ZoneSubType.java
  49. 21 0
      src/main/java/com/shkpr/service/warncore/constants/ZoneType.java
  50. 176 0
      src/main/java/com/shkpr/service/warncore/controllercheck/JWTControllerCheck.java
  51. 27 0
      src/main/java/com/shkpr/service/warncore/controllercheck/ThirdCustomerBizControllerCheck.java
  52. 27 0
      src/main/java/com/shkpr/service/warncore/controllercheck/ThirdInternalControllerCheck.java
  53. 27 0
      src/main/java/com/shkpr/service/warncore/controllercheck/ThirdSiteDataControllerCheck.java
  54. 27 0
      src/main/java/com/shkpr/service/warncore/controllercheck/ThirdZoneDataControllerCheck.java
  55. 28 0
      src/main/java/com/shkpr/service/warncore/controllercheck/ThirdZoneFocusControllerCheck.java
  56. 25 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/CustomAuthenticationProvider.java
  57. 88 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/GrantedAuthorityImpl.java
  58. 132 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/JWTAuthenticationFilter.java
  59. 383 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/TokenAuthenticationService.java
  60. 60 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTBusiFilterMgr.java
  61. 45 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTInternalFilter.java
  62. 52 0
      src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTSiteDataFilter.java
  63. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidList.java
  64. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidNew.java
  65. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidQE.java
  66. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidReset.java
  67. 4 0
      src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidSK.java
  68. 78 0
      src/main/java/com/shkpr/service/warncore/dto/AuthTokenData.java
  69. 19 0
      src/main/java/com/shkpr/service/warncore/dto/CommDVBean.java
  70. 29 0
      src/main/java/com/shkpr/service/warncore/dto/CommKNVUBean.java
  71. 34 0
      src/main/java/com/shkpr/service/warncore/dto/CommKVBean.java
  72. 7 0
      src/main/java/com/shkpr/service/warncore/dto/CommKVFBean.java
  73. 11 0
      src/main/java/com/shkpr/service/warncore/dto/CommKVSBean.java
  74. 34 0
      src/main/java/com/shkpr/service/warncore/dto/CommKVSTDBean.java
  75. 25 0
      src/main/java/com/shkpr/service/warncore/dto/CommKVSUDBean.java
  76. 20 0
      src/main/java/com/shkpr/service/warncore/dto/CommPageRecord.java
  77. 19 0
      src/main/java/com/shkpr/service/warncore/dto/CommTVBean.java
  78. 14 0
      src/main/java/com/shkpr/service/warncore/dto/CommTotalRecords.java
  79. 29 0
      src/main/java/com/shkpr/service/warncore/dto/CommUNGBean.java
  80. 19 0
      src/main/java/com/shkpr/service/warncore/dto/CommUPPBean.java
  81. 23 0
      src/main/java/com/shkpr/service/warncore/dto/CommUVSBean.java
  82. 41 0
      src/main/java/com/shkpr/service/warncore/dto/LoginUserRoleType.java
  83. 31 0
      src/main/java/com/shkpr/service/warncore/dto/MsgNotifyBean.java
  84. 31 0
      src/main/java/com/shkpr/service/warncore/dto/PartDataBean.java
  85. 27 0
      src/main/java/com/shkpr/service/warncore/dto/ResDataBean.java
  86. 111 0
      src/main/java/com/shkpr/service/warncore/dto/ResponseCode.java
  87. 61 0
      src/main/java/com/shkpr/service/warncore/dto/ResponseRes.java
  88. 82 0
      src/main/java/com/shkpr/service/warncore/dto/RolePowerBean.java
  89. 35 0
      src/main/java/com/shkpr/service/warncore/dto/TObjectRes.java
  90. 41 0
      src/main/java/com/shkpr/service/warncore/dto/TObjectResEx.java
  91. 53 0
      src/main/java/com/shkpr/service/warncore/dto/TRecordRes.java
  92. 30 0
      src/main/java/com/shkpr/service/warncore/dto/TraceCallable.java
  93. 22 0
      src/main/java/com/shkpr/service/warncore/dto/TraceRunnable.java
  94. 20 0
      src/main/java/com/shkpr/service/warncore/dto/TraceRunnableSignal.java
  95. 165 0
      src/main/java/com/shkpr/service/warncore/exception/GlobalSelfExceptionHandler.java
  96. 14 0
      src/main/java/com/shkpr/service/warncore/exception/SelfAuthFilterException.java
  97. 23 0
      src/main/java/com/shkpr/service/warncore/exception/SelfAuthResultException.java
  98. 24 0
      src/main/java/com/shkpr/service/warncore/exception/SelfException.java
  99. 60 0
      src/main/java/com/shkpr/service/warncore/factorys/SslClientHttpRequestFactory.java
  100. 0 0
      src/main/java/com/shkpr/service/warncore/globalcache/GlobalData.java

+ 29 - 0
.gitignore

@@ -0,0 +1,29 @@
+target/
+trilog/
+.idea/
+.idea/inspectionProfiles/
+.idea/libraries/
+*.bak
+### !.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+### *.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/

BIN
libs/gbase.1.0.5.jar


+ 312 - 0
pom.xml

@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.3.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.shkpr.service</groupId>
+    <artifactId>v1-alam-warn-analy-core</artifactId>
+    <version>1.0.0</version>
+    <name>v1-alam-warn-analy-core</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <fasterxml.version>2.9.5</fasterxml.version><!-- 2.8.11.2 -->
+        <fastercore.version>2.9.5</fastercore.version>
+        <fasterannot.version>2.9.5</fasterannot.version>
+    </properties>
+
+    <!--工具包jar版本不一致,解决方案,以下配置促使本应用工程中的相应jar强制使用规定版本-->
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${fasterxml.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-core</artifactId>
+                <version>${fastercore.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-annotations</artifactId>
+                <version>${fasterannot.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+                <!--排除默认的tomcat-jdbc-->
+                <exclusion>
+                    <groupId>org.apache.tomcat</groupId>
+                    <artifactId>tomcat-jdbc</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jdbc</artifactId>
+            <version>2.1.3.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.2.5</version>
+            <!--<scope>runtime</scope>-->
+        </dependency>
+
+        <!-- spring-security 和 jwt -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+            <version>2.1.3.RELEASE</version>
+        </dependency>
+
+        <!-- 整合redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <version>2.1.3.RELEASE</version>
+        </dependency>
+
+        <!-- spring-mvc -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.0.14.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20180813</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+
+        <!--Gson-->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.25</version>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+
+        <!--caffeine依赖包-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>2.6.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+
+        <!-- Apache Commons Collections -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.influxdb</groupId>
+            <artifactId>influxdb-java</artifactId>
+            <version>2.14</version>
+        </dependency>
+
+        <!--<dependency>
+            <groupId>org.openjdk.jol</groupId>
+            <artifactId>jol-core</artifactId>
+            <version>0.17</version>
+        </dependency>-->
+    </dependencies>
+
+    <build>
+        <!-- 打成jar包的名称 -->
+        <finalName>v1-alam-warn-analy-core-1.0.0</finalName>
+        <plugins>
+            <!--运用SpringBoot 插件  使用spring-boot-devtools模块的应用,当classpath中的文件有改变时,会自动重启! -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                    <executable>true</executable>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build-info</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!-- 过滤后缀为pem、pfx的证书文件 -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pem</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                    <compilerArguments>
+                        <extdirs>${project.basedir}/libs</extdirs>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+
+        </plugins>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/libs</directory>
+                <targetPath>BOOT-INF/lib/</targetPath>
+                <includes>
+                    <include>**/*.jar</include>
+                </includes>
+            </resource>
+            <!--very important!!! 打包时将 src/main/resources 下的所有配置文件一并打包-->
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/**</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+</project>

+ 27 - 0
sql.properties

@@ -0,0 +1,27 @@
+spring.datasource.data.jdbc-url=jdbc:postgresql://140.246.183.164:5432/water_smart_develop_branch?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+#spring.datasource.data.jdbc-url=jdbc:postgresql://10.101.3.104:5432/watersmart_new?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+spring.datasource.data.username=postgres
+spring.datasource.data.password=kpr.23417.postgres
+
+#spring.datasource.data.jdbc-url=jdbc:postgresql://192.168.0.4:5432/watersmart?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+#spring.datasource.data.username=postgres
+#spring.datasource.data.password=kpr.23417.postgres
+
+
+spring.datasource.data.driver-class-name=org.postgresql.Driver
+
+spring.datasource.data.max-wait=60000
+spring.datasource.data.maximum-pool-size=200
+spring.datasource.data.minimum-idle=1
+spring.datasource.data.validation-query=SELECT 1
+spring.datasource.data.connection-test-query=SELECT 1
+spring.datasource.data.test-on-borrow=false
+spring.datasource.data.test-on-return=false
+spring.datasource.data.test-while-idle=true
+spring.datasource.data.max-lifetime=120000
+spring.datasource.data.idle-timeout=30000
+spring.datasource.data.connection-timeout=30000
+# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+spring.datasource.data.time-between-eviction-runs-millis=60000
+# 配置一个连接在池中最小生存的时间,单位是毫秒
+spring.datasource.data.minEvictableIdleTimeMillis=300000

+ 130 - 0
src/main/java/com/shkpr/service/warncore/AlamWarnAnalyCoreMain.java

@@ -0,0 +1,130 @@
+package com.shkpr.service.warncore;
+
+import com.global.base.component.SnowFlakeEx;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.globalmgr.ThreadTaskMgr;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.coyote.AbstractProtocol;
+import org.apache.coyote.http11.Http11AprProtocol;
+import org.apache.coyote.http11.Http11NioProtocol;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.retry.annotation.EnableRetry;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.beans.factory.annotation.Value;
+
+import javax.annotation.PostConstruct;
+
+@EnableTransactionManagement //开启数据库事务
+@SpringBootApplication
+@EnableRetry
+public class AlamWarnAnalyCoreMain {
+    @Value("${global.server.apr:false}")
+    private boolean mBUseApr = false;
+
+    @Value("${server.port:9001}")
+    private int mNPort;
+
+    @Value("${global.server.id:tri.adbs.v100}")
+    private String mStrServerId;           //本服务的ID
+
+    @Value("${global.machine.index:0}")
+    private int mOwnerMachineIndex;      //本服务所在的部署机器的索引编号
+
+    @Value("${global.service.index:0}")
+    private int mOwnerServiceIndex;     //本服务在部署机器上的服务索引编号
+
+    @Value("${global.max.tomcat.concurrent.request:10000}")
+    private int mNMaxConcurrentRequest; //tomcat同一时刻可接收的第三方最大并发连接数(Java NIO模式下默认是10000)
+
+    @Value("${global.max.tomcat.threads:200}")
+    private int mNMaxThreads;           //tomcat可启动的最大线程数(默认值为200),调优取值[200,1000]
+
+    @Value("${global.max.tomcat.accept.queue:100}")
+    private int mNMaxAcceptCounts;     //tomcat启动的线程数达到最大时,接受排队的请求个数(默认值为100),调优取值[100,400]
+
+    @Value("${global.switch.trace.log:true}")
+    private boolean mBSwitchTraceLog = true; //是否开启基于TraceId的log记录
+
+    public static void main(String[] args) {
+        com.shkpr.service.warncore.globalcache.GlobalData.getInstance().setCpuCores(Runtime.getRuntime().availableProcessors());
+        LogPrintMgr.getInstance().initResWithDisruptor(/*GlobalData.getInstance().getCpuCores()*/2, 2, new com.shkpr.service.warncore.interfaces.sinks.LogPrintSink());//io型线程池=CPU Core*2;计算型线程池=CPU Core
+        SpringApplication.run(AlamWarnAnalyCoreMain.class, args);
+    }
+
+    @PostConstruct
+    public void init(){
+        ThreadTaskMgr.initThreadResource();
+        LogPrintMgr.getInstance().setSwitchTraceLog(mBSwitchTraceLog);
+        GlobalData.getInstance().setServerId(mStrServerId);
+        GlobalData.getInstance().setNOwnerMachineIndex(mOwnerMachineIndex);
+        GlobalData.getInstance().setNOwnerServiceIndex(mOwnerServiceIndex);
+        GlobalData.getInstance().setSwitchTraceLog(mBSwitchTraceLog);
+        SnowFlakeEx.init(mOwnerMachineIndex, mOwnerServiceIndex);
+    }
+
+    @Component
+    class GlobalWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
+        @Override
+        public void customize(ConfigurableServletWebServerFactory factory) {
+            TomcatServletWebServerFactory factoryReal = (TomcatServletWebServerFactory)factory;
+            if (mBUseApr){
+                factoryReal.setProtocol("org.apache.coyote.http11.Http11AprProtocol");
+                factoryReal.addContextLifecycleListeners(new AprLifecycleListener());
+            }
+            factoryReal.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
+            factoryReal.setPort(mNPort);
+        }
+    }
+
+    class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer
+    {
+        public void customize(Connector connector)
+        {
+            connector.setEnableLookups(false);
+            if (mBUseApr){
+                Http11AprProtocol protocol = (Http11AprProtocol) connector.getProtocolHandler();
+                initTomcatParam(protocol);
+            }else{
+                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
+                initTomcatParam(protocol);
+            }
+        }
+
+        private  <T> void initTomcatParam(AbstractProtocol<T> protocol){
+            /*
+             * application.properties中的参数优先级高于代码设置的参数
+             * 即代码设置参数后若application.properties中有同名参数,application.properties中的优先生效
+             * */
+            /**
+             *Tomcat在MaxThreads和AcceptCount队列设置基础上,对请求连接多做了一层保护,也就是MaxConnections的大小限制。
+             *当Client端的大量请求过来时,首先进入MaxThreads,MaxThreads满了则进入AcceptCount队列,
+             *若AcceptCount队列也满了则后续的连接无法进入AcceptCount队列,无法交由工作线程处理,Client将得到connection refused或者connection reset的错误。
+             *第二层保护就是:在acceptor线程里头进行缓冲,当连接的socket超过MaxConnections的时候,则进行阻塞等待,控制acceptor转给worker线程连接的速度,稍微缓缓,等待worker线程处理响应client。
+             */
+            protocol.setMaxConnections(mNMaxConcurrentRequest);
+            protocol.setMaxThreads(mNMaxThreads);
+            protocol.setAcceptCount(mNMaxAcceptCounts);
+            protocol.setMinSpareThreads(mNMaxThreads/10);//初始化时创建的线程数
+
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO
+                    , com.shkpr.service.warncore.constants.LogFlagBusiType.BUSI_INIT.toStrValue(), this.getClass().getSimpleName()
+                    , String.format("tomcat pramas:{mode=%s max-threads=%d max-conns=%d accept-counts=%d conn-timeout=%d minSpareThreads=%d} server-id:{%s}"
+                            , mBUseApr?"Apr":"Nio"
+                            , protocol.getMaxThreads()
+                            , protocol.getMaxConnections()
+                            , protocol.getAcceptCount()
+                            , protocol.getConnectionTimeout()
+                            , protocol.getMinSpareThreads()
+                            , mStrServerId));
+        }
+    }
+}

+ 52 - 0
src/main/java/com/shkpr/service/warncore/SpringContextUtil.java

@@ -0,0 +1,52 @@
+package com.shkpr.service.warncore;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+//@Lazy(false) //true为懒加载,在第一次被引用的时候才会创建;false为Spring容器在启动时会立即创建
+//若要明确指定为懒加载,则必须使用@Lazy(true),否则bean对象默认取值lazy-init="false"即@Lazy(false)
+public class SpringContextUtil implements ApplicationContextAware {
+    //Spring应用上下文环境
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextUtil.applicationContext = applicationContext;
+    }
+
+    public static ApplicationContext getApplicationContext(){
+        return applicationContext;
+    }
+
+    public static boolean containsBean(String beanName){
+        return applicationContext.containsBean(beanName);
+    }
+
+    public static boolean isSingleton(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.isSingleton(beanName);
+    }
+
+    public static Class getType(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.getType(beanName);
+    }
+
+    public static String[] getAliases(String beanName) throws NoSuchBeanDefinitionException {
+        return applicationContext.getAliases(beanName);
+    }
+
+    public static Object getBean(String beanName) throws BeansException {
+        return applicationContext.getBean(beanName);
+    }
+
+    public static <T> T getBean(Class<T> className) throws BeansException {
+        return applicationContext.getBean(className);
+    }
+
+    public static <T> T getBean(String beanName, Class<T> className) throws BeansException{
+        return applicationContext.getBean(beanName, className);
+    }
+}

+ 246 - 0
src/main/java/com/shkpr/service/warncore/commtools/CommTool.java

@@ -0,0 +1,246 @@
+package com.shkpr.service.warncore.commtools;
+
+import com.global.base.tools.CastUtil;
+import com.shkpr.service.warncore.constants.CommDefine;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CommTool {
+    private static Pattern linePattern = Pattern.compile("_(\\w)");
+    /**
+     * 下划线转驼峰
+     * @param str
+     * @return
+     */
+    public static String lineToHump(String str) {
+        str = str.toLowerCase();
+        Matcher matcher = linePattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
+    /**
+     * 驼峰转下划线
+     * @param str
+     * @return
+     */
+    public static String humpToLine2(String str) {
+        Matcher matcher = humpPattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    public static String getPlatformByAgent(String strClientType, String strUserAgent){
+        return getPlatformByAgent(!StringUtils.isEmpty(strClientType)?strClientType:strUserAgent);
+    }
+
+    public static String getPlatformByAgent(String strUserAgent){
+        String type = "_";
+        if (StringUtils.isEmpty(strUserAgent))
+            return type;
+
+        if(strUserAgent.contains("Android") || strUserAgent.contains("Linux")) {
+            type = "apk";
+        } else if (strUserAgent.contains("iPhone") || strUserAgent.contains("iPod") || strUserAgent.contains("iPad")){
+            type = "ios";
+        } else if (strUserAgent.indexOf("micromessenger") > -1){
+            type = "wx";
+        } else if (strUserAgent.indexOf("Windows") > -1){
+            type = "pc";
+        }else if (strUserAgent.contains("tri.")){
+            type = strUserAgent;
+        }
+        return type;
+    }
+
+    public static boolean isMobilePlatform(String platform){
+        return ("apk".equals(platform) || "ios".equals(platform) || "wx".equals(platform));
+    }
+
+    public static boolean isTheThisFormatMatch(final String strFormatFilter, String strDesData){
+        if (!StringUtils.isEmpty(strFormatFilter) && !StringUtils.isEmpty(strDesData)) {
+            //正则表达式的模式
+            Pattern p = Pattern.compile(strFormatFilter);
+            //正则表达式的匹配器
+            Matcher m = p.matcher(strDesData);
+            //进行正则匹配
+            return m.matches();
+        }
+        return false;
+    }
+
+    public static int listSize(List<? extends Object> listSrc){
+        return (listSrc==null)?0:listSrc.size();
+    }
+
+    public static int collectionSize(Collection<? extends Object> cc){
+        return (cc==null)?0:cc.size();
+    }
+
+    public static int mapSize(Map<? extends Object, ? extends Object> mapSrc){
+        return (mapSrc==null)?0:mapSrc.size();
+    }
+
+    public static int lenString(String strSrc) {
+        if (StringUtils.isEmpty(strSrc))
+            return 0;
+        return strSrc.length();
+    }
+
+    public static boolean strBetweenLen(String strSrc, int nMinLen, int nMaxLen){
+        if (strSrc == null || nMinLen > nMaxLen)
+            return false;
+        return strSrc.length() >= nMinLen && strSrc.length() <= nMaxLen;
+    }
+
+    /*public static Object getFieldValueByName(String fieldName, Object o) {
+        try {
+            String firstLetter = fieldName.substring(0,1).toUpperCase();
+            String getter = "get" + firstLetter + fieldName.substring(1);
+            Method method = o.getClass().getMethod(getter, new Class[] {});
+            Object value = method.invoke(o, new Object[] {});
+            return value;
+        } catch (Exception e) {
+            return null;
+        }
+    }*/
+
+    public static float convertToFloatEx(Object value, float defaultValue){
+        if (value != null){
+            if (value.getClass().getSimpleName().equals("Float"))
+                return (float)value;
+            else if (value.getClass().getSimpleName().equals("Double"))
+                return ((Double)value).floatValue();
+            else if (value.getClass().getSimpleName().equals("BigDecimal"))
+                return ((BigDecimal)value).floatValue();
+            else
+                return CastUtil.castFloat(value, defaultValue);
+        }
+        return defaultValue;
+    }
+
+    public static int convertToIntEx(Object value, int defaultValue){
+        if (value != null){
+            if (value.getClass().getSimpleName().equals("Integer"))
+                return (int)value;
+            else if (value.getClass().getSimpleName().equals("Double"))
+                return ((Double)value).intValue();
+            else if (value.getClass().getSimpleName().equals("BigDecimal"))
+                return ((BigDecimal)value).intValue();
+            else
+                return CastUtil.castInt(value, defaultValue);
+        }
+        return defaultValue;
+    }
+
+    public static long convertToLongEx(Object value, long defaultValue){
+        if (value != null){
+            if (value.getClass().getSimpleName().equals("Long"))
+                return (long)value;
+            else if (value.getClass().getSimpleName().equals("Double"))
+                return ((Double)value).longValue();
+            else if (value.getClass().getSimpleName().equals("BigDecimal"))
+                return ((BigDecimal)value).longValue();
+            else
+                return CastUtil.castLong(value, defaultValue);
+        }
+        return defaultValue;
+    }
+
+    public static double convertToDoubleEx(Object value, double defaultValue){
+        if (value != null){
+            if (value.getClass().getSimpleName().equals("Double"))
+                return (double)value;
+            else if (value.getClass().getSimpleName().equals("BigDecimal"))
+                return ((BigDecimal)value).doubleValue();
+            else
+                return CastUtil.castDouble(value, defaultValue);
+        }
+        return defaultValue;
+    }
+
+    public static double convertToDoubleEx2(String valueStr, double defaultValue){
+        double res = defaultValue;
+        if (StringUtils.isEmpty(valueStr))
+            return res;
+        try {
+            res = Double.parseDouble(valueStr);
+        }catch (Exception e){}
+        return res;
+    }
+
+    /*public static void setFieldValueByName(String fieldName, Object oClass, Object oValue, Class<?> valueTypeCls){
+        try {
+            String firstLetter = fieldName.substring(0,1).toUpperCase();
+            String setter = "set" + firstLetter + fieldName.substring(1);
+            Method method = oClass.getClass().getMethod(setter, new Class[] {valueTypeCls});
+            method.setAccessible(true);
+            method.invoke(oClass, new Object[]{oValue});
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }*/
+
+    public static String upperFirstLatter(String letter){
+        if (StringUtils.isEmpty(letter))
+            return letter;
+        char[] chars = letter.toCharArray();
+        if(chars[0] >= 'a' && chars[0] <= 'z'){
+            chars[0] = (char)(chars[0]-32);
+        }
+        return new String(chars);
+    }
+
+    public static String list2QueryIn(Collection<? extends Object> listSrc){
+        StringBuilder str = new StringBuilder("");
+        if (listSrc != null && listSrc.size() > 0){
+            str.append("(");
+            int nStart = 0;
+            for (Object item:listSrc){
+                if (nStart++ > 0)
+                    str.append(",");
+                if (item instanceof String){
+                    str.append("'"+item+"'");
+                }else{
+                    str.append(item);
+                }
+            }
+            str.append(")");
+        }
+        return str.toString();
+    }
+
+    public static List safeList(List<? extends Object> listSrc){
+        if (listSrc == null)
+            return new ArrayList();
+        else
+            return listSrc;
+    }
+
+    public static <T> Collection<T> safeCollection(Collection<T> collection) { return collection==null? Collections.EMPTY_SET:collection;}
+
+    public static <TK, TV> Map<TK, TV> safeMap(Map<TK, TV> map) { return map==null?Collections.EMPTY_MAP:map;}
+
+    public static boolean isRootAdminID(String userId){
+        return CommDefine.ADMIN_USER_ID.equals(userId)
+                || CommDefine.INTERNAL_OPERATOR_ID.equals(userId);
+    }
+
+    public static boolean isRootAdminRole(String roleId){
+        return CommDefine.ADMIN_ROLE_ID.equals(roleId)
+                || CommDefine.INTERNAL_OPERATOR_ROLE_ID.equals(roleId);
+    }
+}

File diff suppressed because it is too large
+ 157 - 0
src/main/java/com/shkpr/service/warncore/commtools/HttpTool.java


+ 551 - 0
src/main/java/com/shkpr/service/warncore/commtools/TimeTool.java

@@ -0,0 +1,551 @@
+package com.shkpr.service.warncore.commtools;
+import org.springframework.util.StringUtils;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+public class TimeTool {
+    public static final long MS_HTTP_REQ_TIMEOUT = 120*1000;  //两分钟的毫秒数
+    public static final long MS_ONE_HALF_MIN = 90*1000;  //一分半钟的毫秒数
+    public static final long MS_ONE_MIN = 60*1000;       //一分钟的毫秒数
+    public static final long MIN_ONE_DAY = 24*60;        //一天中的分
+    public static final long SEC_ONE_DAY = 24*60*60;     //一天中的秒
+    public static final long MS_ONE_DAY = 24*60*60*1000; //一天中的毫秒
+    public static final long MS_ONE_YEAR = 365*MS_ONE_DAY;//一年中的毫秒
+    public static final long MS_ONE_HOUR = 60*60*1000;   //一小时的毫秒
+    public static final String YEAR_FORMAT = "yyyy";
+    public static final String YEAR_MONTH_FORMAT_EX = "yyyyMM";
+    public static final String YEAR_MONTH_FORMAT = "yyyy-MM";
+    public static final String YEAR_MONTH_DAY_FORMAT = "yyyy-MM-dd";
+    public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    public static final String TIMESTAMP_FORMAT_EX = "yyyy-MM-dd HH:mm:ss.SSS";
+    public static final String TIMESTAMP_FORMAT_EX2 = "yyyyMMddHHmmss";
+    public static final long UTC_MS_START_ONLINE = 1538323200000L;//2018-10-01 00:00:00
+    public static volatile long UTC_MS_TODAY_BEGIN = 0L;
+    public static volatile long UTC_MS_TODAY_END = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_BEGIN = 0L;
+    public static volatile long UTC_MS_THIS_MONTH_END = 0L;
+
+    private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);
+    private static final DateTimeFormatter TIMESTAMP_EX_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX);
+    private static final DateTimeFormatter TIMESTAMP_EX2_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT_EX2);
+    private static final DateTimeFormatter YEAR_MONTH_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_FORMAT);
+    private static final DateTimeFormatter YEAR_MONTH_DAY_FORMATTER = DateTimeFormatter.ofPattern(YEAR_MONTH_DAY_FORMAT);
+
+    public static void refreshUTCTimeRes(){
+        UTC_MS_TODAY_BEGIN = getTodayBeginUTC();
+        UTC_MS_TODAY_END = getTodayEndUTC();
+        UTC_MS_THIS_MONTH_BEGIN = getMonthBeginUTC(System.currentTimeMillis());
+        UTC_MS_THIS_MONTH_END = getMonthEndUTC(System.currentTimeMillis());
+    }
+
+    private static LocalDateTime strTime2LocalDateTime(String time, String format) {
+        switch (format){
+            case YEAR_MONTH_FORMAT:
+                return LocalDateTime.parse(time, YEAR_MONTH_FORMATTER);
+            case YEAR_MONTH_DAY_FORMAT:
+                return LocalDateTime.parse(time, YEAR_MONTH_DAY_FORMATTER);
+            case TIMESTAMP_FORMAT:
+                return LocalDateTime.parse(time, TIMESTAMP_FORMATTER);
+            case TIMESTAMP_FORMAT_EX:
+                return LocalDateTime.parse(time, TIMESTAMP_EX_FORMATTER);
+            case TIMESTAMP_FORMAT_EX2:
+                return LocalDateTime.parse(time, TIMESTAMP_EX2_FORMATTER);
+            default:
+                return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(format));
+        }
+    }
+
+    private static String localDateTime2StrTime(LocalDateTime localDateTime, String format) {
+        switch (format){
+            case YEAR_MONTH_FORMAT:
+                return localDateTime.format(YEAR_MONTH_FORMATTER);
+            case YEAR_MONTH_DAY_FORMAT:
+                return localDateTime.format(YEAR_MONTH_DAY_FORMATTER);
+            case TIMESTAMP_FORMAT:
+                return localDateTime.format(TIMESTAMP_FORMATTER);
+            case TIMESTAMP_FORMAT_EX:
+                return localDateTime.format(TIMESTAMP_EX_FORMATTER);
+            case TIMESTAMP_FORMAT_EX2:
+                return localDateTime.format(TIMESTAMP_EX2_FORMATTER);
+            default:
+                return localDateTime.format(DateTimeFormatter.ofPattern(format));
+        }
+    }
+
+    private static LocalDateTime utcMsTime2LocalDateTime(long lUTC) {
+        if (!isMsUTC(lUTC)){
+            lUTC = lUTC*1000;
+        }
+        Instant instant = Instant.ofEpochMilli(lUTC);
+        ZoneId zone = ZoneId.systemDefault();
+        return LocalDateTime.ofInstant(instant, zone);
+    }
+
+    private static long localDateTime2UtcMsTime(LocalDateTime localDateTime) {
+        ZoneId zone = ZoneId.systemDefault();
+        Instant instant = localDateTime.atZone(zone).toInstant();
+        return instant.toEpochMilli();
+    }
+
+    private static long strTime2UtcMsTime(String dateStr, String format){
+        return localDateTime2UtcMsTime(strTime2LocalDateTime(dateStr, format));
+    }
+
+    private static String utcMsTime2StrTime(long lUTC, String format){
+        return localDateTime2StrTime(utcMsTime2LocalDateTime(lUTC), format);
+    }
+
+    public static String getDatePeriod(String dateStr){
+        dateStr = dateStr.trim();
+        int len = dateStr.length();
+        if (len >= 14)
+            return "time";
+        else if (len >= 10)//即dataStr为yyyy-MM-dd
+            return "day";
+        else if (len >= 7)//即dataStr为yyyy-MM
+            return "month";
+        else if (len >= 6)//即dataStr为yyyyMM
+            return "month";
+        else if (len >= 4)//即dataStr为yyyy
+            return "year";
+        return "";
+    }
+
+    //获取指定日期的开始时间
+    public static long convertDateStr2BeginUTC(String dateStr){
+        return convertDateStr2UTC(dateStr);
+    }
+
+    //获取指定日期的结束时间,如;指定月的最后一天/指定年的最后一天
+    public static long convertDateStr2EndUTC(String dateStr){
+        String datePeriod = getDatePeriod(dateStr);
+        switch (datePeriod){
+            case "day":{
+                return convertDateStr2UTC(String.format("%s 23:59:59", dateStr));
+            }
+            case "month":{
+                return getMonthEndUTC(convertDateStr2UTC(dateStr));
+            }
+            case "year":{
+                return convertDateStr2UTC(String.format("%s-12-31 23:59:59", dateStr));
+            }
+            default:
+                return convertDateStr2UTC(dateStr);
+        }
+    }
+
+    public static long convertDateStr2UTC(String dateStr){
+        try {
+            dateStr = dateStr.trim();
+            int len = dateStr.length();
+            if (len >= 23)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX);
+            else if (len >= 19)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT);
+            else if (len >= 14)
+                return strTime2UtcMsTime(dateStr, TIMESTAMP_FORMAT_EX2);
+            else if (len >= 10)//即dataStr为yyyy-MM-dd
+                return strTime2UtcMsTime(String.format("%s 00:00:00", dateStr), TIMESTAMP_FORMAT);
+            else if (len >= 7)//即dataStr为yyyy-MM
+                return strTime2UtcMsTime(String.format("%s-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
+            else if (len >= 6)//即dataStr为yyyyMM
+                return strTime2UtcMsTime(String.format("%s01000000", dateStr), TIMESTAMP_FORMAT_EX2);
+            else if (len >= 4)//即dataStr为yyyy
+                return strTime2UtcMsTime(String.format("%s-01-01 00:00:00", dateStr), TIMESTAMP_FORMAT);
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 指定UTC是否为精确到毫秒的UTC时间
+     * @param lUTC
+     * @return
+     */
+    public static boolean isMsUTC(long lUTC){
+        return lUTC > 10000000000L;
+    }
+
+    public static boolean isSecUTC(long lUTC){
+        return lUTC > 1000000000L && lUTC < 10000000000L;
+    }
+
+    public static long getCurSecUTC(){
+        return (System.currentTimeMillis()/1000)*1000;
+    }
+
+    public static long getCurMsUTC(){
+        return System.currentTimeMillis();
+    }
+
+    /**
+     *
+     * @param lUTC  UTC时间格式(单位:毫秒)
+     * @param strDateFormat 日期格式模板:如:yyyy-MM-dd HH:mm:ss
+     * @return
+     */
+    public static String convertUTC2DateStr(long lUTC, String strDateFormat){
+        try {
+            return utcMsTime2StrTime(lUTC<=0?System.currentTimeMillis():lUTC
+                    , StringUtils.isEmpty(strDateFormat)?TIMESTAMP_FORMAT:strDateFormat);
+        }catch (Exception e){}
+        return "";
+    }
+
+    /**
+     * 从当前时间算起,还有多少毫秒今天将结束
+     * @return 所剩的毫秒数
+     */
+    public static long hasMsWhenTodayEnd(){
+        long lR = UTC_MS_TODAY_END+1-System.currentTimeMillis();
+        if (lR <= 0)
+            lR = 1;
+        return lR;
+    }
+
+    /**
+     * 获取过期时间
+     * @param nSeconds 从当前时间算起,nSeconds秒后过期
+     * @return UTC时间格式(单位:毫秒)
+     */
+    public static long createExpiredTime(long nSeconds){
+        nSeconds = nSeconds<0?0:nSeconds;
+        long nowMillis = System.currentTimeMillis();
+        return nowMillis+(nSeconds*1000);
+    }
+
+    /**
+     * 获取当天的开始时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:00:00:00.000所对应的时间戳
+     */
+    public static long getTodayBeginUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MIN)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 0);
+        todayStart.set(Calendar.MINUTE, 0);
+        todayStart.set(Calendar.SECOND, 0);
+        todayStart.set(Calendar.MILLISECOND, 0);
+        return todayStart.getTime().getTime();*/
+    }
+
+    /**
+     * 获取当天距离最近的整点时刻
+     * @return UTC时间格式(单位:毫秒)
+     * @return
+     */
+    public static long getTodayLastHourUTC(){
+        return LocalDateTime.now().withMinute(0).withSecond(0).withNano(0)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+    }
+
+    /**
+     * 获取指定时间的上一个最近的整点时刻
+     * @param timeMs
+     * @return
+     */
+    public static  long getLastHourUTCNearTm(long timeMs){
+        if (!isMsUTC(timeMs))
+            return timeMs;
+        long timeSecond = timeMs/1000;
+        return (timeSecond-timeSecond%3600)*1000;
+    }
+
+    /**
+     * 获取指定时间当日的起始时刻(即00:00:00.000)
+     * @param tmMS
+     * @return
+     */
+    public static long getBeginUTCOfTime(long tmMS){
+        if (!isMsUTC(tmMS)){
+            tmMS = tmMS*1000;
+        }
+        LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MIN);
+        return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+    }
+
+    /**
+     * 获取指定时间当日的结束时刻(即23:59:59.999)
+     * @param tmMS
+     * @return
+     */
+    public static long getEndUTCOfTime(long tmMS){
+        if (!isMsUTC(tmMS)){
+            tmMS = tmMS*1000;
+        }
+        LocalDateTime startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(tmMS), ZoneId.systemDefault()).with(LocalTime.MAX);
+        return startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+    }
+    /**
+     * 获取当天的结束时间
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:23:59:59.999所对应的时间戳
+     */
+    public static long getTodayEndUTC(){
+        return LocalDateTime.of(LocalDate.now(), LocalTime.MAX)
+                .atZone(ZoneId.systemDefault())
+                .toInstant()
+                .toEpochMilli();
+        /*Calendar todayStart = Calendar.getInstance();
+        todayStart.set(Calendar.HOUR_OF_DAY, 23);
+        todayStart.set(Calendar.MINUTE, 59);
+        todayStart.set(Calendar.SECOND, 59);
+        todayStart.set(Calendar.MILLISECOND, 999);
+        return todayStart.getTime().getTime();*/
+    }
+
+    /**
+     * 获取当前时间所在月份的开始时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-01 00:00:00.000所对应的时间戳
+     */
+    public static long getMonthBeginUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, 1);
+            c.set(Calendar.HOUR_OF_DAY, 0);
+            c.set(Calendar.MINUTE, 0);
+            c.set(Calendar.SECOND,0);
+            c.set(Calendar.MILLISECOND, 0);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 获取当前时间所在月份的结束时间戳
+     * @param curTime
+     * @return UTC时间格式(单位:毫秒)
+     * 返回时间格式为:xxxx-xx-31 23:59:59.999所对应的时间戳
+     */
+    public static long getMonthEndUTC(long curTime){
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+            c.set(Calendar.HOUR_OF_DAY, 23);
+            c.set(Calendar.MINUTE, 59);
+            c.set(Calendar.SECOND,59);
+            c.set(Calendar.MILLISECOND, 999);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份字符串列表
+     * ["2018-01", "2018-02"]
+     */
+    public static List<String> getMonthListBetween(long startTime, long endTime){
+        ArrayList<String> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(dPos.getTime()));
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(strEnd);
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份字符串列表
+     * ["201801", "201802"]
+     */
+    public static List<String> getMonthListBetweenEx(long startTime, long endTime){
+        ArrayList<String> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add((new SimpleDateFormat(YEAR_MONTH_FORMAT_EX)).format(dPos.getTime()));
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(strEnd);
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表UTC
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 月份UTC时间戳列表(精确到毫秒)
+     * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
+     */
+    public static List<Long> getMonthUTCListBetween(long startTime, long endTime){
+        ArrayList<Long> arrMonth = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String strStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(startTime));
+            String strEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).format(new Date(endTime));
+            Date dtStart = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strStart);
+            Date dtEnd = (new SimpleDateFormat(YEAR_MONTH_FORMAT)).parse(strEnd);
+
+            Calendar dPos = Calendar.getInstance();
+            dPos.setTime(dtStart);                  //设置日期起始时间
+            while (dPos.getTime().before(dtEnd)) {
+                arrMonth.add(dPos.getTimeInMillis());
+                dPos.add(Calendar.MONTH, 1);//进行当前日期月份加1
+            }
+            arrMonth.add(dtEnd.getTime());
+        }catch (Exception e){e.printStackTrace();}
+        return arrMonth;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份字符串列表
+     * ["2018-01", "2018-02"]
+     */
+    public static List<String> getMonthListBetween(String startTime, String endTime){
+        try {
+            //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
+            //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
+            return getMonthListBetween(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份字符串列表
+     * ["201801", "201802"]
+     */
+    public static List<String> getMonthListBetweenEx(String startTime, String endTime){
+        try {
+            //Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(startTime);
+            //Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT_EX).parse(endTime);
+            return getMonthListBetweenEx(convertDateStr2UTC(startTime), convertDateStr2UTC(endTime));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取指定时间段内的所有月份列表UTC
+     * @param startTime 起始月份,如:2018-01-01 00:00:00
+     * @param endTime 结束月份,如:2018-02-01 00:00:00
+     * @return 月份UTC时间戳列表(精确到秒)
+     * [2018-01-01 00:00:00.000对应的UTC, 2018-02-01 00:00:00.000对应的UTC]
+     */
+    public static List<Long> getMonthUTCListBetween(String startTime, String endTime){
+        try {
+            Date d1 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(startTime);
+            Date d2 = new SimpleDateFormat(YEAR_MONTH_FORMAT).parse(endTime);
+            return getMonthUTCListBetween(d1.getTime(), d2.getTime());
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * yyyyMMddhhmmss时间字符串转yyyy-MM-dd HH:mm:ss时间字符串
+     * @param strDateStr
+     * @return
+     */
+    public static String addSplitForDateStr(String strDateStr){
+        if (!StringUtils.isEmpty(strDateStr)){
+            try {
+                return localDateTime2StrTime(strTime2LocalDateTime(strDateStr, TIMESTAMP_FORMAT_EX2), TIMESTAMP_FORMAT);
+            }catch (Exception e){}
+        }
+        return "";
+    }
+
+    /**
+     * 修改指定时间的月份
+     * @param curTime
+     * @param month  > 0 在指定时间上加数个月;< 0 在指定时间上减数个月;
+     * @return
+     */
+    public static long getTimeChgMonth(long curTime, int month){
+        if (month == 0)
+            return curTime;
+        Calendar c = Calendar.getInstance();
+        if (!isMsUTC(curTime))
+            curTime = curTime*1000;
+        try {
+            c.setTime(new Date(curTime));
+            c.add(Calendar.MONTH, month);
+            return c.getTimeInMillis();
+        }catch (Exception e){}
+        return 0L;
+    }
+
+    /**
+     * 获取指定时间段内的所有日期列表
+     * @param startTime 起始时间,UTC时间格式,秒或毫秒
+     * @param endTime 结束时间,UTC时间格式,秒或毫秒
+     * @return 日期字符串列表
+     * ["2018-01-01", "2018-02-01"]
+     */
+    public static List<String> getDayListBetweenEx(long startTime, long endTime){
+        List<String> arrDay = new ArrayList<>();
+        if (!isMsUTC(startTime))
+            startTime = startTime*1000;
+        if (!isMsUTC(endTime))
+            endTime = endTime*1000;
+        try{
+            String endDate = convertUTC2DateStr(endTime, YEAR_MONTH_DAY_FORMAT);
+            int nStep = 0;
+            do {
+                String timeDate = convertUTC2DateStr(startTime + (nStep++)*MS_ONE_DAY, YEAR_MONTH_DAY_FORMAT);
+                if (StringUtils.isEmpty(timeDate) || timeDate.compareTo(endDate) >= 0)
+                    break;
+                arrDay.add(timeDate);
+            }while (true);
+            arrDay.add(endDate);
+        }catch (Exception e){e.printStackTrace();}
+        return arrDay;
+    }
+}

+ 116 - 0
src/main/java/com/shkpr/service/warncore/components/LocalDynamicDataSource.java

@@ -0,0 +1,116 @@
+package com.shkpr.service.warncore.components;
+
+import com.global.base.tools.CastUtil;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 注:本地多数据源动态切换模式,不支持多数据源的事务操作,即:只支持指定单个数据源后的事务操作
+ */
+public class LocalDynamicDataSource extends AbstractRoutingDataSource {
+    private static final ThreadLocal<String> DATA_SOURCE_KEY = new ThreadLocal<>();
+    private static final ConcurrentHashMap<Object, Object> TARGET_DATA_SOURCE = new ConcurrentHashMap<>();
+    private final Map<String, String> DEFAULT_CONN_CONFIG = new HashMap<>();
+    private static final byte[] LATCH_COMM = new byte[0];
+
+    @Override
+    public void setTargetDataSources(Map<Object, Object> targetDataSources) {
+        TARGET_DATA_SOURCE.putAll(targetDataSources);
+        super.setTargetDataSources(TARGET_DATA_SOURCE);
+    }
+
+    @Override
+    public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
+        super.setDefaultTargetDataSource(defaultTargetDataSource);
+    }
+
+    @Override
+    protected Object determineCurrentLookupKey() {
+        String databaseKey = getDataSource();
+        if (StringUtils.isEmpty(databaseKey))
+            return databaseKey;
+
+        if (!TARGET_DATA_SOURCE.containsKey(databaseKey)){
+            synchronized (LATCH_COMM){
+                if (!TARGET_DATA_SOURCE.containsKey(databaseKey)){
+                    HikariDataSource oData = appendNewDataSource(databaseKey);
+                    if (oData != null){
+                        TARGET_DATA_SOURCE.put(databaseKey, oData);
+                        setTargetDataSources(TARGET_DATA_SOURCE);
+                        super.afterPropertiesSet();
+                    }
+                }
+            }
+        }else{
+            synchronized (LATCH_COMM){
+                HikariDataSource oData = (HikariDataSource)TARGET_DATA_SOURCE.get(databaseKey);
+                if (oData == null){
+                    HikariDataSource oNewData = appendNewDataSource(databaseKey);
+                    if (oNewData != null){
+                        TARGET_DATA_SOURCE.put(databaseKey, oNewData);
+                        setTargetDataSources(TARGET_DATA_SOURCE);
+                        super.afterPropertiesSet();
+
+                        if (oData != null)
+                            oData.close();
+                    }
+                }
+            }
+        }
+        return databaseKey;
+    }
+
+    public void initConnConfig(Map<String, String> config){
+        DEFAULT_CONN_CONFIG.clear();
+        DEFAULT_CONN_CONFIG.putAll(config);
+    }
+
+    private HikariDataSource appendNewDataSource(String dataKey){
+        if (DEFAULT_CONN_CONFIG.size() <= 0 || StringUtils.isEmpty(dataKey))
+            return null;
+
+        HikariConfig hikariConfig = new HikariConfig();
+
+        hikariConfig.setDriverClassName(DEFAULT_CONN_CONFIG.getOrDefault("driverClassName", "org.postgresql.Driver"));
+        hikariConfig.setJdbcUrl(String.format(DEFAULT_CONN_CONFIG.get("jdbcUrl"), DEFAULT_CONN_CONFIG.getOrDefault("address", "127.0.0.1:5432"), dataKey));
+
+        hikariConfig.setUsername(DEFAULT_CONN_CONFIG.getOrDefault("username", "postgres"));
+        hikariConfig.setPassword(DEFAULT_CONN_CONFIG.getOrDefault("password", "kpr.23417.postgres"));
+
+        hikariConfig.setMaximumPoolSize(CastUtil.castInt(DEFAULT_CONN_CONFIG.get("maximumPoolSize"), 200));
+        hikariConfig.setMinimumIdle(CastUtil.castInt(DEFAULT_CONN_CONFIG.get("minimumIdle"), 1));
+        hikariConfig.setConnectionTestQuery(DEFAULT_CONN_CONFIG.get("connectionTestQuery"));
+        hikariConfig.setMaxLifetime(CastUtil.castLong(DEFAULT_CONN_CONFIG.get("maxLifetime"), 120000));
+        hikariConfig.setIdleTimeout(CastUtil.castLong(DEFAULT_CONN_CONFIG.get("idleTimeout"), 30000));
+        hikariConfig.setConnectionTimeout(CastUtil.castLong(DEFAULT_CONN_CONFIG.get("connectionTimeout"), 30000));
+        hikariConfig.setValidationTimeout(CastUtil.castLong(DEFAULT_CONN_CONFIG.get("validationTimeout"), 30000));
+        hikariConfig.setInitializationFailTimeout(CastUtil.castLong(DEFAULT_CONN_CONFIG.get("initFailedTimeout"), -1));
+        HikariDataSource obj = new HikariDataSource(hikariConfig);
+        try {
+            obj.setLoginTimeout((int)hikariConfig.getConnectionTimeout()/1000);
+        }catch (Exception e){}
+        return obj;
+    }
+
+    public static void changeDataSource(String dataSourceKey) {
+        if (!StringUtils.isEmpty(dataSourceKey))
+            DATA_SOURCE_KEY.set(String.format("%s", dataSourceKey));
+    }
+
+    public static String getDataSource() { return DATA_SOURCE_KEY.get(); }
+
+    public static void clearDataSource() {
+        DATA_SOURCE_KEY.remove();
+    }
+
+    public static Map<Object, Object> listTargetDataSource(){
+        return TARGET_DATA_SOURCE;
+    }
+}
+

+ 62 - 0
src/main/java/com/shkpr/service/warncore/components/locks/BaseLockMgr.java

@@ -0,0 +1,62 @@
+package com.shkpr.service.warncore.components.locks;
+
+import com.shkpr.service.warncore.commtools.TimeTool;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+public abstract class BaseLockMgr {
+    private final byte[] LATCH_COMM = new byte[0];
+    private ConcurrentHashMap<String, CountDownLatchEx> COMMKEY2CDLatch = new ConcurrentHashMap<>();
+
+    public BaseLockMgr() {
+    }
+
+    /**
+     * 根据指定key获取单机版同一线程可重入锁(区别与分布式同步排他锁)
+     * @param key
+     * @param waitMsTm:等待响应的时长,单位:毫秒
+     * @return
+     * @throws Exception
+     */
+    public CountDownLatchEx tryLatchForXXX(String key, long waitMsTm) throws Exception{
+        if (StringUtils.isEmpty(key))
+            return null;
+
+        CountDownLatchEx oOldLatch = null;
+        synchronized (LATCH_COMM){
+            oOldLatch = COMMKEY2CDLatch.get(key);
+            if (oOldLatch == null){
+                oOldLatch = new CountDownLatchEx(key, true);
+                COMMKEY2CDLatch.put(key, oOldLatch);
+                return oOldLatch;
+            }
+        }
+
+        if (oOldLatch != null){
+            try {
+                return oOldLatch.tryLock(waitMsTm);
+            }catch (Exception ex){
+                throw ex;
+            }
+        }else
+            return null;
+    }
+
+    public void timerReleaseLatch(){
+        List<String> keys =  new ArrayList<>(COMMKEY2CDLatch.keySet());
+        long lCurTm = System.currentTimeMillis();
+        for (String key:keys){
+            CountDownLatchEx oOldLatch = COMMKEY2CDLatch.get(key);
+            long lEndTm = oOldLatch!=null?oOldLatch.getEndLockTM():0L;
+            if (lEndTm > 0L && (lCurTm - lEndTm >= TimeTool.MS_ONE_DAY)){
+                synchronized (LATCH_COMM){
+                    COMMKEY2CDLatch.remove(key);
+                }
+            }
+        }
+    }
+}
+

+ 5 - 0
src/main/java/com/shkpr/service/warncore/components/locks/CommParamLockMgr.java

@@ -0,0 +1,5 @@
+package com.shkpr.service.warncore.components.locks;
+
+
+public class CommParamLockMgr extends BaseLockMgr{
+}

+ 137 - 0
src/main/java/com/shkpr/service/warncore/components/locks/CountDownLatchEx.java

@@ -0,0 +1,137 @@
+package com.shkpr.service.warncore.components.locks;
+
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 同一线程下可重入锁;但不支持父子线程之间的可重入锁
+ */
+public class CountDownLatchEx {
+    private final byte[] LATCH_COMM = new byte[0];
+    private volatile long endLockTM = 0L;
+    private volatile Thread lockedBy = null;
+    private volatile int lockedCount = 0;
+    private boolean isReentrant = true;  //是否定义为可重入锁
+    private String strTag = "";
+    private Map<Thread, CountDownLatch> subThreadId2Wait = new HashMap<>();
+
+    public CountDownLatchEx(String tag, boolean reentrant) {
+        this.lockedCount = 1;
+        this.lockedBy = Thread.currentThread();
+        this.strTag = (StringUtils.isEmpty(tag)?this.getClass().getSimpleName():tag);
+        this.isReentrant = reentrant;
+        subThreadId2Wait.put(lockedBy, new CountDownLatch(1));
+    }
+
+    public void countDown() {
+        synchronized (LATCH_COMM){
+            if (lockedCount > 0 && Thread.currentThread() == lockedBy){
+                List<CountDownLatch> waitLatch = new ArrayList<>(subThreadId2Wait.values());
+                subThreadId2Wait.clear();
+                lockedCount--;
+                if (lockedCount == 0)
+                    endLockTM = System.currentTimeMillis();
+                for (CountDownLatch oLatch:waitLatch)
+                    oLatch.countDown();
+                waitLatch.clear();
+            }
+        }
+    }
+
+    private void removeWaitLatch(Thread thread){
+        synchronized (LATCH_COMM){
+            subThreadId2Wait.remove(thread);
+        }
+    }
+
+    private CountDownLatch getWaitLatch(Thread thread){
+        synchronized (LATCH_COMM){
+            CountDownLatch subThreadWait = subThreadId2Wait.get(thread);
+            if (subThreadWait == null){
+                subThreadWait = new CountDownLatch(1);
+                subThreadId2Wait.put(thread, subThreadWait);
+            }
+            return subThreadWait;
+        }
+    }
+
+    public CountDownLatchEx tryLock(long waitMsTm) throws InterruptedException {
+        Thread thread = Thread.currentThread();
+        if (waitMsTm < 0){
+            while (lockedCount > 0 && (!isReentrant || lockedBy != thread)){
+                CountDownLatch waitLatch = getWaitLatch(thread);
+                if (waitLatch != null)
+                    try {
+                        waitLatch.await();
+                    }catch (InterruptedException ee){
+                        removeWaitLatch(thread);
+                        throw ee;
+                    }
+                else
+                    return null;
+            }
+        }else {
+            long canWaitMsTm = waitMsTm;
+            while (canWaitMsTm > 0 && lockedCount > 0 && (!isReentrant || lockedBy != thread)){
+                CountDownLatch waitLatch = getWaitLatch(thread);
+                if (waitLatch != null){
+                    long startWait = System.currentTimeMillis();
+                    try {
+                        waitLatch.await(canWaitMsTm, TimeUnit.MILLISECONDS);
+                    }catch (InterruptedException ee){
+                        removeWaitLatch(thread);
+                        throw ee;
+                    }
+                    canWaitMsTm = canWaitMsTm - (System.currentTimeMillis() - startWait);
+                }else
+                    return null;
+            }
+        }
+
+        synchronized (LATCH_COMM){
+            if (lockedCount > 0 && (!isReentrant || lockedBy != thread)){
+                removeWaitLatch(thread);
+                return null;
+            }
+
+            lockedCount++;
+            lockedBy = thread;
+            endLockTM = 0L;
+            return this;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return strTag.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+
+        if (!(obj instanceof CountDownLatchEx)) {
+            return false;
+        }
+
+        CountDownLatchEx other = (CountDownLatchEx)obj;
+        if (other.strTag.equals(this.strTag))
+            return true;
+        return false;
+    }
+
+    public long getEndLockTM() {
+        synchronized (LATCH_COMM){
+            return endLockTM;
+        }
+    }
+}
+

+ 6 - 0
src/main/java/com/shkpr/service/warncore/components/locks/TaskLockMgr.java

@@ -0,0 +1,6 @@
+package com.shkpr.service.warncore.components.locks;
+
+
+public class TaskLockMgr extends BaseLockMgr{
+
+}

+ 26 - 0
src/main/java/com/shkpr/service/warncore/components/validators/IntInitOrRange.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+@Documented
+@Constraint(validatedBy = {IntInitOrRangeV.class})
+@Target({ ElementType.FIELD, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface IntInitOrRange {
+    String message() default "Filed Or Param Is Invalid";
+    int init() default 0;
+    int min() default 0;
+    int max() default 2147483647;
+
+    Class<?>[] groups() default {};
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ElementType.FIELD, ElementType.PARAMETER})
+    @Retention(RetentionPolicy.RUNTIME)
+    @Documented
+    public @interface List {
+        IntInitOrRange[] value();
+    }
+}

+ 30 - 0
src/main/java/com/shkpr/service/warncore/components/validators/IntInitOrRangeV.java

@@ -0,0 +1,30 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * (1) 要么为init初始值 (2)要么取值范围在[min, max]之间
+ */
+public class IntInitOrRangeV implements ConstraintValidator<IntInitOrRange, Integer> {
+    int init = 0;
+    int min = 0;
+    int max = 2147483647;
+
+    @Override
+    public void initialize(IntInitOrRange constraintAnnotation) {
+        init = constraintAnnotation.init();
+        min = constraintAnnotation.min();
+        max = constraintAnnotation.max();
+    }
+
+    @Override
+    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
+        if (integer != null
+                && (integer.intValue() == init
+                    || (integer.intValue() >= min && integer.intValue() <= max))) {
+            return true;
+        }
+        return false;
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/warncore/components/validators/ListNullOrSize.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+@Documented
+@Constraint(validatedBy = {ListNullOrSizeV.class})
+@Target({ ElementType.FIELD, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ListNullOrSize {
+    String message() default "Filed Or Param Is Invalid";
+    int min() default 0;
+    int max() default 2147483647;
+
+    Class<?>[] groups() default {};
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ElementType.FIELD, ElementType.PARAMETER})
+    @Retention(RetentionPolicy.RUNTIME)
+    @Documented
+    public @interface List {
+        ListNullOrSize[] value();
+    }
+}

+ 26 - 0
src/main/java/com/shkpr/service/warncore/components/validators/ListNullOrSizeV.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.List;
+
+/**
+ * (1) 为null  (2) 不为null时,要求size在[min, max]之间
+ */
+public class ListNullOrSizeV implements ConstraintValidator<ListNullOrSize, List> {
+    int min = 0;
+    int max = 2147483647;
+
+    @Override
+    public void initialize(ListNullOrSize constraintAnnotation) {
+        min = constraintAnnotation.min();
+        max = constraintAnnotation.max();
+    }
+
+    @Override
+    public boolean isValid(List list, ConstraintValidatorContext constraintValidatorContext) {
+        if (list == null || (list.size() >= min && list.size() <= max))
+            return true;
+        return false;
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/warncore/components/validators/StrNullOrSize.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+@Documented
+@Constraint(validatedBy = {StrNullOrSizeV.class})
+@Target({ ElementType.FIELD, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface StrNullOrSize {
+    String message() default "Filed Or Param Is Invalid";
+    int min() default 0;
+    int max() default 2147483647;
+
+    Class<?>[] groups() default {};
+    Class<? extends Payload>[] payload() default {};
+
+    @Target({ElementType.FIELD, ElementType.PARAMETER})
+    @Retention(RetentionPolicy.RUNTIME)
+    @Documented
+    public @interface List {
+        StrNullOrSize[] value();
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/warncore/components/validators/StrNullOrSizeV.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.components.validators;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * (1) 为null  (2) 不为null时,要求size在[min, max]之间
+ */
+public class StrNullOrSizeV implements ConstraintValidator<StrNullOrSize, String> {
+    int min = 0;
+    int max = 2147483647;
+
+    @Override
+    public void initialize(StrNullOrSize constraintAnnotation) {
+        min = constraintAnnotation.min();
+        max = constraintAnnotation.max();
+    }
+
+    @Override
+    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
+        if (s == null || (s.length() >= min && s.length() <= max))
+            return true;
+        return false;
+    }
+}

+ 37 - 0
src/main/java/com/shkpr/service/warncore/configuration/CaffeineConfiguration.java

@@ -0,0 +1,37 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.github.benmanes.caffeine.cache.RemovalCause;
+import com.github.benmanes.caffeine.cache.RemovalListener;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableAutoConfiguration
+public class CaffeineConfiguration {
+    @Value("${local.cache.max.size.last.dev.fp:5000}")
+    private int lastDevFPMaxCacheSize;
+
+    @Value("${local.cache.expired.last.dev.fp:65}")
+    private int lastDevFPCacheExpiredTm;
+
+    @Value("${local.cache.max.size.calc.data:2000}")
+    private int calcDataMaxCacheSize;
+
+    @Value("${local.cache.expired.calc.data:1440}")
+    private int calcDataCacheExpiredTm;
+
+    @Value("${local.cache.max.size.last.zone.data:2000}")
+    private int lastZoneDataCacheSize;
+
+    @Value("${local.cache.expired.last.zone.data:65}")
+    private int lastZoneDataCacheExpiredTm;
+
+    class CustomRemovalListener implements RemovalListener<Object, Object> {
+        @Override
+        public void onRemoval(Object key, Object value, RemovalCause cause) {
+            //System.out.format("removal listerner called with key [%s], cause [%s], evicted [%S]\n",
+            //        key, cause.toString(), cause.wasEvicted());
+        }
+    }
+}

+ 57 - 0
src/main/java/com/shkpr/service/warncore/configuration/DBMgrConfiguration.java

@@ -0,0 +1,57 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+@Configuration
+@EnableAutoConfiguration
+public class DBMgrConfiguration {
+    @Value("${global.log.switch.info:true}")                //所有业务Info级别的日志开关标识
+    private boolean mBAllInfoLogPrintFlag;
+
+    @Value("${global.log.switch.info.user:true}")
+    private boolean mBUserInfoLogPrintFlag;                  //用户业务Info级别的日志开关标识
+
+    @Value("${global.log.switch.info.auth:true}")
+    private boolean mBAuthInfoLogPrintFlag;                  //验证业务Info级别的日志开关标识
+
+    @Value("${global.log.switch.info.db.user:true}")
+    private boolean mBDatabaseUserInfoLogPrintFlag;               //Database中用户业务Info级别的日志开关标识
+
+    @Value("${global.lan.test.log:false}")
+    private boolean mBInnerTest = false;
+
+    public DBMgrConfiguration() {
+    }
+
+    @PostConstruct
+    public void init(){
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogPrintMgr.ALL_BUSI_SWITCH, mBAllInfoLogPrintFlag);
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_INIT.toStrValue(), true);
+
+        if (mBInnerTest)
+            return;
+
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_USER.toStrValue(), mBUserInfoLogPrintFlag);
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_AUTH.toStrValue(), mBAuthInfoLogPrintFlag);
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_SMS.toStrValue(), true);
+
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_DB_USER.toStrValue(), mBDatabaseUserInfoLogPrintFlag);
+        LogPrintMgr.getInstance().setLogSwitch(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_DB_SMS.toStrValue(), true);
+
+    }
+
+    //使用时可用@Qualifier("startDBMgrProxy")进行识别
+    /*@Bean
+    public DBMgrProxy startDBMgrProxy(){
+        DBMgrProxy.getInstance().init();
+        return DBMgrProxy.getInstance();
+    }*/
+}
+

+ 74 - 0
src/main/java/com/shkpr/service/warncore/configuration/GlobalParamConfiguration.java

@@ -0,0 +1,74 @@
+package com.shkpr.service.warncore.configuration;
+
+
+import com.global.base.tools.EncryptionUtil;
+import com.global.base.tools.RandomUtil;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.globalmgr.ThreadTaskMgr;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
+import javax.annotation.PostConstruct;
+
+@Configuration
+@EnableAutoConfiguration
+public class GlobalParamConfiguration {
+    @Value("${global.http.status.200:true}")
+    private boolean mBHttpStatusAlready200;                       //Http Status是否总是返回200ok,即所有错误码只能在body当中
+
+    @Value("${global.local.cache.switch:true}")                   //是否启用本地缓存策略
+    private boolean mBUseLocalCache;
+
+    @Value("${global.enable.async.subtask.cpucores:8}")         //启动异步子任务的最小cpu核心数
+    private int mNCpuCoresForEnableAsyncSubTask = 8;
+
+    @Value("${global.internal.operator.account:TriCooperation}")
+    private String mStrInternalOperatorAccount = "";
+
+    @Value("${global.internal.operator.password:123@asd}")       //123@asd的BCypte加盐值
+    private String mStrInternalOperatorPassword = "";
+
+    @Value("${global.group.size.calc.zone.real:30}")              //分区实时数据分步计算的分组个数
+    private int mNGroupSizeForCALCZoneReal = 30;
+
+    @Value("${global.group.size.last.zone.flow:20}")              //分区最新流量分步查询的分组元素个数
+    private int mNGroupSizeForLastZoneFlow = 20;
+
+    @Value("${global.muti.calc.zone.real.switch:true}")
+    private boolean mBUseMutiThreadCALCZoneReal = true;          //是否开启多线程查询计算分区实时数据
+
+    @Value("${global.internal.call.password:}")
+    private String mStrInternalCallPassword = "";
+
+    @Value("${global.force.convert.influx.zone.utc:false}")
+    private boolean mForceConvertInfluxZoneUTC = false;
+
+    public GlobalParamConfiguration() {
+    }
+
+    @PostConstruct
+    public void init(){
+        GlobalData.getInstance().setForceConvertInfluxZoneUTC(mForceConvertInfluxZoneUTC);
+        GlobalData.getInstance().setHttpStatusAlready200(mBHttpStatusAlready200);
+        GlobalData.getInstance().setUseLocalCache(mBUseLocalCache);
+        GlobalData.getInstance().setCpuCoresForEnableAsyncSubTask(mNCpuCoresForEnableAsyncSubTask);
+        GlobalData.getInstance().setStrOperatorAccount(mStrInternalOperatorAccount);
+        GlobalData.getInstance().setStrOperatorPassword(mStrInternalOperatorPassword);
+        GlobalData.getInstance().setGroupSizeForCALCZoneReal(mNGroupSizeForCALCZoneReal);
+        GlobalData.getInstance().setGroupSizeForLastZoneFlow(mNGroupSizeForLastZoneFlow);
+        GlobalData.getInstance().setSwitchMutiCALCZoneReal(mBUseMutiThreadCALCZoneReal);
+        GlobalData.getInstance().setInternalCallPassword(EncryptionUtil.MD5Hash(StringUtils.isEmpty(mStrInternalCallPassword)? RandomUtil.getRandomStr(8):mStrInternalCallPassword));
+
+        ThreadTaskMgr.runTask(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(10000);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+}

+ 108 - 0
src/main/java/com/shkpr/service/warncore/configuration/MainSourceConfiguration.java

@@ -0,0 +1,108 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = "com.shkpr.service.warncore.dbdao.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
+@PropertySource(value = "file:${global.sql.config.path}", ignoreResourceNotFound = true, encoding="utf-8")
+public class MainSourceConfiguration {
+    @Value("${spring.datasource.data.driver-class-name:}")
+    private String driveClass = "org.postgresql.Driver";
+
+    @Value("${spring.datasource.data.jdbc-url:}")
+    private String url = "";
+
+    @Value("${spring.datasource.data.username:}")
+    private String username = "";
+
+    @Value("${spring.datasource.data.password:}")
+    private String password = "";
+
+    @Value("${spring.datasource.data.maximum-pool-size:200}")
+    private Integer maxPoolSize;
+
+    @Value("${spring.datasource.data.minimum-idle:1}")
+    private Integer minIdle;
+
+    @Value("${spring.datasource.data.connection-test-query:}")
+    private String connectionTestQuery;
+
+    @Value("${spring.datasource.data.max-lifetime:120000}")
+    private Long maxLifetime;
+
+    @Value("${spring.datasource.data.idle-timeout:30000}")
+    private Long idleTimeout;
+
+    @Value("${spring.datasource.data.connection-timeout:30000}")
+    private Long connectionTimeout;
+
+    @Value("${spring.datasource.data.validation-timeout:30000}")
+    private Long validTimeout;
+
+    @Value("${spring.datasource.data.init-failed-timeout:-1}")
+    private Long initFailedTimeout;
+
+    @Bean(name = "mainDatasource")
+    //@ConfigurationProperties(prefix = "spring.datasource.data")
+    public DataSource mainDataSource() {
+        return new HikariDataSource(getConfig());
+        //return DataSourceBuilder.create().build();
+        //Spring Boot 2.x默认使用HikariCP
+    }
+
+    private HikariConfig getConfig() {
+        HikariConfig hikariConfig = new HikariConfig();
+        hikariConfig.setDriverClassName(driveClass);
+        hikariConfig.setJdbcUrl(url);
+        hikariConfig.setUsername(username);
+        hikariConfig.setPassword(password);
+
+        hikariConfig.setMaximumPoolSize(maxPoolSize);
+        hikariConfig.setMinimumIdle(minIdle);
+        hikariConfig.setConnectionTestQuery(connectionTestQuery);
+        hikariConfig.setMaxLifetime(maxLifetime);
+        hikariConfig.setIdleTimeout(idleTimeout);
+        hikariConfig.setConnectionTimeout(connectionTimeout);
+        hikariConfig.setValidationTimeout(validTimeout);
+        hikariConfig.setInitializationFailTimeout(initFailedTimeout);
+        return hikariConfig;
+    }
+
+    @Bean("mainSqlSessionFactory")
+    public SqlSessionFactory mainSqlSessionFactoryBean(@Qualifier("mainDatasource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(dataSource);
+
+        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+        configuration.setCallSettersOnNulls(true);       //数据库中字段值为null时也要求返回
+        configuration.setMapUnderscoreToCamelCase(true); //开启驼峰映射
+        configuration.setCacheEnabled(false);
+        sessionFactoryBean.setConfiguration(configuration);
+        return sessionFactoryBean.getObject();
+    }
+
+    @Bean("mainSqlSessionTemplate")
+    public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sessionFactory) {
+        return new SqlSessionTemplate(sessionFactory);
+    }
+
+    @Bean(name = "mainDbTransactionManager")
+    public DataSourceTransactionManager mainDbTransactionManager(@Qualifier("mainDatasource") DataSource dataSource){
+        return new DataSourceTransactionManager(dataSource);
+    }
+}

+ 35 - 0
src/main/java/com/shkpr/service/warncore/configuration/RestTemplateConfig.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.shkpr.service.warncore.factorys.SslClientHttpRequestFactory;
+import com.shkpr.service.warncore.services.ServiceMgrProxy;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+@EnableAutoConfiguration
+public class RestTemplateConfig {
+
+    @Bean(name = "RestTemplateEx")
+    public RestTemplate restTemplate(@Qualifier("ClientHttpRequestFactoryEx") ClientHttpRequestFactory factory) {
+        return new RestTemplate(factory);
+    }
+
+    @Bean("ClientHttpRequestFactoryEx")
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+        //SimpleClientHttpRequestFactory factory1 = new SimpleClientHttpRequestFactory();
+        SslClientHttpRequestFactory factory = new SslClientHttpRequestFactory();
+        factory.setReadTimeout(30000);
+        factory.setConnectTimeout(/*20000*/30000);
+        return factory;
+    }
+
+    @Bean
+    public ServiceMgrProxy startServiceMgrProxy(){
+        ServiceMgrProxy.getInstance().init();
+        return ServiceMgrProxy.getInstance();
+    }
+}

+ 45 - 0
src/main/java/com/shkpr/service/warncore/configuration/RetryTemplateConfig.java

@@ -0,0 +1,45 @@
+package com.shkpr.service.warncore.configuration;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.retry.backoff.ExponentialBackOffPolicy;
+import org.springframework.retry.backoff.FixedBackOffPolicy;
+import org.springframework.retry.policy.SimpleRetryPolicy;
+import org.springframework.retry.support.RetryTemplate;
+
+@Configuration
+@EnableAutoConfiguration
+public class RetryTemplateConfig {
+    @Primary
+    @Bean(name = "Normal3Retry")
+    public RetryTemplate normal3Retry(){
+        RetryTemplate template = new RetryTemplate();
+        SimpleRetryPolicy policy = new SimpleRetryPolicy();//默认最大重试次数为3
+
+        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
+        backOffPolicy.setInitialInterval(200L);
+        backOffPolicy.setMaxInterval(200L);
+        backOffPolicy.setMultiplier(2.0);//第一次间隔为T1=200ms,第二次为T2=2*T1=400ms,第三次为T3=2*T2=800ms
+
+        template.setBackOffPolicy(backOffPolicy);
+        template.setRetryPolicy(policy);
+
+        return template;
+    }
+
+    @Bean(name = "FixedPeriod3Retry")
+    public RetryTemplate fixedPeriod3Retry(){
+        RetryTemplate template = new RetryTemplate();
+        SimpleRetryPolicy policy = new SimpleRetryPolicy();//默认最大重试次数为3
+
+        FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
+        fixedBackOffPolicy.setBackOffPeriod(500L); //每次重试固定间隔500ms
+
+        template.setBackOffPolicy(fixedBackOffPolicy);
+        template.setRetryPolicy(policy);
+
+        return template;
+    }
+}

+ 90 - 0
src/main/java/com/shkpr/service/warncore/configuration/ScheduleTaskConfiguration.java

@@ -0,0 +1,90 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.commtools.TimeTool;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+import javax.annotation.PostConstruct;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.concurrent.Executor;
+
+@Configuration
+@EnableScheduling
+@ConfigurationProperties(prefix = "cron")
+public class ScheduleTaskConfiguration implements SchedulingConfigurer, AsyncConfigurer {
+    private String mStrClassName;
+    public ScheduleTaskConfiguration() {
+        mStrClassName = this.getClass().getSimpleName();
+    }
+
+    private Map<String, Integer> refreshByStepForGroup = new HashMap<>();
+
+    public Map<String, Integer> getRefreshByStepForGroup() {
+        return refreshByStepForGroup;
+    }
+
+    public void setRefreshByStepForGroup(Map<String, Integer> refreshByStepForGroup) {
+        this.refreshByStepForGroup = refreshByStepForGroup;
+    }
+
+    @Override
+    public Executor getAsyncExecutor() {
+        Executor executor = taskScheduler();
+        return executor;
+    }
+
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return new AsyncUncaughtExceptionHandler() {
+            @Override
+            public void handleUncaughtException(Throwable ex, Method method, Object... params) {
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, LogFlagBusiType.BUSI_INIT.toStrValue(), mStrClassName
+                        ,String.format("AsyncUncaughtException(method="+method.getName()+", msg="+ex.getMessage()+")..."));
+            }
+        };
+    }
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
+        TaskScheduler taskScheduler = taskScheduler();
+        scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
+    }
+
+    /** 定时任务多线程处理 */
+    @Bean(destroyMethod = "shutdown")
+    public ThreadPoolTaskScheduler taskScheduler(){
+        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+        scheduler.setPoolSize(5);
+        scheduler.setThreadNamePrefix("Time-Task-");
+        //设置线程池中任务的等待时间,如果超过这个时间还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
+        //如:kill [PID]后,最大等待时长为5秒钟
+        scheduler.setAwaitTerminationSeconds(5);
+        //设置线程池关闭的时候等待所有任务都完成后,再继续销毁其他的Bean,这样这些异步任务的销毁就会先于数据库连接池对象的销毁
+        scheduler.setWaitForTasksToCompleteOnShutdown(true);
+        return scheduler;
+    }
+
+    @PostConstruct
+    public void init(){
+        GlobalData.getInstance().setGroup2RefreshByMinuteSteps(refreshByStepForGroup);
+        new Timer().schedule(new TimerTask() {
+            @Override
+            public void run() {
+                TimeTool.refreshUTCTimeRes();
+            }
+        }, 1000);//延时1秒执行
+    }
+}

+ 40 - 0
src/main/java/com/shkpr/service/warncore/configuration/TaskQueueConfiguration.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.shkpr.service.warncore.globalmgr.*;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+@Configuration
+@EnableAutoConfiguration
+public class TaskQueueConfiguration {
+    public TaskQueueConfiguration() {
+    }
+
+    @PostConstruct
+    public void init(){
+        ThreadTaskMgr.runTask(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(3000);
+                }catch (Exception e){}
+            }
+        });
+    }
+
+    //使用时可用@Qualifier("startDelayTaskQueueMgr")进行识别
+    @Bean
+    public DelayTaskQueueMgr startDelayTaskQueueMgr(){
+        return DelayTaskQueueMgr.getInstance();
+    }
+
+    //使用时可用@Qualifier("startAsyncTaskQueueMgr")进行识别
+    @Bean
+    public AsyncTaskQueueMgr startAsyncTaskQueueMgr() {return AsyncTaskQueueMgr.getInstance();}
+
+    @Bean
+    public NotifyMsgQueueMgr startNotifyMsgQueueMgr() {return NotifyMsgQueueMgr.getInstance();}
+}

+ 53 - 0
src/main/java/com/shkpr/service/warncore/configuration/ValidatorConfiguration.java

@@ -0,0 +1,53 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import javax.validation.executable.ExecutableValidator;
+
+@Configuration
+@EnableAutoConfiguration
+public class ValidatorConfiguration {
+
+    @Bean
+    public MethodValidationPostProcessor selfMethodValidationPostProcessor() {
+        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
+        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
+                .configure()
+                .addProperty( "hibernate.validator.fail_fast", "true" )
+                .buildValidatorFactory();
+        postProcessor.setValidator(validatorFactory.getValidator()/*selfValidator()*/);//设置validator模式为快速失败返回
+        return postProcessor;
+    }
+
+    //用于校验属性或变量
+    //使用时可用@Qualifier("selfValidator")进行识别
+    @Bean
+    public Validator selfValidator(){
+        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
+                .configure()
+                .addProperty( "hibernate.validator.fail_fast", "true" )
+                .buildValidatorFactory();
+        GlobalData.getInstance().setValidForParam(validatorFactory.getValidator());
+        return GlobalData.getInstance().getValidForParam();
+    }
+
+    //用于校验函数接口
+    //使用时可用@Qualifier("selfExeValidator")进行识别
+    @Bean
+    public ExecutableValidator selfExeValidator(){
+        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
+                .configure()
+                .addProperty( "hibernate.validator.fail_fast", "true" )
+                .buildValidatorFactory();
+        GlobalData.getInstance().setValidForFun(validatorFactory.getValidator().forExecutables());
+        return GlobalData.getInstance().getValidForFun();
+    }
+}

+ 96 - 0
src/main/java/com/shkpr/service/warncore/configuration/WebMvcConfiguration.java

@@ -0,0 +1,96 @@
+package com.shkpr.service.warncore.configuration;
+import com.shkpr.service.warncore.SpringContextUtil;
+import com.shkpr.service.warncore.interfaces.URIInterceptorIntef;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpMethod;
+import org.springframework.util.StringUtils;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.*;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 该类主要用来注册各种Controller拦截器
+ * WebSecurityConfig类中注册的过滤器JWTLoginFilter、JWTAuthenticationFilter优先于该类中注册的拦截器URIInterceptorIntef
+ * 过滤拦截顺序: JWTLoginFilter--->JWTAuthenticationFilter--->URIInterceptorIntef
+ */
+@Configuration
+@EnableWebMvc
+public class WebMvcConfiguration implements WebMvcConfigurer{
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        @SuppressWarnings("static-access")
+        Map<String, URIInterceptorIntef> mapURLInterceptorByOrder = new TreeMap<String, URIInterceptorIntef>(); //TreeMap默认按键值升序
+        Map<String, URIInterceptorIntef> mapURLInterceptor = SpringContextUtil.getApplicationContext().getBeansOfType(URIInterceptorIntef.class);  //获取URIInterceptorIntef类型的所有Component组件
+        if (!StringUtils.isEmpty(mapURLInterceptor)){
+            Iterator it = mapURLInterceptor.entrySet().iterator();
+            while (it.hasNext()){
+                Map.Entry entry = (Map.Entry)it.next();
+                URIInterceptorIntef urlInterceptor = (URIInterceptorIntef)entry.getValue();
+                if (urlInterceptor != null){
+                    mapURLInterceptorByOrder.put(String.valueOf(urlInterceptor.order()), urlInterceptor);
+                }
+            }
+        }
+
+        if (!StringUtils.isEmpty(mapURLInterceptorByOrder)){
+            Iterator it = mapURLInterceptorByOrder.entrySet().iterator();
+            while (it.hasNext()){
+                Map.Entry entry = (Map.Entry)it.next();
+                //System.out.println("WebMvcConfig::addInterceptors() key="+(String) entry.getKey());
+                URIInterceptorIntef urlInterceptor = (URIInterceptorIntef)entry.getValue();
+                if (urlInterceptor != null){
+                    String[] arrForbidUrls = urlInterceptor.forbidPathPatterns();
+                    if (arrForbidUrls == null)
+                        arrForbidUrls = new String[]{};
+                    String[] arrExcludeUrls = urlInterceptor.excludePathPatterns();
+                    if (arrExcludeUrls == null){
+                        //多个拦截器将按照链接的顺序依次匹配拦截(注:有可能多个拦截器都匹配成功,则多个拦截器依次执行)
+                        registry.addInterceptor(urlInterceptor).addPathPatterns(arrForbidUrls);
+                    }else{
+                        registry.addInterceptor(urlInterceptor).addPathPatterns(arrForbidUrls).excludePathPatterns(arrExcludeUrls);
+                    }
+                }
+            }
+        }
+        //super.addInterceptors(registry);
+    }
+
+    //解决跨域问题
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.addAllowedOrigin("*");
+        //corsConfiguration.addAllowedMethod("*");
+        corsConfiguration.addAllowedMethod(HttpMethod.POST);
+        corsConfiguration.addAllowedMethod(HttpMethod.GET);
+        corsConfiguration.addAllowedMethod(HttpMethod.PUT);
+        corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
+        corsConfiguration.addAllowedMethod(HttpMethod.OPTIONS);
+        corsConfiguration.addAllowedMethod(HttpMethod.HEAD);
+        corsConfiguration.addAllowedHeader("x-requested-with,Content-Type,Authorization,user-agent,Timestamp,Sequence,Signature");
+        return corsConfiguration;
+    }
+
+    //解决跨域问题
+    @Bean
+    public CorsFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", buildConfig());
+        return new CorsFilter(source);
+    }
+
+    //配置该服务的默认首页用于阿里云服务SLB的http head健康检查
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+        registry.addViewController("/").setViewName("index");
+        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
+        //super.addViewControllers(registry);
+    }
+
+}

+ 71 - 0
src/main/java/com/shkpr/service/warncore/configuration/WebSecurityConfiguration.java

@@ -0,0 +1,71 @@
+package com.shkpr.service.warncore.configuration;
+
+import com.shkpr.service.warncore.controllerfilter.CustomAuthenticationProvider;
+import com.shkpr.service.warncore.controllerfilter.third.ThirdJWTBusiFilterMgr;
+import com.shkpr.service.warncore.constants.ApiURI;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+/**
+ * 该类主要用来做权限控制的配置、以及注册各种过滤器
+ * 执行顺序
+ * (1) 注册验证组件 - configure(AuthenticationManagerBuilder auth)方法中注册自定义验证组件
+ * (2) 设置验证规则 - configure(HttpSecurity http)方法中设置了各种路由访问规则
+ * (3) 初始化过滤组件 - JWTLoginFilter 和 JWTAuthenticationFilter 类会初始化
+ */
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)                     //@PreAuthorize对权限的注解需要设置prePostEnabled = true
+public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
+    @Value("${global.test.pressure:false}")
+    private boolean mBForPressureTest;
+
+    @Value("${global.ops.lan.ip:127.0.0.1}")
+    private String mStrOpsServerLanIP;
+
+    @Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        //使用自定义身份验证组件
+        auth.authenticationProvider(new CustomAuthenticationProvider());
+    }
+
+    // 设置 HTTP 验证规则
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        if (mBForPressureTest){
+        } else {
+            String[] arrOpsServerLanIPs = mStrOpsServerLanIP.split(";");
+            String strAccessFilterForOps = "hasIpAddress('127.0.0.1')";
+            for (String strTmp:arrOpsServerLanIPs){
+                strAccessFilterForOps += " or hasIpAddress('"+ strTmp +"')";
+            }
+
+            http.csrf().disable()                                          // 关闭csrf验证
+                    .authorizeRequests()                                   // 对请求进行认证
+                    .antMatchers("/").permitAll()
+                    .anyRequest().authenticated()                                                                                          //所有其他请求需要身份认证
+                    .and()
+                    //多个filter将按照链接的顺序依次传递执行
+                    .addFilterBefore(new ThirdJWTBusiFilterMgr(ApiURI.URI_ALL_BUSI_XXX, authenticationManager()),
+                            UsernamePasswordAuthenticationFilter.class);
+                    /*.addFilterBefore(new ServerStatusMonitorFilter(ThirdApiURI.URI_HGAS_MONITOR_XXX, authenticationManager()),
+                            UsernamePasswordAuthenticationFilter.class);*/
+        }
+    }
+
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        /*web.ignoring()
+                .antMatchers("/error")
+                .antMatchers("/static")
+                .antMatchers("/static/**");                                                               // 所有/static下的静态资源请求时都忽略访问规则
+        */
+    }
+}

+ 114 - 0
src/main/java/com/shkpr/service/warncore/constants/ApiURI.java

@@ -0,0 +1,114 @@
+package com.shkpr.service.warncore.constants;
+public class ApiURI {
+    public static final String HEADER_USER_AGENT = "user-agent";
+    public static final String HEADER_CLIENT_TYPE = "Client-Type";
+    public static final String HEADER_AUTH_VERIFY = "Auth-Verify";
+    public static final String HEADER_SIGN_KEY = "tri_coorperation_tech_stats";
+    public static final String HEADER_TIMESTAMP = "Timestamp";
+    public static final String HEADER_SEQUENCE = "Sequence";
+    public static final String HEADER_SIGNATURE = "Signature";
+    public static final String EXCEPTION_FORMAT = "{%s:%s}:%s"; //{(ios/apk/pc):url}:error reason
+
+    public static final String URI_XXX_NEW_INFO = "new-info";//新增
+    public static final String URI_XXX_NOTIFY = "notify";   //精确查找
+    public static final String URI_XXX_INFO = "info";   //精确查找
+    public static final String URI_XXX_LISTS = "lists"; //分页查询
+    public static final String URI_XXX_RESET = "reset"; //更新(插入或更新)
+    public static final String URI_XXX_IDS = "ids";     //查询id列表
+    public static final String URI_XXX_SK = "sk";       //以key搜索查询
+    public static final String URI_XXX_SS = "ss";       //模糊搜索查询
+    public static final String URI_XXX_DEL = "del";     //删除
+    public static final String URI_XXX_APPLY = "apply"; //申请操作
+    public static final String URI_XXX_REALS = "reals"; //实时数据
+    public static final String URI_XXX_REGIONS = "regions"; //区间数据
+    public static final String URI_XXX_REAL_FT = "real-ft"; //实时水量
+    public static final String URI_XXX_REAL_FIELDS = "real-fields"; //实时采集数据字段
+    public static final String URI_XXX_REAL_FIELDS_GROUP = "real-fields-group";
+    public static final String URI_XXX_SUPPLY_TOTAL = "supply-total"; //供水统计
+    public static final String URI_XXX_SUPPLY_RANK = "supply-rank";   //供水排名
+    public static final String URI_XXX_MAP_SHOW = "map-show";         //地图展示数据
+    public static final String URI_XXX_LAST_HOUR_MAP_SHOW = "last-hour-map-show"; //最近整点地图展示数据
+    public static final String URI_XXX_REAL_FIELDS_LIST = "real-fields-list"; //实时采集数据字段列表
+    public static final String URI_XXX_REAL_FIELDS_LIST_GROUP = "real-fields-list-group";
+    public static final String URI_XXX_REGIONS_LIST = "regions-list";
+    public static final String URI_XXX_REGIONS_PAGE_LIST = "regions-page-list";
+    public static final String URI_XXX_REGIONS_LIST_GROUP = "regions-list-group";
+    public static final String URI_XXX_REGIONS_GROUP = "regions-group";
+    public static final String URI_XXX_LAST_MAP_SHOW = "last-map-show";
+    public static final String URI_XXX_LAST_MAP_SHOW_GROUP = "last-map-show-group";
+    public static final String URI_XXX_LAST_MAP_SHOW_LIST = "last-map-show-list";
+    public static final String URI_XXX_LAST_MAP_SHOW_LIST_GROUP = "last-map-show-list-group";
+    public static final String URI_XXX_MONITOR_FIELDS_LIST_GROUP = "monitor-fields-list-group";
+    public static final String URI_XXX_REAL_FT_LIST = "real-ft-list";          //实时水量
+    public static final String URI_XXX_QOQ = "qoq";                             //环比数据
+    public static final String URI_XXX_PRESS_PASS_RANK = "press-pass-rank";   //压力合格率排名
+    public static final String URI_XXX_REGIONS_PRESS_PASS = "regions-press-pass";
+    public static final String URI_XXX_REGIONS_WATER_BALANCE = "regions-water-balance";
+    public static final String URI_XXX_SALE_WATER_SUMS = "sw-sums";
+    public static final String URI_XXX_REGIONS_DAILY_ANLY = "regions-daily-anly";
+    public static final String URI_XXX_REGIONS_HOURLY_ANLY = "regions-hourly-anly";
+    public static final String URI_XXX_REGIONS_MNF_TM_GROUP = "regions-mnf-tm-group";
+    public static final String URI_XXX_DAY_FT_QOQ = "day-ft-qoq";
+    public static final String URI_XXX_REGIONS_DAILY_ANLY_TOTAL = "regions-daily-anly-total";
+    public static final String URI_XXX_DASHBOARD_ANLY_TOTAL = "dashboard-anly-total";
+    public static final String URI_XXX_DASHBOARD_ANLY_TOTAL_UNIT = "dashboard-anly-total-unit";
+    public static final String URI_XXX_AVG_MNF_MONTH_GROUP = "avg-mnf-month-group";
+    public static final String URI_XXX_MONTH_REPORT = "month-report";
+    public static final String URI_XXX_YEAR_REPORT = "year-report";
+    public static final String URI_XXX_REVISE_PREVIEW = "revise-preview";
+    public static final String URI_XXX_SITE_INFO_LIST_GROUP = "site-info-list-group";
+    public static final String URI_XXX_WARN_LIST = "warn-list";
+    public static final String URI_XXX_REPORT_FIELD_REGION = "regions-report-field";
+    public static final String URI_XXX_REGIONS_WATER_BALANCE_TOTAL = "regions-water-balance-total";
+    public static final String URI_XXX_REGIONS_PRESS_PASS_TOTAL = "regions-press-pass-total";
+    public static final String URI_XXX_REGIONS_MNF_BL_TOTAL = "regions-mnf-bl-total";
+    public static final String URI_XXX_WATER_RANK = "water-rank";
+    public static final String URI_XXX_TELEMETER_WATER_RANK = "telemeter-water-rank";
+    public static final String URI_XXX_WATER_RECORD = "water-record";
+    public static final String URI_XXX_REAL_MONITOR = "real-monitor";
+    public static final String URI_XXX_REGION_MONITOR = "region-monitor";
+
+    public static final String URI_MONITOR_XXX = "/monitor/**";
+    public static final String URI_MONITOR_PING = "/monitor/ping";
+
+    public static final String URI_ALL_BUSI_XXX = "/v3/stats/**";
+
+    public static final String URI_ZONE_MONITOR_H = "/v3/stats/zone-monitor";
+    public static final String URI_ZONE_MONITOR_XXX = URI_ZONE_MONITOR_H + "/**";
+
+    public static final String URI_DEV_DATA_H = "/v3/stats/dev-data";
+    public static final String URI_DEV_DATA_XXX = URI_DEV_DATA_H + "/**";
+
+    public static final String URI_SITE_DATA_H = "/v3/stats/site-data";
+    public static final String URI_SITE_DATA_XXX = URI_SITE_DATA_H + "/**";
+
+    public static final String URI_ZONE_MNF_H = "/v3/stats/zone-mnf";
+    public static final String URI_ZONE_MNF_XXX = URI_ZONE_MNF_H + "/**";
+
+    public static final String URI_ZONE_DATA_H = "/v3/stats/zone-data";
+    public static final String URI_ZONE_DATA_XXX = URI_ZONE_DATA_H + "/**";
+
+    public static final String URI_SITE_DEV_DATA_H = "/v3/stats/site-dev-data";
+    public static final String URI_SITE_DEV_DATA_XXX = URI_SITE_DEV_DATA_H + "/**";
+
+    public static final String URI_ZONE_SITE_DATA_H = "/v3/stats/zone-site-data";
+    public static final String URI_ZONE_SITE_DATA_XXX = URI_ZONE_SITE_DATA_H + "/**";
+
+    public static final String URI_GROUP_TRANS_DATA_H = "/v3/stats/group-trans-data";
+    public static final String URI_GROUP_TRANS_DATA_XXX = URI_GROUP_TRANS_DATA_H + "/**";
+
+    public static final String URI_REPORT_FORM_H = "/v3/stats/report-form";
+    public static final String URI_REPORT_FORM_XXX = URI_REPORT_FORM_H+"/**";
+
+    public static final String URI_INTERNAL_H = "/v3/stats/internal";
+    public static final String URI_INTERNAL_XXX = URI_INTERNAL_H+"/**";
+
+    public static final String URI_CUSTOMER_BIZ_H = "/v3/stats/customer-biz";
+    public static final String URI_CUSTOMER_BIZ_XXX = URI_CUSTOMER_BIZ_H + "/**";
+
+    public static final String URI_V2_HEAD_H = "/stats";
+    public static final String URI_V2_XXX = URI_V2_HEAD_H+"/**";
+
+    public static final String URI_ZONE_FOCUS_H = "/v3/stats/zone-focus";
+    public static final String URI_ZONE_FOCUS_XXX = URI_ZONE_FOCUS_H + "/**";
+}

+ 17 - 0
src/main/java/com/shkpr/service/warncore/constants/CommDefine.java

@@ -0,0 +1,17 @@
+package com.shkpr.service.warncore.constants;
+
+public interface CommDefine {
+    String REQ_OUTER = "Outer";//外来请求者
+    String INTERNAL_OPERATOR_ID = "FFFFFFFF";
+    String INTERNAL_OPERATOR_ROLE = "SelfOperator";
+    String INTERNAL_OPERATOR_ROLE_ID = "FFFFFFFF";
+    String ADMIN_USER_ID = "0";
+    String ADMIN_ROLE_ID = "0";
+    String ADMIN_ACCOUNT = "admin";
+    Double LIMIT_DEV_FP = -9999.0;
+    Double INIT_DEV_FP = 0.0;
+    int LIMIT_DEV_INT = -9999;
+    String INVALID_DEV_TYPE = "-1";
+    Double UP_DEV_PRESS = 9999.0;//流量上限阀值
+    int LIMIT_MAX = 2000;
+}

+ 22 - 0
src/main/java/com/shkpr/service/warncore/constants/DataTagDefine.java

@@ -0,0 +1,22 @@
+package com.shkpr.service.warncore.constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DataTagDefine {
+    final public static String INVALID = "-1";//非法数据
+    final public static String DEFAULT = "";   //默认数据
+    final public static String METER = "meter";//DMA计量数据
+    final public static String WATER = "water";//取水数据
+    final public static List<String> TAG_LIST;
+    static {
+        TAG_LIST = new ArrayList<>();
+        TAG_LIST.add(DEFAULT);
+        TAG_LIST.add(METER);
+        TAG_LIST.add(WATER);
+    }
+
+    final public static boolean isValidTag(String tag){
+        return (tag != null && (TAG_LIST.contains(tag) || "".equals(tag)));
+    }
+}

+ 35 - 0
src/main/java/com/shkpr/service/warncore/constants/GroupTagDefine.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.warncore.constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GroupTagDefine {
+    final public static String INVALID = "-1";
+    final public static String DEFAULT = "";
+    final public static String GW_XXX = "Gw_xxx";
+    final public static String FLOW = "Flow";
+    final public static String PRESS = "Press";
+    final public static String PRESS_PASS = "PressPass";
+    final public static String WATER_PUMP = "Water_pump";
+    final public static String FIRE_HYDRANT = "Fire_hydrant";
+    final public static String GW_FLOW_QOS = "Gw_flow_qos";
+    final public static String GW_3TH_MIX =  "Gw_3th_mix";
+    final public static String GW_FLOW_LEVEL = "Gw_flow_level";
+    final public static List<String> TAG_LIST;
+    static {
+        TAG_LIST = new ArrayList<>();
+        TAG_LIST.add(DEFAULT);
+        TAG_LIST.add(GW_XXX);
+        TAG_LIST.add(FLOW);
+        TAG_LIST.add(PRESS);
+        TAG_LIST.add(WATER_PUMP);
+        TAG_LIST.add(FIRE_HYDRANT);
+        TAG_LIST.add(GW_FLOW_QOS);
+        TAG_LIST.add(GW_3TH_MIX);
+        TAG_LIST.add(GW_FLOW_LEVEL);
+    }
+
+    final public static boolean isValidTag(String tag){
+        return (tag != null && (TAG_LIST.contains(tag) || "".equals(tag)));
+    }
+}

+ 71 - 0
src/main/java/com/shkpr/service/warncore/constants/LogFlagBusiType.java

@@ -0,0 +1,71 @@
+package com.shkpr.service.warncore.constants;
+
+public enum  LogFlagBusiType {
+    BUSI_INIT(0,"Init Busi"),
+    BUSI_CONN(1,"Conn Busi"),
+    BUSI_AUTH(2, "Auth Busi"),
+    BUSI_SUB(3, "Subscribe Busi"),
+    BUSI_NOTIFY(4, "Notify Busi"),
+    BUSI_CMD(5,"Command Busi"),
+    BUSI_USER(6,"User Busi"),
+    BUSI_PUSH_TASK(7,"Push Task Busi"),
+    BUSI_SMS(8,"SMS Busi"),
+    BUSI_CALL_BASE_AS(9, "Call Base As Busi"),
+    BUSI_CALL_SX_WARN_AS(10, "Call SX Warn As Biz"),
+
+    BUSI_ZONE_FOCUS_RULE_BIZ(85, "Zone Focus Rule Biz"),
+    BUSI_CUSTOMER_BIZ(86, "Customer Biz"),
+    BUSI_REPORT_FORM(87, "Report Form Biz"),
+    BUSI_GROUP_TRANS_DATA(88, "Group Trans Data Busi"),
+    BUSI_ZONE_SITE_DATA(89, "Zone Site Data Busi"),
+    BUSI_SITE_DEV_DATA(90, "Site Dev Data Busi"),
+    BUSI_ZONE_DATA(91, "Zone Data Busi"),
+    BUSI_ZONE_MNF_DATA(92, "Zone MNF Data Busi"),
+    BUSI_COMM_DATA(93, "Comm Data Busi"),
+    BUSI_SITE_DATA(94, "Site Data Busi"),
+    BUSI_DEV_DATA(95, "Dev Data Busi"),
+    BUSI_PARTITION(96, "Partition Info Busi"),
+    BUSI_DEV(97, "Device Info Busi"),
+    BUSI_ZONE_MONITOR_REAL_DATA(98, "Zone Monitor Reals Busi"),
+    BUSI_INTERNAL(99,"Internal Busi"),
+
+
+    BUSI_DB_USER(100,"DB User Busi"),
+    BUSI_DB_PUSH_TASK(101,"DB Push Task Busi"),
+    BUSI_DB_SMS(102,"DB SMS Busi"),
+    BUSI_DB_USER_OWN_ZONE(103,"DB User Own Zone Info"),
+    BUSI_DB_ROLE_POWER(104,"DB Role Power Info"),
+    BUSI_DB_PARTITION(105,"DB Partition Info"),
+    BUSI_DB_DEVICE_INFO(106,"DB Device Info"),
+    BUSI_DB_ZONE_MNF_DATA(107, "DB Zone MNF Data"),
+    BUSI_DB_ZONE_DAILY_ANLY_DATA(108, "DB Zone Daily Anly Data"),
+    BUSI_DB_SITE_DEV_DATA(109, "DB Site Dev Data Busi"),
+    BUSI_DB_ZONE_INFO(110, "DB Zone Info Busi"),
+    BUSI_DB_PRESS_DAILY_ANLY_INFO(111, "DB Press Daily Anly Busi"),
+    BUSI_DB_ZONE_WATER_BALANCE_INFO(112, "DB Zone Water Balance Busi"),
+    BUSI_DB_SITE_INFO(113, "DB Site Info Busi"),
+    BUSI_DB_ZONE_WATER_METER_READ_INFO(114, "DB Zone Water Meter Read Busi"),
+    BUSI_DB_ZONE_HOURLY_ANLY_DATA(115, "DB Zone Hourly Anly Data"),
+    BUSI_DB_WWS_DAILY_ANLY_DATA(116, "DB WWS Daily Anly Data"),
+    BUSI_DB_REPORT_FORM_TEMPLATE(117, "DB Data Report Template"),
+    BUSI_DB_REPORT_FORM_HISTORY(118, "DB Data Report History"),
+    BUSI_DB_AI_IOT_INPUT_DATA(119, "DB AI Iot Input Data"),
+    BUSI_DB_CUSTOMER_METER_READ(120, "DB Customer meter read"),
+    BUSI_DB_ZONE_FOCUS_RULE(121, "DB Zone Focus Rule Biz"),
+    BUSI_DB_LOCAL_DYNAMIC_BIZ(122, "DB Local Dynamic Biz"),
+
+    BUSI_INFLUX_DB_DEV_RECORD(200,"Influx DB Dev Record"),
+
+    BUSI_ALL(999,"ALL Busi"),
+    BUSI_REDIS(1000,"Redis Busi");
+
+    private LogFlagBusiType(int index, String name){
+        this.name = name;
+        this.index = index;
+    }
+    private String name;
+    private int index;
+    public int toIntValue(){return index;}
+    public String toStrValue() {return name;}
+}
+

+ 16 - 0
src/main/java/com/shkpr/service/warncore/constants/MsgNotifyDefine.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.warncore.constants;
+
+public interface MsgNotifyDefine {
+    public interface Topic{
+        String SITE = "site";
+        String DEV_TYPE = "devType";
+        String DEVICE = "device";
+    }
+    public interface Tag{
+        String THRESHOLD = "threshold";
+        String RANGE = "range";
+        String PARENT = "parent";
+        String REMOVE = "remove";
+        String TAGS = "tags";
+    }
+}

+ 7 - 0
src/main/java/com/shkpr/service/warncore/constants/MultiResHandleMode.java

@@ -0,0 +1,7 @@
+package com.shkpr.service.warncore.constants;
+
+public interface MultiResHandleMode {
+    int AVG = 0;   //平均值
+    int SUM = 1;   //累积和
+    int MULTI = 2; //乘积
+}

+ 21 - 0
src/main/java/com/shkpr/service/warncore/constants/ReportFormDefine.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.warncore.constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public interface ReportFormDefine {
+    List<String> PAGE_LIST = new ArrayList<String>(){{
+        add("footer");
+        add("header");
+        add("press");
+        add("material");
+        add("flow");
+        add("pump");
+        add("water");
+        add("power");
+        add("level");
+        add("quality");
+        add("function");
+        add("state");
+    }};
+}

+ 5 - 0
src/main/java/com/shkpr/service/warncore/constants/SiteDataType.java

@@ -0,0 +1,5 @@
+package com.shkpr.service.warncore.constants;
+
+public interface SiteDataType {
+    int THRESHOLD = 0;
+}

+ 6 - 0
src/main/java/com/shkpr/service/warncore/constants/SiteType.java

@@ -0,0 +1,6 @@
+package com.shkpr.service.warncore.constants;
+
+public interface SiteType {
+    String IN = "in";
+    String OUT = "out";
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/constants/SiteTypeReport.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.constants;
+
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SiteTypeReport {
+    final public static String WATER_PUMP = "Water_pump";
+    final public static String QUALITY = "Quality";
+    final public static String LEVEL = "Level";
+    final public static String PRESS = "Press";
+    final public static String FLOW = "Flow";
+    final public static List<String> TYPE_LIST;
+    static {
+        TYPE_LIST = new ArrayList<>();
+        TYPE_LIST.add(WATER_PUMP);
+        TYPE_LIST.add(QUALITY);
+        TYPE_LIST.add(LEVEL);
+        TYPE_LIST.add(PRESS);
+        TYPE_LIST.add(FLOW);
+    }
+
+    final public static boolean isValidType(String type){
+        return (!StringUtils.isEmpty(type) && TYPE_LIST.contains(type));
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/constants/TaskQueueDataTypeEx.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.constants;
+
+import com.global.base.taskqueue.TaskQueueDataType;
+
+public class TaskQueueDataTypeEx extends TaskQueueDataType {
+    public static final int ASYNC_TASK_BEGIN = 1000;
+    public static final int ASYNC_CALC_DEV_DATA_TASK = ASYNC_TASK_BEGIN+1;
+    public static final int ASYNC_TASK_END = 1010;
+
+    public static final int DELAY_TASK_BEGIN = 2000;
+    public static final int DELAY_CALC_DEV_DATA_TASK = DELAY_TASK_BEGIN+1;
+    public static final int DELAY_LAST_DEV_DATA_TASK = DELAY_CALC_DEV_DATA_TASK+1;
+    public static final int DELAY_MON_DEV_DATA_TASK = DELAY_LAST_DEV_DATA_TASK+1;
+    public static final int DELAY_TASK_END = 2010;
+
+    public static final int NOTIFY_MSG_BEGIN = 2020;
+    public static final int NOTIFY_MSG_FROM_BASE_SERVICE = NOTIFY_MSG_BEGIN+1;
+    public static final int NOTIFY_MSG_END = 2030;
+}

+ 37 - 0
src/main/java/com/shkpr/service/warncore/constants/UrlMethodType.java

@@ -0,0 +1,37 @@
+package com.shkpr.service.warncore.constants;
+
+import org.springframework.web.bind.annotation.RequestMethod;
+
+public enum UrlMethodType {
+    GET("GET", RequestMethod.GET),
+    HEAD("HEAD", RequestMethod.HEAD),
+    POST("POST", RequestMethod.POST),
+    PUT("PUT", RequestMethod.PUT),
+    PATCH("PATCH", RequestMethod.PATCH),
+    DELETE("DELETE", RequestMethod.DELETE),
+    OPTIONS("OPTIONS", RequestMethod.OPTIONS);
+
+    UrlMethodType(String name, RequestMethod method) {
+        this.name = name;
+        this.method = method;
+    };
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public RequestMethod getMethod() {
+        return method;
+    }
+
+    public void setMethod(RequestMethod method) {
+        this.method = method;
+    }
+
+    private String name;
+    private RequestMethod method;
+}

+ 17 - 0
src/main/java/com/shkpr/service/warncore/constants/UserCurStateType.java

@@ -0,0 +1,17 @@
+package com.shkpr.service.warncore.constants;
+
+public enum UserCurStateType {
+    STATE_REGISTER(0,"Registering"),
+    STATE_ENABLE(1,"Enable"),
+    STATE_DISABLE(2,"Disable"),
+    STATE_LOGOUT(3,"Logout");
+    private String name;
+    private int index;
+
+    private UserCurStateType(int index,String name) {
+        this.name = name;
+        this.index = index;
+    }
+    public int toIntValue(){return index;}
+    public String toStrValue() {return name;}
+}

+ 14 - 0
src/main/java/com/shkpr/service/warncore/constants/UserRoleType.java

@@ -0,0 +1,14 @@
+package com.shkpr.service.warncore.constants;
+
+public enum UserRoleType {
+    ADMIN(0, "Admin");
+    private String name;
+    private int index;
+
+    private UserRoleType(int index,String name) {
+        this.name = name;
+        this.index = index;
+    }
+    public int toIntValue(){return index;}
+    public String toStrValue() {return name;}
+}

+ 6 - 0
src/main/java/com/shkpr/service/warncore/constants/ZoneDataType.java

@@ -0,0 +1,6 @@
+package com.shkpr.service.warncore.constants;
+
+public interface ZoneDataType {
+    int LAST_REAL_DATA = 0; //最近实时数据
+    int LAST_MNF_LIST = 1; //最近的MNF列表
+}

+ 7 - 0
src/main/java/com/shkpr/service/warncore/constants/ZoneSubType.java

@@ -0,0 +1,7 @@
+package com.shkpr.service.warncore.constants;
+
+public interface ZoneSubType {
+    String DMA = "dma";
+    String B_USER = "b_user";
+    String V_DMA = "v_dma";
+}

+ 21 - 0
src/main/java/com/shkpr/service/warncore/constants/ZoneType.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.warncore.constants;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public interface ZoneType {
+    String ALL = "all";     //综合分区
+    String FLOW = "flow";
+    String PRESS = "press"; //压力分区
+    String STRUCT = "struct";
+    String WATER = "wws";   //水厂分区
+    String WC = "wc";   //公厕分区
+    String DISPATCH = "dispatch"; //调度分区
+    String SUPPLY2 = "supply2"; //二供
+
+    Set<String> WATER_DEFINES = new HashSet<String>(){{
+        add(WATER);
+        add(DISPATCH);
+        add(SUPPLY2);
+    }};
+}

+ 176 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/JWTControllerCheck.java

@@ -0,0 +1,176 @@
+package com.shkpr.service.warncore.controllercheck;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.warncore.commtools.CommTool;
+import com.shkpr.service.warncore.commtools.HttpTool;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.controllerfilter.TokenAuthenticationService;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.dto.ResponseCode;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validator;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 该类主要用来校验Controller的request头和request参数
+ */
+public class JWTControllerCheck {
+    protected Validator mValidator = null;//由于该类不是@Component或@Bean,所以无法对Validator msValidator使用@Autowired
+    protected Map<String, String> mMapURI2Method;
+    protected String mStrThisSampleName = null;
+    private AtomicInteger mTmpIndex = new AtomicInteger(0);
+    public JWTControllerCheck(Map<String, String> mapURI2Method){
+        this.mMapURI2Method = mapURI2Method;
+        this.mValidator = GlobalData.getInstance().getValidForParam();
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    public boolean checkRequest(HttpServletRequest request, HttpServletResponse response){
+        //解决跨域请求问题
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        response.setHeader("Access-Control-Allow-Methods", "*");
+        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Content-Type,Authorization");
+
+        if (!checkServerInternet(request, response))
+            return false;
+        if (!checkMaxConcurrentRequest(request, response))
+            return false;
+        if (!checkRequestHead(request, response))
+            return false;
+        if (!checkRequestParam(request, response))
+            return false;
+        if (!checkRequestBody(request, response))
+            return false;
+        return true;
+    }
+
+
+
+    protected boolean checkServerInternet(HttpServletRequest request, HttpServletResponse response){
+        /*if (!DataTransferMgr.getInstance().isConnected()){
+            response.setStatus(ResponseCode.STATUS_SERVER_NET_DISCONN_OR_BUSY.toInt());//服务器端网络异常
+            return false;
+        }*/
+        return true;
+    }
+
+    protected boolean checkMaxConcurrentRequest(HttpServletRequest request, HttpServletResponse response){
+        /*if (DataTransferMgr.getInstance().getLiveUnitClient() > GlobalData.getInstance().getMaxConcurrentRequest()){
+            response.setStatus(ResponseCode.STATUS_MAX_CONCURRENT_REQUEST_COUNT.toInt());//超过了最大并发请求数
+            return false;
+        }*/
+        return true;
+    }
+
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response){
+        boolean bResult = true;
+        if (mMapURI2Method == null)
+            return bResult;
+
+        String strOldMethod = mMapURI2Method.get(request.getRequestURI());
+        if (strOldMethod == null){
+            for (Map.Entry<String,String> entry:mMapURI2Method.entrySet()){
+                String uri = entry.getKey();
+                String method = entry.getValue();
+                if (CommTool.isTheThisFormatMatch(uri, request.getRequestURI())){
+                    strOldMethod = method;
+                    break;
+                }
+            }
+        }
+        if (strOldMethod != null){
+            String submitMehtod = request.getMethod();
+            submitMehtod = submitMehtod!=null ? submitMehtod.toLowerCase():"xxx";
+
+            if (submitMehtod.equalsIgnoreCase(strOldMethod)){
+                String strContentType = request.getHeader("Content-Type");
+                strContentType = strContentType!=null ? strContentType.toLowerCase():"xxx";
+                String strContent = request.getHeader("Content");                       //经测试发现ios只能设置Content
+                strContent = strContent!=null ? strContent.toLowerCase():"xxx";
+
+                String strAccept = request.getHeader("Accept");
+                strAccept = strAccept!=null ? strAccept.toLowerCase():"xxx";
+
+                String strCompare = TokenAuthenticationService.HEADER_CONTENT_TYPE;
+                strCompare = strCompare.toLowerCase();
+                String strShortCompare = TokenAuthenticationService.HEADER_SHORT_CONTENT_TYPE;
+                strShortCompare = strShortCompare.toLowerCase();
+
+                if (submitMehtod.equals("post")
+                        || submitMehtod.equals("delete")
+                        || submitMehtod.equals("put")){
+                    //boolean b = strAccept.contains(strCompare);
+                    if (!strContentType.contains(strCompare)
+                            && !strContentType.contains(strShortCompare)
+                            && !strContent.contains(strCompare)
+                            && !strContent.contains(strShortCompare)
+                            && !strAccept.contains(strCompare)
+                            && !strAccept.contains(strShortCompare)){
+                        HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_INVALID_CONTENT_TYPE);//POST/DELETE/PUT时Content-Type不对
+                        bResult = false;
+                    }
+                }else if (submitMehtod.equals("get")){
+                    /*String strAuthToken = request.getHeader("authortoken");
+                    String strUserAgent = request.getHeader(ApiURI.HEADER_USER_AGENT);
+                    if (!StringUtils.isEmpty(strAuthToken)
+                            || ("apk".equals(CommTool.getPlatformByAgent(strUserAgent)) && !strContentType.contains(strCompare))){
+                        HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_ACCESS_DENY);
+                        bResult = false;
+                    }*/
+                }
+
+                if (!bResult && mTmpIndex.incrementAndGet()%10==0){
+                    Map<String, String> mapHeads = new HashMap<String, String>();
+                    Enumeration<String> headerNames = request.getHeaderNames();
+                    while (headerNames.hasMoreElements()) {
+                        String key = (String)headerNames.nextElement();
+                        String value = "";
+                        Enumeration<String> headerValues = request.getHeaders(key);
+                        while (headerValues.hasMoreElements()){
+                            value = value + (String)headerValues.nextElement();
+                        }
+                        mapHeads.put(key, value);
+                    }
+
+                    String strAddress = HttpTool.getIpAddress(request);
+                    LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, LogFlagBusiType.BUSI_AUTH.toStrValue(), mStrThisSampleName, "Inner"
+                            , String.format("uri:{%s %s} remote_address:{%s} illegal request for printing... %s"
+                                    , submitMehtod
+                                    , request.getRequestURI()
+                                    , strAddress
+                                    , FastJsonUtil.toJSON(mapHeads)));
+                }
+            } else{
+                HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_ERROR_REQUEST_METHOD);//URI对应的Method不对
+                bResult = false;
+            }
+        } else{
+            HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_NOT_MATCHED_URI);//找不到对应的URI
+            bResult = false;
+        }
+        return bResult;
+    }
+
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response){ return true; }
+
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response){
+        return true;
+    }
+
+    public <T> boolean checkObjectByValidator(T object, Class<?>... classForObject){
+        if (mValidator != null){
+            Set<ConstraintViolation<T>> constraintViolations = mValidator.validate(object, classForObject);
+            if (!(constraintViolations == null || constraintViolations.size() <= 0))
+                return false;
+        }
+        return true;
+    }
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/ThirdCustomerBizControllerCheck.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.controllercheck;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+public class ThirdCustomerBizControllerCheck extends JWTControllerCheck {
+    public ThirdCustomerBizControllerCheck(Map<String, String> mapURI2Method) {
+        super(mapURI2Method);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    @Override
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestHead(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestParam(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestBody(request, response);
+    }
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/ThirdInternalControllerCheck.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.controllercheck;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+public class ThirdInternalControllerCheck extends JWTControllerCheck {
+    public ThirdInternalControllerCheck(Map<String, String> mapURI2Method) {
+        super(mapURI2Method);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    @Override
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestHead(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestParam(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestBody(request, response);
+    }
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/ThirdSiteDataControllerCheck.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.controllercheck;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+public class ThirdSiteDataControllerCheck extends JWTControllerCheck {
+    public ThirdSiteDataControllerCheck(Map<String, String> mapURI2Method) {
+        super(mapURI2Method);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    @Override
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestHead(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestParam(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestBody(request, response);
+    }
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/ThirdZoneDataControllerCheck.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.controllercheck;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+public class ThirdZoneDataControllerCheck extends JWTControllerCheck {
+    public ThirdZoneDataControllerCheck(Map<String, String> mapURI2Method) {
+        super(mapURI2Method);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    @Override
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestHead(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestParam(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestBody(request, response);
+    }
+}

+ 28 - 0
src/main/java/com/shkpr/service/warncore/controllercheck/ThirdZoneFocusControllerCheck.java

@@ -0,0 +1,28 @@
+package com.shkpr.service.warncore.controllercheck;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+public class ThirdZoneFocusControllerCheck extends JWTControllerCheck {
+    public ThirdZoneFocusControllerCheck(Map<String, String> mapURI2Method) {
+        super(mapURI2Method);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    @Override
+    protected boolean checkRequestHead(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestHead(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestParam(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestParam(request, response);
+    }
+
+    @Override
+    protected boolean checkRequestBody(HttpServletRequest request, HttpServletResponse response) {
+        return super.checkRequestBody(request, response);
+    }
+}
+

+ 25 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/CustomAuthenticationProvider.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.controllerfilter;
+
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+
+public class CustomAuthenticationProvider implements AuthenticationProvider {
+    protected String mStrThisSampleName = null;
+
+    public CustomAuthenticationProvider() {
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    //在JWTLoginFilter::attemptAuthentication()之后执行
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        return null;
+    }
+
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return aClass.equals(UsernamePasswordAuthenticationToken.class);
+    }
+}

+ 88 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/GrantedAuthorityImpl.java

@@ -0,0 +1,88 @@
+package com.shkpr.service.warncore.controllerfilter;
+
+import com.shkpr.service.warncore.dto.LoginUserRoleType;
+import org.springframework.security.core.GrantedAuthority;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GrantedAuthorityImpl implements GrantedAuthority{
+    private static volatile List<GrantedAuthorityImpl> msArrRootAdmin = null;
+    private static volatile List<GrantedAuthorityImpl> msArrAdmin = null;
+    private static volatile List<GrantedAuthorityImpl> msArrNormalUser = null;
+    private static volatile List<GrantedAuthorityImpl> msArrTempUser = null;
+
+    private String authority;
+    public GrantedAuthorityImpl(String authority) {
+        this.authority = authority;
+    }
+    public void setAuthority(String authority) {
+        this.authority = authority;
+    }
+    @Override
+    public String getAuthority() {
+        return this.authority;
+    }
+
+    public static List<GrantedAuthorityImpl> generateAuthority(LoginUserRoleType emType){
+        switch (emType){
+            case ROOT_ADMIN:{
+                if (msArrRootAdmin == null){
+                    synchronized(GrantedAuthorityImpl.class){
+                        if (msArrRootAdmin == null){
+                            msArrRootAdmin = new ArrayList<GrantedAuthorityImpl>();
+                            msArrRootAdmin.add(new GrantedAuthorityImpl(emType.toStrValue()));
+                        }
+                    }
+                }
+            }
+            return msArrRootAdmin;
+            case TEMP_USER:{
+                if (msArrTempUser == null){
+                    synchronized(GrantedAuthorityImpl.class){
+                        if (msArrTempUser == null){
+                            msArrTempUser = new ArrayList<GrantedAuthorityImpl>();
+                            msArrTempUser.add(new GrantedAuthorityImpl(emType.toStrValue()));
+                        }
+                    }
+                }
+            }
+            return msArrTempUser;
+            case NORMAL_USER:{
+                if (msArrNormalUser == null){
+                    synchronized(GrantedAuthorityImpl.class){
+                        if (msArrNormalUser == null){
+                            msArrNormalUser = new ArrayList<GrantedAuthorityImpl>();
+                            msArrNormalUser.add(new GrantedAuthorityImpl(emType.toStrValue()));
+                        }
+                    }
+                }
+            }
+            return msArrNormalUser;
+            case ADMIN:{
+                if (msArrAdmin == null){
+                    synchronized(GrantedAuthorityImpl.class){
+                        if (msArrAdmin == null){
+                            msArrAdmin = new ArrayList<GrantedAuthorityImpl>();
+                            msArrAdmin.add(new GrantedAuthorityImpl(emType.toStrValue()));
+                        }
+                    }
+                }
+            }
+            return msArrAdmin;
+            default:
+                break;
+        }
+        return null;
+    }
+
+    public static LoginUserRoleType getRoleTypeByAuthority(List<GrantedAuthorityImpl> authorityList){
+        if (authorityList == msArrRootAdmin)
+            return LoginUserRoleType.ROOT_ADMIN;
+        else if (authorityList == msArrAdmin)
+            return LoginUserRoleType.ADMIN;
+        else if (authorityList == msArrNormalUser)
+            return LoginUserRoleType.NORMAL_USER;
+        else
+            return LoginUserRoleType.TEMP_USER;
+    }
+}

+ 132 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/JWTAuthenticationFilter.java

@@ -0,0 +1,132 @@
+package com.shkpr.service.warncore.controllerfilter;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.commtools.HttpTool;
+import com.shkpr.service.warncore.constants.CommDefine;
+import com.shkpr.service.warncore.constants.LogFlagBusiType;
+import com.shkpr.service.warncore.controllercheck.JWTControllerCheck;
+import com.shkpr.service.warncore.exception.SelfAuthFilterException;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.dto.ResponseCode;
+import org.springframework.security.authentication.*;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Token过滤器,检验所有请求的Token是否合法
+ * 从http头的Authorization 项读取token数据,然后校验token的合法性
+ * 如果校验通过,就认为这是一个取得授权的合法请求
+ */
+public class JWTAuthenticationFilter extends BasicAuthenticationFilter {
+    private RequestMatcher mRequestMatcher = null;
+    protected String mStrThisSampleName = null;
+    protected JWTControllerCheck mControllerCheck = null;
+
+    public JWTAuthenticationFilter(AuthenticationManager authenticationManager){
+        super(authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+    }
+
+    public JWTAuthenticationFilter(String url, AuthenticationManager authenticationManager){
+        super(authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        if (url != null && !url.isEmpty())
+            this.mRequestMatcher = new AntPathRequestMatcher(url);
+    }
+
+    public void setControllerCheck(JWTControllerCheck mControllerCheck) {
+        this.mControllerCheck = mControllerCheck;
+    }
+
+    public boolean skipAuth(){
+        return false;
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        if (this.mRequestMatcher != null && !this.mRequestMatcher.matches(request)){//当前URI没有匹配成功,向后传递继续匹配
+            chain.doFilter(request, response);
+            return;
+        }
+
+        if (mControllerCheck != null && !mControllerCheck.checkRequest(request, response))  //当前URI已匹配成功,但Request请求格式不对,不再向后传递
+            return;
+
+        if (skipAuth()){
+            SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(CommDefine.INTERNAL_OPERATOR_ID,
+                    null,
+                    new ArrayList<GrantedAuthorityImpl>()));                                     //不设置setAuthentication(authentication)将默认返回405
+            chain.doFilter(request, response);                                                   //不验证token直接向后传递
+            return;
+        }
+        /*if (GlobalData.getInstance().isForDevPressureTest()
+                && ThirdJWTDevicesAuthFilter.class.getSimpleName().equals(mStrThisSampleName)){
+            chain.doFilter(request, response);                                                   //不验证token直接向后传递
+            return;
+        }*/
+
+        int nStatusCode = HttpServletResponse.SC_OK;
+        Authentication authentication = null;
+        try {
+            authentication = TokenAuthenticationService.getAuthentication(request);
+            if (authentication != null)
+                SecurityContextHolder.getContext().setAuthentication(authentication); //不设置setAuthentication(authentication)将默认返回403,得不到正确结果
+        }
+        /* !!! 注:SecurityContextHolder.getContext().getAuthentication() == null时response.setStatus(xxx)无效,response.status总为403 !!! */
+        catch (BadCredentialsException e){
+            //无Token或者非法的Token
+            nStatusCode = ResponseCode.STATUS_INVALID_TOKEN.toInt();
+            HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_INVALID_TOKEN);
+            //System.out.println(e.getMessage());
+        }catch (CredentialsExpiredException e){
+            //非法Token,或已过期
+            nStatusCode = ResponseCode.STATUS_EXPIRED_TOKEN.toInt();
+            HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_EXPIRED_TOKEN);
+            //System.out.println(e.getMessage());
+        }catch (AccountExpiredException e){
+            //还未注册过,需要注册
+            nStatusCode = ResponseCode.STATUS_NOT_LOGGED_IN.toInt();
+            HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_NOT_LOGGED_IN);
+            //System.out.println(e.getMessage());
+        }catch (SelfAuthFilterException e){
+            nStatusCode = e.getErrorCode();
+            HttpTool.handlerHttpErrorStatus(response, e.getErrorCode(), e.getMessage());
+            //System.out.println(e.getMessage());
+        }catch (Exception e){
+            //其他错误
+            nStatusCode = ResponseCode.STATUS_ACCESS_DENY.toInt();
+            HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_ACCESS_DENY);
+            //System.out.println(e.getMessage());
+        }
+
+        if (authentication == null){
+            //SecurityContextHolder.getContext().setAuthentication(null);           //Token不合法时需要设置setAuthentication(null),不然response仍然返回200并且携带数据结果
+                                                                                   //解决bug:最近一次验证成功过,如此次未验证成功且不设置setAuthentication(null)的话,response.status仍然为200且会携带数据结果
+            if (GlobalData.getInstance().isHttpStatusAlready200()){
+                if (nStatusCode == HttpServletResponse.SC_OK)
+                    HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_ACCESS_DENY);
+            }else{
+                if (response.getStatus() == HttpServletResponse.SC_OK)
+                    HttpTool.handlerHttpErrorStatus(response, ResponseCode.STATUS_ACCESS_DENY);
+            }
+
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, LogFlagBusiType.BUSI_AUTH.toStrValue(), "JWTAuthenticationFilter"
+                    , String.format("Auth Failed Uri{%s} Remote{%s:%d}"
+                            ,request.getRequestURI()
+                            ,request.getRemoteAddr()
+                            ,request.getRemotePort()));
+            return; //当前URI已匹配成功但未验证成功,不再向后传递
+        }
+        chain.doFilter(request, response);  //当前URI已匹配成功且已验证成功,向后传递,filter链路执行完毕后,进入自己的拦截器
+    }
+}

+ 383 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/TokenAuthenticationService.java

@@ -0,0 +1,383 @@
+package com.shkpr.service.warncore.controllerfilter;
+
+import com.global.base.tools.CastUtil;
+import com.shkpr.service.warncore.constants.ApiURI;
+import com.shkpr.service.warncore.constants.CommDefine;
+import com.shkpr.service.warncore.exception.SelfAuthFilterException;
+import com.shkpr.service.warncore.globalcache.GlobalData;
+import com.shkpr.service.warncore.globalcache.UserCacheProxy;
+import com.shkpr.service.warncore.dto.AuthTokenData;
+import com.shkpr.service.warncore.dto.ResponseCode;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.CredentialsExpiredException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TokenAuthenticationService {
+    public static final int MIN_EXPIRATIONTIME = 7*60*24;                              // 默认Token过期时间为7天(单位:分钟)
+    public static final long MS_EXPIRATIONTIME = MIN_EXPIRATIONTIME*60*1000;         // 默认Token过期时间为7天(单位:毫秒)
+    public static final String SECRET = "TRICP_ALAM_DMA";                              // JWT密码
+    public static final String HEADER_STRING = "Authorization";                       // 存放Token的Header Key
+    public static final String HEADER_CONTENT_TYPE = "application/json;charset=UTF-8";
+    public static final String HEADER_SHORT_CONTENT_TYPE = "application/json";
+    public static final String HEADER_USERID = "UUID";
+    public static final String HEADER_ROLEID = "RLID";
+    public static final boolean bRoleIsStr = true;
+    //该方法使用HS256算法生成signKey
+    /*private static Key getKeyInstance() {
+        //We will sign our JavaWebToken with our ApiKey secret
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
+        return new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
+    }*/
+
+    /**
+     * 从数据声明中生成令牌
+     * @param claims
+     * @return
+     */
+    public static AuthTokenData generateToken(Map<String, Object> claims){
+        return generateToken(claims, MIN_EXPIRATIONTIME);
+    }
+
+    /**
+     * 从数据声明中生成令牌
+     * @param expired Token过期时间(单位:分钟)
+     * @return
+     */
+    public static AuthTokenData generateToken(Map<String, Object> claims, int expired){
+        long nowMillis   = System.currentTimeMillis();
+        Date dateExpired  = null;
+        String strFlagKey = null;
+        String strToken = null;
+        try {
+            strToken = Jwts.builder()
+                    .setClaims(claims)
+                    .setIssuedAt(new Date(nowMillis))                                         //设置Token的签发时间
+                    .setExpiration(dateExpired = new Date(nowMillis + expired*60*1000))       //设置Token有效期
+                    .signWith(SignatureAlgorithm.HS256, SECRET.getBytes("UTF-8"))          //签名设置
+                    .compact();
+            try {
+                strFlagKey = (String)claims.get("flagkey");
+            } catch (Exception e){}
+        } catch (Exception e){
+            strToken = null;
+            e.printStackTrace();
+        }
+
+        return  StringUtils.isEmpty(strToken) ? null:new AuthTokenData(strToken
+                , dateExpired!=null ? dateExpired.getTime():System.currentTimeMillis()
+                , nowMillis
+                , strFlagKey);
+    }
+
+    /**
+     * @param strFlagKey
+     * @param expired Token过期时间(单位:分钟)
+     * @return
+     */
+    public static AuthTokenData generateToken(String strFlagKey, String strAccount, String roleId, int expired){
+        Map<String, Object> claims = new HashMap<>(16);
+        //claims.put("sub", strUsername);
+        claims.put("flagkey", strFlagKey);
+        claims.put("account", strAccount);
+        claims.put("roleid", bRoleIsStr?roleId:CastUtil.castInt(roleId));
+        return generateToken(claims, expired);
+    }
+
+    /**
+     * 从令牌中获取数据声明
+     * 使用该接口需要同时捕获ExpiredJwtException和Exception异常并处理
+     * @param token 令牌
+     * @return 数据声明
+     */
+    private static Claims getClaimsFromToken(String token) throws ExpiredJwtException, Exception{
+        Claims claims = null;
+        try {
+            claims = Jwts.parser().setSigningKey(SECRET.getBytes("UTF-8")).parseClaimsJws(token).getBody();
+        }catch (ExpiredJwtException e){
+            claims = null;
+            throw e;
+        }catch (Exception e) {
+            claims = null;
+            throw e;
+        }
+        return claims;
+    }
+
+    /**
+     * 从令牌中获取FlagKey
+     * @param token
+     * @return
+     * @throws ExpiredJwtException
+     * @throws Exception
+     */
+    public static String getFlagKeyFromToken(String token) throws ExpiredJwtException, Exception{
+        String strKey = null;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            if (claims != null)
+                strKey = (String)claims.get("flagkey");
+        }catch (ExpiredJwtException e){
+            strKey = null;
+            throw e;
+        }catch (Exception e) {
+            strKey = null;
+            throw e;
+        }
+        return strKey;
+    }
+
+    public static AuthTokenData getAuthDataFromToken(String token) throws ExpiredJwtException, Exception{
+        AuthTokenData data = null;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            if (claims != null){
+                String strKey = (String)claims.get("flagkey");
+                String nRoleId = bRoleIsStr?(String)claims.get("roleid"):String.valueOf((int)claims.get("roleid"));
+                data = new AuthTokenData(token, claims.getExpiration().getTime(), claims.getIssuedAt().getTime(), strKey, nRoleId);
+            }
+        }catch (ExpiredJwtException e){
+            data = null;
+            throw e;
+        }catch (Exception e) {
+            data = null;
+            throw e;
+        }
+        return data;
+    }
+
+    /**
+     * 从令牌中获取用户ID
+     *
+     * @param token 令牌
+     * @return 用户ID
+     */
+    public static String getUserIDFromToken(String token) throws ExpiredJwtException, Exception{
+        String strKey = null;
+        try {
+            strKey = getFlagKeyFromToken(token);
+        }catch (Exception e) {
+            strKey = null;
+            throw e;
+        }
+        int nIndex = (strKey != null) ? strKey.indexOf(":"):-1;
+        if (nIndex >= 0)
+            strKey = strKey.substring(nIndex+1);
+        return strKey;
+    }
+
+    /**
+     * 从令牌中获取权限角色
+     * @param token
+     * @return
+     */
+    /*public static String getStrAuthorityFromToken(String token) throws ExpiredJwtException, Exception{
+        String strAuthority = null;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            if (claims != null)
+                strAuthority = (String)claims.get("authorities");
+        } catch (ExpiredJwtException e){
+            strAuthority = null;
+            throw e;
+        } catch (Exception e) {
+            strAuthority = null;
+            throw e;
+        }
+        return strAuthority;
+    }*/
+
+    /**
+     * 判断令牌是否过期
+     *
+     * @param token 令牌
+     * @return 是否过期
+     */
+    public static Boolean isTokenExpired(String token){
+        try {
+            Claims claims = getClaimsFromToken(token);
+            if (claims != null){
+                Date expiration = claims.getExpiration();
+                return expiration.before(new Date());
+            }
+        } catch (ExpiredJwtException e){
+            return true;
+        } catch (Exception e) {
+            return true;
+        }
+        return true;
+    }
+
+    /**
+     * 判断令牌是否过期
+     *
+     * @return 是否过期
+     */
+    public static Boolean isTokenExpired(long lExpired){
+        return lExpired <= new Date().getTime();
+    }
+
+    /**
+     * 刷新令牌
+     * @param token 原令牌
+     * @param nExpired Token过期时间(单位:分钟)
+     * @return
+     */
+    public static AuthTokenData refreshToken(String token, int nExpired) throws ExpiredJwtException, Exception{
+        AuthTokenData tokenData = null;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            if (claims != null){
+                tokenData = generateToken(claims, nExpired);
+            }
+        } catch (ExpiredJwtException e){
+            tokenData = null;
+            throw e;
+        } catch (Exception e) {
+            tokenData = null;
+            throw e;
+        }
+        return tokenData;
+    }
+
+    /**
+     * 验证令牌
+     *
+     * @param token 令牌
+     * @return 是否有效
+     */
+    public static Boolean validateToken(String token) {
+        return !isTokenExpired(token);
+    }
+
+    public static Authentication getAuthentication(HttpServletRequest request) throws Exception{
+        final String strAuthVerify = request.getHeader(ApiURI.HEADER_AUTH_VERIFY);
+        if (GlobalData.getInstance().getInternalCallPassword().equalsIgnoreCase(strAuthVerify)){
+            try {
+                request.setAttribute(HEADER_USERID, CommDefine.INTERNAL_OPERATOR_ID);
+                request.setAttribute(HEADER_ROLEID, CommDefine.INTERNAL_OPERATOR_ROLE_ID);
+            }catch (Exception e){}
+
+            return new UsernamePasswordAuthenticationToken(CommDefine.INTERNAL_OPERATOR_ID,
+                    null,
+                    new ArrayList<GrantedAuthorityImpl>());
+        }
+
+        // 从Header中拿到token
+        String strUri = request.getRequestURI();
+        String authHeader = request.getHeader(HEADER_STRING);
+        if (authHeader != null && authHeader.length() > 0 /*&& authHeader.startsWith(TOKEN_PREFIX)*/){
+            String authToken = authHeader/*authHeader.substring(TOKEN_PREFIX.length())*/;
+            AuthTokenData authData = null;
+            try {
+                authData = getAuthDataFromToken(authToken);
+            } catch (ExpiredJwtException e){
+                throw new CredentialsExpiredException("Invalidate token, token is expired.");
+            } catch (Exception e){
+                throw new BadCredentialsException("Invalidate Token, has no user.");
+            }
+
+            boolean bEasy = true;
+            if (bEasy && authData != null){
+                long lTimeLogout = UserCacheProxy.getInstance().getLogoutAccountTime(authData.getStrFlagKey());
+                if (lTimeLogout == -1){//此账号未被注销过
+                    if (isTokenExpired(authData.getExpired()))
+                        throw new CredentialsExpiredException("Invalidate token, token is expired.");
+                }else {
+                    //此账号被注销过,判断token的签发时间和注销时间
+                    if (authData.getIssueAt() <= lTimeLogout)        //签发时间早于注销时间
+                        throw new BadCredentialsException("Invalidate Token, has no user.");
+                    else if (isTokenExpired(authData.getExpired())) //签发时间晚于注销时间,但已过期
+                        throw new CredentialsExpiredException("Invalidate token, token is expired.");
+                }
+
+                /*LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_AUTH.toStrValue(), TokenAuthenticationService.class.getSimpleName()
+                        , String.format("%s User(%s) Remote{%s:%d}"
+                                ,request.getRequestURI()
+                                ,authData.getStrFlagKey()
+                                ,request.getRemoteAddr()
+                                ,request.getRemotePort()));*/
+
+                try {
+                    request.setAttribute(HEADER_USERID, authData.getStrFlagKey());
+                    request.setAttribute(HEADER_ROLEID, authData.getRoleid());
+                }catch (Exception e){}
+
+                return new UsernamePasswordAuthenticationToken(authData.getStrFlagKey(),
+                        null,
+                        new ArrayList<GrantedAuthorityImpl>());
+            }else{
+                /*JwtLoginUserEx oUser = null;
+                try {
+                    strFlagKey = getFlagKeyFromToken(authToken);
+                    oUser = UserCacheProxy.getInstance().getJwtUser(strFlagKey);
+                } catch (ExpiredJwtException e){
+                    throw new CredentialsExpiredException("Invalidate token, token is expired.");
+                } catch (Exception e){
+                    throw new BadCredentialsException("Invalidate Token, has no user.");
+                }
+
+                if (oUser == null){
+                    throw new AccountExpiredException("Current user has not login.");
+                }
+
+                if (GlobalData.getInstance().isTokenMustUnique()
+                        && oUser.getTokenData().getStrToken() != null
+                        && !oUser.getTokenData().getStrToken().equals(authToken)){
+                    throw new SelfAuthFilterException(ResponseCode.STATUS_TOO_OLD_TOKEN.toInt(), ResponseCode.STATUS_TOO_OLD_TOKEN.toStrMsg());
+                }
+
+                if (isTokenExpired(oUser.getTokenData().getExpired())){
+                    throw new CredentialsExpiredException("Invalidate token, token is expired.");
+                }
+
+                if (oUser.getAuthToken() == null){                                                     // 用户的AuthToken必须在登录的时候进行设置,不登录的用户直接使用Token默认为不合法
+                    throw new AccountExpiredException("Current user has not login.");
+                }
+
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_AUTH.toStrValue(), TokenAuthenticationService.class.getSimpleName()
+                        , String.format("%s %s Remote{%s:%d}"
+                                ,request.getRequestURI()
+                                ,oUser.toString()
+                                ,request.getRemoteAddr()
+                                ,request.getRemotePort()));
+                return oUser.getAuthToken();
+                */
+                throw new BadCredentialsException("Invalidate Token, has no user.");
+            }
+        }else {
+            throw new SelfAuthFilterException(ResponseCode.STATUS_EMPTY_TOKEN.toInt(), ResponseCode.STATUS_EMPTY_TOKEN.toStrMsg());
+        }
+    }
+
+    /**
+     * Token 中的userid是否为给定的userid
+     * @param strAuthToken
+     * @param strUserId
+     * @return
+     */
+    public static boolean isTheSelfUser(String strAuthToken, String strUserId){
+        if (StringUtils.isEmpty(strUserId))
+            return false;
+
+        String strFlagKey = null;
+        try {
+            strFlagKey = TokenAuthenticationService.getFlagKeyFromToken(strAuthToken);
+        }catch (Exception e){
+            return false;
+        }
+        return strUserId.equals(strFlagKey);
+    }
+}

+ 60 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTBusiFilterMgr.java

@@ -0,0 +1,60 @@
+package com.shkpr.service.warncore.controllerfilter.third;
+
+import com.shkpr.service.warncore.constants.ApiURI;
+import com.shkpr.service.warncore.controllerfilter.JWTAuthenticationFilter;
+import com.shkpr.service.warncore.globalmgr.TraceLogMgr;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class ThirdJWTBusiFilterMgr extends JWTAuthenticationFilter {
+    private RequestMatcher mRequestMatcherForSiteData = null;
+
+    private ThirdJWTSiteDataFilter mFilterForSiteData = null;
+
+    public ThirdJWTBusiFilterMgr(AuthenticationManager authenticationManager)
+    {
+        this(null, authenticationManager);
+    }
+
+    public ThirdJWTBusiFilterMgr(String url, AuthenticationManager authenticationManager) {
+        super(url,  authenticationManager);
+        this.mStrThisSampleName  = this.getClass().getSimpleName();
+
+        mRequestMatcherForSiteData = new AntPathRequestMatcher(ApiURI.URI_SITE_DATA_XXX);
+
+        mFilterForSiteData = new ThirdJWTSiteDataFilter(ApiURI.URI_SITE_DATA_XXX, authenticationManager);
+        setControllerCheck(null);
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        //System.out.println(this.mStrThisSampleName+"::doFilterInternal()..."+request.getContextPath()+" " + request.getRequestURI());
+        try {
+            if (mRequestMatcherForSiteData != null && mRequestMatcherForSiteData.matches(request)){
+                TraceLogMgr.setTraceIdByBusinessType("SITE.DATA");
+                mFilterForSiteData.doFilterInternal(request, response, chain);
+            } else {
+                //TraceLogMgr.setTraceIdByBusinessType("OTH");
+                //System.out.println(mStrThisSampleName+"::doFilterInternal not matches()...");
+                //response.setStatus(ResponseCode.STATUS_NOT_MATCHED_URI.toInt());
+                //如果response.setStatus()设置成非200值后,将在下一个filter的checkHandle()函数中直接return false,
+                //这样request无法继续向后传递,始终无法得到执行
+                chain.doFilter(request, response); //当前URI没有匹配成功,向后传递继续匹配
+                //return;
+            }
+        }catch (ServletException e1){
+            throw e1;
+        }catch (IOException e2){
+            throw e2;
+        }finally {
+            TraceLogMgr.removeTraceId();
+        }
+    }
+}

+ 45 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTInternalFilter.java

@@ -0,0 +1,45 @@
+package com.shkpr.service.warncore.controllerfilter.third;
+
+import com.shkpr.service.warncore.constants.ApiURI;
+import com.shkpr.service.warncore.controllercheck.ThirdInternalControllerCheck;
+import com.shkpr.service.warncore.controllerfilter.JWTAuthenticationFilter;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ThirdJWTInternalFilter extends JWTAuthenticationFilter {
+    private RequestMatcher mRequestMatcher = null;
+    private ThirdInternalControllerCheck mControllerCheck = null;
+    private static final Map<String, String> msMapURI2Method;
+    static {
+        msMapURI2Method = new HashMap<String, String>();
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_INTERNAL_H, ApiURI.URI_XXX_NOTIFY), "POST");
+    }
+
+    public ThirdJWTInternalFilter(AuthenticationManager authenticationManager) {
+        super(authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdInternalControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    public ThirdJWTInternalFilter(String url, AuthenticationManager authenticationManager) {
+        super(url, authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdInternalControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    @Override
+    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        //System.out.println(this.mStrThisSampleName+"::doFilterInternal()...");
+        super.doFilterInternal(request, response, chain);
+    }
+}

+ 52 - 0
src/main/java/com/shkpr/service/warncore/controllerfilter/third/ThirdJWTSiteDataFilter.java

@@ -0,0 +1,52 @@
+package com.shkpr.service.warncore.controllerfilter.third;
+
+import com.shkpr.service.warncore.constants.ApiURI;
+import com.shkpr.service.warncore.controllercheck.ThirdSiteDataControllerCheck;
+import com.shkpr.service.warncore.controllerfilter.JWTAuthenticationFilter;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ThirdJWTSiteDataFilter extends JWTAuthenticationFilter {
+    private RequestMatcher mRequestMatcher = null;
+    private ThirdSiteDataControllerCheck mControllerCheck = null;
+    private static final Map<String, String> msMapURI2Method;
+    static {
+        msMapURI2Method = new HashMap<String, String>();
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_LAST_MAP_SHOW_GROUP), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_REAL_FT), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_REGIONS), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_REGIONS_GROUP), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_REGIONS_PRESS_PASS), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_MONTH_REPORT), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_YEAR_REPORT), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_SITE_DATA_H, ApiURI.URI_XXX_REPORT_FIELD_REGION), "POST");
+    }
+
+    public ThirdJWTSiteDataFilter(AuthenticationManager authenticationManager) {
+        super(authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdSiteDataControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    public ThirdJWTSiteDataFilter(String url, AuthenticationManager authenticationManager) {
+        super(url, authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdSiteDataControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    @Override
+    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        //System.out.println(this.mStrThisSampleName+"::doFilterInternal()...");
+        super.doFilterInternal(request, response, chain);
+    }
+}

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidList.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidList {
+}

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidNew.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidNew {
+}

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidQE.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidQE {
+}

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidReset.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidReset {
+}

+ 4 - 0
src/main/java/com/shkpr/service/warncore/controllervalid/CommonParamValidSK.java

@@ -0,0 +1,4 @@
+package com.shkpr.service.warncore.controllervalid;
+
+public interface CommonParamValidSK {
+}

+ 78 - 0
src/main/java/com/shkpr/service/warncore/dto/AuthTokenData.java

@@ -0,0 +1,78 @@
+package com.shkpr.service.warncore.dto;
+import com.global.base.tools.FastJsonUtil;
+import java.util.HashMap;
+
+public class AuthTokenData {
+    private String mStrToken = "";     //Token字符串
+    private long mLExpired = 0L;      //Token过期时间,单位:毫秒
+    private long mLIssue = 0L;        //Token签发时间,单位:毫秒
+    private String mStrFlagKey = "";  //用户id
+    private String roleid = "";
+
+    public AuthTokenData() {
+    }
+
+    public AuthTokenData(String mStrToken, long mLExpired, String mStrFlagKey) {
+        this.mStrToken = mStrToken;
+        this.mLExpired = mLExpired;
+        this.mStrFlagKey = mStrFlagKey;
+    }
+
+    public AuthTokenData(String mStrToken, long mLExpired, long mLIssue, String mStrFlagKey) {
+        this.mStrToken = mStrToken;
+        this.mLExpired = mLExpired;
+        this.mLIssue = mLIssue;
+        this.mStrFlagKey = mStrFlagKey;
+    }
+
+    public AuthTokenData(String mStrToken, long mLExpired, long mLIssue, String mStrFlagKey, String roleid) {
+        this.mStrToken = mStrToken;
+        this.mLExpired = mLExpired;
+        this.mLIssue = mLIssue;
+        this.mStrFlagKey = mStrFlagKey;
+        this.roleid = roleid;
+    }
+
+    public long getIssueAt() {
+        return mLIssue;
+    }
+
+    public void setIssueAt(long mLIssue) {
+        this.mLIssue = mLIssue;
+    }
+
+    public String getStrToken() {
+        return mStrToken;
+    }
+
+    public void setStrToken(String mStrToken) {
+        this.mStrToken = mStrToken;
+    }
+
+    public long getExpired() {
+        return mLExpired;
+    }
+
+    public void setExpired(long mLExpired) {
+        this.mLExpired = mLExpired;
+    }
+
+    public String getStrFlagKey() {
+        return mStrFlagKey;
+    }
+
+    public void setStrFlagKey(String mStrFlagKey) {
+        this.mStrFlagKey = mStrFlagKey;
+    }
+
+    public String getRoleid() { return roleid; }
+
+    public void setRoleid(String roleid) { this.roleid = roleid; }
+
+    public String toTokenJsonStr(){
+        HashMap<String, Object> mapObj = new HashMap<>(16);
+        mapObj.put("token", mStrToken);
+        mapObj.put("expired", mLExpired);
+        return FastJsonUtil.toJSON(mapObj);
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/dto/CommDVBean.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommDVBean {
+    private String date = "";
+    private String value = "";
+
+    public CommDVBean() {
+    }
+
+    public CommDVBean(String date, String value) {
+        this.date = date;
+        this.value = value;
+    }
+}

+ 29 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKNVUBean.java

@@ -0,0 +1,29 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommKNVUBean {
+    private String key = "";
+    private String name = "";
+    private String type = "";
+    private String unit = "";
+    private String value = "";
+    private String linker = "";
+
+    public CommKNVUBean() {
+    }
+
+    public CommKNVUBean(CommKNVUBean source) {
+        if (source == null)
+            return;
+        key = source.getKey();
+        name = source.getName();
+        type = source.getType();
+        unit = source.getUnit();
+        value = source.getValue();
+        linker = source.getLinker();
+    }
+}

+ 34 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKVBean.java

@@ -0,0 +1,34 @@
+package com.shkpr.service.warncore.dto;
+
+public class CommKVBean<T> {
+    protected String key = "";
+    protected T value = null;
+
+    public CommKVBean() {
+    }
+
+    public CommKVBean(T value) {
+        this.value = value;
+    }
+
+    public CommKVBean(String key, T value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public T getValue() {
+        return value;
+    }
+
+    public void setValue(T value) {
+        this.value = value;
+    }
+}

+ 7 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKVFBean.java

@@ -0,0 +1,7 @@
+package com.shkpr.service.warncore.dto;
+
+public class CommKVFBean extends CommKVBean<Float> {
+    public CommKVFBean() {
+        super();
+    }
+}

+ 11 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKVSBean.java

@@ -0,0 +1,11 @@
+package com.shkpr.service.warncore.dto;
+
+public class CommKVSBean extends CommKVBean<String> {
+    public CommKVSBean() {
+        super("");
+    }
+
+    public CommKVSBean(String key, String value) {
+        super(key, value);
+    }
+}

+ 34 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKVSTDBean.java

@@ -0,0 +1,34 @@
+package com.shkpr.service.warncore.dto;
+
+public class CommKVSTDBean extends CommKVSBean {
+    private long time = 0L;
+    private int mixed = 0;//1--聚合数据;0--单条非聚合数据
+    public CommKVSTDBean() {
+        super();
+    }
+
+    public CommKVSTDBean(String key, String value) {
+        super(key, value);
+    }
+
+    public CommKVSTDBean(String key, String value, long time) {
+        super(key, value);
+        this.time = time;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public int getMixed() {
+        return mixed;
+    }
+
+    public void setMixed(int mixed) {
+        this.mixed = mixed;
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/warncore/dto/CommKVSUDBean.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.warncore.dto;
+
+public class CommKVSUDBean extends CommKVSBean {
+    private int upDown = -2;
+    public CommKVSUDBean() {
+        super();
+    }
+
+    public CommKVSUDBean(String key, String value) {
+        super(key, value);
+    }
+
+    public CommKVSUDBean(String key, String value, int upDown) {
+        super(key, value);
+        this.upDown = upDown;
+    }
+
+    public int getUpDown() {
+        return upDown;
+    }
+
+    public void setUpDown(int upDown) {
+        this.upDown = upDown;
+    }
+}

+ 20 - 0
src/main/java/com/shkpr/service/warncore/dto/CommPageRecord.java

@@ -0,0 +1,20 @@
+package com.shkpr.service.warncore.dto;
+
+import java.util.ArrayList;
+
+public class CommPageRecord <T> extends TRecordRes<T>{
+    public CommPageRecord() {
+        super();
+    }
+
+    public CommPageRecord(int code) {
+        super(code);
+    }
+
+    @Override
+    public void checkRes() {
+        if (data == null)
+            data = new ArrayList<>();
+        //total = CommTool.listSize(data); don't do this when by page, because total is sum of all page
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/dto/CommTVBean.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommTVBean {
+    private long time = 0L;
+    private String value = "";
+
+    public CommTVBean() {
+    }
+
+    public CommTVBean(long time, String value) {
+        this.time = time;
+        this.value = value;
+    }
+}

+ 14 - 0
src/main/java/com/shkpr/service/warncore/dto/CommTotalRecords.java

@@ -0,0 +1,14 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommTotalRecords {
+    private String uid = "";
+    private int records = 0;
+
+    public CommTotalRecords() {
+    }
+}

+ 29 - 0
src/main/java/com/shkpr/service/warncore/dto/CommUNGBean.java

@@ -0,0 +1,29 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommUNGBean {
+    private String uid = "";
+    private String name = "";
+    private String gis = "";
+    private String alias = "";//显示别名
+
+    public CommUNGBean() {
+    }
+
+    public CommUNGBean(String uid, String name, String gis) {
+        this.uid = uid;
+        this.name = name;
+        this.gis = gis;
+    }
+
+    public CommUNGBean(String uid, String name, String gis, String alias) {
+        this.uid = uid;
+        this.name = name;
+        this.gis = gis;
+        this.alias = alias;
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/warncore/dto/CommUPPBean.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+public class CommUPPBean {
+    private String uid = "";
+    private List<CommKVBean> data = null;
+
+    public CommUPPBean(String uid) {
+        this.uid = uid;
+        this.data = new ArrayList<>();
+    }
+}

+ 23 - 0
src/main/java/com/shkpr/service/warncore/dto/CommUVSBean.java

@@ -0,0 +1,23 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommUVSBean {
+    private String uid = "";
+    private String value = "";//显示别名
+
+    public CommUVSBean() {
+    }
+
+    public CommUVSBean(String uid) {
+        this.uid = uid;
+    }
+
+    public CommUVSBean(String uid, String value) {
+        this.uid = uid;
+        this.value = value;
+    }
+}

+ 41 - 0
src/main/java/com/shkpr/service/warncore/dto/LoginUserRoleType.java

@@ -0,0 +1,41 @@
+package com.shkpr.service.warncore.dto;
+
+public enum LoginUserRoleType {
+    ROOT_ADMIN(1,"ROOT_ADMIN"), //root管理员在系统发布时内置且密码不能更改,且不能删、改自己,不能增加同类型的用户
+    ADMIN(2,"ADMIN"),
+    NORMAL_USER(3,"NORMAL_USER"),
+    TEMP_USER(4, "TEMP_USER");
+
+    private LoginUserRoleType(int index, String name) {
+        this.name = name;
+        this.index = index;
+    }
+    private String name;
+    private int index;
+    public int toIntValue(){return index;}
+    public String toStrValue() {return name;}
+
+    @Override
+    public String toString() {
+        return "LoginUserRoleType{" +
+                "name='" + name + '\'' +
+                ", index=" + index +
+                '}';
+    }
+
+    public static LoginUserRoleType valueFromInt(int nRole){
+        switch (nRole){
+            case 1:
+                return ROOT_ADMIN;
+            case 2:
+                return ADMIN;
+            case 3:
+                return NORMAL_USER;
+            case 4:
+                return TEMP_USER;
+            default:
+                break;
+        }
+        return TEMP_USER;
+    }
+}

+ 31 - 0
src/main/java/com/shkpr/service/warncore/dto/MsgNotifyBean.java

@@ -0,0 +1,31 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.util.StringUtils;
+
+@Getter
+@Setter
+public class MsgNotifyBean {
+    private String topic = "";
+    private String tag = "";
+    private String uid = "";
+    private String data = "";
+
+    public MsgNotifyBean() {
+    }
+
+    public boolean checkValid(){
+        return !StringUtils.isEmpty(topic) && !StringUtils.isEmpty(tag);
+    }
+
+    @Override
+    public String toString() {
+        return "{" +
+                "topic='" + topic + '\'' +
+                ", tag='" + tag + '\'' +
+                ", uid='" + uid + '\'' +
+                ", data='" + data + '\'' +
+                '}';
+    }
+}

+ 31 - 0
src/main/java/com/shkpr/service/warncore/dto/PartDataBean.java

@@ -0,0 +1,31 @@
+package com.shkpr.service.warncore.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Setter
+@Getter
+public class PartDataBean {
+    private String id = ""; //设备/站点/分区 id
+    private int total = 0; //条目数
+    private List<Map<String, Object>> records = null; //数据记录
+
+    public PartDataBean() {
+    }
+
+    public PartDataBean(String id, int total, List<Map<String, Object>> records) {
+        this.id = id;
+        this.total = total;
+        this.records = records;
+    }
+
+    public void checkForRes(){
+        if (records == null)
+            records = new ArrayList<>();
+        total = records.size();
+    }
+}

+ 27 - 0
src/main/java/com/shkpr/service/warncore/dto/ResDataBean.java

@@ -0,0 +1,27 @@
+package com.shkpr.service.warncore.dto;
+
+import java.util.ArrayList;
+
+public class ResDataBean<T> {
+    protected int total = 0;
+    protected ArrayList<T> data = null;
+
+    public ResDataBean() {
+    }
+
+    public ArrayList<T> getData() {
+        return data;
+    }
+
+    public void setData(ArrayList<T> data) {
+        this.data = data;
+    }
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+}

+ 111 - 0
src/main/java/com/shkpr/service/warncore/dto/ResponseCode.java

@@ -0,0 +1,111 @@
+package com.shkpr.service.warncore.dto;
+
+/**
+ * RESULT_开头的为响应体中的结果码rescode
+ * STATUS_开头的为HTTP Status响应码
+ */
+public enum ResponseCode {
+    RESULT_NORMAL(0, "Normal result."),
+    RESULT_BAD(1, "Bad result,see the message/data for reason."),
+
+    STATUS_SUCCESS(200, "Success"),
+    STATUS_BAD_REQUEST(600, "Bad Request,see the message/data for reason."),
+    STATUS_ACCESS_DENY(603, "Access denied."),
+    STATUS_NOT_FOUND_URI(604, "No mapping found for HTTP request with URI."),
+    STATUS_METHOD_NOT_ALLOWED(605, "Method Not Allowed."),
+    STATUS_HTTP_TYPE_NOT_ACCEPTABLE(606, "Http media type not acceptable."),
+    STATUS_HTTP_TYPE_NOT_SUPPORTED(615, "Http media type not supported."),
+    STATUS_INTERNAL_SERVER_ERROR(700, "Internal Server Error."),
+    STATUS_SERVER_RUN_ERROR(1000,"The server is abnormal."),
+    STATUS_NULL_POINT_EXCEPTION(1001, "Empty param or param is null."),
+    STATUS_ERROR_DATA_TYPE(1002, "The data type is wrong."),
+    STATUS_IO_EXCEPTION(1003, "IO exception."),
+    STATUS_NO_SUCH_METHOD(1004, "No such method."),
+    STATUS_INDEX_OUT_OF_BOUNDS(1005, "Index out of bounds."),
+    STATUS_ERROR_JSON_FORMAT(1006, "Error JSON data format."),
+    STATUS_NOT_POST_REQUEST(1007, "Not post request."),
+    STATUS_NOT_DELETE_REQUEST(1008, "Not delete request."),
+    STATUS_ERROR_PARAM_FORMAT(1009, "Error parameter format."),
+    STATUS_INVALID_CONTENT_TYPE(1010, "Error Content-Type."),
+    STATUS_NOT_MATCHED_URI(1011, "No mapping found for HTTP request with URI."),
+    STATUS_ERROR_REQUEST_METHOD(1012, "Error request method."),
+    STATUS_NO_USER_ACCOUNT(1013, "No such user or has not login."),
+    STATUS_SERVER_NET_DISCONN_OR_BUSY(1014, "The network of server is down or busy. Please try again later."),
+    STATUS_MAX_CONCURRENT_REQUEST_COUNT(1015, "Exceeded the maximum number of concurrent requests. Please try again later."),
+    STATUS_INVALID_HEADER(1016, "Invalid headers, please check the headers of request."),
+
+    STATUS_EMPTY_TOKEN(2000,"Empty token."),
+    STATUS_INVALID_TOKEN(2001, "Invalidate Token, please re-login."),
+    STATUS_EXPIRED_TOKEN(2002, "Expired Token, please re-login."),
+    STATUS_NOT_LOGGED_IN(2003, "Not logged in."),
+    STATUS_DENY_OPERATE_USER(2004, "No permission to operate."),
+    STATUS_TOO_OLD_TOKEN(2005, "The token is too old, please use your new token."),
+
+    RESULT_ERROR_SIGN(3000, "Illegal signature"),
+    RESULT_REPEAT_SEQUENCE(3001, "Repeat the request, please check the request sequence number."),
+    RESULT_REQUEST_TIMEOUT(3002, "Request timed out."),
+    RESULT_INVALID_ORDER(3003, "The order number is inconsistent."),//错误或不合法的订单号
+
+    RESULT_CONSUME_UNKNOWN_DEVICE(4000, "Unrecognized device."),
+    RESULT_CONSUME_DEVICE_UNUSABLE(4001, "The device unusable."),
+    RESULT_CONSUME_NO_RATE_UNUSABLE(4002, "Can not consume because of no consume rate"),
+    RESULT_CONSUME_BALANCE_NOT_ENOUGH(4003,"The balance is not enough for consume."),
+    RESULT_CONSUME_OPERATE_FAILED_IN_DB(4004, "Consume business operate failed in database"),
+
+    RESULT_OPERATOR_NOT_FOUND(5000, "No such operator."),
+    RESULT_OPERATOR_UNUSABLE(5001, "The operator unusable."),
+    RESULT_PROJECT_NOT_FOUND(5002, "No such project."),
+    RESULT_PROJECT_UNUSABLE(5003, "The project unusable."),
+
+    RESULT_CHARGE_ALIPAY_INIT_ERROR(6000, "Ali payment initialization error."),
+    RESULT_CHARGE_WXPAY_INIT_ERROR(6001, "WeiXin payment initialization error."),
+    RESULT_CHARGE_PAY_TYPE_NOT_SUPPORT(6002, "This payment type is not supported at this time."),
+    RESULT_CHARGE_OPERATE_FAILED_IN_DB(6003, "Charge business operate failed in database"),
+
+    RESULT_SMS_INIT_ERROR(7000,"Sms server init failed."),
+    RESULT_SMS_ERROR_PARAM_FORMAT(7001,"Error sms parameter format."),
+    RESULT_SMS_INVALID_VCODE(7002,"Invalidate verify code."),
+    RESULT_SMS_EXPIRED_VCODE(7003,"Expired verify code."),
+    RESULT_SMS_REQUEST_MAX_TIMES(7004, "Verify code requests has reached the maximum."),
+
+    RESULT_USER_ALREADY_REG(8000, "This phone is already registered."),
+    RESULT_DENY_FOR_SAME_PASS(8001, "Two passwords cannot be the same."),
+    RESULT_REFRESH_TOKEN_FAILED(8002, "Refresh token failed, please login again."),
+    RESULT_TOKEN_INVALID_SIGN(8003, "Refresh token failed, invalid signature"),
+    RESULT_INVALID_USER_INFO(8004, "User information verification failed."),
+    RESULT_EXISTS_USER_NAME(8005, "Username already exists."),
+    RESULT_USER_NOT_REG(8006, "This phone is not registered."),
+    RESULT_INNER_JS_SERVER_AUTH_FAILED(8007, "Inner js service verify failed."),
+
+    RESULT_SERVER_NET_DISCONN_OR_BUSY(9000, "The network of server is down or busy. Please try again later."),
+
+    RESULT_INVALID_PUSH_TASK(9100, "The push task is inconsistent."),
+    RESULT_PUSH_TASK_CLOSE(9101, "The push task will be closed."),
+    RESULT_PUSH_TASK_RETRY(9102, "The push task will be next push in the queue."),
+    RESULT_PUSH_FAILED_ERROR_RECEIVER(9103, "Push task failed because of error receiver."),
+    RESULT_PUSH_FAILED_ERROR_OTHERS(9104, "Push task failed because of other errors."),
+    RESULT_PUSH_FAILED_NO_WAY(9105, "Push task failed because of no support the push way."),
+
+    BUSINESS_DB_ERROR(65530,"DB Service Error, please try again."),
+    BUSINESS_API_ABOLISH(65531,"The Api has been abolished."),
+    BUSINESS_BUSY(65532,"Business is busy, please try again."),
+    SERVICE_OFFLINE(65533, "Service offline, please turn off offline mode"),
+    STATUS_UNKNOWN(65534,"Unknown reason,see the message/data for reason."),
+    RESULT_UNKNOWN(65535,"Unknown reason,see the message/data for reason.");
+
+    private String name;
+    private int index;
+    private ResponseCode(int indexC, String strN){
+        index = indexC;
+        name = strN;
+    }
+
+    public int toInt() {return index;}
+    public String toStrCode() {return String.valueOf(index);}
+    public String toStrMsg() {return name;}
+
+    @Override
+    public String toString() {
+        return "StatusCode: " + index + " Message: " + name;
+    }
+}

+ 61 - 0
src/main/java/com/shkpr/service/warncore/dto/ResponseRes.java

@@ -0,0 +1,61 @@
+package com.shkpr.service.warncore.dto;
+
+public class ResponseRes<T> {
+    private long timestamp;
+    private String rescode;
+    private String resmsg;//message;
+    private T resdata;//data;
+
+    public ResponseRes() {
+    }
+
+    public ResponseRes(long timestamp, String rescode, String resmsg, T resdata) {
+        this.timestamp = timestamp;
+        this.rescode = rescode;
+        this.resmsg = resmsg;
+        this.resdata = resdata;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getRescode() {
+        return rescode;
+    }
+
+    public void setRescode(String rescode) {
+        this.rescode = rescode;
+    }
+
+    public String getResmsg() {
+        return resmsg;
+    }
+
+    public void setResmsg(String resmsg) {
+        this.resmsg = resmsg;
+    }
+
+    public T getResdata() {
+        return resdata;
+    }
+
+    public void setResdata(T resdata) {
+        this.resdata = resdata;
+    }
+
+    @Override
+    public String toString() {
+        return "ResponseRes{" +
+                "timestamp=" + timestamp +
+                ", rescode='" + rescode + '\'' +
+                ", resmsg='" + resmsg + '\'' +
+                ", resdata=" + resdata +
+                '}';
+    }
+}
+

+ 82 - 0
src/main/java/com/shkpr/service/warncore/dto/RolePowerBean.java

@@ -0,0 +1,82 @@
+package com.shkpr.service.warncore.dto;
+
+import com.global.base.tools.FastJsonUtil;
+import com.google.gson.Gson;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Setter
+public class RolePowerBean {
+    public static final String DMA_ZONE = "dma";
+    public static final String HIGH_ZONE = "high";
+    public static final String OWN_ZONE = "own";
+    private int roleid = -1;
+    private String stype = "";
+    private String appid = "";
+    private String resource = "";
+    private List<String> dmaZone = null;
+    private List<String> highZone = null;
+
+    public RolePowerBean() {
+    }
+
+    public String toJsonStr(){
+        return FastJsonUtil.toJSON(this);
+    }
+
+    private static void parseZone(RolePowerBean oBean){
+        if (oBean != null){
+            String strTmp = oBean.getResource();
+            if (!StringUtils.isEmpty(strTmp)){
+                try {
+                    strTmp = strTmp.substring(1, strTmp.length()-1);
+                    int nFind1 = strTmp.indexOf("]");
+                    String strLeft = strTmp.substring(0,nFind1+1);
+                    String strRight = strTmp.substring(nFind1+2);
+                    oBean.dmaZone = new Gson().fromJson(strLeft, ArrayList.class);
+                    oBean.highZone = new Gson().fromJson(strRight, ArrayList.class);
+                }catch (Exception e){}
+            }
+        }
+    }
+
+    public static RolePowerBean fromJson(String jsonAll){
+        RolePowerBean oBean = null;
+        if (!StringUtils.isEmpty(jsonAll) && !"NULL".equals(jsonAll)){
+            try {
+                oBean = new Gson().fromJson(jsonAll, RolePowerBean.class);
+            }catch (Exception e){}
+            parseZone(oBean);
+        }
+        return oBean;
+    }
+
+    public static RolePowerBean fromJson(final Map<String, Object> mapKeyValue){
+        RolePowerBean oBean = null;
+        if (mapKeyValue != null && mapKeyValue.size() > 0){
+            try {
+                oBean = new Gson().fromJson(FastJsonUtil.toJSON(mapKeyValue), RolePowerBean.class);
+            }catch (Exception e){}
+            parseZone(oBean);
+        }
+        return oBean;
+    }
+
+    public static List<RolePowerBean> batchFromJson(final List<Map<String, Object>> arrMapKeyValue){
+        List<RolePowerBean> arrRes = new ArrayList<>();
+        if (arrMapKeyValue != null && arrMapKeyValue.size() > 0){
+            for (Map<String, Object> mapObj: arrMapKeyValue) {
+                RolePowerBean oBean = fromJson(mapObj);
+                if (oBean != null)
+                    arrRes.add(oBean);
+            }
+        }
+        return arrRes;
+    }
+}

+ 35 - 0
src/main/java/com/shkpr/service/warncore/dto/TObjectRes.java

@@ -0,0 +1,35 @@
+package com.shkpr.service.warncore.dto;
+
+public class TObjectRes <T> {
+    protected int code = 0;              //0:表示操作成功;1:表示操作失败
+    protected T data = null;
+
+    public TObjectRes() {
+    }
+
+    public TObjectRes(int code) {
+        this.code = code;
+    }
+
+    public TObjectRes(int code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}
+

+ 41 - 0
src/main/java/com/shkpr/service/warncore/dto/TObjectResEx.java

@@ -0,0 +1,41 @@
+package com.shkpr.service.warncore.dto;
+
+public class TObjectResEx <T> {
+    protected int code = 0;              //0:表示操作成功;1:表示操作失败
+    protected T data = null;
+    protected String source = "";
+
+    public TObjectResEx() {
+    }
+
+    public TObjectResEx(int code) {
+        this.code = code;
+    }
+
+    public TObjectResEx(int code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String getSource() { return source; }
+
+    public void setSource(String source) { this.source = source; }
+}
+
+

+ 53 - 0
src/main/java/com/shkpr/service/warncore/dto/TRecordRes.java

@@ -0,0 +1,53 @@
+package com.shkpr.service.warncore.dto;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.warncore.commtools.CommTool;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Setter
+public class TRecordRes<T> {
+    protected int code = 0;              //0:表示操作成功;1:表示操作失败
+    protected int total = 0;            //指定条件内总共有多少条记录
+    protected List<T> data = null;
+
+    public TRecordRes(int code) {
+        this.code = code;
+    }
+
+    public TRecordRes() {
+    }
+
+    public List<T> getData() {
+        return data;
+    }
+
+    public void setData(List<T> data) {
+        this.data = data;
+    }
+
+    public void clearData(){
+        if (data != null)
+            data.clear();
+        data = null;
+    }
+
+    public void checkRes(){
+        if (data == null)
+            data = new ArrayList<>();
+        total = CommTool.listSize(data);
+    }
+
+    public String genRespondJson(){
+        Map<String, Object> mapRes = new HashMap<>();
+        mapRes.put("total", CommTool.listSize(data));
+        mapRes.put("data", data==null?new ArrayList<>():data);
+        return FastJsonUtil.toJSON(mapRes);
+    }
+}

+ 30 - 0
src/main/java/com/shkpr/service/warncore/dto/TraceCallable.java

@@ -0,0 +1,30 @@
+package com.shkpr.service.warncore.dto;
+
+import com.shkpr.service.warncore.globalmgr.TraceLogMgr;
+
+import java.util.concurrent.Callable;
+
+public abstract class TraceCallable<V> implements Callable<V> {
+
+    private String strTraceId = "";
+
+    public TraceCallable(String traceId) { this.strTraceId = traceId; }
+
+    private void prePost(){ TraceLogMgr.setTraceId(strTraceId); }
+
+    private void afterPost(){ TraceLogMgr.removeTraceId(); }
+
+    public abstract V function() throws Exception;
+
+    @Override
+    final public V call() throws Exception {
+        prePost();
+        try {
+            return function();
+        }catch (Exception ex){
+            throw ex;
+        }finally {
+            afterPost();
+        }
+    }
+}

+ 22 - 0
src/main/java/com/shkpr/service/warncore/dto/TraceRunnable.java

@@ -0,0 +1,22 @@
+package com.shkpr.service.warncore.dto;
+
+import com.shkpr.service.warncore.globalmgr.TraceLogMgr;
+
+public abstract class TraceRunnable implements Runnable {
+    private String strTraceId = "";
+
+    public TraceRunnable(String traceId) { this.strTraceId = traceId; }
+
+    private void prePost(){ TraceLogMgr.setTraceId(strTraceId); }
+
+    protected void afterPost(){ TraceLogMgr.removeTraceId(); }
+
+    public abstract void function();
+
+    @Override
+    final public void run() {
+        prePost();
+        function();
+        afterPost();
+    }
+}

+ 20 - 0
src/main/java/com/shkpr/service/warncore/dto/TraceRunnableSignal.java

@@ -0,0 +1,20 @@
+package com.shkpr.service.warncore.dto;
+
+import java.util.concurrent.CountDownLatch;
+
+public abstract class TraceRunnableSignal extends TraceRunnable{
+    private CountDownLatch signal = null;
+
+    public TraceRunnableSignal(String traceId, CountDownLatch signal) {
+        super(traceId);
+        this.signal = signal;
+    }
+
+    @Override
+    protected void afterPost() {
+        super.afterPost();
+        if (this.signal != null)
+            this.signal.countDown();
+        this.signal = null;
+    }
+}

+ 165 - 0
src/main/java/com/shkpr/service/warncore/exception/GlobalSelfExceptionHandler.java

@@ -0,0 +1,165 @@
+package com.shkpr.service.warncore.exception;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.warncore.dto.ResponseCode;
+import com.shkpr.service.warncore.dto.ResponseRes;
+import org.apache.catalina.connector.ClientAbortException;
+import org.springframework.beans.ConversionNotSupportedException;
+import org.springframework.beans.TypeMismatchException;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.HttpMediaTypeNotAcceptableException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * Controller的全局异常捕获类
+ * 前置异常增强(在Controller的方法调用之前若有异常进行捕获),处理结果以JSON的形式返回给客服端
+ * 异常增强类型:NullPointerException,RunTimeException,ClassCastException,
+          NoSuchMethodException,IOException,IndexOutOfBoundsException
+          以及springmvc自定义异常等,如下:
+ SpringMVC自定义异常对应的status code
+ Exception                       HTTP Status Code
+ ConversionNotSupportedException         500 (Internal Server Error)
+ HttpMessageNotWritableException         500 (Internal Server Error)
+ HttpMediaTypeNotSupportedException      415 (Unsupported Media Type)
+ HttpMediaTypeNotAcceptableException     406 (Not Acceptable)
+ HttpRequestMethodNotSupportedException  405 (Method Not Allowed)
+ NoSuchRequestHandlingMethodException    404 (Not Found)
+ TypeMismatchException                   400 (Bad Request)
+ HttpMessageNotReadableException         400 (Bad Request)
+ MissingServletRequestParameterException 400 (Bad Request)
+ *
+ */
+@ControllerAdvice
+@Component
+public class GlobalSelfExceptionHandler {
+
+    public static ResponseRes<String> createResParam(String strCode, String strMsg){
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setTimestamp(System.currentTimeMillis());
+        resResult.setRescode(strCode);
+        resResult.setResmsg(strMsg);
+        resResult.setResdata("");
+        return resResult;
+    }
+
+    public static ResponseRes<String> createResParam(String strCode, String strMsg, String strData){
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setTimestamp(System.currentTimeMillis());
+        resResult.setRescode(strCode);
+        resResult.setResmsg(strMsg);
+        resResult.setResdata((strData==null)?"":strData);
+        return resResult;
+    }
+
+    //自定义异常
+    @ExceptionHandler(value = SelfException.class)
+    @ResponseBody
+    public ResponseRes<String> jsonErrorHandler(HttpServletRequest req, SelfException ex) throws Exception{
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN
+                ,"Self Exception"
+                , "GlobalSelfExceptionHandler"
+                , String.format("url:{%s}, code(%s):{%s}", req.getRequestURI(), ex.getStrErrorCode(), ex.getMessage()));
+        return createResParam(ex.getStrErrorCode(), ex.getMessage(), ex.getStrErrorData());
+    }
+
+    //运行时异常
+    @ExceptionHandler(RuntimeException.class)
+    @ResponseBody
+    public ResponseRes<String> runtimeExceptionHandler(RuntimeException runtimeException) {
+        LogPrintMgr.getInstance().printExceptionObject(LogLevelFlag.LOG_ERROR, runtimeException);
+        return createResParam(ResponseCode.STATUS_SERVER_RUN_ERROR.toStrCode(), ResponseCode.STATUS_SERVER_RUN_ERROR.toStrMsg());
+    }
+
+    //空指针异常
+    @ExceptionHandler(NullPointerException.class)
+    @ResponseBody
+    public ResponseRes<String> nullPointerExceptionHandler(NullPointerException ex) {
+        LogPrintMgr.getInstance().printExceptionObject(LogLevelFlag.LOG_ERROR, ex);
+        return createResParam(ResponseCode.STATUS_NULL_POINT_EXCEPTION.toStrCode(), ResponseCode.STATUS_NULL_POINT_EXCEPTION.toStrMsg());
+    }
+
+    //类型转换异常
+    @ExceptionHandler(ClassCastException.class)
+    @ResponseBody
+    public ResponseRes<String> classCastExceptionHandler(ClassCastException ex) {
+        LogPrintMgr.getInstance().printExceptionObject(LogLevelFlag.LOG_ERROR, ex);
+        return createResParam(ResponseCode.STATUS_ERROR_DATA_TYPE.toStrCode(), ResponseCode.STATUS_ERROR_DATA_TYPE.toStrMsg());
+    }
+
+    //IO异常
+    @ExceptionHandler({IOException.class, ClientAbortException.class})
+    @ResponseBody
+    public ResponseRes<String> iOExceptionHandler() {
+        return createResParam(ResponseCode.STATUS_IO_EXCEPTION.toStrCode(), ResponseCode.STATUS_IO_EXCEPTION.toStrMsg());
+    }
+
+    //未知方法异常
+    @ExceptionHandler(NoSuchMethodException.class)
+    @ResponseBody
+    public ResponseRes<String> noSuchMethodExceptionHandler(NoSuchMethodException ex) {
+        return createResParam(ResponseCode.STATUS_NO_SUCH_METHOD.toStrCode(), ResponseCode.STATUS_NO_SUCH_METHOD.toStrMsg());
+    }
+
+    //数组越界异常
+    @ExceptionHandler(IndexOutOfBoundsException.class)
+    @ResponseBody
+    public ResponseRes<String> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {
+        LogPrintMgr.getInstance().printExceptionObject(LogLevelFlag.LOG_ERROR, ex);
+        return createResParam(ResponseCode.STATUS_INDEX_OUT_OF_BOUNDS.toStrCode(), ResponseCode.STATUS_INDEX_OUT_OF_BOUNDS.toStrMsg());
+    }
+
+    //400错误
+    @ExceptionHandler({HttpMessageNotReadableException.class})
+    @ResponseBody
+    public ResponseRes<String> requestNotReadable(HttpMessageNotReadableException ex){
+        return createResParam(ResponseCode.STATUS_BAD_REQUEST.toStrCode(), "Request not readable, please check [URI or Param].");
+    }
+
+    //400错误
+    @ExceptionHandler({TypeMismatchException.class})
+    @ResponseBody
+    public ResponseRes<String> requestTypeMismatch(TypeMismatchException ex){
+        return createResParam(ResponseCode.STATUS_BAD_REQUEST.toStrCode(), "Type mismatch exception, please check [URI or Param].");
+    }
+
+    //400错误
+    @ExceptionHandler({MissingServletRequestParameterException.class})
+    @ResponseBody
+    public ResponseRes<String> requestMissingServletRequest(MissingServletRequestParameterException ex){
+        return createResParam(ResponseCode.STATUS_BAD_REQUEST.toStrCode(), "Missing servlet request, please check [URI or Param].");
+    }
+
+    //405错误
+    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
+    @ResponseBody
+    public ResponseRes<String> request405(){
+        return createResParam(ResponseCode.STATUS_METHOD_NOT_ALLOWED.toStrCode()
+                , ResponseCode.STATUS_METHOD_NOT_ALLOWED.toStrMsg());
+    }
+
+    //406错误
+    @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
+    @ResponseBody
+    public ResponseRes<String> request406(){
+        return createResParam(ResponseCode.STATUS_HTTP_TYPE_NOT_ACCEPTABLE.toStrCode()
+                , ResponseCode.STATUS_HTTP_TYPE_NOT_ACCEPTABLE.toStrMsg() + "Please check [URI or Param].");
+    }
+
+    //500错误
+    @ExceptionHandler({ConversionNotSupportedException.class,HttpMessageNotWritableException.class})
+    @ResponseBody
+    public ResponseRes<String> server500(RuntimeException runtimeException){
+        return createResParam(ResponseCode.STATUS_HTTP_TYPE_NOT_ACCEPTABLE.toStrCode()
+                , ResponseCode.STATUS_HTTP_TYPE_NOT_ACCEPTABLE.toStrMsg() + "Please check [URI or Param].");
+    }
+}

+ 14 - 0
src/main/java/com/shkpr/service/warncore/exception/SelfAuthFilterException.java

@@ -0,0 +1,14 @@
+package com.shkpr.service.warncore.exception;
+
+public class SelfAuthFilterException extends Exception {
+    private int nErrorCode;
+
+    public SelfAuthFilterException(int nErrorCode, String strErrorMsg) {
+        super(strErrorMsg);
+        this.nErrorCode = nErrorCode;
+    }
+
+    public int getErrorCode() {
+        return nErrorCode;
+    }
+}

+ 23 - 0
src/main/java/com/shkpr/service/warncore/exception/SelfAuthResultException.java

@@ -0,0 +1,23 @@
+package com.shkpr.service.warncore.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+public class SelfAuthResultException extends AuthenticationException {
+    private int nErrorCode;
+    public SelfAuthResultException(String msg, Throwable t) {
+        super(msg, t);
+    }
+
+    public SelfAuthResultException(String msg) {
+        super(msg);
+    }
+
+    public SelfAuthResultException(int code, String msg){
+        super(msg);
+        this.nErrorCode = code;
+    }
+
+    public int getErrorCode() {
+        return nErrorCode;
+    }
+}

+ 24 - 0
src/main/java/com/shkpr/service/warncore/exception/SelfException.java

@@ -0,0 +1,24 @@
+package com.shkpr.service.warncore.exception;
+
+public class SelfException extends Exception{
+    private String mStrErrorCode = "";
+    private String mStrErrorData = "";
+    public SelfException(String strErrorCode, String strErrorMsg){
+        super(strErrorMsg);
+        this.mStrErrorCode = strErrorCode;
+    }
+
+    public SelfException(String strErrorCode, String strErrorMsg, String strErrorData){
+        super(strErrorMsg);
+        this.mStrErrorCode = strErrorCode;
+        this.mStrErrorData = strErrorData;
+    }
+
+    public String getStrErrorCode() {
+        return mStrErrorCode;
+    }
+
+    public String getStrErrorData() {
+        return mStrErrorData;
+    }
+}

+ 60 - 0
src/main/java/com/shkpr/service/warncore/factorys/SslClientHttpRequestFactory.java

@@ -0,0 +1,60 @@
+package com.shkpr.service.warncore.factorys;
+
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+
+/**
+ * RestTemplate配合该类,可忽略Https的限制
+ */
+public class SslClientHttpRequestFactory extends SimpleClientHttpRequestFactory {
+
+    @Override
+    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
+        if (connection instanceof HttpsURLConnection) {
+            prepareHttpsConnection((HttpsURLConnection) connection);
+        }
+        super.prepareConnection(connection, httpMethod);
+    }
+
+    private void prepareHttpsConnection(HttpsURLConnection connection) {
+        connection.setHostnameVerifier(new SkipHostnameVerifier());
+        try {
+            connection.setSSLSocketFactory(createSslSocketFactory());
+        }
+        catch (Exception ex) {// Ignore
+        }
+    }
+    private SSLSocketFactory createSslSocketFactory() throws Exception {
+        SSLContext context = SSLContext.getInstance("TLS");
+        context.init(null, new TrustManager[] { new SkipX509TrustManager() }, new SecureRandom());
+        return context.getSocketFactory();
+    }
+
+    private class SkipHostnameVerifier implements HostnameVerifier {
+        @Override
+        public boolean verify(String s, SSLSession sslSession) {
+            return true;
+        }
+    }
+
+    private static class SkipX509TrustManager implements X509TrustManager {
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[0];
+        }
+
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) {
+        }
+    }
+
+}

+ 0 - 0
src/main/java/com/shkpr/service/warncore/globalcache/GlobalData.java


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