Browse Source

first commit

15810770710@163.com 4 years ago
parent
commit
61dab23b69
39 changed files with 3264 additions and 0 deletions
  1. 197 0
      pom.xml
  2. 103 0
      src/main/java/info/aspirecn/iov/yysj/check/info/CheckInfo.java
  3. 48 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/AuthenChannelRibbonHandle.java
  4. 74 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/ChannelRibbonHandle.java
  5. 110 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/CommonUtil.java
  6. 14 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/JWTUtils.java
  7. 118 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/MessageDigestUtil.java
  8. 77 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/NonFixedValueAttr.java
  9. 70 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/OtherRibbonHandle.java
  10. 11 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/ProductCheckParamException.java
  11. 28 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/Property.java
  12. 20 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/RestTemplateConfigurate.java
  13. 13 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/ResultCodeException.java
  14. 44 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/TraceIdInterceptor.java
  15. 798 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/TransferParam.java
  16. 67 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/Validate.java
  17. 199 0
      src/main/java/info/aspirecn/iov/yysj/check/info/common/ZuulHelper.java
  18. 11 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/BillResultObject.java
  19. 9 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/CheckDetailLogObject.java
  20. 15 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/CheckInfoRequest.java
  21. 17 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/CommonResponseObject.java
  22. 32 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/ConcreteCheckResult.java
  23. 21 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/Data.java
  24. 4 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/LivingRequestObject.java
  25. 11 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/ProductRequest.java
  26. 10 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/RequestBody.java
  27. 13 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/TokenResponse.java
  28. 172 0
      src/main/java/info/aspirecn/iov/yysj/check/info/entity/WayBill.java
  29. 157 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/EIDInforFilter.java
  30. 62 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/InterfaceFilter.java
  31. 161 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/RequestBodyFilter.java
  32. 62 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/ResponseTraceIDFilter.java
  33. 48 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/ResultFilter.java
  34. 246 0
      src/main/java/info/aspirecn/iov/yysj/check/info/pre/WayBillFilter.java
  35. 68 0
      src/main/java/info/aspirecn/iov/yysj/check/info/redis/RedisConfig.java
  36. 3 0
      src/main/resources/config/banner.txt
  37. 50 0
      src/main/resources/config/bootstrap.yml
  38. 69 0
      src/main/resources/config/cloud-yysj-check-info.yaml
  39. 32 0
      src/main/resources/config/logback-spring.xml

+ 197 - 0
pom.xml

@@ -0,0 +1,197 @@
+<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>
+	</parent>
+
+	<groupId>info.aspirecn.iov.yysj</groupId>
+	<artifactId>cloud-yysj-check-info</artifactId>
+	<version>1.1.3</version>
+	<packaging>jar</packaging>
+
+	<name>cloud-yysj-infocheck</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+  		 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+	<dependencies>
+		<dependency>
+			<groupId>info.aspirecn.cloud.yysj</groupId>
+			<artifactId>cloud-yysj-commons-lang</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
+		</dependency>
+		<dependency>
+    				<groupId>org.springframework.boot</groupId>
+  			 <artifactId>spring-boot-starter-actuator</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>info.aspirecn.iov.yysj</groupId>
+			<artifactId>cloud-yysj-servicenode-paramtransfer-interface</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		<dependency>
+    		<groupId>commons-codec</groupId>
+    		<artifactId>commons-codec</artifactId>
+    		<version>1.11</version>
+		</dependency>
+		<dependency>
+		  <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-starter-tomcat</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-zuul</artifactId>
+			<version>1.4.5.RELEASE</version>
+		</dependency>
+
+	<!--	<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+		</dependency>-->
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-sleuth</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<optional>true</optional>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.6</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>net.logstash.logback</groupId>
+			<artifactId>logstash-logback-encoder</artifactId>
+			<version>5.0</version>
+		</dependency>
+	<!--	<dependency>
+			<groupId>net.rakugakibox.spring.boot</groupId>
+			<artifactId>logback-access-spring-boot-starter</artifactId>
+			<version>2.7.1</version>
+		</dependency>-->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.modelmapper</groupId>
+			<artifactId>modelmapper</artifactId>
+			<version>2.3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.code.gson</groupId>
+			<artifactId>gson</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt</artifactId>
+			<version>0.9.1</version>
+		</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>
+			<!--设置应用 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>info.aspirecn.iov.yysj</groupId>
+							<artifactId>cloud-yysj-servicenode-paramtransfer-interface</artifactId>
+						</include>
+						<include>
+							<groupId>info.aspirecn.cloud.yysj</groupId>
+							<artifactId>cloud-yysj-commons-lang</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>
+							<excludeGroupIds>
+								info.aspirecn.cloud.yysj
+							</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.cloud.yysj
+							</excludeGroupIds>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

+ 103 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/CheckInfo.java

@@ -0,0 +1,103 @@
+package info.aspirecn.iov.yysj.check.info;
+import java.io.IOException;
+
+import info.aspirecn.iov.yysj.check.info.common.Property;
+import info.aspirecn.iov.yysj.check.info.pre.*;
+import org.apache.commons.lang.math.NumberUtils;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import org.springframework.util.StopWatch;
+import org.springframework.web.bind.annotation.RestController;
+import lombok.extern.slf4j.Slf4j;
+@ComponentScan(basePackages={"info.aspirecn.iov.yysj.check.info"})
+@SpringBootApplication
+@EnableZuulProxy
+@RestController
+@Slf4j
+@EnableCaching
+@EnableFeignClients(basePackages = {"info.aspirecn.iov.yysj"})
+public class CheckInfo {
+
+
+	public static void main(String[] args) {
+
+		StopWatch watch = new StopWatch();
+		watch.start();
+		ApplicationContext context = SpringApplication.run(CheckInfo.class, args);
+		Environment environment = context.getBean(Environment.class);
+		String applicationName = environment.getProperty("spring.application.name");
+		String infoName = environment.getProperty("info.name");
+		String infoVersion = environment.getProperty("info.version");
+		int serverPort = NumberUtils.toInt(environment.getProperty("server.port"));
+		int managementServerPort = NumberUtils.toInt(environment.getProperty("management.server.port"));
+		Property property = context.getBean(Property.class);
+		log.info("{}",property.getRequestParamTransfer());
+		watch.stop();
+
+		log.info("{} Ver.{} ({}) 启动完毕,serverPort={}, managementServerPort={}, times={}s", infoName, infoVersion,
+				applicationName, serverPort, managementServerPort, watch.getTotalTimeSeconds());
+	}
+
+	/**
+	 * 动态更新路由策略 经测试,可以加策略,但是删除需要重启
+	 * 
+	 * @return
+	 */
+	@RefreshScope
+	@ConfigurationProperties("zuul")
+	public ZuulProperties zuulProperties() {
+		return new ZuulProperties();
+	}
+	/**
+	 * 链路日志打印
+	 *
+	 * @throws IOException
+	 */
+/*	@PostMapping("/api/v2/spans")
+	public void index(HttpServletRequest request) throws IOException {
+		String context = IOUtils.toString(request.getInputStream(), Charsets.UTF_8);
+		logger_sleuth.debug(context);
+	}*/
+
+
+
+	@Bean
+	public RequestBodyFilter addRequestBodyFilter() {
+		return new RequestBodyFilter();
+	}
+	@Bean
+	public WayBillFilter addUserBalanceFilter() {
+		return new WayBillFilter();
+	}
+	@Bean
+	public ResultFilter addResultFilter(){
+		return new ResultFilter();
+	}
+	@Bean
+	public ResponseTraceIDFilter addResponseTraceIDFilter(){
+		return new ResponseTraceIDFilter();
+	}
+	@Bean
+	public InterfaceFilter addInterfaceFilter(){
+		return new InterfaceFilter();
+	}
+
+
+	@Bean
+	public EIDInforFilter addEIDInforFilter(){
+		return new EIDInforFilter();
+	}
+
+
+
+}

+ 48 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/AuthenChannelRibbonHandle.java

@@ -0,0 +1,48 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.iov.yysj.check.info.entity.TokenResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Component
+@Slf4j
+public class AuthenChannelRibbonHandle {
+	@Resource(name = "getRestTemplate")
+	RestTemplate restTemplate;
+	@Autowired
+	ObjectMapper objectMapper;
+	@Autowired
+	Property property;
+
+	public TokenResponse channelRibbonHandle(String appId, String appSecret) {
+
+		TokenResponse responseObject = new TokenResponse();
+		try{
+			RequestContext.getCurrentContext().set("connectTimeout", property.getConnetTimeOut());
+			RequestContext.getCurrentContext().set("readTimeout", property.getReadTimeOut()+1000);
+			Map<String, String> uriVariables = new HashMap<String, String>();
+			uriVariables.put("appid",appId);
+			uriVariables.put("appsecret",appSecret);
+			String url = property.getAuthenUrl()+"?appid="+appId+"&appsecret="+appSecret;
+			log.info("url:{}",url);
+			ResponseEntity<TokenResponse> entity =  restTemplate.getForEntity(url, TokenResponse.class);
+			if (entity != null && entity.getStatusCode() == HttpStatus.OK) {// 调用通道成功
+				responseObject = entity.getBody();
+			}
+		} catch (Exception ex) {
+			log.error("Exception:{}",ex);
+		}
+		return responseObject;
+	}
+}

+ 74 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/ChannelRibbonHandle.java

@@ -0,0 +1,74 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.Resource;
+
+import info.aspirecn.cloud.yysj.commons.lang.BillItemResult;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.context.RequestContext;
+import lombok.extern.slf4j.Slf4j;
+
+
+@Component
+@Slf4j
+public class ChannelRibbonHandle {
+	@Resource(name = "getRestTemplate")
+	RestTemplate restTemplate;
+	@Autowired
+	ObjectMapper objectMapper;
+	@Autowired
+	Property property;
+
+	public BillItemResult channelRibbonHandle(String  token, String body, String userId, String yysjTraceId, String yysjProductId) {
+		BillItemResult billItemResult = new BillItemResult();
+		BillItemResult.ErrorResponse errorResponse =new BillItemResult.ErrorResponse();
+		billItemResult.setResult(Constants.inconsistent_code);
+		log.info("body:{},token:{},yysjTraceId:{}",body,token,yysjTraceId);
+		try{
+				RequestContext.getCurrentContext().set("connectTimeout", property.getConnetTimeOut());
+				RequestContext.getCurrentContext().set("readTimeout", property.getReadTimeOut()+1000);
+			HttpHeaders headers = new HttpHeaders();
+
+			restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
+			MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
+			headers.setContentType(type);
+			headers.add(Constants.HEADER_ACCEPT_KEY, MediaType.APPLICATION_JSON.toString());
+			headers.add(Constants.HEADER_TOKEN_KEY, token);
+			headers.add(Constants.USER_ID_KEY, userId);
+			headers.add("yysjProductId",yysjProductId);
+			//headers.add(Constants.HEADER_OLD_TRACEID_KEY, yysjTraceId);
+			headers.add(Constants.HEADER_PARENT_TRACEID_KEY, yysjTraceId);
+			Map<String, String> uriVariables = new HashMap<String, String>();
+			HttpEntity <String>httpEntity =null;
+			Map<String, String> httpBody = new HashMap<String, String>();
+			ResponseEntity<BillItemResult> entity = null;
+				httpEntity = new HttpEntity<String>(body,
+						headers);
+				entity = restTemplate.postForEntity(property.getGateWayUrl(), httpEntity,
+						BillItemResult.class,new HashMap());
+
+			if (entity != null && entity.getStatusCode() == HttpStatus.OK) {// 调用通道成功
+				billItemResult = entity.getBody();
+			}
+			log.info("billItemResult:{}",billItemResult);
+
+		} catch (Exception ex) {
+			log.error("Exception:{}",ex);
+			errorResponse.setCode(Constants.ErrorCode.Exception.getErrorCode());
+			billItemResult.setExceptionInformation(errorResponse);
+		}
+		return billItemResult;
+	}
+}

+ 110 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/CommonUtil.java

@@ -0,0 +1,110 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.iov.yysj.check.info.entity.RequestBody;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+
+@Slf4j
+public class CommonUtil {
+    private static List<String> allowUrls=null;
+    //获取请求内容
+    public static String getBody(HttpServletRequest request){
+        String bodyStr =null;
+        try {
+            StringBuffer body = new StringBuffer();
+            BufferedReader bufferedReader = new BufferedReader(
+                    new InputStreamReader(request.getInputStream(), "utf-8")); // 读取参数流
+            String nextLine = bufferedReader.readLine();
+            while (nextLine != null) {
+                body.append(nextLine);
+                nextLine = bufferedReader.readLine();
+            }
+            bodyStr = body.toString();
+            if (bodyStr == null || bodyStr.length() <= 0) {
+                log.error("请求参数为空,bodyStr:{}",bodyStr);
+            }
+        }catch (Exception ex){
+            log.error("获取参数异常,ex:{}",ex);
+        }
+        return  bodyStr;
+    }
+    //xml转对象
+    public static RequestBody xmlTojava(String xml, Class cls) throws Exception {
+        // 获取JAXB的上下文环境,需要传入具体的 Java bean -> 这里使用Student
+        JAXBContext context = JAXBContext.newInstance(RequestBody.class);
+        // 创建 UnMarshaller 实例
+        Unmarshaller unmarshaller = context.createUnmarshaller();
+        // 加载需要转换的XML数据 -> 这里使用InputStream,还可以使用File,Reader等
+/*        String str= "<ROOT><Headers><X-Ca-Key>111</X-Ca-Key><X-Ca-Timestamp>111111</X-Ca-Timestamp><X-Ca-Nonce>111111</X-Ca-Nonce>"
+                +"<X-Ca-Signature>111111</X-Ca-Signature>"
+                +"<Accept>111111</Accept>"
+                +"<Content-Type>111111</Content-Type>"
+                +"<Content-MD5>111111</Content-MD5>"
+                +"</Headers>"
+                +"<Body>111111</Body></ROOT>";*/
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(xml.getBytes());
+        InputStream inputStream=(InputStream)byteArrayInputStream;
+        // 将XML数据序列化 -> 该方法的返回值为Object基类,需要强转类型
+        RequestBody requestBody = (RequestBody) unmarshaller.unmarshal(inputStream);
+        return  requestBody;
+    }
+    //获取请求url
+    public static boolean checkUrl(String url){
+       Constants.RequestUrl[] requestUrls = Constants.RequestUrl.values();
+
+       for(Constants.RequestUrl requestUrl : requestUrls){
+           if(requestUrl.getValue().equals(url)){
+               return true;
+           }
+       }
+        return false;
+    }
+
+    //获取所有请求url
+    public static boolean checkAllUrl(String url){
+        Constants.RequestUrl[] requestUrls = Constants.RequestUrl.values();
+
+        for(Constants.RequestUrl requestUrl : requestUrls){
+            if(requestUrl.getValue().equals(url)){
+                return true;
+            }
+        }
+        Constants.OtherRquestUrl[] otherRequestUrls = Constants.OtherRquestUrl.values();
+        for(Constants.OtherRquestUrl requestUrl : otherRequestUrls){
+            if(requestUrl.getValue().equals(url)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //获取请求type
+    public static String getCheckType(String url){
+        if(Constants.RequestUrl.CARURL.getValue().equals(url)){
+            return "1";
+        }else if(Constants.RequestUrl.DRIVERURL.getValue().equals(url)){
+            return "3";
+        }else if(Constants.RequestUrl.BILLWAYURL.getValue().equals(url)){
+            return "2";
+        }
+        return "1";
+    }
+    //是否继续
+    public static boolean isContinue(){
+        Boolean flag = (Boolean)RequestContext.getCurrentContext().get("process");
+        if(flag!=null && !flag){
+            return false;
+        }
+        return true;
+    }
+}

+ 14 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/JWTUtils.java

@@ -0,0 +1,14 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Date;
+import java.util.Map;
+
+public class JWTUtils {
+
+    public static String generateToken(Map<String, Object> claims, String tokenKey, Date expiration, SignatureAlgorithm signatureAlgorithm) {
+        return Jwts.builder().setClaims(claims).setExpiration(expiration).signWith(signatureAlgorithm, tokenKey.getBytes()).compact();
+    }
+}

+ 118 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/MessageDigestUtil.java

@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package info.aspirecn.iov.yysj.check.info.common;
+
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import org.apache.commons.codec.binary.Base64;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 消息摘要工具
+ */
+public class MessageDigestUtil {
+    /**
+     * 先进行MD5摘要再进行Base64编码获取摘要字符串
+     *
+     * @param str
+     * @return
+     */
+    public static String base64AndMD5(String str) {
+        if (str == null) {
+            throw new IllegalArgumentException("inStr can not be null");
+        }
+        return base64AndMD5(toBytes(str));
+    }
+
+    /**
+     * 先进行MD5摘要再进行Base64编码获取摘要字符串
+     *
+     * @return
+     */
+    public static String base64AndMD5(byte[] bytes) {
+        if (bytes == null) {
+            throw new IllegalArgumentException("bytes can not be null");
+        }
+        try {
+            final MessageDigest md = MessageDigest.getInstance("MD5");
+            md.reset();
+            md.update(bytes);
+            final Base64 base64 = new Base64();
+            final byte[] enbytes = base64.encode(md.digest());
+            return new String(enbytes);
+        } catch (final NoSuchAlgorithmException e) {
+            throw new IllegalArgumentException("unknown algorithm MD5");
+        }
+    }
+
+    /**
+     * UTF-8编码转换为ISO-9959-1
+     *
+     * @param str
+     * @return
+     */
+    public static String utf8ToIso88591(String str) {
+        if (str == null) {
+            return str;
+        }
+
+        try {
+            return new String(str.getBytes("UTF-8"), "ISO-8859-1");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * ISO-9959-1编码转换为UTF-8
+     *
+     * @param str
+     * @return
+     */
+    public static String iso88591ToUtf8(String str) {
+        if (str == null) {
+            return str;
+        }
+
+        try {
+            return new String(str.getBytes("ISO-8859-1"), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * String转换为字节数组
+     *
+     * @param str
+     * @return
+     */
+    private static byte[] toBytes(final String str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            return str.getBytes(Constants.ENCODING);
+        } catch (final UnsupportedEncodingException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+}

+ 77 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/NonFixedValueAttr.java

@@ -0,0 +1,77 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NonFixedValueAttr {
+	/**
+	 * 是否为可选属性
+	 * true-可选 false-必须
+	 * 默认true
+	 */
+	boolean isOptional() default true;
+	/**
+	 * 是否为手机号
+	 * 默认false
+	 */
+	boolean isMobile() default false;
+	/**
+	 * 是否为IP地址
+	 * 默认false
+	 */
+	boolean isIp() default false;
+	/**
+	 * 是否为日期
+	 * 默认false
+	 */
+	boolean isDate() default false;
+	/**
+	 * 是否为数字
+	 * 默认false
+	 */
+	boolean isNumber() default false;
+	/**
+	 * 日期的格式
+	 * 默认yyyyMMddHHmmss
+	 */
+	String dateFormatString() default "yyyyMMddHHmmss";
+	/**
+	 * 正则表达式校验
+	 * ""-不校验 不是""-校验
+	 * 默认""
+	 */
+	String regularFormatString() default "";
+	/**
+	 * 属性最小长度
+	 * 默认0
+	 */
+	int minLength() default 0;
+	/**
+	 * 属性最大长度
+	 * 默认1024
+	 */
+	int maxLength() default 2147483647;
+	
+	/**
+	 * 是否为url,默认不是
+	 * @return
+	 */
+	boolean isUrl() default false;
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 70 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/OtherRibbonHandle.java

@@ -0,0 +1,70 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.BillItemResult;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.cloud.yysj.commons.lang.OtherCommonResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Component
+@Slf4j
+public class OtherRibbonHandle {
+	@Resource(name = "getRestTemplate")
+	RestTemplate restTemplate;
+	@Autowired
+	ObjectMapper objectMapper;
+	@Autowired
+	Property property;
+
+	public OtherCommonResult channelRibbonHandle( String  token, String body, String userId, String yysjTraceId, String yysjProductId) {
+		log.info("body:{},token:{},yysjTraceId:{}",body,token,yysjTraceId);
+		OtherCommonResult otherCommonResult = new OtherCommonResult();
+		try{
+
+				RequestContext.getCurrentContext().set("connectTimeout", property.getConnetTimeOut());
+				RequestContext.getCurrentContext().set("readTimeout", property.getReadTimeOut()+1000);
+			HttpHeaders headers = new HttpHeaders();
+
+			restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
+			MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
+			headers.setContentType(type);
+			headers.add(Constants.HEADER_ACCEPT_KEY, MediaType.APPLICATION_JSON.toString());
+			headers.add(Constants.HEADER_TOKEN_KEY, token);
+			headers.add(Constants.USER_ID_KEY, userId);
+			headers.add(Constants.Url, (String)RequestContext.getCurrentContext().get(Constants.Url));
+			headers.add("yysjProductId",yysjProductId);
+			//headers.add(Constants.HEADER_OLD_TRACEID_KEY, yysjTraceId);
+			headers.add(Constants.HEADER_PARENT_TRACEID_KEY, yysjTraceId);
+			Map<String, String> uriVariables = new HashMap<String, String>();
+			HttpEntity <String>httpEntity =null;
+
+			ResponseEntity<OtherCommonResult> entity = null;
+				httpEntity = new HttpEntity<String>(body,
+						headers);
+				entity = restTemplate.postForEntity(property.getOtherGateWayUrl(), httpEntity,
+						OtherCommonResult.class,new HashMap());
+
+			if (entity != null && entity.getStatusCode() == HttpStatus.OK) {// 调用通道成功
+				otherCommonResult = entity.getBody();
+			}
+			log.info("otherCommonResult:{}",otherCommonResult);
+
+		} catch (Exception ex) {
+			log.error("Exception:{}",ex);
+			otherCommonResult.setResultCode(Constants.error);
+		}
+		return otherCommonResult;
+	}
+}

+ 11 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/ProductCheckParamException.java

@@ -0,0 +1,11 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ProductCheckParamException extends  Exception{
+    private String productId;
+    private String url;
+}

+ 28 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/Property.java

@@ -0,0 +1,28 @@
+package info.aspirecn.iov.yysj.check.info.common;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Component
+@ConfigurationProperties(prefix = "common")
+@Data
+public class Property {
+    private int  connetTimeOut;
+    private int readTimeOut;
+    private String appKey;
+    private String appSecret;
+    private String tokenSecret;
+    private String gateWayUrl;
+    private String otherGateWayUrl;
+    private Map<String,Map<String,String>> requestParamTransfer;
+    private Map<String,String> productMap;
+    private String authenUrl;
+    private String interceptorUrl;
+    private Map<String,String> yysjProductCode;
+}
+
+

+ 20 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/RestTemplateConfigurate.java

@@ -0,0 +1,20 @@
+package info.aspirecn.iov.yysj.check.info.common;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.web.client.RestTemplate;
+import java.util.List;
+
+@Configuration
+@Slf4j
+public class RestTemplateConfigurate {
+	@Bean(name = "getRestTemplate")
+	public RestTemplate getRestTemplate() {
+		// 把自定义的ClientHttpRequestInterceptor添加到RestTemplate,可添加多个
+		 RestTemplate restTemplate =  new RestTemplate();
+		return restTemplate;
+	}
+}

+ 13 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/ResultCodeException.java

@@ -0,0 +1,13 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ResultCodeException extends Exception{
+
+	private String code;
+	private String message;
+	private String desc;
+}

+ 44 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/TraceIdInterceptor.java

@@ -0,0 +1,44 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+
+import java.io.IOException;
+import java.util.List;
+//@Component
+@Slf4j
+public class TraceIdInterceptor implements ClientHttpRequestInterceptor {
+    @Autowired
+    private Property property;
+
+    @Override
+    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
+            throws IOException {
+        String propertyUrl =property.getInterceptorUrl().replace(" ","");
+        String requestUrl = request.getURI().getPath().replace(" ","");
+        if(propertyUrl.equals(requestUrl)) {
+            HttpHeaders headers = request.getHeaders();
+            //取出来设置的traceId的信息
+            List<String> list = headers.get(Constants.HEADER_TRACEID_KEY);
+            log.info("parentId:{}",list.get(0));
+            headers.add(Constants.HEADER_PARENT_TRACEID_KEY, list.get(0));
+            //清除链路设置的traceId数据
+            list.clear();
+            log.info("traceid:{}",headers.get("x-b3-spanid").get(0));
+            //添加新的traceId数据
+            list.add(headers.get("x-b3-spanid").get(0));
+        }
+        // 保证请求继续被执行
+        return execution.execute(request, body);
+    }
+
+    public static void main(String[] args) {
+        System.out.println("http://127.0.0.1:8085/detail/detail.do".equals("http://127.0.0.1:8085/detail/detail.do"));
+    }
+}

+ 798 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/TransferParam.java

@@ -0,0 +1,798 @@
+package info.aspirecn.iov.yysj.check.info.common;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Component
+@Slf4j
+public class TransferParam {
+
+    private static final String DATE_YYYYMMDD = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)";
+    private static final String WEIGHT_000 = "([0-9]){0,}.[0-9]{3}";
+   /*
+   * {"vehicleNumber":"新A93293","licensePlateTypeCode":"2","vehicleTonnage":"0"}*/
+    @Autowired
+    private Property property;
+    public Map<String,Object> getCustomBody( Map<String, String> paramMap,String productId,Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        Map<String,Object> customBody =new  HashMap<String,Object>();
+                if ("01".equals(productId)) {//行驶证验证
+
+                    customBody=clxszyz(paramMap,emptyList,errorList);
+                }if ("03".equals(productId)) {//驾驶证验证
+
+                    customBody=ryjszyz(paramMap,emptyList,errorList);
+                }if ("04".equals(productId)) {//人员从业资格验证
+
+                    customBody=rycyzgyz(paramMap,emptyList,errorList);
+                }if ("02".equals(productId)) {//车辆营运验证
+
+                    customBody=clyyyz(paramMap,emptyList,errorList);
+                }if ("10".equals(productId)) {//企业经营许可验证  经营许可证号
+
+                    customBody=qyyyxkyz(paramMap,emptyList,errorList);
+                }if ("09".equals(productId)) {//车辆入网验证
+
+                    customBody=clrwyz(paramMap,emptyList);
+                }if ("07".equals(productId)) {//托运人身份验证(个人)
+
+                    customBody=tyrsfyz_person(paramMap,emptyList);
+                }if ("08".equals(productId)) {//托运人身份验证(企业)
+
+                    customBody=tyrsfyz_enterprise(paramMap,emptyList);
+                }if ("05".equals(productId)) {//装货点车辆定位验证
+
+                    customBody= zhdwyz(paramMap,emptyList,errorList);
+                }if ("06".equals(productId)) {//卸货点车辆定位验证
+
+                    customBody= xhdwyz(paramMap,emptyList,errorList);
+                }if ("12".equals(productId)) {//超载验证(核载验证)
+
+                    customBody=czyz(paramMap,emptyList,errorList);
+                }if ("13".equals(productId)) {//司机上下线
+
+                    customBody=sjsxx(paramMap,emptyList,errorList);
+                }else if(Constants.OtherRquestUrl.IDLENTITYVERIFICATION.getValue().equals(productId)){//身份核验
+                    String req_id=paramMap.get(Constants.req_id);
+                    if(StringUtils.isEmpty(req_id)) {
+                        emptyList.add(Constants.req_id);
+                    }
+                    paramMap.clear();
+                    customBody.put("reqID",req_id);
+                    return customBody;
+                }else if(Constants.OtherRquestUrl.LIVINGURL.getValue().equals(productId)){//身份核验
+                    String req_id=paramMap.get(Constants.req_id);
+                    if(StringUtils.isEmpty(req_id)){
+                        emptyList.add(Constants.req_id);
+                    }
+                    String appe_id_code=paramMap.get(Constants.appe_id_code);
+                    if(StringUtils.isEmpty(appe_id_code)){
+                            emptyList.add(Constants.appe_id_code);
+                    }
+                    String eid_voucher=paramMap.get(Constants.eid_voucher);
+                    if(StringUtils.isEmpty(eid_voucher)){
+                        emptyList.add(Constants.eid_voucher);
+                    }
+                String longitudeDegree=paramMap.get(Constants.Long_degree);
+
+                String lat_degree=paramMap.get(Constants.lat_degree);
+                    paramMap.clear();
+            customBody.put("reqID",req_id);
+            customBody.put("appeIdCode",appe_id_code);
+            customBody.put("eidVoucher",eid_voucher);
+            if(StringUtils.isNotEmpty(longitudeDegree)){
+                customBody.put("longitudeDegree",longitudeDegree);
+            }
+            if(StringUtils.isNotEmpty(lat_degree)){
+                customBody.put("latitudeDegree",lat_degree);
+            }
+
+                    return  customBody;
+                }
+
+                return customBody;
+    }
+
+    //校验项一	车辆行驶证验证  行驶证信息查询查询
+    public Map<String,Object> clxszyz(Map<String,String> requestMap, Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String vehicleNumber=requestMap.get(Constants.car_vehicleNumber);
+        String vehicleType = requestMap.get(Constants.car_vehicleType);
+        String owner = requestMap.get(Constants.car_owner);
+        String vin = requestMap.get(Constants.car_vin);
+        String registerDate = requestMap.get(Constants.car_registerDate);
+        if(StringUtils.isEmpty(vehicleNumber)){
+            emptyList.add(Constants.car_vehicleNumber);
+        }
+        if(StringUtils.isEmpty(vin)){
+            emptyList.add(Constants.car_vin);
+        }
+        if(StringUtils.isEmpty(vehicleType)){
+            emptyList.add(Constants.car_vehicleType);
+        }
+        Pattern pattern = Pattern.compile(DATE_YYYYMMDD);
+       if(StringUtils.isEmpty(registerDate)){
+            emptyList.add(Constants.car_registerDate);
+        }else if(!pattern.matcher(registerDate).matches()){
+           errorList.add(Constants.car_registerDate);
+       }
+
+        if(StringUtils.isEmpty(owner)){
+            emptyList.add(Constants.car_owner);
+        }
+        if(emptyList.size()==0 && errorList.size()==0){
+
+            Map<String, Object> vehicleInfoMap = new HashMap<String,Object>();
+            vehicleInfoMap.put(Constants.clxszyz_carNumber,vehicleNumber);
+            vehicleInfoMap.put(Constants.clxszyz_carType,vehicleType);
+            vehicleInfoMap.put(Constants.clxszyz_name,owner);
+            vehicleInfoMap.put(Constants.car_vin,vin);
+            vehicleInfoMap.put(Constants.car_registerDate,registerDate);
+            return vehicleInfoMap;
+        }
+        return null;
+
+    }
+    //校验项二	人员驾驶证验证
+    public Map<String,Object> ryjszyz(Map<String,String> requestMap,Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String vehicleNumber=requestMap.get(Constants.driver_driverLicenseNumber);
+        String name = requestMap.get(Constants.driver_driverNamer);
+        String vehicleClass= requestMap.get(Constants.driver_vehicleClass);
+        String validPeriodFrom= requestMap.get(Constants.driver_validPeriodFrom);
+        String validPeriodTo=requestMap.get(Constants.driver_validPeriodTo);
+        Pattern pattern = Pattern.compile(DATE_YYYYMMDD);
+        if(StringUtils.isEmpty(vehicleNumber)){
+            emptyList.add(Constants.driver_driverLicenseNumber);
+        }
+        if(StringUtils.isEmpty(name)){
+            emptyList.add(Constants.driver_driverNamer);
+        }
+        if(StringUtils.isEmpty(vehicleClass)){
+            emptyList.add(Constants.driver_vehicleClass);
+        }
+        if(StringUtils.isEmpty(validPeriodFrom)){
+            emptyList.add(Constants.driver_validPeriodFrom);
+        }else if(!pattern.matcher(validPeriodFrom).matches()){
+            errorList.add(Constants.driver_validPeriodFrom);
+        }
+        if(StringUtils.isEmpty(validPeriodTo)){
+            emptyList.add(Constants.driver_validPeriodTo);
+        }else if(!pattern.matcher(validPeriodTo).matches()){
+            errorList.add(Constants.driver_validPeriodTo);
+        }
+    /*    if ((!StringUtils.isEmpty(validPeriodFrom) && !pattern.matcher(validPeriodFrom).matches()) || (!StringUtils.isEmpty(validPeriodTo) && !pattern.matcher(validPeriodTo).matches())) {
+            throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(), Constants.ResultDesc.PARAMERROR.getValue(), "驾驶证开始结束时间不正确");
+        }*/
+        if(emptyList.size()==0 && errorList.size()==0) {
+
+
+            Map<String, Object> vehicleInfoMap = new HashMap<String, Object>();
+            vehicleInfoMap.put(Constants.ryjszyz_driveNo, vehicleNumber);
+            vehicleInfoMap.put(Constants.ryjszyz_name, name);
+            vehicleInfoMap.put(Constants.driver_vehicleClass,vehicleClass);
+            vehicleInfoMap.put(Constants.driver_validPeriodFrom, validPeriodFrom);
+            vehicleInfoMap.put(Constants.driver_validPeriodTo,validPeriodTo);
+            return vehicleInfoMap;
+        }
+        return null;
+    }
+    /*
+     * 校验行三 人员从业资格验证  查询人员信息接口*/
+    public Map<String,Object> rycyzgyz(Map<String,String> requestMap,Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String driverName=requestMap.get(Constants.driver_driverNamer);
+        String qualificationCertificate=requestMap.get(Constants.driver_qualificationCertificate);
+        String provinceCode=requestMap.get(Constants.driver_provinceCode);
+        String qualificationCertificateFrom=requestMap.get(Constants.driver_qualificationCertificateFrom);
+        String qualificationCertificateTo=requestMap.get(Constants.driver_qualificationCertificateTo);
+        Pattern pattern = Pattern.compile(DATE_YYYYMMDD);
+        if(StringUtils.isEmpty(driverName)){
+            emptyList.add(Constants.driver_driverNamer);
+        }
+        if(StringUtils.isEmpty(qualificationCertificate)){
+            emptyList.add(Constants.driver_qualificationCertificate);
+        }
+        if(StringUtils.isEmpty(provinceCode)){
+            emptyList.add(Constants.driver_provinceCode);
+        }
+        if(StringUtils.isEmpty(qualificationCertificateFrom)){
+            emptyList.add(Constants.driver_qualificationCertificateFrom);
+        }else if(!pattern.matcher(qualificationCertificateFrom).matches()){
+            errorList.add(Constants.driver_qualificationCertificateFrom);
+        }
+        if(StringUtils.isEmpty(qualificationCertificateTo)){
+            emptyList.add(Constants.driver_qualificationCertificateTo);
+        }else if(!pattern.matcher(qualificationCertificateTo).matches()){
+            errorList.add(Constants.driver_qualificationCertificateTo);
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+            Map<String, Object> vehicleInfoMap = new HashMap<String, Object>();
+            vehicleInfoMap.put(Constants.rycyzgyz_nameOfPerson, driverName);
+            vehicleInfoMap.put(Constants.rycyzgyz_qualificationCertificateNumber, qualificationCertificate);
+            vehicleInfoMap.put(Constants.rycyzgyz_provinceCode, provinceCode);
+            vehicleInfoMap.put(Constants.rycyzgyz_periodStartDate, qualificationCertificateFrom);
+            vehicleInfoMap.put(Constants.rycyzgyz_periodEndDate, qualificationCertificateTo);
+            return vehicleInfoMap;
+        }
+        return null;
+    }
+    /*
+     * 校验项四 车辆营运验证*/
+    public Map<String,Object> clyyyz(Map<String,String> requestMap,Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String vehicleNumber=requestMap.get(Constants.car_vehicleNumber);
+        String roadTransportCertificateNumber=requestMap.get(Constants.car_roadTransport);
+        String vehiclePlateColorCode=requestMap.get(Constants.car_vehiclePlateColorCode);
+        String roadTransportCertificateValidPeriodFrom=requestMap.get(Constants.car_roadTransportCertificateValidPeriodFrom);
+        String roadTransportCertificateValidPeriodTo=requestMap.get(Constants.car_roadTransportCertificateValidPeriodTo);
+        if(StringUtils.isEmpty(vehicleNumber)){
+            emptyList.add(Constants.car_vehicleNumber);
+        }
+        if(StringUtils.isEmpty(roadTransportCertificateNumber)){
+            emptyList.add(Constants.car_roadTransport);
+        }
+        if(StringUtils.isEmpty(vehiclePlateColorCode)){
+            emptyList.add(Constants.car_vehiclePlateColorCode);
+        }
+        Pattern pattern = Pattern.compile(DATE_YYYYMMDD);
+        if(StringUtils.isEmpty(roadTransportCertificateValidPeriodFrom)){
+            emptyList.add(Constants.car_roadTransportCertificateValidPeriodFrom);
+        }else if(!pattern.matcher(roadTransportCertificateValidPeriodFrom).matches()){
+            errorList.add(Constants.car_roadTransportCertificateValidPeriodFrom);
+        }
+        if(StringUtils.isEmpty(roadTransportCertificateValidPeriodTo)){
+            emptyList.add(Constants.car_roadTransportCertificateValidPeriodTo);
+        }else if(!pattern.matcher(roadTransportCertificateValidPeriodTo).matches()){
+            errorList.add(Constants.car_roadTransportCertificateValidPeriodTo);
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+            Map<String, Object> vehicleInfoMap = new HashMap<String, Object>();
+            vehicleInfoMap.put(Constants.clyyyz_vehicleNumber, vehicleNumber);
+            vehicleInfoMap.put(Constants.clyyyz_roadTransportCertificateNumber, roadTransportCertificateNumber);
+            vehicleInfoMap.put(Constants.clyyyz_licensePlateTypeCode, vehiclePlateColorCode);
+            vehicleInfoMap.put(Constants.clyyyz_periodStartDate, roadTransportCertificateValidPeriodFrom);
+            vehicleInfoMap.put(Constants.clyyyz_periodEndDate, roadTransportCertificateValidPeriodTo);
+            return vehicleInfoMap;
+        }
+        return null;
+    }
+    public Map<String,Object> qyyyxkyz(Map<String,String> requestMap,Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String carrier=requestMap.get(Constants.bill_carrier);
+        String permitNumber=requestMap.get(Constants.bill_permitNumber);
+        //String unifiedSocialCreditIdentifier=requestMap.get(Constants.bill_unifiedSocialCreditIdentifier);
+        /*String permitValidPeriodFrom=requestMap.get(Constants.bill_permitValidPeriodFrom);
+        String permitValidPeriodTo=requestMap.get(Constants.bill_permitValidPeriodTo);
+        Pattern pattern = Pattern.compile(DATE_YYYYMMDD);*/
+        if(StringUtils.isEmpty(carrier)){
+            emptyList.add(Constants.bill_carrier);
+        }
+        if(StringUtils.isEmpty(permitNumber)){
+            emptyList.add(Constants.bill_permitNumber);
+        }
+
+       /* if(StringUtils.isEmpty(permitValidPeriodFrom)){
+            emptyList.add(Constants.bill_permitValidPeriodFrom);
+        }else if(!pattern.matcher(permitValidPeriodFrom).matches()){
+            errorList.add(Constants.bill_permitValidPeriodFrom);
+        }
+        if(StringUtils.isEmpty(permitValidPeriodTo)){
+            emptyList.add(Constants.bill_permitValidPeriodTo);
+        }else if(!pattern.matcher(permitValidPeriodTo).matches()){
+            errorList.add(Constants.bill_permitValidPeriodTo);
+        }
+        if(StringUtils.isEmpty(unifiedSocialCreditIdentifier)){
+            emptyList.add(Constants.bill_unifiedSocialCreditIdentifier);
+        }*/
+        if(emptyList.size()==0 && errorList.size()==0) {
+            Map<String, Object> vehicleInfoMap = new HashMap<String, Object>();
+            vehicleInfoMap.put(Constants.bill_carrier, carrier);
+            vehicleInfoMap.put(Constants.bill_permitNumber, permitNumber);
+            /*vehicleInfoMap.put(Constants.bill_unifiedSocialCreditIdentifier, unifiedSocialCreditIdentifier);
+            vehicleInfoMap.put(Constants.bill_permitValidPeriodFrom, permitValidPeriodFrom);
+            vehicleInfoMap.put(Constants.bill_permitValidPeriodTo, permitValidPeriodTo);
+            */
+            return vehicleInfoMap;
+        }
+        return null;
+    }
+
+    //校验项六	车辆入网验证
+    public Map<String,Object> clrwyz(Map<String,String> requestMap,Set<String> emptyList) throws IOException, ResultCodeException {
+
+
+        Object vehicleInfo=requestMap.get(Constants.bill_vehicleInfo);
+        String vehicleNumber ="";
+        String vehiclePlateColorCode ="";
+        if(vehicleInfo==null || !(vehicleInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_vehicleInfo);
+        }else if(vehicleInfo instanceof  LinkedHashMap){
+            Map<String,String> vehicleInfoMap = (Map)vehicleInfo;
+            vehicleNumber = vehicleInfoMap.get(Constants.bill_vehicleNumber);
+            if(StringUtils.isEmpty(vehicleNumber)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+            }
+            vehiclePlateColorCode = vehicleInfoMap.get(Constants.bill_vehiclePlateColorCode);
+            if(StringUtils.isEmpty(vehiclePlateColorCode)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehiclePlateColorCode);
+            }
+        }
+        if(emptyList.size()==0) {
+            Map<String, Object> vehicleInfoMap = new HashMap<String,Object>();
+            vehicleInfoMap.put(Constants.clrw_vehicleNumber,vehicleNumber);
+            vehicleInfoMap.put(Constants.clrw_licensePlateTypeCode,vehiclePlateColorCode);
+            return vehicleInfoMap;
+        }
+        return null;
+    }
+    //校验项七	托运人身份验证(个人)
+    public Map<String,Object> tyrsfyz_person(Map<String,String> requestMap,Set<String> emptyList) throws IOException, ResultCodeException {
+        Object consignorInfo = requestMap.get(Constants.bill_consignorInfo);
+        String consignor="";
+        String consignorID="";
+        if(consignorInfo==null){
+            emptyList.add(Constants.bill_consignorInfo);
+        }else {
+            if (consignorInfo instanceof LinkedHashMap) {
+                Map<String, String> consignorInfoMap = (Map) consignorInfo;
+                consignor = consignorInfoMap.get(Constants.bill_consignor);
+                consignorID = consignorInfoMap.get(Constants.bill_ConsignorID);
+            }
+            if (StringUtils.isEmpty(consignor)) {
+                emptyList.add(Constants.bill_consignorInfo+"."+Constants.bill_consignor);
+            }
+            if (StringUtils.isEmpty(consignorID)) {
+                emptyList.add(Constants.bill_consignorInfo+"."+Constants.bill_ConsignorID);
+            }
+            if (emptyList.size() == 0) {
+                Map<String, Object> infoMap = new HashMap<String, Object>();
+                infoMap.put(Constants.persontyr_name, consignor);
+                infoMap.put(Constants.persontyr_idCode, consignorID);
+                return infoMap;
+            }
+        }
+        return null;
+    }
+    //校验项八	托运人身份验证(企业)
+    public Map<String,Object> tyrsfyz_enterprise(Map<String,String> requestMap,Set<String> emptyList) throws IOException, ResultCodeException {
+        Object consignorInfo = requestMap.get(Constants.bill_consignorInfo);
+        String consignor="";
+        String consignorID="";
+        if(consignorInfo instanceof  LinkedHashMap){
+            Map<String,String> consignorInfoMap = (Map)consignorInfo;
+            consignor = consignorInfoMap.get(Constants.bill_consignor);
+            consignorID=consignorInfoMap.get(Constants.bill_ConsignorID);
+        }
+        if(StringUtils.isEmpty(consignor)){
+            emptyList.add(Constants.bill_consignorInfo+"."+Constants.bill_consignor);
+        }
+        if(StringUtils.isEmpty(consignorID)){
+            emptyList.add(Constants.bill_consignorInfo+"."+Constants.bill_ConsignorID);
+        }
+        if(emptyList.size()==0) {
+            Map<String, Object> infoMap = new HashMap<String, Object>();
+            infoMap.put(Constants.bill_carrier, consignor);
+            //infoMap.put(Constants.enterpricetyr_creditCode, consignorID);
+            return infoMap;
+        }
+        return null;
+    }
+    //校验项六	装货点车辆定位验证
+    public Map<String,Object> zhdwyz(Map<String,String> requestMap, Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        Object vehicleInfo=requestMap.get(Constants.bill_vehicleInfo);
+        String vehicleNumber ="";
+        Map<String, Object> resultMap = new HashMap<String,Object>();
+        String countrySubdivisionCode="";
+        if(vehicleInfo==null || !(vehicleInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_vehicleInfo);
+        }else if(vehicleInfo instanceof  LinkedHashMap){
+            Map<String,String> vehicleInfoMap = (Map)vehicleInfo;
+            vehicleNumber = vehicleInfoMap.get(Constants.bill_vehicleNumber);
+           if(StringUtils.isEmpty(vehicleNumber)){
+               emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+           }
+        }
+        Object consignorInfo=requestMap.get(Constants.bill_consignorInfo);
+        if(consignorInfo==null || !(consignorInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_consignorInfo);
+        }else if(consignorInfo instanceof  LinkedHashMap){
+            Map<String,String> consignorInfoMap = (Map)consignorInfo;
+            countrySubdivisionCode = consignorInfoMap.get(Constants.bill_countrySubdivisionCode);
+            if(StringUtils.isEmpty(countrySubdivisionCode)){
+                emptyList.add(Constants.bill_consignorInfo+"."+Constants.bill_countrySubdivisionCode);
+            }
+        }
+        String despatchActualDateTime = requestMap.get(Constants.bill_despatchActualDateTime);
+
+        if(StringUtils.isEmpty(despatchActualDateTime)){
+            emptyList.add(Constants.bill_despatchActualDateTime);
+        }else if(!checkDateTime(despatchActualDateTime,"yyyyMMddHHmmss")){
+            errorList.add(Constants.bill_despatchActualDateTime);
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+            resultMap.put(Constants.zh_xh_vehicleNumber,vehicleNumber);
+            resultMap.put(Constants.zh_xh_countrySubdivisionCode,countrySubdivisionCode);
+            resultMap.put(Constants.zh_xh_dateTime,transferDate(despatchActualDateTime,"yyyyMMddHHmmss","yyyy-MM-dd HH:mm:ss"));
+            return resultMap;
+        }
+        return null;
+
+    }
+    //校验项六	卸货点车辆定位验证
+    public Map<String,Object> xhdwyz(Map<String,String> requestMap, Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        Object vehicleInfo=requestMap.get(Constants.bill_vehicleInfo);
+        String vehicleNumber ="";
+        Map<String, Object> resultMap = new HashMap<String,Object>();
+        String countrySubdivisionCode="";
+        if(vehicleInfo==null || !(vehicleInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_vehicleInfo);
+        }else if(vehicleInfo instanceof  LinkedHashMap){
+            Map<String,String> vehicleInfoMap = (Map)vehicleInfo;
+            vehicleNumber = vehicleInfoMap.get(Constants.bill_vehicleNumber);
+            if(StringUtils.isEmpty(vehicleNumber)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+            }
+        }
+        Object consigneeInfo=requestMap.get(Constants.bill_consigneeInfo);
+        if(consigneeInfo==null || !(consigneeInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_consigneeInfo);
+        }else if(consigneeInfo instanceof  LinkedHashMap){
+            Map<String,String> consigneeInfoMap = (Map)consigneeInfo;
+            countrySubdivisionCode = consigneeInfoMap.get(Constants.bill_countrySubdivisionCode);
+            if(StringUtils.isEmpty(countrySubdivisionCode)){
+                emptyList.add(Constants.bill_consigneeInfo+"."+Constants.bill_countrySubdivisionCode);
+            }
+        }
+        String goodsReceiptDateTime = requestMap.get(Constants.bill_goodsReceiptDateTime);
+
+        if(StringUtils.isEmpty(goodsReceiptDateTime)){
+            emptyList.add(Constants.bill_goodsReceiptDateTime);
+        }else if(!checkDateTime(goodsReceiptDateTime,"yyyyMMddHHmmss")){
+            errorList.add(Constants.bill_goodsReceiptDateTime);
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+            resultMap.put(Constants.zh_xh_vehicleNumber,vehicleNumber);
+            resultMap.put(Constants.zh_xh_countrySubdivisionCode,countrySubdivisionCode);
+            resultMap.put(Constants.zh_xh_dateTime,transferDate(goodsReceiptDateTime,"yyyyMMddHHmmss","yyyy-MM-dd HH:mm:ss"));
+
+            return resultMap;
+        }
+       return null;
+
+    }
+    //校验项六	超载验证(核载验证)
+    public Map<String,Object> czyz(Map<String,String> requestMap, Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        Object vehicleInfo=requestMap.get(Constants.bill_vehicleInfo);
+        String vehicleNumber ="";
+        String vehiclePlateColorCode ="";
+        double weightTotal = 0.0;
+        Map<String, Object> resultMap = new HashMap<String,Object>();
+        if(vehicleInfo==null || !(vehicleInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_vehicleInfo);
+        }else if(vehicleInfo instanceof  LinkedHashMap){
+            Map<String,String> vehicleInfoMap = (Map)vehicleInfo;
+            vehicleNumber = vehicleInfoMap.get(Constants.bill_vehicleNumber);
+            if(StringUtils.isEmpty(vehicleNumber)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+            }
+            vehiclePlateColorCode = vehicleInfoMap.get(Constants.car_vehiclePlateColorCode);
+            if(StringUtils.isEmpty(vehiclePlateColorCode)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.car_vehiclePlateColorCode);
+            }
+            Object goodsInfos = vehicleInfoMap.get(Constants.bill_goodsInfo);
+            if(goodsInfos ==null){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_goodsInfo);
+            }else{
+                Pattern pattern = Pattern.compile(WEIGHT_000);
+                if(goodsInfos instanceof  ArrayList){
+                    List<Object> goodInfoList = (List)goodsInfos;
+                    for(Object goodInfo : goodInfoList){
+                        if(goodInfo instanceof  LinkedHashMap){
+                            Map<String,String> goodInfoMap = (Map<String,String>)goodInfo;
+                            String weightStr = goodInfoMap.get(Constants.bill_goodsInfo_weight);
+
+                            Matcher matcher = pattern.matcher(weightStr);
+                            if(!matcher.matches()){
+                                errorList.add(Constants.bill_vehicleInfo+"."+Constants.bill_goodsInfo+"."+Constants.bill_goodsInfo_weight);
+                                break;
+                            }
+                            double weight = Double.parseDouble(weightStr);
+                            weightTotal +=weight;
+                        }else{
+                            errorList.add(Constants.bill_vehicleInfo+"."+Constants.bill_goodsInfo+"."+Constants.bill_goodsInfo_weight);
+                        }
+                    }
+
+                }else{
+                    errorList.add(Constants.bill_vehicleInfo+"."+Constants.bill_goodsInfo);
+                }
+            }
+
+
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+           resultMap.put(Constants.zlhy_vehicleNumber,vehicleNumber);
+            resultMap.put(Constants.zlhy_licensePlateTypeCode,vehiclePlateColorCode);
+            resultMap.put(Constants.zlhy_vehicleTonnage,String.valueOf(weightTotal));
+            return resultMap;
+        }
+        return null;
+
+    }
+    //校验项十四	司机上下线
+    public Map<String,Object> sjsxx(Map<String,String> requestMap, Set<String> emptyList,Set<String> errorList) throws IOException, ResultCodeException {
+        String shippingNoteNumber=requestMap.get(Constants.bill_shipping_note_number);
+        if(StringUtils.isEmpty(shippingNoteNumber)){
+            emptyList.add(Constants.bill_shipping_note_number);
+        }
+        String despatchActualDateTime=requestMap.get(Constants.bill_despatchActualDateTime);
+        if(StringUtils.isEmpty(despatchActualDateTime)){
+            emptyList.add(Constants.bill_despatchActualDateTime);
+        }else {
+            try {
+                SimpleDateFormat yMdHms = new SimpleDateFormat("yyyyMMddHHmmss");
+                SimpleDateFormat yMdHmsResult = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                despatchActualDateTime =  yMdHmsResult.format(yMdHms.parse(despatchActualDateTime));
+            } catch (ParseException ex) {
+                log.error("解析发货时间异常:{}", ex);
+                errorList.add(Constants.bill_despatchActualDateTime);
+            }
+        }
+
+        String driverName="";
+        String driverLicense="";
+        List<Map> resultDriver = new ArrayList<Map>();
+        Object vehicleInfo=requestMap.get(Constants.bill_vehicleInfo);
+        Map<String, Object> resultMap = new HashMap<String,Object>();
+        if(vehicleInfo==null || !(vehicleInfo instanceof  LinkedHashMap)){
+            emptyList.add(Constants.bill_vehicleInfo);
+        }else if(vehicleInfo instanceof  LinkedHashMap){
+            Map<String,String> vehicleInfoMap = (Map)vehicleInfo;
+            Object drivers = vehicleInfoMap.get(Constants.bill_driver);
+
+            if(drivers==null || !(drivers instanceof  ArrayList)){
+                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver);
+            }else if(drivers instanceof  ArrayList){
+                List<Object> driverList = (List)drivers;
+                if(driverList.size()<1){
+                    emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver);
+                }else{
+                    for(Object driverInfo : driverList){
+                        Map<String,String> driverMap = new HashMap<String,String>();
+                        if(driverInfo instanceof  LinkedHashMap){
+                            Map<String,String> driverInfoMap = (Map<String,String>)driverInfo;
+                            driverName = driverInfoMap.get(Constants.bill_driver_name);
+                            if(StringUtils.isEmpty(driverName)){
+                                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_name);
+                                break;
+                            }
+                            driverLicense = driverInfoMap.get(Constants.bill_driver_License);
+                            if(StringUtils.isEmpty(driverLicense)){
+                                emptyList.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_License);
+                                break;
+                            }
+                            driverMap.put(Constants.sjsxx_name,driverName);
+                            driverMap.put(Constants.sjsxx_idCode,driverLicense);
+                            resultDriver.add(driverMap);
+                        }else{
+                            errorList.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver);
+                        }
+                    }
+                }
+
+            }
+        }
+        if(emptyList.size()==0 && errorList.size()==0) {
+            resultMap.put(Constants.sjsxx_bill_no,shippingNoteNumber);
+
+           resultMap.put(Constants.sjsxx_drivers,resultDriver);
+            resultMap.put(Constants.sjsxx_despatchActualDateTime,despatchActualDateTime);
+            return resultMap;
+        }
+        return null;
+
+    }
+    public static boolean checkDateTime(String str,String pattern) {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
+        boolean flag = true;
+        try {
+            LocalDateTime.parse(str, dtf);
+        } catch (Exception e) {
+            flag = false;
+        }
+        return flag;
+    }
+    public static String transferDate(String str,String oldpattern,String newPattern) {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(oldpattern);
+        DateTimeFormatter newdtf = DateTimeFormatter.ofPattern(newPattern);
+        try {
+            String result = newdtf.format(dtf.parse(str));
+            return result;
+        } catch (Exception e) {
+            log.error("Exception:{}",e);
+           return null;
+        }
+    }
+    public Set<String> resultTransferParam(String productCode,Set<String> list){
+        Set<String> result = new HashSet<String>();
+        if ("04".equals(productCode)) {
+            //人员从业资格验证
+                for (String param : list) {
+
+                    if (Constants.rycyzgyz_nameOfPerson.equals(param)) {
+                        result.add(Constants.driver_driverNamer);
+                    }
+                    if (Constants.rycyzgyz_qualificationCertificateNumber.equals(param)) {
+                        result.add(Constants.driver_qualificationCertificate);
+                    }
+                    if (Constants.rycyzgyz_provinceCode.equals(param)) {
+                        result.add(Constants.driver_provinceCode);
+                    }
+                    if (Constants.rycyzgyz_periodStartDate.equals(param)) {
+                        result.add(Constants.driver_qualificationCertificateFrom);
+                    }
+                    if (Constants.rycyzgyz_periodEndDate.equals(param)) {
+                        result.add(Constants.driver_qualificationCertificateTo);
+                    }
+                }
+
+            }else if ("02".equals(productCode)) {//车辆营运验证
+                for (String param : list) {
+
+                    if (Constants.clyyyz_vehicleNumber.equals(param)) {
+                        result.add(Constants.car_vehicleNumber);
+                    }
+                    if (Constants.clyyyz_licensePlateTypeCode.equals(param)) {
+                        result.add(Constants.car_vehiclePlateColorCode);
+                    }
+                    if (Constants.clyyyz_roadTransportCertificateNumber.equals(param)) {
+                        result.add(Constants.car_roadTransport);
+                    }
+                    if (Constants.clyyyz_periodStartDate.equals(param)) {
+                        result.add(Constants.car_roadTransportCertificateValidPeriodFrom);
+                    }
+                    if (Constants.clyyyz_periodEndDate.equals(param)) {
+                        result.add(Constants.car_roadTransportCertificateValidPeriodTo);
+                    }
+                }
+            }else if  ("10".equals(productCode)) {//企业经营许可验证  经营许可证号
+
+
+                for (String param : list) {
+
+                    if (Constants.qyyyxkz_carrier.equals(param)) {
+                        result.add(Constants.bill_carrier);
+                    }
+                    if (Constants.qyyyxkz_permitNumber.equals(param)) {
+                        result.add(Constants.bill_permitNumber);
+                    }
+                    if (Constants.qyyyxkz_provinceCode.equals(param)) {
+                        result.add(Constants.bill_carrier);
+                      /*  result.add(Constants.bill_unifiedSocialCreditIdentifier);*/
+                    }
+                   /* if (Constants.clyyyz_periodStartDate.equals(param)) {
+                        result.add(Constants.bill_permitValidPeriodFrom);
+
+                    }
+                    if (Constants.clyyyz_periodEndDate.equals(param)) {
+                        result.add(Constants.bill_permitValidPeriodTo);
+
+                    }*/
+                    if (Constants.qyyyxkz_name.equals(param)) {
+                        result.add(Constants.bill_carrier);
+                    }
+                  /*  if (Constants.qyyyxkz_creditCode.equals(param)) {
+                        result.add(Constants.bill_unifiedSocialCreditIdentifier);
+                    }*/
+                }
+            }else if  ("09".equals(productCode)) {//车辆入网验证
+
+                for (String param : list) {
+
+                    if (Constants.clrw_vehicleNumber.equals(param)) {
+                        result.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+                    }
+                    if (Constants.clrw_licensePlateTypeCode.equals(param)) {
+                        result.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehiclePlateColorCode);
+                    }
+                }
+            }else if  ("07".equals(productCode)) {//托运人身份验证(个人)
+                for (String param : list) {
+
+                    if (Constants.persontyr_name.equals(param)) {
+                        result.add(Constants.bill_consignorInfo+"."+Constants.bill_consignor);
+                    }
+                    if (Constants.persontyr_idCode.equals(param)) {
+                        result.add(Constants.bill_consignorInfo+"."+Constants.bill_ConsignorID);
+                    }
+
+                }
+            }else if  ("08".equals(productCode)) {//托运人身份验证(企业)
+                for (String param : list) {
+
+                    if (Constants.enterpricetyr_name.equals(param)) {
+                        result.add(Constants.bill_consignorInfo+"."+Constants.bill_consignor);
+                    }
+                    if (Constants.enterpricetyr_creditCode.equals(param)) {
+                        result.add(Constants.bill_consignorInfo+"."+Constants.bill_ConsignorID);
+                    }
+                }
+            }else if  ("05".equals(productCode)) {//装货点车辆定位验证
+                for (String param : list) {
+
+                    if (Constants.zh_xh_vehicleNumber.equals(param)) {
+                        result.add(Constants.bill_vehicleNumber);
+                    }
+                    if (Constants.zh_xh_countrySubdivisionCode.equals(param)) {
+                        result.add(Constants.bill_consignorInfo+"."+Constants.bill_countrySubdivisionCode);
+                    }
+                    if (Constants.zh_xh_dateTime.equals(param)) {
+                        result.add(Constants.bill_despatchActualDateTime);
+                    }
+                }
+            }else if  ("06".equals(productCode)) {//卸货点车辆定位验证
+
+                    for (String param : list) {
+
+                        if (Constants.zh_xh_vehicleNumber.equals(param)) {
+                            result.add(Constants.bill_vehicleNumber);
+                        }
+                        if (Constants.zh_xh_countrySubdivisionCode.equals(param)) {
+                            result.add(Constants.bill_consigneeInfo+"."+Constants.bill_countrySubdivisionCode);
+                        }
+                        if (Constants.zh_xh_dateTime.equals(param)) {
+                            result.add(Constants.bill_goodsReceiptDateTime);
+                        }
+                    }
+            }else if  ("12".equals(productCode)) {//超载核验
+
+            for (String param : list) {
+
+                if (Constants.zlhy_vehicleNumber.equals(param)) {
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_vehicleNumber);
+                }
+                if (Constants.zlhy_licensePlateTypeCode.equals(param)) {
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.car_vehiclePlateColorCode);
+                }
+                if (Constants.zlhy_vehicleTonnage.equals(param)) {
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_goodsInfo+"."+Constants.bill_goodsInfo_weight);
+                }
+            }
+        }else if  ("13".equals(productCode)) {//司机上下线
+            for (String param : list) {
+
+                if (Constants.sjsxx_bill_no.equals(param)) {
+                    result.add(Constants.bill_shipping_note_number);
+                }
+                if (Constants.sjsxx_name.equals(param)) {
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_name);
+                }
+                if (Constants.sjsxx_idCode.equals(param)) {
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_License);
+
+                }
+                if(Constants.sjsxx_H1.equals(param)){
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_License);
+                    result.add(Constants.bill_vehicleInfo+"."+Constants.bill_driver+"."+Constants.bill_driver_name);
+                }
+                if (Constants.sjsxx_dateTime.equals(param)||Constants.sjsxx_despatchActualDateTime.equals(param)) {
+                    result.add(Constants.bill_despatchActualDateTime);
+                }
+                if (Constants.sjsxx_consistent.equals(param)) {
+                    result.add("活体核验结果");
+                }
+            }
+        }else{
+            result= list;
+        }
+            return result;
+        }
+
+
+}

+ 67 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/Validate.java

@@ -0,0 +1,67 @@
+package info.aspirecn.iov.yysj.check.info.common;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.regex.Pattern;
+
+
+public class Validate {
+
+    private static final Logger log = LoggerFactory.getLogger(Validate.class);
+
+    private static final Pattern mebilePattern = Pattern.compile("^[+]{0,1}[0]{0,2}(86){0,1}1((3[4-9])|(4[7])|(5[0-2|7-9])|(8[23478])|(7[8])|(9[8]))[0-9]{8}$");
+
+    private static final Pattern ipPattern = Pattern.compile("^(?:(?:1[0-9][0-9]\\.)|(?:2[0-4][0-9]\\.)|(?:25[0-5]\\.)|(?:[1-9][0-9]\\.)|(?:[0-9]\\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$");
+
+    private static final Pattern invaildSymbolPattern = Pattern.compile("\n|\r|\t");
+
+    private static final Pattern numberPattern = Pattern.compile("^[0-9]*$");
+
+    public static <T> boolean validate(T t) throws ResultCodeException, IntrospectionException, InvocationTargetException, IllegalAccessException {
+        if (null == t) {
+            return false;
+        }
+        Class<?> clazz = t.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+
+        for (Field field : fields) {
+            if (!Modifier.isFinal(field.getModifiers())) {
+                Object fieldValue = null;
+                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), clazz);
+                Method method = propertyDescriptor.getReadMethod();
+                fieldValue = method.invoke(t);
+                if (field.isAnnotationPresent(NonFixedValueAttr.class)) {
+                    NonFixedValueAttr anno = field.getAnnotation(NonFixedValueAttr.class);
+                    validateNonFixedValue(field.getName(),fieldValue, anno);
+                }
+            }
+        }
+        return true;
+    }
+
+    private static void validateNonFixedValue(String fieldName,Object fieldValue,
+                                                 NonFixedValueAttr anno) throws ResultCodeException {
+        if (null != fieldValue && !"".equals(fieldValue)) {
+            String str = fieldValue.toString();
+            if (anno.isDate()) {
+                SimpleDateFormat format = new SimpleDateFormat(
+                    anno.dateFormatString());
+                format.setLenient(false);
+                try {
+                    format.parse(str);
+                } catch (ParseException e) {
+                    throw  new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(),Constants.ResultDesc.PARAMERROR.getValue(),fieldName+"-"+fieldValue+"根式不正确");
+                }
+            }
+        }
+    }
+}

+ 199 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/common/ZuulHelper.java

@@ -0,0 +1,199 @@
+package info.aspirecn.iov.yysj.check.info.common;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+import javax.servlet.http.HttpServletResponse;
+
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.iov.yysj.check.info.CheckInfo;
+import info.aspirecn.iov.yysj.check.info.entity.BillResultObject;
+import info.aspirecn.iov.yysj.check.info.entity.CheckInfoRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.netflix.zuul.context.RequestContext;
+import lombok.extern.slf4j.Slf4j;
+@Component
+@Slf4j
+public class ZuulHelper {
+	@Autowired
+	private ObjectMapper mapper;
+	@Autowired
+	Gson gson;
+	@Autowired
+	StringRedisTemplate stringTemplate;
+	@Autowired
+	Property property;
+	public Boolean hasProcessFlag(RequestContext requestContext) {
+        
+        Boolean ret = (Boolean)requestContext.get("process");
+        if( ret != null )
+        {
+            return ret;
+        }
+        else
+        {
+            return Boolean.FALSE;
+        }
+    }
+	
+	public void responseHandle(BillResultObject responseObject, RequestContext requestContext, boolean isContinue) throws JsonProcessingException{
+		String json = mapper.writeValueAsString(responseObject);
+		 requestContext.set("process", isContinue);
+		 requestContext.setResponseBody(json);
+		 requestContext.getResponse().setCharacterEncoding("utf-8");
+		 requestContext.getResponse().setContentType("application/json");
+		 requestContext.setSendZuulResponse(false);
+		 requestContext.setResponseStatusCode(HttpServletResponse.SC_OK);// 返回码
+	}
+	//获取请求参数
+	public  String getCustomBody(RequestContext requestContext) throws UnsupportedEncodingException, IOException{
+		StringBuilder body = new StringBuilder();
+	 	BufferedReader bufferedReader = new BufferedReader(
+				new InputStreamReader(requestContext.getRequest().getInputStream(), "utf-8")); // 读取参数流
+		String nextLine = bufferedReader.readLine();
+		while (nextLine != null) {
+		    body.append(nextLine);
+			nextLine = bufferedReader.readLine();
+		}
+		String bodyStr = body.toString();
+		Map map = gson.fromJson(bodyStr, Map.class);
+		Object customBodyObject = map.get("customBody");
+		String customBody = mapper.writeValueAsString(customBodyObject);
+		return customBody;
+	}
+	//拆分运单map
+	public static  String divYunDan(String customBody) throws JsonProcessingException {
+		ObjectMapper objectMapper=new ObjectMapper();
+
+
+			Map <String,Object> resultMap = new HashMap<String,Object>();
+			Map<String, String> map = objectMapper.readValue(customBody, Map.class);
+			handle(map,resultMap);
+			return objectMapper.writeValueAsString(resultMap);
+
+
+	}
+	public static void handle(Map map,Map<String,Object> resultMap){
+		Set<Map.Entry<String,String>> set = map.entrySet();
+
+
+		for(Map.Entry<String,String> entry :set){
+			String key =entry.getKey();
+			Object value = entry.getValue();
+			String upperKey="";
+			if("vin".equals(key)){
+				upperKey="VIN";
+			}else{
+				upperKey = key.substring(0,1).toUpperCase()+key.substring(1);
+			}
+			if(value instanceof LinkedHashMap){
+				Map hashMap = (Map)value;
+				Map<String,Object> resultHashMap = new HashMap<String,Object>();
+				handle(hashMap,resultHashMap);
+				resultMap.put(upperKey,resultHashMap);
+			}else if(value instanceof String){
+				resultMap.put(upperKey,value);
+			}else if(value instanceof ArrayList){
+				List<Object> list = new ArrayList<Object>();
+				for(int i=0;i<((List) value).size();i++){
+					Object listValue = ((List) value).get(i);
+					if(listValue instanceof LinkedHashMap){
+						Map linkMap = (Map)listValue;
+						Map<String,Object> resultHashMap = new HashMap<String,Object>();
+						 handle(linkMap,resultHashMap);
+						 list.add(resultHashMap);
+					}else  if(value instanceof String){
+						resultMap.put(upperKey,value);
+						list.add(value);
+					}
+					resultMap.put(upperKey,list);
+				}
+			}
+		}
+	}
+	//请求参数查询解决
+	public  String queryParam(String url,Map<String, String>  map){
+		String result = null;
+		try{
+			CheckInfoRequest checkInfoRequest =new CheckInfoRequest();
+			if(Constants.RequestUrl.DRIVERURL.getValue().equals(url)){
+				checkInfoRequest.setPerson_name(map.get(Constants.driver_driverNamer));
+				checkInfoRequest.setPerson_driverNo(map.get(Constants.driver_driverLicenseNumber));
+				checkInfoRequest.setPerson_QualificationCertificate(map.get(Constants.driver_qualificationCertificate));
+			}else if(Constants.RequestUrl.CARURL.getValue().equals(url)){
+				checkInfoRequest.setCar_vehicleNumber(map.get(Constants.car_vehicleNumber));
+				checkInfoRequest.setCar_vehiclePlateColorCode(map.get(Constants.car_vehiclePlateColorCode));
+			}else if(Constants.RequestUrl.BILLWAYURL.getValue().equals(url)){
+				checkInfoRequest.setBill_shippingNoteNumber(map.get("shippingNoteNumber"));
+				Object vehicleInfo = map.get("vehicleInfo");
+				if(vehicleInfo !=null && vehicleInfo instanceof  LinkedHashMap){
+					Map vehicleInfoMap = (Map)vehicleInfo;
+					String vehicleNumber=(String)vehicleInfoMap.get("vehicleNumber");
+					checkInfoRequest.setBill_vehicleNumber(vehicleNumber);
+				}
+
+			}
+			result = mapper.writeValueAsString(checkInfoRequest);
+		} catch (IOException e) {
+			log.error("Exception:{}",e);
+		}
+		return result;
+	}
+	public  int getType(String url){
+			if(Constants.RequestUrl.DRIVERURL.getValue().equals(url)){
+				return 2;
+			}else if(Constants.RequestUrl.CARURL.getValue().equals(url)){
+				return 1;
+			}else if(Constants.RequestUrl.BILLWAYURL.getValue().equals(url)){
+				return 3;
+			}else if(Constants.OtherRquestUrl.LIVINGURL.getValue().equals(url)){
+				return 4;
+			}else if(Constants.OtherRquestUrl.IDLENTITYVERIFICATION.getValue().equals(url)){
+				return 5;
+			}
+
+		return 0;
+	}
+	//请求参数透传参数
+	/*public  String tcParam(String url,String productId,Map<String, String>  map){
+		String result = null;
+		try{
+			CheckInfo checkInfo =new CheckInfo();
+			//Map<String, String>  map= mapper.readValue(customBody, Map.class);
+			Map<String, String>  tcCustomMap = new HashMap<String,String>();
+			if("/info_check/driverInfo.do".equals(url)||"/info_check/carInfo.do".equals(url)){
+
+				String paramStr = property.getCarMap().get(productId);
+				String[] params = paramStr.split("-");
+				for(String param:params){
+					tcCustomMap.put(param,map.get(param));
+				}
+				return mapper.writeValueAsString(tcCustomMap);
+			}else if("/info_check/waybill.do".equals(url)){
+				checkInfo.setBill_shippingNoteNumber(map.get("ShippingNoteNumber"));
+				Object vehicleInfo = map.get("VehicleInfo");
+				if(vehicleInfo !=null && vehicleInfo instanceof  LinkedHashMap){
+					Map vehicleInfoMap = (Map)vehicleInfo;
+					String vehicleNumber=(String)vehicleInfoMap.get("VehicleNumber");
+					checkInfo.setBill_vehicleNumber(vehicleNumber);
+				}
+
+			}
+			result = mapper.writeValueAsString(checkInfo);
+		} catch (IOException e) {
+			log.error("Exception:{}",e);
+		}
+		return result;
+	}*/
+
+
+
+}
+

+ 11 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/BillResultObject.java

@@ -0,0 +1,11 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+
+@lombok.Data
+public class BillResultObject {
+    private String resultCode;
+    private String resultMsg;
+    private String traceId;
+    private Object data;
+
+}

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

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

+ 15 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/CheckInfoRequest.java

@@ -0,0 +1,15 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+import lombok.Data;
+
+@Data
+public class CheckInfoRequest {
+    private String Person_name;
+    private String Person_driverNo;
+    private String Person_identify;
+    private String Person_QualificationCertificate;
+    private String Car_vehicleNumber;
+    private String Car_vehiclePlateColorCode;
+    private String Bill_shippingNoteNumber;
+    private String Bill_vehicleNumber;
+}
+

+ 17 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/CommonResponseObject.java

@@ -0,0 +1,17 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import lombok.Data;
+
+@Data
+public class CommonResponseObject {
+    private int code;
+    private Object responseObject;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}

+ 32 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/ConcreteCheckResult.java

@@ -0,0 +1,32 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Data
+
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class ConcreteCheckResult implements  Comparable<ConcreteCheckResult>{
+    @JSONField(name="verifyCode")
+    private String verifyCode;
+    @JSONField(name="verifyMSG")
+    private String verifyMSG;
+    @JSONField(name="result")
+    private String result;
+    @JSONField(name="errorInfo")
+    private String errorInfo;
+    @JSONField(name="remark")
+    private String remark;
+
+    @Override
+    public int compareTo(ConcreteCheckResult o) {
+        return this.getVerifyCode().compareTo(o.getVerifyCode());
+    }
+
+}
+

+ 21 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/Data.java

@@ -0,0 +1,21 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.List;
+import java.util.Set;
+
+@lombok.Data
+
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class Data {
+    @JSONField(name="inconsistentMSG")
+    private String inconsistentMSG;
+    @JSONField(name="consistentMSG")
+    private String consistentMSG;
+    @JSONField(name="verifyResultSet")
+    private List<ConcreteCheckResult> verifyResultSet;
+    @JSONField(name="remark")
+    private String remark;
+}

+ 4 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/LivingRequestObject.java

@@ -0,0 +1,4 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+public class LivingRequestObject {
+}

+ 11 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/ProductRequest.java

@@ -0,0 +1,11 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import lombok.Data;
+
+@Data
+public class ProductRequest {
+    private String yysjTraceId;
+    private String parentTraceId;
+    private String sjjhTraceId;//
+    private String productId;
+}

+ 10 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/RequestBody.java

@@ -0,0 +1,10 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import lombok.Data;
+
+@Data
+public class RequestBody {
+	private String productId;
+	private String accessId;
+	private Object customBody;
+}

+ 13 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/TokenResponse.java

@@ -0,0 +1,13 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+@Data
+public class TokenResponse implements Serializable {
+    private static final long serialVersionUID = -7880906732894222677L;
+    private int code;
+    private int userId;
+    private List<Integer> products;
+}

+ 172 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/entity/WayBill.java

@@ -0,0 +1,172 @@
+package info.aspirecn.iov.yysj.check.info.entity;
+
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import info.aspirecn.iov.yysj.check.info.common.NonFixedValueAttr;
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class WayBill {
+
+    @NotBlank
+    @JSONField(name = "OriginalDocumentNumber")
+    private String originalDocumentNumber;
+    @NotBlank
+    @JSONField(name = "ShippingNoteNumber")
+    private String shippingNoteNumber;
+    @NotBlank
+
+     @NonFixedValueAttr(isDate=true,dateFormatString="yyyyMMddHHmmss")
+    @JSONField(name = "SendToProDateTime")
+   private String sendToProDateTime;
+   //  Carrier	String	是	网络货运经营者名称
+   @NotBlank
+   @JSONField(name = "Carrier")
+   private String carrier;
+   // UnifiedSocialCreditIdentifier	String	是	统一社会信用代码
+   @NotBlank
+   @JSONField(name = "UnifiedSocialCreditIdentifier")
+    private String unifiedSocialCreditIdentifier;
+    //PermitNumber	String	是	网络货运经营者的道路运输经营许可证编号,网络货运经营者整合车辆全部为总质量4.5吨及以下普通货运车辆的,可填“企业所在地行政区划代码+000000”。
+    @NotBlank
+    @JSONField(name = "PermitNumber")
+    private String permitNumber;
+   // ConsignmentDateTime	String	是	网络货运经营者信息系统正式成交生成运单的日期时间。YYYYMMDDhhmmss
+   @NonFixedValueAttr(isDate=true,dateFormatString="yyyyMMddHHmmss")
+   @JSONField(name = "ConsignmentDateTime")
+   private String consignmentDateTime;
+    //BusinessTypeCode	String	是	业务类型代码,代码集参见wlhy.mot.gov.cn。
+    @NotBlank
+    @JSONField(name = "BusinessTypeCode")
+    private String businessTypeCode;
+    //DespatchActualDateTime	String	是	货物装车后的发车时间。YYYYMMDDhhmmss
+    @NonFixedValueAttr(isDate=true,dateFormatString="yyyyMMddHHmmss")
+    @JSONField(name = "DespatchActualDateTime")
+    private String despatchActualDateTime;
+    //GoodsReceiptDateTime	String	是	货物运到后的签收时间。YYYYMMDDhhmmss
+    @NonFixedValueAttr(isDate=true,dateFormatString="yyyyMMddHHmmss")
+    @JSONField(name = "GoodsReceiptDateTime")
+    private String goodsReceiptDateTime;
+    //ConsignorInfo	String	是	托运人信息
+    @NotBlank
+    @JSONField(name = "ConsignorInfo")
+    private String consignorInfo;
+    //Consignor	String	是	托运人名称
+    @NotBlank
+    @JSONField(name = "Consignor")
+    private String consignor;
+   // ConsignorID	String	是	托运人统一社会信用代码或个人证件号
+   @NotBlank
+   @JSONField(name = "ConsignorID")
+   private String consignorID;
+    //PlaceOfLoading	String	否	实际装货的地点。
+    @JSONField(name = "consignorID")
+   private String placeOfLoading;
+    //CountrySubdivisionCode	String	是	参照最新版《中华人民共和国行政区划代码》(GB/T 2260-2017),精确到区县。
+    @NotBlank
+    @JSONField(name = "CountrySubdivisionCode")
+    private String countrySubdivisionCode;
+    //ConsigneeInfo	String	是	收货方信息
+    @NotBlank
+    @JSONField(name = "ConsigneeInfo")
+    private String consigneeInfo;
+    //Consignee	String	是	收货方名称
+    @NotBlank
+    @JSONField(name = "Consignee")
+    private String consignee;
+    //ConsigneeID	String	是	收货方统一社会信用代码或个人证件号码
+    @NotBlank
+    @JSONField(name = "ConsigneeID")
+    private String consigneeID;
+   // GoodsReceiptPlace	String	否	收货地址
+   @JSONField(name = "GoodsReceiptPlace")
+    private String goodsReceiptPlace;
+    //TotalMonetaryAmount	String	是	托运人与网络货运经营者签订运输合同确定的运费金额,货币单位为人民币(元),保留3位小数,如整数的话,以.000填充。如是一笔业务分几辆车运,需将托运人针对这笔业务付给网络货运经营者的运输费用分摊到每辆车上。
+    @NotBlank
+    @JSONField(name = "TotalMonetaryAmount")
+    private String totalMonetaryAmount;
+    //VehicleInfo	String	是	车辆信息
+    @NotBlank
+    @JSONField(name = "VehicleInfo")
+    private String vehicleInfo;
+    //VehiclePlateColorCode	String	是	车牌颜色代码
+    @NotBlank
+    @JSONField(name = "Carrier")
+    private String vehiclePlateColorCode;
+    //VehicleNumber	String	是	车辆牌照号
+    @NotBlank
+    @JSONField(name = "Carrier")
+    private String vehicleNumber;
+    //Driver	String	是	驾驶员,如运输过程中有多个驾驶员,可循环。
+    @NotBlank
+    @JSONField(name = "Driver")
+    private String driver;
+    //DriverName	String	是	驾驶员姓名。
+    @NotBlank
+    @JSONField(name = "DriverName")
+    private String driverName;
+    //DrivingLicense	String	是	机动车驾驶证编号,根据机动车驾驶证填写。
+    @NotBlank
+    @JSONField(name = "DrivingLicense")
+    private String drivingLicense;
+   // GoodsInfo	String	是	货物信息,如一车货有不同货物,则可循环。
+   @NotBlank
+   @JSONField(name = "GoodsInfo")
+   private String goodsInfo;
+    //DescriptionOfGoods	String	是	货物名称
+    @NotBlank
+    @JSONField(name = "DescriptionOfGoods")
+    private String descriptionOfGoods;
+    //CargoTypeClassificationCode	String	是	货物类型分类代码
+    @NotBlank
+    @JSONField(name = "CargoTypeClassificationCode")
+    private String cargoTypeClassificationCode;
+    //GoodsItemGrossWeight	String	是	货物项毛重,重量单位以KGM千克填写数值,保留3位小数,如整数的话,以.000填充。小数点不计入总长。如是轻泡货等货物,请估算重量。如一笔业务分几辆车运,需报送每辆车实际运输的货物重量。
+    @NotBlank
+    @JSONField(name = "GoodsItemGrossWeight")
+    private String goodsItemGrossWeight;
+    //Cube	String	否	体积,体积单位以DMQ立方米填写数值,保留4位小数,如整数的话,以.0000填充。小数点不计入总长。
+    @NotBlank
+    @JSONField(name = "Cube")
+    private String cube;
+    //TotalNumberOfPackages	String	否	总件数
+    @NotBlank
+    @JSONField(name = "TotalNumberOfPackages")
+    private String totalNumberOfPackages;
+    //ActualCarrierInfo	String	是	实际承运人信息
+    @NotBlank
+    @JSONField(name = "ActualCarrierInfo")
+    private String actualCarrierInfo;
+    //ActualCarrierName	String	是	必填,与网络货运经营者签订运输合同,实际完成运输的经营者。取得道路运输经营许可证的个体运输业户,直接填写“许可证上的业户名称”;其他情况填写“运输公司名称(实际承运驾驶员姓名)”。
+    @NotBlank
+    @JSONField(name = "ActualCarrierName")
+    private String actualCarrierName;
+    //ActualCarrierBusinessLicense	String	是	必填,实际承运人的道路运输经营许可证编号,网络货运经营者整合车辆全部为总质量4.5吨及以下普通货运车辆的,可填“车籍地6位行政区域代码+000000”。
+    @NotBlank
+    @JSONField(name = "ActualCarrierBusinessLicense")
+    private String actualCarrierBusinessLicense;
+    //ActualCarrierID	String	是	实际承运人统一社会信用代码或证件号码
+    @NotBlank
+    @JSONField(name = "ActualCarrierID")
+    private String actualCarrierID;
+    //InsuranceInformation	String	是	保险信息
+    @NotBlank
+    @JSONField(name = "InsuranceInformation")
+    private String insuranceInformation;
+    //PolicyNumber	String	是	保险单号,未投保的,可填none。
+    @NotBlank
+    @JSONField(name = "PolicyNumber")
+    private String policyNumber;
+    //InsuranceCompany	String	是	保险公司名称,代码集参见wlhy.mot.gov.cn。未投保的,可填“无”。
+    @NotBlank
+    @JSONField(name = "InsuranceCompany")
+    private String insuranceCompany;
+    //Remark	String	否	备注
+    @JSONField(name = "Remark")
+    private String remark;
+    //CheckRange	String	否	校验范围,默认不填,按照用户在校验系统后台设定的校验项进行校验;如填写则按照填写项进行校验;填写多项时以半角逗号隔开。*/
+    @JSONField(name = "CheckRange")
+   private String  checkRange;
+}

+ 157 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/EIDInforFilter.java

@@ -0,0 +1,157 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.cloud.yysj.commons.lang.OtherCommonResult;
+import info.aspirecn.cloud.yysj.commons.lang.ProductCheckRequest;
+import info.aspirecn.iov.yysj.check.info.common.*;
+import info.aspirecn.iov.yysj.check.info.entity.BillResultObject;
+import info.aspirecn.iov.yysj.check.info.entity.CheckDetailLogObject;
+import info.aspirecn.iov.yysj.paramtransfer.inter.YysjUserActionInterface;
+import info.aspirecn.iov.yysj.paramtransfer.inter.vo.YysjProduct;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ *
+ */
+@Slf4j
+public class EIDInforFilter extends ZuulFilter {
+
+	@Autowired
+	private ObjectMapper mapper;
+	@Autowired
+	private OtherRibbonHandle channelRibbonHandle;
+	@Autowired
+	private ZuulHelper helper;
+	@Autowired
+	private YysjUserActionInterface yysjUserActionInterface;
+	@Autowired
+	private TransferParam transferParam;
+	@Override
+	public boolean shouldFilter() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		String livingUrl = Constants.OtherRquestUrl.LIVINGURL.getValue();
+		String indetifyUrl = Constants.OtherRquestUrl.IDLENTITYVERIFICATION.getValue();
+        return CommonUtil.isContinue() && (livingUrl.equals(url)||indetifyUrl.equals(url));
+	}
+
+	@Override
+	public Object run() {
+
+
+
+
+		RequestContext requestContext = RequestContext.getCurrentContext();
+
+		String traceId = (String)requestContext.get(Constants.HEADER_TRACEID_KEY);
+		HttpServletRequest request = requestContext.getRequest();
+		requestContext.set(Constants.Url,request.getRequestURI());
+		String userId = request.getHeader(Constants.HEADER_USER_ID);
+		String url = requestContext.getRequest().getRequestURI();
+		int type = helper.getType(url);
+		BillResultObject billResultObject = new BillResultObject();
+		String consistent = Constants.error;
+		try{
+			billResultObject.setResultCode(Constants.ResultDesc.SUCCESS.getCode());
+			billResultObject.setResultMsg("成功");
+			billResultObject.setTraceId(traceId);
+			try {
+				List<YysjProduct> yysjProducts =yysjUserActionInterface.getYysjProductIdByUserId(userId,type);
+				if(yysjProducts==null || yysjProducts.size()==0){
+					throw new ResultCodeException(Constants.ResultDesc.NO_PERMISSION.getCode(),"未订购核验项","根据类型和用户没有获取到校验资格项");
+
+				}
+				YysjProduct yysjProduct = yysjProducts.get(0);
+				Map<String,String> map = (Map<String,String>)requestContext.get("bodyMap");
+
+				String token = (String) requestContext.get(Constants.HEADER_TOKEN_KEY);
+				List<CheckDetailLogObject>  checkDetails = new ArrayList<CheckDetailLogObject>();
+				Set<String> emptyList = new HashSet<>();
+				Set<String> erroList = new HashSet<>();
+
+					Map<String,Object> cutomeMap=  transferParam.getCustomBody(map,url,emptyList,erroList);
+					if(emptyList.size()!=0){
+						String emptyNode = StringUtils.joinWith(",",emptyList.toArray());
+						throw new ResultCodeException(Constants.ResultDesc.PARAMNULL.getCode(),emptyNode+"必填项为空","存在空值在必须校验的项上"+emptyNode);
+
+					}
+					if(erroList.size()!=0){
+						String emptyNode = StringUtils.joinWith(",",erroList.toArray());
+						throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(),emptyNode+"参数不符合规格","存在错误的校验项上"+emptyNode);
+
+					}
+
+
+
+					ProductCheckRequest productCheckRequest = new ProductCheckRequest();
+					productCheckRequest.setYysjProductId(yysjProduct.getYysjProductId());
+					List<String> list = yysjProduct.getSjjhProductId();
+					productCheckRequest.setSjjhProductId(list);
+					productCheckRequest.setCustomBody(cutomeMap);
+					String requestBody = mapper.writeValueAsString(productCheckRequest);
+
+					OtherCommonResult otherCommonResult = channelRibbonHandle.channelRibbonHandle(token, requestBody, userId, traceId, yysjProduct.getYysjProductId());
+
+					CheckDetailLogObject checkDetailLogObject = new CheckDetailLogObject();
+				    checkDetailLogObject.setProductId(yysjProduct.getYysjProductId());
+					if(Constants.consistent_code.equals(otherCommonResult.getResultCode())||Constants.inconsistent_code.equals(otherCommonResult.getResultCode())) {
+						consistent = otherCommonResult.getResultCode();
+						billResultObject.setData(otherCommonResult.getResultBody());
+						String result = mapper.writeValueAsString(otherCommonResult.getResultBody());
+						checkDetailLogObject.setResult(result);
+					}else if(Constants.xysj_error.equals(otherCommonResult.getResultCode())){//网关失败,返回信用内部错误
+						throw new ResultCodeException(Constants.ResultDesc.SERVERERROR.getCode(),Constants.ResultDesc.SERVERERROR.getValue(),"信用数据内部错误");
+					}else if(Constants.error.equals(otherCommonResult.getResultCode())){//异常返回失败
+						throw new ResultCodeException(Constants.ResultDesc.FAIL.getCode(),Constants.ResultDesc.FAIL.getValue(),"系统处理异常");
+					}else if(Constants.param_error.equals(otherCommonResult.getResultCode())){//参数错误
+						throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(),Constants.ResultDesc.PARAMERROR.getValue(),"参数错误");
+					}
+					checkDetails.add(checkDetailLogObject);
+
+
+
+
+
+
+				request.setAttribute("consistent",consistent);
+				request.setAttribute("userId",userId);
+				String   checkDetailsStr = mapper.writeValueAsString(checkDetails);
+				request.setAttribute("CheckDetails",checkDetailsStr);
+		} catch (ResultCodeException ex){
+			log.error("resultCodeException:{}",ex);
+			billResultObject.setResultCode(ex.getCode());
+			billResultObject.setResultMsg(ex.getMessage());
+		}catch (Exception ex) {
+			log.error("Exception:{}",ex);
+			billResultObject.setResultCode(Constants.ResultDesc.SERVERERROR.getCode());
+			billResultObject.setResultMsg(Constants.ResultDesc.SERVERERROR.getValue());
+		}
+		helper.responseHandle(billResultObject, requestContext,false);
+	}catch (JsonProcessingException e) {
+			log.error("解析对象出错,message:{}", e);
+		}
+		return null;
+
+	}
+
+	@Override
+	public String filterType() {
+		return FilterConstants.PRE_TYPE;
+	}
+
+	@Override
+	public int filterOrder() {
+		return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER + 4;
+	}
+
+}

+ 62 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/InterfaceFilter.java

@@ -0,0 +1,62 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.iov.yysj.check.info.common.CommonUtil;
+import info.aspirecn.iov.yysj.check.info.common.ZuulHelper;
+import info.aspirecn.iov.yysj.check.info.entity.BillResultObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * 屏蔽除了/info_check/waybill.do;/info_check/carInfo.do;/info_check/driverInfo.do的请求
+ */
+@Slf4j
+public class InterfaceFilter extends ZuulFilter {
+	@Autowired
+	private ZuulHelper zuulHelper;
+	@Override
+	public boolean shouldFilter() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		requestContext.getRequest().setAttribute("paramBody",new HashMap());
+		requestContext.getRequest().setAttribute("queryParam",new HashMap());
+		requestContext.getRequest().setAttribute("CheckDetails",new ArrayList<>());
+		return  !CommonUtil.checkAllUrl(url);
+	}
+
+	@Override
+	public Object run() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		log.error("当前没有满足条件的接口,请求地址:{}",url);
+		BillResultObject responseObject = new BillResultObject();
+		responseObject.setResultCode(Constants.ResultDesc.HTTPMETHODERROR.getCode());
+		responseObject.setResultMsg(Constants.ResultDesc.HTTPMETHODERROR.getValue());
+		String traceId = (String)requestContext.get(Constants.HEADER_TRACEID_KEY);
+		responseObject.setTraceId(traceId);
+		try {
+			zuulHelper.responseHandle(responseObject, requestContext,false);
+		} catch (JsonProcessingException e) {
+			log.error("解析json失败,message:{}", e);
+		}
+		return null;
+	}
+
+	@Override
+	public String filterType() {
+		return FilterConstants.PRE_TYPE;
+	}
+
+	@Override
+	public int filterOrder() {
+		return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER+2;
+	}
+}

+ 161 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/RequestBodyFilter.java

@@ -0,0 +1,161 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.iov.yysj.check.info.common.*;
+import info.aspirecn.iov.yysj.check.info.entity.BillResultObject;
+import info.aspirecn.iov.yysj.paramtransfer.inter.YysjUserActionInterface;
+import info.aspirecn.iov.yysj.paramtransfer.inter.vo.YysjUser;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 获取到请求参数,并进行验签,和headers的校验
+ */
+@Slf4j
+public class RequestBodyFilter extends ZuulFilter {
+
+	@Autowired
+	private Property property;
+	@Autowired
+	private StringRedisTemplate stringRedisTemplate;
+	@Autowired
+	private YysjUserActionInterface yysjUserActionInterface;
+	@Autowired
+	private ObjectMapper mapper;
+	@Autowired
+	private ZuulHelper helper;
+	@Override
+	public boolean shouldFilter() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		boolean isExist =  CommonUtil.checkAllUrl(url)&& CommonUtil.isContinue();
+		return isExist;
+	}
+
+	@Override
+	public Object run() {
+
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		HttpServletRequest request = requestContext.getRequest();
+		String url = request.getRequestURI();
+		String userId = request.getHeader(Constants.HEADER_USER_ID);
+		String body = CommonUtil.getBody(request);
+		BillResultObject responseObject= new BillResultObject();
+		try {
+			try{
+				if(body==null){
+					throw new ResultCodeException(Constants.ResultDesc.PARAMNULL.getCode(),"request body必填项为空","request body为空");
+				}
+                Map<String, String> map = null;
+				log.info("body:{}",body);
+				String logBody ="";
+                try {
+						logBody = helper.divYunDan(body);
+					map = mapper.readValue(body,Map.class);
+
+                }catch (Exception ex){
+                	log.error("ex:{}",ex);
+                    throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(), "request body参数不符合规格", "request body格式不正确");
+                }
+
+                requestContext.set("bodyMap",map);
+                requestContext.set(Constants.BODY,body);
+                String queryParam = helper.queryParam(url,map);
+                //设置请求参数信息和全量请求参数
+				request.setAttribute("queryParam",new String(queryParam.getBytes("utf-8"),"utf-8"));
+				request.setAttribute("paramBody",new String(logBody.getBytes("utf-8"),"utf-8"));
+				//根据userId查询appid和appscret
+                if(StringUtils.isEmpty(userId)){
+                    throw new ResultCodeException(Constants.ResultDesc.PARAMNULL.getCode(),"LOGINK-USER-ID必填项为空","LOGINK-USER-ID没有值");
+                }
+				YysjUser yysjUser = yysjUserActionInterface.getUser(userId);
+                if(yysjUser==null){
+					throw new ResultCodeException(Constants.ResultDesc.NO_PERMISSION.getCode(),"未开通云雁服务","未开通云雁服务");
+				}
+
+
+
+				String appId = yysjUser.getAppId();
+				String appSecret = yysjUser.getSecret();
+
+
+
+				String productIds = "";
+				String token ="";
+				Map<String, Object> claims = new HashMap<>();
+				String tokenInfo = stringRedisTemplate.boundValueOps("sjjhcore::getToken_"+appId+"_"+appSecret).get();
+
+				if(tokenInfo!=null){
+					String[] tokenInfos = tokenInfo.split("_");
+					claims.put("userId", tokenInfos[0]);
+					claims.put("productIds",tokenInfos[1]);
+					Calendar calendar = Calendar.getInstance();
+					calendar.add(Calendar.MINUTE, 30);
+					productIds = tokenInfos[1];
+					token = JWTUtils.generateToken(claims, property.getTokenSecret(), calendar.getTime(), SignatureAlgorithm.HS256);
+
+				}else {
+						claims.put("userId", String.valueOf(yysjUser.getSjjhUserId()));
+						//从数据库获取数据交互的产品id
+						List<String> products = yysjUserActionInterface.getSjjhProduct();
+
+
+						if(products ==null || products.size()==0){
+							throw new ResultCodeException(Constants.ResultDesc.SERVERERROR.getCode(),Constants.ResultDesc.SERVERERROR.getValue(),"数据交互列表为空");
+						}
+						productIds = org.apache.commons.lang.StringUtils.join(products, ",");
+						claims.put("productIds", productIds);
+						Calendar calendar = Calendar.getInstance();
+						calendar.add(Calendar.MINUTE, 30);
+						token = JWTUtils.generateToken(claims, property.getTokenSecret(), calendar.getTime(), SignatureAlgorithm.HS256);
+						stringRedisTemplate.boundValueOps("sjjhcore::getToken_" + appId + "_" + appSecret).set(yysjUser.getSjjhUserId() + "_" + productIds);
+						stringRedisTemplate.boundValueOps("sjjhcore::getToken_" + appId + "_" + appSecret).expire(30, TimeUnit.MINUTES);
+
+				}
+
+				requestContext.set(Constants.HEADER_TOKEN_KEY,token);
+				requestContext.set(Constants.PRODUCTIDS_KEY,productIds);
+				return null;
+			} catch (ResultCodeException ex){
+				log.error("resultCodeException:{}",ex);
+				responseObject.setResultCode(ex.getCode());
+				responseObject.setResultMsg(ex.getMessage());
+				responseObject.setTraceId((String)requestContext.get(Constants.HEADER_TRACEID_KEY));
+			}catch (Exception ex) {
+				log.error("Exception:{}",ex);
+				responseObject.setResultCode(Constants.ResultDesc.SERVERERROR.getCode());
+				responseObject.setResultMsg(Constants.ResultDesc.SERVERERROR.getValue());
+				responseObject.setTraceId((String)requestContext.get(Constants.HEADER_TRACEID_KEY));
+			}
+			helper.responseHandle(responseObject,requestContext,false);
+		} catch (JsonProcessingException e) {
+			log.error("解析对象出错,message:{}", e);
+		}
+
+		return null;
+
+
+	}
+
+	@Override
+	public String filterType() {
+		return FilterConstants.PRE_TYPE;
+	}
+
+	@Override
+	public int filterOrder() {
+		return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER + 3;
+	}
+}

+ 62 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/ResponseTraceIDFilter.java

@@ -0,0 +1,62 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import brave.Tracer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+
+
+/**
+ * 向response写入x-b3-traceid信息
+ * 
+ * 请求header中need-x-b3-traceid存在,则返回整个链路的x-b3-traceid信息,
+ * 在response写入x-b3-traceid信息
+ * 
+ * @author wangxinning
+ *
+ */
+@Slf4j
+public class ResponseTraceIDFilter extends ZuulFilter {
+
+	@Autowired
+	private Tracer tracer;
+	@Autowired
+	ObjectMapper objectMapper;
+
+	@Override
+	public boolean shouldFilter() {
+		/*RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		Pattern pattern = Pattern.compile("result.do");
+		Matcher matcher = pattern.matcher(url);*/
+		return (tracer != null && tracer.currentSpan() != null
+                && StringUtils.isNotBlank(tracer.currentSpan().context().traceIdString()));
+	}
+
+	@Override
+	public Object run() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+		String traceId = tracer.currentSpan().context().traceIdString();
+		String spanId = String.valueOf(tracer.currentSpan().context().spanId());
+		requestContext.getRequest().setAttribute(Constants.HEADER_TRACEID_KEY, traceId);
+		requestContext.getRequest().setAttribute("x-b3-spanid", spanId);
+		requestContext.set(Constants.HEADER_TRACEID_KEY,traceId);
+		return null;
+	}
+
+	@Override
+	public String filterType() {
+		return FilterConstants.PRE_TYPE;
+	}
+
+	@Override
+	public int filterOrder() {
+		return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER + 1;
+	}
+}

+ 48 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/ResultFilter.java

@@ -0,0 +1,48 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.iov.yysj.check.info.entity.BillResultObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import java.io.IOException;
+@Slf4j
+public class ResultFilter extends ZuulFilter {
+    @Autowired
+    private ObjectMapper mapper;
+
+    @Override
+    public boolean shouldFilter() {
+        return true;
+    }
+
+    @Override
+    public Object run() {
+        RequestContext requestContext = RequestContext.getCurrentContext();
+        String responseBody = requestContext.getResponseBody();
+        try {
+            BillResultObject billResultObject = mapper.readValue(responseBody,BillResultObject.class);
+            String traceId = (String)requestContext.get(Constants.HEADER_TRACEID_KEY);
+            billResultObject.setTraceId(traceId);
+            requestContext.getRequest().setAttribute("resultCode",billResultObject.getResultCode());
+        } catch (IOException e) {
+            log.info("解析数据异常:{}",e);
+        }
+        return null;
+
+    }
+
+    @Override
+    public String filterType() {
+        return FilterConstants.PRE_TYPE;
+    }
+
+    @Override
+    public int filterOrder() {
+        return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER + 5;
+    }
+
+}

+ 246 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/pre/WayBillFilter.java

@@ -0,0 +1,246 @@
+package info.aspirecn.iov.yysj.check.info.pre;
+
+import javax.servlet.http.HttpServletRequest;
+import brave.Tracer;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import info.aspirecn.cloud.yysj.commons.lang.BillItemResult;
+import info.aspirecn.cloud.yysj.commons.lang.Constants;
+import info.aspirecn.cloud.yysj.commons.lang.ProductCheckRequest;
+import info.aspirecn.iov.yysj.check.info.common.*;
+import info.aspirecn.iov.yysj.check.info.entity.*;
+import info.aspirecn.iov.yysj.paramtransfer.inter.YysjUserActionInterface;
+import info.aspirecn.iov.yysj.paramtransfer.inter.vo.YysjProduct;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import lombok.extern.slf4j.Slf4j;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import info.aspirecn.iov.yysj.paramtransfer.inter.YysjUserActionInterface;
+/**
+ * 运单信息核验服务,
+ */
+@Slf4j
+public class WayBillFilter extends ZuulFilter {
+
+	@Autowired
+	private Property property;
+	@Autowired
+	private Tracer tracer;
+	@Autowired
+	private ObjectMapper mapper;
+	@Autowired
+	private ChannelRibbonHandle channelRibbonHandle;
+	@Autowired
+	private ZuulHelper helper;
+	@Autowired
+	private YysjUserActionInterface yysjUserActionInterface;
+	@Autowired
+	private TransferParam transferParam;
+	@Override
+	public boolean shouldFilter() {
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		String url = requestContext.getRequest().getRequestURI();
+        return CommonUtil.isContinue() && CommonUtil.checkUrl(url);
+	}
+
+	@Override
+	public Object run() {
+		String traceId = tracer.currentSpan().context().traceIdString();
+		Pattern pattern = Pattern.compile("(.*?)公司$");
+		//同斥产品列表
+		List<String> mutexProducts = new ArrayList<String>();
+		Set<String> verifyRangeSet =  new HashSet<String>();
+		BillResultObject billResultObject = new BillResultObject();
+		String accessId = tracer.currentSpan().context().traceIdString();
+		RequestContext requestContext = RequestContext.getCurrentContext();
+		HttpServletRequest request = requestContext.getRequest();
+		String url = request.getRequestURI();
+		try{
+		try {
+			String token = (String) requestContext.get(Constants.HEADER_TOKEN_KEY);
+
+			//根据用户id获取订购的数据交互产品信息
+			String userId = request.getHeader(Constants.HEADER_USER_ID);
+			int type = helper.getType(url);
+			Map<String,String> map = (Map<String,String>)requestContext.get("bodyMap");
+			//根据userId获取云验平台产品
+			List<YysjProduct> yysjProducts =yysjUserActionInterface.getYysjProductIdByUserId(userId,type);
+			if(yysjProducts==null || yysjProducts.size()==0){
+				throw new ResultCodeException(Constants.ResultDesc.NO_PERMISSION.getCode(),"没有订购校验资格项","根据类型和用户没有获取到校验资格项");
+
+			}
+			String verifyRange= map.get("verifyRange");
+			if(!StringUtils.isEmpty(verifyRange)){
+				verifyRangeSet =new HashSet(Arrays.asList(verifyRange.split(",")));
+			}
+			Map<String,String> yysjProductCodeMap = property.getYysjProductCode();
+			String resultCode = "1";
+			List<ConcreteCheckResult> results = new ArrayList<ConcreteCheckResult>();
+
+			Set<String> inconsistentContentItem =new HashSet<String>();
+			Set<String> consistentContentItem =new HashSet<String>();
+			Map<String,Map<String,Object>> cumtomBodyMap = new HashMap<String,Map<String,Object>>();
+			Set<String> emptyList = new HashSet<>();
+			Set<String> erroList = new HashSet<>();
+			int index = 0;
+			List<YysjProduct> products = new ArrayList<YysjProduct>();
+			for(YysjProduct yysjProduct : yysjProducts){
+				//String yysjProductCode = yysjProductCodeMap.get(yysjProduct.getYysjProductId());
+				String yysjProductCode = yysjProduct.getYysjProductCode();
+				if((verifyRangeSet.size()!=0 && verifyRangeSet.contains(yysjProductCode))||verifyRangeSet.size()==0){
+					if("07".equals(yysjProductCode)||"08".equals(yysjProductCode)){
+						mutexProducts.add(yysjProductCode);
+					}
+					//yysjProduct.setYysjProductCode(yysjProductCode);
+					index++;
+					Map<String,Object> cutomBody = transferParam.getCustomBody(map, yysjProductCode, emptyList,erroList);
+					if(cutomBody!=null){
+						yysjProduct.setCostomObject(cutomBody);
+						cumtomBodyMap.put( yysjProduct.getYysjProductId(),cutomBody);
+					}
+					products.add(yysjProduct);
+				}
+			}
+			if(emptyList.size()!=0){
+				String emptyNode = StringUtils.joinWith(",",emptyList.toArray());
+				throw new ResultCodeException(Constants.ResultDesc.PARAMNULL.getCode(),emptyNode+"必填项为空","存在空值在必须校验的项上"+emptyNode);
+
+			}
+			if(erroList.size()!=0){
+				String emptyNode = StringUtils.joinWith(",",erroList.toArray());
+				throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(),emptyNode+"参数不符合规格","存在错误的校验项上"+emptyNode);
+
+			}
+			if(index ==0){
+				throw new ResultCodeException(Constants.ResultDesc.PARAMERROR.getCode(),"verifyRange参数不符合规格","verifyRange与订购的校验项没有重合项");
+			}
+			List<CheckDetailLogObject>  checkDetails = new ArrayList<CheckDetailLogObject>();
+			for(YysjProduct yysjProduct : products){
+				CheckDetailLogObject checkDetailLogObject = new CheckDetailLogObject();
+				checkDetailLogObject.setProductId(yysjProduct.getYysjProductId());
+				ConcreteCheckResult concreteCheckResult = new ConcreteCheckResult();
+				concreteCheckResult.setVerifyCode(yysjProduct.getYysjProductCode());
+				concreteCheckResult.setVerifyMSG(yysjProduct.getProduceName());
+				try {
+					List<String> list = yysjProduct.getSjjhProductId();
+					if(mutexProducts.size()>1 && (("07".equals(yysjProduct.getYysjProductCode()))||"08".equals(yysjProduct.getYysjProductCode()))){//选定了07和08,当07的时候用户信息不是以公司结尾,且长度不大于4
+						Object consignorInfo = map.get(Constants.bill_consignorInfo);
+						Map<String,String> consignorInfoMap =(Map<String,String>)consignorInfo;
+
+						String consignor = consignorInfoMap.get(Constants.bill_consignor);
+						Matcher matcher = pattern.matcher(consignor);
+						String subStrConsignor=consignor.substring(consignor.length()-2,consignor.length());
+
+						if((!matcher.matches()|| consignor.length()<=4)&&"08".equals(yysjProduct.getYysjProductCode())){
+							continue;
+						}
+						if(matcher.matches()&& consignor.length()>4&&"07".equals(yysjProduct.getYysjProductCode())){
+							continue;
+						}
+					}
+					ProductCheckRequest productCheckRequest = new ProductCheckRequest();
+					productCheckRequest.setYysjProductId(yysjProduct.getYysjProductId());
+					productCheckRequest.setSjjhProductId(list);
+					productCheckRequest.setCustomBody(yysjProduct.getCostomObject());
+					String requestBody = mapper.writeValueAsString(productCheckRequest);
+
+					BillItemResult billItemResult = channelRibbonHandle.channelRibbonHandle(token, requestBody, userId, traceId, yysjProduct.getYysjProductId());
+
+
+					concreteCheckResult.setResult("1".equals(billItemResult.getResult())?"0":"1");
+					if (!"1".equals(billItemResult.getResult())) {
+
+						resultCode = "0";
+						inconsistentContentItem.add(yysjProduct.getYysjProductCode());
+						BillItemResult.ErrorResponse errorResponse = billItemResult.getExceptionInformation();
+
+						if(errorResponse.getCode() == Constants.ErrorCode.Exception.getErrorCode()){
+							concreteCheckResult.setErrorInfo(Constants.errorInfo);
+						}else if(errorResponse.getCode() == Constants.ErrorCode.WEIGTHOVER.getErrorCode()){
+							concreteCheckResult.setErrorInfo(Constants.weightOverInfo);
+						}else {
+							Set<String> resultList = errorResponse.getResultList();
+							Set<String> resultSet = transferParam.resultTransferParam(yysjProduct.getYysjProductCode(),resultList);
+							if (errorResponse.getCode() == Constants.ErrorCode.NULL.getErrorCode()) {
+								concreteCheckResult.setErrorInfo("数据源" + StringUtils.join(resultSet.toArray(), ",") + "为空");
+							} else {
+
+								concreteCheckResult.setErrorInfo("数据源" + StringUtils.join(resultSet.toArray(), ",") + "为不一致");
+							}
+						}
+
+					} else {
+						consistentContentItem.add(yysjProduct.getYysjProductCode());
+					}
+
+					checkDetailLogObject.setResult(billItemResult.getResult());
+				}catch (Exception ex){
+					log.error("WayBillFilter,exception:{}",ex);
+					concreteCheckResult.setResult("1");
+					resultCode = "0";
+					checkDetailLogObject.setResult("0");
+					inconsistentContentItem.add(yysjProduct.getYysjProductCode());
+					concreteCheckResult.setErrorInfo("系统异常");
+				}
+				checkDetails.add(checkDetailLogObject);
+				results.add(concreteCheckResult);
+
+			}
+			Data data = new Data();
+			Collections.sort(results);
+			data.setVerifyResultSet(results);
+			if(inconsistentContentItem.size()==0){
+				data.setInconsistentMSG("");
+			}else{
+				data.setInconsistentMSG(StringUtils.join(new TreeSet<String>(inconsistentContentItem).toArray(), ","));
+			}
+			if(consistentContentItem.size()==0){
+				data.setConsistentMSG("");
+			}else {
+				data.setConsistentMSG(StringUtils.join(new TreeSet<String>(consistentContentItem).toArray(), ","));
+			}
+			billResultObject.setData(data);
+			billResultObject.setResultCode(Constants.ResultDesc.SUCCESS.getCode());
+			billResultObject.setResultMsg("成功");
+			billResultObject.setTraceId(accessId);
+			//String json = mapper.writeValueAsString(billResultObject);
+			request.setAttribute("consistent",resultCode);
+			request.setAttribute("userId",userId);
+			String   checkDetailsStr = mapper.writeValueAsString(checkDetails);
+			request.setAttribute("CheckDetails",checkDetailsStr);
+		} catch (ResultCodeException ex){
+			log.error("resultCodeException:{}",ex);
+			billResultObject.setResultCode(ex.getCode());
+			billResultObject.setResultMsg(ex.getMessage());
+			billResultObject.setTraceId((String)requestContext.get(Constants.HEADER_TRACEID_KEY));
+		}catch (Exception ex) {
+			log.error("Exception:{}",ex);
+			billResultObject.setResultCode(Constants.ResultDesc.SERVERERROR.getCode());
+			billResultObject.setResultMsg(Constants.ResultDesc.SERVERERROR.getValue());
+			billResultObject.setTraceId((String) requestContext.get(Constants.HEADER_TRACEID_KEY));
+		}
+		helper.responseHandle(billResultObject, requestContext,false);
+	}catch (JsonProcessingException e) {
+			log.error("解析对象出错,message:{}", e);
+		}
+		return null;
+
+	}
+
+	@Override
+	public String filterType() {
+		return FilterConstants.PRE_TYPE;
+	}
+
+	@Override
+	public int filterOrder() {
+		return FilterConstants.SERVLET_30_WRAPPER_FILTER_ORDER + 4;
+	}
+
+}

+ 68 - 0
src/main/java/info/aspirecn/iov/yysj/check/info/redis/RedisConfig.java

@@ -0,0 +1,68 @@
+package info.aspirecn.iov.yysj.check.info.redis;
+
+import java.nio.charset.Charset;
+import java.util.Optional;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import org.springframework.scripting.support.ResourceScriptSource;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.extern.slf4j.Slf4j;
+@Configuration
+@Slf4j
+public class RedisConfig {
+	@Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+        //使用FastJsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
+        FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<Object>(Object.class);
+        template.setValueSerializer(serializer);
+        template.setKeySerializer(serializer);
+        template.afterPropertiesSet();
+        return template;
+    }
+	@Bean
+    public DefaultRedisScript<Integer> getRedisScript() {
+			DefaultRedisScript<Integer> getRedisScript = new DefaultRedisScript<Integer>();
+	        getRedisScript.setResultType(Integer.class);
+	        getRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("config/test.lua")));
+	        return getRedisScript;
+    }
+	public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
+	    public final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+	    private Class<T> clazz;
+	 
+	    public FastJsonRedisSerializer(Class<T> clazz){
+	        super();
+	        this.clazz = clazz;
+	    }
+	 
+	    @Override
+	    public byte[] serialize(T t) throws SerializationException {
+	    	
+	        return Optional.ofNullable(t).map(r ->  {
+	        	log.debug("T:{}",t);
+	        	return JSON.toJSONString(r, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
+	        }).orElseGet(() -> new byte[0]);
+	    }
+	 
+	    @Override
+	    public T deserialize(byte[] bytes) throws SerializationException {
+	        return Optional.ofNullable(bytes)
+	                .map(t ->{ 
+	                	T result = JSON.parseObject(new String(t, DEFAULT_CHARSET), clazz);
+	                	log.debug("result:{}",result);
+	                	return result;
+	                })
+	                .orElseGet(() -> null);
+	    }
+	 
+	}
+}

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

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

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

@@ -0,0 +1,50 @@
+spring:
+  application:
+    name:  cloud-yysj-check-info
+  banner:
+    location: classpath:config/banner.txt
+  sleuth:
+    sampler:
+      probability: 0.1
+  zipkin:
+    base-url: http://127.0.0.1:${server.port}
+  output:
+    ansi:
+      enabled: DETECT
+  http:
+    encoding:
+      force: true
+      enabled: true
+      charset: UTF-8
+  main:
+    allow-bean-definition-overriding: true
+  cloud:
+    kubernetes:
+      reload:
+        enabled: true
+        mode: polling
+        period: 10000
+        strategy: refresh
+        monitoring-secrets: true
+      config:
+        enabled: true
+        enableApi: true
+        sources:
+          - namespace: cloud-yysj
+            name: ${spring.application.name}
+server:
+  port: 8080
+management:
+  server:
+    port: 8081
+  endpoint:
+    health:
+      show-details: ALWAYS
+  endpoints:
+    enabled-by-default: true
+    web:
+      exposure:
+        include: '*'
+info:
+  name: 云验平台一级网关
+  version: 1.0.1

+ 69 - 0
src/main/resources/config/cloud-yysj-check-info.yaml

@@ -0,0 +1,69 @@
+common:
+    connetTimeOut: 10000
+    readTimeOut: 10000
+    gateWayUrl: http://cloud-yysj-product-check.cloud-yysj:8080/detail/detail.do
+    otherGateWayUrl: http://cloud-yysj-product-check.cloud-yysj:8080/detail/otherDetail.do
+    appKey: 1111111
+    tokenSecret: 123
+    authenUrl: http://iov-sjjh-servicenode-authentication.iov-sjjh:8080/getToken.do
+    interceptorUrl: /detail/detail.do
+paramtransfer:
+     url: http://cloud-yysj-servicenode-paramtransfer.cloud-yysj:8080
+server:
+    servlet:
+      session:
+        cookie:
+          path: /
+    tomcat:
+      charset: UTF-8
+      uri-encoding: UTF-8
+      accesslog:
+        buffered: false
+        enabled: true
+        pattern: '{"DateTime":"%{yyyy-MM-dd''T''HH:mm:ss.SSSZZ}t","ClientIP":"%a","Method":"%m","URI":"%U","RequestProtocol":"%H","ResponseCode":%s
+                    ,"ResponseTime":%D,"UserAgent":"%{user-agent}i","X-Forwarded-For":"%{x-forwarded-for}r","X-User-IP":"%{X-User-IP}i","traceId":"%{x-b3-traceid}r","id":"%{x-b3-spanid}i",
+                    "parentId":"%{x-b3-parentspanid}i","ApplicationName":"cloud-yysj-check-info","RequestInfo":%{paramBody}r,"MG-ResultCode":"%{resultCode}r","MG-UserId":"%{LOGINK-USER-ID}i","MG-Consistent":"%{consistent}r","MG-QueryParam":%{queryParam}r,"Kafka_Topics":"yysj-gateway-first","ES_Index":"yysj-gateway-first-log","AC_LogType":"AccessLog","Check-Reuslt":%{CheckDetails}r
+                    }'
+        prefix: yysjaccess_${spring.cloud.client.hostname}_${spring.application.name}_${server.port}
+        directory: ${logging.path}
+        encoding: UTF-8
+logging:
+    path: /apps/var/jakarta/logs
+    level:
+      root: INFO
+      red:
+          microcloud: DEBUG
+    config: classpath:config/logback-spring.xml
+    file: ${logging.path}/catalina_${spring.cloud.client.hostname}_${spring.application.name}_${server.port}.out
+spring:
+    redis:
+      database: 0
+      host: iov-yysj-redis.cloud-yysj
+      port: 6379
+      jedis:
+        pool:
+          max-active: 8
+          max-wait: -1
+          max-idle: 8
+          min-idle: 0
+zuul:
+    ignoredServices: '*'
+    ignored-patterns: /**/inner/**
+    addHostHeader: true
+    routes:
+      routegateway:
+        path: /info_check/**
+        serviceId: cloud-yysj-check-info
+        sensitiveHeaders: user-agent,cookie
+    base64:
+      endecode: utf-8
+
+cloud-yysj-servicenode-paramtransfer:
+    ribbon:
+      ConnectTimeout: 250
+      ReadTimeout: 5000
+
+cloud-yysj-product-check:
+    ribbon:
+      ConnectTimeout: 250
+      ReadTimeout: 5000

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

@@ -0,0 +1,32 @@
+<?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="iov-sjjh-servicenode-channel" />
+
+	<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>10</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>