瀏覽代碼

first commit

15810770710@163.com 4 年之前
父節點
當前提交
39ee1c52c5
共有 23 個文件被更改,包括 1654 次插入0 次删除
  1. 82 0
      deploy/cloud-yysj-car-query.yaml
  2. 190 0
      deploy/config-map-dev.yaml
  3. 141 0
      pom.xml
  4. 18 0
      src/main/java/info/aspirecn/cloud/yysj/Application.java
  5. 78 0
      src/main/java/info/aspirecn/cloud/yysj/config/ElasticSearchConfig.java
  6. 22 0
      src/main/java/info/aspirecn/cloud/yysj/config/JsonConfig.java
  7. 48 0
      src/main/java/info/aspirecn/cloud/yysj/config/SwaggerConfig.java
  8. 24 0
      src/main/java/info/aspirecn/cloud/yysj/config/TypeCode2Name.java
  9. 76 0
      src/main/java/info/aspirecn/cloud/yysj/controller/CarController.java
  10. 100 0
      src/main/java/info/aspirecn/cloud/yysj/controller/GlobalExceptionHandler.java
  11. 46 0
      src/main/java/info/aspirecn/cloud/yysj/entity/Car.java
  12. 75 0
      src/main/java/info/aspirecn/cloud/yysj/entity/CarInfo.java
  13. 46 0
      src/main/java/info/aspirecn/cloud/yysj/entity/CarQueryParam.java
  14. 18 0
      src/main/java/info/aspirecn/cloud/yysj/entity/ResponseInfo.java
  15. 18 0
      src/main/java/info/aspirecn/cloud/yysj/entity/User.java
  16. 25 0
      src/main/java/info/aspirecn/cloud/yysj/entity/UserInfo.java
  17. 22 0
      src/main/java/info/aspirecn/cloud/yysj/service/CarSercice.java
  18. 232 0
      src/main/java/info/aspirecn/cloud/yysj/service/impl/CarSerciceImpl.java
  19. 11 0
      src/main/java/info/aspirecn/cloud/yysj/utils/Constant.java
  20. 73 0
      src/main/java/info/aspirecn/cloud/yysj/utils/DateUtil.java
  21. 94 0
      src/main/java/info/aspirecn/cloud/yysj/utils/ElasticSearchUitls.java
  22. 175 0
      src/main/resources/application.yaml
  23. 40 0
      src/main/resources/bootstrap.yml

+ 82 - 0
deploy/cloud-yysj-car-query.yaml

@@ -0,0 +1,82 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: cloud-yysj-car-query
+  labels:
+    app: cloud-yysj-car-query
+    svcEndpoints: actuator
+spec:
+  type: NodePort
+  ports:
+    - name: server
+      port: 8080
+      targetPort: 8080
+    - name: management
+      port: 8081
+      targetPort: 8081
+  selector:
+    app: cloud-yysj-car-query
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: cloud-yysj-car-query
+  labels:
+    app: cloud-yysj-car-query
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: cloud-yysj-car-query
+  template:
+    metadata:
+      name: cloud-yysj-car-query
+      labels:
+        app: cloud-yysj-car-query
+    spec:
+      restartPolicy: Always
+      containers:
+      - name: service-provider
+        image: hub.i139.cn/cloud-yysj/cloud-yysj-car-query:1.0.0
+        imagePullPolicy: IfNotPresent
+        ports:
+        - name: server
+          containerPort: 8080
+        - name: management
+          containerPort: 8081
+        env:
+        - name: KUBERNETES_NAMESPACE
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: POD_NAME
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.name
+        - name: JAVA_OPTS
+          value: ""
+        - name: APP_OPTS
+          value: ""
+        resources:
+          limits:
+            memory: 1000Mi
+            cpu: 2000m
+          requests:
+            memory: 256Mi
+            cpu: 1000m
+        readinessProbe:
+          initialDelaySeconds: 20
+          periodSeconds: 5
+          timeoutSeconds: 10
+          failureThreshold: 5
+          httpGet:
+            path: /actuator/health
+            port: 8081
+        livenessProbe:
+          initialDelaySeconds: 60
+          periodSeconds: 5
+          timeoutSeconds: 5
+          failureThreshold: 3
+          httpGet:
+            path: /actuator/health
+            port: 8081

+ 190 - 0
deploy/config-map-dev.yaml

@@ -0,0 +1,190 @@
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: cloud-yysj-car-query
+data:
+  application.yaml: |-
+    spring:
+      datasource:
+        username: root
+        password: 123456
+        url: jdbc:mysql://10.8.17.119:32196/cloud-yysj?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+        driver-class-name: com.mysql.cj.jdbc.Driver
+    redis:
+      host: 10.8.17.119
+      port: 32042
+      database: 3
+      timeout: 1000
+      password:
+      lettuce:
+        pool:
+          max-active: 20
+          max-wait: -1
+          min-idle: 0
+          max-idle: 10
+    elasticsearch:
+      schema: http
+      address: 10.8.17.119:32482
+      connectTimeout: 5000
+      socketTimeout: 5000
+      connectionRequestTimeout: 5000
+      maxConnectNum: 100
+      maxConnectPerRoute: 100
+      firstIndex: access-yysj-gateway-first-log-cloud-yysj*
+      secondIndex: access-yysj-gateway-second-log-cloud-yysj*
+
+    product:
+      drivingLicenseCheckProductId: 1
+      transportationLicenseCheckProductId: 4
+      carIntoTheNetCheckProductId: 6
+      
+    logging:
+      level.info.aspirecn.cloud.yysj.service: info
+
+    #类型代码转名称
+    toname:
+      #车辆类型代码对应名称
+      cartype:
+        H10: 重型货车
+        H11: 重型普通货车
+        H12: 重型厢式货车
+        H13: 重型封闭货车
+        H14: 重型罐式货车
+        H15: 重型平板货车
+        H16: 重型集装厢车
+        H17: 重型自卸货车
+        H18: 重型特殊结构货车
+        H19: 重型仓栅式货车
+        H20: 中型货车
+        H21: 中型普通货车
+        H22: 中型厢式货车
+        H23: 中型封闭货车
+        H24: 中型罐式货车
+        H25: 中型平板货车
+        H26: 中型集装厢车
+        H27: 中型自卸货车
+        H28: 中型特殊结构货车
+        H29: 中型仓栅式货车
+        H30: 轻型货车
+        H31: 轻型普通货车
+        H32: 轻型厢式货车
+        H33: 轻型封闭货车
+        H34: 轻型罐式货车
+        H35: 轻型平板货车
+        H37: 轻型自卸货车
+        H38: 轻型特殊结构货车
+        H39: 轻型仓栅式货车
+        H40: 微型货车
+        H41: 微型普通货车
+        H42: 微型厢式货车
+        H43: 微型封闭货车
+        H44: 微型罐式货车
+        H45: 微型自卸货车
+        H46: 微型特殊结构货车
+        H47: 微型仓栅式货车
+        H50: 低速货车
+        H51: 普通低速货车
+        H52: 厢式低速货车
+        H53: 罐式低速货车
+        H54: 自卸低速货车
+        H55: 仓栅式低速货车
+        Q10: 重型牵引车
+        Q11: 重型半挂牵引车
+        Q12: 重型全挂牵引车
+        Q20: 中型牵引车
+        Q21: 中型半挂牵引车
+        Q22: 中型全挂牵引车
+        Q30: 轻型牵引车
+        Q31: 轻型半挂牵引车
+        Q32: 轻型全挂牵引车
+        Z11: 大型专项作业车
+        Z21: 中型专项作业车
+        Z31: 小型专项作业车
+        Z41: 微型专项作业车
+        Z51: 重型专项作业车
+        Z71: 轻型专项作业车
+        D11: 无轨电车
+        D12: 有轨电车
+        M10: 三轮摩托车
+        M11: 普通正三轮摩托车
+        M12: 轻便正三轮摩托车
+        M13: 正三轮载客摩托车
+        M14: 正三轮载货摩托车
+        M15: 侧三轮摩托车
+        M20: 二轮摩托车
+        M21: 普通二轮摩托车
+        M22: 轻便二轮摩托车
+        N11: 三轮汽车
+        T11: 大型轮式拖拉机
+        T20: 小型拖拉机
+        T21: 小型轮式拖拉机
+        T22: 手扶拖拉机
+        T23: 手扶变形运输机
+        J11: 轮式装载机械
+        J12: 轮式挖掘机械
+        J13: 轮式平地机械
+        G10: 重型全挂车
+        G11: 重型普通全挂车
+        G12: 重型厢式全挂车
+        G13: 重型罐式全挂车
+        G14: 重型平板全挂车
+        G15: 重型集装箱全挂车
+        G16: 重型自卸全挂车
+        G17: 重型仓栅式全挂车
+        G18: 重型旅居全挂车
+        G19: 重型专项作业全挂车
+        G20: 中型全挂车
+        G21: 中型普通全挂车
+        G22: 中型厢式全挂车
+        G23: 中型罐式全挂车
+        G24: 中型平板全挂车
+        G25: 中型集装箱全挂车
+        G26: 中型自卸全挂车
+        G27: 中型仓栅式全挂车
+        G28: 中型旅居全挂车
+        G29: 中型专项作业全挂车
+        G30: 轻型全挂车
+        G31: 轻型普通全挂车
+        G32: 轻型厢式全挂车
+        G33: 轻型罐式全挂车
+        G34: 轻型平板全挂车
+        G35: 轻型自卸全挂车
+        G36: 轻型仓栅式全挂车
+        G37: 轻型旅居全挂车
+        G38: 轻型专项作业全挂车
+        B10: 重型半挂车
+        B11: 重型普通半挂车
+        B12: 重型厢式半挂车
+        B13: 重型罐式半挂车
+        B14: 重型平板半挂车
+        B15: 重型集装箱半挂车
+        B16: 重型自卸半挂车
+        B17: 重型特殊结构半挂车
+        B18: 重型仓栅式半挂车
+        B19: 重型旅居半挂车
+        B1A: 重型专项作业半挂车
+        B1B: 重型低平板半挂车
+        B20: 中型半挂车
+        B21: 中型普通半挂车
+        B22: 中型厢式半挂车
+        B23: 中型罐式半挂车
+        B24: 中型平板半挂车
+        B25: 中型集装箱半挂车
+        B26: 中型自卸半挂车
+        B27: 中型特殊结构半挂车
+        B28: 中型仓栅式半挂车
+        B29: 中型旅居半挂车
+        B2A: 中型专项作业半挂车
+        B2B: 中型低平板半挂车
+        B30: 轻型半挂车
+        B31: 轻型普通半挂车
+        B32: 轻型厢式半挂车
+        B33: 轻型罐式半挂车
+        B34: 轻型平板半挂车
+        B35: 轻型自卸半挂车
+        B36: 轻型仓栅式半挂车
+        B37: 轻型旅居半挂车
+        B38: 轻型专项作业半挂车
+        B39: 轻型低平板半挂车
+        X99: 其他
+

+ 141 - 0
pom.xml

@@ -0,0 +1,141 @@
+<?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 https://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.2.2.RELEASE</version>
+    </parent>
+
+    <groupId>info.aspirecn.cloud.yysj</groupId>
+    <artifactId>cloud-yysj-car-query</artifactId>
+    <version>1.0.3</version>
+    <name>cloud-yysj-car-query</name>
+    <description>cloud yysj platform analysis information</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
+        </dependency>
+        <!--actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>swagger-bootstrap-ui</artifactId>
+            <version>1.9.6</version>
+        </dependency>
+        <!--elasticsearch-->
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>6.5.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>6.5.4</version>
+        </dependency>
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.67</version>
+        </dependency>
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <!--设置应用 Main 参数启动依赖查找的地址指向外部 lib 文件夹-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <!--设置 SpringBoot 打包插件不包含任何 Jar 依赖包-->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includes>
+                        <include>
+                            <groupId>nothing</groupId>
+                            <artifactId>nothing</artifactId>
+                        </include>
+                    </includes>
+                </configuration>
+            </plugin>
+            <!--设置将 lib 拷贝到应用 Jar 外面-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
src/main/java/info/aspirecn/cloud/yysj/Application.java

@@ -0,0 +1,18 @@
+package info.aspirecn.cloud.yysj;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@EnableSwagger2
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+		
+		
+		
+    }
+
+}

+ 78 - 0
src/main/java/info/aspirecn/cloud/yysj/config/ElasticSearchConfig.java

@@ -0,0 +1,78 @@
+package info.aspirecn.cloud.yysj.config;
+
+import org.apache.http.HttpHost;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Configuration
+public class ElasticSearchConfig {
+
+    /** 协议 */
+    @Value("${elasticsearch.schema}")
+    private String schema = "http";
+
+    /** 集群地址,如果有多个用“,”隔开 */
+    @Value("${elasticsearch.address}")
+    private String address;
+
+    /** 连接超时时间 */
+    @Value("${elasticsearch.connectTimeout:5000}")
+    private int connectTimeout;
+
+    /** Socket 连接超时时间 */
+    @Value("${elasticsearch.socketTimeout:10000}")
+    private int socketTimeout;
+
+    /** 获取连接的超时时间 */
+    @Value("${elasticsearch.connectionRequestTimeout:5000}")
+    private int connectionRequestTimeout;
+
+    /** 最大连接数 */
+    @Value("${elasticsearch.maxConnectNum:100}")
+    private int maxConnectNum;
+
+    /** 最大路由连接数 */
+    @Value("${elasticsearch.maxConnectPerRoute:100}")
+    private int maxConnectPerRoute;
+
+    @Bean
+    public RestHighLevelClient restHighLevelClient() {
+        // 拆分地址
+        List<HttpHost> hostLists = new ArrayList<>();
+        String[] hostList = address.split(",");
+        for (String addr : hostList) {
+            String host = addr.split(":")[0];
+            String port = addr.split(":")[1];
+            hostLists.add(new HttpHost(host, Integer.parseInt(port), schema));
+        }
+        // 转换成 HttpHost 数组
+        HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{});
+        // 构建连接对象
+        RestClientBuilder builder = RestClient.builder(httpHost);
+        // 异步连接延时配置
+        builder.setRequestConfigCallback(requestConfigBuilder -> {
+            requestConfigBuilder.setConnectTimeout(connectTimeout);
+            requestConfigBuilder.setSocketTimeout(socketTimeout);
+            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
+            return requestConfigBuilder;
+        });
+        // 异步连接数配置
+        builder.setHttpClientConfigCallback(httpClientBuilder -> {
+            httpClientBuilder.setMaxConnTotal(maxConnectNum);
+            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
+            return httpClientBuilder;
+        });
+        return new RestHighLevelClient(builder);
+    }
+
+}

+ 22 - 0
src/main/java/info/aspirecn/cloud/yysj/config/JsonConfig.java

@@ -0,0 +1,22 @@
+package info.aspirecn.cloud.yysj.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+public class JsonConfig {
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 不转换值null的字段
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        return objectMapper;
+    }
+
+}

+ 48 - 0
src/main/java/info/aspirecn/cloud/yysj/config/SwaggerConfig.java

@@ -0,0 +1,48 @@
+package info.aspirecn.cloud.yysj.config;
+
+import com.google.common.base.Predicates;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+/**
+ * Swagger 配置
+ *
+ * @author dingliqiang
+ */
+@Configuration
+public class SwaggerConfig {
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                // 项目组名
+                .apiInfo(apiInfo())
+                // 选择那些路径和api会生成document
+                .select()
+                // 对所有api进行监控
+                .apis(RequestHandlerSelectors.any())
+                // 对所有路径进行监控
+                .paths(PathSelectors.any())
+                //错误路径不监控
+                .paths(Predicates.not(PathSelectors.regex("/error.*")))
+                //actuator路径跳过
+                .paths(Predicates.not(PathSelectors.regex("/actuator.*")))
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                // 文档标题
+                .title("swagger-example-service")
+                // 文档描述
+                .description("This is a swagger project.")
+                // 文档版本
+                .version("1.0.0")
+                .build();
+    }
+}

+ 24 - 0
src/main/java/info/aspirecn/cloud/yysj/config/TypeCode2Name.java

@@ -0,0 +1,24 @@
+package info.aspirecn.cloud.yysj.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "toname")
+public class TypeCode2Name {
+
+    private Map<String, String> cartype = new HashMap<>();
+
+    public String carTypeCode2Name( String code){
+        return cartype.get(code);
+    }
+
+}

+ 76 - 0
src/main/java/info/aspirecn/cloud/yysj/controller/CarController.java

@@ -0,0 +1,76 @@
+package info.aspirecn.cloud.yysj.controller;
+
+import info.aspirecn.cloud.yysj.entity.CarQueryParam;
+import info.aspirecn.cloud.yysj.entity.ResponseInfo;
+import info.aspirecn.cloud.yysj.entity.Car;
+import info.aspirecn.cloud.yysj.entity.CarInfo;
+import info.aspirecn.cloud.yysj.service.CarSercice;
+import info.aspirecn.cloud.yysj.utils.Constant;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 查询车辆列表、车辆详情,接口
+ *
+ * @author lixinxu
+ */
+@Api(tags = "车辆查询接口")
+@ApiResponses({
+        @ApiResponse(code = 200, message = "成功处理请求"),
+        @ApiResponse(code = 400, message = "没有找到该用户信息"),
+        @ApiResponse(code = 401, message = "没有权限访问该服务"),
+        @ApiResponse(code = 403, message = "权限不足无法访问该服务"),
+        @ApiResponse(code = 404, message = "未发现该微服务"),
+        @ApiResponse(code = 500, message = "服务器内部错误")
+})
+@RestController
+public class CarController {
+
+    @Autowired
+    CarSercice carSercice;
+
+    @ApiOperation(value = "车辆列表", notes = "查询车辆信息列表")
+    @PostMapping("/querycar")
+    private ResponseInfo queryCarList(HttpServletResponse response,
+                                      @ApiParam(value="用户ID")@RequestHeader()  String userId,
+                                      @RequestBody CarQueryParam carQueryParam){
+
+        carQueryParam.setUserId(userId);
+        carQueryParam.setBeginTime(carQueryParam.getBeginTime());
+        carQueryParam.setEndTime(carQueryParam.getEndTime());
+        carQueryParam.setPageSize(carQueryParam.getPageSize());
+        carQueryParam.setPageNum(carQueryParam.getPageNum());
+
+        ResponseInfo responseInfo = new ResponseInfo();
+        //map里有数据列表和查询总条数
+        Map<String, Object> reMap = carSercice.queryCarList(carQueryParam);
+        if (reMap == null){
+            responseInfo.setMessage("数据深度不能大于1000条");
+            return responseInfo;
+        }
+
+        List<Car> carList = (List<Car>)reMap.get(Constant.DATA_LIST);
+        int total = (int) reMap.get(Constant.TOTAL);
+
+        //页面信息, 放到响应头
+        response.addHeader("pageSize", Integer.toString(carQueryParam.getPageSize()));
+        response.addHeader("pageNum", Integer.toString(carQueryParam.getPageNum()));
+        response.addHeader("pageTotal", Integer.toString(total%carQueryParam.getPageSize() > 0 ? total/carQueryParam.getPageSize()+1 : total/carQueryParam.getPageSize()));
+        response.addHeader("total", Integer.toString(total));
+
+        return new ResponseInfo().setData(carList);
+    }
+
+    @ApiOperation(value = "车辆详情", notes = "查询车辆详情")
+    @GetMapping("/querycarinfo/{carId}")
+    private ResponseInfo queryCarInfo(@PathVariable(required = true) String carId){
+        CarInfo carInfo = carSercice.queryCarInfo(carId);
+        return new ResponseInfo().setData(carInfo);
+    }
+
+}

+ 100 - 0
src/main/java/info/aspirecn/cloud/yysj/controller/GlobalExceptionHandler.java

@@ -0,0 +1,100 @@
+package info.aspirecn.cloud.yysj.controller;
+
+import info.aspirecn.cloud.yysj.entity.ResponseInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingRequestHeaderException;
+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 org.springframework.web.bind.annotation.ResponseStatus;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 全局异常处理器
+ *
+ * @author dingliqiang
+ */
+@Slf4j
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    /**
+     * 全局异常处理器
+     *
+     * @param e 异常信息
+     */
+    @ResponseBody
+    @ExceptionHandler(Exception.class)
+    public ResponseInfo exceptionHandler(Exception e, HttpServletResponse response) {
+        log.error("", e);
+        if (e instanceof Exception) {
+            //response.setStatus(400);
+            return new ResponseInfo().setMessage("系统异常").setData("");
+        } else if (e instanceof MissingRequestHeaderException) {
+            return new ResponseInfo().setMessage("Header 参数 token 不能为空").setData("");
+        } else if (e instanceof MissingServletRequestParameterException){
+            return new ResponseInfo().setMessage("Header 参数 token 不能为空").setData("");
+        }
+        response.setStatus(503);
+        return new ResponseInfo().setMessage("系统繁忙,请稍后再试").setData("");
+    }
+
+    /**
+     * 忽略参数异常处理器
+     *
+     * @param e 忽略参数异常
+     * @return ResponseResult
+     */
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    public ResponseInfo parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
+        log.error("", e);
+        return new ResponseInfo().setMessage("请求参数 " + e.getParameterName() + " 不能为空").setData("");
+    }
+
+    /**
+     * 缺少请求体异常处理器
+     *
+     * @param e 缺少请求体异常
+     * @return ResponseResult
+     */
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    public ResponseInfo parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
+        log.error("", e);
+        return new ResponseInfo().setMessage("参数体不能为空").setData("");
+    }
+
+    /**
+     * 参数效验异常处理器
+     *
+     * @param e 参数验证异常
+     * @return ResponseInfo
+     */
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseInfo parameterExceptionHandler(MethodArgumentNotValidException e) {
+        log.error("", e);
+        // 获取异常信息
+        BindingResult exceptions = e.getBindingResult();
+        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
+        if (exceptions.hasErrors()) {
+            List<ObjectError> errors = exceptions.getAllErrors();
+            if (!errors.isEmpty()) {
+                // 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
+                FieldError fieldError = (FieldError) errors.get(0);
+                return new ResponseInfo().setMessage(fieldError.getDefaultMessage()).setData("");
+            }
+        }
+        return new ResponseInfo().setMessage("请求参数错误").setData("");
+    }
+
+}

+ 46 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/Car.java

@@ -0,0 +1,46 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.Value;
+import lombok.experimental.Accessors;
+import org.elasticsearch.common.recycler.Recycler;
+
+/**
+ * 车辆信息,列表查询
+ *
+ * @author lixinxu
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class Car {
+
+    @ApiModelProperty(value = "编号")
+    private	String	id;
+
+    @ApiModelProperty(value = "车牌号")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "车牌号颜色")
+    private	String	carNumColor;
+
+    @ApiModelProperty(value = "车辆类型")
+    private	String	carType;
+
+    @ApiModelProperty(value = "行驶证核验, 0: 未核验; 1: 一致; 2: 不一致; 3: 其他")
+    private	String	drivingLicenseCheck;
+
+    @ApiModelProperty(value = "运输证核验结果, 0: 未核验; 1: 一致; 2: 不一致; 3: 其他")
+    private	String	transportationLicenseCheck;
+
+    @ApiModelProperty(value = "车辆入网核验结果, 0: 未核验; 1: 一致; 2: 不一致; 3: 其他")
+    private	String	carIntoTheNetCheck;
+
+    @ApiModelProperty(value = "请求时间")
+    private	String	requestTime;
+}

+ 75 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/CarInfo.java

@@ -0,0 +1,75 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 车辆详情
+ *
+ * @author lixinxu
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class CarInfo {
+
+    @ApiModelProperty(value = "车牌号")
+    @JsonAlias("VehicleNumber")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "车牌颜色")
+    @JsonAlias("VehiclePlateColorCode")
+    private	String	carNumColor;
+
+    @ApiModelProperty(value = "车辆类型")
+    @JsonAlias("VehicleType")
+    private	String	carType;
+
+    @ApiModelProperty(value = "所有人")
+    @JsonAlias("Owner")
+    private	String	owner;
+
+    @ApiModelProperty(value = "使用性质")
+    @JsonAlias("UseCharacter")
+    private	String	useNature;
+
+    @ApiModelProperty(value = "车辆识别代码")
+    @JsonAlias("VIN")
+    private	String	carCode;
+
+    @ApiModelProperty(value = "发证机关")
+    @JsonAlias("IssuingOrganizations")
+    private	String	issuing;
+
+    @ApiModelProperty(value = "注册日期")
+    @JsonAlias("RegisterDate")
+    private	String	registrationDate;
+
+    @ApiModelProperty(value = "发证日期")
+    @JsonAlias("IssueDate")
+    private	String	dateOfIssue;
+
+    @ApiModelProperty(value = "车辆能源类型")
+    @JsonAlias("VehicleEnergyType")
+    private	String	energyType;
+
+    @ApiModelProperty(value = "核定载质量(吨)")
+    @JsonAlias("VehicleTonnage")
+    private	double	load;
+
+    @ApiModelProperty(value = "总质量(吨)")
+    @JsonAlias("GrossMass")
+    private	double	totalWeight;
+
+    @ApiModelProperty(value = "道路运输证号")
+    @JsonAlias("RoadTransportCertificateNumber")
+    private	String	roadTransportCertificateNo;
+
+
+}

+ 46 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/CarQueryParam.java

@@ -0,0 +1,46 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import info.aspirecn.cloud.yysj.utils.DateUtil;
+import lombok.Data;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Data
+public class CarQueryParam {
+
+    private String userId;
+    private String carNum;
+    private String carNumColor;
+    private String drivingLicenseCheck;
+    private String transportationLicenseCheck;
+    private String carIntoTheNetCheck;
+    private String beginTime;
+    private String endTime;
+    private int pageSize;
+    private int pageNum;
+
+    public void setBeginTime(String beginTime) {
+        //开始时间缺省为10天前
+        this.beginTime = beginTime == null || "".equals(beginTime) ? DateUtil.getBeforTimeES(10) : beginTime;
+    }
+
+    public void setEndTime(String endTime) {
+        //结束时间缺省为当前时间
+        this.endTime = endTime == null || "".equals(endTime) ? DateUtil.getStrTimeES() : endTime;
+        //结束时间为yyyy-MM-dd时, 加上HH:mm:ss(23:59:59), 覆盖到结束日期当天
+        if(this.endTime.length() == 10){
+            this.endTime = this.endTime+"T17:31:51.171+0800";
+        }
+    }
+
+    public void setPageSize(Integer pageSize) {
+        //每页条数, 缺省为 10
+        this.pageSize = pageSize != null && pageSize != 0 ? pageSize : 10;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum != null && pageNum != 0  ? pageNum : 1;
+    }
+}

+ 18 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/ResponseInfo.java

@@ -0,0 +1,18 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author lixinxu
+ */
+@Data
+@Accessors(chain = true)
+public class ResponseInfo {
+
+    /** 错误信息*/
+    private String message = "";
+    /** 返回结果*/
+    private Object data = "";
+
+}

+ 18 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/User.java

@@ -0,0 +1,18 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@ToString
+public class User {
+
+    private String id;
+    private String name;
+    private Integer age;
+    private String username;
+
+}

+ 25 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/UserInfo.java

@@ -0,0 +1,25 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.Date;
+
+@Data
+@ToString
+public class UserInfo {
+    /** 姓名 */
+    private String name;
+    /** 地址 */
+    private String address;
+    /** 岁数 */
+    private Integer age;
+    /** 工资 */
+    private Float salary;
+    /** 出生日期 */
+    private String birthDate;
+    /** 备注信息 */
+    private String remark;
+    /** 创建时间 */
+    private Date createTime;
+}

+ 22 - 0
src/main/java/info/aspirecn/cloud/yysj/service/CarSercice.java

@@ -0,0 +1,22 @@
+package info.aspirecn.cloud.yysj.service;
+
+import info.aspirecn.cloud.yysj.entity.Car;
+import info.aspirecn.cloud.yysj.entity.CarInfo;
+import info.aspirecn.cloud.yysj.entity.CarQueryParam;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+public interface CarSercice {
+
+    /**查询车辆列表*/
+    public Map<String, Object> queryCarList(CarQueryParam carQueryParam);
+
+    /**查询车辆详情*/
+    CarInfo queryCarInfo(String carId);
+}

+ 232 - 0
src/main/java/info/aspirecn/cloud/yysj/service/impl/CarSerciceImpl.java

@@ -0,0 +1,232 @@
+package info.aspirecn.cloud.yysj.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import info.aspirecn.cloud.yysj.config.TypeCode2Name;
+import info.aspirecn.cloud.yysj.entity.Car;
+import info.aspirecn.cloud.yysj.entity.CarInfo;
+import info.aspirecn.cloud.yysj.entity.CarQueryParam;
+import info.aspirecn.cloud.yysj.service.CarSercice;
+import info.aspirecn.cloud.yysj.utils.Constant;
+import info.aspirecn.cloud.yysj.utils.DateUtil;
+import info.aspirecn.cloud.yysj.utils.ElasticSearchUitls;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.search.sort.SortOrder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Slf4j
+@Service
+public class CarSerciceImpl implements CarSercice {
+
+    /** 主订单索引 */
+    @Value("${elasticsearch.firstIndex}")
+    private String firstIndex;
+
+    /** 子订单索引 */
+    @Value("${elasticsearch.secondIndex}")
+    private String secondIndex;
+
+    /** 车辆行驶证验证产品编号 */
+    @Value("${product.drivingLicenseCheckProductId}")
+    private String drivingLicenseCheckProductId;
+
+    /** 车辆运输许可证验证产品编号 */
+    @Value("${product.transportationLicenseCheckProductId}")
+    private String transportationLicenseCheckProductId;
+
+    /** 车辆入网验证产品编号 */
+    @Value("${product.carIntoTheNetCheckProductId}")
+    private String carIntoTheNetCheckProductId;
+
+    @Autowired
+    ElasticSearchUitls elasticSearchUitls;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @Autowired
+    private TypeCode2Name typeCode2Name;
+
+    /**
+     * 查询车辆列表
+     *
+     * @param carQueryParam
+     */
+    @Override
+    public Map<String, Object> queryCarList(CarQueryParam carQueryParam) {
+
+        //数据深度不能大于1000条
+        if((carQueryParam.getPageNum() * carQueryParam.getPageSize()) > 1000){
+            return null;
+        }
+        // 创建 Bool 查询构建器
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        // 构建查询条件
+        if(carQueryParam.getUserId() != null && !"".equals(carQueryParam.getUserId())){
+            boolQueryBuilder.must(QueryBuilders.termsQuery("MG-UserId.keyword",carQueryParam.getUserId()));
+        }
+        if(carQueryParam.getCarNum() != null && !"".equals(carQueryParam.getCarNum())){
+            boolQueryBuilder.must(QueryBuilders.wildcardQuery("RequestInfo.VehicleNumber.keyword","*"+carQueryParam.getCarNum()+"*"));
+        }
+        if(carQueryParam.getCarNumColor() != null && !"".equals(carQueryParam.getCarNumColor())){
+            boolQueryBuilder.must(QueryBuilders.termsQuery("RequestInfo.VehiclePlateColorCode.keyword",carQueryParam.getCarNumColor()));
+        }
+        if (carQueryParam.getDrivingLicenseCheck()!= null && !"".equals(carQueryParam.getDrivingLicenseCheck())) {
+	       	 boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.result.keyword",carQueryParam.getDrivingLicenseCheck()));
+	       	 boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.productId.keyword",drivingLicenseCheckProductId));
+		}
+        if (carQueryParam.getTransportationLicenseCheck()!= null && !"".equals(carQueryParam.getTransportationLicenseCheck())) {
+	       	 boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.result.keyword",carQueryParam.getTransportationLicenseCheck()));
+	       	 boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.productId.keyword",transportationLicenseCheckProductId));
+		}
+        boolQueryBuilder.must(QueryBuilders.termsQuery("URI.keyword","/info_check/carInfo.do"));
+        boolQueryBuilder.filter().add(QueryBuilders.rangeQuery("DateTime")
+                                 .gte(carQueryParam.getBeginTime()).lte(carQueryParam.getEndTime()));
+
+        // 构建查询源构建器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        searchSourceBuilder.query(boolQueryBuilder);
+        searchSourceBuilder.sort("DateTime", SortOrder.DESC);
+        searchSourceBuilder.size(1000);
+
+        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
+        searchSourceBuilder.fetchSource(new String[]{"RequestInfo.VehicleNumber", "RequestInfo.VehiclePlateColorCode",
+                                                    "RequestInfo.VehicleType", "DateTime", "Check-Reuslt"}, null);
+
+        // 创建查询请求对象,将查询对象配置到其中
+        SearchRequest searchRequest = new SearchRequest(firstIndex);
+        searchRequest.source(searchSourceBuilder);
+
+
+        // 返回集合
+        Map<String, Object> resultMap = new HashMap<String, Object>();
+        List<Car> carList = new ArrayList<Car>();
+        int total = 0;
+
+        //获取数据
+        SearchHits hits = elasticSearchUitls.getResultHits(searchRequest);
+        if(hits == null){
+            resultMap.put(Constant.DATA_LIST, carList);
+            resultMap.put(Constant.TOTAL, 0);
+            return resultMap;
+        }
+
+        //遍历数据, 加上核验结果条件, 计算总数, 分页
+        for (SearchHit hit : hits) {
+            String json = hit.getSourceAsString();
+            JSONObject jsonObject = JSONObject.parseObject(json);
+
+            //获取核验结果
+            String drivingLicenseCheck = "";
+            String transportationLicenseCheck = "";
+            String carIntoTheNetCheck = "";
+
+            JSONArray checkResjsonArray = jsonObject.getJSONArray("Check-Reuslt");
+            for(int i=0; i < checkResjsonArray.size(); i++){
+                JSONObject checkResObj = checkResjsonArray.getJSONObject(i);
+                if(drivingLicenseCheckProductId.equals(checkResObj.getString("productId"))){
+                    drivingLicenseCheck = checkResObj.getString("result");
+                } else if(transportationLicenseCheckProductId.equals(checkResObj.getString("productId"))){
+                    transportationLicenseCheck = checkResObj.getString("result");
+                } else if(carIntoTheNetCheckProductId.equals(checkResObj.getString("productId"))){
+                    carIntoTheNetCheck = checkResObj.getString("result");
+                }
+            }
+            //判断核验结果
+            if(carQueryParam.getDrivingLicenseCheck() != null
+               && !"".equals(carQueryParam.getDrivingLicenseCheck())
+               && !carQueryParam.getDrivingLicenseCheck().equals(drivingLicenseCheck)){
+               continue;
+            }
+            if(carQueryParam.getTransportationLicenseCheck() != null
+               && !"".equals(carQueryParam.getTransportationLicenseCheck())
+               && !carQueryParam.getTransportationLicenseCheck().equals(transportationLicenseCheck)){
+                continue;
+            }
+            if(carQueryParam.getCarIntoTheNetCheck() != null
+               && !"".equals(carQueryParam.getCarIntoTheNetCheck())
+               && !carQueryParam.getCarIntoTheNetCheck().equals(carIntoTheNetCheck)){
+                continue;
+            }
+
+            total++;
+
+            if(total > ((carQueryParam.getPageNum()-1) * carQueryParam.getPageSize()) && carList.size() < carQueryParam.getPageSize()){
+              	   Car car = new Car(); 
+                   car.setId(hit.getId());
+                   JSONObject riJsonObject = jsonObject.getJSONObject("RequestInfo");
+                   if (riJsonObject!=null) {
+                        car.setCarNum(riJsonObject.getString("VehicleNumber"));
+                        car.setCarNumColor(riJsonObject.getString("VehiclePlateColorCode"));
+                        car.setCarType(typeCode2Name.carTypeCode2Name(riJsonObject.getString("VehicleType")));
+                   }
+                   car.setRequestTime(DateUtil.esTime2MySQLTime(jsonObject.getString("DateTime")));
+                   car.setDrivingLicenseCheck(drivingLicenseCheck);
+                   car.setTransportationLicenseCheck(transportationLicenseCheck);
+                   car.setCarIntoTheNetCheck(carIntoTheNetCheck);
+                   carList.add(car);
+                   log.debug("车辆信息:{}", car);
+            }
+        }
+        resultMap.put(Constant.DATA_LIST, carList);
+        resultMap.put(Constant.TOTAL, total);
+        return resultMap;
+    }
+
+    /**
+     * 查询车辆详情
+     *
+     * @param carId
+     */
+    @Override
+    public CarInfo queryCarInfo(String carId) {
+
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        //搜索方式  根据id查询
+        searchSourceBuilder.query(QueryBuilders.termsQuery("_id",carId));
+        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
+        searchSourceBuilder.fetchSource(new String[]{"RequestInfo.VehicleNumber", "RequestInfo.VehiclePlateColorCode",
+                                                     "RequestInfo.VehicleType","RequestInfo.Owner", "RequestInfo.UseCharacter",
+                                                     "RequestInfo.VIN", "RequestInfo.IssuingOrganizations", "RequestInfo.RegisterDate",
+                                                     "RequestInfo.IssueDate", "RequestInfo.VehicleEnergyType", "RequestInfo.VehicleTonnage",
+                                                     "RequestInfo.GrossMass", "RequestInfo.RoadTransportCertificateNumber"},null);
+        //创建查询请求对象,将查询对象配置到其中
+        SearchRequest searchRequest = new SearchRequest(firstIndex);
+        searchRequest.source(searchSourceBuilder);
+        searchSourceBuilder.size(1);
+
+        //获取数据
+        SearchHits hits = elasticSearchUitls.getResultHits(searchRequest);
+        CarInfo carInfo = new CarInfo();
+        if(hits != null){
+            for (SearchHit hit : hits) {
+                String json = hit.getSourceAsString();
+                JSONObject jsonObject = JSONObject.parseObject(json);
+                String resStr = jsonObject.getString("RequestInfo");
+                try {
+                    carInfo = objectMapper.readValue(resStr, CarInfo.class);
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                }
+                return carInfo;
+            }
+        }
+        return carInfo;
+    }
+}

+ 11 - 0
src/main/java/info/aspirecn/cloud/yysj/utils/Constant.java

@@ -0,0 +1,11 @@
+package info.aspirecn.cloud.yysj.utils;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+public class Constant {
+    public static final String DATA_LIST = "dataList";
+    public static final String TOTAL = "total";
+
+}

+ 73 - 0
src/main/java/info/aspirecn/cloud/yysj/utils/DateUtil.java

@@ -0,0 +1,73 @@
+package info.aspirecn.cloud.yysj.utils;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.GregorianCalendar;
+
+//日期工具类
+public class DateUtil {
+
+	/**ES时间格式化对象*/
+	public static SimpleDateFormat sdfES = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX");
+
+	/**MySQL时间格式化对象*/
+	public static SimpleDateFormat sdfMySQL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	private DateUtil(){}
+
+	/**获取当前时间,格式化为MySQL时间*/
+	public static String getStrTimeMySQL() {
+		return sdfMySQL.format(new Date());
+	}
+
+	/**指定天数前时间,格式化为MySQL时间*/
+	public static String getBeforTimeMySQL(int d){
+		Date date = new Date();
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(calendar.DATE, -d);
+		date = calendar.getTime();
+		return sdfMySQL.format(date);
+	}
+
+	/**获取当前时间,格式化为ES时间*/
+	public static String getStrTimeES() {
+		return sdfES.format(new Date());
+	}
+
+	/**指定天数前时间,格式化为ES时间*/
+	public static String getBeforTimeES(int d){
+		Date date = new Date();
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(calendar.DATE, -d);
+		date = calendar.getTime();
+		return sdfES.format(date);
+	}
+
+	/**将ES时间格式化为MySQL时间*/
+	public static String esTime2MySQLTime(String esTime){
+		String reTime = "2000-01-01 00:00:00";
+		try {
+			Date time = sdfES.parse(esTime);
+			reTime = sdfMySQL.format(time);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return reTime;
+	}
+
+	/**将MySQL时间格式化为ES时间*/
+	public static String mysqlTime2ESTime(String mysqlTime){
+		String reTime = "2000-01-01T00:00:00.000+0800";
+		try {
+			Date time = sdfMySQL.parse(mysqlTime);
+			reTime = sdfES.format(time);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return reTime;
+	}
+}

+ 94 - 0
src/main/java/info/aspirecn/cloud/yysj/utils/ElasticSearchUitls.java

@@ -0,0 +1,94 @@
+package info.aspirecn.cloud.yysj.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.util.JSONPObject;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.rest.RestStatus;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class ElasticSearchUitls {
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    /**
+     * 获取查询结果
+     *
+     * @param searchRequest 查询请求对象
+     * @return 结果数据集合
+     */
+    public <T> Map<String, Object> getResult(SearchRequest searchRequest, Class<T> type) {
+        // 设置返回集合
+        Map<String, Object> resultMap = new HashMap<String, Object>();
+        List<T> list = new ArrayList<>();
+        //将数据放入map
+        resultMap.put(Constant.DATA_LIST, list);
+        resultMap.put(Constant.TOTAL, 0L);
+        // 使用 RestHighLevelClient 客户端进行请求
+        try {
+            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            // 根据状态和数据条数验证是否返回了数据
+            if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().totalHits > 0) {
+                //获取本页数据
+                SearchHits hits = searchResponse.getHits();
+                //将数据总条数放入map
+                resultMap.put(Constant.TOTAL, hits.totalHits);
+                for (SearchHit hit : hits) {
+                    // 将 JSON 转换成对象
+                    String hitStr = hit.getSourceAsString();
+                    T t = objectMapper.readValue(hit.getSourceAsString(), type);
+
+                    //如果有id字段, 存入id
+                    try {
+                        Field field = type.getDeclaredField("id");
+                        field.setAccessible(true);
+                        field.set(t, hit.getId());
+                    } catch (Exception e) {
+                    }
+
+                    // 加入到对象集合
+                    list.add(t);
+                }
+            }
+        } catch (IOException e) {
+            log.error("", e);
+        }
+        return resultMap;
+    }
+
+    public SearchHits getResultHits(SearchRequest searchRequest) {
+        // 使用 RestHighLevelClient 客户端进行请求
+        try {
+            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+            // 根据状态和数据条数验证是否返回了数据
+            if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().totalHits > 0) {
+                //获取本页数据
+                SearchHits hits = searchResponse.getHits();
+                return hits;
+            }
+        } catch (IOException e) {
+            log.error("", e);
+        }
+        return null;
+    }
+
+}

+ 175 - 0
src/main/resources/application.yaml

@@ -0,0 +1,175 @@
+# #mysql configuration
+# spring:
+#   profiles:
+#     active:
+#   application:
+#     name: cloud-yysj-car-query
+
+# #ES
+# elasticsearch:
+#   schema: http
+#   address: 10.8.17.119:32482
+#   connectTimeout: 5000
+#   socketTimeout: 5000
+#   connectionRequestTimeout: 5000
+#   maxConnectNum: 100
+#   maxConnectPerRoute: 100
+#   firstIndex: access-yysj-gateway-first-log-cloud-yysj*
+#   secondIndex: access-yysj-gateway-second-log-cloud-yysj*
+
+# #产品id
+# product:
+#   drivingLicenseCheckProductId: 1
+#   transportationLicenseCheckProductId: 4
+#   carIntoTheNetCheckProductId: 6
+
+# logging:
+#   level.info.aspirecn.cloud.yysj.service: info
+
+
+# #类型代码转名称
+# toname:
+#   #车辆类型代码对应名称
+#   cartype:
+#     H10: 重型货车
+#     H11: 重型普通货车
+#     H12: 重型厢式货车
+#     H13: 重型封闭货车
+#     H14: 重型罐式货车
+#     H15: 重型平板货车
+#     H16: 重型集装厢车
+#     H17: 重型自卸货车
+#     H18: 重型特殊结构货车
+#     H19: 重型仓栅式货车
+#     H20: 中型货车
+#     H21: 中型普通货车
+#     H22: 中型厢式货车
+#     H23: 中型封闭货车
+#     H24: 中型罐式货车
+#     H25: 中型平板货车
+#     H26: 中型集装厢车
+#     H27: 中型自卸货车
+#     H28: 中型特殊结构货车
+#     H29: 中型仓栅式货车
+#     H30: 轻型货车
+#     H31: 轻型普通货车
+#     H32: 轻型厢式货车
+#     H33: 轻型封闭货车
+#     H34: 轻型罐式货车
+#     H35: 轻型平板货车
+#     H37: 轻型自卸货车
+#     H38: 轻型特殊结构货车
+#     H39: 轻型仓栅式货车
+#     H40: 微型货车
+#     H41: 微型普通货车
+#     H42: 微型厢式货车
+#     H43: 微型封闭货车
+#     H44: 微型罐式货车
+#     H45: 微型自卸货车
+#     H46: 微型特殊结构货车
+#     H47: 微型仓栅式货车
+#     H50: 低速货车
+#     H51: 普通低速货车
+#     H52: 厢式低速货车
+#     H53: 罐式低速货车
+#     H54: 自卸低速货车
+#     H55: 仓栅式低速货车
+#     Q10: 重型牵引车
+#     Q11: 重型半挂牵引车
+#     Q12: 重型全挂牵引车
+#     Q20: 中型牵引车
+#     Q21: 中型半挂牵引车
+#     Q22: 中型全挂牵引车
+#     Q30: 轻型牵引车
+#     Q31: 轻型半挂牵引车
+#     Q32: 轻型全挂牵引车
+#     Z11: 大型专项作业车
+#     Z21: 中型专项作业车
+#     Z31: 小型专项作业车
+#     Z41: 微型专项作业车
+#     Z51: 重型专项作业车
+#     Z71: 轻型专项作业车
+#     D11: 无轨电车
+#     D12: 有轨电车
+#     M10: 三轮摩托车
+#     M11: 普通正三轮摩托车
+#     M12: 轻便正三轮摩托车
+#     M13: 正三轮载客摩托车
+#     M14: 正三轮载货摩托车
+#     M15: 侧三轮摩托车
+#     M20: 二轮摩托车
+#     M21: 普通二轮摩托车
+#     M22: 轻便二轮摩托车
+#     N11: 三轮汽车
+#     T11: 大型轮式拖拉机
+#     T20: 小型拖拉机
+#     T21: 小型轮式拖拉机
+#     T22: 手扶拖拉机
+#     T23: 手扶变形运输机
+#     J11: 轮式装载机械
+#     J12: 轮式挖掘机械
+#     J13: 轮式平地机械
+#     G10: 重型全挂车
+#     G11: 重型普通全挂车
+#     G12: 重型厢式全挂车
+#     G13: 重型罐式全挂车
+#     G14: 重型平板全挂车
+#     G15: 重型集装箱全挂车
+#     G16: 重型自卸全挂车
+#     G17: 重型仓栅式全挂车
+#     G18: 重型旅居全挂车
+#     G19: 重型专项作业全挂车
+#     G20: 中型全挂车
+#     G21: 中型普通全挂车
+#     G22: 中型厢式全挂车
+#     G23: 中型罐式全挂车
+#     G24: 中型平板全挂车
+#     G25: 中型集装箱全挂车
+#     G26: 中型自卸全挂车
+#     G27: 中型仓栅式全挂车
+#     G28: 中型旅居全挂车
+#     G29: 中型专项作业全挂车
+#     G30: 轻型全挂车
+#     G31: 轻型普通全挂车
+#     G32: 轻型厢式全挂车
+#     G33: 轻型罐式全挂车
+#     G34: 轻型平板全挂车
+#     G35: 轻型自卸全挂车
+#     G36: 轻型仓栅式全挂车
+#     G37: 轻型旅居全挂车
+#     G38: 轻型专项作业全挂车
+#     B10: 重型半挂车
+#     B11: 重型普通半挂车
+#     B12: 重型厢式半挂车
+#     B13: 重型罐式半挂车
+#     B14: 重型平板半挂车
+#     B15: 重型集装箱半挂车
+#     B16: 重型自卸半挂车
+#     B17: 重型特殊结构半挂车
+#     B18: 重型仓栅式半挂车
+#     B19: 重型旅居半挂车
+#     B1A: 重型专项作业半挂车
+#     B1B: 重型低平板半挂车
+#     B20: 中型半挂车
+#     B21: 中型普通半挂车
+#     B22: 中型厢式半挂车
+#     B23: 中型罐式半挂车
+#     B24: 中型平板半挂车
+#     B25: 中型集装箱半挂车
+#     B26: 中型自卸半挂车
+#     B27: 中型特殊结构半挂车
+#     B28: 中型仓栅式半挂车
+#     B29: 中型旅居半挂车
+#     B2A: 中型专项作业半挂车
+#     B2B: 中型低平板半挂车
+#     B30: 轻型半挂车
+#     B31: 轻型普通半挂车
+#     B32: 轻型厢式半挂车
+#     B33: 轻型罐式半挂车
+#     B34: 轻型平板半挂车
+#     B35: 轻型自卸半挂车
+#     B36: 轻型仓栅式半挂车
+#     B37: 轻型旅居半挂车
+#     B38: 轻型专项作业半挂车
+#     B39: 轻型低平板半挂车
+#     X99: 其他

+ 40 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,40 @@
+#ConfigMap 配置参数
+server:
+  port: 8080
+spring:
+  application:
+    name: cloud-yysj-car-query
+  cloud:
+    kubernetes:
+      reload:
+        enabled: true
+        mode: polling
+        strategy: refresh
+        monitoring-secrets: true
+        period: 10000
+      config:
+        enabled: true
+        enableApi: true
+        sources:
+          - namespace: cloud-yysj
+            name: ${spring.application.name}
+
+#监控配置参数
+management:
+  server:
+    port: 8081
+  endpoint:
+    restart:
+      enabled: true
+    health:
+      show-details: always
+  endpoints:
+    enabled-by-default: true
+    web:
+      exposure:
+        include: "*"
+
+info:
+  name: 车辆查询, 列表和详情
+  version: 1.0.0
+