Jelajahi Sumber

first commit

15810770710@163.com 3 tahun lalu
induk
melakukan
77ec2cde0a
19 mengubah file dengan 1243 tambahan dan 0 penghapusan
  1. 218 0
      pom.xml
  2. 37 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/Application.java
  3. 34 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/SjjhConstant.java
  4. 195 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/action/JKChannelActionImp.java
  5. 33 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/config/SwaggerConfig.java
  6. 38 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/service/JKChannelService.java
  7. 438 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/service/impl/JKChannelServiceImpl.java
  8. 21 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/utils/SupplierProperties.java
  9. 19 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/EncryptionMobileCheckRequestChildObject.java
  10. 24 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/EncryptionMobileCheckRequestObject.java
  11. 24 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/JKResponseObject.java
  12. 21 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/JsonResolveObject.java
  13. 20 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/TwoParamIdCardResponseObject.java
  14. 25 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/VehicleMortgageJsonResolveObject.java
  15. 23 0
      src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/VehicleMortgageRequestObject.java
  16. 3 0
      src/main/resources/config/banner.txt
  17. 25 0
      src/main/resources/config/bootstrap.yml
  18. 37 0
      src/main/resources/config/logback-spring.xml
  19. 8 0
      src/main/resources/docker/Dockerfile

+ 218 - 0
pom.xml

@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.2.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+
+    <groupId>info.aspirecn.iov.sjjh</groupId>
+    <artifactId>iov-sjjh-servicenode-supplier-10000001</artifactId>
+    <version>1.0.8</version>
+    
+    <properties>
+		<log4j2.version>2.17.0</log4j2.version>
+	</properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+        </dependency>
+   		 <dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.70</version>
+		</dependency>
+        <!--链路日志-->
+        <dependency>
+            <groupId>info.aspirecn.rdc</groupId>
+            <artifactId>aspirecloud-commons-sleuthlog-starter</artifactId>
+            <version>5.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>info.aspirecn.rdc</groupId>
+            <artifactId>aspirecloud-commons-errorlog-starter</artifactId>
+            <version>5.0.2</version>
+        </dependency>
+
+        <!--常量-->
+        <dependency>
+            <groupId>info.aspirecn.iov.sjjh</groupId>
+            <artifactId>iov-sjjh-commons-lang</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>info.aspirecn.iov.sjjh</groupId>
+            <artifactId>iov-sjjh-servicenode-supplier-10000001-interface</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-config-client</artifactId>
+        </dependency>
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>Hoxton.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <build>
+        <plugins>
+            <plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includes>
+                        <include>
+                            <groupId>info.aspirecn.iov.sjjh</groupId>
+                            <artifactId>iov-sjjh-servicenode-supplier-10000001-interface</artifactId>
+                        </include>
+                        <include>
+                            <groupId>info.aspirecn.iov.sjjh</groupId>
+                            <artifactId>iov-sjjh-commons-lang</artifactId>
+                        </include>
+                    </includes>
+                </configuration>
+			</plugin>
+			
+			<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>
+
+            <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>
+                            <excludeGroupIds>
+                                info.aspirecn.iov.sjjh
+                            </excludeGroupIds>
+                        </configuration>
+                    </execution>
+                    <execution>
+					    <id>copy</id>
+					    <phase>install</phase>
+					    <goals>
+					        <goal>copy-dependencies</goal>
+					    </goals>
+					    <configuration>
+					        <outputDirectory>
+					            ${project.build.directory}/lib
+					        </outputDirectory>
+					        <excludeGroupIds>
+					            info.aspirecn.iov.sjjh
+					        </excludeGroupIds>
+					    </configuration>
+					</execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>default-resources</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/classes</outputDirectory>
+                            <useDefaultDelimiters>false</useDefaultDelimiters>
+                            <delimiters>
+                                <delimiter>@</delimiter>
+                            </delimiters>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources/config</directory>
+                                    <targetPath>config</targetPath>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>**</include>
+                                    </includes>
+                                </resource>
+                                <resource>
+                                    <directory>src/main/resources/docker</directory>
+                                    <targetPath>docker</targetPath>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>**</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>1.2.0</version>
+                <configuration>
+                    <!-- 设置Docker 镜像名称 -->
+                    <imageName>hub.i139.cn/iov-sjjh/${project.artifactId}:${project.version}</imageName>
+                    <!-- 设置Dockerfile存放目录地址 -->
+                    <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                    <!-- 设置和setting.xml中的servers对应的server,里面存放了docker hub仓库的用户名、密码 -->
+                    <serverId>docker-hub</serverId>
+                    <!-- 设置docker hub仓库地址 -->
+                    <registryUrl>https://hub.i139.cn</registryUrl>
+                    <!-- 设置docker remote API地址 -->
+                    <!--<dockerHost>http://docker-in-docker.rdc-plugin:2375</dockerHost>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 37 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/Application.java

@@ -0,0 +1,37 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk;
+
+import info.aspirecn.rdc.aspirecloud.node.except.annotations.EnableAspireCloudRdcHandleExcept;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import org.springframework.util.StopWatch;
+
+/**
+ * @author jianggang
+ * @Date 2018/10/24 14:23:06
+ * @Description
+ */
+
+@SpringBootApplication
+@EnableAspireCloudRdcHandleExcept
+@Slf4j
+@EnableEurekaClient
+@EnableFeignClients(basePackages = {"info.aspirecn.rdc"})
+@ComponentScan("info.aspirecn.rdc.aspirecloud.node.except")
+@ComponentScan("info.aspirecn.rdc.aspirecloud.node.brave")
+public class Application {
+    public static void main(String[] args) {
+        StopWatch watch = new StopWatch();
+        watch.start();
+        ApplicationContext context = SpringApplication.run(Application.class, args);
+        Environment environment = context.getBean(Environment.class);
+        String applicationName = environment.getProperty("spring.application.name");
+        watch.stop();
+        log.info("{} 启动完毕,times={}s", applicationName, watch.getTotalTimeSeconds());
+    }
+}

+ 34 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/SjjhConstant.java

@@ -0,0 +1,34 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk;
+
+/**
+ * 返回码
+ * @author minmin
+ *
+ */
+public class SjjhConstant {
+	private SjjhConstant() {
+		
+	}
+	
+	/**联通三要素接口返回200时也表示查询无结果且收费*/
+    public static final String RETURN_SUCCESS = "200";
+    /**查询一致时扣费*/
+    public static final String QUERY_IDENTICAL = "1";
+    /**查询不一致时扣费*/
+    public static final String QUERY_NO_IDENTICAL = "0";
+    /**sha256加密方式*/
+    public static final String ENCRYPTION_SHA256 = "SHA256";
+    // data == 1
+    public static final String RESPONSE_DATA_1 = "1";
+    // data == 2
+    public static final String RESPONSE_DATA_2 = "2";
+    // data == 3
+    public static final String RESPONSE_DATA_3 = "3";
+    //dybj == 0
+    public static final String RESPONSE_DYBJ_0 = "0";
+    //dybj == 1
+    public static final String RESPONSE_DYBJ_1 = "1";
+    //dybj == 2
+    public static final String RESPONSE_DYBJ_2 = "2";
+
+}

+ 195 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/action/JKChannelActionImp.java

@@ -0,0 +1,195 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.action;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Preconditions;
+import info.aspirecn.iov.sjjh.commons.lang.ChannelTypeHandleResponseObject;
+import info.aspirecn.iov.sjjh.commons.lang.Constant;
+import info.aspirecn.rdc.aspirecloud.node.except.utils.ErrorUtils;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.service.JKChannelService;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo.TwoParamIdCardResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.action.JKChannelAction;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.EncryptionMobileCheckResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.EncryptionResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.ResponseObject;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+
+
+/**
+ *
+ * @author jianggang
+ * @Date 2018/10/24 14:36:00
+ * @Description 交科供应商-上游接口调用controller
+ */
+
+@RestController
+@Slf4j
+public class JKChannelActionImp implements JKChannelAction {
+
+	@Autowired
+    private ObjectMapper objectMapper;
+    @Autowired
+    JKChannelService jkChannelService;
+
+	/**日志参数中的错误参数名*/
+	private static final String LOG_ERROR_PARA = "x-responseCode";
+	/**日志参数中的是否收费*/
+	private static final String LOG_FEE_PARA = "x-isCharge";
+
+    @Override
+    public ResponseObject TwoParamIdCard(
+            @RequestHeader(name = "channelId",required = true) String channelId,
+            @RequestParam(name = "outTime", required = false) Integer outTime,
+            @RequestParam(name = "customBody",required = true) String customBody) {
+        log.info("交科身份证而要素请求--->channelId:{}--->outTime:{},--->customBody:{}",channelId,outTime,customBody);
+
+        ResponseObject responseObject = jkChannelService.sendTwoParamIdCardRequest(channelId,outTime,customBody);
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = servletRequestAttributes.getRequest();
+        //日志记录通道类型-同步
+        request.setAttribute(Constant.CHANNEL_TYPE_KEY,Constant.CHANNEL_TYPE_SYNC);
+		//日志记录通道响应码
+        if(responseObject.getCode() != 1){
+            request.setAttribute("x-responseCode",Constant.CHANNEL_LOG_ERROR_CODE);
+        }else{
+            request.setAttribute("x-responseCode",Constant.CHANNEL_LOG_SUCCESS_CODE);
+        }
+        //日志记录通道请求参数
+        if(customBody != null){
+            try {
+                request.setAttribute(Constant.CHANNEL_LOG_QUERY,Base64.encodeBase64String(customBody.getBytes("utf-8")));
+            } catch (UnsupportedEncodingException e) {
+                ExceptionUtils.handleThrowable(e);
+                log.error("异常信息{}",e);
+            }
+        }
+        Object resultBody = responseObject.getResultBody();
+        //日志记录上游接口响应码
+        if(resultBody != null){
+        	Integer upStreamCode = ((TwoParamIdCardResponseObject)responseObject.getResultBody()).getCode();
+            request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE,String.valueOf(upStreamCode));
+        }else{
+            request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE,Constant.LOG_UPSTREAM_DEFAULT_RESPONSE_CODE);
+        }
+        request.setAttribute("x-isCharge",responseObject.getIsCharge());
+        return responseObject;
+    }
+
+    @Override
+	@ApiOperation(value = "移动三要素加密版接口", notes = "")
+    public EncryptionResponseObject encryptionMobileCheck(
+    		@ApiParam(value="通道ID")@RequestHeader(name="channelId")  String channelId,
+    		@ApiParam(value="超时时间,单位:毫秒",example = "10000")@RequestParam(name = "outTime", required = true) int outTime,
+    		@ApiParam(value="请求参数JSON串")@RequestParam(name = "customBody", required = true) String customBody) {
+		Preconditions.checkNotNull(channelId, "通道ID为空");
+		Preconditions.checkNotNull(customBody, "三要素加密版接口请求参数为空");
+
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+				.getRequest();
+		EncryptionResponseObject ret = jkChannelService.encryptionMobileCheck(customBody, outTime);
+
+		if(StringUtils.isBlank(channelId)) {
+			ret.setChannelId(Constant.JK_ENCRYPTION_CHANNEL_ID);
+		} else {
+			ret.setChannelId(channelId);
+		}
+
+        //把接口参数、调用结果和是否收费放入访问日志中
+        if(ret.getCode() != Constant.SUCCESS) {
+    		request.setAttribute(LOG_ERROR_PARA, Constant.CHANNEL_LOG_ERROR_CODE);
+    	} else {
+    		request.setAttribute(LOG_ERROR_PARA, Constant.CHANNEL_LOG_SUCCESS_CODE);
+    	}
+
+		String upstreamCode = ""+Constant.LOG_UPSTREAM_DEFAULT_RESPONSE_CODE;
+		try {
+	    	request.setAttribute(LOG_FEE_PARA, ret.getIsCharge());
+    		request.setAttribute(Constant.CHANNEL_LOG_QUERY,
+    				Base64.encodeBase64String(customBody.getBytes("UTF-8")));
+
+    		//解析返回,获取接口返回的code
+	    	String jsonStr = objectMapper.writeValueAsString(ret.getResultBody());
+	    	EncryptionMobileCheckResponseObject responseObject = objectMapper.readValue(jsonStr,
+	    			EncryptionMobileCheckResponseObject.class);
+	    	if(responseObject != null) {
+	    		upstreamCode = responseObject.getCode();
+	    	}
+    	} catch (Exception ex) {
+    		ErrorUtils.captureException(ex);
+    	}
+		request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
+
+        return ret;
+	}
+    @Override
+   	@ApiOperation(value = "移动三要素加密版接口", notes = "")
+       public ChannelTypeHandleResponseObject encryptionMobileCheckNew(
+       		@ApiParam(value="通道ID")@RequestHeader(name="channelId")  String channelId,
+       		@ApiParam(value="超时时间,单位:毫秒",example = "10000")@RequestParam(name = "outTime", required = true) int outTime,
+       		@ApiParam(value="请求参数JSON串")@RequestParam(name = "customBody", required = true) String customBody) {
+    	log.info("channelId:{},outTime:{},customBody:{}",channelId,outTime,customBody);
+    	ChannelTypeHandleResponseObject channelType = new ChannelTypeHandleResponseObject();
+        channelType.setCode(1);
+        channelType.setIsCharge(1);
+        channelType.setResultCode(1);
+        channelType.setResultBody("匹配");
+    	return channelType;
+    }
+
+	@Override
+	public ChannelTypeHandleResponseObject vehicleMortgage(String channelId, int outTime, String customBody) {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+				.getRequest();
+
+		//调用service
+		ChannelTypeHandleResponseObject responseObject = jkChannelService.vehicleMortgage(request, customBody, outTime);
+
+		//把接口参数、调用结果和是否收费放入访问日志中
+		if(responseObject.getCode() != Constant.SUCCESS) {
+			request.setAttribute(LOG_ERROR_PARA, Constant.CHANNEL_LOG_ERROR_CODE);
+		} else {
+			request.setAttribute(LOG_ERROR_PARA, Constant.CHANNEL_LOG_SUCCESS_CODE);
+		}
+		request.setAttribute(LOG_FEE_PARA, responseObject.getIsCharge());
+
+		try {
+			request.setAttribute(Constant.CHANNEL_LOG_QUERY,
+					Base64.encodeBase64String(customBody.getBytes("UTF-8")));
+		} catch (Exception ex) {
+			ErrorUtils.captureException(ex);
+		}
+
+		request.setAttribute(Constant.CHANNEL_TYPE_KEY, Constant.CHANNEL_TYPE_SYNC);
+		return responseObject;
+	}
+
+	/**
+	 * 参数校验
+	 * @param channelId
+	 * @param staticChannelId
+	 * @return
+	 */
+	public EncryptionResponseObject checkParams(String channelId,String staticChannelId) {
+		EncryptionResponseObject ret = new EncryptionResponseObject();
+		if(!staticChannelId.equals(channelId)) {
+			ret.setCode(Constant.CHANNEL_ID_NO_MATCH);
+	        ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);ret.setMessage("channelid不匹配");
+
+		}
+
+		return ret;
+	}
+}

+ 33 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/config/SwaggerConfig.java

@@ -0,0 +1,33 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.config;
+
+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;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @author jianggang
+ * @Date 2018/10/18 16:55:31
+ * @Description
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createRestApi() {
+
+        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+                .apis(RequestHandlerSelectors.basePackage("info.aspirecn.rdc.iov.sjjh"))
+                .paths(PathSelectors.any()).build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder().title("交科-通道API").description("").termsOfServiceUrl("").version("1.0.0").build();
+    }
+}

+ 38 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/service/JKChannelService.java

@@ -0,0 +1,38 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.service;
+
+import info.aspirecn.iov.sjjh.commons.lang.ChannelTypeHandleResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.EncryptionResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.ResponseObject;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author jianggang
+ * @Date 2018/10/24 14:37:13
+ * @Description
+ */
+
+public interface JKChannelService {
+
+    /**
+     * 请求交科身份证二要素接口
+     * @param channelId
+     * @param outTime
+     * @param customBody
+     * @return
+     */
+    ResponseObject sendTwoParamIdCardRequest(
+            String channelId, Integer outTime, String customBody);
+
+
+    /**
+     * 三要素检验加密版接口
+     * @param customBody
+     * @param outTime
+     * @return
+     */
+	public EncryptionResponseObject encryptionMobileCheck(String customBody, int outTime);
+
+	ChannelTypeHandleResponseObject vehicleMortgage(HttpServletRequest request, String customBody, int outTime);
+
+}

+ 438 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/service/impl/JKChannelServiceImpl.java

@@ -0,0 +1,438 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Preconditions;
+import info.aspirecn.iov.sjjh.commons.lang.ChannelTypeHandleResponseObject;
+import info.aspirecn.iov.sjjh.commons.lang.Constant;
+import info.aspirecn.iov.sjjh.commons.lang.Md5Util;
+import info.aspirecn.iov.sjjh.commons.lang.PatternTools;
+import info.aspirecn.rdc.aspirecloud.node.except.utils.ErrorUtils;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.SjjhConstant;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.service.JKChannelService;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.utils.SupplierProperties;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo.*;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.CustomBodyObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.EncryptionMobileCheckResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.EncryptionResponseObject;
+import info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk_interface.vo.ResponseObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.net.SocketTimeoutException;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
+/**
+ * @author jianggang
+ * @Date 2018/10/24 14:40:13
+ * @Description
+ */
+
+@Service
+@Slf4j
+public class JKChannelServiceImpl implements JKChannelService {
+	@Autowired
+    private ObjectMapper objectMapper;
+	@Value("${custom.url}")
+	private String url;
+	@Value("${custom.api}")
+    private String api;
+	@Value("${custom.appKey}")
+    private String appKey;
+	@Value("${custom.secretKey}")
+    private String sKey;
+	@Value("${custom.mortgage-api}")
+	private String mortgageApi;
+	@Value("${custom.url-new}")
+	private String newUrl;
+
+    @Autowired
+    private SupplierProperties supplierProperties;
+
+    private static final ConnectionPool POOL = new ConnectionPool(4000,
+            5, TimeUnit.MINUTES);
+    private OkHttpClient client = new OkHttpClient.Builder().build();
+
+    @Override
+    public ResponseObject sendTwoParamIdCardRequest(String channelId,Integer outTime,String customBody) {
+        StopWatch watch = new StopWatch();
+        watch.start();
+        TwoParamIdCardResponseObject responseObject = new TwoParamIdCardResponseObject();
+        ResponseObject res = new ResponseObject();
+        OkHttpClient okHttpClient;
+
+        try {
+            Preconditions.checkNotNull(channelId,"通道id为空");
+            Preconditions.checkNotNull(customBody,"请求json字符串为空");
+
+//            //通道id匹配错误
+//            if (!channelId.equals(Constant.JK_IDCARD_CHANNEL_ID)) {
+//                res.setCode(Constant.CHANNEL_ID_NO_MATCH);
+//                res.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+//                return res;
+//            }
+
+			/**模拟返回*/
+			if(Integer.valueOf(supplierProperties.getSleepTime())==50000){
+                res.setIsCharge(Constant.INTERFACE_QUERY_FEE);
+                res.setCode(Constant.SUCCESS);
+                TwoParamIdCardResponseObject twoParamIdCardResponseObject = new TwoParamIdCardResponseObject();
+                twoParamIdCardResponseObject.setCode(200);
+                twoParamIdCardResponseObject.setResult("101");
+                res.setResultBody(twoParamIdCardResponseObject);
+				return res;
+			}
+
+			/**模拟错误*/
+			if(Integer.valueOf(supplierProperties.getSleepTime())==20000){
+				throw new IllegalArgumentException();
+			}
+
+            /**模拟超时*/
+            if(outTime < Integer.valueOf(supplierProperties.getSleepTime())){
+                log.error("simulation SocketTimeoutException--->outTime:{}--->sleepTime:{}",outTime,supplierProperties.getSleepTime());
+                throw new SocketTimeoutException();
+            }
+
+            ObjectMapper mapper = new ObjectMapper();
+            CustomBodyObject customBodyObject = mapper.readValue(customBody,CustomBodyObject.class);
+            Preconditions.checkNotNull(customBodyObject.getName(),"姓名不能为空");
+            Preconditions.checkNotNull(customBodyObject.getIdCode(),"身份证不能为空");
+
+            if(outTime == null && outTime <= 0){
+                outTime = Constant.HTTPCLIENT_CONNECTTIMEOUT;
+            }
+
+            okHttpClient = client.newBuilder()
+                    .connectTimeout(outTime,TimeUnit.MILLISECONDS)
+                    .writeTimeout(outTime,TimeUnit.MILLISECONDS)
+                    .readTimeout(outTime,TimeUnit.MILLISECONDS)
+                    .connectionPool(POOL)
+                    .build();
+            res.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+            res.setCode(Constant.FAIL);
+            String url = supplierProperties.getUrl()+"?cname="+customBodyObject.getName()+"&cid="+customBodyObject.getIdCode();
+            Request request = new Request.Builder()
+                    .url(url)
+                    .build();
+            StopWatch watch1 = new StopWatch();
+            watch1.start();
+            Response response = okHttpClient.newCall(request).execute();
+			String responseJson = response.body().string();
+			log.info("---->上游返回结果{}",responseJson);
+            watch1.stop();
+            log.info("upStream request time : {}",watch1.getTotalTimeSeconds());
+            if(response.code()==200){
+              res.setCode(Constant.SUCCESS);
+        	  responseObject = mapper.readValue(responseJson, TwoParamIdCardResponseObject.class);
+        	  res.setResultBody(responseObject);
+        	  //判断是否计费
+              if (responseObject.getCode() == 200) {
+                  res.setIsCharge(Constant.INTERFACE_QUERY_FEE);
+              }
+            }
+
+        }catch (SocketTimeoutException e) {
+            log.error("SocketTimeoutException message:{}",e);
+            ErrorUtils.captureException(e);
+            res.setCode(Constant.REQUEST_TIMEOUT);
+            res.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+            return res;
+        }catch (Exception e){
+            log.error("Exception message:{}",e);
+            ErrorUtils.captureException(e);
+            res.setCode(Constant.FAIL);
+            res.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+            return res;
+        }
+        watch.stop();
+        log.info("service request time : {}",watch.getTotalTimeSeconds());
+        return res;
+    }
+
+
+
+    @Override
+    public EncryptionResponseObject encryptionMobileCheck(String customBody,int outTime){
+    	EncryptionResponseObject ret = new EncryptionResponseObject();
+    	 try {
+    		 if(outTime <= 0) {
+ 	        	outTime = Constant.HTTPCLIENT_CONNECTTIMEOUT;
+ 	         }
+
+    		 log.info("encryptionMobileCheck---customBody={},outTime={}",customBody,outTime);
+    		 JsonResolveObject jsonResolveObject = objectMapper.readValue(customBody,
+    				 JsonResolveObject.class);
+
+
+    		log.info("encryptionMobileCheck---requestObject={}",jsonResolveObject);
+	        String name = jsonResolveObject.getName();
+	        String idCode = jsonResolveObject.getIdCode();
+	        String mobile = jsonResolveObject.getMobile();
+
+	    	EncryptionMobileCheckRequestObject requestObject = new EncryptionMobileCheckRequestObject();
+	    	requestObject.setApi(api);
+	    	requestObject.setAppKey(appKey);
+	    	requestObject.setAppSecret(sKey);
+
+	    	EncryptionMobileCheckRequestChildObject requestChildObject = new EncryptionMobileCheckRequestChildObject();
+	    	requestChildObject.setEncrypt(SjjhConstant.ENCRYPTION_SHA256);
+	    	requestChildObject.setId_number(idCode);
+	    	requestChildObject.setMobile(mobile);
+	    	requestChildObject.setName(name);
+	    	String sign = Md5Util.encrypt32("appSecret="+ sKey +"&enctype=" + SjjhConstant.ENCRYPTION_SHA256
+	    			+"&id_number="+ idCode +"&mobile="+ mobile +"&name="+ name);
+	    	requestChildObject.setSign(sign);
+	    	requestObject.setData(objectMapper.writeValueAsString(requestChildObject));
+	        String jsonStr = objectMapper.writeValueAsString(requestObject);
+	        log.info("调用三要素加密接口时传的JSON:"+jsonStr);
+	        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
+	        RequestBody requestBody = RequestBody.create(mediaType, jsonStr);
+
+	    	Request request = new Request.Builder().post(requestBody).url(url).build();
+	    	OkHttpClient httpClient = client.newBuilder()
+	    			.connectTimeout(outTime, TimeUnit.MILLISECONDS)
+	    			.readTimeout(outTime, TimeUnit.MILLISECONDS)
+	    			.writeTimeout(outTime, TimeUnit.MILLISECONDS)
+	    			.build();
+	    	Response response = httpClient.newCall(request).execute();
+	        String responseContext = response.body().string();
+	        log.info("三要素加密版responseContext={}",responseContext);
+
+	        EncryptionMobileCheckResponseObject responseObject = objectMapper.readValue(responseContext,
+	        		EncryptionMobileCheckResponseObject.class);
+
+
+	        //返回结果中的code为200时,data为1或0时收费
+	        if(responseObject != null) {
+	    		boolean bool = SjjhConstant.RETURN_SUCCESS.equals(responseObject.getCode())
+	    				&& (SjjhConstant.QUERY_IDENTICAL.equalsIgnoreCase(responseObject.getData())
+						|| SjjhConstant.QUERY_NO_IDENTICAL.equalsIgnoreCase(responseObject.getData()));
+	    		if(bool) {
+	    			ret.setIsCharge(Constant.INTERFACE_QUERY_FEE);
+	    		}
+	    		ret.setCode(Constant.SUCCESS);
+	    		ret.setMessage("查询成功");
+	    		ret.setResultBody(responseObject);
+	    		response.close();
+	    	} else {
+	    		ret.setCode(Constant.FAIL);
+	        	ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+	    	}
+
+	    } catch(SocketTimeoutException ste) {
+	    	ErrorUtils.captureException(ste);
+	    	ret.setCode(Constant.REQUEST_TIMEOUT);
+	    	ret.setMessage("接口调用超时");
+	    	ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+	    } catch(Exception ioe) {
+	    	ErrorUtils.captureException(ioe);
+	    	ret.setCode(Constant.FAIL);
+	    	ret.setMessage("接口调用失败");
+	    	ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+	    }
+
+    	return ret;
+    }
+
+	@Override
+	public ChannelTypeHandleResponseObject vehicleMortgage(HttpServletRequest request, String customBody, int outTime) {
+		ChannelTypeHandleResponseObject ret = new ChannelTypeHandleResponseObject();
+		ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
+		String upstreamCode = Constant.LOG_UPSTREAM_DEFAULT_RESPONSE_CODE;
+		String returnType = request.getHeader(Constant.CUSTOMER_RETURN_TYPE_PARA);
+
+		if (StringUtils.isBlank(returnType)) {
+			returnType = Constant.CUSTOMER_RETURN_ZW;
+		}
+		if (outTime <= 0) {
+			outTime = Constant.HTTPCLIENT_CONNECTTIMEOUT;
+		}
+		log.info("vehicleMortgage---customBody={},outTime={}", customBody, outTime);
+
+		try {
+			VehicleMortgageJsonResolveObject jsonResolveObject = objectMapper.readValue(customBody, VehicleMortgageJsonResolveObject.class);
+			//参数校验
+			if (!validateVehicleMortgageParams(ret, returnType, jsonResolveObject)) {
+				ret.setCode(Constant.SUCCESS);
+				request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
+				return ret;
+			}
+
+			JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(jsonResolveObject));
+			jsonObject.put("vehicleIdentificationNumber", jsonResolveObject.getVin().substring(jsonResolveObject.getVin().length()-6));
+			VehicleMortgageRequestObject requestObject = new VehicleMortgageRequestObject();
+			requestObject.setApi(mortgageApi);
+			requestObject.setAppKey(appKey);
+			requestObject.setAppSecret(sKey);
+			requestObject.setData(jsonObject.toJSONString());
+
+			MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
+			RequestBody requestBody = RequestBody.create(mediaType, JSON.toJSONString(requestObject));
+			Request okRequest = new Request.Builder()
+					.post(requestBody)
+					.url(newUrl)
+					.build();
+			OkHttpClient client = new OkHttpClient.Builder()
+					.connectTimeout(outTime, TimeUnit.MILLISECONDS)
+					.readTimeout(outTime, TimeUnit.MILLISECONDS)
+					.writeTimeout(outTime, TimeUnit.MILLISECONDS)
+					.build();
+			Response response = client.newCall(okRequest).execute();
+			String responseContext = "";
+			if (response.body() != null) {
+				responseContext = response.body().string();
+			}
+			log.info("supplier10000001.vehicleMortgage接口responseContext={}", responseContext);
+			JKResponseObject responseObject = objectMapper.readValue(responseContext, JKResponseObject.class);
+			log.info("supplier10000001.vehicleMortgage接口responseObject={}", responseObject);
+			if (responseObject != null) {
+				ret.setCode(Constant.SUCCESS);
+				setVehicleMortgageResponse(ret, returnType, responseObject);
+				upstreamCode = String.valueOf(responseObject.getCode());
+				response.close();
+			} else {
+				ret.setCode(Constant.FAIL);
+			}
+		} catch (SocketTimeoutException ste) {
+			ErrorUtils.captureException(ste);
+			log.info("supplier10000001.vehicleMortgage接口SocketTimeoutException={}", ste);
+			ret.setCode(Constant.REQUEST_TIMEOUT);
+		} catch (Exception ioe) {
+			ErrorUtils.captureException(ioe);
+			log.info("supplier10000001.vehicleMortgage接口Exception={}", ioe);
+			ret.setCode(Constant.FAIL);
+		}
+
+		//上游返回码
+		request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
+		return ret;
+	}
+	private void setVehicleMortgageResponse(ChannelTypeHandleResponseObject ret, String returnType, JKResponseObject responseObject) {
+		boolean isCharge = responseObject != null
+				&& (responseObject.getCode().equals(SjjhConstant.RETURN_SUCCESS)
+				&& (responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_1)
+					|| responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_2)));
+		if (isCharge) {
+			ret.setIsCharge(Constant.INTERFACE_QUERY_FEE);
+		}
+
+		if (Constant.CUSTOMER_RETURN_JK.equals(returnType)) {
+			if (responseObject.getCode().equals(SjjhConstant.RETURN_SUCCESS) && responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_1)) {
+				JSONObject msgObject = JSONObject.parseObject(responseObject.getMsg());
+				String mortgageFlag = String.valueOf(msgObject.get("DYBJ"));
+				if (mortgageFlag.equals(SjjhConstant.RESPONSE_DYBJ_0)) {
+					// 未抵押
+					ret.setResultCode(Constant.JK_RETURN_CODE_1171);
+					ret.setResultBody(Constant.RETURN_MESSAGE_111);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_111);
+				} else if (mortgageFlag.equals(SjjhConstant.RESPONSE_DYBJ_1)) {
+					// 抵押
+					ret.setResultCode(Constant.JK_RETURN_CODE_1172);
+					ret.setResultBody(Constant.RETURN_MESSAGE_112);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_112);
+				} else {
+					// 质押
+					ret.setResultCode(Constant.JK_RETURN_CODE_1173);
+					ret.setResultBody(Constant.RETURN_MESSAGE_113);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_113);
+				}
+			} else if (responseObject.getCode().equals(SjjhConstant.RETURN_SUCCESS) && responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_2)) {
+				// 库无
+				ret.setResultCode(Constant.JK_RETURN_CODE_NO_INFO);
+				ret.setResultBody(Constant.UN_FIND_NUM);
+				ret.setResultDesc(Constant.UN_FIND_NUM);
+			} else {
+				// 查询错误
+				ret.setResultCode(Constant.JK_RETURN_CODE_OTHER_ERROR);
+				ret.setResultBody(Constant.OTHER_ERROR);
+				ret.setResultDesc(Constant.OTHER_ERROR);
+			}
+		} else {
+			if (responseObject.getCode().equals(SjjhConstant.RETURN_SUCCESS) && responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_1)) {
+				JSONObject msgObject = JSONObject.parseObject(responseObject.getMsg());
+				String mortgageFlag = String.valueOf(msgObject.get("DYBJ"));
+				if (mortgageFlag.equals(SjjhConstant.RESPONSE_DYBJ_0)) {
+					// 未抵押
+					ret.setResultCode(Constant.ZW_RETURN_CODE_111);
+					ret.setResultBody(Constant.RETURN_MESSAGE_111);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_111);
+				} else if (mortgageFlag.equals(SjjhConstant.RESPONSE_DYBJ_1)) {
+					// 抵押
+					ret.setResultCode(Constant.ZW_RETURN_CODE_112);
+					ret.setResultBody(Constant.RETURN_MESSAGE_112);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_112);
+				} else {
+					// 质押
+					ret.setResultCode(Constant.ZW_RETURN_CODE_113);
+					ret.setResultBody(Constant.RETURN_MESSAGE_113);
+					ret.setResultDesc(Constant.RETURN_MESSAGE_113);
+				}
+			} else if (responseObject.getCode().equals(SjjhConstant.RETURN_SUCCESS) && responseObject.getData().equals(SjjhConstant.RESPONSE_DATA_2)) {
+				// 库无
+				ret.setResultCode(Constant.UN_FIND_NUM_CODE);
+				ret.setResultBody(Constant.UN_FIND_NUM);
+				ret.setResultDesc(Constant.UN_FIND_NUM);
+			} else {
+				// 查询错误
+				ret.setResultCode(Constant.OTHER_ERROR_CODE);
+				ret.setResultBody(Constant.OTHER_ERROR);
+				ret.setResultDesc(Constant.OTHER_ERROR);
+			}
+		}
+	}
+
+	private boolean validateVehicleMortgageParams(ChannelTypeHandleResponseObject ret, String returnType, VehicleMortgageJsonResolveObject jsonResolveObject) {
+		if (!validateParamNullValue(jsonResolveObject)) {
+			// 参数名错误
+			if (Constant.CUSTOMER_RETURN_ZW.equals(returnType)) {
+				ret.setResultCode(Constant.INVALID_PARAMETER_CODE);
+			} else {
+				ret.setResultCode(Constant.JK_RETURN_CODE_INVALID_PARAMETER);
+			}
+			ret.setResultBody(Constant.PARAMETER_NAME_ERROR);
+			ret.setResultDesc(Constant.PARAMETER_NAME_ERROR);
+			return false;
+		} else if (StringUtils.isBlank(jsonResolveObject.getPlateNumber())
+				|| StringUtils.isBlank(jsonResolveObject.getEngineNumber())
+				|| StringUtils.isBlank(jsonResolveObject.getVin())
+				|| !PatternTools.checkResult(Constant.PATTERN_CAR_NUMBER_REGEX, jsonResolveObject.getPlateNumber())
+				|| !Pattern.compile("[a-zA-Z0-9]{17}").matcher(jsonResolveObject.getVin()).matches()
+				|| !Pattern.compile("^[A-Za-z0-9]+$").matcher(jsonResolveObject.getEngineNumber()).matches()) {
+			if (Constant.CUSTOMER_RETURN_ZW.equals(returnType)) {
+				ret.setResultCode(Constant.INVALID_PARAMETER_CODE);
+			} else {
+				ret.setResultCode(Constant.JK_RETURN_CODE_INVALID_PARAMETER);
+			}
+			ret.setResultDesc(Constant.INVALID_PARAMETER);
+			ret.setResultBody(Constant.INVALID_PARAMETER);
+			return false;
+		}
+    	return true;
+	}
+
+	private boolean validateParamNullValue(Object jsonResolveObject) {
+		ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
+		Validator validator = vf.getValidator();
+		Set<ConstraintViolation<Object>> set = validator.validate(jsonResolveObject);
+		for (ConstraintViolation<Object> con : set) {
+			if (StringUtils.isNotBlank(con.getMessage())) {
+				return false;
+			}
+		}
+		return true;
+	}
+}

+ 21 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/utils/SupplierProperties.java

@@ -0,0 +1,21 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.utils;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author jianggang
+ * @Date 2018/12/20 10:35:59
+ * @Description
+ */
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "supplier")
+public class SupplierProperties {
+
+    private String url;
+
+    private String sleepTime;
+}

+ 19 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/EncryptionMobileCheckRequestChildObject.java

@@ -0,0 +1,19 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true, includeFieldNames = true)
+public class EncryptionMobileCheckRequestChildObject {
+	/**身份证号*/
+	private String id_number;
+	/**手机号*/
+	private String mobile;
+	/**姓名*/
+	private String name;
+	/**加密方式:MD5或SHA256,默认为sha256*/
+	private String encrypt;
+	/**把身份证、手机号、姓名、加密方式MD5后的校验字符串*/
+	private String sign;
+}

+ 24 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/EncryptionMobileCheckRequestObject.java

@@ -0,0 +1,24 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * 三要素核验加密接口请求对象
+ * @author minmin
+ *
+ */
+@Data
+@ToString(callSuper = true, includeFieldNames = true)
+public class EncryptionMobileCheckRequestObject {
+	/**api*/
+	private String api;
+	/**appKey*/
+	private String appKey;
+	/**appSecret*/
+	private String appSecret;
+	/**请求子对象的JSON串*/
+	private String data;
+
+
+}

+ 24 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/JKResponseObject.java

@@ -0,0 +1,24 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @description:
+ * @author: xusonglin
+ * @create: 2019/9/10 11:59
+ * @version: V1.0
+ **/
+@Data
+@ToString
+public class JKResponseObject {
+    private String data;
+    /**接口返回码*/
+    private String code;
+    /**检验结果信息*/
+    private String msg;
+    /**流水号*/
+    @JsonProperty(value = "requestid")
+    private String requestId;
+}

+ 21 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/JsonResolveObject.java

@@ -0,0 +1,21 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * 解析请求JSON串对象
+ * @author minmin
+ *
+ */
+@Data
+@ToString(callSuper = true, includeFieldNames = true)
+public class JsonResolveObject {
+	/**姓名*/
+	private String name;
+	/**身份证号*/
+	private String idCode;
+	/**手机号*/
+	private String mobile;
+
+}

+ 20 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/TwoParamIdCardResponseObject.java

@@ -0,0 +1,20 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author jianggang
+ * @Date 2018/10/24 14:09:53
+ * @Description
+ */
+
+@Data
+public class TwoParamIdCardResponseObject implements Serializable {
+
+    private Integer code;
+
+    private String result;
+
+}

+ 25 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/VehicleMortgageJsonResolveObject.java

@@ -0,0 +1,25 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @description:
+ * @author: xusonglin
+ * @create: 2019/9/10 9:45
+ * @version: V1.0
+ **/
+@Data
+@ToString
+public class VehicleMortgageJsonResolveObject {
+    @NotNull(message = "参数名错误")
+    private String plateNumber;
+
+    @NotNull(message = "参数名错误")
+    private String engineNumber;
+
+    @NotNull(message = "参数名错误")
+    private String vin;
+}

+ 23 - 0
src/main/java/info/aspirecn/rdc/iov/sjjh/servicenode/supplier/jk/vo/VehicleMortgageRequestObject.java

@@ -0,0 +1,23 @@
+package info.aspirecn.rdc.iov.sjjh.servicenode.supplier.jk.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @description:
+ * @author: xusonglin
+ * @create: 2019/9/10 9:37
+ * @version: V1.0
+ **/
+@Data
+@ToString
+public class VehicleMortgageRequestObject {
+    /**api*/
+    private String api;
+    /**appKey*/
+    private String appKey;
+    /**appSecret*/
+    private String appSecret;
+    /**请求子对象的JSON串*/
+    private String data;
+}

+ 3 - 0
src/main/resources/config/banner.txt

@@ -0,0 +1,3 @@
+*******************************************************************************
+	 @project.artifactId@  (version:@project.version@)
+*******************************************************************************

+ 25 - 0
src/main/resources/config/bootstrap.yml

@@ -0,0 +1,25 @@
+spring:
+  application:
+    name: iov-sjjh-servicenode-supplier-10000001
+  banner:
+    location: classpath:config/banner.txt
+  profiles:
+    active: test
+  cloud:
+    config:
+      discovery:
+        enabled: false
+      uri: http://10.8.18.157:32533
+      label: trunk
+      name: ${spring.application.name}
+      profile: ${spring.profiles.active}
+
+server:
+  port: 20901
+management:
+  server:
+    port: 21091
+
+info:
+  name: '@project.description@'
+  version: '@project.version@'

+ 37 - 0
src/main/resources/config/logback-spring.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
+	<include
+		resource="org/springframework/boot/logging/logback/console-appender.xml" />
+
+	<property name="LOG_FILE"
+		value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}" />		
+	<springProperty scope="context" name="LOG_PATH" source="logging.path" defaultValue="/apps/var/jakarta/logs" />
+	<springProperty scope="context" name="application_name" source="spring.application.name" defaultValue="test-servicenode-supplier-2" />
+	<springProperty scope="context" name="sleuth_file" source="rdc.logging.sleuth-file" defaultValue="${LOG_PATH}/sleuth/sleuth.log" />
+	<springProperty scope="context" name="error_file" source="rdc.logging.error-file" defaultValue="${LOG_PATH}/error/error.log" />
+
+	<include resource="info/aspirecn/rdc/aspirecloud/node/except/xml/defaults.xml" />
+	<include resource="info/aspirecn/rdc/aspirecloud/node/brave/xml/defaults.xml" />
+
+	<appender name="TIME_FILE"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<encoder>
+			<pattern>${FILE_LOG_PATTERN}</pattern>
+		</encoder>
+		<file>${LOG_FILE}</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
+			<maxHistory>8</maxHistory>
+			<timeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+	</appender>
+	
+	<root level="INFO">
+		<appender-ref ref="CONSOLE" />
+		<appender-ref ref="TIME_FILE" />
+	</root>
+</configuration>

+ 8 - 0
src/main/resources/docker/Dockerfile

@@ -0,0 +1,8 @@
+FROM hub.i139.cn/rdc-commons/official-openjdk:8u191-jre-alpine3.9
+VOLUME /tmp
+COPY target/lib/ ./lib/
+ADD *.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS="-Xmx256M -Xms256M -Xss256k -Duser.timezone=Asia/Shanghai"
+ENV APP_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]