소스 검색

first commit

15810770710@163.com 4 년 전
부모
커밋
3f1fe66e0b
32개의 변경된 파일1747개의 추가작업 그리고 0개의 파일을 삭제
  1. 82 0
      deploy/cloud-yysj-waybill-query.yaml
  2. 39 0
      deploy/config-map-dev.yaml
  3. 141 0
      pom.xml
  4. 17 0
      src/main/java/info/aspirecn/cloud/yysj/Application.java
  5. 79 0
      src/main/java/info/aspirecn/cloud/yysj/config/ElasticSearchConfig.java
  6. 21 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. 72 0
      src/main/java/info/aspirecn/cloud/yysj/controller/WaybillController.java
  9. 32 0
      src/main/java/info/aspirecn/cloud/yysj/entity/ActualCarrierInfo.java
  10. 9 0
      src/main/java/info/aspirecn/cloud/yysj/entity/CheckDetailLogObject.java
  11. 36 0
      src/main/java/info/aspirecn/cloud/yysj/entity/ConsigneeInfo.java
  12. 36 0
      src/main/java/info/aspirecn/cloud/yysj/entity/ConsignorInfo.java
  13. 28 0
      src/main/java/info/aspirecn/cloud/yysj/entity/EnterpriseInfo.java
  14. 18 0
      src/main/java/info/aspirecn/cloud/yysj/entity/ResponseInfo.java
  15. 35 0
      src/main/java/info/aspirecn/cloud/yysj/entity/VehicleInfo.java
  16. 59 0
      src/main/java/info/aspirecn/cloud/yysj/entity/Waybill.java
  17. 40 0
      src/main/java/info/aspirecn/cloud/yysj/entity/WaybillInfo.java
  18. 43 0
      src/main/java/info/aspirecn/cloud/yysj/entity/WaybillQueryParam.java
  19. 29 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/ActualCarrierInfo.java
  20. 32 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/ConsigneeInfo.java
  21. 32 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/ConsignorInfo.java
  22. 29 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/EnterpriseInfo.java
  23. 32 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/VehicleInfo.java
  24. 50 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/Waybill.java
  25. 41 0
      src/main/java/info/aspirecn/cloud/yysj/entity/response/WaybillInfo.java
  26. 19 0
      src/main/java/info/aspirecn/cloud/yysj/service/WaybillSercice.java
  27. 406 0
      src/main/java/info/aspirecn/cloud/yysj/service/impl/WaybillSerciceImpl.java
  28. 11 0
      src/main/java/info/aspirecn/cloud/yysj/utils/Constant.java
  29. 73 0
      src/main/java/info/aspirecn/cloud/yysj/utils/DateUtil.java
  30. 93 0
      src/main/java/info/aspirecn/cloud/yysj/utils/ElasticSearchUitls.java
  31. 25 0
      src/main/resources/application.yaml
  32. 40 0
      src/main/resources/bootstrap.yml

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

@@ -0,0 +1,82 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: cloud-yysj-waybill-query
+  labels:
+    app: cloud-yysj-waybill-query
+    svcEndpoints: actuator
+spec:
+  type: NodePort
+  ports:
+    - name: server
+      port: 8080
+      targetPort: 8080
+    - name: management
+      port: 8081
+      targetPort: 8081
+  selector:
+    app: cloud-yysj-waybill-query
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: cloud-yysj-waybill-query
+  labels:
+    app: cloud-yysj-waybill-query
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: cloud-yysj-waybill-query
+  template:
+    metadata:
+      name: cloud-yysj-waybill-query
+      labels:
+        app: cloud-yysj-waybill-query
+    spec:
+      restartPolicy: Always
+      containers:
+      - name: service-provider
+        image: hub.i139.cn/cloud-yysj/cloud-yysj-waybill-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

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

@@ -0,0 +1,39 @@
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: cloud-yysj-waybill-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*
+      
+    logging:
+      level.info.aspirecn.cloud.yysj.service: info
+
+

+ 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-waybill-query</artifactId>
+    <version>1.0.5</version>
+    <name>cloud-yysj-waybill-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>
+        <!--actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
+        </dependency>
+        <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>

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

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

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

@@ -0,0 +1,79 @@
+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);
+    }
+
+}

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

@@ -0,0 +1,21 @@
+package info.aspirecn.cloud.yysj.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * 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();
+    }
+}

+ 72 - 0
src/main/java/info/aspirecn/cloud/yysj/controller/WaybillController.java

@@ -0,0 +1,72 @@
+package info.aspirecn.cloud.yysj.controller;
+
+import info.aspirecn.cloud.yysj.entity.*;
+import info.aspirecn.cloud.yysj.service.WaybillSercice;
+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.ArrayList;
+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 WaybillController {
+
+    @Autowired
+    private WaybillSercice waybillSercice;
+
+    @ApiOperation(value = "运单列表", notes = "查询运单信息列表")
+    @PostMapping("/querywaybill")
+    private ResponseInfo queryWaybillList(HttpServletResponse response,
+                                          @ApiParam(value="用户ID")@RequestHeader()  String userId,
+                                          @RequestBody WaybillQueryParam waybillQueryParam){
+
+        waybillQueryParam.setUserId(userId);
+        waybillQueryParam.setBeginTime(waybillQueryParam.getBeginTime());
+        waybillQueryParam.setEndTime(waybillQueryParam.getEndTime());
+        waybillQueryParam.setPageSize(waybillQueryParam.getPageSize());
+        waybillQueryParam.setPageNum(waybillQueryParam.getPageNum());
+
+        //map里有数据列表和查询总条数
+        Map<String, Object> reMap = waybillSercice.queryWaybillList(waybillQueryParam);
+        if (reMap == null){
+            return new ResponseInfo().setMessage("数据深度不能大于1000条");
+        }
+
+        List<Waybill> waybillList = (List<Waybill>)reMap.get(Constant.DATA_LIST);
+        long total = (long)reMap.get(Constant.TOTAL);
+
+        //页面信息, 放到响应头
+        response.addHeader("pageSize", Integer.toString(waybillQueryParam.getPageSize()));
+        response.addHeader("pageNum", Integer.toString(waybillQueryParam.getPageNum()));
+        response.addHeader("pageTotal", Long.toString(total%waybillQueryParam.getPageSize() > 0 ? total/waybillQueryParam.getPageSize()+1 : total/waybillQueryParam.getPageSize()));
+        response.addHeader("total", Long.toString(total));
+
+        return new ResponseInfo().setData(waybillList);
+    }
+
+    @ApiOperation(value = "运单详情", notes = "查询运单详情")
+    @GetMapping("/querywaybillinfo/{waybillId}")
+    private ResponseInfo querywaybillinfo(@PathVariable(required = true) String waybillId){
+        WaybillInfo waybillInfo = waybillSercice.querywaybillinfo(waybillId);
+        return new ResponseInfo().setData(waybillInfo);
+    }
+
+}

+ 32 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/ActualCarrierInfo.java

@@ -0,0 +1,32 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+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 ActualCarrierInfo {
+
+    @ApiModelProperty(value = "实际承运人")
+    @JsonAlias(value = "ActualCarrierName")
+    private	String	actualCarrierName;
+
+    @ApiModelProperty(value = "道路运输许可证编号")
+    @JsonAlias(value = "ActualCarrierBusinessLicense")
+    private	String	actualCarrierBusinessLicense;
+
+    @ApiModelProperty(value = "实际承运人统一社会信用代码或证件号码")
+    @JsonAlias(value = "ActualCarrierID")
+    private	String	actualCarrierID;
+}

+ 9 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/CheckDetailLogObject.java

@@ -0,0 +1,9 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import lombok.Data;
+
+@Data
+public class CheckDetailLogObject {
+    private String productId;
+    private String result;
+}

+ 36 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/ConsigneeInfo.java

@@ -0,0 +1,36 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+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 ConsigneeInfo {
+
+    @ApiModelProperty(value = "收货方")
+    @JsonAlias(value = "Consignee")
+    private	String	consignee;
+
+    @ApiModelProperty(value = "收货方统一社会信用代码或证件号码")
+    @JsonAlias(value = "ConsigneeID")
+    private	String	consigneeID;
+
+    @ApiModelProperty(value = "收货地址")
+    @JsonAlias(value = "GoodsReceiptPlace")
+    private	String	goodsReceiptPlace;
+
+    @ApiModelProperty(value = "收货地行政区划。参照最新版《中华人民共和国行政区划代码》(GB/T 2260-2017),精确到区县。")
+    @JsonAlias(value = "CountrySubdivisionCode")
+    private	String	countrySubdivisionCode;
+}

+ 36 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/ConsignorInfo.java

@@ -0,0 +1,36 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+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 ConsignorInfo {
+
+    @ApiModelProperty(value = "托运人")
+    @JsonAlias(value = "Consignor")
+    private	String	consignor;
+
+    @ApiModelProperty(value = "托运人统一社会信用代码或证件号码")
+    @JsonAlias(value = "ConsignorID")
+    private	String	consignorID;
+
+    @ApiModelProperty(value = "装货地址")
+    @JsonAlias(value = "PlaceOfLoading")
+    private	String	placeOfLoading;
+
+    @ApiModelProperty(value = "装货地行政区划。参照最新版《中华人民共和国行政区划代码》(GB/T 2260-2017),精确到区县。")
+    @JsonAlias(value = "CountrySubdivisionCode")
+    private	String	countrySubdivisionCode;
+}

+ 28 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/EnterpriseInfo.java

@@ -0,0 +1,28 @@
+package info.aspirecn.cloud.yysj.entity;
+
+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 EnterpriseInfo {
+
+    @ApiModelProperty(value = "网络货运经营者名称")
+    private	String	carrierName;
+
+    @ApiModelProperty(value = "统一社会信用代码 ")
+    private	String	unifiedSocialCreditIdentifier;
+
+    @ApiModelProperty(value = "道路运输经营许可证编号")
+    private	String	permitNumber;
+}

+ 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 = "";
+
+}

+ 35 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/VehicleInfo.java

@@ -0,0 +1,35 @@
+package info.aspirecn.cloud.yysj.entity;
+
+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 VehicleInfo {
+
+    @ApiModelProperty(value = "车牌号")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "车牌号颜色")
+    private	String	carNumColor;
+
+    @ApiModelProperty(value = "驾驶员姓名")
+    private	String	driverName;
+
+    @ApiModelProperty(value = "机动车行驶证编号")
+    private	String	drivingLicenseNum;
+
+
+    @ApiModelProperty(value = "车辆入网")
+    private	String	drivingAccess="";
+}

+ 59 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/Waybill.java

@@ -0,0 +1,59 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+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 Waybill {
+
+    @ApiModelProperty(value = "编号")
+    private	String	id;
+
+    @ApiModelProperty(value = "运单号")
+    @JsonAlias(value = "RequestInfo.ShippingNoteNumber")
+    private	String	waybillNum;
+
+    @ApiModelProperty(value = "车牌号")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.VehicleNumber")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "发货地")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.PlaceOfLoading")
+    private	String	placeOfDispatch;
+
+    @ApiModelProperty(value = "到货的")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.GoodsReceiptPlace")
+    private	String	placeOfArrival;
+
+    @ApiModelProperty(value = "货物名称")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.GoodsInfo")
+    private	String	goodsName;
+
+    @ApiModelProperty(value = "货物重量(KG)")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.GoodsInfo")
+    private	String	goodsWeight;
+
+    @ApiModelProperty(value = "驾驶员")
+    @JsonAlias(value = "RequestInfo.VehicleInfo.DriverName")
+    private	String	driver;
+
+    @ApiModelProperty(value = "核验总结果, 0: 未核验; 1: 一致; 2: 不一致; 3: 其他")
+    @JsonAlias(value = "MG_Consistent")
+    private	String	checkTotalRes;
+
+    @ApiModelProperty(value = "请求时间")
+    @JsonAlias(value = "DateTime")
+    private	String	requestTime;
+}

+ 40 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/WaybillInfo.java

@@ -0,0 +1,40 @@
+package info.aspirecn.cloud.yysj.entity;
+
+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 WaybillInfo {
+
+    @ApiModelProperty(value = "运单号")
+    private	String	waybillNum;
+
+    @ApiModelProperty(value = "原始单号")
+    private	String	waybillNumOriginal;
+
+    @ApiModelProperty(value = "企业信息")
+    private	EnterpriseInfo	enterpriseInfo;
+
+    @ApiModelProperty(value = "托运人信息")
+    private	ConsignorInfo	consignorInfo;
+
+    @ApiModelProperty(value = "收货方信息")
+    private	ConsigneeInfo	consigneeInfo;
+
+    @ApiModelProperty(value = "车辆信息")
+    private	VehicleInfo	vehicleInfo;
+
+    @ApiModelProperty(value = "实际承运人信息")
+    private	ActualCarrierInfo	actualCarrierInfo;
+}

+ 43 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/WaybillQueryParam.java

@@ -0,0 +1,43 @@
+package info.aspirecn.cloud.yysj.entity;
+
+import info.aspirecn.cloud.yysj.utils.DateUtil;
+import lombok.Data;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Data
+public class WaybillQueryParam {
+    private String userId;
+    private String waybillNum;
+    private String carNum;
+    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;
+    }
+
+}

+ 29 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/ActualCarrierInfo.java

@@ -0,0 +1,29 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 ActualCarrierInfo {
+
+    @ApiModelProperty(value = "实际承运人")
+    private	String	actualCarrierName;
+
+    @ApiModelProperty(value = "道路运输许可证编号")
+    private	String	actualCarrierBusinessLicense;
+
+    @ApiModelProperty(value = "实际承运人统一社会信用代码或证件号码")
+    private	String	actualCarrierID;
+
+}

+ 32 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/ConsigneeInfo.java

@@ -0,0 +1,32 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 ConsigneeInfo {
+
+    @ApiModelProperty(value = "收货方")
+    private	String	consignee;
+
+    @ApiModelProperty(value = "收货方统一社会信用代码或证件号码")
+    private	String	consigneeID;
+
+    @ApiModelProperty(value = "收货地址")
+    private	String	goodsReceiptPlace;
+
+    @ApiModelProperty(value = "收货地行政区划。参照最新版《中华人民共和国行政区划代码》(GB/T 2260-2017),精确到区县。")
+    private	String	countrySubdivisionCode;
+
+}

+ 32 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/ConsignorInfo.java

@@ -0,0 +1,32 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 ConsignorInfo {
+
+    @ApiModelProperty(value = "托运人")
+    private	String	consignor;
+
+    @ApiModelProperty(value = "托运人统一社会信用代码或证件号码")
+    private	String	consignorID;
+
+    @ApiModelProperty(value = "装货地址")
+    private	String	placeOfLoading;
+
+    @ApiModelProperty(value = "装货地行政区划。参照最新版《中华人民共和国行政区划代码》(GB/T 2260-2017),精确到区县。")
+    private	String	countrySubdivisionCode;
+
+}

+ 29 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/EnterpriseInfo.java

@@ -0,0 +1,29 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 EnterpriseInfo {
+
+    @ApiModelProperty(value = "网络货运经营者名称")
+    private	String	carrierName;
+
+    @ApiModelProperty(value = "统一社会信用代码 ")
+    private	String	unifiedSocialCreditIdentifier;
+
+    @ApiModelProperty(value = "道路运输经营许可证编号")
+    private	String	permitNumber;
+
+}

+ 32 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/VehicleInfo.java

@@ -0,0 +1,32 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 VehicleInfo {
+
+    @ApiModelProperty(value = "车牌号")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "车牌号颜色")
+    private	String	carNumColor;
+
+    @ApiModelProperty(value = "驾驶员姓名")
+    private	String	driverName;
+
+    @ApiModelProperty(value = "机动车行驶证编号")
+    private	String	drivingLicenseNum;
+
+}

+ 50 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/Waybill.java

@@ -0,0 +1,50 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 Waybill {
+
+    @ApiModelProperty(value = "编号")
+    private	int	id;
+
+    @ApiModelProperty(value = "运单号")
+    private	String	waybillNum;
+
+    @ApiModelProperty(value = "车牌号")
+    private	String	carNum;
+
+    @ApiModelProperty(value = "发货地")
+    private	String	placeOfDispatch;
+
+    @ApiModelProperty(value = "到货的")
+    private	String	placeOfArrival;
+
+    @ApiModelProperty(value = "货物名称")
+    private	String	goodsName;
+
+    @ApiModelProperty(value = "货物重量(KG)")
+    private	int	goodsWeight;
+
+    @ApiModelProperty(value = "驾驶员")
+    private	String	driver;
+
+    @ApiModelProperty(value = "核验总结果, 0: 未核验; 1: 一致; 2: 不一致; 3: 其他")
+    private	int	checkTotalRes;
+
+    @ApiModelProperty(value = "请求时间")
+    private	String	requestTime;
+
+}

+ 41 - 0
src/main/java/info/aspirecn/cloud/yysj/entity/response/WaybillInfo.java

@@ -0,0 +1,41 @@
+package info.aspirecn.cloud.yysj.entity.response;
+
+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 WaybillInfo {
+
+    @ApiModelProperty(value = "运单号")
+    private	String	waybillNum;
+
+    @ApiModelProperty(value = "原始单号")
+    private	String	waybillNumOriginal;
+
+    @ApiModelProperty(value = "企业信息")
+    private	EnterpriseInfo	enterpriseInfo;
+
+    @ApiModelProperty(value = "托运人信息")
+    private	ConsignorInfo	consignorInfo;
+
+    @ApiModelProperty(value = "收货方信息")
+    private	ConsigneeInfo	consigneeInfo;
+
+    @ApiModelProperty(value = "车辆信息")
+    private	VehicleInfo	vehicleInfo;
+
+    @ApiModelProperty(value = "实际承运人信息")
+    private	ActualCarrierInfo	actualCarrierInfo;
+
+}

+ 19 - 0
src/main/java/info/aspirecn/cloud/yysj/service/WaybillSercice.java

@@ -0,0 +1,19 @@
+package info.aspirecn.cloud.yysj.service;
+
+import info.aspirecn.cloud.yysj.entity.WaybillInfo;
+import info.aspirecn.cloud.yysj.entity.WaybillQueryParam;
+
+import java.util.Map;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+public interface WaybillSercice {
+
+    /**查询运单列表*/
+    public Map<String, Object> queryWaybillList(WaybillQueryParam waybillQueryParam);
+
+    /**查询运单详情*/
+    public WaybillInfo querywaybillinfo(String waybillId);
+}

+ 406 - 0
src/main/java/info/aspirecn/cloud/yysj/service/impl/WaybillSerciceImpl.java

@@ -0,0 +1,406 @@
+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.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import info.aspirecn.cloud.yysj.entity.*;
+import info.aspirecn.cloud.yysj.service.WaybillSercice;
+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 org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Email:lixinxu@aspirecn.com
+ * Descrption:
+ */
+@Slf4j
+@Service
+public class WaybillSerciceImpl implements WaybillSercice {
+
+    /** 主订单索引 */
+    @Value("${elasticsearch.firstIndex}")
+    private String firstIndex;
+
+    @Value("${clry.productId}")
+    private String clryProductId;
+
+    @Autowired
+    ElasticSearchUitls elasticSearchUitls;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    /**
+     * 查询运单列表
+     *
+     * @param waybillQueryParam
+     */
+    @Override
+    public Map<String, Object> queryWaybillList(WaybillQueryParam waybillQueryParam) {
+
+        //数据深度不能大于1000条
+        if((waybillQueryParam.getPageNum() * waybillQueryParam.getPageSize()) > 1000){
+            return null;
+        }
+        // 创建 Bool 查询构建器
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        // 构建查询条件
+        if(waybillQueryParam.getUserId() != null && !"".equals(waybillQueryParam.getUserId())){
+            boolQueryBuilder.must(QueryBuilders.termsQuery("MG-UserId.keyword",waybillQueryParam.getUserId()));
+        }
+        if(waybillQueryParam.getCarNum() != null && !"".equals(waybillQueryParam.getCarNum())){
+            boolQueryBuilder.must(QueryBuilders.wildcardQuery("RequestInfo.VehicleInfo.VehicleNumber.keyword","*"+waybillQueryParam.getCarNum()+"*"));
+        }
+        if(waybillQueryParam.getWaybillNum() != null && !"".equals(waybillQueryParam.getWaybillNum())){
+            boolQueryBuilder.must(QueryBuilders.wildcardQuery("RequestInfo.ShippingNoteNumber.keyword", "*"+waybillQueryParam.getWaybillNum()+"*"));
+        }
+        boolQueryBuilder.must(QueryBuilders.termsQuery("URI.keyword","/info_check/waybill.do"));
+        boolQueryBuilder.must(QueryBuilders.existsQuery("RequestInfo.ShippingNoteNumber"));
+        boolQueryBuilder.filter().add(QueryBuilders.rangeQuery("DateTime")
+                .gte(waybillQueryParam.getBeginTime()).lte(waybillQueryParam.getEndTime()));
+        // 构建查询源构建器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        searchSourceBuilder.query(boolQueryBuilder);
+        searchSourceBuilder.sort("DateTime", SortOrder.DESC);
+        searchSourceBuilder.size(waybillQueryParam.getPageSize());
+        searchSourceBuilder.from((waybillQueryParam.getPageNum()-1) * waybillQueryParam.getPageSize());
+
+        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
+        searchSourceBuilder.fetchSource(new String[]{"RequestInfo.ShippingNoteNumber", "RequestInfo.VehicleInfo.VehicleNumber",
+                                        "RequestInfo.VehicleInfo.PlaceOfLoading", "RequestInfo.VehicleInfo.GoodsReceiptPlace",
+                                        "RequestInfo.VehicleInfo.GoodsInfo", "RequestInfo.VehicleInfo.GoodsInfo",
+                                        "RequestInfo.VehicleInfo.Driver.DriverName", "MG-Consistent", "DateTime"}, null);
+
+        // 创建查询请求对象,将查询对象配置到其中
+        SearchRequest searchRequest = new SearchRequest(firstIndex);
+        searchRequest.source(searchSourceBuilder);
+        log.info("searchSourceBuilder:{}",searchSourceBuilder.toString());
+        // 返回集合
+        Map<String, Object> resultMap = new HashMap<String, Object>();
+        List<Waybill> waybillList = new ArrayList<Waybill>();
+
+        //获取数据
+        SearchHits hits = elasticSearchUitls.getResultHits(searchRequest);
+
+        log.info("hits:{}",hits);
+        if(hits == null){
+            resultMap.put(Constant.DATA_LIST, waybillList);
+            resultMap.put(Constant.TOTAL, 0L);
+            return resultMap;
+        }
+
+        long total = hits.getTotalHits();
+
+        //遍历封装数据
+        for (SearchHit hit : hits) {
+
+            try {
+                String json = hit.getSourceAsString();
+                JSONObject jsonObject = JSONObject.parseObject(json);
+                JSONObject requestInfoJsonObject = jsonObject.getJSONObject("RequestInfo");
+                Object vehicleInfoObject =  requestInfoJsonObject.get("VehicleInfo");
+                Waybill waybill = new Waybill();
+                waybill.setId(hit.getId());
+                waybill.setWaybillNum(requestInfoJsonObject.getString("ShippingNoteNumber"));
+                waybill.setDriver("");
+                waybill.setGoodsName("");
+                waybill.setGoodsWeight("");
+                if(vehicleInfoObject instanceof  JSONObject){
+                    JSONObject vehicleInfoJsonObject = (JSONObject)vehicleInfoObject;
+                    Object driverObject = vehicleInfoJsonObject.get("Driver");
+                    if(driverObject instanceof  JSONArray){
+                        JSONArray driverJsonObjectArr = (JSONArray) driverObject;
+                        //获取驾驶员姓名
+                        String driverName = "";
+                        for (int i=0; i < driverJsonObjectArr.size(); i++){
+                            Object driverArrObject = driverJsonObjectArr.get(i);
+                            if(driverArrObject instanceof  JSONObject){
+                                JSONObject driverJsonObject=(JSONObject)driverArrObject;
+                                String driverNameStr =  driverJsonObject.getString("DriverName");
+                                if(!StringUtils.isEmpty(driverNameStr)) {
+                                    driverName += driverJsonObject.getString("DriverName");
+                                    if(i < driverJsonObjectArr.size() - 1){
+                                        driverName += "、";
+                                    }
+                                }else{
+                                    log.error("DriverName is empty:{}",driverNameStr);
+                                }
+
+                            }else{
+                                log.error("Driver[i] is not JSON Object");
+                            }
+
+
+                        }
+                        waybill.setDriver(driverName);
+                    }else{
+                        log.error("Driver is not JSON ARRY,driverObject:{}",driverObject);
+                    }
+                    Object GoodsObject = vehicleInfoJsonObject.get("GoodsInfo");
+
+                    if(GoodsObject instanceof  JSONArray){
+                        JSONArray goodsInfoJsonObjectArr = (JSONArray) GoodsObject;
+                        String goodsName = "";
+                        Double goodsTotalWeight = 0.000;
+                        for (int i=0; i < goodsInfoJsonObjectArr.size(); i++){
+                           Object goodsArrObject = goodsInfoJsonObjectArr.get(i);
+                           if(goodsArrObject instanceof  JSONObject){
+                               JSONObject goodsInfoJsonObject = (JSONObject) goodsArrObject;
+                               String goodsNameStr =  goodsInfoJsonObject.getString("DescriptionOfGoods");
+                               if(!StringUtils.isEmpty(goodsNameStr)) {
+                                   goodsName += goodsNameStr;
+                                   if(i < goodsInfoJsonObjectArr.size() - 1){
+                                       goodsName += "、";
+                                   }
+                               }
+                               Object goodsItemObject = goodsInfoJsonObject.get("GoodsItemGrossWeight");
+                               if(goodsItemObject instanceof  Double){
+                                   Double goodsWeight = (Double) goodsItemObject;
+                                   goodsTotalWeight += goodsWeight;
+                               }else{
+                                   log.error("GoodsItemGrossWeight is not Double");
+                               }
+
+
+                           }else{
+                               log.error("GoodsInfo[i] is not JSON Object");
+                           }
+
+
+
+                        }
+
+                        //重量处理成字符串 保留3位小时
+                        String goodsTotalWeightStr = goodsTotalWeight.toString();
+                        if(goodsTotalWeightStr.indexOf(".")!=-1){
+                            String goodsTotalWeightStrI = goodsTotalWeightStr.substring(0, goodsTotalWeightStr.indexOf("."));
+                            String goodsTotalWeightStrD = goodsTotalWeightStr.substring(goodsTotalWeightStr.indexOf(".")+1, goodsTotalWeightStr.length());
+                            if (goodsTotalWeightStrD.length() > 3){
+                                goodsTotalWeightStrD = goodsTotalWeightStrD.substring(0, 3);
+                            } else if(goodsTotalWeightStrD.length() == 2){
+                                goodsTotalWeightStrD += "0";
+                            } else if(goodsTotalWeightStrD.length() == 1){
+                                goodsTotalWeightStrD += "00";
+                            }
+                            goodsTotalWeightStr = goodsTotalWeightStrI + "." + goodsTotalWeightStrD;
+                        }
+
+
+
+
+                        waybill.setGoodsName(goodsName);
+                        waybill.setGoodsWeight(goodsTotalWeightStr);
+
+                    }else{
+                        log.error("GoodsInfo is not JSON ARRY");
+                    }
+
+
+
+                }
+
+                waybill.setCheckTotalRes(jsonObject.getString("MG-Consistent"));
+                waybill.setRequestTime(DateUtil.esTime2MySQLTime(jsonObject.getString("DateTime")));
+
+                waybillList.add(waybill);
+
+                log.info("运单 {}", waybill);
+            } catch (Exception e){
+                total=total-1;
+                log.info("运单数据不完整, Exception: {}",e);
+            }
+
+        }
+        resultMap.put(Constant.DATA_LIST, waybillList);
+        resultMap.put(Constant.TOTAL, total);
+        return resultMap;
+    }
+
+    /**
+     * 查询运单详情
+     *
+     * @param waybillId
+     */
+    @Override
+    public WaybillInfo querywaybillinfo(String waybillId) {
+
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        //搜索方式  根据id查询
+        searchSourceBuilder.query(QueryBuilders.termsQuery("_id",waybillId));
+        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
+        searchSourceBuilder.fetchSource(new String[]{"RequestInfo.ShippingNoteNumber", "RequestInfo.OriginalDocumentNumber",
+                                                    "RequestInfo.Carrier", "RequestInfo.UnifiedSocialCreditIdentifier",
+                                                    "RequestInfo.PermitNumber", "RequestInfo.ConsignorInfo",
+                                                    "RequestInfo.ConsigneeInfo", "RequestInfo.VehicleInfo.VehicleNumber",
+                                                    "RequestInfo.VehicleInfo.VehiclePlateColorCode",
+                                                    "RequestInfo.VehicleInfo.Driver.DriverName",
+                                                    "RequestInfo.VehicleInfo.Driver.DriverLicenseNumber",
+                                                    "RequestInfo.ActualCarrierInfo","Check-Reuslt"}, null);
+        searchSourceBuilder.size(1);
+        //创建查询请求对象,将查询对象配置到其中
+        SearchRequest searchRequest = new SearchRequest(firstIndex);
+        searchRequest.source(searchSourceBuilder);
+
+        //获取数据
+        WaybillInfo waybillInfo = new WaybillInfo();
+        SearchHits hits = elasticSearchUitls.getResultHits(searchRequest);
+        if(hits == null){
+            return waybillInfo;
+        }
+
+        //遍历数据, 加上核验结果条件, 计算总数, 分页
+        for (SearchHit hit : hits) {
+            String json = hit.getSourceAsString();
+            JSONObject jsonObject = JSONObject.parseObject(json);
+            String result  = jsonObject.getString("Check-Reuslt");
+
+
+            //请求信息json对象
+            JSONObject requestInfoJsonObject = jsonObject.getJSONObject("RequestInfo");
+
+
+
+            //车辆信息.驾驶信息 json对象
+
+
+
+            //设置运单号、原始单号
+            waybillInfo.setWaybillNum(requestInfoJsonObject.getString("ShippingNoteNumber"));
+            waybillInfo.setWaybillNumOriginal(requestInfoJsonObject.getString("OriginalDocumentNumber"));
+
+            //设置企业信息
+            EnterpriseInfo enterpriseInfo = new EnterpriseInfo();
+            enterpriseInfo.setCarrierName(requestInfoJsonObject.getString("Carrier"));
+            enterpriseInfo.setUnifiedSocialCreditIdentifier(requestInfoJsonObject.getString("UnifiedSocialCreditIdentifier"));
+            enterpriseInfo.setPermitNumber(requestInfoJsonObject.getString("PermitNumber"));
+            waybillInfo.setEnterpriseInfo(enterpriseInfo);
+
+            //设置托运人信息
+            ConsignorInfo consignorInfo = new ConsignorInfo();
+            try {
+                //托运人信息json对象
+               Object consignorObject = requestInfoJsonObject.get("ConsignorInfo");
+               if(consignorObject instanceof JSONObject){
+                   JSONObject consignorInfoJsonObject = (JSONObject)consignorObject;
+                   consignorInfo = objectMapper.readValue(consignorInfoJsonObject.toString(), ConsignorInfo.class);
+               }else{
+                   log.error("ConsignorInfo 不是json object 格式");
+               }
+            } catch (Exception e) {
+               log.error("解析ConsignorInfo异常:{}",e);
+            }
+            waybillInfo.setConsignorInfo(consignorInfo);
+
+            //设置收货方信息
+            ConsigneeInfo consigneeInfo = new ConsigneeInfo();
+            try {
+                //收货方信息接送json对象
+                Object consigneeObject = requestInfoJsonObject.get("ConsigneeInfo");
+                if(consigneeObject instanceof JSONObject){
+                    JSONObject consigneeInfoJsonObject = (JSONObject) consigneeObject;
+                    consigneeInfo = objectMapper.readValue(consigneeInfoJsonObject.toString(), ConsigneeInfo.class);
+                }else{
+                    log.error("ConsigneeInfo 不是json object 格式");
+                }
+
+            } catch (JsonProcessingException e) {
+                log.error("解析ConsigneeInfo异常:{}",e);
+            }
+            waybillInfo.setConsigneeInfo(consigneeInfo);
+
+            //设置车辆信息
+            VehicleInfo vehicleInfo = new VehicleInfo();
+            String driverName = "";
+            try {
+
+                JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, CheckDetailLogObject.class);
+                List<CheckDetailLogObject> checks = (List<CheckDetailLogObject>)objectMapper.readValue(result, javaType);
+                for(CheckDetailLogObject logObject : checks){
+                    if(clryProductId.equals(logObject.getProductId())){
+                        vehicleInfo.setDrivingAccess(logObject.getResult());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("CheckDetailLogObject exception:{}",e);
+            }
+            try {
+            Object vehicleObject = requestInfoJsonObject.get("VehicleInfo");
+            if(vehicleObject instanceof JSONObject){
+                JSONObject vehicleInfoJsonObject =(JSONObject)vehicleObject;
+                vehicleInfo.setCarNum(vehicleInfoJsonObject.getString("VehicleNumber"));
+                vehicleInfo.setCarNumColor(vehicleInfoJsonObject.getString("VehiclePlateColorCode"));
+                Object driverObject = vehicleInfoJsonObject.get("Driver");
+                if(driverObject instanceof JSONArray ){
+                    JSONArray driverJsonObjectArr = (JSONArray) driverObject;
+                    for (int i=0; i < driverJsonObjectArr.size(); i++){
+                        Object arrObject =  driverJsonObjectArr.get(i);
+                        if(arrObject instanceof  JSONObject){
+                            JSONObject driverJsonObject = (JSONObject)arrObject;
+                            driverName += driverJsonObject.getString("DriverName");
+                            if(i < driverJsonObjectArr.size() - 1){
+                                driverName += "、";
+                            }
+                        }
+
+                    }
+                }else{
+                    log.error("Driver 不是json Array 格式");
+                }
+
+            }else{
+                log.error("VehicleInfo 不是json object 格式");
+            }
+            } catch (Exception e) {
+                log.error("VehicleInfo exception:{}",e);
+            }
+            vehicleInfo.setDrivingLicenseNum("");
+            waybillInfo.setVehicleInfo(vehicleInfo);
+            //获取驾驶员姓名
+            vehicleInfo.setDriverName(driverName);
+
+            //设置实际承运人信息
+            ActualCarrierInfo actualCarrierInfo = new ActualCarrierInfo();
+            try {
+                //实际承运人信息json对象
+                Object actualCarrierObject = requestInfoJsonObject.get("ActualCarrierInfo");
+                if(actualCarrierObject instanceof JSONObject ){
+                    JSONObject actualCarrierInfoJsonObject =(JSONObject) actualCarrierObject;
+                    actualCarrierInfo = objectMapper.readValue(actualCarrierInfoJsonObject.toString(), ActualCarrierInfo.class);
+                }else{
+                    log.error("ActualCarrierInfo 不是json object 格式");
+                }
+
+            } catch (Exception e) {
+                log.error("ActualCarrierInfo exception:{}",e);
+            }
+            waybillInfo.setActualCarrierInfo(actualCarrierInfo);
+
+            log.debug("运单详情 {}", waybillInfo);
+
+            return waybillInfo;
+
+        }
+        return waybillInfo;
+    }
+
+
+}

+ 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.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+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;
+	}
+}

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

@@ -0,0 +1,93 @@
+package info.aspirecn.cloud.yysj.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+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;
+    }
+
+}

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

@@ -0,0 +1,25 @@
+# #mysql configuration
+# spring:
+#   application:
+#     name: cloud-yysj-waybill-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

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

@@ -0,0 +1,40 @@
+#ConfigMap 配置参数
+server:
+  port: 8080
+spring:
+  application:
+    name: cloud-yysj-waybill-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
+