Преглед на файлове

实现用户信息同步

欧阳劲驰 преди 2 месеца
родител
ревизия
db29faeb46
променени са 48 файла, в които са добавени 1719 реда и са изтрити 418 реда
  1. 11 0
      custom-gateway-app/pom.xml
  2. 13 34
      custom-gateway-app/src/main/resources/application-zydma.yml
  3. 18 3
      custom-gateway-app/src/main/resources/application.yml
  4. 22 0
      custom-gateway-core/pom.xml
  5. 6 19
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/AsyncConfig.java
  6. 16 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/CallingConfig.java
  7. 120 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DataSourceConfig.java
  8. 29 10
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/InfluxDbConfig.java
  9. 10 11
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/SchedulingConfig.java
  10. 21 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/IntegrationMetadata.java
  11. 1 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/LogFlagBusiType.java
  12. 0 80
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/AuthTokenData.java
  13. 7 8
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/CommonAuthToken.java
  14. 53 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/IntegrationKey.java
  15. 119 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/PageRequest.java
  16. 209 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/PageResponse.java
  17. 0 18
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResponseRes.java
  18. 37 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/Result.java
  19. 47 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResultResponse.java
  20. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/filter/TokenFilter.java
  21. 24 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/io/YamlPropertySourceFactory.java
  22. 77 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/CallingProperties.java
  23. 4 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/GlobalProperties.java
  24. 4 2
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/InfluxDbProperties.java
  25. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/InfluxDbUtil.java
  26. 7 7
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/ResponseUtil.java
  27. 3 3
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/TokenUtil.java
  28. 0 38
      custom-gateway-core/src/test/java/com/shkpr/service/customgateway/core/CustomGatewayCoreApplicationTests.java
  29. 9 0
      custom-gateway-zydma/pom.xml
  30. 45 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/bizmgr/InfoSyncManager.java
  31. 94 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/InfoSynchronizer.java
  32. 0 16
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/config/ThirdDockConfig.java
  33. 44 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java
  34. 0 47
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/SyncBehavior.java
  35. 0 34
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/FieldMapping.java
  36. 65 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformPage.java
  37. 49 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformResult.java
  38. 73 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformUser.java
  39. 87 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/PersonnelInfo.java
  40. 40 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/mapper/PersonnelInfoMapper.java
  41. 0 47
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/properties/ThirdDockProperties.java
  42. 21 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/PersonnelInfoService.java
  43. 122 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/impl/PersonnelInfoServiceImpl.java
  44. 120 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/utils/CallingUtil.java
  45. 54 0
      custom-gateway-zydma/src/main/resources/mapper/PersonnelInfoMapper.xml
  46. 0 38
      custom-gateway-zydma/src/test/java/com/shkpr/service/customgateway/zydma/ZydmApplicationTests.java
  47. 27 0
      db.yml
  48. 9 1
      pom.xml

+ 11 - 0
custom-gateway-app/pom.xml

@@ -68,6 +68,17 @@
                     </nonFilteredFileExtensions>
                 </configuration>
             </plugin>
+            <!--maven-surefire-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                    <systemPropertyVariables>
+                        <global.sql-config-path>../db.yml</global.sql-config-path>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
             <!--spring-boot-->
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 13 - 34
custom-gateway-app/src/main/resources/application-zydma.yml

@@ -1,35 +1,14 @@
-#spring
-spring:
-  #influxDb
-  influx:
-    url: http://119.96.165.176:8086/
-    user: kpr
-    password: kpr.2024@117.influxdb
-    database: iot
-    read-timeout: PT60S
 #第三方对接
-third-dock:
-  #认证信息
-  auth:
-    app-key: "xxxx"
-    app-secret: "xxxx"
-  #字段映射
-  field-mappings:
-    k2_personnel_info:
-      - local-field: "uid"
-        remote-field: "用户Id"
-        description: "用户唯一标识"
-      - local-field: "account"
-        remote-field: "登录名"
-      - local-field: "role_id"
-        sync-behavior: INSERT_ONLY
-        default-value: "255"
-        description: "仅插入时设置为255"
-      - local-field: "org"
-        sync-behavior: INSERT_ONLY
-        default-value: "group"
-      - local-field: "password"
-        default-value: "12345"
-      - local-field: "status"
-        remote-field: "是否冻结"
-        description: "状态转换:冻结→-1,其他→1"
+calling:
+  connect-timeout: PT30S
+  read-timeout: PT30S
+  #对接信息
+  endpoints:
+    middle-platform:
+      url: http://223.75.194.87:8200/PandaCore/GCK
+      access-key: lousunkongzhi
+      secret-key: g+4UWJ6360SxDVu+9BRRQfOg0/tT+33o3S8Q5APMLIn+JQirprtdGd0cf5Y3WO7iiKo24T5mN1U697zHp/iGNA==
+    iot:
+      url: http://223.75.194.87:8200/pdserver
+      access-key: Data
+      secret-key: panda666.

+ 18 - 3
custom-gateway-app/src/main/resources/application.yml

@@ -1,9 +1,24 @@
 #spring
 spring:
-  profiles:
-    active: zydma
   application:
     name: KprCustomGateway
+  profiles:
+    active: zydma
+  task:
+    #任务线程池
+    execution:
+      thread-name-prefix: task-
+      pool:
+        core-size: 8
+        max-size: 0x7fffffff
+        queue-capacity: 0x7fffffff
+        keep-alive: PT30S
+        allow-core-thread-timeout: true
+    #定时线程池
+    scheduling:
+      thread-name-prefix: scheduling-
+      pool:
+        size: 2
 #web
 server:
   port: 9011
@@ -22,7 +37,7 @@ gateway:
     zydma: /zy-dma/
 #全局
 global:
-  cpu-cores:
+  sql-config-path: ./db.yml
 #异步
 async:
   result-path-pattern: /common/async-results

+ 22 - 0
custom-gateway-core/pom.xml

@@ -34,6 +34,22 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
+        <!--spring-data-kv-->
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-keyvalue</artifactId>
+        </dependency>
+        <!--mybatis-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>${mybatis.spring.version}</version>
+        </dependency>
+        <!--postgresql-->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
         <!--jjwt-->
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
@@ -45,6 +61,12 @@
             <groupId>org.influxdb</groupId>
             <artifactId>influxdb-java</artifactId>
         </dependency>
+        <!--okhttp-->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>${okhttp.version}</version>
+        </dependency>
     </dependencies>
 
     <!--构建脚本-->

+ 6 - 19
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/AsyncConfig.java

@@ -6,14 +6,11 @@ import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
 import com.shkpr.service.customgateway.core.properties.AsyncProperties;
 import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.task.TaskExecutorBuilder;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.AsyncConfigurer;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
-import java.time.Duration;
 import java.util.concurrent.Executor;
 
 /**
@@ -26,21 +23,11 @@ import java.util.concurrent.Executor;
 @EnableAsync
 @EnableConfigurationProperties(AsyncProperties.class)
 public class AsyncConfig implements AsyncConfigurer {
-    /**
-     * 异步任务多线程处理
-     *
-     * @return 线程任务执行
-     */
-    @Bean(destroyMethod = "shutdown", name = "asyncThreadPoolTaskExecutor")
-    public ThreadPoolTaskExecutor taskExecutor() {
-        TaskExecutorBuilder builder = new TaskExecutorBuilder();
-        builder = builder.queueCapacity(Integer.MAX_VALUE);
-        builder = builder.corePoolSize(8);
-        builder = builder.maxPoolSize(Integer.MAX_VALUE);
-        builder = builder.allowCoreThreadTimeOut(true);
-        builder = builder.keepAlive(Duration.ofSeconds(30));
-        builder = builder.threadNamePrefix("AsyncTask-");
-        return builder.build();
+    final
+    ThreadPoolTaskExecutor executor;
+
+    public AsyncConfig(ThreadPoolTaskExecutor executor) {
+        this.executor = executor;
     }
 
     /**
@@ -48,7 +35,7 @@ public class AsyncConfig implements AsyncConfigurer {
      */
     @Override
     public Executor getAsyncExecutor() {
-        return taskExecutor();
+        return executor;
     }
 
     /**

+ 16 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/CallingConfig.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.customgateway.core.config;
+
+import com.shkpr.service.customgateway.core.properties.CallingProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 对接配置
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Configuration
+@EnableConfigurationProperties(CallingProperties.class)
+public class CallingConfig {
+}

+ 120 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DataSourceConfig.java

@@ -0,0 +1,120 @@
+package com.shkpr.service.customgateway.core.config;
+
+import com.shkpr.service.customgateway.core.io.YamlPropertySourceFactory;
+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.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+/**
+ * 主要的DataSource配置
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Configuration
+@MapperScan(basePackages = "com.shkpr.service.customgateway.**.mapper", sqlSessionTemplateRef = "mainSqlSessionTemplate")
+@PropertySource(value = "file:${global.sql-config-path}", ignoreResourceNotFound = true, encoding = "UTF-8", factory = YamlPropertySourceFactory.class)
+public class DataSourceConfig {
+    @Value("${spring.datasource.data.driver-class-name:org.postgresql.Driver}")
+    private String driveClass;
+
+    @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;
+
+    /**
+     * @return DataSource
+     */
+    @Bean(name = "mainDatasource")
+    public DataSource mainDataSource() {
+        //构建DataSource
+        HikariDataSource dataSource = DataSourceBuilder.create()
+                .type(HikariDataSource.class)
+                .url(url)
+                .username(username)
+                .password(password)
+                .build();
+
+        dataSource.setDriverClassName(driveClass);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+
+        dataSource.setMaximumPoolSize(maxPoolSize);
+        dataSource.setMinimumIdle(minIdle);
+        dataSource.setConnectionTestQuery(connectionTestQuery);
+        dataSource.setMaxLifetime(maxLifetime);
+        dataSource.setIdleTimeout(idleTimeout);
+        dataSource.setConnectionTimeout(connectionTimeout);
+        dataSource.setValidationTimeout(validTimeout);
+        dataSource.setInitializationFailTimeout(initFailedTimeout);
+
+        return dataSource;
+    }
+
+
+    @Bean("mainSqlSessionFactory")
+    public SqlSessionFactory mainSqlSessionFactoryBean(@Qualifier("mainDatasource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(dataSource);
+        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
+                .getResources("classpath:mapper/*.xml"));
+        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);
+    }
+}

+ 29 - 10
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/InfluxDbConfig.java

@@ -1,16 +1,18 @@
 package com.shkpr.service.customgateway.core.config;
 
+import com.shkpr.service.customgateway.core.io.YamlPropertySourceFactory;
 import com.shkpr.service.customgateway.core.properties.InfluxDbProperties;
 import okhttp3.OkHttpClient;
 import org.influxdb.InfluxDB;
 import org.influxdb.impl.InfluxDBImpl;
 import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.influx.InfluxDbOkHttpClientBuilderProvider;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
 
-import java.util.concurrent.TimeUnit;
+import java.time.Duration;
 
 /**
  * influxDb配置
@@ -19,17 +21,24 @@ import java.util.concurrent.TimeUnit;
  * @since 1.0.0
  */
 @Configuration
-@EnableConfigurationProperties(InfluxDbProperties.class)
+@PropertySource(value = "file:${global.sql-config-path}", ignoreResourceNotFound = true, encoding = "utf-8", factory = YamlPropertySourceFactory.class)
 public class InfluxDbConfig {
     final
-    InfluxDbProperties properties;
-    final
     OkHttpClient.Builder builder;
 
-    public InfluxDbConfig(InfluxDbProperties properties
-            , ObjectProvider<InfluxDbOkHttpClientBuilderProvider> builder
+    @Value("${spring.influx.url:}")
+    private String url = "";
+    @Value("${spring.influx.user:}")
+    private String user = "";
+    @Value("${spring.influx.password:}")
+    private String password = "";
+    @Value("${spring.influx.database:}")
+    private String database = "";
+    @Value("${spring.influx.read-timeout:}")
+    private String readTimeout = "";
+
+    public InfluxDbConfig(ObjectProvider<InfluxDbOkHttpClientBuilderProvider> builder
             , ObjectProvider<OkHttpClient.Builder> deprecatedBuilder) {
-        this.properties = properties;
         this.builder = determineBuilder(builder.getIfAvailable(),
                 deprecatedBuilder.getIfAvailable());
     }
@@ -50,13 +59,23 @@ public class InfluxDbConfig {
 
 
     /**
+     * influxDb属性
+     *
+     * @return influxDb属性
+     */
+    @Bean
+    public InfluxDbProperties influxDbProperties() {
+        return new InfluxDbProperties(url, user, password, database, Duration.ofMillis(Long.parseLong(readTimeout)));
+    }
+
+    /**
      * influxDb客户端
      *
      * @return influxDb客户端
      */
     @Bean
     public InfluxDB influxDB() {
-        this.builder.readTimeout(properties.getReadTimeout().toMillis(), TimeUnit.MILLISECONDS);
-        return new InfluxDBImpl(properties.getUrl(), properties.getUser(), properties.getPassword(), this.builder);
+        this.builder.readTimeout(Duration.ofMillis(Long.parseLong(readTimeout)));
+        return new InfluxDBImpl(url, user, password, this.builder);
     }
 }

+ 10 - 11
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/SchedulingConfig.java

@@ -1,13 +1,13 @@
 package com.shkpr.service.customgateway.core.config;
 
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.task.TaskSchedulerCustomizer;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 
 /**
- * 计划任务配置
+ * 调度配置
  *
  * @author 欧阳劲驰
  * @since 1.0.0
@@ -17,15 +17,14 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 @Slf4j
 public class SchedulingConfig {
     /**
-     * 定时任务多线程调度
+     * @return 调度器定制
      */
-    @Bean(destroyMethod = "shutdown", name = "timeThreadPoolTaskScheduler")
-    public ThreadPoolTaskScheduler taskScheduler() {
-        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
-        scheduler.setPoolSize(2);
-        scheduler.setThreadNamePrefix("TimeTask-");
-        scheduler.setAwaitTerminationSeconds(5);
-        scheduler.setWaitForTasksToCompleteOnShutdown(true);
-        return scheduler;
+    @Bean
+    public TaskSchedulerCustomizer taskSchedulerCustomizer() {
+        return scheduler -> {
+            scheduler.setAwaitTerminationSeconds(5);
+            scheduler.setWaitForTasksToCompleteOnShutdown(true);
+        };
+
     }
 }

+ 21 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/IntegrationMetadata.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.customgateway.core.constants;
+
+/**
+ * 集成元数据
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+public interface IntegrationMetadata {
+    /**
+     * 头
+     */
+    interface Headers {
+        //密钥
+        String APP_KEY = "appKey";
+        //时间戳
+        String TIMESTAMP = "timestamp";
+        //签名
+        String SIGN = "sign";
+    }
+}

+ 1 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/LogFlagBusiType.java

@@ -40,6 +40,7 @@ public enum LogFlagBusiType {
     BUSI_GIS_SURVEY_PROJECT_BIZ(36,"Gis Survey Project Biz"),
     BUSI_GIS_SURVEY(37,"Gis Survey Biz"),
     BUSI_PIPE_BURST(38,"Pipe Burst Biz"),
+    ZAO_YANG_DMA(39,"Zao Yang Dma"),
 
     BUSI_INTERNAL(99,"Internal Busi"),
 

+ 0 - 80
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/AuthTokenData.java

@@ -1,80 +0,0 @@
-package com.shkpr.service.customgateway.core.domain;
-
-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);
-    }
-}

+ 7 - 8
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/CommonAuthToken.java

@@ -9,12 +9,11 @@ import java.util.Collection;
 /**
  * 通用token
  * <p>principal:token信息</p>
- * <p>credentials:token字符串</p>
  *
  * @author 欧阳劲驰
  * @since 1.0.0
  */
-public class CommonAuthToken extends AbstractAuthenticationToken implements Serializable {
+public class CommonToken extends AbstractAuthenticationToken implements Serializable {
     /**
      * token信息
      */
@@ -24,14 +23,14 @@ public class CommonAuthToken extends AbstractAuthenticationToken implements Seri
      */
     private final Object credentials;
 
-    public CommonAuthToken(Object principal, Object credentials) {
+    public CommonToken(Object principal, Object credentials) {
         super(null);
         this.principal = principal;
         this.credentials = credentials;
         setAuthenticated(false);
     }
 
-    public CommonAuthToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
+    public CommonToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
         super(authorities);
         this.principal = principal;
         this.credentials = credentials;
@@ -45,8 +44,8 @@ public class CommonAuthToken extends AbstractAuthenticationToken implements Seri
      * @param credentials 密码
      * @return 未认证的token
      */
-    public static CommonAuthToken unauthenticated(Object principal, Object credentials) {
-        return new CommonAuthToken(principal, credentials);
+    public static CommonToken unauthenticated(Object principal, Object credentials) {
+        return new CommonToken(principal, credentials);
     }
 
     /**
@@ -56,8 +55,8 @@ public class CommonAuthToken extends AbstractAuthenticationToken implements Seri
      * @param authorities 权限
      * @return 已认证的token
      */
-    public static CommonAuthToken authenticated(Object principal, Collection<? extends GrantedAuthority> authorities) {
-        return new CommonAuthToken(principal, null, authorities);
+    public static CommonToken authenticated(Object principal, Collection<? extends GrantedAuthority> authorities) {
+        return new CommonToken(principal, null, authorities);
     }
 
     @Override

+ 53 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/IntegrationKey.java

@@ -0,0 +1,53 @@
+package com.shkpr.service.customgateway.core.domain;
+
+import lombok.Data;
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 集成密钥
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+public class IntegrationKey {
+    /**
+     * 时间戳
+     */
+    private final Long timestamp;
+    /**
+     * key
+     */
+    private String appKey;
+    /**
+     * Secret
+     */
+    private String appSecret;
+    /**
+     * 参数
+     */
+    private Map<String, String> params;
+    /**
+     * 签名
+     */
+    private String sign;
+
+    public IntegrationKey(String appKey, String appSecret, Map<String, String> params) {
+        this.appKey = appKey;
+        this.appSecret = appSecret;
+        this.params = params;
+        this.timestamp = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+
+        //连接参数
+        String paramsStr = params.entrySet().stream()
+                .map(entry -> entry.getKey() + "=" + entry.getValue())
+                .collect(Collectors.joining("&"));
+        //签名密钥
+        this.sign = DigestUtils.md5Hex(this.appSecret + "&" + this.timestamp + "&" + paramsStr).toUpperCase();
+    }
+}

+ 119 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/PageRequest.java

@@ -0,0 +1,119 @@
+package com.shkpr.service.customgateway.core.domain;
+
+import lombok.Data;
+import lombok.NonNull;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+/**
+ * 分页请求
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+public class PageRequest implements Pageable {
+    /**
+     * 页码
+     */
+    private Integer pageNumber;
+
+    /**
+     * 分页大小
+     */
+    private Integer pageSize;
+
+    /**
+     * 排序条件
+     */
+    private Sort sort;
+
+    public PageRequest(Integer pageNumber, Integer pageSize) {
+        this(pageNumber, pageSize, Sort.unsorted());
+    }
+
+    public PageRequest(Integer pageNumber, Integer pageSize, Sort sort) {
+        if (pageNumber != null && pageNumber < 0) {
+            throw new IllegalArgumentException("页码不能小于0");
+        }
+        if (pageSize != null && pageSize < 1) {
+            throw new IllegalArgumentException("分页大小不能小于1");
+        }
+
+        this.pageNumber = pageNumber != null ? pageNumber : 0;
+        this.pageSize = pageSize != null ? pageSize : 20;
+        this.sort = sort != null ? sort : Sort.unsorted();
+    }
+
+    @Override
+    public int getPageNumber() {
+        return this.pageNumber;
+    }
+
+    @Override
+    public int getPageSize() {
+        return this.pageSize;
+    }
+
+    @Override
+    public long getOffset() {
+        return (long) pageNumber * (long) pageSize;
+    }
+
+    @Override
+    @NonNull
+    public Sort getSort() {
+        return this.sort;
+    }
+
+    @Override
+    @NonNull
+    public Pageable next() {
+        return new PageRequest(pageNumber + 1, pageSize, sort);
+    }
+
+    @Override
+    @NonNull
+    public Pageable previousOrFirst() {
+        return hasPrevious() ? new PageRequest(pageNumber - 1, pageSize, sort) : this;
+    }
+
+    @Override
+    @NonNull
+    public Pageable first() {
+        return new PageRequest(0, pageSize, sort);
+    }
+
+    @Override
+    public boolean hasPrevious() {
+        return pageNumber > 0;
+    }
+
+    /**
+     * 创建带排序的PageRequest
+     */
+    public static PageRequest defaultPage() {
+        return of(0, 99, Sort.unsorted());
+    }
+
+    /**
+     * 创建带排序的PageRequest
+     */
+    public static PageRequest of(int page, int size) {
+        return of(page, size, Sort.unsorted());
+    }
+
+    /**
+     * 创建带排序的PageRequest
+     */
+    public static PageRequest of(int page, int size, Sort sort) {
+        return new PageRequest(page, size, sort);
+    }
+
+    /**
+     * 创建带排序的PageRequest
+     */
+    public static PageRequest of(int page, int size, Sort.Direction direction, String... properties) {
+        return of(page, size, Sort.by(direction, properties));
+    }
+}

+ 209 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/PageResponse.java

@@ -0,0 +1,209 @@
+package com.shkpr.service.customgateway.core.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 一页响应数据
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+@NoArgsConstructor
+public class PageResponse<T> implements Page<T> {
+    /**
+     * 页码数
+     */
+    private Integer pageNumber;
+
+    /**
+     * 分页大小
+     */
+    private Integer pageSize;
+
+    /**
+     * 内容
+     */
+    private List<T> data;
+
+    /**
+     * 总记录数
+     */
+    private Long totalElements;
+
+    /**
+     * 总页数
+     */
+    private Integer totalPages;
+
+    public PageResponse(Integer pageNumber, Integer pageSize, List<T> data, Long totalElements, Integer totalPages) {
+        this.pageNumber = pageNumber;
+        this.pageSize = pageSize;
+        this.data = data;
+        this.totalElements = totalElements;
+        this.totalPages = totalPages;
+
+        //计算总页数
+        if (totalPages == null) {
+            if (totalElements == null || totalElements == 0 || pageSize == null || pageSize == 0 || data == null || data.isEmpty())
+                this.totalPages = 0;
+            else this.totalPages = (int) Math.ceil((double) totalElements / pageSize);
+        }
+    }
+
+    public static <T> PageResponse<T> of(List<T> data, Long total) {
+        return new PageResponse<>(null, null, data, total, null);
+    }
+
+    public static <T> PageResponse<T> of(List<T> data, Long total, Pageable pageable) {
+        return new PageResponse<>(pageable.getPageNumber(), pageable.getPageSize(), data, total, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getTotalPages() {
+        return this.totalPages;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public long getTotalElements() {
+        return this.totalElements;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getNumber() {
+        return pageNumber != null ? pageNumber : 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getSize() {
+        return pageSize != null ? pageSize : (data != null ? data.size() : 0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getNumberOfElements() {
+        return data != null ? data.size() : 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public List<T> getContent() {
+        return data != null ? data : Collections.emptyList();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean hasContent() {
+        return data != null && !data.isEmpty();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public Sort getSort() {
+        return Sort.unsorted();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isFirst() {
+        return getNumber() == 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isLast() {
+        return getNumber() >= getTotalPages() - 1;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean hasNext() {
+        return getNumber() < getTotalPages() - 1;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean hasPrevious() {
+        return getNumber() > 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public Pageable nextPageable() {
+        return hasNext() ? PageRequest.of(getNumber() + 1, getSize()) : Pageable.unpaged();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public Pageable previousPageable() {
+        return hasPrevious() ? PageRequest.of(pageNumber - 1, getSize()) : Pageable.unpaged();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public <U> Page<U> map(@NonNull Function<? super T, ? extends U> converter) {
+        List<U> convertedContent = Collections.emptyList();
+        if (data != null) convertedContent = data.stream().map(converter).collect(Collectors.toList());
+        return new PageResponse<>(pageNumber, pageSize, convertedContent, totalElements, getTotalPages());
+    }
+
+    /**
+     * 返回迭代器
+     */
+    @Override
+    @NonNull
+    public Iterator<T> iterator() {
+        return getContent().iterator();
+    }
+}

+ 0 - 18
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResponseRes.java

@@ -1,18 +0,0 @@
-package com.shkpr.service.customgateway.core.domain;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Setter
-@Getter
-public class ResponseRes<T> {
-    private long timestamp;
-    private String rescode;
-    private String resmsg;//message;
-    private T resdata;//data;
-
-    public ResponseRes() {
-
-    }
-}
-

+ 37 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/Result.java

@@ -0,0 +1,37 @@
+package com.shkpr.service.customgateway.core.domain;
+
+/**
+ * 结果
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+public interface Result<T> {
+    /**
+     * 获取状态码
+     *
+     * @return 状态码
+     */
+    Integer getCode();
+
+    /**
+     * 获取信息
+     *
+     * @return 信息
+     */
+    String getMessage();
+
+    /**
+     * 获取数据
+     *
+     * @return 数据
+     */
+    T getData();
+
+    /**
+     * 获取ok状态码
+     *
+     * @return ok状态码
+     */
+    Boolean isOk();
+}

+ 47 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResultResponse.java

@@ -0,0 +1,47 @@
+package com.shkpr.service.customgateway.core.domain;
+
+import com.shkpr.service.customgateway.core.constants.ResponseCode;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 结果响应
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Setter
+@Getter
+public class ResultResponse<T> implements Result<T> {
+    private long timestamp;
+    private String rescode;
+    private String resmsg;//message;
+    private T resdata;//data;
+
+    public ResultResponse() {
+
+    }
+
+    @Override
+    public Integer getCode() {
+        return Integer.valueOf(this.rescode);
+    }
+
+    @Override
+    public String getMessage() {
+        return this.resmsg;
+    }
+
+    @Override
+    public T getData() {
+        return this.resdata;
+    }
+
+    @Override
+    public Boolean isOk() {
+        return StringUtils.isNoneBlank(this.rescode) &&
+                Integer.parseInt(this.rescode) == ResponseCode.RESULT_NORMAL.getCode();
+    }
+}
+

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/filter/TokenFilter.java

@@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 /**
- * token过滤器
+ * 令牌过滤器
  *
  * @author 欧阳劲驰
  * @since 1.0.0

+ 24 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/io/YamlPropertySourceFactory.java

@@ -0,0 +1,24 @@
+package com.shkpr.service.customgateway.core.io;
+
+import lombok.NonNull;
+import org.springframework.boot.env.YamlPropertySourceLoader;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.EncodedResource;
+import org.springframework.core.io.support.PropertySourceFactory;
+import org.springframework.lang.Nullable;
+
+import java.io.IOException;
+
+/**
+ * yml配置工厂
+ */
+public class YamlPropertySourceFactory implements PropertySourceFactory {
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NonNull
+    public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
+        return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).get(0);
+    }
+}

+ 77 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/CallingProperties.java

@@ -0,0 +1,77 @@
+package com.shkpr.service.customgateway.core.properties;
+
+import com.shkpr.service.customgateway.core.domain.IntegrationKey;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.text.CaseUtils;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.time.Duration;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 对接属性
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Getter
+@Setter
+@ConfigurationProperties("calling")
+public class CallingProperties {
+    /**
+     * 连接超时(毫秒)
+     */
+    private Duration connectTimeout = Duration.ofSeconds(30);
+    /**
+     * 读取超时(毫秒)
+     */
+    private Duration readTimeout = Duration.ofSeconds(30);
+    /**
+     * 对接点
+     */
+    private Map<String, CallingEndpoint> endpoints;
+
+    /**
+     * @return 对接点配置
+     */
+    public Map<String, CallingEndpoint> getEndpoints() {
+        return this.endpoints.entrySet().stream()
+                .collect(Collectors.toMap(entry ->
+                                CaseUtils.toCamelCase(entry.getKey(), false, '-'),
+                        Map.Entry::getValue
+                ));
+    }
+
+
+    /**
+     * 对接点
+     */
+    @Data
+    public static class CallingEndpoint {
+        /**
+         * 地址
+         */
+        private String url;
+        /**
+         * 账号
+         */
+        private String accessKey;
+        /**
+         * 密码
+         */
+        private String secretKey;
+
+        /**
+         * 获取密钥
+         *
+         * @param params 参数
+         * @return 密钥
+         */
+        public IntegrationKey getKey(Map<String, String> params) {
+            return new IntegrationKey(accessKey, secretKey, params);
+        }
+    }
+}

+ 4 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/GlobalProperties.java

@@ -45,4 +45,8 @@ public class GlobalProperties {
      * <p>默认为2020-02-01 00:00:00</p>
      */
     private Long serviceOnline = 1580486400000L;
+    /**
+     * sql配置文件路径
+     */
+    private String sqlConfigPath;
 }

+ 4 - 2
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/InfluxDbProperties.java

@@ -1,8 +1,9 @@
 package com.shkpr.service.customgateway.core.properties;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
-import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.time.Duration;
 
@@ -15,7 +16,8 @@ import java.time.Duration;
  */
 @Getter
 @Setter
-@ConfigurationProperties(prefix = "spring.influx")
+@NoArgsConstructor
+@AllArgsConstructor
 public class InfluxDbProperties {
     /**
      * 连接地址

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/InfluxDbUtil.java

@@ -28,7 +28,7 @@ import java.util.stream.IntStream;
 /**
  * influxdb工具类
  *
- * @author 欧劲驰
+ * @author 欧劲驰
  * @since 1.0.0
  **/
 @Component

+ 7 - 7
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/ResponseUtil.java

@@ -2,7 +2,7 @@ package com.shkpr.service.customgateway.core.utils;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.shkpr.service.customgateway.core.constants.ResponseCode;
-import com.shkpr.service.customgateway.core.domain.ResponseRes;
+import com.shkpr.service.customgateway.core.domain.ResultResponse;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -78,14 +78,14 @@ public class ResponseUtil {
         response.setStatus(BooleanUtils.isTrue(httpStatusAlready200) ? HttpStatus.SC_OK : code.getCode());
 
         //构建结果
-        ResponseRes<String> result = new ResponseRes<>();
-        result.setRescode(code.getCode() + "");
-        result.setResmsg(code.getMessage());
-        result.setResdata("");
-        result.setTimestamp(System.currentTimeMillis());
+        ResultResponse<String> resultResponse = new ResultResponse<>();
+        resultResponse.setRescode(code.getCode() + "");
+        resultResponse.setResmsg(code.getMessage());
+        resultResponse.setResdata("");
+        resultResponse.setTimestamp(System.currentTimeMillis());
 
         //输出json
-        response.getWriter().write(objectMapper.writeValueAsString(result));
+        response.getWriter().write(objectMapper.writeValueAsString(resultResponse));
     }
 
     /**

+ 3 - 3
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/TokenUtil.java

@@ -3,7 +3,7 @@ package com.shkpr.service.customgateway.core.utils;
 import com.shkpr.service.customgateway.core.constants.Api;
 import com.shkpr.service.customgateway.core.constants.CommDefine;
 import com.shkpr.service.customgateway.core.constants.TokenMetadata;
-import com.shkpr.service.customgateway.core.domain.CommonAuthToken;
+import com.shkpr.service.customgateway.core.domain.CommonToken;
 import com.shkpr.service.customgateway.core.domain.TokenData;
 import com.shkpr.service.customgateway.core.properties.GlobalProperties;
 import com.shkpr.service.customgateway.core.properties.SecurityProperties;
@@ -186,7 +186,7 @@ public class TokenUtil {
             //设置用户和角色信息,并返回token
             request.setAttribute(TokenMetadata.RequestAttributes.USER_ID, CommDefine.INTERNAL_OPERATOR_USER_ID);
             request.setAttribute(TokenMetadata.RequestAttributes.ROLE_ID, CommDefine.INTERNAL_OPERATOR_ROLE_ID);
-            return CommonAuthToken.authenticated(
+            return CommonToken.authenticated(
                     new TokenData(CommDefine.INTERNAL_OPERATOR_USER_ID, CommDefine.INTERNAL_OPERATOR_ROLE_ID),
                     Collections.emptyList());
         }
@@ -213,6 +213,6 @@ public class TokenUtil {
         //设置用户和角色信息,并返回token
         request.setAttribute(TokenMetadata.RequestAttributes.USER_ID, tokenData.getFlagKey());
         request.setAttribute(TokenMetadata.RequestAttributes.ROLE_ID, tokenData.getRoleId());
-        return CommonAuthToken.authenticated(tokenData, Collections.emptyList());
+        return CommonToken.authenticated(tokenData, Collections.emptyList());
     }
 }

+ 0 - 38
custom-gateway-core/src/test/java/com/shkpr/service/customgateway/core/CustomGatewayCoreApplicationTests.java

@@ -1,38 +0,0 @@
-package com.shkpr.service.customgateway.core;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class CustomGatewayCoreApplicationTests
-    extends TestCase
-{
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public CustomGatewayCoreApplicationTests(String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite( CustomGatewayCoreApplicationTests.class );
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp()
-    {
-        assertTrue( true );
-    }
-}

+ 9 - 0
custom-gateway-zydma/pom.xml

@@ -27,6 +27,15 @@
             <artifactId>custom-gateway-core</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <!--httpclient-->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>fluent-hc</artifactId>
+        </dependency>
     </dependencies>
 
     <!--构建脚本-->

+ 45 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/bizmgr/InfoSyncManager.java

@@ -0,0 +1,45 @@
+package com.shkpr.service.customgateway.zydma.bizmgr;
+
+import com.shkpr.service.customgateway.zydma.components.InfoSynchronizer;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 信息同步管理
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Component
+public class InfoSyncManager {
+    final
+    ThreadPoolTaskExecutor taskScheduler;
+    final
+    InfoSynchronizer infoSynchronizer;
+
+    public InfoSyncManager(ThreadPoolTaskExecutor taskScheduler, InfoSynchronizer infoSynchronizer) {
+        this.taskScheduler = taskScheduler;
+        this.infoSynchronizer = infoSynchronizer;
+    }
+
+    /**
+     * 初始化
+     */
+    @PostConstruct
+    public void init() {
+        //同步用户信息
+        taskScheduler.execute(infoSynchronizer::syncUserInfo);
+    }
+
+    /**
+     * 分钟任务
+     */
+    @Scheduled(cron = "0 */10 * * * *")
+    public void minuteTask() {
+        //同步用户信息
+        taskScheduler.execute(infoSynchronizer::syncUserInfo);
+    }
+}

+ 94 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/InfoSynchronizer.java

@@ -0,0 +1,94 @@
+package com.shkpr.service.customgateway.zydma.components;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
+import com.shkpr.service.customgateway.core.domain.IntegrationKey;
+import com.shkpr.service.customgateway.core.properties.CallingProperties;
+import com.shkpr.service.customgateway.zydma.constants.MiddlePlatformMetadata;
+import com.shkpr.service.customgateway.zydma.domain.MiddlePlatformPage;
+import com.shkpr.service.customgateway.zydma.domain.MiddlePlatformResult;
+import com.shkpr.service.customgateway.zydma.domain.MiddlePlatformUser;
+import com.shkpr.service.customgateway.zydma.domain.PersonnelInfo;
+import com.shkpr.service.customgateway.zydma.service.PersonnelInfoService;
+import com.shkpr.service.customgateway.zydma.utils.CallingUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.message.BasicHeader;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 信息同步器
+ */
+@Component
+@Slf4j
+public class InfoSynchronizer {
+    /**
+     * log
+     */
+    private static final String mStrClassName = "InfoSynchronizer";
+    private static final String mBizType = LogFlagBusiType.BUSI_ALL.toStrValue();
+
+    final
+    CallingProperties callingProperties;
+    final
+    CallingProperties.CallingEndpoint endpoint;
+    final
+    PersonnelInfoService personnelInfoService;
+    final
+    CallingUtil callingUtil;
+
+    public InfoSynchronizer(CallingProperties callingProperties, PersonnelInfoService personnelInfoService, CallingUtil callingUtil) {
+        this.callingProperties = callingProperties;
+        this.endpoint = callingProperties.getEndpoints().get(MiddlePlatformMetadata.NAME);
+        this.personnelInfoService = personnelInfoService;
+        this.callingUtil = callingUtil;
+    }
+
+    /**
+     * 同步用户信息
+     */
+    public void syncUserInfo() {
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                , "开始同步用户信息,开始滚动拉取数据");
+        long begin = System.currentTimeMillis();
+
+        //请求地址
+        String url = endpoint.getUrl() + MiddlePlatformMetadata.Uri.GET_USERS;
+        //请求获取用户
+        List<MiddlePlatformUser> users = callingUtil.scrollRequest(url, new TypeReference<MiddlePlatformResult<MiddlePlatformPage<MiddlePlatformUser>>>() {
+        }, pageable -> new HashMap<String, String>() {{
+            put(MiddlePlatformMetadata.Params.PAGE_NUMBER, pageable.getPageNumber() + "");
+            put(MiddlePlatformMetadata.Params.PAGE_SIZE, pageable.getPageSize() + "");
+        }}, params -> {
+            //获取密钥
+            IntegrationKey key = endpoint.getKey(params);
+            //存入请求头
+            return Arrays.asList(
+                    new BasicHeader(MiddlePlatformMetadata.Headers.APP_KEY, key.getAppKey()),
+                    new BasicHeader(MiddlePlatformMetadata.Headers.TIMESTAMP, key.getTimestamp() + ""),
+                    new BasicHeader(MiddlePlatformMetadata.Headers.SIGN, key.getSign())
+            );
+        });
+
+        //转换用户对象
+        List<PersonnelInfo> dates = users.stream()
+                .map(MiddlePlatformUser::toPersonnelInfo).collect(Collectors.toList());
+
+        //批量写入用户
+        Boolean upserted = personnelInfoService.upsertAll(dates);
+        long end = System.currentTimeMillis();
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                , String.format(
+                        "结束执行同步用户信息,迁移状态:%s,用时(毫秒):%d"
+                        , upserted
+                        , (end - begin)
+                )
+        );
+    }
+}

+ 0 - 16
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/config/ThirdDockConfig.java

@@ -1,16 +0,0 @@
-package com.shkpr.service.customgateway.zydma.config;
-
-import com.shkpr.service.customgateway.zydma.properties.ThirdDockProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 第三方对接配置
- *
- * @author 欧元劲驰
- * @since 1.0.0
- */
-@Configuration
-@EnableConfigurationProperties(ThirdDockProperties.class)
-public class ThirdDockConfig {
-}

+ 44 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java

@@ -0,0 +1,44 @@
+package com.shkpr.service.customgateway.zydma.constants;
+
+import com.shkpr.service.customgateway.core.constants.IntegrationMetadata;
+
+/**
+ * 中台集成元数据
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+public interface MiddlePlatformMetadata extends IntegrationMetadata {
+    //系统名称
+    String NAME = "middlePlatform";
+
+    /**
+     * 接口地址
+     */
+    interface Uri {
+        //获取用户
+        String GET_USERS = "/IntegrationAuth/GetUsers";
+    }
+
+    /**
+     * 参数
+     */
+    interface Params {
+        //页码
+        String PAGE_NUMBER = "pageIndex";
+        //分页大小
+        String PAGE_SIZE = "pageSize";
+    }
+
+    /**
+     * 默认值
+     */
+    interface DefaultValues {
+        //角色id
+        String ROLE_ID = "255";
+        //组织
+        String ORG = "group";
+        //密码
+        String PASSWORD = "12345";
+    }
+}

+ 0 - 47
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/SyncBehavior.java

@@ -1,47 +0,0 @@
-package com.shkpr.service.customgateway.zydma.constants;
-
-import lombok.Getter;
-
-/**
- * 同步行为
- *
- * @author 欧元劲驰
- * @since 1.0.0
- */
-@Getter
-public enum SyncBehavior {
-    /**
-     * 始终同步
-     */
-    ALWAYS,
-    /**
-     * 仅插入
-     */
-    INSERT_ONLY,
-    /**
-     * 仅插入
-     */
-    UPDATE_ONLY,
-    /**
-     * 永不同步
-     */
-    NEVER;
-
-    /**
-     * 检查是否应处理插入操作
-     *
-     * @return 是否应处理插入操作
-     */
-    public boolean shouldHandleInsert() {
-        return this == ALWAYS || this == INSERT_ONLY;
-    }
-
-    /**
-     * 检查是否应处理更新操作
-     *
-     * @return 是否应处理更新操作
-     */
-    public boolean shouldHandleUpdate() {
-        return this == ALWAYS || this == UPDATE_ONLY;
-    }
-}

+ 0 - 34
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/FieldMapping.java

@@ -1,34 +0,0 @@
-package com.shkpr.service.customgateway.zydma.domain;
-
-import com.shkpr.service.customgateway.zydma.constants.SyncBehavior;
-import lombok.Data;
-
-/**
- * 字段映射
- *
- * @author 欧元劲驰
- * @since 1.0.0
- */
-@Data
-public class FieldMapping {
-    /**
-     * 本地系统字段名
-     */
-    private String localField;
-    /**
-     * 第三方系统字段名
-     */
-    private String remoteField;
-    /**
-     * 字段描述
-     */
-    private String description;
-    /**
-     * 同步行为
-     */
-    private SyncBehavior syncBehavior = SyncBehavior.ALWAYS;
-    /**
-     * 默认值
-     */
-    private Object defaultValue;
-}

+ 65 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformPage.java

@@ -0,0 +1,65 @@
+package com.shkpr.service.customgateway.zydma.domain;
+
+import com.shkpr.service.customgateway.core.domain.PageResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+
+import java.util.List;
+
+/**
+ * 中台分页
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MiddlePlatformPage<T> extends PageResponse<T> {
+    /**
+     * 页码数
+     */
+    private Integer pageIndex;
+    /**
+     * 分页数
+     */
+    private Integer pageSize;
+    /**
+     * 数量
+     */
+    private Long totalCount;
+    /**
+     * 总页数
+     */
+    private Integer totalPages;
+    /**
+     * 内容
+     */
+    private List<T> list;
+
+    @Override
+    public Integer getPageNumber() {
+        return this.pageIndex;
+    }
+
+    @Override
+    public Integer getPageSize() {
+        return this.pageSize;
+    }
+
+    @Override
+    public long getTotalElements() {
+        return this.totalCount;
+    }
+
+    @Override
+    public int getTotalPages() {
+        return this.totalPages;
+    }
+
+    @Override
+    @NonNull
+    public List<T> getContent() {
+        return this.list;
+    }
+}

+ 49 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformResult.java

@@ -0,0 +1,49 @@
+package com.shkpr.service.customgateway.zydma.domain;
+
+import com.shkpr.service.customgateway.core.domain.ResultResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 中台结果
+ *
+ * @param <T> 数据类型
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MiddlePlatformResult<T> extends ResultResponse<T> {
+    /**
+     * 响应码
+     */
+    Integer code;
+    /**
+     * 消息
+     */
+    String msg;
+    /**
+     * 数据
+     */
+    T data;
+
+    @Override
+    public Integer getCode() {
+        return this.code;
+    }
+
+    @Override
+    public String getMessage() {
+        return this.msg;
+    }
+
+    @Override
+    public T getData() {
+        return this.data;
+    }
+
+    @Override
+    public Boolean isOk() {
+        return this.code != null && this.code == 0;
+    }
+}

+ 73 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformUser.java

@@ -0,0 +1,73 @@
+package com.shkpr.service.customgateway.zydma.domain;
+
+import com.shkpr.service.customgateway.zydma.constants.MiddlePlatformMetadata;
+import lombok.Data;
+
+import java.util.Objects;
+
+/**
+ * 中台用户
+ */
+@Data
+public class MiddlePlatformUser {
+    /**
+     * 用户id
+     */
+    private Long userId;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 登陆名
+     */
+    private String loginName;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 权重
+     */
+    private Integer indexOrder;
+    /**
+     * 电话
+     */
+    private String phone;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * token
+     */
+    private String token;
+    /**
+     * 状态
+     */
+    private Short state;
+
+    /**
+     * 转用户信息对象
+     *
+     * @return 户信息对象
+     */
+    public PersonnelInfo toPersonnelInfo() {
+        PersonnelInfo personnelInfo = new PersonnelInfo();
+        personnelInfo.setUid(this.userId + "");
+        personnelInfo.setAccount(Objects.equals("admin", this.loginName) ? "@@@" : this.loginName);
+        personnelInfo.setRealName(this.userName);
+        personnelInfo.setPhone(this.phone);
+        personnelInfo.setEmail(this.email);
+        personnelInfo.setStatus(this.state == 1 ? (short) -1 : (short) 1);
+        personnelInfo.setRoleId(MiddlePlatformMetadata.DefaultValues.ROLE_ID);
+        personnelInfo.setOrg(MiddlePlatformMetadata.DefaultValues.ORG);
+        personnelInfo.setPassword(MiddlePlatformMetadata.DefaultValues.PASSWORD);
+
+        return personnelInfo;
+    }
+}

+ 87 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/PersonnelInfo.java

@@ -0,0 +1,87 @@
+package com.shkpr.service.customgateway.zydma.domain;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户信息表
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Data
+public class PersonnelInfo {
+    /**
+     * 用户uid
+     */
+    private String uid;
+    /**
+     * 登录账号
+     */
+    private String account;
+    /**
+     * 登录密码
+     */
+    private String password;
+    /**
+     * 真实姓名
+     */
+    private String realName;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 性别
+     */
+    private Short sex;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 用户头像
+     */
+    private String avatar;
+    /**
+     * 用户角色uid
+     */
+    private String roleId;
+    /**
+     * 用户部门uid
+     */
+    private String deptId;
+    /**
+     * 用户职位uid
+     */
+    private String postId;
+    /**
+     * 当前状态:-1 -- 注销; 0 -- 禁用;1 -- 启用
+     */
+    private Short status;
+    /**
+     * 参数1
+     */
+    private String param1;
+    /**
+     * 参数2
+     */
+    private String param2;
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+    /**
+     * 所属组织机构
+     */
+    private String org;
+}

+ 40 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/mapper/PersonnelInfoMapper.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.customgateway.zydma.mapper;
+
+import com.shkpr.service.customgateway.zydma.domain.PersonnelInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 用户信息mapper
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Mapper
+public interface PersonnelInfoMapper {
+    /**
+     * 查询已存在的id
+     *
+     * @param ids 查询的ids
+     * @return 已存在的ids
+     */
+    List<String> findExistentIds(@Param("ids") List<String> ids);
+
+    /**
+     * 保存
+     *
+     * @param record 对象
+     * @return 保存数量
+     */
+    int save(PersonnelInfo record);
+
+    /**
+     * 更新
+     *
+     * @param record 对象
+     * @return 更新数量
+     */
+    int update(PersonnelInfo record);
+}

+ 0 - 47
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/properties/ThirdDockProperties.java

@@ -1,47 +0,0 @@
-package com.shkpr.service.customgateway.zydma.properties;
-
-import com.shkpr.service.customgateway.zydma.domain.FieldMapping;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 第三方对接属性
- *
- * @author 欧元劲驰
- * @since 1.0.0
- */
-@Getter
-@Setter
-@ConfigurationProperties("third-dock")
-public class ThirdDockProperties {
-    /**
-     * 认证信息
-     */
-    private Auth auth;
-    /**
-     * 字段映射
-     * <p>key: 表名</p>
-     * <p>value: 映射关系</p>
-     */
-    private Map<String, List<FieldMapping>> fieldMappings;
-
-    /**
-     * 第三方认证
-     */
-    @Data
-    public static class Auth {
-        /**
-         * key
-         */
-        private String appKey;
-        /**
-         * Secret
-         */
-        private String appSecret;
-    }
-}

+ 21 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/PersonnelInfoService.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.customgateway.zydma.service;
+
+import com.shkpr.service.customgateway.zydma.domain.PersonnelInfo;
+
+import java.util.List;
+
+/**
+ * 用户信息service
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+public interface PersonnelInfoService {
+    /**
+     * 批量合并操作
+     *
+     * @param dates 数据集合
+     * @return 合并状态
+     */
+    Boolean upsertAll(List<PersonnelInfo> dates);
+}

+ 122 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/impl/PersonnelInfoServiceImpl.java

@@ -0,0 +1,122 @@
+package com.shkpr.service.customgateway.zydma.service.impl;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
+import com.shkpr.service.customgateway.zydma.domain.PersonnelInfo;
+import com.shkpr.service.customgateway.zydma.mapper.PersonnelInfoMapper;
+import com.shkpr.service.customgateway.zydma.service.PersonnelInfoService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+import java.sql.Connection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息service实现
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Service
+public class PersonnelInfoServiceImpl implements PersonnelInfoService {
+    /**
+     * log
+     */
+    private final static String mStrClassName = "PersonnelInfoServiceImpl";
+    private final static String mBizType = LogFlagBusiType.ZAO_YANG_DMA.toStrValue();
+
+    private final SqlSessionFactory mainSqlSessionFactory;
+
+    private final PersonnelInfoMapper personnelInfoMapper;
+
+
+    public PersonnelInfoServiceImpl(@Qualifier("mainSqlSessionFactory") SqlSessionFactory mainSqlSessionFactory, PersonnelInfoMapper personnelInfoMapper) {
+        this.mainSqlSessionFactory = mainSqlSessionFactory;
+        this.personnelInfoMapper = personnelInfoMapper;
+    }
+
+    /**
+     * 批量合并操作
+     *
+     * @param dates 数据集合
+     * @return 合并状态
+     */
+    @Override
+    public Boolean upsertAll(List<PersonnelInfo> dates) {
+        if (CollectionUtils.isEmpty(dates)) return true;
+
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                , String.format(
+                        "开始批量写入用户信息,开启批处理 数据量:%s"
+                        , dates.size()
+                )
+        );
+        long begin = System.currentTimeMillis();
+
+        //用户id集合
+        List<String> ids = dates.stream().map(PersonnelInfo::getUid).distinct().collect(Collectors.toList());
+        //已存在的id集合
+        List<String> existentIds = personnelInfoMapper.findExistentIds(ids);
+
+        //写入的用户
+        List<PersonnelInfo> saveDates = dates.stream()
+                .filter(date -> !existentIds.contains(date.getUid()))
+                .collect(Collectors.toList());
+
+        //更新的用户
+        List<PersonnelInfo> updateDates = dates.stream()
+                .filter(date -> existentIds.contains(date.getUid()))
+                .collect(Collectors.toList());
+
+
+        //开启批处理
+        try (SqlSession sqlSession = mainSqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
+            try {
+                //设置手动提交
+                Connection conn = sqlSession.getConnection();
+                conn.setAutoCommit(false);
+
+                //从session获取mapper
+                PersonnelInfoMapper mapper = sqlSession.getMapper(PersonnelInfoMapper.class);
+
+                //批量写入
+                saveDates.forEach(mapper::save);
+                //批量更新
+                updateDates.forEach(mapper::update);
+
+                //发送sql至数据库
+                sqlSession.flushStatements();
+                //提交
+                sqlSession.commit();
+                conn.commit();
+
+                long end = System.currentTimeMillis();
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBizType, mStrClassName
+                        , String.format(
+                                "结束批量写入用户信息,提交并关闭批处理 用时(毫秒):%d"
+                                , (end - begin)
+                        )
+                );
+                return true;
+            } catch (Exception e) {
+                //回滚
+                sqlSession.rollback();
+
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
+                        , String.format(
+                                "批量写入用户信息,回滚操作 error:%s"
+                                , e
+                        )
+                );
+
+                return false;
+            }
+        }
+    }
+}

+ 120 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/utils/CallingUtil.java

@@ -0,0 +1,120 @@
+package com.shkpr.service.customgateway.zydma.utils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
+import com.shkpr.service.customgateway.core.domain.PageRequest;
+import com.shkpr.service.customgateway.core.domain.PageResponse;
+import com.shkpr.service.customgateway.core.domain.Result;
+import com.shkpr.service.customgateway.core.properties.CallingProperties;
+import org.apache.http.Header;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.client.fluent.Response;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 请求工具
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Component
+public class CallingUtil {
+    /**
+     * log
+     */
+    private final static String mStrClassName = "CallingUtil";
+    private final static String mBizType = LogFlagBusiType.BUSI_ALL.toStrValue();
+
+    final
+    ObjectMapper objectMapper;
+    final
+    CallingProperties callingProperties;
+
+    public CallingUtil(ObjectMapper objectMapper, CallingProperties callingProperties) {
+        this.objectMapper = objectMapper;
+        this.callingProperties = callingProperties;
+    }
+
+    /**
+     * 拼接参数
+     *
+     * @param params 参数
+     * @return 拼接字符串
+     */
+    public String joinParams(Map<String, String> params) {
+        return params.entrySet().stream()
+                .map(entry -> entry.getKey() + "=" + entry.getValue())
+                .collect(Collectors.joining("&"));
+    }
+
+    /**
+     * 发起滚动请求
+     *
+     * @param url               请求地址
+     * @param resultType        结果类型
+     * @param onGenerateParams  生成参数回调
+     * @param onGenerateHeaders 生成请求头回调
+     * @param <R>               结果
+     * @param <P>               分页
+     * @param <T>               数据
+     * @return 返回所有分页数据的集合
+     */
+    public <R extends Result<P>, P extends PageResponse<T>, T> List<T> scrollRequest(
+            String url, TypeReference<R> resultType,
+            Function<Pageable, Map<String, String>> onGenerateParams,
+            Function<Map<String, String>, List<Header>> onGenerateHeaders) {
+        //数据集合
+        List<T> dates = new ArrayList<>();
+        //分页请求
+        Pageable pageRequest = PageRequest.defaultPage();
+
+        try {
+            while (true) {
+                //获取参数
+                Map<String, String> params = onGenerateParams.apply(pageRequest);
+                //获取请求头
+                List<Header> headers = onGenerateHeaders.apply(params);
+
+                //发起请求
+                Response response = Request.Get(url + "?" + joinParams(params))
+                        .setHeaders(headers.toArray(new Header[0]))
+                        .connectTimeout((int) callingProperties.getConnectTimeout().toMillis())
+                        .socketTimeout((int) callingProperties.getReadTimeout().toMillis())
+                        .execute();
+
+                //解析结果
+                R result = objectMapper.readValue(response.returnContent().toString(), resultType);
+                if (!result.isOk()) throw new IOException("请求失败: " + result.getMessage());
+
+                //解析当前页,并存入数据
+                P page = result.getData();
+                dates.addAll(page.getContent());
+
+                //判断是否还有下一页
+                if (!page.hasNext()) break;
+
+                //准备下一页的请求
+                pageRequest = page.nextPageable();
+            }
+        } catch (IOException e) {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
+                    , String.format("滚动拉去数据失败 error:%s", e)
+            );
+            return Collections.emptyList();
+        }
+
+        return dates;
+    }
+}

+ 54 - 0
custom-gateway-zydma/src/main/resources/mapper/PersonnelInfoMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.shkpr.service.customgateway.zydma.mapper.PersonnelInfoMapper">
+    <select id="findExistentIds" resultType="java.lang.String">
+        SELECT uid FROM k2_personnel_info
+        WHERE uid IN
+        <foreach item="id" collection="ids" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <insert id="save">
+        insert into k2_personnel_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            create_time,
+            <if test="uid != null and uid != ''">uid,</if>
+            <if test="account != null and account != ''">account,</if>
+            <if test="realName != null and realName != ''">real_name,</if>
+            <if test="phone != null and phone != ''">phone,</if>
+            <if test="email != null and email != ''">email,</if>
+            <if test="roleId != null and roleId != ''">role_id,</if>
+            <if test="status != null">status,</if>
+            <if test="password != null">"password",</if>
+            <if test="org != null and org != ''">org,</if>
+        </trim>
+        values
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            now(),
+            <if test="uid != null and uid != ''">#{uid,jdbcType=VARCHAR},</if>
+            <if test="account != null and account != ''">#{account,jdbcType=VARCHAR},</if>
+            <if test="realName != null and realName != ''">#{realName,jdbcType=VARCHAR},</if>
+            <if test="phone != null and phone != ''">#{phone,jdbcType=VARCHAR},</if>
+            <if test="email != null and email != ''">#{email,jdbcType=VARCHAR},</if>
+            <if test="roleId != null and roleId != ''">#{roleId,jdbcType=VARCHAR},</if>
+            <if test="status != null">#{status,jdbcType=SMALLINT},</if>
+            <if test="password != null">#{password,jdbcType=VARCHAR},</if>
+            <if test="org != null and org != ''">#{org,jdbcType=VARCHAR},</if>
+        </trim>
+    </insert>
+
+    <update id="update">
+        update k2_personnel_info
+        <set>
+            <if test="account != null and account != ''">account = #{account,jdbcType=VARCHAR},</if>
+            <if test="realName != null and realName != ''">real_name = #{realName,jdbcType=VARCHAR},</if>
+            <if test="phone != null and phone != ''">phone = #{phone,jdbcType=VARCHAR},</if>
+            <if test="email != null and email != ''">email = #{email,jdbcType=VARCHAR},</if>
+            <if test="status != null">status = #{status,jdbcType=SMALLINT},</if>
+            <if test=" password != null">"password" = #{password,jdbcType=VARCHAR},</if>
+            update_time = now()
+        </set>
+        WHERE uid = #{uid,jdbcType=VARCHAR}
+    </update>
+</mapper>

+ 0 - 38
custom-gateway-zydma/src/test/java/com/shkpr/service/customgateway/zydma/ZydmApplicationTests.java

@@ -1,38 +0,0 @@
-package com.shkpr.service.customgateway.zydma;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class ZydmApplicationTests
-    extends TestCase
-{
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public ZydmApplicationTests(String testName )
-    {
-        super( testName );
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite()
-    {
-        return new TestSuite( ZydmApplicationTests.class );
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp()
-    {
-        assertTrue( true );
-    }
-}

+ 27 - 0
db.yml

@@ -0,0 +1,27 @@
+spring:
+  datasource:
+    data:
+      jdbc-url: jdbc:postgresql://140.246.183.164:5432/water_smart_test_zydma?useSSL=false&useAffectedRows=false&allowMultiQueries=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+      username: postgres
+      password: kpr.23417.postgres
+      driver-class-name: org.postgresql.Driver
+      max-wait: 60000
+      maximum-pool-size: 200
+      minimum-idle: 1
+      validation-query: SELECT 1
+      connection-test-query: SELECT 1
+      test-on-borrow: false
+      test-on-return: false
+      test-while-idle: true
+      max-lifetime: 120000
+      idle-timeout: 30000
+      connection-timeout: 30000
+      time-between-eviction-runs-millis: 60000
+      minEvictableIdleTimeMillis: 300000
+#influxdb
+  influx:
+    url: http://119.96.165.176:8086/
+    user: kpr
+    password: kpr.2024@117.influxdb
+    database: iot
+    read-timeout: 30000

+ 9 - 1
pom.xml

@@ -42,8 +42,11 @@
 
         <gbase.version>1.0.5</gbase.version>
         <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
-        <gbase.version>1.0.5</gbase.version>
+        <mybatis.spring.version>2.0.1</mybatis.spring.version>
+        <postgresql.version>42.2.5</postgresql.version>
+        <common.text.version>1.14.0</common.text.version>
         <jjwt.version>0.9.0</jjwt.version>
+        <okhttp.version>3.14.9</okhttp.version>
     </properties>
 
     <!--依赖项-->
@@ -68,6 +71,11 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>${common.text.version}</version>
+        </dependency>
         <!--lombok-->
         <dependency>
             <groupId>org.projectlombok</groupId>