瀏覽代碼

first commit

15810770710@163.com 4 年之前
父節點
當前提交
c85404c922
共有 36 個文件被更改,包括 1752 次插入0 次删除
  1. 82 0
      deploy/cloud-yysj-order-query.yaml
  2. 71 0
      deploy/config-map.yaml
  3. 162 0
      pom.xml
  4. 24 0
      src/main/java/info/aspirecn/cloud/yysj/Application.java
  5. 79 0
      src/main/java/info/aspirecn/cloud/yysj/config/ElasticSearchConfig.java
  6. 22 0
      src/main/java/info/aspirecn/cloud/yysj/config/IndexConfig.java
  7. 48 0
      src/main/java/info/aspirecn/cloud/yysj/config/SwaggerConfig.java
  8. 134 0
      src/main/java/info/aspirecn/cloud/yysj/controller/OrderQueryController.java
  9. 104 0
      src/main/java/info/aspirecn/cloud/yysj/controller/handler/GlobalExceptionHandler.java
  10. 12 0
      src/main/java/info/aspirecn/cloud/yysj/dao/db/ProduceMapper.java
  11. 12 0
      src/main/java/info/aspirecn/cloud/yysj/dao/db/ProduceRelevanceMapper.java
  12. 126 0
      src/main/java/info/aspirecn/cloud/yysj/dao/es/YysjGatewayFirstIndex.java
  13. 67 0
      src/main/java/info/aspirecn/cloud/yysj/dao/es/YysjGatewaySecondIndex.java
  14. 26 0
      src/main/java/info/aspirecn/cloud/yysj/exception/PageSizeErrorException.java
  15. 26 0
      src/main/java/info/aspirecn/cloud/yysj/exception/ParameterErrorException.java
  16. 26 0
      src/main/java/info/aspirecn/cloud/yysj/exception/UserNotFountException.java
  17. 18 0
      src/main/java/info/aspirecn/cloud/yysj/model/ResponseInfo.java
  18. 35 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewayFirstLog.java
  19. 22 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewayFirstLogList.java
  20. 34 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewaySecondLog.java
  21. 22 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewaySecondLogList.java
  22. 49 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/Produce.java
  23. 44 0
      src/main/java/info/aspirecn/cloud/yysj/model/entity/ProduceRelevance.java
  24. 39 0
      src/main/java/info/aspirecn/cloud/yysj/model/enums/QueryType.java
  25. 21 0
      src/main/java/info/aspirecn/cloud/yysj/model/remote/SjjhProduct.java
  26. 28 0
      src/main/java/info/aspirecn/cloud/yysj/model/request/OrderQuery.java
  27. 32 0
      src/main/java/info/aspirecn/cloud/yysj/model/response/ChildOrderInfo.java
  28. 36 0
      src/main/java/info/aspirecn/cloud/yysj/model/response/OrderInfo.java
  29. 24 0
      src/main/java/info/aspirecn/cloud/yysj/model/response/OrderInfoList.java
  30. 35 0
      src/main/java/info/aspirecn/cloud/yysj/model/response/Page.java
  31. 30 0
      src/main/java/info/aspirecn/cloud/yysj/service/DbService.java
  32. 34 0
      src/main/java/info/aspirecn/cloud/yysj/service/OrderService.java
  33. 54 0
      src/main/java/info/aspirecn/cloud/yysj/service/impl/DbServiceImpl.java
  34. 89 0
      src/main/java/info/aspirecn/cloud/yysj/service/impl/OrderServiceImpl.java
  35. 46 0
      src/main/resources/application.yml
  36. 39 0
      src/main/resources/bootstrap.yml

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

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

+ 71 - 0
deploy/config-map.yaml

@@ -0,0 +1,71 @@
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: cloud-yysj-order-query
+data:
+  application.yaml: |-
+    spring:
+      datasource:
+        url: jdbc:mysql://10.8.17.119:32196/cloud-yysj?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+        username: root
+        driver-class-name: com.mysql.cj.jdbc.Driver
+        type: com.zaxxer.hikari.HikariDataSource
+        hikari:
+          minimum-idle: 5
+          maximum-pool-size: 15
+          auto-commit: true
+          idle-timeout: 30000
+          pool-name: DatebookHikariCP
+          max-lifetime: 1800000
+          connection-timeout: 30000
+          password: 123456
+
+    mybatis-plus:
+      configuration:
+        # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+        #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+        # 驼峰下划线转换
+        map-underscore-to-camel-case: false
+        # 配置的缓存的全局开关
+        cache-enabled: true
+        # 延时加载的开关
+        lazy-loading-enabled: true
+        # 开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性
+        multiple-result-sets-enabled: true
+        use-generated-keys: true
+        default-statement-timeout: 60
+        default-fetch-size: 100
+
+    management:
+      server:
+        port: 8081
+      endpoint:
+        health:
+          show-details: always
+      endpoints:
+        enabled-by-default: true
+        web:
+          exposure:
+            include: "*"
+
+    eureka:
+      instance:
+        instance-id: ${spring.cloud.client.ip-address}:${server.port}
+        prefer-ip-address: true
+      client:
+        service-url:
+          defaultZone:  http://10.8.18.172:31102/eureka
+
+    elasticsearch:
+      schema: http
+      address: 10.8.17.119:32482
+      #address: 192.168.16.41:30002,192.168.16.41:31821,192.168.16.41:30097
+      connectTimeout: 5000
+      socketTimeout: 5000
+      connectionRequestTimeout: 5000
+      maxConnectNum: 100
+      maxConnectPerRoute: 100
+      index:
+        yysjFirst: access-yysj-gateway-first-log-cloud-yysj*
+        yysjSecond: access-yysj-gateway-second-log-cloud-yysj*
+        sjjh: iov_sjjh_access_test1*

+ 162 - 0
pom.xml

@@ -0,0 +1,162 @@
+<?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-order-query</artifactId>
+    <version>1.0.0</version>
+    <name>cloud-yysj-order-query</name>
+    <description>cloud yysj platform order query</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>
+        <!--web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!--actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <!--lombok-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!--springcloud-kubernetes-config-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
+        </dependency>
+        <!--swagger-->
+        <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>knife4j-spring-boot-starter</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+        <!--elasticsearch-->
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>6.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>6.6.2</version>
+        </dependency>
+        <!--mybatis plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <!--commons-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.8.1</version>
+        </dependency>
+        <!--mysql-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.62</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>

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

@@ -0,0 +1,24 @@
+package info.aspirecn.cloud.yysj;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @author dingliqiang
+ */
+@EnableSwagger2
+@EnableKnife4j
+@EnableConfigurationProperties
+@SpringBootApplication
+@MapperScan("info.aspirecn.cloud.yysj.dao")
+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;
+
+/**
+ * ElasticSearch 配置
+ *
+ * @author dingliqiang
+ */
+@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/IndexConfig.java

@@ -0,0 +1,22 @@
+package info.aspirecn.cloud.yysj.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@Configuration
+public class IndexConfig {
+
+    /** 云验数据平台一级网关索引*/
+    @Value("${elasticsearch.index.yysjFirst}")
+    private String indexYysjFirst;
+
+    /** 云验数据平台二级网关索引*/
+    @Value("${elasticsearch.index.yysjSecond}")
+    private String indexYysjSecond;
+
+}

+ 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("账户产品数据分析服务接口项目")
+                // 文档描述
+                .description("账户产品数据分析服务接口项目接口文档。")
+                // 文档版本
+                .version("1.0.0")
+                .build();
+    }
+}

+ 134 - 0
src/main/java/info/aspirecn/cloud/yysj/controller/OrderQueryController.java

@@ -0,0 +1,134 @@
+package info.aspirecn.cloud.yysj.controller;
+
+import info.aspirecn.cloud.yysj.exception.PageSizeErrorException;
+import info.aspirecn.cloud.yysj.model.ResponseInfo;
+import info.aspirecn.cloud.yysj.model.response.ChildOrderInfo;
+import info.aspirecn.cloud.yysj.model.response.OrderInfo;
+import info.aspirecn.cloud.yysj.model.response.OrderInfoList;
+import info.aspirecn.cloud.yysj.service.OrderService;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * 用户订单统计、消费信息、余额、产品消费比例等信息查询,适用于首页
+ *
+ * @author dingliqiang
+ */
+@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 = "服务器内部错误")
+})
+@Slf4j
+@RestController
+public class OrderQueryController {
+
+    private DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    @Autowired
+    private OrderService orderService;
+
+    private static final int NUM_LIMIT = 5000;
+
+    /**
+     * 获取用户主订单列表
+     *
+     * @param userId     用户ID
+     * @param pageNum    请求第几页
+     * @param pageSize   一页的大小
+     * @return 主订单列表
+     */
+    @ApiOperation(value = "主订单列表", notes = "获取用户主订单列表。")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderId", value = "主订单ID", dataType = "string", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间", dataType = "string", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", dataType = "string", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageNum", value = "请求第几页", dataType = "string", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "一页的大小", dataType = "string", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "string", required = true, paramType = "header")
+    })
+    @GetMapping("/orderList")
+    public ResponseInfo getOrderList(@RequestParam(required = false) String orderId,
+                                           @RequestParam(required = false) String startTime,
+                                           @RequestParam(required = false) String endTime,
+                                           @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                                           @RequestParam(required = false, defaultValue = "10") Integer pageSize,
+                                           @RequestHeader(required = true) String userId,
+                                           HttpServletResponse response) {
+        // 设置查询深度,不能太深,否则会影响ES
+        if (pageNum * pageSize >= NUM_LIMIT){
+            throw new PageSizeErrorException();
+        }
+        // 开始、结束时间
+        if (StringUtils.isEmpty(startTime)) {
+            startTime = dtf.format(LocalDateTime.now().minusDays(10));
+        }
+        if (StringUtils.isEmpty(endTime)) {
+            endTime = dtf.format(LocalDateTime.now());
+        }
+        // 获取数据
+        OrderInfoList statisticsList = orderService.getOrderList(userId,orderId, startTime, endTime, pageNum, pageSize);
+        // 处理价格单位
+        for (OrderInfo orderInfo:statisticsList.getOrderInfos()){
+            orderInfo.setOrderAmount(priceProcess(orderInfo.getOrderAmount()));
+        }
+        // 设置分页
+        response.addHeader("pageNum",String.valueOf(statisticsList.getPageNum()));
+        response.addHeader("pageTotal",String.valueOf(statisticsList.getPageTotal()));
+        response.addHeader("pageSize",String.valueOf(statisticsList.getPageSize()));
+        response.addHeader("total",String.valueOf(statisticsList.getTotal()));
+        return new ResponseInfo().setData(statisticsList.getOrderInfos()).setMessage("请求成功");
+    }
+
+    /**
+     * 主订单详情查询
+     *
+     * @param orderId 主订单ID
+     * @return 主订单详情信息
+     */
+    @ApiOperation(value = "主订单详情查询", notes = "查询主订单详情信息(子订单信息)。")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderId", value = "主订单ID", dataType = "string", required = true, paramType = "path")
+    })
+    @GetMapping("/order/{orderId}")
+    public ResponseInfo getOrderDetail(@PathVariable(required = true) String orderId) {
+        List<ChildOrderInfo> consumptionList = orderService.getOrderDetail(orderId);
+        // 处理价格单位
+        for (ChildOrderInfo childOrderInfo : consumptionList){
+            childOrderInfo.setPrice(priceProcess(childOrderInfo.getPrice()));
+        }
+        return new ResponseInfo().setData(consumptionList).setMessage("请求成功");
+    }
+
+    /**
+     * 处理价格单位
+     */
+    private String priceProcess(String price){
+        // 获取签名部分
+        if (price.length() == 1){
+            return "0.00" + price;
+        } else if (price.length() == 2){
+            return "0.0" + price;
+        } else if (price.length() == 3){
+            return "0." + price;
+        }
+        // 获取签名部分
+        String pricePre = StringUtils.substring(price,0,price.length()-3);
+        // 获取后面部分
+        String pricePost = StringUtils.substring(price,price.length()-3,price.length());
+        // 拼接
+        return pricePre + "." + pricePost;
+    }
+
+}

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

@@ -0,0 +1,104 @@
+package info.aspirecn.cloud.yysj.controller.handler;
+
+import info.aspirecn.cloud.yysj.exception.PageSizeErrorException;
+import info.aspirecn.cloud.yysj.exception.UserNotFountException;
+import info.aspirecn.cloud.yysj.model.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 UserNotFountException) {
+            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("");
+        } else if (e instanceof PageSizeErrorException){
+            return new ResponseInfo().setMessage("一页大小超过限制").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("");
+    }
+
+}

+ 12 - 0
src/main/java/info/aspirecn/cloud/yysj/dao/db/ProduceMapper.java

@@ -0,0 +1,12 @@
+package info.aspirecn.cloud.yysj.dao.db;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import info.aspirecn.cloud.yysj.model.entity.Produce;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author dingliqiang
+ */
+@Repository
+public interface ProduceMapper extends BaseMapper<Produce> {
+}

+ 12 - 0
src/main/java/info/aspirecn/cloud/yysj/dao/db/ProduceRelevanceMapper.java

@@ -0,0 +1,12 @@
+package info.aspirecn.cloud.yysj.dao.db;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import info.aspirecn.cloud.yysj.model.entity.ProduceRelevance;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author dingliqiang
+ */
+@Repository
+public interface ProduceRelevanceMapper extends BaseMapper<ProduceRelevance> {
+}

+ 126 - 0
src/main/java/info/aspirecn/cloud/yysj/dao/es/YysjGatewayFirstIndex.java

@@ -0,0 +1,126 @@
+package info.aspirecn.cloud.yysj.dao.es;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import info.aspirecn.cloud.yysj.config.IndexConfig;
+import info.aspirecn.cloud.yysj.model.entity.GatewayFirstLog;
+import info.aspirecn.cloud.yysj.model.entity.GatewayFirstLogList;
+import info.aspirecn.cloud.yysj.model.enums.QueryType;
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+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.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.rest.RestStatus;
+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.stereotype.Repository;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ElasticSearch 云验数据平台子订单索引查询
+ *
+ * @author dingliqiang
+ */
+@Repository
+public class YysjGatewayFirstIndex {
+
+    /**
+     * 车辆查询
+     */
+    private static final String QUERY_CAR_INFO = "/info_check/carInfo.do";
+
+    /**
+     * 驾驶员查询
+     */
+    private static final String QUERY_DRIVER_INFO = "/info_check/driverInfo.do";
+    /**
+     * 运单查询
+     */
+    private static final String QUERY_WAYBILL_INFO = "/info_check/waybill.do";
+
+    /**
+     * 查询产品类型
+     */
+    private static final String[] QUERY_TYPE = {QUERY_CAR_INFO, QUERY_DRIVER_INFO, QUERY_WAYBILL_INFO};
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+    @Autowired
+    private IndexConfig indexConfig;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    /**
+     * 获取用户主订单列表
+     * @param userId 云验平台用户ID
+     * @param orderId 主订单ID
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param form 开始条数
+     * @param size 一次查询大小
+     * @return 主订单列表
+     */
+    @SneakyThrows(IOException.class)
+    public GatewayFirstLogList getFirstLogList(String userId, String orderId, String startTime, String endTime
+            , int form, int size) {
+        // 设置返回结果集合
+        List<GatewayFirstLog> gatewayFirstLogList = new ArrayList<>();
+        // 验证时间
+        if (StringUtils.isEmpty(startTime)){
+           startTime = "now-10/d";
+        }
+        if (StringUtils.isEmpty(endTime)){
+            startTime = "now";
+        }
+        // 构建查询条件
+        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
+                .filter(QueryBuilders.rangeQuery("DateTime").gte(startTime).lte(endTime).format("yyyy-MM-dd"))
+                .must(QueryBuilders.termQuery("MG-UserId", userId))
+                .must(QueryBuilders.termsQuery("URI.keyword", QUERY_TYPE));
+        // 判断条件有无订单ID号
+        if (StringUtils.isNotEmpty(orderId)){
+            queryBuilder.must(QueryBuilders.termQuery("traceId.keyword", orderId));
+        }
+        // 构建查询源构建器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        searchSourceBuilder.from(form);
+        searchSourceBuilder.size(size);
+        searchSourceBuilder.sort("DateTime", SortOrder.DESC);
+        searchSourceBuilder.query(queryBuilder);
+        // 创建查询请求对象,将查询对象配置到其中
+        SearchRequest request = new SearchRequest(indexConfig.getIndexYysjFirst()).source(searchSourceBuilder);
+        // 执行查询请求,获取响应信息
+        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
+        if (!RestStatus.OK.equals(response.status()) || response.getAggregations() == null) {
+            SearchHits hits = response.getHits();
+            for (SearchHit hit : hits) {
+                // 将 JSON 转换成对象
+                GatewayFirstLog firstLog = JSON.parseObject(hit.getSourceAsString(), GatewayFirstLog.class);
+                // 转换对象中的查询类型
+                if (firstLog.getType().equalsIgnoreCase(QUERY_CAR_INFO)){
+                    firstLog.setType(QueryType.QUERY_CAR_INFO.getName());
+                }else if (firstLog.getType().equalsIgnoreCase(QUERY_DRIVER_INFO)){
+                    firstLog.setType(QueryType.QUERY_DRIVER_INFO.getName());
+                }else if (firstLog.getType().equalsIgnoreCase(QUERY_WAYBILL_INFO)){
+                    firstLog.setType(QueryType.QUERY_WAYBILL_INFO.getName());
+                }
+                // 加入到对象集合
+                gatewayFirstLogList.add(firstLog);
+            }
+        }
+
+        return new GatewayFirstLogList().setGatewayFirstLogs(gatewayFirstLogList).setTotal(response.getHits().totalHits);
+    }
+
+}

+ 67 - 0
src/main/java/info/aspirecn/cloud/yysj/dao/es/YysjGatewaySecondIndex.java

@@ -0,0 +1,67 @@
+package info.aspirecn.cloud.yysj.dao.es;
+
+import com.alibaba.fastjson.JSON;
+import info.aspirecn.cloud.yysj.config.IndexConfig;
+import info.aspirecn.cloud.yysj.model.entity.GatewaySecondLog;
+import info.aspirecn.cloud.yysj.model.entity.GatewaySecondLogList;
+import lombok.SneakyThrows;
+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.index.query.QueryBuilders;
+import org.elasticsearch.rest.RestStatus;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ElasticSearch 云验数据平台子订单索引查询
+ *
+ * @author dingliqiang
+ */
+@Repository
+public class YysjGatewaySecondIndex {
+
+    @Autowired
+    private IndexConfig indexConfig;
+
+    @Autowired
+    private RestHighLevelClient restHighLevelClient;
+
+    /**
+     * 获取主订单的全部子订单数据
+     *
+     * @param orderId  主订单ID
+     * @return 异常效验统计结果
+     */
+    @SneakyThrows(IOException.class)
+    public GatewaySecondLogList getSecondLogList(String orderId) {
+        // 设置返回结果
+        List<GatewaySecondLog> gatewaySecondLogList = new ArrayList<>();
+        // 创建 Bool 查询构建器
+        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+        searchSourceBuilder.size(100);
+        searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("MG-TotalTraceId.keyword", orderId)));
+        // 创建查询请求对象,将查询对象配置到其中
+        SearchRequest request = new SearchRequest(indexConfig.getIndexYysjSecond()).source(searchSourceBuilder);
+        // 执行请求
+        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
+        if (!RestStatus.OK.equals(response.status()) || response.getAggregations() == null) {
+            SearchHits hits = response.getHits();
+            for (SearchHit hit : hits) {
+                // 将 JSON 转换成对象
+                GatewaySecondLog secondLog = JSON.parseObject(hit.getSourceAsString(), GatewaySecondLog.class);
+                // 加入到对象集合
+                gatewaySecondLogList.add(secondLog);
+            }
+        }
+        return new GatewaySecondLogList().setGatewaySecondLogs(gatewaySecondLogList).setTotal(response.getHits().totalHits);
+    }
+
+}

+ 26 - 0
src/main/java/info/aspirecn/cloud/yysj/exception/PageSizeErrorException.java

@@ -0,0 +1,26 @@
+package info.aspirecn.cloud.yysj.exception;
+
+/**
+ * 无法发现用户信息异常
+ *
+ * @author dingliqiang
+ */
+public class PageSizeErrorException extends RuntimeException {
+
+    public PageSizeErrorException() {
+        super();
+    }
+
+    public PageSizeErrorException(String message) {
+        super(message);
+    }
+
+    public PageSizeErrorException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public PageSizeErrorException(Throwable cause) {
+        super(cause);
+    }
+
+}

+ 26 - 0
src/main/java/info/aspirecn/cloud/yysj/exception/ParameterErrorException.java

@@ -0,0 +1,26 @@
+package info.aspirecn.cloud.yysj.exception;
+
+/**
+ * 无法发现用户信息异常
+ *
+ * @author dingliqiang
+ */
+public class ParameterErrorException extends RuntimeException {
+
+    public ParameterErrorException() {
+        super();
+    }
+
+    public ParameterErrorException(String message) {
+        super(message);
+    }
+
+    public ParameterErrorException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public ParameterErrorException(Throwable cause) {
+        super(cause);
+    }
+
+}

+ 26 - 0
src/main/java/info/aspirecn/cloud/yysj/exception/UserNotFountException.java

@@ -0,0 +1,26 @@
+package info.aspirecn.cloud.yysj.exception;
+
+/**
+ * 无法发现用户信息异常
+ *
+ * @author dingliqiang
+ */
+public class UserNotFountException extends RuntimeException {
+
+    public UserNotFountException() {
+        super();
+    }
+
+    public UserNotFountException(String message) {
+        super(message);
+    }
+
+    public UserNotFountException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public UserNotFountException(Throwable cause) {
+        super(cause);
+    }
+
+}

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

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

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

@@ -0,0 +1,35 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.ToString;
+import java.util.Date;
+
+/**
+ * 一级网关日志
+ *
+ * @author dingliqiang
+ */
+@Data
+@ToString
+public class GatewayFirstLog {
+
+    /**
+     * 主订单ID
+     */
+    @JSONField(name = "traceId")
+    private String orderId;
+
+    /**
+     * 请求时间
+     */
+    @JSONField(name = "DateTime")
+    private Date dateTime;
+
+    /**
+     * 请求类型
+     */
+    @JSONField(name = "URI")
+    private String type;
+
+}

+ 22 - 0
src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewayFirstLogList.java

@@ -0,0 +1,22 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 一级网关日志列表
+ *
+ * @author dingliqiang
+ */
+@Data
+@Accessors(chain = true)
+@ToString
+public class GatewayFirstLogList {
+
+    private long total;
+
+    private List<GatewayFirstLog> gatewayFirstLogs;
+}

+ 34 - 0
src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewaySecondLog.java

@@ -0,0 +1,34 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * 二级网关日志
+ *
+ * @author dingliqiang
+ */
+@Data
+@ToString
+public class GatewaySecondLog {
+
+    /**
+     * 子订单ID
+     */
+    @JSONField(name = "id")
+    private String orderId;
+
+    /**
+     * 产品ID
+     */
+    @JSONField(name = "MG-ProductId")
+    private String productId;
+
+    /**
+     * 产品价格
+     */
+    @JSONField(name = "MG-Money")
+    private String money;
+
+}

+ 22 - 0
src/main/java/info/aspirecn/cloud/yysj/model/entity/GatewaySecondLogList.java

@@ -0,0 +1,22 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 一级网关日志列表
+ *
+ * @author dingliqiang
+ */
+@Data
+@Accessors(chain = true)
+@ToString
+public class GatewaySecondLogList {
+
+    private long total;
+
+    private List<GatewaySecondLog> gatewaySecondLogs;
+}

+ 49 - 0
src/main/java/info/aspirecn/cloud/yysj/model/entity/Produce.java

@@ -0,0 +1,49 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@ToString
+@Accessors(chain = true)
+@TableName("yysj_produce")
+public class Produce {
+
+    /**
+     * 主键
+     */
+    private Integer id;
+
+    /**
+     * 产品名称
+     */
+    private String produceName;
+
+    /**
+     * 产品类型
+     */
+    private Integer type;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+}

+ 44 - 0
src/main/java/info/aspirecn/cloud/yysj/model/entity/ProduceRelevance.java

@@ -0,0 +1,44 @@
+package info.aspirecn.cloud.yysj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@ToString
+@Accessors(chain = true)
+@TableName("yysj_sjjh_produce_relevance")
+public class ProduceRelevance {
+
+    /**
+     * 主键
+     */
+    private Integer id;
+
+    /**
+     * 云验数据平台产品id
+     */
+    private Integer yysjId;
+
+    /**
+     * 数据交互平台产品id
+     */
+    private Integer sjjhId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+}

+ 39 - 0
src/main/java/info/aspirecn/cloud/yysj/model/enums/QueryType.java

@@ -0,0 +1,39 @@
+package info.aspirecn.cloud.yysj.model.enums;
+
+/**
+ * @author dingliqiang
+ */
+
+public enum QueryType {
+
+    /**
+     * 车辆查询
+     */
+    QUERY_CAR_INFO("车辆查询","/info_check/carInfo.do"),
+    /**
+     * 驾驶员查询
+     */
+    QUERY_DRIVER_INFO("驾驶员查询","/info_check/carInfo.do"),
+    /**
+     * 运单查询
+     */
+    QUERY_WAYBILL_INFO("运单查询","/info_check/carInfo.do")
+    ;
+
+    private String name;
+    private String uri;
+
+    QueryType(String name, String uri) {
+        this.name = name;
+        this.uri = uri;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+}

+ 21 - 0
src/main/java/info/aspirecn/cloud/yysj/model/remote/SjjhProduct.java

@@ -0,0 +1,21 @@
+package info.aspirecn.cloud.yysj.model.remote;
+
+import lombok.Data;
+import lombok.ToString;
+import java.io.Serializable;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@ToString
+public class SjjhProduct implements Serializable {
+    private Integer id;
+    private String sid;
+    private String name;
+    private Integer status;
+    private int channelTypeId;
+    private Integer productType;
+    private String channelTypeName;
+    private Integer price;
+}

+ 28 - 0
src/main/java/info/aspirecn/cloud/yysj/model/request/OrderQuery.java

@@ -0,0 +1,28 @@
+package info.aspirecn.cloud.yysj.model.request;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@ToString
+public class OrderQuery {
+
+    /**
+     * 主订单ID
+     */
+    private String orderId;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+}

+ 32 - 0
src/main/java/info/aspirecn/cloud/yysj/model/response/ChildOrderInfo.java

@@ -0,0 +1,32 @@
+package info.aspirecn.cloud.yysj.model.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 账户信息
+ *
+ * @author dingliqiang
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ChildOrderInfo{
+
+    @ApiModelProperty(value = "子订单ID")
+    private String orderId = "";
+
+    @ApiModelProperty(value = "订单类型")
+    private String produceName = "";
+
+    @ApiModelProperty(value = "产品ID")
+    private String produceId = "";
+
+    @ApiModelProperty(value = "产品价格")
+    private String price = "";
+
+}

+ 36 - 0
src/main/java/info/aspirecn/cloud/yysj/model/response/OrderInfo.java

@@ -0,0 +1,36 @@
+package info.aspirecn.cloud.yysj.model.response;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * 账户信息
+ *
+ * @author dingliqiang
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderInfo{
+
+    @ApiModelProperty(value = "订单ID")
+    private String orderId = "";
+
+    @ApiModelProperty(value = "订单类型")
+    private String orderType = "";
+
+    @ApiModelProperty(value = "请求时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date requestTime;
+
+    @ApiModelProperty(value = "请求时间")
+    private String orderAmount  = "";
+
+}

+ 24 - 0
src/main/java/info/aspirecn/cloud/yysj/model/response/OrderInfoList.java

@@ -0,0 +1,24 @@
+package info.aspirecn.cloud.yysj.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.util.List;
+
+/**
+ * 账户信息
+ *
+ * @author dingliqiang
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderInfoList extends Page {
+
+    List<OrderInfo> orderInfos;
+
+}

+ 35 - 0
src/main/java/info/aspirecn/cloud/yysj/model/response/Page.java

@@ -0,0 +1,35 @@
+package info.aspirecn.cloud.yysj.model.response;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author dingliqiang
+ */
+@Data
+@Accessors(chain = true)
+public class Page {
+
+    /**
+     * 设置一页显示多少条数据
+     */
+    @JsonIgnore
+    private Long pageSize;
+    /**
+     * 当前第几页
+     */
+    @JsonIgnore
+    private Long pageNum;
+    /**
+     * 总共几页
+     */
+    @JsonIgnore
+    private Long pageTotal;
+    /**
+     * 总条数
+     */
+    @JsonIgnore
+    private Long total;
+
+}

+ 30 - 0
src/main/java/info/aspirecn/cloud/yysj/service/DbService.java

@@ -0,0 +1,30 @@
+package info.aspirecn.cloud.yysj.service;
+
+import info.aspirecn.cloud.yysj.model.entity.Produce;
+import info.aspirecn.cloud.yysj.model.entity.ProduceRelevance;
+import java.util.List;
+
+/**
+ * 数据库查询服务接口
+ *
+ * @author dingliqiang
+ */
+public interface DbService {
+
+    /**
+     * 查询用户云验平台与数据交互平台关联信息列表
+     *
+     * @param produceId 云验平台产品ID
+     * @return 关联信息列表
+     */
+    List<ProduceRelevance> getProduceRelevanceList(Integer produceId);
+
+    /**
+     * 根据产品ID查询产品细腻
+     *
+     * @param produceId 云验数据平台产品ID
+     * @return 云验平台产品信息
+     */
+    Produce getProduceInfo(Long produceId);
+
+}

+ 34 - 0
src/main/java/info/aspirecn/cloud/yysj/service/OrderService.java

@@ -0,0 +1,34 @@
+package info.aspirecn.cloud.yysj.service;
+
+import info.aspirecn.cloud.yysj.model.response.ChildOrderInfo;
+import info.aspirecn.cloud.yysj.model.response.OrderInfoList;
+import java.util.List;
+
+/**
+ * @author dingliqiang
+ */
+public interface OrderService {
+
+    /**
+     * 获取主订单列表
+     *
+     * @param userId    云验数据平台用户ID
+     * @param orderId   主订单ID
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @param pageNum   查询从第几个数据开始
+     * @param size      数据大小
+     * @return 主订单列表
+     */
+    OrderInfoList getOrderList(String userId, String orderId, String startTime, String endTime,
+                                     int pageNum, int size);
+
+    /**
+     * 获取主订单的详情(子订单信息列表)
+     *
+     * @param orderId 子订单号
+     * @return 子订单信息列表
+     */
+    List<ChildOrderInfo> getOrderDetail(String orderId);
+
+}

+ 54 - 0
src/main/java/info/aspirecn/cloud/yysj/service/impl/DbServiceImpl.java

@@ -0,0 +1,54 @@
+package info.aspirecn.cloud.yysj.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import info.aspirecn.cloud.yysj.dao.db.ProduceMapper;
+import info.aspirecn.cloud.yysj.dao.db.ProduceRelevanceMapper;
+import info.aspirecn.cloud.yysj.model.entity.Produce;
+import info.aspirecn.cloud.yysj.model.entity.ProduceRelevance;
+import info.aspirecn.cloud.yysj.service.DbService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 云验平台数据库查询服务
+ *
+ * @author dingliqiang
+ */
+@Service
+public class DbServiceImpl implements DbService {
+
+    @Autowired
+    private ProduceRelevanceMapper produceRelevanceMapper;
+
+    @Autowired
+    private ProduceMapper produceMapper;
+
+    /**
+     * 查询用户云验平台与数据交互平台关联信息列表
+     *
+     * @return 关联信息列表
+     */
+    @Override
+    public List<ProduceRelevance> getProduceRelevanceList(Integer produceId) {
+        QueryWrapper<ProduceRelevance> produceRelevanceQueryWrapper = new QueryWrapper<>();
+        produceRelevanceQueryWrapper.eq("yysjId", produceId);
+        List<ProduceRelevance> sjjhProduceIdList = produceRelevanceMapper.selectList(produceRelevanceQueryWrapper);
+        return new ArrayList<>(sjjhProduceIdList);
+    }
+
+    /**
+     * 根据多个产品ID查询对应的产品列表
+     *
+     * @param produceId 产品ID列表
+     * @return 云验平台产品信息
+     */
+    @Override
+    public Produce getProduceInfo(Long produceId) {
+        QueryWrapper<Produce> produceQueryWrapper = new QueryWrapper<>();
+        produceQueryWrapper.eq("id", produceId);
+        return produceMapper.selectOne(produceQueryWrapper);
+    }
+
+}

+ 89 - 0
src/main/java/info/aspirecn/cloud/yysj/service/impl/OrderServiceImpl.java

@@ -0,0 +1,89 @@
+package info.aspirecn.cloud.yysj.service.impl;
+
+import info.aspirecn.cloud.yysj.dao.es.YysjGatewayFirstIndex;
+import info.aspirecn.cloud.yysj.dao.es.YysjGatewaySecondIndex;
+import info.aspirecn.cloud.yysj.model.entity.*;
+import info.aspirecn.cloud.yysj.model.response.ChildOrderInfo;
+import info.aspirecn.cloud.yysj.model.response.OrderInfo;
+import info.aspirecn.cloud.yysj.model.response.OrderInfoList;
+import info.aspirecn.cloud.yysj.service.DbService;
+import info.aspirecn.cloud.yysj.service.OrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.*;
+
+/**
+ * @author dingliqiang
+ */
+@Slf4j
+@Service
+public class OrderServiceImpl implements OrderService {
+
+    @Autowired
+    private YysjGatewayFirstIndex yysjGatewayFirstIndex;
+
+    @Autowired
+    private YysjGatewaySecondIndex yysjGatewaySecondIndex;
+
+    @Autowired
+    private DbService dbService;
+
+    @Override
+    public OrderInfoList getOrderList(String userId, String orderId, String startTime, String endTime,
+                                      int pageNum, int pageSize) {
+        List<OrderInfo> orderInfos = new ArrayList<>();
+        // 计算分页
+        int form = (pageNum - 1) * pageSize;
+        // 获取主订单列表
+        GatewayFirstLogList gatewayFirstLogList = yysjGatewayFirstIndex.getFirstLogList(userId, orderId,
+                startTime, endTime, form, pageSize);
+        // 查询主订单下面的子订单列表
+        for (GatewayFirstLog gatewayFirstLog : gatewayFirstLogList.getGatewayFirstLogs()) {
+            // 获取子订单信息
+            List<ChildOrderInfo> childOrderInfoList = getOrderDetail(gatewayFirstLog.getOrderId());
+            // 统计子订单价格
+            long price = 0L;
+            for (ChildOrderInfo childOrderInfo : childOrderInfoList) {
+                // 查询各个产品价格
+                price += Long.parseLong(childOrderInfo.getPrice());
+            }
+            // 设置信息
+            orderInfos.add(new OrderInfo()
+                    .setOrderId(gatewayFirstLog.getOrderId())
+                    .setRequestTime(gatewayFirstLog.getDateTime())
+                    .setOrderType(gatewayFirstLog.getType())
+                    .setOrderAmount(String.valueOf(price))
+            );
+        }
+        OrderInfoList orderInfoList =  new OrderInfoList();
+        // 设置订单信息
+        orderInfoList.setOrderInfos(orderInfos);
+        // 设置分页
+        orderInfoList.setTotal(gatewayFirstLogList.getTotal());
+        orderInfoList.setPageSize((long)pageSize);
+        orderInfoList.setPageNum((long)pageNum);
+        orderInfoList.setPageTotal((gatewayFirstLogList.getTotal()-1)/pageSize + 1);
+        return orderInfoList;
+    }
+
+    @Override
+    public List<ChildOrderInfo> getOrderDetail(String orderId) {
+        List<ChildOrderInfo> childOrderInfoList = new ArrayList<>();
+        // 获取该主订单的子订单列表
+        GatewaySecondLogList gatewaySecondLogList = yysjGatewaySecondIndex.getSecondLogList(orderId);
+        for (GatewaySecondLog gatewaySecondLog : gatewaySecondLogList.getGatewaySecondLogs()) {
+            childOrderInfoList.add(new ChildOrderInfo()
+                    .setOrderId(gatewaySecondLog.getOrderId())
+                    .setProduceId(gatewaySecondLog.getProductId())
+                    .setPrice(gatewaySecondLog.getMoney()));
+        }
+        // 根据产品ID查询产品名称
+        for (ChildOrderInfo childOrderInfo : childOrderInfoList) {
+            Produce produce = dbService.getProduceInfo(Long.valueOf(childOrderInfo.getProduceId()));
+            childOrderInfo.setProduceName(produce.getProduceName());
+        }
+        return childOrderInfoList;
+    }
+
+}

+ 46 - 0
src/main/resources/application.yml

@@ -0,0 +1,46 @@
+#spring:
+#  datasource:
+#    url: jdbc:mysql://10.8.17.119:32196/cloud-yysj?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+#    username: root
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    type: com.zaxxer.hikari.HikariDataSource
+#    hikari:
+#      minimum-idle: 5
+#      maximum-pool-size: 15
+#      auto-commit: true
+#      idle-timeout: 30000
+#      pool-name: DatebookHikariCP
+#      max-lifetime: 1800000
+#      connection-timeout: 30000
+#      password: 123456
+#
+#mybatis-plus:
+#  configuration:
+#    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
+#    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    # 驼峰下划线转换
+#    #map-underscore-to-camel-case: false
+#    # 配置的缓存的全局开关
+#    cache-enabled: true
+#    # 延时加载的开关
+#    lazy-loading-enabled: true
+#    # 开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性
+#    multiple-result-sets-enabled: true
+#    use-generated-keys: true
+#    default-statement-timeout: 60
+#    default-fetch-size: 100
+#
+#
+#elasticsearch:
+#  schema: http
+#  address: 10.8.17.119:32482
+#  #address: 192.168.16.41:30002,192.168.16.41:31821,192.168.16.41:30097
+#  connectTimeout: 5000
+#  socketTimeout: 5000
+#  connectionRequestTimeout: 5000
+#  maxConnectNum: 100
+#  maxConnectPerRoute: 100
+#  index:
+#    yysjFirst: access-yysj-gateway-first-log-cloud-yysj*
+#    yysjSecond: access-yysj-gateway-second-log-cloud-yysj*
+#    sjjh: iov_sjjh_access_test1*

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

@@ -0,0 +1,39 @@
+#ConfigMap 配置参数
+server:
+  port: 8080
+spring:
+  application:
+    name: cloud-yysj-order-query
+  cloud:
+    kubernetes:
+      reload:
+        enabled: true
+        mode: polling
+        period: 20000
+        strategy: refresh
+        monitoring-secrets: true
+      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