Index: pom.xml
===================================================================
--- pom.xml	(版本 28937)
+++ pom.xml	(版本 28938)
@@ -25,8 +25,11 @@
 		<artifactId>lombok</artifactId>
 		<scope>provided</scope>
 	</dependency>
-	
 	<dependency>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-jta-atomikos</artifactId>
+	</dependency>
+	<dependency>
 		<groupId>com.alibaba</groupId>
 		<artifactId>fastjson</artifactId>
 		<version>1.2.56</version>
@@ -53,6 +56,11 @@
 			<groupId>com.microsoft.sqlserver</groupId>
 			<artifactId>mssql-jdbc</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+		</dependency>
 		
 		<!-- MySql数据库驱动 -->
 		<dependency>
Index: .
===================================================================
--- .	(版本 28937)
+++ .	(版本 28938)

Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,4 ##
+*.idea
+*.iml
+target
+transaction-logs
Index: src/main/java/com/novaone/CcsehgPdfMain.java
===================================================================
--- src/main/java/com/novaone/CcsehgPdfMain.java	(版本 28937)
+++ src/main/java/com/novaone/CcsehgPdfMain.java	(版本 28938)
@@ -2,10 +2,13 @@
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @EnableScheduling
+@ServletComponentScan
 public class CcsehgPdfMain {
     public static void main(String[] args) throws Exception {
         SpringApplication.run(CcsehgPdfMain.class, args);
Index: src/main/java/com/novaone/common/BodyReaderHttpServletRequestWrapper.java
===================================================================
--- src/main/java/com/novaone/common/BodyReaderHttpServletRequestWrapper.java	(不存在的)
+++ src/main/java/com/novaone/common/BodyReaderHttpServletRequestWrapper.java	(版本 28938)
@@ -0,0 +1,93 @@
+package com.novaone.common;
+
+
+import com.novaone.util.IOUtil;
+import lombok.SneakyThrows;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+/*
+ * @program: api-security
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-07-02 22:20
+ */
+public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+    private final byte[] body;
+
+    private Map<String, String[]> paramsMap;
+
+    @SneakyThrows
+    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
+        super(request);
+        this.body = IOUtil.readByteArray(request.getInputStream());
+
+        if("POST".equals(request.getMethod().toUpperCase())){
+            this.paramsMap = getParamMapFromPost(this);
+        }else {
+            this.paramsMap = getParamMapFromGet(this);
+        }
+
+    }
+
+    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request,byte[] body) {
+        super(request);
+        this.body = body;
+        if("POST".equals(request.getMethod().toUpperCase())){
+            this.paramsMap = getParamMapFromPost(this);
+        }else {
+            this.paramsMap = getParamMapFromGet(this);
+        }
+    }
+
+    private Map<String, String[]> getParamMapFromGet(HttpServletRequest httpServletRequest) {
+        return null;
+    }
+
+    private Map<String, String[]> getParamMapFromPost(HttpServletRequest httpServletRequest) {
+        return null;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+        return new ServletInputStream() {
+
+            @Override
+            public int read() throws IOException {
+                return bais.read();
+            }
+
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener arg0) {
+
+            }
+        };
+    }
+
+
+}
Index: src/main/java/com/novaone/common/DruidDataSourceConfiguration.java
===================================================================
--- src/main/java/com/novaone/common/DruidDataSourceConfiguration.java	(版本 28937)
+++ src/main/java/com/novaone/common/DruidDataSourceConfiguration.java	(不存在的)
@@ -1,56 +0,0 @@
-package com.novaone.common;
-
-import javax.sql.DataSource;
-
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.mybatis.spring.SqlSessionTemplate;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-
-import com.alibaba.druid.pool.DruidDataSource;
-
-@Configuration
-@MapperScan(basePackages = { "com.novaone.dao" }, sqlSessionFactoryRef = "mysqlSqlSessionFactory")
-public class DruidDataSourceConfiguration {
-    @Bean("druidDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
-    @Primary
-    public DataSource druidDataSource() {
-        return new DruidDataSource();
-    }
-
-    @Bean(name = "mysqlSqlSessionFactory")
-    @Primary
-    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("druidDataSource") DataSource druidDataSource)
-            throws Exception {
-        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
-        sessionFactoryBean.setDataSource(druidDataSource);
-
-        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
-        sessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/com/novaone/dao/Mapper/*.xml"));
-        sessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
-
-        return sessionFactoryBean.getObject();
-    }
-
-    @Bean(name = "mysqlTransactionManager") // 配置事务
-    @Primary
-    public DataSourceTransactionManager mysqlTransactionManager(
-            @Qualifier("druidDataSource") DataSource druidDataSource) {
-        return new DataSourceTransactionManager(druidDataSource);
-    }
-
-    @Bean(name = "mysqlSqlSessionTemplate")
-    @Primary
-    public SqlSessionTemplate testSqlSessionTemplate(
-            @Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
-        return new SqlSessionTemplate(sqlSessionFactory);
-    }
-}
Index: src/main/java/com/novaone/common/DruidDataSourceConfigurationFruitease.java
===================================================================
--- src/main/java/com/novaone/common/DruidDataSourceConfigurationFruitease.java	(版本 28937)
+++ src/main/java/com/novaone/common/DruidDataSourceConfigurationFruitease.java	(不存在的)
@@ -1,51 +0,0 @@
-package com.novaone.common;
-
-import javax.sql.DataSource;
-
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.mybatis.spring.SqlSessionTemplate;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-
-import com.alibaba.druid.pool.DruidDataSource;
-
-@Configuration
-@MapperScan(basePackages = { "com.novaone.fdao" }, sqlSessionFactoryRef = "fruiteaseSqlSessionFactory")
-public class DruidDataSourceConfigurationFruitease {
-    @Bean("fruiteaseDataSource")
-    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
-    public DataSource fruiteaseDataSource() {
-        return new DruidDataSource();
-    }
-
-    @Bean(name = "fruiteaseSqlSessionFactory")
-    public SqlSessionFactory fruiteaseSqlSessionFactory(
-            @Qualifier("fruiteaseDataSource") DataSource fruiteaseDataSource) throws Exception {
-        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
-        sessionFactoryBean.setDataSource(fruiteaseDataSource);
-
-        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
-        sessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/com/novaone/fdao/Mapper/*.xml"));
-        sessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
-
-        return sessionFactoryBean.getObject();
-    }
-
-    @Bean(name = "fruiteaseTransactionManager") // 配置事务
-    public DataSourceTransactionManager fruiteaseTransactionManager(
-            @Qualifier("fruiteaseDataSource") DataSource fruiteaseDataSource) {
-        return new DataSourceTransactionManager(fruiteaseDataSource);
-    }
-
-    @Bean(name = "fruiteaseSqlSessionTemplate")
-    public SqlSessionTemplate fruiteaseSqlSessionTemplate(
-            @Qualifier("fruiteaseSqlSessionFactory") SqlSessionFactory fruiteaseSqlSessionFactory) {
-        return new SqlSessionTemplate(fruiteaseSqlSessionFactory);
-    }
-}
Index: src/main/java/com/novaone/common/R.java
===================================================================
--- src/main/java/com/novaone/common/R.java	(不存在的)
+++ src/main/java/com/novaone/common/R.java	(版本 28938)
@@ -0,0 +1,62 @@
+package com.novaone.common;
+
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/*
+ * @program:
+ * @description: 异步请求结果集
+ * @author: Ma.ChengJian
+ * @create: 2021-07-05 15:35
+ */
+@Getter
+@Setter
+@ToString
+public class R<T> {
+
+    private Integer code;
+    private String mes;
+    private T data;
+    private boolean flag;
+
+    public R(){}
+
+    public R(Integer code, String mes, T data,boolean flag){
+        this.code = code;
+        this.mes = mes;
+        this.data = data;
+        this.flag = flag;
+    }
+
+    public static R success(){
+        return new R(200,"接口调用成功",null,true);
+    }
+
+    public static R success(String mes){
+        return new R(200,mes,null,true);
+    }
+
+    public static<T> R success(String mes,T data){
+        return new R(200,mes,data,true);
+    }
+
+    public static<T> R success(Integer code,String mes,T data){
+        return new R(code,mes,null,true);
+    }
+
+    public static<T> R error(){
+        return new R(500,"接口调用失败",null,false);
+    }
+
+    public static<T> R error(String mes){
+        return new R(500,mes,null,false);
+    }
+
+    public static<T> R error(Integer code,String mes){
+        return new R(code,mes,null,false);
+    }
+
+
+}
Index: src/main/java/com/novaone/common/SmsFilter.java
===================================================================
--- src/main/java/com/novaone/common/SmsFilter.java	(不存在的)
+++ src/main/java/com/novaone/common/SmsFilter.java	(版本 28938)
@@ -0,0 +1,114 @@
+package com.novaone.common;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.novaone.util.JwtUtil;
+import io.jsonwebtoken.Claims;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.http.HttpStatus;
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-25 14:26
+ */
+@Slf4j
+@WebFilter(urlPatterns="/api/sms/*")
+public class SmsFilter  implements Filter {
+
+    private static final long expiredMillis = 3000;
+    private static final ConcurrentHashMap<String,Long> expiredMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        if (!(servletRequest instanceof HttpServletRequest)) return;
+        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+        if (httpServletRequest.getContentType() == null || !httpServletRequest.getContentType().contains("application/json"))return;
+
+        byte[] body = null;
+        if (notRepeated(httpServletRequest,servletResponse)&&(body = check(httpServletRequest,servletResponse))!=null) {
+            BodyReaderHttpServletRequestWrapper request = new BodyReaderHttpServletRequestWrapper(httpServletRequest,body);
+            filterChain.doFilter(new BodyReaderHttpServletRequestWrapper(request),servletResponse);
+        }else {
+            response(servletResponse,"拒绝请求");
+        }
+        for (Map.Entry<String, Long> entry : expiredMap.entrySet()) {
+            if (entry.getValue()<= System.currentTimeMillis()) {
+                expiredMap.remove(entry.getKey());
+                log.info("删除id：{} ,时间：{}", entry.getKey(),System.currentTimeMillis());
+            }
+        }
+    }
+
+    //响应请求
+    private void response(ServletResponse servletResponse,String message) {
+        if (!(servletResponse instanceof HttpServletResponse))return;
+        HttpServletResponse response = (HttpServletResponse)servletResponse;
+        response.setStatus(HttpStatus.FORBIDDEN.value());
+        String body = JSON.toJSONString(R.error(HttpStatus.FORBIDDEN.value(),message));
+        if (StringUtils.isEmpty(body)) return;
+        try {
+            ServletOutputStream outputStream = response.getOutputStream();
+            outputStream.write(body.getBytes(StandardCharsets.UTF_8));
+            outputStream.flush();
+            outputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    //校验请求参数
+    private byte[] check(HttpServletRequest request,ServletResponse servletResponse) throws IOException {
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
+        String line = null;
+        StringBuilder sb = new StringBuilder();
+        while ((line = bufferedReader.readLine()) != null) {
+            sb.append(line + "\n");
+        }
+        bufferedReader.close();
+        JSONObject requestBody = JSON.parseObject(sb.toString());
+        String jwt = StringUtils.isEmpty(requestBody.getString("smsInfo"))?"":requestBody.getString("smsInfo");
+        try {
+            Claims claims = JwtUtil.checkJWT(jwt);
+            Object smsInfo = claims.get("smsInfo");
+            String smsJson = JSON.toJSONString(smsInfo);
+            return smsJson.getBytes(StandardCharsets.UTF_8);
+
+        } catch (Exception e) {
+            log.error("客户端请求校验失败,id："+request.getHeader("id"));
+            e.printStackTrace();
+        }
+        response(servletResponse,"请求数据校验失败");
+        return null;
+    }
+
+    private boolean notRepeated(HttpServletRequest request,ServletResponse servletResponse){
+        String id = request.getHeader("id");
+        if (StringUtils.isEmpty(id)) {
+            response(servletResponse,"缺少请求参数");
+            return false;
+        }
+        Long expired;
+        long l = System.currentTimeMillis() + expiredMillis;
+        if ((expired = expiredMap.put(id,l)) != null) {
+            log.info("更新id：{},时间：{}",id,l);
+            boolean flag = expired < System.currentTimeMillis();
+            if (!flag)response(servletResponse,"操作频繁");
+            return flag;
+        }
+        log.info("添加id：{},时间：{}",id,l);
+        return true;
+    }
+}
Index: src/main/java/com/novaone/common/filter/SessionFilter.java
===================================================================
--- src/main/java/com/novaone/common/filter/SessionFilter.java	(版本 28937)
+++ src/main/java/com/novaone/common/filter/SessionFilter.java	(不存在的)
@@ -1,118 +0,0 @@
-package com.novaone.common.filter;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.annotation.WebFilter;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.entity.JsonModel;
-import com.novaone.util.CommonEnum;
-import com.novaone.util.JwtUtil;
-
-import io.jsonwebtoken.Claims;
-
-@WebFilter(filterName = "SessionFilter", urlPatterns = { "/api/*" })
-public class SessionFilter implements Filter {
-
-    public static final String PARAM_NAME_EXCLUSIONS = "exclusions";
-
-    // 不需要登录就可以访问的路径(比如:登录等)
-    private Set<String> excludesPattern;
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        // 这里是注册类中添加的白名单，转为Set集合
-        String param = filterConfig.getInitParameter(PARAM_NAME_EXCLUSIONS);
-        if (param != null && param.trim().length() != 0) {
-            this.excludesPattern = new HashSet(Arrays.asList(param.split("\\s*,\\s*")));
-        }
-
-    }
-
-    @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
-            throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        HttpServletResponse response = (HttpServletResponse) servletResponse;
-        String uri = request.getRequestURI();
-        // 下面这行代码是业务需求，获取请求参数
-        // 判断是否需要过滤，白名单中的路径不需要过滤，可以自由发挥
-        boolean needFilter = isNeedFilter(uri);
-
-        if (!needFilter) { // 不需要过滤直接传给下一个过滤器
-            filterChain.doFilter(servletRequest, servletResponse);
-        } else { // 需要过滤器
-            String token = request.getHeader("Authorization");
-            if (StringUtils.isEmpty(token)) {
-                JsonModel model = new JsonModel();
-                model.setCode(CommonEnum.TOKEN_INVALID.getCode());
-                model.setDes(CommonEnum.TOKEN_INVALID.getRes());
-                response.setCharacterEncoding("UTF-8");
-                response.getWriter().write(JSONObject.toJSONString(model));
-                return;
-            }
-            Claims claims = JwtUtil.checkJWT(token);
-            if (claims != null) {
-                String username = (String) claims.get("username");
-                String client = (String) claims.get("client");
-                request.setAttribute("username", username);
-                request.setAttribute("client", client);
-                filterChain.doFilter(request, response);
-            } else {
-                JsonModel model = new JsonModel();
-                model.setCode(CommonEnum.TOKEN_INVALID.getCode());
-                model.setDes(CommonEnum.TOKEN_INVALID.getRes());
-                response.setCharacterEncoding("UTF-8");
-                response.getWriter().write(JSONObject.toJSONString(model));
-                return;
-            }
-        }
-    }
-
-    /**
-     * 是否需要过滤
-     * @param uri
-     * @return
-     */
-    public boolean isNeedFilter(String uri) {
-
-        for (String includeUrl : excludesPattern) {
-
-            if (includeUrl.contains("*")) {
-                if (uri.startsWith(includeUrl.substring(0, includeUrl.length() - 1))) {
-
-                    return false;
-                }
-
-            } else {
-
-                if (includeUrl.equals(uri)) {
-                    return false;
-                }
-
-            }
-
-        }
-
-        return true;
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-}
Index: src/main/java/com/novaone/common/filter/XSSFilter.java
===================================================================
--- src/main/java/com/novaone/common/filter/XSSFilter.java	(版本 28937)
+++ src/main/java/com/novaone/common/filter/XSSFilter.java	(版本 28938)
@@ -23,7 +23,7 @@
   
     @Override  
     public void doFilter(ServletRequest request, ServletResponse response,  
-            FilterChain chain) throws IOException, ServletException {  
+            FilterChain chain) throws IOException, ServletException {
         NewXssHttpServletRequestWrapper xssRequest = new NewXssHttpServletRequestWrapper((HttpServletRequest) request);  
         chain.doFilter(xssRequest, response);  
     }  
Index: src/main/java/com/novaone/config/MySqlDataSourceConfig.java
===================================================================
--- src/main/java/com/novaone/config/MySqlDataSourceConfig.java	(不存在的)
+++ src/main/java/com/novaone/config/MySqlDataSourceConfig.java	(版本 28938)
@@ -0,0 +1,62 @@
+package com.novaone.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.atomikos.jdbc.AtomikosDataSourceBean;
+//import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
+import com.mysql.cj.jdbc.MysqlXADataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+
+
+/*
+ * @program: DataInsertTest
+ * @description: 基于XA协议实现分布式事务控制的数据源配置
+ * @author: Ma.ChengJian
+ * @create: 2021-10-25 21:33
+ */
+@Configuration
+@MapperScan(basePackages = {"com.novaone.dao"},sqlSessionFactoryRef = "mySql_sqlSessionFactory", sqlSessionTemplateRef = "mySql_sqlSessionTemplate")
+public class MySqlDataSourceConfig {
+    @Primary
+    @Bean("mySql_dataSource")
+    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
+    public DataSource getDataSource() throws SQLException {
+        return new DruidDataSource();
+    }
+
+    @Primary
+    @Bean(name = "mySql_sqlSessionFactory")
+    public SqlSessionFactory sqlSessionFactory(@Qualifier("mySql_dataSource") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
+        sessionFactoryBean.setDataSource(dataSource);
+        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mySqlMapper/*Mapper.xml"));
+        sessionFactoryBean.setTypeAliasesPackage("com.novaone.entity");
+        sessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
+        return sessionFactoryBean.getObject();
+    }
+
+    @Bean(name = "mysql_transactionManager")
+    @Primary
+    public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mySql_dataSource") DataSource druidDataSource) {
+        return new DataSourceTransactionManager(druidDataSource);
+    }
+
+    @Primary
+    @Bean(name = "mySql_sqlSessionTemplate")
+    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("mySql_sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
+        return new SqlSessionTemplate(sqlSessionFactory);
+    }
+
+}
\ No newline at end of file
Index: src/main/java/com/novaone/config/SqlServerDatasourceConfig.java
===================================================================
--- src/main/java/com/novaone/config/SqlServerDatasourceConfig.java	(不存在的)
+++ src/main/java/com/novaone/config/SqlServerDatasourceConfig.java	(版本 28938)
@@ -0,0 +1,58 @@
+package com.novaone.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.microsoft.sqlserver.jdbc.SQLServerXADataSource;
+import com.mysql.cj.jdbc.MysqlXADataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 水果通数据源配置
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 14:03
+ */
+@Configuration
+@MapperScan(basePackages = { "com.novaone.fdao" }, sqlSessionFactoryRef = "sqlServer_sqlSessionFactory", sqlSessionTemplateRef = "sqlServer_sqlSessionTemplate")
+public class SqlServerDatasourceConfig {
+
+    @Bean("sqlServer_dataSource")
+    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
+    public DataSource getDataSource() throws SQLException {
+        return new DruidDataSource();
+    }
+
+    @Bean(name="sqlServer_sqlSessionFactory")
+    public SqlSessionFactory sqlSessionFactorySecondary(@Qualifier("sqlServer_dataSource") DataSource dataSource) throws Exception{
+        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
+        sqlSessionFactoryBean.setDataSource(dataSource);
+        sqlSessionFactoryBean.setTypeAliasesPackage("com.novaone.entity");
+        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/sqlServerMapper/*.xml"));
+        sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
+        return sqlSessionFactoryBean.getObject();
+    }
+
+    @Bean(name = "sqlServer_transactionManager") // 配置事务
+    public DataSourceTransactionManager fruiteaseTransactionManager(@Qualifier("sqlServer_dataSource") DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+    @Bean(name = "sqlServer_sqlSessionTemplate")
+    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlServer_sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
+        return new SqlSessionTemplate(sqlSessionFactory);
+    }
+}
Index: src/main/java/com/novaone/control/Cron.java
===================================================================
--- src/main/java/com/novaone/control/Cron.java	(版本 28937)
+++ src/main/java/com/novaone/control/Cron.java	(不存在的)
@@ -1,85 +0,0 @@
-package com.novaone.control;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.service.ApplyBgdhService;
-import com.novaone.service.GrabPfdService;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Component
-@Slf4j
-public class Cron {
-
-    static {
-        System.setProperty("webdriver.chrome.driver", CommonInfo.CHROME_URL);
-    }
-
-    @Resource
-    private GrabPfdService grabPfdService;
-
-    @Resource
-    private ApplyBgdhService applyBgdhService;
-
-    /**
-     * 
-     * grabPdf(爬取前一天所有检疫证)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月14日 下午3:43:54
-     */
-    // 每天跑一次
-    // @Scheduled(cron = "0 08 18 * * ?")
-    public void grabPdf() {
-        log.info("begin------grabPdf--------" + LocalDateTime.now());
-        grabPfdService.grabPdf("");
-        log.info("end------grabPdf--------" + LocalDateTime.now());
-    }
-
-    /**
-     * 
-     * grabPdfSingle(单个检疫证查询并爬取)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月14日 下午3:44:18
-     */
-    // 每天跑一次
-    // @Scheduled(cron = "0 30 18 * * ?")
-    public void grabPdfSingle() {
-        log.info("begin------grabPdfSingle--------" + LocalDateTime.now());
-        // v2 整合申报的根据海关放行时间;两步申报的根据两次完整报关时间 在当前时间前后60天的进行抓取
-        List<Hddz> list = grabPfdService.queryAllNeedPdfBjh();
-        if (!CommonUtils.isEmpty(list)) {
-            grabPfdService.grabPdfSingle(list);
-        }
-        log.info("end------grabPdfSingle--------" + LocalDateTime.now());
-    }
-
-    // 每天 0点 12点各跑一次
-    @Scheduled(cron = "0 0 0,12 * * ?")
-    // @Scheduled(cron = "0 21 15 * * ?")
-    public void applyBgdh() {
-        log.info("begin------applyBgdh--------" + LocalDateTime.now());
-        List<Hddz> list = applyBgdhService.queryAllNeedBgdhApply();
-        if (!CommonUtils.isEmpty(list)) {
-            applyBgdhService.applyBgdh(list);
-        }
-        log.info("end------applyBgdh--------" + LocalDateTime.now());
-    }
-
-}
Index: src/main/java/com/novaone/control/EasipassHeartbeatCron.java
===================================================================
--- src/main/java/com/novaone/control/EasipassHeartbeatCron.java	(版本 28937)
+++ src/main/java/com/novaone/control/EasipassHeartbeatCron.java	(不存在的)
@@ -1,40 +0,0 @@
-package com.novaone.control;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import com.novaone.util.HttpUtil;
-
-
-/**
- * 
- * 项目名称：easipass    
- * 类名称：EasipassHeartbeatCron    
- * 类描述：放行抓取定时心跳任务     
- * 创建人：zhangjl    
- * 创建时间：2019年5月14日 上午9:23:45    
- * 修改人：zhangjl    
- * 修改时间：2019年5月14日 上午9:23:45    
- * 修改备注：    
- * @version     
- *
- */
-@Component
-public class EasipassHeartbeatCron {
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-    
-    private static final String WECHAT_REFRESHTIME_URL = "http://www.fruitease.com:8009/IFView/PortHandler.ashx?action=wechatRefreshTime&modulecode=ccsehgpdf&token=1";
-
-    // 每10分钟检查一次
-    @Scheduled(cron = "0 */10 * * * ?")
-    public void core() {
-        try {
-            String result = HttpUtil.get(WECHAT_REFRESHTIME_URL);
-            log.info("EasipassHeartbeatCron sendResult: " + result);
-        } catch (Exception e) {
-            log.error("EasipassHeartbeatCron ERROR:" + e.getMessage(), e);
-        }
-    }
-}
Index: src/main/java/com/novaone/control/NewGrabPdf.java
===================================================================
--- src/main/java/com/novaone/control/NewGrabPdf.java	(版本 28937)
+++ src/main/java/com/novaone/control/NewGrabPdf.java	(不存在的)
@@ -1,74 +0,0 @@
-package com.novaone.control;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.service.GrabPfdService;
-import com.novaone.service.NewGrabPfdService;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Component
-public class NewGrabPdf {
-
-    static {
-        System.setProperty("webdriver.chrome.driver", CommonInfo.CHROME_URL);
-    }
-
-    @Resource
-    private GrabPfdService grabPfdService;
-
-    @Resource
-    private NewGrabPfdService newGrabPfdService;
-
-    /**
-     * 
-     * grabPdf(检疫证当天抓取)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午1:58:40
-     */
-    @Scheduled(cron = "0 08 18 * * ?")
-    public void grabPdf() {
-        // 批量 ftp地址：116.62.192.143 因为两步申报的存在无报检号现象，批量的走ocr识别，ocr再反写报检号。
-        log.info("begin------grabPdf--------" + LocalDateTime.now());
-        newGrabPfdService.grabPdf("");
-        log.info("end------grabPdf--------" + LocalDateTime.now());
-    }
-
-    /**
-     * 
-     * grabPdfSingle(单票检疫证补录)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午1:58:26
-     */
-    @Scheduled(cron = "0 30 18 * * ?")
- //  @Scheduled(cron = "30 29 15 * * ?")
-    public void grabPdfSingle() {
-        // 单票 ftp地址：47.97.182.194
-        log.info("begin------grabPdfSingle--------" + LocalDateTime.now());
-        // v2 整合申报的根据海关放行时间;两步申报的根据两次完整报关时间 在当前时间前后60天的进行抓取
-        List<Hddz> list = grabPfdService.queryAllNeedPdfBjh();
-        if (!CommonUtils.isEmpty(list)) {
-            newGrabPfdService.grabPdfSingle(list);
-        }
-        log.info("end------grabPdfSingle--------" + LocalDateTime.now());
-    }
-
-}
Index: src/main/java/com/novaone/control/grabApiControl.java
===================================================================
--- src/main/java/com/novaone/control/grabApiControl.java	(版本 28937)
+++ src/main/java/com/novaone/control/grabApiControl.java	(不存在的)
@@ -1,52 +0,0 @@
-package com.novaone.control;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-import javax.annotation.Resource;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.service.GrabPfdService;
-import com.novaone.service.NewGrabPfdService;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@RestController
-@Slf4j
-public class grabApiControl {
-    static {
-        System.setProperty("webdriver.chrome.driver", CommonInfo.CHROME_URL);
-    }
-
-    @Resource
-    private GrabPfdService grabPfdService;
-
-    @Resource
-    private NewGrabPfdService newGrabPfdService;
-
-    @GetMapping("/api/grabApi/{startDate}")
-    public void grabApi(@PathVariable("startDate") String startDate) {
-        log.info("queryParam " + startDate + "  begin--------------" + LocalDateTime.now());
-        newGrabPfdService.grabPdf(startDate);
-        log.info("queryParam " + startDate + "  end--------------" + LocalDateTime.now());
-    }
-
-    @GetMapping("/api/grabApiDatail/one")
-    public void grabApiDatailOne() {
-        log.info("grabApiDatail grabApiDatailOne  begin--------------" + LocalDateTime.now());
-        List<Hddz> list = grabPfdService.queryAllNeedPdfBjh();
-        if (!CommonUtils.isEmpty(list)) {
-            log.info("grabApiDatailOne list:" + list.size());
-            newGrabPfdService.grabPdfSingle(list);
-
-        }
-        log.info("grabApiDatail grabApiDatailOne  end--------------" + LocalDateTime.now());
-    }
-
-}
Index: src/main/java/com/novaone/controller/SmsController.java
===================================================================
--- src/main/java/com/novaone/controller/SmsController.java	(不存在的)
+++ src/main/java/com/novaone/controller/SmsController.java	(版本 28938)
@@ -0,0 +1,50 @@
+package com.novaone.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.novaone.common.R;
+import com.novaone.entity.SmsInfo;
+import com.novaone.service.QueryCodeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 短信查询码、证书编号控制器
+ * @author: Ma.ChengJian
+ * @create: 2021-10-22 17:51
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/sms")
+public class SmsController {
+
+    @Autowired
+    private QueryCodeService queryCodeService;
+
+    @PostMapping("/add")
+   public R add(@RequestBody SmsInfo smsInfo, HttpServletRequest request){
+        try {
+            queryCodeService.saveQueryCode(smsInfo);
+            return R.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+        return R.error(e.getMessage());
+        }
+    }
+
+    @PostMapping("/putList")
+    public R add(@RequestBody Set<SmsInfo> smsSet){
+        if (smsSet == null || smsSet.size() == 0)
+            return R.error("请求数据为空");
+        try {
+            queryCodeService.saveList(smsSet);
+            return R.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+    }
+}
Index: src/main/java/com/novaone/controller
===================================================================
--- src/main/java/com/novaone/controller	(不存在的)
+++ src/main/java/com/novaone/controller	(版本 28938)

Property changes on: src/main/java/com/novaone/controller
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+TestController.java
Index: src/main/java/com/novaone/dao/ApplybgdhInfoMapper.java
===================================================================
--- src/main/java/com/novaone/dao/ApplybgdhInfoMapper.java	(版本 28937)
+++ src/main/java/com/novaone/dao/ApplybgdhInfoMapper.java	(不存在的)
@@ -1,17 +0,0 @@
-package com.novaone.dao;
-
-import com.novaone.entity.ApplybgdhInfo;
-
-public interface ApplybgdhInfoMapper {
-    int deleteByPrimaryKey(String id);
-
-    int insert(ApplybgdhInfo record);
-
-    int insertSelective(ApplybgdhInfo record);
-
-    ApplybgdhInfo selectByPrimaryKey(String id);
-
-    int updateByPrimaryKeySelective(ApplybgdhInfo record);
-
-    int updateByPrimaryKey(ApplybgdhInfo record);
-}
\ No newline at end of file
Index: src/main/java/com/novaone/dao/CertificateDownloadInfoDao.java
===================================================================
--- src/main/java/com/novaone/dao/CertificateDownloadInfoDao.java	(不存在的)
+++ src/main/java/com/novaone/dao/CertificateDownloadInfoDao.java	(版本 28938)
@@ -0,0 +1,41 @@
+package com.novaone.dao;
+
+import com.novaone.entity.CertificateDownloadInfo;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 表certificate_download_info读写操作
+ * @author: Ma.ChengJian
+ * @create: 2021-10-27 14:56
+ */
+@Repository
+public interface CertificateDownloadInfoDao {
+
+    /**
+     * MySQL中添加一条查询码短信记录
+     */
+    Integer add(CertificateDownloadInfo certificateDownloadInfo);
+
+    /**
+     * 根据业务状态查询
+     */
+    @Transactional(readOnly = true)
+    List<CertificateDownloadInfo> findByBusinesState(Integer state);
+
+    /**
+     * 查询指定时间之后接收的短信
+     * @param receiveTime 查询时间之后的短信
+     */
+    List<CertificateDownloadInfo> findReceiveTimeLater(String receiveTime);
+
+
+    /**
+     * 根据ID更新
+     */
+    Integer updateById(CertificateDownloadInfo c);
+}
Index: src/main/java/com/novaone/dao/CertificateRetryJobDao.java
===================================================================
--- src/main/java/com/novaone/dao/CertificateRetryJobDao.java	(不存在的)
+++ src/main/java/com/novaone/dao/CertificateRetryJobDao.java	(版本 28938)
@@ -0,0 +1,24 @@
+package com.novaone.dao;
+
+import com.novaone.entity.CertificateRetryJob;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 合同重试任务读写操作
+ * @author: Ma.ChengJian
+ * @create: 2021-10-27 17:01
+ */
+@Repository
+public interface CertificateRetryJobDao {
+    Integer add(CertificateRetryJob job);
+
+    Integer deleteById(CertificateRetryJob job);
+
+    List<CertificateRetryJob> findRetryJob();
+
+    Integer updateById(CertificateRetryJob job);
+
+}
Index: src/main/java/com/novaone/dao/DownCountMapper.java
===================================================================
--- src/main/java/com/novaone/dao/DownCountMapper.java	(版本 28937)
+++ src/main/java/com/novaone/dao/DownCountMapper.java	(不存在的)
@@ -1,20 +0,0 @@
-package com.novaone.dao;
-
-import org.apache.ibatis.annotations.Mapper;
-
-import com.novaone.entity.DownCount;
-
-@Mapper
-public interface DownCountMapper {
-    int deleteByPrimaryKey(String id);
-
-    int insert(DownCount record);
-
-    int insertSelective(DownCount record);
-
-    DownCount selectByPrimaryKey(String id);
-
-    int updateByPrimaryKeySelective(DownCount record);
-
-    int updateByPrimaryKey(DownCount record);
-}
\ No newline at end of file
Index: src/main/java/com/novaone/dao/DownInfoMapper.java
===================================================================
--- src/main/java/com/novaone/dao/DownInfoMapper.java	(版本 28937)
+++ src/main/java/com/novaone/dao/DownInfoMapper.java	(不存在的)
@@ -1,20 +0,0 @@
-package com.novaone.dao;
-
-import org.apache.ibatis.annotations.Mapper;
-
-import com.novaone.entity.DownInfo;
-
-@Mapper
-public interface DownInfoMapper {
-    int deleteByPrimaryKey(String id);
-
-    int insert(DownInfo record);
-
-    int insertSelective(DownInfo record);
-
-    DownInfo selectByPrimaryKey(String id);
-
-    int updateByPrimaryKeySelective(DownInfo record);
-
-    int updateByPrimaryKey(DownInfo record);
-}
\ No newline at end of file
Index: src/main/java/com/novaone/dao/Mapper/ApplybgdhInfoMapper.xml
===================================================================
--- src/main/java/com/novaone/dao/Mapper/ApplybgdhInfoMapper.xml	(版本 28937)
+++ src/main/java/com/novaone/dao/Mapper/ApplybgdhInfoMapper.xml	(不存在的)
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.novaone.dao.ApplybgdhInfoMapper" >
-  <resultMap id="BaseResultMap" type="com.novaone.entity.ApplybgdhInfo" >
-    <id column="id" property="id" jdbcType="VARCHAR" />
-    <result column="bgdh" property="bgdh" jdbcType="VARCHAR" />
-    <result column="crt_time" property="crtTime" jdbcType="TIMESTAMP" />
-    <result column="apply_status" property="applyStatus" jdbcType="CHAR" />
-    <result column="type" property="type" jdbcType="CHAR" />
-  </resultMap>
-  <sql id="Base_Column_List" >
-    id, bgdh, crt_time, apply_status, type
-  </sql>
-  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
-    select 
-    <include refid="Base_Column_List" />
-    from ccsehgpdf_applybgdh_info
-    where id = #{id,jdbcType=VARCHAR}
-  </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
-    delete from ccsehgpdf_applybgdh_info
-    where id = #{id,jdbcType=VARCHAR}
-  </delete>
-  <insert id="insert" parameterType="com.novaone.entity.ApplybgdhInfo" >
-    insert into ccsehgpdf_applybgdh_info (id, bgdh, crt_time, 
-      apply_status, type)
-    values (#{id,jdbcType=VARCHAR}, #{bgdh,jdbcType=VARCHAR}, #{crtTime,jdbcType=TIMESTAMP}, 
-      #{applyStatus,jdbcType=CHAR}, #{type,jdbcType=CHAR})
-  </insert>
-  <insert id="insertSelective" parameterType="com.novaone.entity.ApplybgdhInfo" >
-    insert into ccsehgpdf_applybgdh_info
-    <trim prefix="(" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        id,
-      </if>
-      <if test="bgdh != null" >
-        bgdh,
-      </if>
-      <if test="crtTime != null" >
-        crt_time,
-      </if>
-      <if test="applyStatus != null" >
-        apply_status,
-      </if>
-      <if test="type != null" >
-        type,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        #{id,jdbcType=VARCHAR},
-      </if>
-      <if test="bgdh != null" >
-        #{bgdh,jdbcType=VARCHAR},
-      </if>
-      <if test="crtTime != null" >
-        #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="applyStatus != null" >
-        #{applyStatus,jdbcType=CHAR},
-      </if>
-      <if test="type != null" >
-        #{type,jdbcType=CHAR},
-      </if>
-    </trim>
-  </insert>
-  <update id="updateByPrimaryKeySelective" parameterType="com.novaone.entity.ApplybgdhInfo" >
-    update ccsehgpdf_applybgdh_info
-    <set >
-      <if test="bgdh != null" >
-        bgdh = #{bgdh,jdbcType=VARCHAR},
-      </if>
-      <if test="crtTime != null" >
-        crt_time = #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="applyStatus != null" >
-        apply_status = #{applyStatus,jdbcType=CHAR},
-      </if>
-      <if test="type != null" >
-        type = #{type,jdbcType=CHAR},
-      </if>
-    </set>
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-  <update id="updateByPrimaryKey" parameterType="com.novaone.entity.ApplybgdhInfo" >
-    update ccsehgpdf_applybgdh_info
-    set bgdh = #{bgdh,jdbcType=VARCHAR},
-      crt_time = #{crtTime,jdbcType=TIMESTAMP},
-      apply_status = #{applyStatus,jdbcType=CHAR},
-      type = #{type,jdbcType=CHAR}
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-</mapper>
\ No newline at end of file
Index: src/main/java/com/novaone/dao/Mapper/DownCountMapper.xml
===================================================================
--- src/main/java/com/novaone/dao/Mapper/DownCountMapper.xml	(版本 28937)
+++ src/main/java/com/novaone/dao/Mapper/DownCountMapper.xml	(不存在的)
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.novaone.dao.DownCountMapper" >
-  <resultMap id="BaseResultMap" type="com.novaone.entity.DownCount" >
-    <id column="id" property="id" jdbcType="VARCHAR" />
-    <result column="grab_count" property="grabCount" jdbcType="INTEGER" />
-    <result column="grab_date" property="grabDate" jdbcType="DATE" />
-    <result column="crt_time" property="crtTime" jdbcType="TIMESTAMP" />
-  </resultMap>
-  <sql id="Base_Column_List" >
-    id, grab_count, grab_date, crt_time
-  </sql>
-  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
-    select 
-    <include refid="Base_Column_List" />
-    from ccsehgpdf_down_count
-    where id = #{id,jdbcType=VARCHAR}
-  </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
-    delete from ccsehgpdf_down_count
-    where id = #{id,jdbcType=VARCHAR}
-  </delete>
-  <insert id="insert" parameterType="com.novaone.entity.DownCount" >
-    insert into ccsehgpdf_down_count (id, grab_count, grab_date, 
-      crt_time)
-    values (#{id,jdbcType=VARCHAR}, #{grabCount,jdbcType=INTEGER}, #{grabDate,jdbcType=DATE}, 
-      #{crtTime,jdbcType=TIMESTAMP})
-  </insert>
-  <insert id="insertSelective" parameterType="com.novaone.entity.DownCount" >
-    insert into ccsehgpdf_down_count
-    <trim prefix="(" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        id,
-      </if>
-      <if test="grabCount != null" >
-        grab_count,
-      </if>
-      <if test="grabDate != null" >
-        grab_date,
-      </if>
-      <if test="crtTime != null" >
-        crt_time,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        #{id,jdbcType=VARCHAR},
-      </if>
-      <if test="grabCount != null" >
-        #{grabCount,jdbcType=INTEGER},
-      </if>
-      <if test="grabDate != null" >
-        #{grabDate,jdbcType=DATE},
-      </if>
-      <if test="crtTime != null" >
-        #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-    </trim>
-  </insert>
-  <update id="updateByPrimaryKeySelective" parameterType="com.novaone.entity.DownCount" >
-    update ccsehgpdf_down_count
-    <set >
-      <if test="grabCount != null" >
-        grab_count = #{grabCount,jdbcType=INTEGER},
-      </if>
-      <if test="grabDate != null" >
-        grab_date = #{grabDate,jdbcType=DATE},
-      </if>
-      <if test="crtTime != null" >
-        crt_time = #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-    </set>
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-  <update id="updateByPrimaryKey" parameterType="com.novaone.entity.DownCount" >
-    update ccsehgpdf_down_count
-    set grab_count = #{grabCount,jdbcType=INTEGER},
-      grab_date = #{grabDate,jdbcType=DATE},
-      crt_time = #{crtTime,jdbcType=TIMESTAMP}
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-</mapper>
\ No newline at end of file
Index: src/main/java/com/novaone/dao/Mapper/DownInfoMapper.xml
===================================================================
--- src/main/java/com/novaone/dao/Mapper/DownInfoMapper.xml	(版本 28937)
+++ src/main/java/com/novaone/dao/Mapper/DownInfoMapper.xml	(不存在的)
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.novaone.dao.DownInfoMapper" >
-  <resultMap id="BaseResultMap" type="com.novaone.entity.DownInfo" >
-    <id column="id" property="id" jdbcType="VARCHAR" />
-    <result column="cer_num" property="cerNum" jdbcType="VARCHAR" />
-    <result column="grab_date" property="grabDate" jdbcType="DATE" />
-    <result column="crt_time" property="crtTime" jdbcType="TIMESTAMP" />
-    <result column="grab_status" property="grabStatus" jdbcType="CHAR" />
-    <result column="cer_status" property="cerStatus" jdbcType="VARCHAR" />
-    <result column="msg" property="msg" jdbcType="VARCHAR" />
-  </resultMap>
-  <sql id="Base_Column_List" >
-    id, cer_num, grab_date, crt_time, grab_status, cer_status, msg
-  </sql>
-  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
-    select 
-    <include refid="Base_Column_List" />
-    from ccsehgpdf_down_info
-    where id = #{id,jdbcType=VARCHAR}
-  </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
-    delete from ccsehgpdf_down_info
-    where id = #{id,jdbcType=VARCHAR}
-  </delete>
-  <insert id="insert" parameterType="com.novaone.entity.DownInfo" >
-    insert into ccsehgpdf_down_info (id, cer_num, grab_date, 
-      crt_time, grab_status, cer_status, 
-      msg)
-    values (#{id,jdbcType=VARCHAR}, #{cerNum,jdbcType=VARCHAR}, #{grabDate,jdbcType=DATE}, 
-      #{crtTime,jdbcType=TIMESTAMP}, #{grabStatus,jdbcType=CHAR}, #{cerStatus,jdbcType=VARCHAR}, 
-      #{msg,jdbcType=VARCHAR})
-  </insert>
-  <insert id="insertSelective" parameterType="com.novaone.entity.DownInfo" >
-    insert into ccsehgpdf_down_info
-    <trim prefix="(" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        id,
-      </if>
-      <if test="cerNum != null" >
-        cer_num,
-      </if>
-      <if test="grabDate != null" >
-        grab_date,
-      </if>
-      <if test="crtTime != null" >
-        crt_time,
-      </if>
-      <if test="grabStatus != null" >
-        grab_status,
-      </if>
-      <if test="cerStatus != null" >
-        cer_status,
-      </if>
-      <if test="msg != null" >
-        msg,
-      </if>
-    </trim>
-    <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="id != null" >
-        #{id,jdbcType=VARCHAR},
-      </if>
-      <if test="cerNum != null" >
-        #{cerNum,jdbcType=VARCHAR},
-      </if>
-      <if test="grabDate != null" >
-        #{grabDate,jdbcType=DATE},
-      </if>
-      <if test="crtTime != null" >
-        #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="grabStatus != null" >
-        #{grabStatus,jdbcType=CHAR},
-      </if>
-      <if test="cerStatus != null" >
-        #{cerStatus,jdbcType=VARCHAR},
-      </if>
-      <if test="msg != null" >
-        #{msg,jdbcType=VARCHAR},
-      </if>
-    </trim>
-  </insert>
-  <update id="updateByPrimaryKeySelective" parameterType="com.novaone.entity.DownInfo" >
-    update ccsehgpdf_down_info
-    <set >
-      <if test="cerNum != null" >
-        cer_num = #{cerNum,jdbcType=VARCHAR},
-      </if>
-      <if test="grabDate != null" >
-        grab_date = #{grabDate,jdbcType=DATE},
-      </if>
-      <if test="crtTime != null" >
-        crt_time = #{crtTime,jdbcType=TIMESTAMP},
-      </if>
-      <if test="grabStatus != null" >
-        grab_status = #{grabStatus,jdbcType=CHAR},
-      </if>
-      <if test="cerStatus != null" >
-        cer_status = #{cerStatus,jdbcType=VARCHAR},
-      </if>
-      <if test="msg != null" >
-        msg = #{msg,jdbcType=VARCHAR},
-      </if>
-    </set>
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-  <update id="updateByPrimaryKey" parameterType="com.novaone.entity.DownInfo" >
-    update ccsehgpdf_down_info
-    set cer_num = #{cerNum,jdbcType=VARCHAR},
-      grab_date = #{grabDate,jdbcType=DATE},
-      crt_time = #{crtTime,jdbcType=TIMESTAMP},
-      grab_status = #{grabStatus,jdbcType=CHAR},
-      cer_status = #{cerStatus,jdbcType=VARCHAR},
-      msg = #{msg,jdbcType=VARCHAR}
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
-</mapper>
\ No newline at end of file
Index: src/main/java/com/novaone/dao/QueryCodeJobDao.java
===================================================================
--- src/main/java/com/novaone/dao/QueryCodeJobDao.java	(不存在的)
+++ src/main/java/com/novaone/dao/QueryCodeJobDao.java	(版本 28938)
@@ -0,0 +1,49 @@
+package com.novaone.dao;
+
+import com.novaone.entity.QueryCodeRetryJob;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 读写验证码重试任务表
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 17:28
+ */
+@Repository
+public interface QueryCodeJobDao {
+
+    /**
+     * 添加一条查询码插入重试任务
+     * @param codeRetryJob
+     */
+    void add(QueryCodeRetryJob codeRetryJob);
+
+
+    /**
+     * 查询全部任务
+     * @return 任务列表
+     */
+    List<QueryCodeRetryJob> find();
+
+    /**
+     * 删除指定ID的任务
+     * @param job 删除的任务
+     */
+    Integer deleteById(QueryCodeRetryJob job);
+
+    /**
+     * 根据ID批量删除任务
+     * @param jobs 要删除的任务
+     * @return 删除行数
+     */
+    Integer delete(List<QueryCodeRetryJob> jobs);
+
+    /**
+     * 根据ID修改任务
+     * @return 影响行数
+     */
+    Integer updateById(QueryCodeRetryJob queryCodeRetryJob);
+
+}
Index: src/main/java/com/novaone/entity/ApplybgdhInfo.java
===================================================================
--- src/main/java/com/novaone/entity/ApplybgdhInfo.java	(版本 28937)
+++ src/main/java/com/novaone/entity/ApplybgdhInfo.java	(不存在的)
@@ -1,55 +0,0 @@
-package com.novaone.entity;
-
-import java.util.Date;
-
-public class ApplybgdhInfo {
-    private String id;
-
-    private String bgdh;
-
-    private Date crtTime;
-
-    private String applyStatus;
-
-    private String type;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getBgdh() {
-        return bgdh;
-    }
-
-    public void setBgdh(String bgdh) {
-        this.bgdh = bgdh;
-    }
-
-    public Date getCrtTime() {
-        return crtTime;
-    }
-
-    public void setCrtTime(Date crtTime) {
-        this.crtTime = crtTime;
-    }
-
-    public String getApplyStatus() {
-        return applyStatus;
-    }
-
-    public void setApplyStatus(String applyStatus) {
-        this.applyStatus = applyStatus;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-}
\ No newline at end of file
Index: src/main/java/com/novaone/entity/BgdhApplyInfo.java
===================================================================
--- src/main/java/com/novaone/entity/BgdhApplyInfo.java	(版本 28937)
+++ src/main/java/com/novaone/entity/BgdhApplyInfo.java	(不存在的)
@@ -1,20 +0,0 @@
-package com.novaone.entity;
-
-import lombok.Data;
-
-@Data
-public class BgdhApplyInfo {
-
-    private String type;
-
-    private String status;
-
-    private String entryId;
-
-    private String noteS;
-
-    private String orgCusNo;
-
-    private String srcFlag;
-
-}
Index: src/main/java/com/novaone/entity/CertificateDownloadInfo.java
===================================================================
--- src/main/java/com/novaone/entity/CertificateDownloadInfo.java	(不存在的)
+++ src/main/java/com/novaone/entity/CertificateDownloadInfo.java	(版本 28938)
@@ -0,0 +1,22 @@
+package com.novaone.entity;
+
+import lombok.Data;
+import java.util.Date;
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-22 17:51
+ */
+@Data
+public class CertificateDownloadInfo {
+    private Long id;
+    private String queryCode;
+    private Integer businessState;
+    private String certificateNo;
+    private String ywbh;
+    private Date receiveTime;
+    private Long smsId;
+    private Date createTime;
+    private Date updateTime;
+}
Index: src/main/java/com/novaone/entity/CertificateRetryJob.java
===================================================================
--- src/main/java/com/novaone/entity/CertificateRetryJob.java	(不存在的)
+++ src/main/java/com/novaone/entity/CertificateRetryJob.java	(版本 28938)
@@ -0,0 +1,61 @@
+package com.novaone.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import java.util.Date;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 合同重试任务
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 15:30
+ */
+@Data
+public class CertificateRetryJob {
+    private Long id;
+    private Long infoId;
+    private String queryCode;
+    @JSONField(ordinal = 1)
+    private String certificateNo;
+    private Integer failDownload;
+    private Date downloadTime;
+    private String filePath;
+    private String ywbh;
+    private String message;
+    private Integer failUpload;
+    private Integer retryCount;
+    private Date createTime;
+    private Date updateTime;
+
+    public static CertificateRetryJob downloadJob(long infoId,String queryCode,String certificateNo,String ywbh,String message){
+        CertificateRetryJob job = new CertificateRetryJob();
+        job.setInfoId(infoId);
+        job.setCreateTime(new Date());
+        job.setUpdateTime(new Date());
+        job.setRetryCount(0);
+        job.setFailDownload(1);//下载失败
+        job.setQueryCode(queryCode);
+        job.setCertificateNo(certificateNo);
+        job.setFailUpload(0);//未进行上传操作
+        job.setYwbh(ywbh);
+        job.setMessage(message);
+        return job;
+    }
+
+    public static CertificateRetryJob uploadJob(long infoId,String queryCode, String certificateNo, String path,String ywbh,String message){
+        CertificateRetryJob job = new CertificateRetryJob();
+        job.setInfoId(infoId);
+        job.setCreateTime(new Date());
+        job.setUpdateTime(new Date());
+        job.setDownloadTime(new Date());
+        job.setRetryCount(0);
+        job.setFailDownload(0);//下载成功
+        job.setQueryCode(queryCode);
+        job.setCertificateNo(certificateNo);
+        job.setFailUpload(1);//上传失败
+        job.setYwbh(ywbh);
+        job.setMessage(message);
+        job.setFilePath(path);//文件存储路径
+        return job;
+    }
+}
Index: src/main/java/com/novaone/entity/DownCount.java
===================================================================
--- src/main/java/com/novaone/entity/DownCount.java	(版本 28937)
+++ src/main/java/com/novaone/entity/DownCount.java	(不存在的)
@@ -1,45 +0,0 @@
-package com.novaone.entity;
-
-import java.util.Date;
-
-public class DownCount {
-    private String id;
-
-    private Integer grabCount;
-
-    private Date grabDate;
-
-    private Date crtTime;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public Integer getGrabCount() {
-        return grabCount;
-    }
-
-    public void setGrabCount(Integer grabCount) {
-        this.grabCount = grabCount;
-    }
-
-    public Date getGrabDate() {
-        return grabDate;
-    }
-
-    public void setGrabDate(Date grabDate) {
-        this.grabDate = grabDate;
-    }
-
-    public Date getCrtTime() {
-        return crtTime;
-    }
-
-    public void setCrtTime(Date crtTime) {
-        this.crtTime = crtTime;
-    }
-}
\ No newline at end of file
Index: src/main/java/com/novaone/entity/DownInfo.java
===================================================================
--- src/main/java/com/novaone/entity/DownInfo.java	(版本 28937)
+++ src/main/java/com/novaone/entity/DownInfo.java	(不存在的)
@@ -1,75 +0,0 @@
-package com.novaone.entity;
-
-import java.util.Date;
-
-public class DownInfo {
-    private String id;
-
-    private String cerNum;
-
-    private Date grabDate;
-
-    private Date crtTime;
-
-    private String grabStatus;
-
-    private String cerStatus;
-
-    private String msg;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCerNum() {
-        return cerNum;
-    }
-
-    public void setCerNum(String cerNum) {
-        this.cerNum = cerNum;
-    }
-
-    public Date getGrabDate() {
-        return grabDate;
-    }
-
-    public void setGrabDate(Date grabDate) {
-        this.grabDate = grabDate;
-    }
-
-    public Date getCrtTime() {
-        return crtTime;
-    }
-
-    public void setCrtTime(Date crtTime) {
-        this.crtTime = crtTime;
-    }
-
-    public String getGrabStatus() {
-        return grabStatus;
-    }
-
-    public void setGrabStatus(String grabStatus) {
-        this.grabStatus = grabStatus;
-    }
-
-    public String getCerStatus() {
-        return cerStatus;
-    }
-
-    public void setCerStatus(String cerStatus) {
-        this.cerStatus = cerStatus;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-}
\ No newline at end of file
Index: src/main/java/com/novaone/entity/Hddz.java
===================================================================
--- src/main/java/com/novaone/entity/Hddz.java	(版本 28937)
+++ src/main/java/com/novaone/entity/Hddz.java	(版本 28938)
@@ -2,28 +2,25 @@
 
 import lombok.Data;
 
+/*
+ * @program: ccsehgpdf
+ * @description: 水果通中yw_hddz
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 15:55
+ */
 @Data
 public class Hddz {
-
-    private String ywbh;
-
-    private String bjh;
-
-    private String pdfbjh;
-
-    private String wjlx;
-
+    private String jyjyzscxm;//查询码
     private String sfyjyjyzs;
+    private String jyjyzs;  //上传的文件名称,多个文件名称之间使用 ; 分隔，且第一个文件名称前面也带有 ;
+    private String bgdh;//检疫证书对应的报关单号
+    private String ywbh;//业务编号
 
-    private String dzqk;
+    public Hddz() {
+    }
 
-    private String bgsj;
-
-    private String bgdh;
-
-    // 商品大类 A：水果
-    private String spdl;
-
-    // 是否申报成功 Y成功 N失败
-    private String dyckState;
+    public Hddz(String jyjyzscxm, String bgdh) {
+        this.jyjyzscxm = jyjyzscxm;
+        this.bgdh = bgdh;
+    }
 }
Index: src/main/java/com/novaone/entity/HddzOcrwjsb.java
===================================================================
--- src/main/java/com/novaone/entity/HddzOcrwjsb.java	(不存在的)
+++ src/main/java/com/novaone/entity/HddzOcrwjsb.java	(版本 28938)
@@ -0,0 +1,26 @@
+package com.novaone.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 证书上传后回写记录，对应水果通yw_hddz_ocrwjsb
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 16:04
+ */
+@Data
+public class HddzOcrwjsb {
+    private String wjmc;//
+    private Date zbrq;//
+    private String wjlx;//文件类型，检验检疫证书.
+    private String ywbh;//
+    private String bgdh;//检疫证书对应的报关单号
+    private String sfcz;//检疫证书对应的报关单号
+    private String wjhz;//检疫证书对应的报关单号
+    private String wjlj;//文件的上传路径
+    private String yzwjlj;//文件的上传路径
+    private String yzzhcs;//文件的上传路径
+    private String sfcs;//文件的上传路径
+}
Index: src/main/java/com/novaone/entity/JsonModel.java
===================================================================
--- src/main/java/com/novaone/entity/JsonModel.java	(版本 28937)
+++ src/main/java/com/novaone/entity/JsonModel.java	(不存在的)
@@ -1,42 +0,0 @@
-package com.novaone.entity;
-
-/**
- * 
- * @ClassName: JsonModel 
- * @Description: json统一返回对象
- * @author zhaojiyan
- *
- */
-public class JsonModel {
-
-    private String code; // 返回状态码
-
-    private String des; // 结果描述
-
-    private Object result;// 返回结果
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public Object getResult() {
-        return result;
-    }
-
-    public void setResult(Object result) {
-        this.result = result;
-    }
-
-    public String getDes() {
-        return des;
-    }
-
-    public void setDes(String des) {
-        this.des = des;
-    }
-
-}
Index: src/main/java/com/novaone/entity/QueryCodeRetryJob.java
===================================================================
--- src/main/java/com/novaone/entity/QueryCodeRetryJob.java	(不存在的)
+++ src/main/java/com/novaone/entity/QueryCodeRetryJob.java	(版本 28938)
@@ -0,0 +1,32 @@
+package com.novaone.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 查询码重试任务
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 16:11
+ */
+@Data
+public class QueryCodeRetryJob {
+    private Long id;
+    private String queryCode;
+    private String certificateNo;
+    private String message;
+    private Date receiveTime;
+    private Long smsId;
+    private Integer retryCount;
+    private Date createTime;
+    private Date updateTime;
+
+    public QueryCodeRetryJob() {
+    }
+
+    public QueryCodeRetryJob(Long id) {
+        this.id = id;
+    }
+
+}
Index: src/main/java/com/novaone/entity/SmsInfo.java
===================================================================
--- src/main/java/com/novaone/entity/SmsInfo.java	(不存在的)
+++ src/main/java/com/novaone/entity/SmsInfo.java	(版本 28938)
@@ -0,0 +1,30 @@
+package com.novaone.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+public class SmsInfo {
+    private Long id;                        //短信的ID
+    private String address;                  //发送地址
+    private int type;                        //类型
+    private String body;                     //短信内容
+    private Date date;                       //时间
+    private String certificateNo;
+    private String queryCode;
+
+    public SmsInfo() { }
+
+    public SmsInfo(Long id, String address, int type, String body, Date date, String certificateNo, String queryCode) {
+        this.id = id;
+        this.address = address;
+        this.type = type;
+        this.body = body;
+        this.date = date;
+        this.certificateNo = certificateNo;
+        this.queryCode = queryCode;
+    }
+}
Index: src/main/java/com/novaone/entity/User.java
===================================================================
--- src/main/java/com/novaone/entity/User.java	(版本 28937)
+++ src/main/java/com/novaone/entity/User.java	(不存在的)
@@ -1,83 +0,0 @@
-package com.novaone.entity;
-
-import javax.annotation.Generated;
-
-public class User {
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String id;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String username;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String password;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String client;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String type;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    private String status;
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getId() {
-        return id;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getUsername() {
-        return username;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getPassword() {
-        return password;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getClient() {
-        return client;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setClient(String client) {
-        this.client = client;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getType() {
-        return type;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public String getStatus() {
-        return status;
-    }
-
-    @Generated("org.mybatis.generator.api.MyBatisGenerator")
-    public void setStatus(String status) {
-        this.status = status;
-    }
-}
\ No newline at end of file
Index: src/main/java/com/novaone/fdao/HddzDao.java
===================================================================
--- src/main/java/com/novaone/fdao/HddzDao.java	(不存在的)
+++ src/main/java/com/novaone/fdao/HddzDao.java	(版本 28938)
@@ -0,0 +1,22 @@
+package com.novaone.fdao;
+
+import java.util.List;
+
+import com.novaone.entity.Hddz;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface HddzDao {
+
+    /**
+     * 更新数据
+     */
+    Integer update(Hddz hddz);
+
+    /**
+     * 根据报关单号查询数据，可能不唯一
+     * @param bgdh 报关单号
+     * @return 数据列表
+     */
+    List<Hddz> findByBgdh(String bgdh);
+}
Index: src/main/java/com/novaone/fdao/HddzMapper.java
===================================================================
--- src/main/java/com/novaone/fdao/HddzMapper.java	(版本 28937)
+++ src/main/java/com/novaone/fdao/HddzMapper.java	(不存在的)
@@ -1,48 +0,0 @@
-package com.novaone.fdao;
-
-import java.util.List;
-
-import org.apache.ibatis.annotations.Mapper;
-
-import com.novaone.entity.Hddz;
-
-@Mapper
-public interface HddzMapper {
-
-    /**
-     * 
-     * queryAllNeedPdfBjh(查询所有需要查询的报检号)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月11日 下午5:06:39
-     */
-    List<Hddz> queryAllNeedPdfBjh();
-
-    /**
-     * 
-     * queryAllNeedBgdhApply(查询所有需要提交的申报的报关单号)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午3:33:36
-     */
-    List<Hddz> queryAllNeedBgdhApply();
-
-    /**
-     * 
-     * updatebgdhApplyStatus(更新报关申请状态)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午5:19:16
-     */
-    void updatebgdhApplyStatus(Hddz hddz);
-
-}
Index: src/main/java/com/novaone/fdao/HddzOcrwjsbDao.java
===================================================================
--- src/main/java/com/novaone/fdao/HddzOcrwjsbDao.java	(不存在的)
+++ src/main/java/com/novaone/fdao/HddzOcrwjsbDao.java	(版本 28938)
@@ -0,0 +1,16 @@
+package com.novaone.fdao;
+
+import com.novaone.entity.HddzOcrwjsb;
+import org.springframework.stereotype.Repository;
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-28 15:21
+ */
+@Repository
+public interface HddzOcrwjsbDao {
+    /**文件上传成功后插入一条数据**/
+    Integer add(HddzOcrwjsb hddzOcrwjsb);
+}
Index: src/main/java/com/novaone/fdao/Mapper/HddzMapper.xml
===================================================================
--- src/main/java/com/novaone/fdao/Mapper/HddzMapper.xml	(版本 28937)
+++ src/main/java/com/novaone/fdao/Mapper/HddzMapper.xml	(不存在的)
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.novaone.fdao.HddzMapper" >
-	
-	<select id="queryAllNeedPdfBjh" resultType="com.novaone.entity.Hddz">
-	<![CDATA[ 	
-		SELECT
-			ywbh,
-			wjlx = '检验检疫证书',
-			bjh,
-			RTRIM(bjh) + '001' pdfbjh,
-			sfyjyjyzs,
-			dzqk 
-		FROM
-			yw_hddz 
-		WHERE len( bjh ) > 0  and len(bjh) <=19 AND isnull( sfyjyjyzs, 'N' ) != 'Y' and isnull(mdg,'') !='广西'
-		and charindex(char(10),bjh)=0  
-		and charindex(char(13),bjh)=0 
-		and isnull(state,'')!='终止' and isnull(bjh,'')!='000000000000000'
-		and case when isnull(sblx,'0') = '0' then isnull(hgfxsj,'') 
-		else isnull(ecwzsbsj,'') end > dateadd(dd,-60,getdate()) 
-		order by zbrq
-		]]>	
-	</select>
-	
-	<select id="queryAllNeedBgdhApply" resultType="com.novaone.entity.Hddz">
-	SELECT 
-		distinct
-		convert(varchar(10),yh.bgsj,120) bgsj,
-		yh.ywbh,
-		yh.bjh,
-		yh.bgdh,
-		yc.spdl,
-		dyck_state dyckState	
-	FROM
-		yw_hddz yh
-		left join yw_hddz_spxx hs on hs.ywbh =yh.ywbh
-		left join yw_commodity yc on yc.yw_spbm = hs.spbm
-		where convert(varchar(10),bgsj,120) &lt;= convert(varchar(10),getdate(),120)
-		and convert(varchar(10),DATEADD(day,15,bgsj),120) &gt;= convert(varchar(10),getdate(),120)
-		and isnull(bjh,'')!='' and ysfs='海运' and len(bgdh)=18 and yc.spdl='A' and yh.state != '终止' and yh.jckfs='进口'
-		and isnull(bjh,'')!='000000000000000' and isnull(dyck_state,'') != 'Y' and yh.mdg = '上海'
-	ORDER BY
-		bgsj
-	</select>
-	
-	<update id="updatebgdhApplyStatus" parameterType="com.novaone.entity.Hddz">
-		update yw_hddz set dyck_state = #{dyckState} where ywbh=#{ywbh}
-	</update>
-	
-</mapper>
\ No newline at end of file
Index: src/main/java/com/novaone/job/EasipassHeartbeatCron.java
===================================================================
--- src/main/java/com/novaone/job/EasipassHeartbeatCron.java	(不存在的)
+++ src/main/java/com/novaone/job/EasipassHeartbeatCron.java	(版本 28938)
@@ -0,0 +1,40 @@
+package com.novaone.job;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.novaone.util.HttpUtil;
+
+
+/**
+ *
+ * 项目名称：easipass
+ * 类名称：EasipassHeartbeatCron
+ * 类描述：放行抓取定时心跳任务
+ * 创建人：zhangjl
+ * 创建时间：2019年5月14日 上午9:23:45
+ * 修改人：zhangjl
+ * 修改时间：2019年5月14日 上午9:23:45
+ * 修改备注：
+ * @version
+ *
+ */
+//@Component
+public class EasipassHeartbeatCron {
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+    private static final String WECHAT_REFRESHTIME_URL = "http://www.fruitease.com:8009/IFView/PortHandler.ashx?action=wechatRefreshTime&modulecode=ccsehgpdf&token=1";
+
+    // 每10分钟检查一次
+    @Scheduled(cron = "0 */10 * * * ?")
+    public void core() {
+        try {
+            String result = HttpUtil.get(WECHAT_REFRESHTIME_URL);
+            log.info("EasipassHeartbeatCron sendResult: " + result);
+        } catch (Exception e) {
+            log.error("EasipassHeartbeatCron ERROR:" + e.getMessage(), e);
+        }
+    }
+}
Index: src/main/java/com/novaone/job/Timer.java
===================================================================
--- src/main/java/com/novaone/job/Timer.java	(不存在的)
+++ src/main/java/com/novaone/job/Timer.java	(版本 28938)
@@ -0,0 +1,74 @@
+package com.novaone.job;
+
+import com.novaone.common.CommonInfo;
+import com.novaone.dao.CertificateDownloadInfoDao;
+import com.novaone.dao.CertificateRetryJobDao;
+import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.CertificateRetryJob;
+import com.novaone.entity.QueryCodeRetryJob;
+import com.novaone.service.CertificateService;
+import com.novaone.service.QueryCodeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 定时任务
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 18:11
+ */
+@Slf4j
+@Component
+public class Timer {
+    
+    @Autowired
+    private CertificateDownloadInfoDao certificateInfoDao;
+    @Autowired
+    private CertificateService certificateService;
+    @Autowired
+    private QueryCodeService queryCodeService;
+
+    //每小时整点和半点执行一次。
+    @Scheduled(cron = "0 0/30 * * * *")
+    public void certificateUpload(){
+        List<CertificateDownloadInfo> list = certificateInfoDao.findByBusinesState(-1);
+        log.info("[检疫证书上传任务]本次待下载并上传检疫证书数量:"+list.size());
+        list.parallelStream().forEach(item->certificateService.upload(item));
+    }
+
+    /**
+     * 每小时的25分、40分、55分执行一次。
+     */
+    @Scheduled(cron = "0 10/15 * * * *")
+    public void retryUpload(){
+        List<CertificateRetryJob> retryJob = certificateService.findRetryJob();
+        if (retryJob.size()<1)return;
+        log.info("[检疫证书重试任务]本次重试任务数量:{}",retryJob.size());
+        retryJob.stream()
+                .filter(item -> item.getFailDownload() == 1 && item.getFailUpload() == 0).parallel()
+                .forEach((item -> certificateService.retryDownload(item)));
+        retryJob.stream()
+                .filter(str -> str.getFailDownload() == 0 && str.getFailUpload() == 1)
+                .parallel()
+                .forEach((job -> certificateService.retryUpload(job)));
+    }
+
+
+    @Scheduled(cron = "0 5/10 * * * *")
+    public void retrySaveQueryCode(){
+        List<QueryCodeRetryJob> retryJob = queryCodeService.findAll();
+        if (retryJob.size()<1)return;
+        log.info("[查询码写入重试任务]本次重试任务数量:{}",retryJob.size());
+        retryJob.parallelStream().forEach(item -> queryCodeService.retrySave(item));
+    }
+
+}
Index: src/main/java/com/novaone/service/ApplyBgdhService.java
===================================================================
--- src/main/java/com/novaone/service/ApplyBgdhService.java	(版本 28937)
+++ src/main/java/com/novaone/service/ApplyBgdhService.java	(不存在的)
@@ -1,55 +0,0 @@
-package com.novaone.service;
-
-import java.util.List;
-
-import com.novaone.entity.Hddz;
-
-public interface ApplyBgdhService {
-    /**
-     * 
-     * queryAllNeedBgdhApply(查询所有需要提交的申报的报关单号)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午3:33:36
-     */
-    List<Hddz> queryAllNeedBgdhApply();
-
-    /**
-     * 
-     * applyBgdh(报关单号申报)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午3:55:59
-     */
-    void applyBgdh(List<Hddz> list);
-
-    /**
-     * 
-     * updatebgdhApplyStatus(更新报关单号申报)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午5:05:40
-     */
-    void updatebgdhApplyStatus(Hddz hddz, String status);
-
-    /**
-     * 
-     * insertApplyBgdhInfo(新增申报信息记录)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午5:13:32
-     */
-    void insertApplyBgdhInfo(Hddz hddz, String status);
-}
Index: src/main/java/com/novaone/service/CertificateService.java
===================================================================
--- src/main/java/com/novaone/service/CertificateService.java	(不存在的)
+++ src/main/java/com/novaone/service/CertificateService.java	(版本 28938)
@@ -0,0 +1,55 @@
+package com.novaone.service;
+
+import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.CertificateRetryJob;
+
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 检疫证书下载及上传功能
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 15:28
+ */
+public interface CertificateService {
+
+    /**
+     * 重试下载成功但上传失败的任务。
+     * @param job 重试任务
+     */
+    void retryUpload(CertificateRetryJob job);
+
+
+    /**
+     * 重试下载失败的任务，重新执行下载并上传。
+     * @param job
+     */
+    void retryDownload(CertificateRetryJob job);
+
+    /**
+     * 合同下载并上传水果通
+     * @param certificateDownloadInfo 执行合同下载相关的必要信息
+     */
+    void upload(CertificateDownloadInfo certificateDownloadInfo);
+
+
+    /**
+     * 添加合同上传或者下载重试任务
+     * @param retryJob 任务
+     */
+    void addRetryJob(CertificateRetryJob retryJob);
+
+
+    /**
+     * 查找全部待执行任务
+     * @return 任务列表
+     */
+    List<CertificateRetryJob> findRetryJob();
+
+    /**
+     * 更新重试任务
+     * @param job 任务
+     * @param message 任务描述
+     */
+    void updateRetryJob(CertificateRetryJob job,String message);
+}
Index: src/main/java/com/novaone/service/GrabPfdService.java
===================================================================
--- src/main/java/com/novaone/service/GrabPfdService.java	(版本 28937)
+++ src/main/java/com/novaone/service/GrabPfdService.java	(不存在的)
@@ -1,98 +0,0 @@
-package com.novaone.service;
-
-import java.util.List;
-
-import org.openqa.selenium.WebDriver;
-
-import com.novaone.entity.DownCount;
-import com.novaone.entity.DownInfo;
-import com.novaone.entity.Hddz;
-
-public interface GrabPfdService {
-
-    /**
-     * 
-     * insertDownInfo(插入下载记录)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午2:10:30
-     */
-    void insertDownInfo(DownInfo downInfo);
-
-    /**
-     * 
-     * grabPdf(抓取pdf)         
-     * @param startDate 
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月26日 上午10:34:04
-     */
-    void grabPdf(String startDate);
-
-    /**
-     * 
-     * insertCountDown(插入下载条数)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月26日 下午6:13:10
-     */
-    void insertCountDown(DownCount downCount);
-
-    /**
-     * 
-     * queryAllNeedPdfBjh(查询所有需要查询的报检号)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月11日 下午5:06:39
-     */
-    List<Hddz> queryAllNeedPdfBjh();
-
-    /**
-     * 
-     * grabPdfSingle(根据报检号查询下载pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月11日 下午5:21:40
-     */
-    void grabPdfSingle(List<Hddz> list);
-
-    /**
-     * 
-     * grabByBjh(根据报检号抓取)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月14日 上午10:49:41
-     */
-    void grabByBjh(WebDriver driver, String bjh) throws Exception;
-
-    /**
-     * 
-     * loginPageUrl(登录)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月17日 上午9:45:00
-     */
-    void loginPageUrl(WebDriver driver) throws Exception;
-
-}
Index: src/main/java/com/novaone/service/HddzService.java
===================================================================
--- src/main/java/com/novaone/service/HddzService.java	(不存在的)
+++ src/main/java/com/novaone/service/HddzService.java	(版本 28938)
@@ -0,0 +1,30 @@
+package com.novaone.service;
+
+import com.novaone.entity.Hddz;
+
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-25 18:10
+ */
+public interface HddzService {
+    /**
+     * 根据报关单号，写入查询码
+     */
+    void addQueryCode(Hddz hddz);
+
+    /**
+     * 根据报关单号查询数据，主要是为了获取业务编号。
+     * @param bgdh 报关单号
+     * @return
+     */
+    List<Hddz> findByBgdh(String bgdh);
+
+    void  uploadSuccessful(Hddz hddz, String fileName);
+
+    void  uploadSuccessful(Hddz hddz);
+
+}
Index: src/main/java/com/novaone/service/NewGrabPfdService.java
===================================================================
--- src/main/java/com/novaone/service/NewGrabPfdService.java	(版本 28937)
+++ src/main/java/com/novaone/service/NewGrabPfdService.java	(不存在的)
@@ -1,59 +0,0 @@
-package com.novaone.service;
-
-import java.text.ParseException;
-import java.util.List;
-
-import com.novaone.entity.Hddz;
-
-public interface NewGrabPfdService {
-
-    /**
-     * 
-     * grabPdf(抓取pdf检疫证)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午1:57:05
-     */
-    void grabPdf(String startDate);
-
-    /**
-     * 
-     * grabPdfSingle(单票检疫证补录)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午1:57:54
-     */
-    void grabPdfSingle(List<Hddz> list);
-
-    /**
-     * 
-     * recordDownloadInfo(记录下载信息)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午2:15:05
-     */
-    void recordDownloadInfo(String cerNum, String stateDate, String status, String cerStatus, String msg)
-            throws ParseException;
-
-    /**
-     * 
-     * recordCountDown(记录下载数量)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:47:03
-     */
-    void recordCountDown(String startDate, Integer pageNum) throws ParseException;
-
-}
Index: src/main/java/com/novaone/service/QueryCodeService.java
===================================================================
--- src/main/java/com/novaone/service/QueryCodeService.java	(不存在的)
+++ src/main/java/com/novaone/service/QueryCodeService.java	(版本 28938)
@@ -0,0 +1,46 @@
+package com.novaone.service;
+
+import com.novaone.entity.QueryCodeRetryJob;
+import com.novaone.entity.SmsInfo;
+
+import java.util.List;
+import java.util.Set;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 查询码操作
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 15:14
+ */
+public interface QueryCodeService {
+    /**
+     * 存储APP发送的查询码到MySQL和SqlServer
+     * @param smsInfo App 发送的短信数据
+     */
+    void saveQueryCode(SmsInfo smsInfo);
+
+    /**
+     * 存储App端批量发送的短信。-
+     * @param smsList
+     */
+    void saveList(Set<SmsInfo> smsList);
+
+    /**
+     * 添加查询码保存重试任务
+     * @param smsInfo APP端发送的短信数据
+     */
+    void addRetryJob(SmsInfo smsInfo, String message);
+
+
+    /**
+     * 查询码写入重试任务
+     * @param job 任务
+     */
+    void retrySave(QueryCodeRetryJob job);
+
+    /**
+     * 查询全部待处理的验证码写入重试任务
+     * @return 任务列表
+     */
+    List<QueryCodeRetryJob> findAll();
+}
Index: src/main/java/com/novaone/service/SmsService.java
===================================================================
--- src/main/java/com/novaone/service/SmsService.java	(不存在的)
+++ src/main/java/com/novaone/service/SmsService.java	(版本 28938)
@@ -0,0 +1,15 @@
+package com.novaone.service;
+
+import com.novaone.entity.CertificateDownloadInfo;
+
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-25 18:08
+ */
+public interface SmsService {
+    public void save(CertificateDownloadInfo certificateDownloadInfo);
+
+}
Index: src/main/java/com/novaone/service/impl/ApplyBgdhServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/ApplyBgdhServiceImpl.java	(版本 28937)
+++ src/main/java/com/novaone/service/impl/ApplyBgdhServiceImpl.java	(不存在的)
@@ -1,225 +0,0 @@
-package com.novaone.service.impl;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Resource;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.common.CommonInfo;
-import com.novaone.dao.ApplybgdhInfoMapper;
-import com.novaone.entity.ApplybgdhInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.fdao.HddzMapper;
-import com.novaone.service.ApplyBgdhService;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Service("applyBgdhService")
-public class ApplyBgdhServiceImpl implements ApplyBgdhService {
-
-    @Resource
-    private HddzMapper hddzMapper;
-
-    @Resource
-    private ApplybgdhInfoMapper applybgdhInfoMapper;
-
-    @Resource
-    private ApplyBgdhService applyBgdhService;
-
-    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
-    @Override
-    public List<Hddz> queryAllNeedBgdhApply() {
-        return hddzMapper.queryAllNeedBgdhApply();
-    }
-
-    @Override
-    public void applyBgdh(List<Hddz> list) {
-        WebDriver driver = null;
-
-        try {
-            // driver = new RemoteWebDriver(new
-            // URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            driver = new ChromeDriver();
-
-            GrabPdfServiceImpl grabPdfServiceImpl = new GrabPdfServiceImpl();
-            // 登录
-            grabPdfServiceImpl.loginPageUrl(driver);
-            // 设置打开窗口大小
-            // driver.get(CommonInfo.PAGE_URL_LOGIN);
-            // driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-            // driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-            TimeUnit.SECONDS.sleep(10);
-            // 打开申报页面
-            openBgdhApplyPage(driver);
-
-            for (Hddz hddz : list) {
-                TimeUnit.SECONDS.sleep(1);
-                String bgdh = hddz.getBgdh();
-                try {
-                    handleApplyBgdh(driver, bgdh);
-                    applyBgdhService.updatebgdhApplyStatus(hddz, CommonInfo.FRESHPORT_COMMON_YES);
-                    applyBgdhService.insertApplyBgdhInfo(hddz, CommonInfo.GRAB_STATUS_SUCCESS);
-                } catch (Exception e) {
-                    log.error("bgdh:" + bgdh + " 抓取失败", e.getMessage());
-                    e.printStackTrace();
-                    applyBgdhService.insertApplyBgdhInfo(hddz, CommonInfo.GRAB_STATUS_ERROR);
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * handleApplyBgdh(操作申请)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws InterruptedException 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年11月2日 下午4:16:43
-     */
-    private void handleApplyBgdh(WebDriver driver, String bgdh) throws InterruptedException {
-        List<WebElement> blueButtons = null;
-        try {
-            driver.findElement(By.className(CommonInfo.APPLY_BGDH_INPUT_CLASS)).clear();
-            driver.findElement(By.className(CommonInfo.APPLY_BGDH_INPUT_CLASS)).sendKeys(bgdh);
-            // 蓝色按钮
-            blueButtons = driver
-                    .findElements(By.cssSelector("[class='" + CommonInfo.APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-            blueButtons.get(1).click();
-        } catch (Exception e) {
-            log.error("元素获取失败，刷新页面");
-            driver.navigate().refresh();
-            e.printStackTrace();
-            TimeUnit.SECONDS.sleep(3);
-            driver.findElement(By.className(CommonInfo.APPLY_BGDH_INPUT_CLASS)).clear();
-            driver.findElement(By.className(CommonInfo.APPLY_BGDH_INPUT_CLASS)).sendKeys(bgdh);
-            // 蓝色按钮
-            blueButtons = driver
-                    .findElements(By.cssSelector("[class='" + CommonInfo.APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-            blueButtons.get(1).click();
-        }
-
-        // driver.findElement(By.xpath(APPLY_BGDH_INPUT_BUTTON_XPATH)).click();
-        TimeUnit.SECONDS.sleep(8);
-        String dataMsg = "";
-        try {
-            dataMsg = driver.findElement(By.className("ep-table-empty-text")).getText();
-        } catch (Exception e) {
-            log.info("查到数据");
-        }
-        if ("无数据".equals(dataMsg)) {
-            // 绿色按钮
-            List<WebElement> greenButtons = driver
-                    .findElements(By.cssSelector("[class='" + CommonInfo.APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-            log.info("------------新增");
-            // 新增补充信息
-            greenButtons.get(0).click();
-            TimeUnit.SECONDS.sleep(2);
-            // 输入报关单号
-            List<WebElement> inputs = driver.findElements(By.className(CommonInfo.APPLY_BGDH_INPUT_CLASS));
-            inputs.get(1).sendKeys(bgdh);
-            blueButtons = driver
-                    .findElements(By.cssSelector("[class='" + CommonInfo.APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-            // 输入报关单号，确定
-            blueButtons.get(2).click();
-            TimeUnit.SECONDS.sleep(5);
-
-            // 点击下拉
-            driver.findElement(By.xpath(CommonInfo.APPLY_BGDH_APPLY_SELECT_XPAH)).click();
-            TimeUnit.SECONDS.sleep(1);
-            // 选择数据
-            driver.findElement(By.xpath(CommonInfo.APPLY_BGDH_APPLY_SELECT_DATA_XPATH)).click();
-            TimeUnit.SECONDS.sleep(1);
-            driver.findElements(By.className(CommonInfo.APPLY_BGDH_CHECKBOX_CLASS)).get(3).click();
-
-            TimeUnit.SECONDS.sleep(2);
-            greenButtons = driver
-                    .findElements(By.cssSelector("[class='" + CommonInfo.APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-            greenButtons.get(1).click();
-            TimeUnit.SECONDS.sleep(2);
-            List<WebElement> commonButton = driver
-                    .findElements(By.cssSelector("[class='ep-button ep-button--text ep-button--small']"));
-            commonButton.get(3).click();
-        }
-    }
-
-    /**
-     * 
-     * openBgdhApplyPage(打开电子化出证页面)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年11月2日 下午4:19:46
-     */
-    private void openBgdhApplyPage(WebDriver driver) throws InterruptedException {
-        log.info("登录成功-----------------------------------");
-        Cookie cookie = driver.manage().getCookieNamed("epoa.refresh_token");
-        String refreshToken = cookie.getValue();
-        log.info("fresh token:" + refreshToken);
-        Map<String, Object> maps = new HashMap<String, Object>();
-        maps.put("data", refreshToken);
-        maps.put("time", System.currentTimeMillis());
-        maps.put("exdays", 15);
-        String epToken = JSONObject.toJSONString(maps);
-        driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-        TimeUnit.SECONDS.sleep(2);
-        JavascriptExecutor js = (JavascriptExecutor) driver;// 将driver转换为js
-        String jsStr = "var obj = JSON.stringify(" + epToken + ");" + " localStorage.setItem('eptoken', obj);";
-        js.executeScript(jsStr);
-        driver.navigate().refresh();
-        TimeUnit.SECONDS.sleep(2);
-        driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-        TimeUnit.SECONDS.sleep(2);
-        log.info("**********打开电子化出证申报成功************");
-
-    }
-
-    @Transactional
-    @Override
-    public void updatebgdhApplyStatus(Hddz hddz, String status) {
-        hddz.setDyckState(status);
-        hddzMapper.updatebgdhApplyStatus(hddz);
-
-    }
-
-    @Transactional
-    @Override
-    public void insertApplyBgdhInfo(Hddz hddz, String status) {
-        ApplybgdhInfo applybgdhInfo = new ApplybgdhInfo();
-        applybgdhInfo.setId(UUID.randomUUID().toString());
-        applybgdhInfo.setBgdh(hddz.getBgdh());
-        applybgdhInfo.setCrtTime(new Date());
-        applybgdhInfo.setType(hddz.getSpdl());
-        applybgdhInfo.setApplyStatus(status);
-        applybgdhInfoMapper.insertSelective(applybgdhInfo);
-    }
-
-}
Index: src/main/java/com/novaone/service/impl/CertificateServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/CertificateServiceImpl.java	(不存在的)
+++ src/main/java/com/novaone/service/impl/CertificateServiceImpl.java	(版本 28938)
@@ -0,0 +1,308 @@
+package com.novaone.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.novaone.dao.CertificateDownloadInfoDao;
+import com.novaone.dao.CertificateRetryJobDao;
+import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.CertificateRetryJob;
+import com.novaone.entity.Hddz;
+import com.novaone.service.CertificateService;
+import com.novaone.service.HddzService;
+import com.novaone.util.CertificateUtils;
+import com.novaone.util.FtpUtil;
+import com.novaone.util.RegexUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
+
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-27 15:43
+ */
+@Slf4j
+@Service
+public class CertificateServiceImpl implements CertificateService {
+
+    private final String BASE_DIR = "/download_test/";
+//    private final String BASE_DIR = "/wenjian/CIQ TAX/";
+
+    @Autowired
+    private CertificateRetryJobDao retryJobDao;
+    @Autowired
+    private CertificateDownloadInfoDao certificateInfoDao;
+    @Autowired
+    private HddzService hddzService;
+
+    /**
+     * 根据App端推送的检疫证书编号和查询码，将检疫证书上传至水果通FTP服务器
+     * @param certificate
+     */
+    @Override
+    public void upload(CertificateDownloadInfo certificate) {
+        String queryCode = certificate.getQueryCode();
+        Long certificateId = certificate.getId();
+        String certificateNo = Optional.of(certificate.getCertificateNo()).orElseThrow(()->new NullPointerException("The certificateNo cannot be Null"));
+        String ywbh = certificate.getYwbh();
+        String fileName = certificateNo+".pdf";
+
+        InputStream inputStream = getFileData(queryCode, certificateNo,5);
+        //查询不到证书列表和下载失败都会返回null
+        if (inputStream == null) {
+            updateCertificateInfo(0,certificateId);
+            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode, certificateNo,ywbh,"证书下载失败"));
+            return;
+        }
+
+        /**
+         * 打开FTP链接，连接失败重试5次。若无法连接文件将保存至本地。
+         */
+        FtpUtil connect = getConnect(5);
+        if (connect == null) {
+            log.error("[检疫证书上传]失败,FTP服务无法连接...");
+            String path = storage(certificateId, queryCode, certificateNo, ywbh, inputStream);//存储文件并添加下载/上传重试任务
+            if (path == null){
+                updateCertificateInfo(0,certificateId);//下载失败
+            }else {
+                updateCertificateInfo(1,certificateId);//上传失败
+            }
+          return;
+        }
+
+        /**
+         * 上传下载的检疫证书
+         * http://www.fruitease.com:8009/wenjian/CIQ TAX/310040115012788.pdf
+         */
+        HashMap<String, InputStream> ftpFile = new HashMap<>();
+        ftpFile.put(BASE_DIR+ fileName , inputStream);
+        if (connect.upload(ftpFile)) {
+            Hddz hddz = new Hddz();
+            hddz.setBgdh(certificateNo.substring(0, certificateNo.length() - 3));
+            hddz.setSfyjyjyzs("Y");
+            hddz.setJyjyzs(fileName);
+            hddz.setYwbh(certificate.getYwbh());
+            hddzService.uploadSuccessful(hddz);//todo 更新水果通两张表
+            updateCertificateInfo(2, certificateId);//证书上传成功
+            log.info("[检疫证书上传成功],certificateInfo{}",JSON.toJSONString(certificate));
+
+        }else {
+            log.error("[检疫证书上传失败]FTP上传操作不成功,certificateInfo{}",JSON.toJSONString(certificate));
+            storage(certificateId, queryCode, certificateNo, ywbh, inputStream);//存储文件并添加下载重试任务
+        }
+        connect.disConnect();
+    }
+
+    @Override
+    public void addRetryJob(CertificateRetryJob retryJob) {
+        retryJobDao.add(retryJob);
+        log.info("[添加合同重试任务]certificateRetryJob = "+ JSON.toJSONString(retryJob));
+    }
+
+    @Override
+    public List<CertificateRetryJob> findRetryJob() {
+        return retryJobDao.findRetryJob();
+    }
+
+    @Override
+    public void updateRetryJob(CertificateRetryJob job, String message) {
+        job.setMessage(message);
+        job.setRetryCount(Optional.ofNullable(job.getRetryCount()).orElse(0)+1);
+        job.setUpdateTime(new Date());
+        retryJobDao.updateById(job);
+    }
+
+
+    /**
+     * 重试下载成功，但上传失败的任务
+     * @param job 重试任务
+     */
+    @Override
+    public void retryUpload(CertificateRetryJob job) {
+        FtpUtil connect = getConnect(5);
+        String fileName = Optional.of(job.getCertificateNo()).orElseThrow(() -> new NullPointerException("The certificateNo cannot be Null"))+".pdf";
+        if (connect == null) {
+            log.error("[检疫证书上传重试]FTP服务无法连接,重试失败...");
+            updateRetryJob(job,"FTPl连接获取失败");
+            return;
+        }
+        FileInputStream fileInputStream = null;
+        try {
+            fileInputStream = new FileInputStream(new File(job.getFilePath()));
+        } catch (FileNotFoundException e) {
+            log.error("[检疫证书上传重试]检疫证书文件不存在,文件路径{}",job.getFilePath());
+            e.printStackTrace();
+            job.setFailDownload(1);//修改任务为下载重试任务
+            job.setFailUpload(0);//上传状态
+            job.setRetryCount(0);
+            updateRetryJob(job,"本地文件不存在,路径="+job.getFilePath());
+            return;
+        }
+        Map<String,InputStream> param = new HashMap<>();
+        param.put(BASE_DIR+ fileName,fileInputStream);
+        if (connect.upload(param)) {
+            Hddz hddz = new Hddz();
+            hddz.setBgdh(job.getCertificateNo().substring(0, job.getCertificateNo().length() - 3));
+            hddz.setSfyjyjyzs("Y");
+            hddz.setJyjyzs(fileName);
+            hddz.setYwbh(job.getYwbh());
+           hddzService.uploadSuccessful(hddz);// todo 更新水果通两张表
+            log.info("[检疫证书上传重试]成功,job = {}",JSON.toJSONString(job));
+            retryJobDao.deleteById(job);
+            updateCertificateInfo(2,job.getInfoId());
+            try {
+                fileInputStream.close();
+                if (new File(job.getFilePath().replaceAll("\\\\", "\\\\\\\\")).delete()) {
+                    log.info("[检疫证书上传重试]删除本地证书文件{},",job.getFilePath());
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return;
+        }
+        log.error("[检疫证书上传重试]失败,FTP上传操作不成功 job = {}",JSON.toJSONString(job));
+        job.setRetryCount(Optional.ofNullable(job.getRetryCount()).orElse(0)+1);
+        updateRetryJob(job,"FTP上传操作不成功");
+    }
+
+    /**
+     * 重试下载并上传
+     * @param job 重试任务
+     */
+    @Override
+    public void retryDownload(CertificateRetryJob job) {
+        log.info("开始任务 = {}",JSON.toJSONString(job));
+        String certificateNo = Optional.of(job.getCertificateNo()).orElseThrow(()->new NullPointerException("The certificateNo cannot be Null"));
+        String queryCode = job.getQueryCode();
+        String fileName = certificateNo+".pdf";
+        InputStream fileData = getFileData(queryCode, certificateNo, 3);
+        if (fileData == null){
+            log.info("[检疫证书下载重试]失败");
+            updateRetryJob(job,"证书下载失败");
+            return;
+        }
+        FtpUtil connect = getConnect(3);
+        if (connect == null) {
+            log.error("[检疫证书下载重试]FTP服务无法连接,重试失败...");
+            updateRetryJob(job,"FTP服务器连接失败");
+            return;
+        }
+
+        HashMap<String, InputStream> ftpFile = new HashMap<>();
+        ftpFile.put(BASE_DIR+ fileName, fileData);
+        if (connect.upload(ftpFile)) {
+            Hddz hddz = new Hddz();
+            hddz.setBgdh(certificateNo.substring(0, certificateNo.length() - 3));
+            hddz.setSfyjyjyzs("Y");
+            hddz.setJyjyzs(fileName);//证书名称
+            hddz.setYwbh(job.getYwbh());
+            hddzService.uploadSuccessful(hddz);//todo 更新水果通两张表
+            retryJobDao.deleteById(job);
+            updateCertificateInfo(2,job.getInfoId());
+            return;
+        }
+        updateRetryJob(job,"FTP上传操作不成功");
+    }
+
+    /**
+     * 访问证书下载链接
+     */
+    private InputStream getFileData(String queryCode, String certificateNo, int retryCount) {
+        String searchResult;
+        do {
+            HashMap<String, String> param = CertificateUtils.downloadImg(3);
+            //{"total":0,"rows":[]}
+            //{"message":"验证码不正确！","total":0,"rows":[]}
+            //{"total":1,"rows":[{"queryType":null,"chgNo":null,"reportDateEnd":null,"remark":null,"processStatus":"0","seqNo":"202100000004252635","qrFileSeqNo":"202110147029876214671300496101","assessDeptCode":null,"certSource":"C","drawOrgCode":"2225","signDate":null,"certDate":null,"qrFilePath":"/swgpfs/ecert/2021/10/14/09/28/1300496/58/202110147029876214671300496101.PNG","orgCode":"310000","checkDate":null,"makerCode":null,"entMgrNo":null,"stName":null,"collecterCode":null,"coaDeclNo":null,"assessOrgCode":null,"declNo":"222520211000253049","reportStatus":"0","interpretDate":null,"validState":"1","addNo":null,"changeType":"0","makeDate":null,"formatId":null,"interpreter":null,"printOriginalNum":null,"printDuplicateNum":null,"declTypeCode":"I","checkOperatorCode":null,"releaserCode":null,"oldCertNo":null,"declDate":null,"language":"12","phaseStatus":"4","indbTime":"2021-10-14 09:28:04","certFilePath":"/swgpfs/ecert/2021/10/14/09/28/1300496/73/202110142686751893051300496109.pdf","processId":"9a1b7bf0a73742e8bee749458eed5266","stOrder":null,"backReason":null,"reviewOperatorCode":null,"drawDate":null,"id":"5e634b72dd8747089622d0cff13a6d1d","storeModeCode":null,"extendNo":0,"releaseDate":null,"certFileSeqNo":"202110142686751893051300496109","transBatch":"20211014092717839","ccsReportDate":null,"formatNo":"2501","handoverDate":null,"signerCode":null,"drawerCode":null,"entOrgCode":null,"reportDate":"2021-10-14 09:27:17","cusRegNo":null,"drawDeptCode":null,"submitProcessId":null,"end":0,"validStateName":"有效","assessorCode":null,"qrValid":"1","transFlag":null,"reviewDate":null,"ccsReportStatus":"E","repNo":null,"handoverCode":null,"partiNo":null,"collectDate":null,"begin":0,"serialNo":"1901","formatNoName":" 5-1入境货物检验检疫证明","useState":null,"formatVersion":"1.0","certNo":"222520211000253049001","originDeclNo":null,"deptCode":null,"assessDate":null,"destCountry":null}]}
+            searchResult = CertificateUtils.listPage(param.get("code"), param.get("cookie"), queryCode,certificateNo);
+            JSONObject resultObject = JSON.parseObject(searchResult);
+            String message = resultObject.getString("message");
+            if (!StringUtils.isEmpty(message) && message.contains("验证码不正确")) {
+                log.info("[检疫证书查询]失败,验证码错误...");
+                continue;
+            }
+            if (resultObject.getJSONArray("rows").size() < 1) {
+                log.info("[检疫证书查询]未查询到检疫证书,certificateNo = {}",certificateNo);
+                return null;
+            }
+            break;
+        }while (--retryCount > 0);
+        String certNo = RegexUtil.matchOne("(?<=\"certNo\":\")(.*?)(?=\\\")", searchResult);
+        String certFileSeqNo = RegexUtil.matchOne("(?<=\"certFileSeqNo\":\")(.*?)(?=\\\")", searchResult);
+        String serialNo = RegexUtil.matchOne("(?<=\"serialNo\":\")(.*?)(?=\\\")", searchResult);
+        String seqNo = RegexUtil.matchOne("(?<=\"seqNo\":\")(.*?)(?=\\\")", searchResult);
+        String downUrl = "https://swapp.singlewindow.cn/ecertwebunloginserver/sw/ecert/unlogin/downloadPDF/" + certNo + "/" + certFileSeqNo + "/" + serialNo + "/6" + "/" + seqNo;
+        if (certNo == null || certFileSeqNo == null || serialNo == null || seqNo == null)return null;
+        try {
+            HttpURLConnection connection = (HttpURLConnection)new URL(downUrl).openConnection();
+            if ("application/octet-stream;charset=UTF-8".equals(connection.getContentType()) && connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
+                log.info("[检疫证书查询]证书文件读取成功...");
+                return connection.getInputStream();
+            }
+            JSONObject logObj = new JSONObject();
+            logObj.put("ResponseCode",connection.getResponseCode());
+            logObj.put("ContentType",connection.getContentType());
+            log.info("[检疫证书查询]证书文件读取失败,{}",logObj.toJSONString());
+            return null;
+        } catch (IOException e) {
+            log.error("[检疫证书查询]下载链接请求异常,URL{}",downUrl);
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private String storage(long certificateId, String queryCode, String certificateNo, String ywbh, InputStream inputStream) {
+        File file = new File(certificateNo + ".pdf");
+        String path = file.getAbsolutePath();
+        try {
+            FileUtils.copyToFile(inputStream,file);
+            addRetryJob(CertificateRetryJob.uploadJob(certificateId, queryCode,certificateNo,path,ywbh,"上传至水果通失败"));
+            log.info("[检疫证书下载}本地存储成功,文件路径{}",path);
+            return path;
+        } catch (IOException e) {
+            //本地存储失败，添加下载重试任务
+            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode,certificateNo,ywbh,"检疫证书本地存储失败"));
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private FtpUtil getConnect(int count) {
+        FtpUtil ftpUtil = new FtpUtil();
+        boolean connect = false;
+        int retryConnect = 0;
+        do {
+            connect = ftpUtil.connect();
+            if (connect) break;
+            log.info("[建立FTP连接]失败,重试连接...");
+            try {
+                Thread.sleep(3000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        } while (++retryConnect <= count);
+        if (connect) {
+            return ftpUtil;
+        }
+        return null;
+    }
+
+    private void updateCertificateInfo(int businessState,Long infoId) {
+        CertificateDownloadInfo info = new CertificateDownloadInfo();
+        info.setBusinessState(businessState);
+        info.setUpdateTime(new Date());
+        if (infoId != null)info.setId(infoId);
+        certificateInfoDao.updateById(info);
+    }
+
+}
+
Index: src/main/java/com/novaone/service/impl/GrabPdfServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/GrabPdfServiceImpl.java	(版本 28937)
+++ src/main/java/com/novaone/service/impl/GrabPdfServiceImpl.java	(不存在的)
@@ -1,714 +0,0 @@
-package com.novaone.service.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Resource;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import org.openqa.selenium.remote.RemoteWebDriver;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.common.CommonInfo;
-import com.novaone.dao.DownCountMapper;
-import com.novaone.dao.DownInfoMapper;
-import com.novaone.entity.DownCount;
-import com.novaone.entity.DownInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.fdao.HddzMapper;
-import com.novaone.service.GrabPfdService;
-import com.novaone.util.CommonUtils;
-import com.novaone.util.FtpBatchUtil;
-import com.novaone.util.FtpUtil;
-import com.novaone.util.HttpUtil;
-import com.novaone.util.ImgUtil;
-
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-
-@Slf4j
-@Service("grabPfdService")
-public class GrabPdfServiceImpl implements GrabPfdService {
-
-    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
-    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
-    private static String savePath = CommonInfo.PDF_DOWN_LOCAL_URL + "\\";
-
-    @Resource
-    private GrabPfdService grabPfdService;
-
-    @Resource
-    private DownInfoMapper downInfoMapper;
-
-    @Resource
-    private DownCountMapper downCountMapper;
-
-    @Resource
-    private HddzMapper hddzMapper;
-
-    @Override
-    public void grabPdf(String startDate) {
-        DesiredCapabilities capabilities = setDownloadsPath();
-        WebDriver driver = null;
-
-        try {
-            driver = new RemoteWebDriver(new URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            // driver = new ChromeDriver(capabilities);
-            // 登录
-            grabPfdService.loginPageUrl(driver);
-            log.info("登录成功 grabPdf");
-            // 下载pdf 并上传ftp
-            downLoadPdf(driver, startDate);
-
-        } catch (Exception e) {
-        	log.info(""+e);
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downLoadPdf(下载pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:08:36
-     */
-    private void downLoadPdf(WebDriver driver, String startDate) throws Exception {
-        TimeUnit.SECONDS.sleep(2);
-        // 首先需要访问，获取Tiket等参数
-        driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-        TimeUnit.SECONDS.sleep(10);
-        // 获取token
-        driver.get(CommonInfo.PAGE_URL_PDF_SECOND);
-        TimeUnit.SECONDS.sleep(2);
-        // 日期范围
-        String stateDate = "";
-        if (CommonUtils.isEmpty(startDate)) {
-            stateDate = handleDateQueryParam();
-        } else {
-            stateDate = startDate;
-        }
-
-        File file = new File(savePath + stateDate);
-        if (!file.exists()) {
-            file.mkdirs();
-        }
-        // 查询所有分页查询参数
-        String dateParam = "&reportDateBegin=" + stateDate + "&reportDateEnd=" + stateDate;
-        // iframe子页面 获取页码
-        driver.get(CommonInfo.PAGE_URL_PDF_THIRD + dateParam);
-        TimeUnit.SECONDS.sleep(3);
-        driver.findElement(By.id("searchBtn")).click();
-        TimeUnit.SECONDS.sleep(2);
-        // 查询所有分页查询参数
-        Integer pageNum = handleQueryPageNum(driver);
-        if (CommonUtils.isEmpty(pageNum) || pageNum == 0) {
-            // 下载数量记录
-            recordCountDown(stateDate, pageNum);
-            log.info("queryDate:" + stateDate + " 未查询到数据");
-            return;
-        }
-        String param = "&recordperpage=" + pageNum;
-        driver.get(CommonInfo.PAGE_URL_ALL_PDF + dateParam + param);
-        WebElement tableList = driver.findElement(By.className("listTable"));
-        log.info("queryParam:" + dateParam + param);
-        List<WebElement> rows = tableList.findElements(By.tagName("tr"));
-        // 下载数量记录
-        recordCountDown(stateDate, pageNum);
-        // 从第二个input开始 到倒数第二个
-        for (int i = 1; i <= pageNum; i++) {
-            WebElement row = rows.get(i);
-            if (row != null) {
-                List<WebElement> tds = row.findElements(By.tagName("td"));
-                // 证书编号
-                String cerNum = tds.get(1).getText();
-                // 签证日期
-                String cerDate = tds.get(3).getText();
-                String fileName = cerNum + ".pdf";
-                // 获取jsessionID
-                String jsessionId = getJsessionId(driver);
-                try {
-                    String namePath = stateDate + "\\" + fileName;
-                    // 下载pdf
-                    httpDownload(cerNum, jsessionId, namePath);
-                    log.info("下载 证书编号完成：" + cerNum);
-                    // ftp文件上传
-                    ftpBatchUpload(namePath, fileName);
-                    log.info("ftp文件上传成功：:" + cerNum);
-                    // 日志记录
-                    recordDownloadInfo(cerNum, cerDate, CommonInfo.GRAB_STATUS_SUCCESS);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    log.info("");
-                    // 日志记录
-                    recordDownloadInfo(cerNum, cerDate, CommonInfo.GRAB_STATUS_ERROR);
-
-                }
-            }
-        }
-    }
-
-    /**
-     * 
-     * recordCountDown(记录当天下载数量)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws ParseException 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月26日 下午5:48:08
-     */
-    private void recordCountDown(String stateDate, Integer pageNum) throws ParseException {
-        DownCount downCount = new DownCount();
-        downCount.setId(UUID.randomUUID().toString());
-        downCount.setGrabCount(pageNum);
-        downCount.setGrabDate(sdf.parse(stateDate));
-        downCount.setCrtTime(new Date());
-        grabPfdService.insertCountDown(downCount);
-    }
-
-    /**
-     * 
-     * getJsessionId(获取jsessionID)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午8:09:03
-     */
-    private String getJsessionId(WebDriver driver) {
-        Cookie cookie = driver.manage().getCookieNamed("JSESSIONID");
-        String jsessionId = cookie.getValue();
-        return jsessionId;
-    }
-
-    /**
-     * 
-     * httpDownload(下载pdf)         
-     * @param jsessionId 
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午8:06:45
-     */
-    private void httpDownload(String cerNum, String jsessionId, String fileName) throws Exception {
-        String urlStr = "http://ccsehg.singlewindow.cn/ccsehg/controller?SERVICE_ID=APQS_DECLARE_MANAGE_DOWNLOAD_FILE_SERVICE&certNoN="
-                + cerNum;
-
-        Map<String, String> parameterMap = new HashMap<String, String>();
-        parameterMap.put("framework_buttonName", "");
-        parameterMap.put("certNo", "");
-        post(urlStr, parameterMap, jsessionId, fileName);
-    }
-
-    /**
-     * 
-     * post(下载pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月26日 下午1:22:55
-     */
-    private static void post(String urlStr, Map<String, String> parameterMap, String sessionId, String fileName)
-            throws IOException {
-
-        StringBuffer parameter = new StringBuffer();
-        for (Entry<String, String> entry : parameterMap.entrySet()) {
-            parameter.append("&" + entry.getKey() + "=" + entry.getValue());
-        }
-
-        OkHttpClient client = new OkHttpClient();
-
-        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
-        RequestBody body = RequestBody.create(mediaType, parameter.toString());
-        Request request = new Request.Builder().url(urlStr).post(body).addHeader("Cookie", "JSESSIONID=" + sessionId)
-                .addHeader("cache-control", "no-cache").build();
-
-        Response response = client.newCall(request).execute();
-
-        InputStream is = null;
-        byte[] buf = new byte[2048];
-        int len = 0;
-        FileOutputStream fos = null;
-        // 储存下载文件的目录
-        try {
-            is = response.body().byteStream();
-            File file = new File(savePath + fileName);
-            fos = new FileOutputStream(file);
-            while ((len = is.read(buf)) != -1) {
-                fos.write(buf, 0, len);
-            }
-            fos.flush();
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw e;
-        } finally {
-            try {
-                if (is != null)
-                    is.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-                throw e;
-            }
-            try {
-                if (fos != null)
-                    fos.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-                throw e;
-            }
-        }
-    }
-
-    /**
-     * 
-     * recordDownloadInfo(记录下载详情)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws ParseException 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午4:23:39
-     */
-    private void recordDownloadInfo(String cerNum, String stateDate, String status) throws ParseException {
-        DownInfo downInfo = new DownInfo();
-        downInfo.setId(UUID.randomUUID().toString());
-        downInfo.setCerNum(cerNum);
-        downInfo.setCrtTime(new Date());
-        if (!CommonUtils.isEmpty(stateDate)) {
-            downInfo.setGrabDate(sdf.parse(stateDate));
-        }
-        downInfo.setGrabStatus(status);
-        grabPfdService.insertDownInfo(downInfo);
-    }
-
-    /**
-     * 
-     * ftpUpload(ftp上传文件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午3:54:17
-     */
-    private void ftpBatchUpload(String namePath, String fileName) throws Exception {
-        FtpBatchUtil ftpUtil = new FtpBatchUtil();
-        File f = new File(savePath + namePath);
-        if (CommonUtils.isEmpty(f) || f.length() == 1) {
-            throw new Exception(fileName + " ftp 上传失败 文件大小为0kb！");
-        }
-        FileInputStream fileInputStream = new FileInputStream(savePath + namePath);
-        Map<String, InputStream> map = new HashMap<String, InputStream>();
-        map.put(fileName, fileInputStream);
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            boolean upStatus = ftpUtil.upload(map);
-            if (!upStatus) {
-                throw new Exception("ftp 文件上传失败");
-            }
-        } else {
-            throw new Exception("ftp 连接失败");
-        }
-
-    }
-
-    /**
-     * 
-     * ftpUpload(ftp上传文件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午3:54:17
-     */
-    private void ftpUpload(String namePath, String fileName) throws Exception {
-        FtpUtil ftpUtil = new FtpUtil();
-        File f = new File(savePath + namePath);
-        if (CommonUtils.isEmpty(f) || f.length() == 1) {
-            throw new Exception(fileName + " ftp 上传失败 文件大小为0kb！");
-        }
-        FileInputStream fileInputStream = new FileInputStream(savePath + namePath);
-        Map<String, InputStream> map = new HashMap<String, InputStream>();
-        map.put(fileName, fileInputStream);
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            boolean upStatus = ftpUtil.upload(map);
-            if (!upStatus) {
-                throw new Exception("ftp 文件上传失败");
-            }
-        } else {
-            throw new Exception("ftp 连接失败");
-        }
-
-    }
-
-    /**
-     * 
-     * handleDateQueryParam(日期查询条件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午1:11:52
-     */
-    private String handleDateQueryParam() {
-        LocalDate currentTime = LocalDate.now();
-        // LocalDate startLocal =
-        // currentTime.minusDays(CommonInfo.QUERY_DATE_TIMES);
-        String stateDate = currentTime.format(formatter);
-        return stateDate;
-    }
-
-    /**
-     * 
-     * judgeFileIsExist(判断文件是否下载完成)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 上午10:53:04
-     */
-    @SuppressWarnings("unused")
-    private boolean judgeFileIsExist(String downFileName, int times) throws Exception {
-        TimeUnit.SECONDS.sleep(2);
-        if (times < 0) {
-            throw new Exception("judgeFileIsExist:一直未下载成功：" + downFileName);
-        }
-        File file = new File(CommonInfo.PDF_DOWN_LOCAL_URL + downFileName);
-        if (file.exists()) {
-            return true;
-        } else {
-            TimeUnit.SECONDS.sleep(5);
-            times = times - 1;
-            return judgeFileIsExist(downFileName, times);
-        }
-    }
-
-    /**
-     * 
-     * handleQueryParam(组装查询参数)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:12:09
-     */
-    private Integer handleQueryPageNum(WebDriver driver) {
-        String pageNum = driver.findElement(By.className("listTableButtonTd")).getText();
-        // 总条数
-        int strStartIndex = pageNum.indexOf("共") + 1;
-        int strEndIndex = pageNum.indexOf("条");
-        String newPageNum = pageNum.substring(strStartIndex, strEndIndex);
-        strStartIndex = newPageNum.indexOf("共") + 1;
-        /* 开始截取 */
-        pageNum = newPageNum.substring(strStartIndex);
-        return Integer.parseInt(pageNum);
-    }
-
-    /**
-     * 
-     * loginPageUrl(登录单一窗口)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:03:04
-     */
-    @Override
-    public void loginPageUrl(WebDriver driver) throws Exception {
-        // 设置打开窗口大小
-        driver.get(CommonInfo.PAGE_URL_LOGIN);
-        TimeUnit.SECONDS.sleep(3);
-        Set<Cookie> cookies = driver.manage().getCookies();
-        String cookieStr = "";
-        for (Cookie cookie : cookies) {
-            cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + "; ";
-        }
-        int num = 3;
-        getCodeAndLogin(driver, cookieStr, num);
-    }
-
-    /**
-     * 
-     * getCode(获取验证码并登录)         
-     * @param cookieStr 
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:09:52
-     */
-    private void getCodeAndLogin(WebDriver driver, String cookieStr, int num) throws Exception {
-        if (num < 0) {
-            return;
-        }
-        num = num - 1;
-        driver.findElement(By.id("verifyCode")).clear();
-        driver.findElement(By.id("swm1")).clear();
-        driver.findElement(By.id("swm2")).clear();
-        driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-        // 获取验证码
-        String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL, cookieStr);
-        String code = platGetCode(fileName);
-        try {
-            driver.findElement(By.id("verifyCode")).sendKeys(code);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.findElement(By.id("sub3")).click();
-            TimeUnit.SECONDS.sleep(5);
-
-            String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-            if (!CommonUtils.isEmpty(errorMsg) || CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-                log.info("验证码识别失败");
-                getCodeAndLogin(driver, cookieStr, num);
-            }
-        } catch (NoSuchElementException e) {
-            log.info("验证码识别成功");
-        }
-    }
-
-    /**
-     * 
-     * setDownloadsPath(设置chrome下载地址)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:07:25
-     */
-    private DesiredCapabilities setDownloadsPath() {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        // 设置为 headless 模式 （无头浏览器）
-        options.addArguments("headless");
-        // 由于新旧版本问题,两个都弄上
-        caps.setCapability("goog:chromeOptions", options);
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-
-    @Transactional
-    @Override
-    public void insertDownInfo(DownInfo downInfo) {
-        downInfoMapper.insertSelective(downInfo);
-    }
-
-    @Transactional
-    @Override
-    public void insertCountDown(DownCount downCount) {
-        downCountMapper.insertSelective(downCount);
-    }
-
-    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
-    @Override
-    public List<Hddz> queryAllNeedPdfBjh() {
-        return hddzMapper.queryAllNeedPdfBjh();
-    }
-
-    @Override
-    public void grabPdfSingle(List<Hddz> listBjh) {
-        DesiredCapabilities capabilities = setDownloadsPath();
-        // 由于新旧版本问题,两个都弄上
-        WebDriver driver = null;
-
-        try {
-            driver = new RemoteWebDriver(new URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            // driver = new ChromeDriver(capabilities);
-            // 登录
-            grabPfdService.loginPageUrl(driver);
-            log.info("登录成功 grabPdfSingle");
-            // 下载pdf 并上传ftp
-            downLoadPdfByBjh(driver, listBjh);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downLoadPdfByBjh(根据报检号下载检疫证)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws InterruptedException 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月11日 下午5:24:06
-     */
-    private void downLoadPdfByBjh(WebDriver driver, List<Hddz> listBjh) throws Exception {
-        // 首先需要访问，获取Tiket等参数
-        driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-        TimeUnit.SECONDS.sleep(10);
-        // 获取token
-        driver.get(CommonInfo.PAGE_URL_PDF_SECOND);
-        TimeUnit.SECONDS.sleep(2);
-        driver.switchTo().frame("config_manufacturer");
-        TimeUnit.SECONDS.sleep(1);
-
-        for (Hddz hddz : listBjh) {
-            String bjh = hddz.getPdfbjh();
-            log.info("bjh:" + bjh + " 开始抓取。");
-            try {
-                grabPfdService.grabByBjh(driver, bjh);
-                log.info("bjh:" + bjh + " 抓取结束。");
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error("bjh:" + bjh + " 抓取异常。");
-            }
-
-        }
-
-    }
-
-    @Override
-    public void grabByBjh(WebDriver driver, String bjh) throws Exception {
-        driver.findElement(By.name("resetSearch")).click();
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.name("certNo")).sendKeys(bjh);
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.name("dataSearch")).click();
-        TimeUnit.SECONDS.sleep(1);
-        WebElement tableList = driver.findElement(By.className("listTable"));
-
-        List<WebElement> rows = tableList.findElements(By.tagName("tr"));
-        // 从第二个input开始 到倒数第二个
-        WebElement row = rows.get(1);
-        if (row != null) {
-            List<WebElement> tds = row.findElements(By.tagName("td"));
-            if (CommonUtils.isEmpty(tds) || tds.size() == 1) {
-                log.info("bjh:" + bjh + " 报检号未查询到数据");
-                return;
-            }
-            WebElement input = row.findElement(By.tagName("input"));
-            boolean flag = input.isSelected();
-            if (!flag) {
-                input.click();
-                driver.findElement(By.name("downButton")).click();
-                String cerNum = tds.get(1).getText();
-                String fileName = cerNum + ".pdf";
-                log.info("下载 证书编号完成：" + cerNum);
-                TimeUnit.SECONDS.sleep(3);
-                try {
-                    new File(savePath + fileName);
-                } catch (Exception e) {
-                    TimeUnit.SECONDS.sleep(5);
-                    log.error("bjh:" + bjh + " " + e.getMessage());
-                    e.printStackTrace();
-                }
-                // ftp文件上传
-                ftpUpload(fileName, fileName);
-                log.info("ftp文件上传成功：:" + cerNum);
-                recordDownloadInfo(cerNum, null, CommonInfo.GRAB_STATUS_SUCCESS);
-            }
-        }
-    }
-
-    private String platGetCode(String fileName) throws Exception {
-        // 你的用户名
-        String username = CommonInfo.PLATCODE_USER_NAME;
-        // 你的密码
-        String password = CommonInfo.PLATCODE_PASSWORD;
-        // 图片转换过的base64编码
-        String image = ImgUtil.convertFileToBase64(fileName);
-        File file = new File(fileName);
-        JSONObject obj = new JSONObject();
-        obj.put("username", username);
-        obj.put("password", password);
-        obj.put("typeid", "7");
-        String code = "";
-        obj.put("image", image);
-        try {
-            String url = CommonInfo.PALTCODE_API_URL;
-            String ret = HttpUtil.postJson(url, obj);
-            log.info("plat code result:" + ret);
-            JSONObject jsonObject = JSONObject.parseObject(ret);
-            if (jsonObject.getBoolean("success")) {
-                code = jsonObject.getJSONObject("data").getString("result");
-                log.info("识别成功" + code);
-                return code;
-            } else {
-                log.info("识别失败原因为:" + jsonObject.getString("message"));
-            }
-        } catch (Exception e) {
-            throw e;
-        } finally {
-            if (!CommonUtils.isEmpty(file)) {
-                file.delete();
-            }
-        }
-        return code;
-
-    }
-
-}
Index: src/main/java/com/novaone/service/impl/HddzServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/HddzServiceImpl.java	(不存在的)
+++ src/main/java/com/novaone/service/impl/HddzServiceImpl.java	(版本 28938)
@@ -0,0 +1,65 @@
+package com.novaone.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.novaone.entity.Hddz;
+import com.novaone.entity.HddzOcrwjsb;
+import com.novaone.fdao.HddzDao;
+import com.novaone.fdao.HddzOcrwjsbDao;
+import com.novaone.service.HddzService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-27 09:17
+ */
+@Slf4j
+@Service
+public class HddzServiceImpl implements HddzService {
+
+    private final String BASE_PATH = "http://www.fruitease.com:8009/wenjian/CIQ TAX/";
+
+    @Autowired
+    private HddzDao hddzDao;
+    @Autowired
+    private HddzOcrwjsbDao hddzOcrwjsbDao;
+
+
+    @Override
+    public void addQueryCode(Hddz hddz) {
+        hddzDao.update(hddz);
+    }
+
+    @Override
+    @Transactional
+    public void uploadSuccessful(Hddz hddz,String fileName) {
+        HddzOcrwjsb hddzOcrwjsb = new HddzOcrwjsb();
+        hddzOcrwjsb.setWjmc(fileName);//文件名称
+        hddzOcrwjsb.setZbrq(new Date());
+        hddzOcrwjsb.setWjlx("检验检疫证书");
+        hddzOcrwjsb.setYwbh(hddz.getYwbh());
+        hddzOcrwjsb.setSfcz("Y");
+        hddzOcrwjsb.setWjlj(BASE_PATH+fileName);//FTP服务的文件访问路径
+        hddzDao.update(hddz);
+        hddzOcrwjsbDao.add(hddzOcrwjsb);
+        log.info("---文件上传--- SqlServer数据回写成功,hddz = "+ JSON.toJSONString(hddz)+" hddzOcrwjsb = "+JSON.toJSONString(hddzOcrwjsb));
+    }
+
+    @Override
+    public void uploadSuccessful(Hddz hddz) {
+        this.uploadSuccessful(hddz,hddz.getJyjyzs());
+    }
+
+    @Override
+    public List<Hddz> findByBgdh(String bgdh) {
+        return hddzDao.findByBgdh(bgdh);
+    }
+}
Index: src/main/java/com/novaone/service/impl/NewGrabPfdServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/NewGrabPfdServiceImpl.java	(版本 28937)
+++ src/main/java/com/novaone/service/impl/NewGrabPfdServiceImpl.java	(不存在的)
@@ -1,532 +0,0 @@
-package com.novaone.service.impl;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.ConnectException;
-import java.net.URL;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.temporal.ChronoUnit;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Resource;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-import org.openqa.selenium.remote.RemoteWebDriver;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.entity.DownCount;
-import com.novaone.entity.DownInfo;
-import com.novaone.entity.Hddz;
-import com.novaone.service.GrabPfdService;
-import com.novaone.service.NewGrabPfdService;
-import com.novaone.util.CommonUtils;
-import com.novaone.util.FtpBatchUtil;
-import com.novaone.util.FtpException;
-import com.novaone.util.FtpUtil;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Service("newGrabPfdService")
-public class NewGrabPfdServiceImpl implements NewGrabPfdService {
-
-    private static String savePath = CommonInfo.PDF_DOWN_LOCAL_URL + "\\";
-
-    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
-    @Resource
-    private GrabPfdService grabPfdService;
-
-    @Resource
-    private NewGrabPfdService newGrabPfdService;
-
-    @Override
-    public void grabPdf(String startDate) {
-        String downloadsPath = savePath;
-        DesiredCapabilities capabilities = setDownloadsPath(downloadsPath);
-        WebDriver driver = null;
-
-        try {
-            driver = new RemoteWebDriver(new URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            // driver = new ChromeDriver(capabilities);
-            // 登录
-            grabPfdService.loginPageUrl(driver);
-            log.info("登录成功");
-            // 打开网站
-            driver.get(CommonInfo.NEW_PAGE_URL_PDF);
-            TimeUnit.SECONDS.sleep(3);
-            // 下载当天所有pdf
-            downAllLoadPdf(driver, startDate);
-        } catch (Exception e) {
-        	log.info("异常====",e);
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downAllLoadPdf(下载当前pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:21:43
-     */
-    private void downAllLoadPdf(WebDriver driver, String startDate) throws Exception {
-        // 获取查询参数并查询
-        handleParamAndQuery(driver, startDate);
-        // 点击最大分页并查询
-        queryMorePageData(driver);
-        if (CommonUtils.isEmpty(startDate)) {
-            startDate = LocalDate.now().toString();
-        }
-
-        try {
-            // 总条数
-            Integer pageNum = handleQueryPageNum(driver);
-            if (CommonUtils.isEmpty(pageNum) || pageNum == 0) {
-                log.info("queryDate:" + startDate + " 未查询到数据");
-                return;
-            }
-            // 下载数量记录
-            newGrabPfdService.recordCountDown(startDate, pageNum);
-        } catch (Exception e) {
-            log.error("startDate:" + startDate + " pageNum获取失败：" + e.getMessage());
-        }
-        List<WebElement> trList = driver.findElements(By.name("downloadPDF"));
-        for (WebElement tr : trList) {
-            String cerNum = "";
-            try {
-                String downStr = tr.getAttribute("onclick");
-                // 获取检疫证号
-                cerNum = handleDownStr(downStr);
-                if (CommonUtils.isEmpty(cerNum)) {
-                    log.info("cerNum 获取失败  为空，cerNum：" + cerNum);
-                    continue;
-                }
-                tr.click();
-                String fileName = cerNum + ".pdf";
-                log.info("下载 证书编号完成：" + cerNum);
-                TimeUnit.SECONDS.sleep(3);
-                String namePath = fileName;
-                try {
-                    new File(savePath + namePath);
-                } catch (Exception e) {
-                    TimeUnit.SECONDS.sleep(5);
-                    log.error("bjh:" + cerNum + " " + e.getMessage());
-                    e.printStackTrace();
-                }
-                TimeUnit.SECONDS.sleep(2);
-                log.info("下载 证书编号完成：" + cerNum);
-                // ftp文件上传
-                ftpBatchUpload(namePath, fileName);
-                log.info("ftp文件上传成功：:" + cerNum);
-                // 日志记录
-                newGrabPfdService.recordDownloadInfo(cerNum, startDate, CommonInfo.GRAB_STATUS_SUCCESS, "有效", null);
-            } catch (FtpException e) {
-                e.printStackTrace();
-                // 日志记录
-                newGrabPfdService.recordDownloadInfo(cerNum, startDate, CommonInfo.GRAB_STATUS_FTP_DAY_ERROR, "1",
-                        e.getMessage());
-
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error(e.getMessage(), e);
-                // 日志记录
-                newGrabPfdService.recordDownloadInfo(cerNum, startDate, CommonInfo.GRAB_STATUS_ERROR, "1",
-                        e.getMessage());
-
-            }
-        }
-    }
-
-    /**
-     * 
-     * ftpUpload(ftp上传文件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午3:54:17
-     */
-    private void ftpBatchUpload(String namePath, String fileName) throws Exception {
-        FtpBatchUtil ftpUtil = new FtpBatchUtil();
-        File f = new File(savePath + namePath);
-        if (CommonUtils.isEmpty(f) || f.length() == 1) {
-            throw new Exception(fileName + " ftp 上传失败 文件大小为0kb！");
-        }
-        FileInputStream fileInputStream = new FileInputStream(savePath + namePath);
-        Map<String, InputStream> map = new HashMap<String, InputStream>();
-        map.put(fileName, fileInputStream);
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            boolean upStatus = ftpUtil.upload(map);
-            if (!upStatus) {
-                throw new FtpException("ftpBatchUpload", "ftp 文件上传失败");
-            }
-        } else {
-            throw new FtpException("ftpBatchUpload", "ftp 连接失败");
-        }
-
-    }
-
-    /**
-     * 
-     * recordCountDown(记录下载数量)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:47:34
-     */
-    @Transactional
-    @Override
-    public void recordCountDown(String stateDate, Integer pageNum) throws ParseException {
-        DownCount downCount = new DownCount();
-        downCount.setId(UUID.randomUUID().toString());
-        downCount.setGrabCount(pageNum);
-        downCount.setGrabDate(sdf.parse(stateDate));
-        downCount.setCrtTime(new Date());
-        grabPfdService.insertCountDown(downCount);
-    }
-
-    /**
-     * 
-     * queryMorePageData(点击最大分页并查询)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:45:43
-     */
-    private void queryMorePageData(WebDriver driver) {
-        try {
-            String queryResult = driver.findElement(By.className("no-records-found")).getText();
-            if ("暂无数据".equals(queryResult)) {
-                log.info("批量下载  暂无数据");
-                return;
-            }
-        } catch (Exception e) {
-        }
-        try {
-            // 点击分页按钮
-            driver.findElement(By.xpath(
-                    "//span[@class='btn-group dropup']/button[@class='btn btn-default  btn-outline dropdown-toggle']"))
-                    .click();
-            TimeUnit.MILLISECONDS.sleep(800);
-            WebElement ul = driver.findElement(By.xpath("//span[@class='btn-group dropup open']//ul"));
-            List<WebElement> lis = ul.findElements(By.tagName("li"));
-            // 选择最后分页
-            lis.get(lis.size() - 1).click();
-            TimeUnit.SECONDS.sleep(5);
-            log.info("有分页");
-        } catch (Exception e) {
-            log.info("无分页");
-        }
-
-    }
-
-    /**
-     * 
-     * handleParamAndQuery(获取查询参数并查询)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:44:08
-     */
-    private void handleParamAndQuery(WebDriver driver, String startDate) throws Exception {
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("ecertLoginClear")).click();
-        TimeUnit.MILLISECONDS.sleep(100);
-        // 开始日期
-        driver.findElement(By.id("reportDate")).clear();
-        if (CommonUtils.isEmpty(startDate)) {
-            TimeUnit.MILLISECONDS.sleep(100);
-            LocalDate localDate = LocalDate.now();
-            driver.findElement(By.id("reportDate")).sendKeys(localDate.toString());
-        } else {
-            TimeUnit.MILLISECONDS.sleep(100);
-            // 结束日期
-            driver.findElement(By.id("reportDateEnd")).clear();
-            TimeUnit.MILLISECONDS.sleep(100);
-            driver.findElement(By.id("reportDate")).sendKeys(startDate);
-            TimeUnit.MILLISECONDS.sleep(100);
-            driver.findElement(By.id("reportDateEnd")).sendKeys(startDate);
-        }
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("ecertLoginQuery")).click();
-        TimeUnit.SECONDS.sleep(5);
-
-    }
-
-    /**
-     * 
-     * handleQueryPageNum(获取批量下载总条数)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:36:42
-     */
-    private Integer handleQueryPageNum(WebDriver driver) {
-        String pageNum = driver.findElement(By.className("pagination-info")).getText();
-        // 总条数
-        int strStartIndex = pageNum.indexOf("共") + 1;
-        int strEndIndex = pageNum.indexOf("条");
-        String newPageNum = pageNum.substring(strStartIndex, strEndIndex);
-        strStartIndex = newPageNum.indexOf("共") + 1;
-        /* 开始截取 */
-        pageNum = newPageNum.substring(strStartIndex);
-        return Integer.parseInt(pageNum.trim());
-    }
-
-    /**
-     * 
-     * handleDownStr(获取报检号)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月21日 下午2:35:45
-     */
-    private static String handleDownStr(String downStr) {
-        if (CommonUtils.isEmpty(downStr)) {
-            return "";
-        }
-        downStr = downStr.replace("downloadPDF(", "").replace(")", "").replace("'", "");
-        return downStr.split(",")[0];
-    }
-
-    @Override
-    public void grabPdfSingle(List<Hddz> list) {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        DesiredCapabilities capabilities = setDownloadsPath(downloadsPath);
-        // 由于新旧版本问题,两个都弄上
-        WebDriver driver = null;
-
-        try {
-            driver = new RemoteWebDriver(new URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            // driver = new ChromeDriver(capabilities);
-            // 登录
-            grabPfdService.loginPageUrl(driver);
-            log.info("登录成功 grabPdfSingle");
-            // 打开网站
-            driver.get(CommonInfo.NEW_PAGE_URL_PDF);
-            // 下载pdf 并上传ftp
-            downLoadPdfByBjh(driver, list);
-        } catch (Exception e) {
-        	try {
-				newGrabPfdService.recordDownloadInfo("", null, CommonInfo.GRAB_STATUS_WEB_ERROR, "网站崩溃或超时", "");
-			} catch (ParseException e1) {
-				// TODO Auto-generated catch block
-				log.info("网站崩溃或超时-写入数据库异常",e1);
-				e1.printStackTrace();
-			}
-            log.error("grabPdfSingle网站崩溃或超时", e.getMessage());
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downLoadPdfByBjh(根据报检号下载)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2021年1月20日 下午2:06:44
-     */
-    private void downLoadPdfByBjh(WebDriver driver, List<Hddz> list) throws Exception {
-        // 默认查询前30天
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("reportDate")).clear();
-        LocalDate localDate = LocalDate.now();
-        String startDateParam = localDate.minus(30, ChronoUnit.DAYS).toString();
-        driver.findElement(By.id("reportDate")).sendKeys(startDateParam);
-        for (Hddz hddz : list) {
-            TimeUnit.SECONDS.sleep(1);
-            String bjh = hddz.getPdfbjh();
-            log.info("bjh:" + bjh + " 开始抓取。");
-            try {
-                grabByBjh(driver, bjh);
-                log.info("bjh:" + bjh + " 抓取结束。");
-            } catch (ConnectException e) {
-                e.printStackTrace();
-                log.error("ConnectException bjh:" + bjh + " 抓取异常。" + e.getMessage());
-                driver.get(CommonInfo.NEW_PAGE_URL_PDF);
-                // 默认查询前30天
-                TimeUnit.MILLISECONDS.sleep(300);
-                driver.findElement(By.id("reportDate")).clear();
-                driver.findElement(By.id("reportDate")).sendKeys(startDateParam);
-            } catch (Exception e) {
-                e.printStackTrace();
-                newGrabPfdService.recordDownloadInfo(bjh, null, CommonInfo.GRAB_STATUS_ERROR, "抓取异常", "");
-                log.error("Exception bjh:" + bjh + " 抓取异常。" + e.getMessage());
-            }
-
-        }
-
-    }
-
-    private void grabByBjh(WebDriver driver, String bjh) throws Exception {
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("certNo")).clear();
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("certNo")).sendKeys(bjh);
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("ecertLoginQuery")).click();
-        TimeUnit.SECONDS.sleep(2);
-        try {
-            String queryResult = driver.findElement(By.className("no-records-found")).getText();
-            if ("暂无数据".equals(queryResult)) {
-                log.info("bjh:" + bjh + " 暂无数据");
-                return;
-            }
-        } catch (Exception e) {
-        }
-        String cerStatus = "";
-        try {
-            cerStatus = driver.findElement(By.xpath("//*[@id='ecertLoginQueryTable']/tbody/tr/td[5]")).getText();
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("检疫证有效状态未抓到：" + e.getMessage());
-            cerStatus = "未抓到";
-        }
-        driver.findElement(By.name("downloadPDF")).click();
-        String cerNum = bjh;
-        String fileName = cerNum + ".pdf";
-        log.info("下载 证书编号完成：" + cerNum);
-        TimeUnit.SECONDS.sleep(3);
-        try {
-            File f = new File(savePath + fileName);
-            if (!f.exists()) {
-                log.info("bjh:" + bjh + " 文件不存在，尝试确认");
-                TimeUnit.MILLISECONDS.sleep(200);
-                // 证书尚未生成，请稍后再试 点击确认
-                clickNotPdfConfirm(driver);
-                TimeUnit.SECONDS.sleep(5);
-                return;
-            }
-        } catch (Exception e) {
-            log.error("bjh:" + bjh + " " + e.getMessage());
-            e.printStackTrace();
-        }
-        // ftp文件上传
-        ftpUpload(fileName, fileName);
-        log.info("ftp文件上传成功：:" + cerNum);
-        newGrabPfdService.recordDownloadInfo(cerNum, null, CommonInfo.GRAB_STATUS_SUCCESS, cerStatus, "");
-    }
-
-    // 证书尚未生成请稍后再试，点击确认
-    private void clickNotPdfConfirm(WebDriver driver) {
-        try {
-            driver.findElement(By.className("layui-layer-btn0")).click();
-        } catch (Exception e) {
-            log.error("不存在 弹框");
-        }
-    }
-
-    @Transactional
-    @Override
-    public void recordDownloadInfo(String cerNum, String stateDate, String status, String cerStatus, String msg)
-            throws ParseException {
-        DownInfo downInfo = new DownInfo();
-        downInfo.setId(UUID.randomUUID().toString());
-        downInfo.setCerNum(cerNum);
-        downInfo.setCrtTime(new Date());
-        if (!CommonUtils.isEmpty(msg)) {
-            downInfo.setMsg(CommonUtils.handleToStr(msg));
-        }
-        if (!CommonUtils.isEmpty(stateDate)) {
-            downInfo.setGrabDate(sdf.parse(stateDate));
-        }
-        if (!CommonUtils.isEmpty(cerStatus)) {
-            downInfo.setCerStatus(cerStatus);
-        }
-        downInfo.setGrabStatus(status);
-        grabPfdService.insertDownInfo(downInfo);
-    }
-
-    private void ftpUpload(String namePath, String fileName) throws Exception {
-        FtpUtil ftpUtil = new FtpUtil();
-        File f = new File(savePath + namePath);
-        if (CommonUtils.isEmpty(f) || f.length() == 1) {
-            throw new Exception(fileName + " ftp 上传失败 文件大小为0kb！");
-        }
-        FileInputStream fileInputStream = new FileInputStream(savePath + namePath);
-        Map<String, InputStream> map = new HashMap<String, InputStream>();
-        map.put(fileName, fileInputStream);
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            boolean upStatus = ftpUtil.upload(map);
-            if (!upStatus) {
-                throw new FtpException("ftpBatchUpload", "ftp 文件上传失败");
-            }
-        } else {
-            throw new FtpException("ftpBatchUpload", "ftp 连接失败");
-        }
-
-    }
-
-    /**
-     * 
-     * setDownloadsPath(设置chrome下载地址)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:07:25
-     */
-    private DesiredCapabilities setDownloadsPath(String downloadsPath) {
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        // 设置为 headless 模式 （无头浏览器）
-        // options.addArguments("headless");
-        // 由于新旧版本问题,两个都弄上
-        caps.setCapability("goog:chromeOptions", options);
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-
-}
Index: src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java	(不存在的)
+++ src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java	(版本 28938)
@@ -0,0 +1,188 @@
+package com.novaone.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.novaone.dao.CertificateDownloadInfoDao;
+import com.novaone.dao.QueryCodeJobDao;
+import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.Hddz;
+import com.novaone.entity.QueryCodeRetryJob;
+import com.novaone.entity.SmsInfo;
+import com.novaone.service.HddzService;
+import com.novaone.service.QueryCodeService;
+import com.novaone.service.SmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 查询码操作业务实现
+ * @author: Ma.ChengJian
+ * @create: 2021-10-26 15:40
+ */
+@Slf4j
+@Service
+public class QueryCodeServiceImpl implements QueryCodeService {
+    @Autowired
+    private HddzService hddzService;
+    @Autowired
+    private SmsService smsService;
+    @Autowired
+    private QueryCodeJobDao queryCodeJobDao;
+    @Autowired
+    private CertificateDownloadInfoDao certificateInfoDao;
+
+
+    @Override
+    @Transactional
+    public void saveQueryCode(SmsInfo smsInfo) {
+        Long id = smsInfo.getId();
+        Date date = smsInfo.getDate();
+        String queryCode = smsInfo.getQueryCode();
+        String certificateNo = smsInfo.getCertificateNo();
+        String bgdh = certificateNo.substring(0, certificateNo.length() - 3);
+        CertificateDownloadInfo certificateInfo = new CertificateDownloadInfo();
+        Hddz byBgdh = null;
+        try {
+            List<Hddz> hddzList = hddzService.findByBgdh(bgdh);
+            if (hddzList.size() > 1) {
+                byBgdh = new Hddz();
+                certificateInfo.setYwbh("bgdh重复");
+                certificateInfo.setBusinessState(3);
+                log.error("[查询码写入]存在报关单号重复的数据,bgdh={},查询到{}条数据",bgdh,hddzList.size());
+            }else {
+                byBgdh = hddzList.get(0);
+                byBgdh.setJyjyzscxm(queryCode);
+                byBgdh.setBgdh(bgdh);
+                hddzService.addQueryCode(byBgdh);
+                certificateInfo.setYwbh(byBgdh.getYwbh());
+                certificateInfo.setBusinessState(-1);
+            }
+        } catch (Exception e) {
+            log.error("[查询码写入]数据库写入失败,hddz={}",JSON.toJSONString(byBgdh));
+            e.printStackTrace();
+            addRetryJob(smsInfo,e.getMessage());
+            return;
+        }
+
+        certificateInfo.setCertificateNo(certificateNo);
+        certificateInfo.setQueryCode(queryCode);
+        certificateInfo.setReceiveTime(date);
+        certificateInfo.setSmsId(id);
+        certificateInfo.setUpdateTime(new Date());
+        certificateInfo.setCreateTime(new Date());
+        smsService.save(certificateInfo);
+        log.info("[查询码写入]数据库写入成功hddz{} certificateDownloadInformation={}",JSON.toJSONString(byBgdh),JSON.toJSONString(certificateInfo));
+    }
+
+    @Override
+    public void saveList(Set<SmsInfo> smsList) {
+        log.info("[查询码批量写入]APP端推送短信{}条",smsList.size());
+        int count = removeDuplication(smsList);
+        log.info("[查询码批量写入]去除重复数据{}条",count);
+        for (SmsInfo v : smsList) {
+            saveQueryCode(v);
+        }
+        log.info("[查询码批量写入]执行结束...");
+    }
+
+
+
+    @Override
+    @Transactional
+    public void retrySave(QueryCodeRetryJob job) {
+        String certificateNo = job.getCertificateNo();
+        String queryCode = job.getQueryCode();
+        Long smsID = job.getSmsId();
+        Date receiveTime = job.getReceiveTime();
+        String bgdh = certificateNo.substring(0, certificateNo.length() - 3);
+        CertificateDownloadInfo Info = new CertificateDownloadInfo();
+        Hddz byBgdh = null;
+        try {
+            List<Hddz> list = hddzService.findByBgdh(bgdh);
+            if (list.size() > 1) {
+                byBgdh = new Hddz();
+                byBgdh.setBgdh("存在重复");
+                Info.setBusinessState(3);
+                log.error("[查询码写入重试]存在报关单号重复的数据,bgdh{}查询到{}条数据",bgdh,list.size());
+            }else {
+                byBgdh = list.get(0);
+                byBgdh.setJyjyzscxm(queryCode);
+                byBgdh.setBgdh(bgdh);
+                hddzService.addQueryCode(byBgdh);
+            }
+        } catch (Exception e) {
+            log.error("[查询码写入重试]数据库写入失败,hddz{}",JSON.toJSONString(byBgdh));
+            e.printStackTrace();
+            job.setMessage(e.getMessage());
+            job.setUpdateTime(new Date());
+            job.setRetryCount(Optional.ofNullable(job.getRetryCount()).orElse(0)+1);
+            queryCodeJobDao.updateById(job);
+            return;
+        }
+        Info.setCertificateNo(certificateNo);
+        Info.setQueryCode(queryCode);
+        Info.setReceiveTime(receiveTime);
+        Info.setSmsId(smsID);
+        Info.setYwbh(byBgdh.getYwbh());
+        Info.setBusinessState(-1);
+        Info.setUpdateTime(new Date());
+        Info.setCreateTime(new Date());
+        smsService.save(Info);
+        log.info("[查询码写入重试]数据库写入成功hddz{} certificateDownloadInformation{}",JSON.toJSONString(byBgdh),JSON.toJSONString(Info));
+        queryCodeJobDao.deleteById(job);
+    }
+
+    @Override
+    public List<QueryCodeRetryJob> findAll() {
+        return queryCodeJobDao.find();
+    }
+
+
+    @Override
+    public void addRetryJob(SmsInfo smsInfo,String message) {
+        QueryCodeRetryJob queryCodeRetryJob = new QueryCodeRetryJob();
+        queryCodeRetryJob.setQueryCode(smsInfo.getQueryCode());
+        queryCodeRetryJob.setCertificateNo(smsInfo.getCertificateNo());
+        queryCodeRetryJob.setReceiveTime(smsInfo.getDate());
+        queryCodeRetryJob.setSmsId(smsInfo.getId());
+        queryCodeRetryJob.setRetryCount(0);
+        queryCodeRetryJob.setCreateTime(new Date());
+        queryCodeRetryJob.setUpdateTime(new Date());
+        queryCodeRetryJob.setMessage(message);
+        queryCodeJobDao.add(queryCodeRetryJob);
+        log.info("添加查询码重试任务，queryCodeRetryJob = "+JSON.toJSONString(queryCodeRetryJob));
+    }
+
+
+    private int removeDuplication(Set<SmsInfo> smsList) {
+        Iterator<SmsInfo> iterator = smsList.iterator();
+        Date date= iterator.next().getDate();
+        while (iterator.hasNext()) {
+            SmsInfo smsInfo = iterator.next();
+            if (smsInfo.getDate().before(date)) date = smsInfo.getDate();
+        }
+        List<CertificateDownloadInfo> list = certificateInfoDao.findReceiveTimeLater(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date));
+        AtomicInteger count = new AtomicInteger();
+        smsList.removeIf(item -> {
+            boolean flag = false;
+            int index = 0;
+            for (int i = 0; i < list.size(); i++) {
+                if (list.get(i).getSmsId().equals(item.getId()) && list.get(i).getQueryCode().equals(item.getQueryCode())  && list.get(i).getCertificateNo().equals(item.getCertificateNo())){
+                    flag = true;
+                    count.getAndIncrement();
+                    index = i;
+                    break;
+                }
+            }
+            if (flag)list.remove(index);
+            return flag;
+        });
+        return count.get();
+    }
+}
Index: src/main/java/com/novaone/service/impl/SmsServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/SmsServiceImpl.java	(不存在的)
+++ src/main/java/com/novaone/service/impl/SmsServiceImpl.java	(版本 28938)
@@ -0,0 +1,27 @@
+package com.novaone.service.impl;
+
+import com.novaone.dao.CertificateDownloadInfoDao;
+import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.service.SmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/*
+ * @program: ccsehgpdf
+ * @description:
+ * @author: Ma.ChengJian
+ * @create: 2021-10-27 09:19
+ */
+@Slf4j
+@Service
+public class SmsServiceImpl implements SmsService {
+
+    @Autowired
+    private CertificateDownloadInfoDao certificateDownloadInfoDao;
+
+    @Override
+    public void save(CertificateDownloadInfo certificateDownloadInfo) {
+        certificateDownloadInfoDao.add(certificateDownloadInfo);
+    }
+}
Index: src/main/java/com/novaone/util/CertificateUtils.java
===================================================================
--- src/main/java/com/novaone/util/CertificateUtils.java	(不存在的)
+++ src/main/java/com/novaone/util/CertificateUtils.java	(版本 28938)
@@ -0,0 +1,115 @@
+package com.novaone.util;
+
+import java.io.File;
+import java.util.HashMap;
+
+import com.alibaba.fastjson.JSON;
+
+import com.alibaba.fastjson.JSONObject;
+import com.novaone.common.CommonInfo;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+
+@Slf4j
+public class CertificateUtils {
+//
+//    public static void main(String[] args) {
+//        HashMap<String, String> maps = downloadImg();
+//        String code = maps.get("code");
+//        String cookie = maps.get("cookie");
+//        String json = listPage(code, cookie);
+//        String certNo = RegexUtil.matchOne("(?<=\"certNo\":\")(.*?)(?=\\\")", json);
+//        String certFileSeqNo = RegexUtil.matchOne("(?<=\"certFileSeqNo\":\")(.*?)(?=\\\")", json);
+//        String serialNo = RegexUtil.matchOne("(?<=\"serialNo\":\")(.*?)(?=\\\")", json);
+//        String seqNo = RegexUtil.matchOne("(?<=\"seqNo\":\")(.*?)(?=\\\")", json);
+//        String unloginQueryUrlForPDF = "https://swapp.singlewindow.cn/ecertwebunloginserver/sw/ecert/unlogin/downloadPDF/"
+//                + certNo + "/" + certFileSeqNo + "/" + serialNo + "/6" + "/" + seqNo;
+//        System.out.println(unloginQueryUrlForPDF);
+//        try {
+//            FileUtils.copyURLToFile(new URL(unloginQueryUrlForPDF), new File("d:/test/test.pdf"));
+//        } catch (MalformedURLException e) {
+//            e.printStackTrace();
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+    public static String listPage(String code, String cookie, String queryCode, String certificateNo) {
+        StringBuilder builder = new StringBuilder();
+        builder.append("https://swapp.singlewindow.cn/ecertwebunloginserver/sw/ecert/unlogin/queryList?limit=10&offset=0&stName=reportDate&stOrder=desc&vcode=");
+        builder.append(code);
+        builder.append("&ecertQueryInfo=%25257B%252522certNo%252522%3A%252522");
+//        builder.append("222520211000253049001");//证书编号
+        builder.append(certificateNo);//证书编号
+        builder.append("%252522%2C%252522serialNo%252522%3A%252522");
+//        builder.append("1901");//查询码
+        builder.append(queryCode);//查询码
+        builder.append("%252522%2C%252522verifyCode%252522%3A%252522");
+        builder.append(code);
+        builder.append("%252522%25257D&_=");
+        builder.append(System.currentTimeMillis());
+        try {
+            String json = HttpUtil.getCookie(builder.toString(), cookie);
+            log.info("[检疫证书查询]检疫证书列表查询完成...");
+            return json;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static HashMap<String, String> downloadImg(int recursion) {
+
+        HashMap<String, String> maps = ImgUtil.downloadImgByNet("https://swapp.singlewindow.cn/ecertwebunloginserver/verifyCode/creator", null);
+        String code = "";
+        try {
+            String fileName = maps.get("fileName");
+            code = platGetCode(fileName);
+            maps.put("code", code);
+            log.info("[检疫证书查询]获取验证码和Cookies = "+ JSON.toJSONString(maps));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (StringUtils.isEmpty(code) && recursion > 0) {
+            return downloadImg(--recursion);
+        }
+        return maps;
+    }
+
+    public static String platGetCode(String fileName) throws Exception {
+        // 你的用户名
+        String username = CommonInfo.PLATCODE_USER_NAME;
+        // 你的密码
+        String password = CommonInfo.PLATCODE_PASSWORD;
+        // 图片转换过的base64编码
+        String image = ImgUtil.convertFileToBase64(fileName);
+        File file = new File(fileName);
+        JSONObject obj = new JSONObject();
+        obj.put("username", username);
+        obj.put("password", password);
+        obj.put("typeid", "7");
+        String code = "";
+        obj.put("image", image);
+        try {
+            String url = CommonInfo.PALTCODE_API_URL;
+            String ret = HttpUtil.postJson(url, obj);
+            log.info("plat code result:" + ret);
+            JSONObject jsonObject = JSONObject.parseObject(ret);
+            if (jsonObject.getBoolean("success")) {
+                code = jsonObject.getJSONObject("data").getString("result");
+                return code;
+            } else {
+                log.info("[检疫证书查询]验证码识别失败,message:" + jsonObject.getString("message"));
+            }
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            if (!CommonUtils.isEmpty(file)) {
+                file.delete();
+            }
+        }
+        return code;
+
+    }
+}
Index: src/main/java/com/novaone/util/FtpUtil.java
===================================================================
--- src/main/java/com/novaone/util/FtpUtil.java	(版本 28937)
+++ src/main/java/com/novaone/util/FtpUtil.java	(版本 28938)
@@ -135,7 +135,7 @@
      * @return
      * @throws IOException 
      */
-    public boolean upload(Map<String, InputStream> map) throws IOException {
+    public boolean upload(Map<String, InputStream> map) {
         // //连接ftp
         // boolean r = this.connect();
         // if(!r){
Index: src/main/java/com/novaone/util/HttpUtil.java
===================================================================
--- src/main/java/com/novaone/util/HttpUtil.java	(版本 28937)
+++ src/main/java/com/novaone/util/HttpUtil.java	(版本 28938)
@@ -48,6 +48,27 @@
         return sb.toString();
     }
 
+    public static String getCookie(String urlStr, String cookie) throws Exception {
+
+        URL url = new URL(urlStr);
+        URLConnection urlConnection = url.openConnection(); // 打开连接
+        if (StringUtils.isNotEmpty(cookie)) {
+            urlConnection.setRequestProperty("Cookie", cookie);
+        }
+
+        // System.out.println(urlConnection.getURL().toString());
+
+        BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); // 获取输入流
+        String line = null;
+        StringBuilder sb = new StringBuilder();
+        while ((line = br.readLine()) != null) {
+            sb.append(line + "\n");
+        }
+        br.close();
+        // System.out.println(sb.toString());
+        return sb.toString();
+    }
+
     /**
      * 使用HttpURLConnection实现POST请求
      * <p/>
Index: src/main/java/com/novaone/util/IOUtil.java
===================================================================
--- src/main/java/com/novaone/util/IOUtil.java	(不存在的)
+++ src/main/java/com/novaone/util/IOUtil.java	(版本 28938)
@@ -0,0 +1,41 @@
+package com.novaone.util;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/*
+ * @program: api-security
+ * @description: IO操作工具类
+ * @author: Ma.ChengJian
+ * @create: 2021-07-05 21:35
+ */
+public class IOUtil {
+
+
+    /**
+     * 读取给定字节输入流的中的数据，并返回该数据的字节数组
+     * @param in
+     * @return
+     * @throws IOException
+     */
+    public static byte[] readByteArray(InputStream in) throws IOException {
+        BufferedInputStream bufin = new BufferedInputStream(in);
+        int buffSize = 1024;
+        ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);
+        byte[] temp = new byte[buffSize];
+        boolean var5 = false;
+
+        try {
+            int size;
+            while((size = bufin.read(temp)) != -1) {
+                out.write(temp, 0, size);
+            }
+        } finally {
+            bufin.close();
+        }
+
+        return out.toByteArray();
+    }
+}
Index: src/main/java/com/novaone/util/ImgUtil.java
===================================================================
--- src/main/java/com/novaone/util/ImgUtil.java	(版本 28937)
+++ src/main/java/com/novaone/util/ImgUtil.java	(版本 28938)
@@ -6,8 +6,14 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.CookieHandler;
+import java.net.CookieManager;
+import java.net.CookieStore;
+import java.net.HttpCookie;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.List;
 import java.util.UUID;
 
 import javax.imageio.ImageIO;
@@ -192,9 +198,15 @@
      * @@author gz
      * @date 2020年8月24日 下午5:46:48
      */
-    public static String downloadImgByNet(String imgSrc, String cookie) {
+    public static HashMap<String, String> downloadImgByNet(String imgSrc, String cookie) {
+        HashMap<String, String> maps = new HashMap<String, String>();
         String fileName = UUID.randomUUID().toString() + ".gif";
+        String cookieCode = "";
+        InputStream str = null;
+        FileOutputStream out = null;
         try {
+            CookieManager manager = new CookieManager();
+            CookieHandler.setDefault(manager);
             URL url = new URL(imgSrc);
             URLConnection conn = url.openConnection();
             // 设置超时间为3秒
@@ -205,7 +217,7 @@
                 conn.setRequestProperty("Cookie", cookie);
             }
             // 输出流
-            InputStream str = conn.getInputStream();
+            str = conn.getInputStream();
             // 控制流的大小为1k
             byte[] bs = new byte[1024];
             // 读取到的长度
@@ -213,22 +225,46 @@
             // 是否需要创建文件夹
             File saveDir = new File(fileName);
             // 实例输出一个对象
-            FileOutputStream out = new FileOutputStream(saveDir);
+            out = new FileOutputStream(saveDir);
             // 循环判断，如果读取的个数b为空了，则is.read()方法返回-1，具体请参考InputStream的read();
             while ((len = str.read(bs)) != -1) {
                 // 将对象写入到对应的文件中
                 out.write(bs, 0, len);
             }
+            CookieStore cookieJar = manager.getCookieStore();
+            List<HttpCookie> cookies = cookieJar.getCookies();
+            for (HttpCookie c : cookies) {
+                String value = c.toString();
+                if(value.contains("JSESSIONID")) {
+                    cookieCode = value;
+                    break;
+                }
+            }
+            maps.put("cookie", cookieCode);
+            maps.put("fileName", fileName);
             // 刷新流
             out.flush();
-            // 关闭流
-            out.close();
-            str.close();
             log.info("验证码下载成功");
         } catch (Exception e) {
             e.printStackTrace();
+        } finally {
+            // 关闭流
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (str != null) {
+                try {
+                    str.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
         }
-        return fileName;
+        return maps;
     }
 
     /**
Index: src/main/java/com/novaone/util/JwtUtil.java
===================================================================
--- src/main/java/com/novaone/util/JwtUtil.java	(版本 28937)
+++ src/main/java/com/novaone/util/JwtUtil.java	(版本 28938)
@@ -2,8 +2,6 @@
 
 import java.util.Date;
 
-import com.novaone.entity.User;
-
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
@@ -20,17 +18,17 @@
     public static final long EXPIRE = 1000 * 60 * 60 * 24 * 2; // 过期时间，毫秒，一周
 
     // 生成 JWT
-    public static String geneJsonWebToken(User user) {
+//    public static String geneJsonWebToken(User user) {
+//
+//        String token = Jwts.builder().setSubject(SUBJECT).claim("id", user.getId())
+//                .claim("username", user.getUsername())
+//                .claim("client", user.getClient()).setIssuedAt(new Date())
+//                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
+//                .signWith(SignatureAlgorithm.HS256, SECRETKEY).compact();
+//
+//        return token;
+//    }
 
-        String token = Jwts.builder().setSubject(SUBJECT).claim("id", user.getId())
-                .claim("username", user.getUsername())
-                .claim("client", user.getClient()).setIssuedAt(new Date())
-                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
-                .signWith(SignatureAlgorithm.HS256, SECRETKEY).compact();
-
-        return token;
-    }
-
     // 校验 JWT
     public static Claims checkJWT(String token) {
         try {
Index: src/main/java/com/novaone/util/RegexUtil.java
===================================================================
--- src/main/java/com/novaone/util/RegexUtil.java	(不存在的)
+++ src/main/java/com/novaone/util/RegexUtil.java	(版本 28938)
@@ -0,0 +1,120 @@
+package com.novaone.util;
+
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class RegexUtil {
+
+    /**
+     * 编译一个正则表达式
+     *
+     * @param regex
+     * @return
+     */
+    public static Pattern compile(String regex, boolean isInsensitive) {
+        if (true == isInsensitive) {
+            return Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+        } else {
+            return Pattern.compile(regex);
+        }
+    }
+
+    /**
+     * 返回一个mathcer
+     *
+     * @param regex
+     * @param content
+     * @return
+     */
+    public static Matcher matcher(String regex, String content) {
+        return compile(regex, true).matcher(content);
+    }
+
+    /**
+     * 匹配第一个
+     *
+     * @param regex
+     * @param content
+     * @return
+     */
+    public static String matchOne(String regex, String content) {
+        String match = null;
+        Matcher m = matcher(regex, content);
+        while (m.find()) {
+            match = m.group().trim();
+            break;
+        }
+        return match;
+    }
+
+    /**
+     * 匹配第一个
+     *
+     * @param regex
+     * @param content
+     * @param regexGroup 正则分组号
+     * @return
+     */
+    public static String matchOne(String regex, String content, int regexGroup) {
+        String match = null;
+        Matcher m = matcher(regex, content);
+        while (m.find()) {
+            match = m.group(regexGroup).trim();
+            break;
+        }
+        return match;
+    }
+
+    /**
+     * 匹配所有
+     *
+     * @param regex      正则表达式
+     * @param regexGroup 分组号
+     * @param content    要进行匹配的内容
+     * @return
+     */
+    public static List<String> matchAll(String regex, String content, int regexGroup) {
+        List<String> list = new LinkedList<String>();
+        Matcher m = matcher(regex, content);
+        while (m.find()) {
+            list.add(m.group(regexGroup));
+        }
+        return list;
+    }
+
+    public static List<String> matchAll(String regex, String content) {
+        List<String> list = new LinkedList<String>();
+        Matcher m = matcher(regex, content);
+        while (m.find()) {
+            list.add(m.group());
+        }
+        return list;
+    }
+
+    /**
+     * 判断是否匹配，返回布尔值
+     * 说明:
+     *
+     * @param regex
+     * @param content
+     * @return
+     */
+    public static boolean matches(String regex, String content) {
+        Matcher matcher = matcher(regex, content);
+        boolean bool = matcher.matches();
+        return bool;
+    }
+
+    public static List<String> toList(String regex, String source) {
+        List<String> list = new LinkedList<String>();
+        Pattern p = Pattern.compile(regex);
+        Matcher m = p.matcher(source);
+        while (m.find()) {
+            list.add(m.group(1));
+        }
+        return list;
+    }
+}
\ No newline at end of file
Index: src/main/resources/application.yml
===================================================================
--- src/main/resources/application.yml	(版本 28937)
+++ src/main/resources/application.yml	(版本 28938)
@@ -9,7 +9,7 @@
     druid:
       master:
         driver-class-name: com.mysql.cj.jdbc.Driver
-        url: jdbc:mysql://rm-bp13i26r6189ex0l2o.mysql.rds.aliyuncs.com:3306/hk?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
+        url: jdbc:mysql://rm-bp13i26r6189ex0l2o.mysql.rds.aliyuncs.com:3306/quarantine?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
         username: nova123
         password: novax0l2#
         validation-query: SELECT 1 FROM DUAL
@@ -27,7 +27,9 @@
         connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
       slave:
         driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-        url: jdbc:sqlserver://47.97.182.194:1433;DatabaseName=zjnb
+#        url: jdbc:sqlserver://47.97.182.194:1433;DatabaseName=zjnb
+#        url: jdbc:sqlserver://rm-bp107kof940zw01k6qo.sqlserver.rds.aliyuncs.com;DatabaseName=zjnb #测试库
+        url: jdbc:sqlserver://rm-bp107kof940zw01k6qo.sqlserver.rds.aliyuncs.com;DatabaseName=zjnb_rq #测试库，对应测试环境业务系统8029端口
         username: oheng
         password: Hongshen_110
         validation-query: SELECT 1
Index: src/main/resources/generatorConfig.xml
===================================================================
--- src/main/resources/generatorConfig.xml	(版本 28937)
+++ src/main/resources/generatorConfig.xml	(版本 28938)
@@ -15,7 +15,7 @@
 		<javaModelGenerator targetPackage="com.novaone.entity"
 							targetProject="ccsehgpdf"/>
 		<!-- 实体类的映射文件生成地址 -->
-		<sqlMapGenerator targetPackage="com.novaone.dao.Mapper"
+		<sqlMapGenerator targetPackage="com.novaone.dao.temporary.Mapper"
 						 targetProject="ccsehgpdf"></sqlMapGenerator>
 		<!-- DAO文件生成地址 -->
 		<javaClientGenerator targetPackage="com.novaone.dao"
Index: src/main/resources/mapper/mySqlMapper/CertificateDownloadInfoMapper.xml
===================================================================
--- src/main/resources/mapper/mySqlMapper/CertificateDownloadInfoMapper.xml	(不存在的)
+++ src/main/resources/mapper/mySqlMapper/CertificateDownloadInfoMapper.xml	(版本 28938)
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.novaone.dao.CertificateDownloadInfoDao" >
+
+  <sql id="columnList">
+    SELECT id, query_code, certificate_no, certificate_no, receive_time, sms_id, business_state, ywbh, create_time, update_time
+  </sql>
+
+
+  <insert id="add" parameterType="com.novaone.entity.CertificateDownloadInfo" >
+    INSERT IGNORE INTO certificate_download_info
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="queryCode != null and queryCode != ''">
+        query_code,
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no,
+      </if>
+      <if test="receiveTime != null" >
+        receive_time,
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        sms_id,
+      </if>
+      <if test="ywbh != null and ywbh != ''" >
+        ywbh,
+      </if>
+      <if test="businessState != null" >
+        business_state,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="queryCode != null and queryCode != ''">
+        #{queryCode},
+      </if>
+      <if test="certificateNo != null and certificateNo != ''" >
+        #{certificateNo},
+      </if>
+      <if test="receiveTime != null" >
+        #{receiveTime},
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        #{smsId},
+      </if>
+      <if test="ywbh != null and ywbh != ''" >
+        #{ywbh},
+      </if>
+      <if test="businessState != null" >
+        #{businessState},
+      </if>
+      <if test="createTime != null" >
+        #{createTime},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime},
+      </if>
+    </trim>
+  </insert>
+
+
+  <select id="findByBusinesState" resultType="com.novaone.entity.CertificateDownloadInfo">
+    <include refid="columnList"></include>
+    FROM certificate_download_info
+    WHERE business_state = #{businessState}
+  </select>
+
+    <select id="findReceiveTimeLater" resultType="com.novaone.entity.CertificateDownloadInfo">
+      <include refid="columnList"></include>
+      FROM certificate_download_info
+      WHERE receive_time >= #{receiveTime}
+    </select>
+
+
+    <update id="updateById" parameterType="com.novaone.entity.CertificateDownloadInfo">
+    UPDATE certificate_download_info
+    <set>
+      <if test="queryCode != null and queryCode != ''">
+        query_code = #{queryCode},
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no = #{certificateNo},
+      </if>
+      <if test="receiveTime != null" >
+        receive_time = #{receiveTime},
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        sms_id = #{smsId},
+      </if>
+      <if test="businessState != null" >
+        business_state = #{businessState},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime},
+      </if>
+    </set>
+    WHERE id = #{id}
+  </update>
+
+</mapper>
\ No newline at end of file
Index: src/main/resources/mapper/mySqlMapper/CertificateRetryJobMapper.xml
===================================================================
--- src/main/resources/mapper/mySqlMapper/CertificateRetryJobMapper.xml	(不存在的)
+++ src/main/resources/mapper/mySqlMapper/CertificateRetryJobMapper.xml	(版本 28938)
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.novaone.dao.CertificateRetryJobDao" >
+
+  <insert id="add" parameterType="com.novaone.entity.CertificateRetryJob" >
+    INSERT INTO certificate_retry_job
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="infoId != null">
+        info_id,
+      </if>
+      <if test="queryCode != null and queryCode != ''">
+        query_code,
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no,
+      </if>
+      <if test="ywbh != null and ywbh != ''" >
+        ywbh,
+      </if>
+      <if test="failDownload != null" >
+        fail_download,
+      </if>
+      <if test="downloadTime != null" >
+        download_time,
+      </if>
+      <if test="filePath != null and filePath != ''" >
+        file_path,
+      </if>
+      <if test="failUpload != null" >
+        fail_upload,
+      </if>
+      <if test="retryCount != null" >
+        retry_count,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+      <if test="message != null and message != ''" >
+        message,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="infoId != null">
+        #{infoId},
+      </if>
+      <if test="queryCode != null and queryCode != ''">
+        #{queryCode},
+      </if>
+      <if test="certificateNo != null and certificateNo != ''" >
+        #{certificateNo},
+      </if>
+      <if test="ywbh != null and ywbh != ''" >
+        #{ywbh},
+      </if>
+      <if test="failDownload != null" >
+        #{failDownload},
+      </if>
+      <if test="downloadTime != null" >
+        #{downloadTime},
+      </if>
+      <if test="filePath != null and filePath != ''" >
+        #{filePath},
+      </if>
+      <if test="failUpload != null" >
+        #{failUpload},
+      </if>
+      <if test="retryCount != null" >
+        #{retryCount},
+      </if>
+      <if test="createTime != null" >
+        #{createTime},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime},
+      </if>
+      <if test="message != null and message != ''" >
+        #{message},
+      </if>
+    </trim>
+  </insert>
+
+
+  <delete id="deleteById" parameterType="com.novaone.entity.CertificateRetryJob">
+    DELETE FROM certificate_retry_job
+    WHERE id = #{id}
+  </delete>
+
+
+  <update id="updateById" parameterType="com.novaone.entity.CertificateRetryJob">
+    UPDATE certificate_retry_job
+    <set>
+      <if test="queryCode != null and queryCode != ''">
+        query_code = #{queryCode},
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no = #{certificateNo},
+      </if>
+      <if test="failDownload != null" >
+        fail_download = #{failDownload},
+      </if>
+      <if test="downloadTime != null" >
+        download_time = #{downloadTime},
+      </if>
+      <if test="filePath != null and filePath != ''" >
+        file_path = #{filePath},
+      </if>
+      <if test="message != null and message != ''" >
+        message = #{message},
+      </if>
+      <if test="ywbh != null and ywbh != ''" >
+        ywbh = #{ywbh},
+      </if>
+      <if test="failUpload != null" >
+        fail_upload = #{failUpload},
+      </if>
+      <if test="retryCount != null" >
+        retry_count = #{retryCount},
+      </if>
+      <if test="createTime != null" >
+        create_time = #{createTime},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime},
+      </if>
+    </set>
+    WHERE id = #{id}
+  </update>
+
+
+
+  <select id="findRetryJob" resultType="com.novaone.entity.CertificateRetryJob">
+    SELECT * FROM certificate_retry_job
+  </select>
+
+</mapper>
\ No newline at end of file
Index: src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml
===================================================================
--- src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml	(不存在的)
+++ src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml	(版本 28938)
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.novaone.dao.QueryCodeJobDao" >
+
+
+  <select id="find" resultType="com.novaone.entity.QueryCodeRetryJob">
+    SELECT id, jyjyzscxm, certificate_no, receive_time, sms_id, retry_count, create_time, update_time, message
+    FROM query_code_retry_job
+  </select>
+
+  <delete id="deleteById" parameterType="com.novaone.entity.QueryCodeRetryJob">
+    DELETE FROM query_code_retry_job
+    WHERE id = #{id}
+  </delete>
+
+
+  <delete id="delete" parameterType="list">
+    DELETE FROM query_code_retry_job
+    WHERE id = -1
+        <if test="list != null and list.size()>0">
+          <foreach collection="list" open="OR id IN (" separator="," close=")" item="item">
+            #{item.id}
+          </foreach>
+        </if>
+  </delete>
+
+
+  <insert id="add" parameterType="com.novaone.entity.QueryCodeRetryJob" >
+    INSERT INTO query_code_retry_job
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="jyjyzscxm != null and jyjyzscxm != ''">
+        jyjyzscxm,
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no,
+      </if>
+      <if test="receiveTime != null" >
+        receive_time,
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        sms_id,
+      </if>
+      <if test="retryCount != null" >
+        retry_count,
+      </if>
+      <if test="createTime != null" >
+        create_time,
+      </if>
+      <if test="message != null and message != ''" >
+        message,
+      </if>
+      <if test="updateTime != null" >
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="jyjyzscxm != null and jyjyzscxm != ''">
+        #{jyjyzscxm},
+      </if>
+      <if test="certificateNo != null and certificateNo != ''" >
+        #{certificateNo},
+      </if>
+      <if test="receiveTime != null" >
+        #{receiveTime},
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        #{smsId},
+      </if>
+      <if test="retryCount != null" >
+        #{retryCount},
+      </if>
+      <if test="createTime != null" >
+        #{createTime},
+      </if>
+      <if test="message != null and message != ''" >
+        #{message},
+      </if>
+      <if test="updateTime != null" >
+        #{updateTime},
+      </if>
+    </trim>
+  </insert>
+
+  <update id="updateById" parameterType="com.novaone.entity.QueryCodeRetryJob">
+    UPDATE query_code_retry_job
+    <set>
+      <if test="jyjyzscxm != null and jyjyzscxm != ''">
+        jyjyzscxm = #{jyjyzscxm},
+      </if>
+      <if test="certificateNo != null  and certificateNo != ''" >
+        certificate_no = #{certificateNo},
+      </if>
+      <if test="receiveTime != null" >
+        receive_time = #{receiveTime},
+      </if>
+      <if test="smsId != null and smsId != ''" >
+        sms_id = #{smsId},
+      </if>
+      <if test="retryCount != null" >
+        retry_count = #{retryCount},
+      </if>
+      <if test="updateTime != null" >
+        update_time = #{updateTime},
+      </if>
+      <if test="message != null and message != ''" >
+        message
+      </if>
+    </set>
+    WHERE id = #{id}
+  </update>
+
+</mapper>
\ No newline at end of file
Index: src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml
===================================================================
--- src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml	(不存在的)
+++ src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml	(版本 28938)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.novaone.fdao.HddzDao" >
+
+  <update id="update" parameterType="com.novaone.entity.Hddz">
+    UPDATE yw_hddz
+    <set>
+      <if test="jyjyzscxm != null and jyjyzscxm != ''">
+        jyjyzscxm = #{jyjyzscxm},
+      </if>
+      <if test="sfyjyjyzs != null and sfyjyjyzs != ''">
+        sfyjyjyzs = #{sfyjyjyzs},
+      </if>
+      <if test="jyjyzs != null and jyjyzs != ''">
+        jyjyzs = #{jyjyzs},
+      </if>
+    </set>
+    WHERE bgdh = #{bgdh}
+  </update>
+
+  <select id="findByBgdh" parameterType="string" resultType="com.novaone.entity.Hddz">
+    SELECT sfyjyjyzs,jyjyzs,bgdh,ywbh,jyjyzscxm FROM yw_hddz WHERE bgdh = #{bgdh};
+  </select>
+
+</mapper>
\ No newline at end of file
Index: src/main/resources/mapper/sqlServerMapper/HddzOcrwjsbDao.xml
===================================================================
--- src/main/resources/mapper/sqlServerMapper/HddzOcrwjsbDao.xml	(不存在的)
+++ src/main/resources/mapper/sqlServerMapper/HddzOcrwjsbDao.xml	(版本 28938)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.novaone.fdao.HddzOcrwjsbDao" >
+
+  <insert id="add" parameterType="com.novaone.entity.HddzOcrwjsb">
+    INSERT INTO yw_hddz_ocrwjsb
+    (wjmc,zbrq,wjlx,ywbh,bgdh,sfcz,wjhz,wjlj,yzwjlj,yzzhcs,sfcs)
+    VALUES
+    (#{wjmc},#{zbrq},#{wjlx},#{ywbh},#{bgdh},#{sfcz},#{wjhz},#{wjlj},#{yzwjlj},#{yzzhcs},#{sfcs})
+  </insert>
+
+
+
+
+
+
+
+  <update id="update" parameterType="com.novaone.entity.Hddz">
+    UPDATE yw_hddz
+    <set>
+      <if test="queryCode != null and queryCode != ''">
+        query_code = #{queryCode},
+      </if>
+      <if test="sfyjyjyzs != null and sfyjyjyzs != ''">
+        sfyjyjyzs = #{sfyjyjyzs},
+      </if>
+      <if test="jyjyzs != null and jyjyzs != ''">
+        jyjyzs = #{jyjyzs},
+      </if>
+    </set>
+    WHERE bgdh = #{bgdh}
+  </update>
+
+</mapper>
\ No newline at end of file
Index: src/test/java/test/ApplyBgdh.java
===================================================================
--- src/test/java/test/ApplyBgdh.java	(版本 28937)
+++ src/test/java/test/ApplyBgdh.java	(不存在的)
@@ -1,195 +0,0 @@
-package test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.common.CommonInfo;
-import com.novaone.entity.BgdhApplyInfo;
-import com.novaone.service.impl.GrabPdfServiceImpl;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-
-@Slf4j
-public class ApplyBgdh {
-
-    // 报关单号申报主页面
-    public static final String APPLY_BGDH_PAGE_MAIN = "https://www.singlewindow.sh.cn/swSwgdCusCert/#/cusCertDeclList";
-
-    // 报关单号查询post
-    public static final String APPLY_BGDH_SEARCH_PAGE = "https://www.singlewindow.sh.cn/swgdCusCertApi/cusCertDeclCtr/handleQryCert";
-
-    // 查询编号 未查询到记录 102
-    public static final String APPLY_BGDH_SEARCH_CODE = "102";
-
-    // 查询返回信息 未查询到记录
-    public static final String APPLY_BGDH_SEARCH_MESSAGE = "未查到记录";
-
-    // 申请报关单号提交
-    public static final String APPLY_BGDH_APPLY_PAGE = "https://www.singlewindow.sh.cn/swgdCusCertApi/cusCertDeclCtr/updateCert";
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        ChromeOptions chromeOptions = new ChromeOptions();
-        // 设置为 headless 模式 （无头浏览器）
-        chromeOptions.addArguments("headless");
-        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
-        // 由于新旧版本问题,两个都弄上
-        capabilities.setCapability("goog:chromeOptions", chromeOptions);
-        capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
-        WebDriver driver = null;
-
-        try {
-            // driver = new RemoteWebDriver(new
-            // URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            driver = new ChromeDriver();
-
-            GrabPdfServiceImpl grabPdfServiceImpl = new GrabPdfServiceImpl();
-            // 登录
-            grabPdfServiceImpl.loginPageUrl(driver);
-            driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-            TimeUnit.SECONDS.sleep(10);
-            // 获取epToken
-            String epToken = handleGetEpToken(driver);
-            if (CommonUtils.isEmpty(epToken)) {
-                log.info("epToken:获取token失败");
-                return;
-            }
-            // 打开申报页面
-            openBgdhApplyPage(driver);
-            String bgdh = "224820201000133377";
-            // 未申报
-            boolean notHasApply = searchBgdhApplyStatus(bgdh, epToken);
-
-            if (notHasApply) {
-                TimeUnit.SECONDS.sleep(1);
-                // 报关单号申报
-                boolean applyStatus = applyBgdh(bgdh, epToken);
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private static boolean applyBgdh(String bgdh, String epToken) throws IOException {
-        Map<String, Object> applyParam = new HashMap<String, Object>();
-        // 水果提交参数
-        BgdhApplyInfo freshApplyInfo = new BgdhApplyInfo();
-        List<BgdhApplyInfo> applyList = new ArrayList<>();
-        freshApplyInfo.setType("0");
-        freshApplyInfo.setStatus("0");
-        freshApplyInfo.setEntryId(bgdh);
-        freshApplyInfo.setNoteS("@4该批货物的进口货物报关单中消费使用单位为：&自动获取&");
-        freshApplyInfo.setOrgCusNo("3111980075");
-        freshApplyInfo.setSrcFlag("1");
-        applyList.add(freshApplyInfo);
-        applyParam.put("T_CUSCERTPLUS_CERT", applyList);
-        // 申请
-        String resultApply = postBgdh(APPLY_BGDH_APPLY_PAGE, applyParam, epToken);
-        log.info("resultApply:" + resultApply);
-        JSONObject applyJson = JSONObject.parseObject(resultApply);
-        if (!CommonUtils.isEmpty(applyJson) && "T".equals(applyJson.get("flag"))
-                && CommonUtils.isEmpty(applyJson.get("errorCode")) && CommonUtils.isEmpty(applyJson.get("errorInfo"))) {
-            log.info("bgdh:" + bgdh + " apply success!");
-            return true;
-        }
-        return false;
-    }
-
-    private static boolean searchBgdhApplyStatus(String bgdh, String epToken) throws IOException {
-        // 组装查询参数
-        Map<String, Object> parameterMap = handleSearchParam(bgdh);
-        // 查询页面
-        String resultSearch = postBgdh(APPLY_BGDH_SEARCH_PAGE, parameterMap, epToken);
-        log.info("resultSearch:" + resultSearch);
-        JSONObject searchJson = JSONObject.parseObject(resultSearch);
-        // 未申报
-        boolean notHasApply = false;
-        if (!CommonUtils.isEmpty(searchJson) && APPLY_BGDH_SEARCH_CODE.equals(searchJson.get("errorCode"))
-                && APPLY_BGDH_SEARCH_MESSAGE.equals(searchJson.get("errorInfo"))) {
-            notHasApply = true;
-        }
-        return notHasApply;
-    }
-
-    private static Map<String, Object> handleSearchParam(String bgdh) {
-        Map<String, Object> parameterMap = new HashMap<String, Object>();
-        parameterMap.put("eq_entryId", bgdh);
-        parameterMap.put("orderBy", "id,desc");
-        parameterMap.put("limit", 10);
-        parameterMap.put("offset", 1);
-        return parameterMap;
-    }
-
-    private static void openBgdhApplyPage(WebDriver driver) throws InterruptedException {
-        JavascriptExecutor js = (JavascriptExecutor) driver;// 将driver转换为js
-
-        js.executeScript("document.getElementsByClassName('ep-drop ep-dropdown-main')[0].style.display='block'");
-        // 点击
-        driver.findElement(By.xpath(
-                "//*[@id=\"app\"]/div[1]/header/div/div[2]/ul/li[4]/div/div[2]/div/ul/div/div[2]/div[2]/div[1]/div[1]/ul/li[14]/span[1]"))
-                .click();
-        TimeUnit.SECONDS.sleep(3);
-        // 打开申报页面
-        driver.get(APPLY_BGDH_PAGE_MAIN);
-        TimeUnit.SECONDS.sleep(3);
-
-    }
-
-    /**
-     * 
-     * handleGetEpToken(获取eptoken)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年9月22日 下午2:25:17
-     */
-    private static String handleGetEpToken(WebDriver driver) {
-        Set<Cookie> cookies = driver.manage().getCookies();
-        Set<Cookie> cookie = cookies.stream().filter(c -> "epoa.refresh_token".equals(c.getName()))
-                .collect(Collectors.toSet());
-        if (CommonUtils.isEmpty(cookie)) {
-            return null;
-        }
-        return cookie.iterator().next().getValue();
-    }
-
-    public static String postBgdh(String urlStr, Map<String, Object> parameterMap, String epToken) throws IOException {
-        OkHttpClient client = new OkHttpClient();
-
-        MediaType mediaType = MediaType.parse("application/json");
-        RequestBody body = RequestBody.create(mediaType, JSONObject.toJSONString(parameterMap));
-        Request request = new Request.Builder().url(urlStr).post(body).addHeader("Content-Type", "application/json")
-                .addHeader("epToken", epToken).addHeader("cache-control", "no-cache").build();
-
-        Response response = client.newCall(request).execute();
-        return response.body().string();
-    }
-
-}
Index: src/test/java/test/ApplySingle.java
===================================================================
--- src/test/java/test/ApplySingle.java	(版本 28937)
+++ src/test/java/test/ApplySingle.java	(不存在的)
@@ -1,173 +0,0 @@
-package test;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.common.CommonInfo;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ApplySingle {
-
-    // 报关单号申报主页面
-    public static final String APPLY_BGDH_PAGE_MAIN = "https://www.singlewindow.sh.cn/swSwgdCusCert/#/cusCertDeclList";
-
-    // 报关单号查询post
-    public static final String APPLY_BGDH_SEARCH_PAGE = "https://www.singlewindow.sh.cn/swgdCusCertApi/cusCertDeclCtr/handleQryCert";
-
-    // 查询编号 未查询到记录 102
-    public static final String APPLY_BGDH_SEARCH_CODE = "102";
-
-    // 查询返回信息 未查询到记录
-    public static final String APPLY_BGDH_SEARCH_MESSAGE = "未查到记录";
-
-    // 申请报关单号提交
-    public static final String APPLY_BGDH_APPLY_PAGE = "https://www.singlewindow.sh.cn/swgdCusCertApi/cusCertDeclCtr/updateCert";
-
-    // 报关单号查询按钮xpath
-    public static final String APPLY_BGDH_INPUT_BUTTON_XPATH = "//form/div/div[2]/button";
-
-    // 报关单号查询input框 xpath
-    public static final String APPLY_BGDH_INPUT_XPATH = "//form/div/div[1]/div/div/div/input";
-
-    // 报关单号查询input框 class
-    public static final String APPLY_BGDH_INPUT_CLASS = "ep-input__inner";
-
-    // checkbox class
-    public static final String APPLY_BGDH_CHECKBOX_CLASS = "ep-checkbox--block";
-
-    // 内容P
-    public static final String APPLY_BGDH_INPUT_DATA_P_XPATH = "//p";
-
-    // 蓝色button class
-    public static final String APPLY_BGDH_BLUE_BUTTON_CLASS = "ep-button ep-button--primary ep-button--small";
-
-    // 绿色button class
-    public static final String APPLY_BGDH_GREEN_BUTTON_CLASS = "ep-button ep-button--success ep-button--small";
-
-    // 申报选择框 xpath
-    public static final String APPLY_BGDH_APPLY_SELECT_XPAH = "//form/div/div[3]/div/div/div/div/input";
-
-    // 下拉选项 xpath
-    public static final String APPLY_BGDH_APPLY_SELECT_DATA_XPATH = "//ul[contains(@class,'ep-cascader-list')]/li[1]";
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        ChromeOptions chromeOptions = new ChromeOptions();
-        // 设置为 headless 模式 （无头浏览器）
-        chromeOptions.addArguments("headless");
-        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
-        // 由于新旧版本问题,两个都弄上
-        capabilities.setCapability("goog:chromeOptions", chromeOptions);
-        capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
-        WebDriver driver = null;
-
-        try {
-            // driver = new RemoteWebDriver(new
-            // URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            driver = new ChromeDriver();
-
-            // GrabPdfServiceImpl grabPdfServiceImpl = new GrabPdfServiceImpl();
-            // 登录
-            // grabPdfServiceImpl.loginPageUrl(driver);
-            // 设置打开窗口大小
-            driver.get(CommonInfo.PAGE_URL_LOGIN);
-            TimeUnit.SECONDS.sleep(1);
-            driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-            TimeUnit.SECONDS.sleep(1);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            TimeUnit.SECONDS.sleep(2);
-
-            // 已申报: String bgdh = "222520201000224271";
-            // 未申报:
-            String bgdh = "224820201000154506";
-            driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-            log.info("登录成功-----------------------------------");
-            TimeUnit.SECONDS.sleep(5);
-            Cookie cookie = driver.manage().getCookieNamed("epoa.refresh_token");
-            String refreshToken = cookie.getValue();
-            log.info("fresh token:" + refreshToken);
-            Map<String, Object> maps = new HashMap<String, Object>();
-            maps.put("data", refreshToken);
-            maps.put("time", System.currentTimeMillis());
-            maps.put("exdays", 15);
-            String epToken = JSONObject.toJSONString(maps);
-            driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-            TimeUnit.SECONDS.sleep(2);
-            // WebStorage webStorage = (WebStorage) driver; // 这里会发生类型转换异常
-            // LocalStorage localStorage = webStorage.getLocalStorage();
-            // localStorage.setItem("eptoken", epToken);
-            JavascriptExecutor js = (JavascriptExecutor) driver;// 将driver转换为js
-            String jsStr = "var obj = JSON.stringify(" + epToken + ");" + " localStorage.setItem('eptoken', obj);";
-            js.executeScript(jsStr);
-            driver.navigate().refresh();
-            TimeUnit.SECONDS.sleep(2);
-            driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-            TimeUnit.SECONDS.sleep(2);
-            log.info("**********打开电子化出证申报成功************");
-            driver.findElement(By.className(APPLY_BGDH_INPUT_CLASS)).clear();
-            driver.findElement(By.className(APPLY_BGDH_INPUT_CLASS)).sendKeys(bgdh);
-            // 蓝色按钮
-            List<WebElement> blueButtons = driver
-                    .findElements(By.cssSelector("[class='" + APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-            blueButtons.get(1).click();
-            // driver.findElement(By.xpath(APPLY_BGDH_INPUT_BUTTON_XPATH)).click();
-            TimeUnit.SECONDS.sleep(5);
-            String dataMsg = "";
-            try {
-                dataMsg = driver.findElement(By.className("ep-table-empty-text")).getText();
-            } catch (Exception e) {
-                log.info("查到数据");
-            }
-            if ("无数据".equals(dataMsg)) {
-                // 绿色按钮
-                List<WebElement> greenButtons = driver
-                        .findElements(By.cssSelector("[class='" + APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-                log.info("------------新增");
-                // 新增补充信息
-                greenButtons.get(0).click();
-                TimeUnit.SECONDS.sleep(2);
-                // 输入报关单号
-                List<WebElement> inputs = driver.findElements(By.className(APPLY_BGDH_INPUT_CLASS));
-                inputs.get(1).sendKeys(bgdh);
-                blueButtons = driver.findElements(By.cssSelector("[class='" + APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-                // 输入报关单号，确定
-                blueButtons.get(2).click();
-                TimeUnit.SECONDS.sleep(5);
-
-                // 点击下拉
-                driver.findElement(By.xpath(APPLY_BGDH_APPLY_SELECT_XPAH)).click();
-                TimeUnit.SECONDS.sleep(1);
-                // 选择数据
-                driver.findElement(By.xpath(APPLY_BGDH_APPLY_SELECT_DATA_XPATH)).click();
-                System.out.println("----------------");
-                driver.findElements(By.className(APPLY_BGDH_CHECKBOX_CLASS)).get(2).click();
-                greenButtons = driver.findElements(By.cssSelector("[class='" + APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-                greenButtons.get(1).click();
-                TimeUnit.SECONDS.sleep(2);
-                List<WebElement> commonButton = driver
-                        .findElements(By.cssSelector("[class='ep-button ep-button--text ep-button--small']"));
-                commonButton.get(3).click();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-}
Index: src/test/java/test/Cron.java
===================================================================
--- src/test/java/test/Cron.java	(版本 28937)
+++ src/test/java/test/Cron.java	(不存在的)
@@ -1,271 +0,0 @@
-package test;
-
-import java.io.File;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.util.CommonUtils;
-import com.novaone.util.ImgUtil;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class Cron {
-
-    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        ChromeOptions chromeOptions = new ChromeOptions();
-        // 设置为 headless 模式 （无头浏览器）
-        // chromeOptions.addArguments("headless");
-        DesiredCapabilities capabilities = setDownloadsPath();
-        // 由于新旧版本问题,两个都弄上
-        // capabilities.setCapability("goog:chromeOptions", chromeOptions);
-        // capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
-        WebDriver driver = null;
-
-        try {
-            driver = new ChromeDriver(capabilities);
-            // 登录
-            loginPageUrl(driver);
-            log.info("登录成功");
-            // 下载pdf
-            downLoadPdf(driver);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                // driver.close();
-                // driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downLoadPdf(下载pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:08:36
-     */
-    private static void downLoadPdf(WebDriver driver) throws Exception {
-        // 首先需要访问，获取Tiket等参数
-        driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-        TimeUnit.SECONDS.sleep(10);
-        // 获取token
-        driver.get(CommonInfo.PAGE_URL_PDF_SECOND);
-        TimeUnit.SECONDS.sleep(2);
-        // 日期范围
-        String dateParam = handleDateQueryParam();
-        // iframe子页面 获取页码
-        driver.get(CommonInfo.PAGE_URL_PDF_THIRD + dateParam);
-        TimeUnit.SECONDS.sleep(2);
-
-        // 查询所有分页查询参数
-        Integer pageNum = handleQueryPageNum(driver);
-        String param = "&recordperpage=" + pageNum;
-        driver.get(CommonInfo.PAGE_URL_ALL_PDF + dateParam + param);
-        WebElement tableList = driver.findElement(By.className("listTable"));
-
-        List<WebElement> rows = tableList.findElements(By.tagName("tr"));
-        // 从第二个input开始 到倒数第二个
-        for (int i = 1; i <= pageNum; i++) {
-            WebElement row = rows.get(i);
-            if (row != null) {
-                List<WebElement> tds = row.findElements(By.tagName("td"));
-                WebElement input = row.findElement(By.tagName("input"));
-                // System.out.println("input value:" +
-                // input.getAttribute("value"));
-                boolean flag = input.isSelected();
-                if (!flag) {
-                    input.click();
-                    driver.findElement(By.name("downButton")).click();
-                    // 重试次数
-                    int times = 2;
-                    String cerNum = tds.get(1).getText();
-                    String fileName = cerNum + ".pdf";
-                    boolean fileStatus = judgeFileIsExist("\\" + fileName, times);
-                    if (fileStatus) {
-                        log.info("下载 证书编号完成：" + cerNum);
-                        // ftp文件上传
-                        // ftpUpload(fileName, cerNum);
-                        log.info("ftp文件上传成功：:" + cerNum);
-                        // recordDownloadInfo(cerNum);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 
-     * handleDateQueryParam(日期查询条件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午1:11:52
-     */
-    private static String handleDateQueryParam() {
-        String dateParam = "";
-        LocalDate currentTime = LocalDate.now();
-        LocalDate startLocal = currentTime.minusDays(CommonInfo.QUERY_DATE_TIMES);
-        String stateDate = startLocal.format(formatter);
-        // 查询所有分页查询参数
-        dateParam = "&reportDateBegin=" + stateDate + "&reportDateEnd=" + stateDate;
-        return dateParam;
-    }
-
-    /**
-     * 
-     * judgeFileIsExist(判断文件是否下载完成)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 上午10:53:04
-     */
-    private static boolean judgeFileIsExist(String downFileName, int times) throws Exception {
-        TimeUnit.SECONDS.sleep(2);
-        if (times < 0) {
-            throw new Exception("judgeFileIsExist:一直未下载成功：" + downFileName);
-        }
-        File file = new File(CommonInfo.PDF_DOWN_LOCAL_URL + downFileName);
-        if (file.exists()) {
-            return true;
-        } else {
-            TimeUnit.SECONDS.sleep(2);
-            times = times - 1;
-            return judgeFileIsExist(downFileName, times);
-        }
-    }
-
-    /**
-     * 
-     * handleQueryParam(组装查询参数)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:12:09
-     */
-    private static Integer handleQueryPageNum(WebDriver driver) {
-        String pageNum = driver.findElement(By.className("listTableButtonTd")).getText();
-        // 总条数
-        pageNum = (String) pageNum.subSequence(10, 13);
-        return Integer.parseInt(pageNum);
-    }
-
-    /**
-     * 
-     * loginPageUrl(登录单一窗口)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:03:04
-     */
-    private static void loginPageUrl(WebDriver driver) throws Exception {
-        // 设置打开窗口大小
-        driver.get(CommonInfo.PAGE_URL_LOGIN);
-        TimeUnit.SECONDS.sleep(1);
-        Set<Cookie> cookies = driver.manage().getCookies();
-        String cookieStr = "";
-        for (Cookie cookie : cookies) {
-            cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + "; ";
-        }
-        // 获取验证码 并登录
-        getCodeAndLogin(driver, cookieStr);
-    }
-
-    /**
-     * 
-     * getCode(获取验证码并登录)         
-     * @param cookieStr 
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:09:52
-     */
-    private static void getCodeAndLogin(WebDriver driver, String cookieStr) throws Exception {
-        driver.findElement(By.id("verifyCode")).clear();
-        driver.findElement(By.id("swy")).clear();
-        driver.findElement(By.id("swm2")).clear();
-        driver.findElement(By.id("swy")).sendKeys(CommonInfo.USER_NAME);
-
-        // 获取验证码
-        String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL, cookieStr);
-        String newFileName = ImgUtil.imgeHandle("", fileName);
-        String code = ImgUtil.identifyCode(newFileName).replaceAll(" ", "").trim();
-        if (code.length() != 4) {
-            log.info("验证码识别失败");
-            getCodeAndLogin(driver, cookieStr);
-        }
-        try {
-            driver.findElement(By.id("verifyCode")).sendKeys(code);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.findElement(By.id("sub3")).click();
-            TimeUnit.SECONDS.sleep(5);
-            String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-            if (!CommonUtils.isEmpty(errorMsg) || CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-                log.info("验证码识别失败");
-                getCodeAndLogin(driver, cookieStr);
-            }
-        } catch (NoSuchElementException e) {
-            log.info("验证码识别成功");
-        }
-    }
-
-    /**
-     * 
-     * setDownloadsPath(设置chrome下载地址)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:07:25
-     */
-    public static DesiredCapabilities setDownloadsPath() {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-}
Index: src/test/java/test/JsonModel.java
===================================================================
--- src/test/java/test/JsonModel.java	(版本 28937)
+++ src/test/java/test/JsonModel.java	(不存在的)
@@ -1,32 +0,0 @@
-package test;
-
-import com.alibaba.fastjson.JSONObject;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 
- * @ClassName: JsonModel 
- * @Description: json统一返回对象
- * @author zhaojiyan
- *
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class JsonModel<T> {
-    private String code; // 返回状态码
-
-    private String des; // 结果描述
-
-    private T result;// 返回结果
-
-    public static void main(String[] args) {
-        JsonModel<Object> json = new JsonModel<Object>();
-        json.setCode("0");
-        json.setDes("成功");
-        System.out.println(JSONObject.toJSONString(json));
-    }
-}
Index: src/test/java/test/Login.java
===================================================================
--- src/test/java/test/Login.java	(版本 28937)
+++ src/test/java/test/Login.java	(不存在的)
@@ -1,83 +0,0 @@
-package test;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.util.HttpUtil;
-import com.novaone.util.ImgUtil;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class Login {
-
-    // public static void main(String[] args) throws Exception {
-    // WebDriver driver = new ChromeDriver();
-    // // 设置打开窗口大小
-    // driver.get(CommonInfo.PAGE_URL_LOGIN);
-    // TimeUnit.SECONDS.sleep(1);
-    // Set<Cookie> cookies = driver.manage().getCookies();
-    // String cookieStr = "";
-    // for (Cookie cookie : cookies) {
-    // cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + ";
-    // ";
-    // }
-    // driver.findElement(By.id("verifyCode")).clear();
-    // driver.findElement(By.id("swy")).clear();
-    // driver.findElement(By.id("swm2")).clear();
-    // driver.findElement(By.id("swy")).sendKeys(CommonInfo.USER_NAME);
-    // // 获取验证码
-    // String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL,
-    // cookieStr);
-    // String code = platGetCode(fileName);
-    // try {
-    // driver.findElement(By.id("verifyCode")).sendKeys(code);
-    // driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-    // driver.findElement(By.id("sub3")).click();
-    // TimeUnit.SECONDS.sleep(5);
-    //
-    // String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-    // if (!CommonUtils.isEmpty(errorMsg) ||
-    // CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-    // log.info("验证码识别失败");
-    // }
-    // } catch (NoSuchElementException e) {
-    // log.info("验证码识别成功");
-    // }
-    // }
-    public static void main(String[] args) throws Exception {
-        platGetCode("C:\\Users\\Gz\\Desktop\\test\\0.gif");
-    }
-
-    private static String platGetCode(String fileName) throws Exception {
-        // 你的用户名
-        String username = "oheng";
-        // 你的密码
-        String password = "ouheng1688";
-        // 图片转换过的base64编码
-        String image = ImgUtil.convertFileToBase64(fileName);
-        JSONObject obj = new JSONObject();
-        obj.put("username", username);
-        obj.put("password", password);
-        // typeid为可选参数 根据文档填写说明填写 1:纯数字 2:纯英文
-        obj.put("typeid", "7");
-        String code = "";
-        obj.put("image", image);
-        try {
-            String url = "http://api.ttshitu.com/base64";
-            String ret = HttpUtil.postJson(url, obj);
-            log.info("plat code result:" + ret);
-            JSONObject jsonObject = JSONObject.parseObject(ret);
-            if (jsonObject.getBoolean("success")) {
-                log.info("识别成功");
-                code = jsonObject.getJSONObject("data").getString("result");
-                return code;
-            } else {
-                log.info("识别失败原因为:" + jsonObject.getString("message"));
-            }
-        } catch (Exception e) {
-            throw e;
-        }
-        return code;
-
-    }
-
-}
Index: src/test/java/test/Pdf.java
===================================================================
--- src/test/java/test/Pdf.java	(版本 28937)
+++ src/test/java/test/Pdf.java	(不存在的)
@@ -1,71 +0,0 @@
-package test;
-
-import java.io.File;
-import java.util.Map;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.util.HttpUtil;
-
-import net.sourceforge.tess4j.Tesseract;
-
-public class Pdf {
-
-    private static final String CODE_URL = "http://app.singlewindow.cn/cas/plat_cas_verifycode_gen?r=0.7363403972787608";
-
-    private static final String PDF_URL = "http://ccsehg.singlewindow.cn/ccsehg/controller?SERVICE_ID=REGISTRY_CONSIGNEE_ENT_REG_LOGIN_SERVICE";
-
-    private static final String tessLocal = "C:/hk/Tesseract-OCR";
-
-    public static void main(String[] args) {
-        try {
-            String dir = "C:\\Users\\Gz\\Desktop\\test";
-            File[] files = new File(dir).listFiles();
-            for (File file : files) {// 循环文件夹中的文件
-                if (file.isFile() && file.exists()) { // 判断文件是否存在
-                    String result = HttpUtil.get("http://localhost:8001/handleImg/fileName=" + file.getName());
-                    System.out.println("result:" + result);
-                    Map<String, Object> aMap = JSONObject.parseObject(result, Map.class);
-                    if ("0".equals(aMap.get("code"))) {
-                        String rootNewDir = dir + "\\test\\" + file.getName();
-                        String resultNum = identifyCode(rootNewDir); // 将文件中的数据读取出来，并存放进集合中
-                        String s = "%s | %s";
-                        System.out.println(String.format(s, file.getName(), resultNum.replace(" ", "").trim()));
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static String identifyCode(String fileName) throws Exception {
-        File imageFile = new File(fileName);
-        try {
-            Tesseract instance = new Tesseract();
-            instance.setTessVariable("tessedit_char_whitelist",
-                    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
-            instance.setDatapath(tessLocal);
-            String result = instance.doOCR(imageFile);
-            return result;
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw e;
-        } finally {
-            // imageFile.delete();
-        }
-    }
-
-    // public static void main(String[] args) {
-    // for (int i = 0; i < 50; i++) {
-    // File codeImg = new File("D:\\workspacenew\\ciqfresh\\" + i + ".jpg");
-    // try {
-    // FileUtils.copyURLToFile(new URL(CODE_URL), codeImg);
-    // } catch (MalformedURLException e) {
-    // e.printStackTrace();
-    // } catch (IOException e) {
-    // e.printStackTrace();
-    // }
-    // }
-    // }
-
-}
Index: src/test/java/test/PictureRemove.java
===================================================================
--- src/test/java/test/PictureRemove.java	(版本 28937)
+++ src/test/java/test/PictureRemove.java	(不存在的)
@@ -1,348 +0,0 @@
-package test;
-
-import java.awt.Color;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReadParam;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-
-public class PictureRemove {
-
-    private static String filePath = "C:\\Users\\Gz\\Desktop\\test\\";
-
-    public static void main(String[] args) {
-        // 读取文件夹里面的图片
-        String fileName = "6chp";
-        BufferedImage img;
-        try {
-            cleanImage(new File(filePath + fileName + ".jpg"), filePath + "a.jpg");
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    /** 
-     * 
-     * @param sfile 
-     *   需要去噪的图像 
-     * @param destDir 
-     *   去噪后的图像保存地址 
-     * @throws IOException 
-     */
-    public static String cleanImage(File sfile, String destDir) throws IOException {
-        File destF = new File(destDir);
-        if (!destF.exists()) {
-            destF.mkdirs();
-        }
-
-        BufferedImage bufferedImage = ImageIO.read(sfile);
-        int h = bufferedImage.getHeight();
-        int w = bufferedImage.getWidth();
-
-        // 灰度化
-        int[][] gray = new int[w][h];
-        for (int x = 0; x < w; x++) {
-            for (int y = 0; y < h; y++) {
-                int argb = bufferedImage.getRGB(x, y);
-                // 图像加亮（调整亮度识别率非常高）
-                int r = (int) (((argb >> 16) & 0xFF) * 1.1 + 30);
-                int g = (int) (((argb >> 8) & 0xFF) * 1.1 + 30);
-                int b = (int) (((argb >> 0) & 0xFF) * 1.1 + 30);
-                if (r >= 255) {
-                    r = 255;
-                }
-                if (g >= 255) {
-                    g = 255;
-                }
-                if (b >= 255) {
-                    b = 255;
-                }
-                gray[x][y] = (int) Math.pow(
-                        (Math.pow(r, 2.2) * 0.2973 + Math.pow(g, 2.2) * 0.6274 + Math.pow(b, 2.2) * 0.0753), 1 / 2.2);
-            }
-        }
-
-        // 二值化
-        int threshold = ostu(gray, w, h);
-        BufferedImage binaryBufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
-        for (int x = 0; x < w; x++) {
-            for (int y = 0; y < h; y++) {
-                if (gray[x][y] > threshold) {
-                    gray[x][y] |= 0x00FFFF;
-                } else {
-                    gray[x][y] &= 0xFF0000;
-                }
-                binaryBufferedImage.setRGB(x, y, gray[x][y]);
-            }
-        }
-
-        // 去除干扰点 或 干扰线（运用八领域，即像素周围八个点判定，根据实际需要判定）
-        for (int y = 1; y < h - 1; y++) {
-            for (int x = 1; x < w - 1; x++) {
-
-                boolean lineFlag = false;// 去除线判定
-                int pointflagNum = 0;// 去除点判定
-
-                if (isBlack(binaryBufferedImage.getRGB(x, y))) {
-                    // 左右像素点为"白"即空时，去掉此点
-                    if (isWhite(binaryBufferedImage.getRGB(x - 1, y))
-                            && isWhite(binaryBufferedImage.getRGB(x + 1, y))) {
-                        lineFlag = true;
-                        pointflagNum += 2;
-                    }
-                    // 上下像素点为"白"即空时，去掉此点
-                    if (isWhite(binaryBufferedImage.getRGB(x, y + 1))
-                            && isWhite(binaryBufferedImage.getRGB(x, y - 1))) {
-                        lineFlag = true;
-                        pointflagNum += 2;
-                    }
-                    // 斜上像素点为"白"即空时，去掉此点
-                    if (isWhite(binaryBufferedImage.getRGB(x - 1, y + 1))
-                            && isWhite(binaryBufferedImage.getRGB(x + 1, y - 1))) {
-                        lineFlag = true;
-                        pointflagNum += 2;
-                    }
-                    if (isWhite(binaryBufferedImage.getRGB(x + 1, y + 1))
-                            && isWhite(binaryBufferedImage.getRGB(x - 1, y - 1))) {
-                        lineFlag = true;
-                        pointflagNum += 2;
-                    }
-                    // 去除干扰线
-                    if (lineFlag) {
-                        // /binaryBufferedImage.setRGB(x, y, -1);
-                    }
-                    // 去除干扰点
-                    if (pointflagNum > 6) {
-                        binaryBufferedImage.setRGB(x, y, -1);
-                    }
-                }
-            }
-        }
-
-        // 矩阵打印
-        // for (int y = 0; y < h; y++) {
-        // for (int x = 0; x < w; x++) {
-        // if (isBlack(binaryBufferedImage.getRGB(x, y))) {
-        // System.out.print("*");
-        // } else {
-        // System.out.print(" ");
-        // }
-        // }
-        // System.out.println();
-        // }
-        String fileName = sfile.getName().substring(0, sfile.getName().lastIndexOf(".")) + ".jpg";
-        ImageIO.write(binaryBufferedImage, "jpg", new File(destDir, fileName));
-        return fileName;
-    }
-
-    public static boolean isBlack(int colorInt) {
-        Color color = new Color(colorInt);
-        if (color.getRed() + color.getGreen() + color.getBlue() <= 300) {
-            return true;
-        }
-        return false;
-    }
-
-    public static boolean isWhite(int colorInt) {
-        Color color = new Color(colorInt);
-        if (color.getRed() + color.getGreen() + color.getBlue() > 300) {
-            return true;
-        }
-        return false;
-    }
-
-    public static int isBlackOrWhite(int colorInt) {
-        if (getColorBright(colorInt) < 30 || getColorBright(colorInt) > 730) {
-            return 1;
-        }
-        return 0;
-    }
-
-    public static int getColorBright(int colorInt) {
-        Color color = new Color(colorInt);
-        return color.getRed() + color.getGreen() + color.getBlue();
-    }
-
-    public static int ostu(int[][] gray, int w, int h) {
-        int[] histData = new int[w * h];
-        // Calculate histogram
-        for (int x = 0; x < w; x++) {
-            for (int y = 0; y < h; y++) {
-                int red = 0xFF & gray[x][y];
-                histData[red]++;
-            }
-        }
-
-        // Total number of pixels
-        int total = w * h;
-
-        float sum = 0;
-        for (int t = 0; t < 256; t++)
-            sum += t * histData[t];
-
-        float sumB = 0;
-        int wB = 0;
-        int wF = 0;
-
-        float varMax = 0;
-        int threshold = 0;
-
-        for (int t = 0; t < 256; t++) {
-            wB += histData[t]; // Weight Background
-            if (wB == 0)
-                continue;
-
-            wF = total - wB; // Weight Foreground
-            if (wF == 0)
-                break;
-
-            sumB += (float) (t * histData[t]);
-
-            float mB = sumB / wB; // Mean Background
-            float mF = (sum - sumB) / wF; // Mean Foreground
-
-            // Calculate Between Class Variance
-            float varBetween = (float) wB * (float) wF * (mB - mF) * (mB - mF);
-
-            // Check if new maximum found
-            if (varBetween > varMax) {
-                varMax = varBetween;
-                threshold = t;
-            }
-        }
-
-        return threshold;
-    }
-
-    public static void cut(String srcpath, String subpath, int x, int y, int width, int height) throws IOException {
-
-        FileInputStream is = null;
-        ImageInputStream iis = null;
-
-        try {
-            // 读取图片文件
-            is = new FileInputStream(srcpath);
-
-            /**//*
-                 * 返回包含所有当前已注册 ImageReader 的 Iterator，这些 ImageReader
-                 * 声称能够解码指定格式。参数：formatName - 包含非正式格式名称 . （例如 "jpeg" 或 "tiff"）等。
-                 */
-            String suffix = srcpath.substring(srcpath.lastIndexOf(".") + 1);
-
-            Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(suffix);
-            ImageReader reader = it.next();
-            // 获取图片流
-            iis = ImageIO.createImageInputStream(is);
-
-            /**//*
-                 * <p>iis:读取源.true:只向前搜索 </p>.将它标记为‘只向前搜索’。
-                 * 此设置意味着包含在输入源中的图像将只按顺序读取，可能允许 reader
-                 * 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
-                 */
-            reader.setInput(iis, true);
-
-            /**//*
-                 * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
-                 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
-                 * getDefaultReadParam 方法中返回 ImageReadParam 的实例。
-                 */
-            ImageReadParam param = reader.getDefaultReadParam();
-
-            /**//*
-                 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域，通过 Rectangle 对象
-                 * 的左上顶点的坐标（x，y）、宽度和高度可以定义这个区域。
-                 */
-            Rectangle rect = new Rectangle(x, y, width, height);
-
-            // 提供一个 BufferedImage，将其用作解码像素数据的目标。
-            param.setSourceRegion(rect);
-
-            /**//*
-                 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象，并将 它作为一个完整的
-                 * BufferedImage 返回。
-                 */
-            BufferedImage bi = reader.read(0, param);
-
-            // 保存新图片
-            ImageIO.write(bi, "jpg", new File(subpath));
-        }
-
-        finally {
-            if (is != null)
-                is.close();
-            if (iis != null)
-                iis.close();
-        }
-
-    }
-
-    // public static void main(String[] args) throws IOException {
-    // // 读取文件夹里面的图片
-    // String fileName = "6chp";
-    // BufferedImage img = ImageIO.read(new File(filePath + fileName + ".jpg"));
-    // // 获取图片的高宽
-    // int width = img.getWidth();
-    // int height = img.getHeight();
-    //
-    // // 循环执行除去干扰像素
-    // for (int i = 1; i < width; i++) {
-    // Color colorFirst = new Color(img.getRGB(i, 1));
-    // int numFirstGet = colorFirst.getRed() + colorFirst.getGreen() +
-    // colorFirst.getBlue();
-    // for (int x = 0; x < width; x++) {
-    // for (int y = 0; y < height; y++) {
-    // Color color = new Color(img.getRGB(x, y));
-    // System.out.println(
-    // "red:" + color.getRed() + " | green:" + color.getGreen() + " | blue:" +
-    // color.getBlue());
-    // int num = color.getRed() + color.getGreen() + color.getBlue();
-    // if (num >= numFirstGet) {
-    // img.setRGB(x, y, Color.WHITE.getRGB());
-    // }
-    // }
-    // }
-    // }
-    //
-    // // 图片背景变黑色
-    // for (int i = 1; i < width; i++) {
-    // Color color1 = new Color(img.getRGB(i, 1));
-    // int num1 = color1.getRed() + color1.getGreen() + color1.getBlue();
-    // for (int x = 0; x < width; x++) {
-    // for (int y = 0; y < height; y++) {
-    // Color color = new Color(img.getRGB(x, y));
-    // System.out.println(
-    // "red:" + color.getRed() + " | green:" + color.getGreen() + " | blue:" +
-    // color.getBlue());
-    // int num = color.getRed() + color.getGreen() + color.getBlue();
-    // if (num == num1) {
-    // img.setRGB(x, y, Color.BLACK.getRGB());
-    // } else {
-    // img.setRGB(x, y, Color.WHITE.getRGB());
-    // }
-    // }
-    // }
-    // }
-    // // 保存图片
-    // File file = new File("C:\\Users\\Gz\\Desktop\\test\\1.jpg");
-    // if (!file.exists()) {
-    // File dir = file.getParentFile();
-    // if (!dir.exists()) {
-    // dir.mkdirs();
-    // }
-    // try {
-    // file.createNewFile();
-    // } catch (IOException e) {
-    // e.printStackTrace();
-    // }
-    // }
-    // ImageIO.write(img, "jpg", file);
-    // }
-}
Index: src/test/java/test/Single.java
===================================================================
--- src/test/java/test/Single.java	(版本 28937)
+++ src/test/java/test/Single.java	(不存在的)
@@ -1,221 +0,0 @@
-package test;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.util.CommonUtils;
-import com.novaone.util.ImgUtil;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class Single {
-
-    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        DesiredCapabilities capabilities = setDownloadsPath();
-        WebDriver driver = null;
-
-        try {
-            String bjh = "120000005993430001";
-            driver = new ChromeDriver(capabilities);
-            // 登录
-            loginPageUrl(driver);
-            log.info("登录成功");
-            // 下载pdf
-            downLoadPdf(driver, bjh);
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                // driver.close();
-                // driver.quit();
-            }
-        }
-    }
-
-    /**
-     * 
-     * downLoadPdf(下载pdf)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:08:36
-     */
-    private static void downLoadPdf(WebDriver driver, String bjh) throws Exception {
-        // 首先需要访问，获取Tiket等参数
-        driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-        TimeUnit.SECONDS.sleep(10);
-        // 获取token
-        driver.get(CommonInfo.PAGE_URL_PDF_SECOND);
-        TimeUnit.SECONDS.sleep(2);
-        driver.switchTo().frame("config_manufacturer");
-        TimeUnit.SECONDS.sleep(1);
-
-        LocalDate currentTime = LocalDate.now();
-        LocalDate startLocal = currentTime.minusDays(3);
-        String stateDate = startLocal.format(formatter);
-        TimeUnit.MILLISECONDS.sleep(200);
-        driver.findElement(By.name("reportDateBegin")).clear();
-        TimeUnit.MILLISECONDS.sleep(200);
-        driver.findElement(By.name("reportDateEnd")).sendKeys(stateDate);
-        TimeUnit.MILLISECONDS.sleep(200);
-        driver.findElement(By.name("certNo")).sendKeys(bjh);
-        driver.findElement(By.name("dataSearch")).click();
-
-        WebElement tableList = driver.findElement(By.className("listTable"));
-
-        List<WebElement> rows = tableList.findElements(By.tagName("tr"));
-        // 从第二个input开始 到倒数第二个
-        WebElement row = rows.get(1);
-        if (row != null) {
-            List<WebElement> tds = row.findElements(By.tagName("td"));
-            WebElement input = row.findElement(By.tagName("input"));
-            boolean flag = input.isSelected();
-            if (!flag) {
-                input.click();
-                driver.findElement(By.name("downButton")).click();
-                String cerNum = tds.get(1).getText();
-                log.info("下载 证书编号完成：" + cerNum);
-                // ftp文件上传
-                // ftpUpload(fileName, cerNum);
-                log.info("ftp文件上传成功：:" + cerNum);
-                // recordDownloadInfo(cerNum);
-            }
-        }
-    }
-
-    /**
-     * 
-     * handleDateQueryParam(日期查询条件)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月25日 下午1:11:52
-     */
-    private static String handleDateQueryParam() {
-        String dateParam = "";
-        LocalDate currentTime = LocalDate.now();
-        LocalDate startLocal = currentTime.minusDays(CommonInfo.QUERY_DATE_TIMES);
-        String stateDate = startLocal.format(formatter);
-        // 查询所有分页查询参数
-        dateParam = "&reportDateBegin=" + stateDate + "&reportDateEnd=" + stateDate;
-        return dateParam;
-    }
-
-    /**
-     * 
-     * loginPageUrl(登录单一窗口)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午6:03:04
-     */
-    private static void loginPageUrl(WebDriver driver) throws Exception {
-        // 设置打开窗口大小
-        driver.get(CommonInfo.PAGE_URL_LOGIN);
-        TimeUnit.SECONDS.sleep(1);
-        Set<Cookie> cookies = driver.manage().getCookies();
-        String cookieStr = "";
-        for (Cookie cookie : cookies) {
-            cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + "; ";
-        }
-        // 获取验证码 并登录
-        getCodeAndLogin(driver, cookieStr);
-    }
-
-    /**
-     * 
-     * getCode(获取验证码并登录)         
-     * @param cookieStr 
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @throws Exception 
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:09:52
-     */
-    private static void getCodeAndLogin(WebDriver driver, String cookieStr) throws Exception {
-        driver.findElement(By.id("verifyCode")).clear();
-        driver.findElement(By.id("swy")).clear();
-        driver.findElement(By.id("swm2")).clear();
-        driver.findElement(By.id("swy")).sendKeys(CommonInfo.USER_NAME);
-
-        // 获取验证码
-        String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL, cookieStr);
-        String newFileName = ImgUtil.imgeHandle("", fileName);
-        String code = ImgUtil.identifyCode(newFileName).replaceAll(" ", "").trim();
-        if (code.length() != 4) {
-            log.info("验证码识别失败");
-            getCodeAndLogin(driver, cookieStr);
-        }
-        try {
-            driver.findElement(By.id("verifyCode")).sendKeys(code);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.findElement(By.id("sub3")).click();
-            TimeUnit.SECONDS.sleep(5);
-            String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-            if (!CommonUtils.isEmpty(errorMsg) || CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-                log.info("验证码识别失败");
-                getCodeAndLogin(driver, cookieStr);
-            }
-        } catch (NoSuchElementException e) {
-            log.info("验证码识别成功");
-        }
-    }
-
-    /**
-     * 
-     * setDownloadsPath(设置chrome下载地址)         
-     * @param   name      
-     * @param  @return    设定文件    
-     * @return String    DOM对象      
-     * @Exception 异常对象    
-     * @@author gz
-     * @date 2020年8月24日 下午5:07:25
-     */
-    public static DesiredCapabilities setDownloadsPath() {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        // 设置为 headless 模式 （无头浏览器）
-        // chromeOptions.addArguments("headless");
-        // 由于新旧版本问题,两个都弄上
-        caps.setCapability("goog:chromeOptions", options);
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-}
Index: src/test/java/test/baidu/AuthService.java
===================================================================
--- src/test/java/test/baidu/AuthService.java	(版本 28937)
+++ src/test/java/test/baidu/AuthService.java	(不存在的)
@@ -1,69 +0,0 @@
-package test.baidu;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.util.CommonUtils;
-
-/**
- * 获取token类
- */
-public class AuthService {
-    private final static Logger log = LoggerFactory.getLogger(AuthService.class);
-
-    // 设置APPIDSK
-    private static final String APP_ID = "20188082";
-
-    // AK
-    private static final String API_KEY = "7k6KFxxo7MWQGrQGmvDitPnX";
-
-    // SK
-    private static final String SECRET_KEY = "iO3HGl9Pqe7BEEdPAXY7NOoQtBMGN7pK";
-
-    // 获取token地址
-    private static final String AUTH_URL = "https://aip.baidubce.com/oauth/2.0/token?";
-
-    /**
-     * 获取API访问token
-     * 该token有一定的有效期，需要自行管理，当失效时需重新获取.
-     * @param ak - 百度云官网获取的 API Key
-     * @param sk - 百度云官网获取的 Securet Key
-     * @return assess_token 示例：
-     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
-     */
-    public static String getAuth() {
-        // // 获取token地址
-        String getAccessTokenUrl = AUTH_URL
-                // 1. grant_type为固定参数
-                + "=client_credentials"
-                // 2. 官网获取的 API Key
-                + "&client_id=" + API_KEY
-                // 3. 官网获取的 Secret Key
-                + "&client_secret=" + SECRET_KEY;
-        try {
-            Map<String, String> parameterMap = new HashMap<String, String>();
-            parameterMap.put("grant_type", "client_credentials");
-            parameterMap.put("client_id", API_KEY);
-            parameterMap.put("client_secret", SECRET_KEY);
-            String result = HttpUtil.post(getAccessTokenUrl, parameterMap, "", "");
-            String access_token = "";
-            JSONObject obj = JSONObject.parseObject(result);
-            if (!CommonUtils.isEmpty(result) && !CommonUtils.isEmpty(obj.getString("access_token"))) {
-                access_token = obj.getString("access_token");
-            }
-            return access_token;
-        } catch (Exception e) {
-            log.error("getAuth error:" + e.getMessage(), e);
-            e.printStackTrace();
-        }
-        return "";
-    }
-
-    public static void main(String[] args) {
-        System.out.println(getAuth());
-    }
-}
\ No newline at end of file
Index: src/test/java/test/baidu/BaseImg64.java
===================================================================
--- src/test/java/test/baidu/BaseImg64.java	(版本 28937)
+++ src/test/java/test/baidu/BaseImg64.java	(不存在的)
@@ -1,45 +0,0 @@
-package test.baidu;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLEncoder;
-import java.util.List;
-import java.util.Map;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-
-import sun.misc.BASE64Encoder;
-
-public class BaseImg64 {
-    /**
-     * 将一张本地图片转化成Base64字符串
-     */
-    public static String getImageStrFromPath(String imgPath) {
-        InputStream in;
-        byte[] data = null;
-        // 读取图片字节数组
-        try {
-            in = new FileInputStream(imgPath);
-            data = new byte[in.available()];
-            in.read(data);
-            in.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        // 对字节数组Base64编码
-        BASE64Encoder encoder = new BASE64Encoder();
-        // 返回Base64编码过再URLEncode的字节数组字符串
-        return URLEncoder.encode(encoder.encode(data));
-    }
-
-    public static void main(String[] args) {
-        String a = "{'log_id': '5025540282209590145', 'words_result_num': '1', 'words_result': [{'words': 'c470'}]}";
-        Map<String, Object> aMap = JSONObject.parseObject(a, Map.class);
-        List<ResultBaiduOCR> list = JSON.parseArray(aMap.get("words_result").toString(), ResultBaiduOCR.class);
-        System.out.println(list.get(0).getWords());
-        String b = "d9b4";
-        System.out.println(b.length());
-    }
-}
Index: src/test/java/test/baidu/Check.java
===================================================================
--- src/test/java/test/baidu/Check.java	(版本 28937)
+++ src/test/java/test/baidu/Check.java	(不存在的)
@@ -1,125 +0,0 @@
-package test.baidu;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.util.CommonUtils;
-
-public class Check {
-
-    private final static Logger log = LoggerFactory.getLogger(Check.class);
-
-    private static final String POST_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
-
-    // token无效
-    private static final String MESSAGE_CODE_ERROR = "110";
-
-    // token过期
-    private static final String MESSAGE_CODE_OUT_DATE = "111";
-
-    static {
-        getAccessToken();
-    }
-
-    /**
-     * 识别本地图片的文字
-     * @throws IOException 
-     */
-    public static String checkFile(String path) throws IOException {
-        String code = null;
-        File file = new File(path);
-        if (!file.exists()) {
-            throw new NullPointerException("图片不存在");
-        }
-        String accessToken = System.getProperty("accessToken");
-        if (CommonUtils.isEmpty(accessToken)) {
-            // accessToken = getAccessToken();
-            accessToken = "24.5a24ad3f2b60d08e6471f1b78a9a0493.2592000.1600409423.282335-20188082";
-        }
-        log.info("accessToken------->" + accessToken);
-        String image = BaseImg64.getImageStrFromPath(path);
-        Map<String, String> parameterMap = new HashMap<String, String>();
-        parameterMap.put("image", image);
-        parameterMap.put("access_token", AuthService.getAuth());
-        String result = "";
-        try {
-            result = HttpUtil.post(POST_URL, parameterMap, null, null);
-            JSONObject res = JSONObject.parseObject(result);
-            log.info("baiduOCR--res--------->" + result);
-            // token过期或错误，重新获取
-            if (!CommonUtils.isEmpty(res) && res.toString().contains("error_code")
-                    && (MESSAGE_CODE_ERROR.equals(res.get("error_code"))
-                            || MESSAGE_CODE_OUT_DATE.equals(res.get("error_code")))) {
-                accessToken = getAccessToken();
-            }
-            if (CommonUtils.isEmpty(res) || res.toString().contains("error_code")) {
-                return null;
-            }
-            JSONArray wordsResult = res.getJSONArray("words_result");
-            List<ResultBaiduOCR> list = JSON.parseArray(wordsResult.toString(), ResultBaiduOCR.class);
-            if (list.size() == 0) {
-                return null;
-            }
-            code = list.get(0).getWords().replace(" ", "");
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("checkFile error:" + e.getMessage(), e);
-            throw e;
-        } finally {
-            // file.delete();
-            log.info(file.getName() + " delete over");
-        }
-        return code;
-    }
-
-    /**
-     * 
-     * getAccessToken(获取token并存储)  
-     * @param accessToken
-     * @return
-     * @return String
-     * @author Gz
-     * @date 2020年6月4日 下午1:40:11  
-     * @Exception 异常对象  
-     * @version 1.0
-     */
-    private static synchronized String getAccessToken() {
-        String accessToken = AuthService.getAuth();
-        if (CommonUtils.isEmpty(accessToken)) {
-            throw new NullPointerException("token获取失败---------------");
-        }
-        System.setProperty("accessToken", accessToken);
-        return accessToken;
-    }
-
-    public static void main(String[] args) throws IOException {
-        try {
-            String dir = "C:\\Users\\Gz\\Desktop\\test\\test";
-            File[] files = new File(dir).listFiles();
-            for (File file : files) {// 循环文件夹中的文件
-                if (file.isFile() && file.exists()) { // 判断文件是否存在
-                    TimeUnit.SECONDS.sleep(1);
-                    String resultNum = checkFile(file.getAbsolutePath()); // 将文件中的数据读取出来，并存放进集合中
-                    String s = "%s | %s";
-                    if (!CommonUtils.isEmpty(resultNum)) {
-                        resultNum = resultNum.replace(" ", "");
-                    }
-                    System.out.println(String.format(s, file.getName(), resultNum));
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-}
Index: src/test/java/test/baidu/HttpUtil.java
===================================================================
--- src/test/java/test/baidu/HttpUtil.java	(版本 28937)
+++ src/test/java/test/baidu/HttpUtil.java	(不存在的)
@@ -1,104 +0,0 @@
-package test.baidu;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.servlet.http.HttpServletRequest;
-
-import com.novaone.util.CommonUtils;
-
-public class HttpUtil {
-    // public static final String url =
-    // "http://121.43.111.181:9000/log/saveLoginLog";
-    // @Value("#{config.url}")
-    // public String url;
-
-    /**
-     * 使用URLConnection实现GET请求
-     * <p/>
-     * 1.实例化一个java.net.URL对象； 2.通过URL对象的openConnection()方法得到一个java.net.URLConnection;
-     * 3.通过URLConnection对象的getInputStream()方法获得输入流； 4.读取输入流； 5.关闭资源；
-     */
-    public static String get(String urlStr) throws Exception {
-
-        URL url = new URL(urlStr);
-        URLConnection urlConnection = url.openConnection(); // 打开连接
-
-        // System.out.println(urlConnection.getURL().toString());
-
-        BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); // 获取输入流
-        String line = null;
-        StringBuilder sb = new StringBuilder();
-        while ((line = br.readLine()) != null) {
-            sb.append(line + "\n");
-        }
-        br.close();
-        // System.out.println(sb.toString());
-        return sb.toString();
-    }
-
-    /**
-     * 使用HttpURLConnection实现POST请求
-     * <p/>
-     * 1.实例化一个java.net.URL对象； 2.通过URL对象的openConnection()方法得到一个java.net.URLConnection;
-     * 3.通过URLConnection对象的getOutputStream()方法获得输出流； 4.向输出流中写数据； 5.关闭资源；
-     */
-    public static String post(String urlStr, Map<String, String> parameterMap, String sessionId, String userId)
-            throws IOException {
-
-        URL url = new URL(urlStr);
-        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-        connection.setDoOutput(true);// 允许连接提交信息
-        connection.setRequestMethod("POST");// 网页提交方式“GET”、“POST”
-        if (!CommonUtils.isEmpty(sessionId)) {
-            connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId + "; userId=" + userId);
-        }
-
-        StringBuffer parameter = new StringBuffer();
-        parameter.append("a=1");
-        for (Entry<String, String> entry : parameterMap.entrySet()) {
-            parameter.append("&" + entry.getKey() + "=" + entry.getValue());
-        }
-        OutputStream os = connection.getOutputStream();
-        os.write(parameter.toString().getBytes("UTF-8"));
-        os.close();
-        // System.out.println("parameter: " + parameter.toString());
-        // System.out.print(connection.getInputStream());
-        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
-        String line = null;
-        StringBuilder sb = new StringBuilder();
-        while ((line = br.readLine()) != null) { // 读取数据
-            sb.append(line + "\n");
-        }
-        br.close();
-        // System.out.println(sb.toString());
-        return sb.toString();
-    }
-
-    public static String getIpAddr(HttpServletRequest request) {
-        String ip = request.getHeader("X-Real-IP");
-        if (CommonUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
-            return ip;
-        }
-        ip = request.getHeader("X-Forwarded-For");
-        if (!CommonUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
-            // 多次反向代理后会有多个IP值，第一个为真实IP。
-            int index = ip.indexOf(',');
-            if (index != -1) {
-                return ip.substring(0, index);
-            } else {
-                return ip;
-            }
-        } else {
-            return request.getRemoteAddr();
-        }
-    }
-
-}
Index: src/test/java/test/baidu/ResultBaiduOCR.java
===================================================================
--- src/test/java/test/baidu/ResultBaiduOCR.java	(版本 28937)
+++ src/test/java/test/baidu/ResultBaiduOCR.java	(不存在的)
@@ -1,15 +0,0 @@
-package test.baidu;
-
-public class ResultBaiduOCR {
-
-    private String words;
-
-    public String getWords() {
-        return words;
-    }
-
-    public void setWords(String words) {
-        this.words = words;
-    }
-
-}
Index: src/test/java/test/dongrou/ApplySingleDr.java
===================================================================
--- src/test/java/test/dongrou/ApplySingleDr.java	(版本 28937)
+++ src/test/java/test/dongrou/ApplySingleDr.java	(不存在的)
@@ -1,244 +0,0 @@
-package test.dongrou;
-
-import java.awt.AWTException;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.common.CommonInfo;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ApplySingleDr {
-
-    // 报关单号查询input框 class
-    public static final String APPLY_BGDH_INPUT_CLASS = "ep-input__inner";
-
-    // 蓝色button class
-    public static final String APPLY_BGDH_BLUE_BUTTON_CLASS = "ep-button ep-button--primary ep-button--small";
-
-    // 绿色button class
-    public static final String APPLY_BGDH_GREEN_BUTTON_CLASS = "ep-button ep-button--success ep-button--small";
-
-    // 申报选择框 xpath
-    public static final String APPLY_BGDH_APPLY_SELECT_XPAH = "//form/div/div[3]/div/div/div/div/input";
-
-    // 下拉选项 xpath
-    public static final String APPLY_BGDH_APPLY_SELECT_DATA_XPATH = "//ul[contains(@class,'ep-cascader-list')]/li[3]";
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        ChromeOptions chromeOptions = new ChromeOptions();
-        // 设置为 headless 模式 （无头浏览器）
-        chromeOptions.addArguments("headless");
-        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
-        // 由于新旧版本问题,两个都弄上
-        capabilities.setCapability("goog:chromeOptions", chromeOptions);
-        capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
-        WebDriver driver = null;
-
-        try {
-            // driver = new RemoteWebDriver(new
-            // URL(CommonInfo.REMOTE_DRIVER_URL), capabilities);
-            driver = new ChromeDriver();
-
-            // GrabPdfServiceImpl grabPdfServiceImpl = new GrabPdfServiceImpl();
-            // 登录
-            // grabPdfServiceImpl.loginPageUrl(driver);
-            // 设置打开窗口大小
-            driver.get(CommonInfo.PAGE_URL_LOGIN);
-            TimeUnit.SECONDS.sleep(1);
-            driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-            TimeUnit.SECONDS.sleep(1);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            TimeUnit.SECONDS.sleep(2);
-
-            // 已申报:
-            String bgdh = "224820201000162619";// 已确认
-            // String bgdh = "224820201000171044";// 待确认
-            driver.get(CommonInfo.PAGE_URL_PDF_FIRST);
-            log.info("登录成功-----------------------------------");
-            TimeUnit.SECONDS.sleep(5);
-            Cookie cookie = driver.manage().getCookieNamed("epoa.refresh_token");
-            String refreshToken = cookie.getValue();
-            log.info("fresh token:" + refreshToken);
-            Map<String, Object> maps = new HashMap<String, Object>();
-            maps.put("data", refreshToken);
-            maps.put("time", System.currentTimeMillis());
-            maps.put("exdays", 15);
-            String epToken = JSONObject.toJSONString(maps);
-            driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-            TimeUnit.SECONDS.sleep(2);
-            JavascriptExecutor js = (JavascriptExecutor) driver;// 将driver转换为js
-            String jsStr = "var obj = JSON.stringify(" + epToken + ");" + " localStorage.setItem('eptoken', obj);";
-            js.executeScript(jsStr);
-            driver.navigate().refresh();
-            TimeUnit.SECONDS.sleep(2);
-            driver.get(CommonInfo.APPLY_BGDH_PAGE_MAIN);
-            TimeUnit.SECONDS.sleep(2);
-            log.info("**********打开电子化出证申报成功************");
-            driver.findElement(By.className(APPLY_BGDH_INPUT_CLASS)).clear();
-            driver.findElement(By.className(APPLY_BGDH_INPUT_CLASS)).sendKeys(bgdh);
-            // 蓝色按钮
-            List<WebElement> blueButtons = driver
-                    .findElements(By.cssSelector("[class='" + APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-            blueButtons.get(1).click();
-            // driver.findElement(By.xpath(APPLY_BGDH_INPUT_BUTTON_XPATH)).click();
-            TimeUnit.SECONDS.sleep(5);
-            String dataMsg = "";
-            try {
-                dataMsg = driver.findElement(By.className("ep-table-empty-text")).getText();
-            } catch (Exception e) {
-                log.info("查到数据");
-            }
-            if (!"无数据".equals(dataMsg)) {
-                String statusInfo = "";
-                try {
-                    statusInfo = driver.findElement(By.xpath("//*/tbody//*/b")).getText();
-                } catch (Exception e) {
-                    log.info("状态未抓取到");
-                }
-                grabVerifyInfo(driver, bgdh);
-                switch (statusInfo) {
-                case "已确认":
-                    // 暂时没有数据，拿待确认数据模拟一下
-                    applyData(driver, blueButtons, bgdh);
-                    log.info("bgdh-->" + bgdh + " 已确认");
-                    break;
-                case "待确认":
-                    log.info("bgdh-->" + bgdh + " 待确认");
-                    break;
-                case "已撤回":
-
-                    log.info("bgdh-->" + bgdh + " 已撤回");
-                    break;
-                default:
-                    break;
-                }
-                return;
-            }
-            if ("无数据".equals(dataMsg)) {
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private static void grabVerifyInfo(WebDriver driver, String bgdh) throws InterruptedException {
-        // 点击审核记录
-        driver.findElements(By.xpath("//button[@class='ep-button ep-button--info ep-button--mini']")).get(1).click();
-        TimeUnit.SECONDS.sleep(3);
-        WebElement table = driver.findElements(By.xpath("//div[@class='ep-model-body']//table")).get(1);
-        List<WebElement> rows = table.findElements(By.tagName("tr"));
-        if (!CommonUtils.isEmpty(rows)) {
-            for (WebElement row : rows) {
-                List<WebElement> tds = row.findElements(By.tagName("td"));
-                String template = "%s | %s | %s | %s | %s ";
-                String format = String.format(template, tds.get(0).getText(), tds.get(1).getText(),
-                        tds.get(2).getText(), tds.get(3).getText(), tds.get(4).getText());
-                System.out.println(format);
-            }
-        }
-        // 关闭审核记录弹框
-        driver.findElement(By.xpath("//span[text()='审核记录']/parent::div/parent::div/div[@class='ep-model-close']"))
-                .click();
-
-    }
-
-    private static void applyData(WebDriver driver, List<WebElement> blueButtons, String bgdh)
-            throws InterruptedException, AWTException, IOException {
-        // 绿色按钮
-        List<WebElement> greenButtons = driver
-                .findElements(By.cssSelector("[class='" + APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-        log.info("------------新增");
-        // 新增补充信息
-        greenButtons.get(0).click();
-        TimeUnit.SECONDS.sleep(2);
-        // 输入报关单号
-        List<WebElement> inputs = driver.findElements(By.className(APPLY_BGDH_INPUT_CLASS));
-        inputs.get(1).sendKeys(bgdh);
-        blueButtons = driver.findElements(By.cssSelector("[class='" + APPLY_BGDH_BLUE_BUTTON_CLASS + "']"));
-        // 输入报关单号，确定
-        blueButtons.get(2).click();
-        TimeUnit.SECONDS.sleep(5);
-
-        // 点击下拉
-        driver.findElement(By.xpath(APPLY_BGDH_APPLY_SELECT_XPAH)).click();
-        TimeUnit.SECONDS.sleep(1);
-        // 选择数据
-        driver.findElement(By.xpath(APPLY_BGDH_APPLY_SELECT_DATA_XPATH)).click();
-        TimeUnit.SECONDS.sleep(2);
-        // 上传excel
-        List<WebElement> upButton = driver.findElements(By.cssSelector("[class=' ion-upload']"));
-        upButton.get(0).click();
-        TimeUnit.SECONDS.sleep(1);
-        // 点击选择文件按钮
-        driver.findElements(By.xpath("//i[@class=' ion-search']")).get(1).click();
-        TimeUnit.SECONDS.sleep(3);
-        Runtime.getRuntime().exec("cmd /c " + "upExcel.exe " + bgdh, null, new File("C:\\Users\\Gz\\Desktop"));
-        // uploadExcel(filePath);
-        TimeUnit.SECONDS.sleep(2);
-        upButton = driver.findElements(By.cssSelector("[class=' ion-upload']"));
-        upButton.get(1).click();
-        TimeUnit.MILLISECONDS.sleep(800);
-        String alertUpInfo = "";
-        try {
-            alertUpInfo = driver.findElement(By.className("ep-message--group")).getText();
-        } catch (Exception e) {
-            log.info("bgdh:" + bgdh + " 上传成功");
-        }
-
-        if ("导入数据为空或模板不正确".equals(alertUpInfo)) {
-            log.info("excel 上传导入数据为空或模板不正确" + bgdh);
-            return;
-        }
-        // System.out.println("----------------");
-        // greenButtons = driver.findElements(By.cssSelector("[class='" +
-        // APPLY_BGDH_GREEN_BUTTON_CLASS + "']"));
-        // greenButtons.get(1).click();
-        // TimeUnit.SECONDS.sleep(2);
-        // List<WebElement> commonButton = driver
-        // .findElements(By.cssSelector("[class='ep-button ep-button--text
-        // ep-button--small']"));
-        // commonButton.get(3).click();
-    }
-    // robot 不推荐，容易埋雷
-    // public static void uploadExcel(String filePath) throws AWTException,
-    // InterruptedException {
-    // TimeUnit.SECONDS.sleep(8);
-    // File localFile = new File(filePath);
-    // StringSelection stringSelection = new
-    // StringSelection(localFile.getAbsolutePath());
-    // Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection,
-    // null);
-    // Robot robot = new Robot();
-    // robot.keyPress(KeyEvent.VK_CONTROL);
-    // robot.keyPress(KeyEvent.VK_V);
-    // robot.keyRelease(KeyEvent.VK_V);
-    // robot.keyRelease(KeyEvent.VK_CONTROL);
-    // robot.delay(100);
-    // robot.keyRelease(KeyEvent.VK_TAB);
-    // robot.keyPress(KeyEvent.VK_ENTER);
-    // robot.delay(100);
-    // robot.keyRelease(KeyEvent.VK_ENTER);
-    // }
-}
Index: src/test/java/test/dongrou/Excel.java
===================================================================
--- src/test/java/test/dongrou/Excel.java	(版本 28937)
+++ src/test/java/test/dongrou/Excel.java	(不存在的)
@@ -1,58 +0,0 @@
-package test.dongrou;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import com.alibaba.fastjson.JSONObject;
-
-import jxl.Sheet;
-import jxl.Workbook;
-import jxl.read.biff.BiffException;
-
-public class Excel {
-    public static void main(String[] args) {
-        Excel obj = new Excel();
-        File file = new File("C:\\Users\\Gz\\Desktop\\MWMU6401747厦门国贸冻品文件.xls");
-        List excelList = obj.readExcel(file);
-        System.out.println("list中的数据打印出来：" + JSONObject.toJSONString(excelList));
-    }
-
-    // 去读Excel的方法readExcel，该方法的入口参数为一个File对象
-    public List<String> readExcel(File file) {
-        try {
-            // 创建输入流，读取Excel
-            InputStream is = new FileInputStream(file.getAbsolutePath());
-            // jxl提供的Workbook类
-            Workbook wb = Workbook.getWorkbook(is);
-            // Excel的页签数量
-            int sheet_size = wb.getNumberOfSheets();
-            Set<String> outerList = new HashSet<String>();
-            // 每个页签创建一个Sheet对象
-            Sheet sheet = wb.getSheet(0);
-            // sheet.getRows()返回该页的总行数
-            for (int i = 1; i < sheet.getRows(); i++) {
-                String cellinfo = sheet.getCell(3, i).getContents();
-                System.out.println("cellinfo:" + cellinfo);
-                if (cellinfo.isEmpty()) {
-                    continue;
-                }
-                outerList.add(cellinfo);
-            }
-            return new ArrayList<>(outerList);
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (BiffException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}
\ No newline at end of file
Index: src/test/java/test/dongrou/FtpDongrou.java
===================================================================
--- src/test/java/test/dongrou/FtpDongrou.java	(版本 28937)
+++ src/test/java/test/dongrou/FtpDongrou.java	(不存在的)
@@ -1,26 +0,0 @@
-package test.dongrou;
-
-import java.io.File;
-import java.util.List;
-
-import com.alibaba.fastjson.JSONObject;
-import com.novaone.util.CommonUtils;
-import com.novaone.util.FtpUtil;
-
-public class FtpDongrou {
-
-    private static final String localPath = "applyDR";
-
-    public static void main(String[] args) throws Exception {
-        FtpUtil ftpUtil = new FtpUtil();
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            List<String> filePathList = ftpUtil.downloadFtpAllFiles(File.separatorChar + localPath, localPath);
-            System.out.println(JSONObject.toJSONString(filePathList));
-            if (!CommonUtils.isEmpty(filePathList)) {
-                ftpUtil.delete(filePathList);
-            }
-        }
-    }
-
-}
Index: src/test/java/test/dongrou/RobotUpload.java
===================================================================
--- src/test/java/test/dongrou/RobotUpload.java	(版本 28937)
+++ src/test/java/test/dongrou/RobotUpload.java	(不存在的)
@@ -1,29 +0,0 @@
-package test.dongrou;
-
-import java.awt.AWTException;
-import java.awt.Robot;
-import java.awt.Toolkit;
-import java.awt.datatransfer.StringSelection;
-import java.awt.event.KeyEvent;
-import java.util.concurrent.TimeUnit;
-
-public class RobotUpload {
-
-    public static void main(String[] args) throws AWTException, InterruptedException {
-        TimeUnit.SECONDS.sleep(9);
-        StringSelection stringSelection = new StringSelection(
-                "D:\\workspacenew\\ccsehgpdf\\applyDR\\224820201000170104.xls");
-        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
-        Robot robot = new Robot();
-        robot.keyPress(KeyEvent.VK_CONTROL);
-        robot.keyPress(KeyEvent.VK_V);
-        robot.keyRelease(KeyEvent.VK_V);
-        robot.keyRelease(KeyEvent.VK_CONTROL);
-        robot.delay(100);
-        robot.keyRelease(KeyEvent.VK_TAB);
-        robot.keyPress(KeyEvent.VK_ENTER);
-        robot.delay(100);
-        robot.keyRelease(KeyEvent.VK_ENTER);
-    }
-
-}
Index: src/test/java/test/dongrou/Test.java
===================================================================
--- src/test/java/test/dongrou/Test.java	(版本 28937)
+++ src/test/java/test/dongrou/Test.java	(不存在的)
@@ -1,46 +0,0 @@
-package test.dongrou;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-
-import com.novaone.util.CommonUtils;
-
-public class Test {
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        WebDriver driver = null;
-
-        try {
-            driver = new ChromeDriver();
-            driver.get("C:\\Users\\Gz\\Desktop\\upload.html");
-            TimeUnit.SECONDS.sleep(3);
-            WebElement table = driver.findElements(By.xpath("//div[@class='ep-model-body']//table")).get(1);
-            List<WebElement> rows = table.findElements(By.tagName("tr"));
-            if (!CommonUtils.isEmpty(rows)) {
-                for (WebElement row : rows) {
-                    List<WebElement> tds = row.findElements(By.tagName("td"));
-                    String template = "%s | %s | %s | %s | %s ";
-                    String format = String.format(template, tds.get(0).getText(), tds.get(1).getText(),
-                            tds.get(2).getText(), tds.get(3).getText(), tds.get(4).getText());
-                    System.out.println(format);
-
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            driver.close();
-            driver.quit();
-        }
-    }
-
-}
Index: src/test/java/test/dongrou/TestCmd.java
===================================================================
--- src/test/java/test/dongrou/TestCmd.java	(版本 28937)
+++ src/test/java/test/dongrou/TestCmd.java	(不存在的)
@@ -1,27 +0,0 @@
-package test.dongrou;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.openqa.selenium.WebDriver;
-
-public class TestCmd {
-
-    public static void main(String[] args) throws IOException {
-        WebDriver driver = null;
-
-        try {
-            Process p = Runtime.getRuntime().exec("cmd /c " + "upExcel.exe 224820201000171044", null,
-                    new File("C:\\Users\\Gz\\Desktop"));
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-}
Index: src/test/java/test/dongrou/TestT.java
===================================================================
--- src/test/java/test/dongrou/TestT.java	(版本 28937)
+++ src/test/java/test/dongrou/TestT.java	(不存在的)
@@ -1,29 +0,0 @@
-package test.dongrou;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class TestT {
-
-    public static void main(String[] args) throws FileNotFoundException {
-        List<String> a = new ArrayList<>();
-        List<String> b = new ArrayList<>();
-        Set<String> c = new HashSet<String>();
-        a.add("a");
-        a.add("b");
-        b.add("a");
-        b.add("b");
-        c.add("a");
-        c.add("b");
-        System.out.println(c.containsAll(b) && b.containsAll(c));
-
-        InputStream is = new FileInputStream("applyDR" + File.separatorChar + "224820201000169172.xls");
-    }
-
-}
Index: src/test/java/test/newpdf/PdfAll.java
===================================================================
--- src/test/java/test/newpdf/PdfAll.java	(版本 28937)
+++ src/test/java/test/newpdf/PdfAll.java	(不存在的)
@@ -1,173 +0,0 @@
-package test.newpdf;
-
-import java.io.File;
-import java.time.LocalDate;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class PdfAll {
-
-    private static String savePath = CommonInfo.PDF_DOWN_LOCAL_URL + "\\";
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        DesiredCapabilities capabilities = setDownloadsPath();
-        WebDriver driver = null;
-
-        try {
-            driver = new ChromeDriver(capabilities);
-            // 登录
-            loginPageUrl(driver);
-            log.info("登录成功");
-            // 打开网站
-            driver.get("https://swapp.singlewindow.cn/ecertwebserver/sw/ecert/login/query");
-            TimeUnit.SECONDS.sleep(3);
-            // 下载pdf
-            downLoadPdf(driver);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    private static void downLoadPdf(WebDriver driver) throws Exception {
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("ecertLoginClear")).click();
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("reportDate")).clear();
-        LocalDate localDate = LocalDate.now();
-        driver.findElement(By.id("reportDate")).sendKeys(localDate.toString());
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("ecertLoginQuery")).click();
-        TimeUnit.SECONDS.sleep(2);
-        try {
-            String queryResult = driver.findElement(By.className("no-records-found")).getText();
-            if ("暂无数据".equals(queryResult)) {
-                log.info("批量下载  暂无数据");
-                return;
-            }
-        } catch (Exception e) {
-        }
-        try {
-            // 点击分页按钮
-            driver.findElement(By.xpath(
-                    "//span[@class='btn-group dropup']/button[@class='btn btn-default  btn-outline dropdown-toggle']"))
-                    .click();
-            TimeUnit.MILLISECONDS.sleep(800);
-            WebElement ul = driver.findElement(By.xpath("//span[@class='btn-group dropup open']//ul"));
-            List<WebElement> lis = ul.findElements(By.tagName("li"));
-            // 选择最后分页
-            lis.get(lis.size() - 1).click();
-            TimeUnit.SECONDS.sleep(5);
-            log.info("有分页");
-        } catch (Exception e) {
-            log.info("无分页");
-        }
-        List<WebElement> trList = driver.findElements(By.name("downloadPDF"));
-        for (WebElement tr : trList) {
-            String downStr = tr.getAttribute("onclick");
-            String cerNum = handleDownStr(downStr);
-            if (CommonUtils.isEmpty(cerNum)) {
-                log.info("cerNum 获取失败  为空，cerNum：" + cerNum);
-                continue;
-            }
-            tr.click();
-            String fileName = cerNum + ".pdf";
-            log.info("下载 证书编号完成：" + cerNum);
-            TimeUnit.SECONDS.sleep(3);
-            try {
-                new File(savePath + fileName);
-            } catch (Exception e) {
-                TimeUnit.SECONDS.sleep(5);
-                log.error("bjh:" + cerNum + " " + e.getMessage());
-                e.printStackTrace();
-            }
-            TimeUnit.SECONDS.sleep(2);
-        }
-    }
-
-    private static String handleDownStr(String downStr) {
-        if (CommonUtils.isEmpty(downStr)) {
-            return "";
-        }
-        downStr = downStr.replace("downloadPDF(", "").replace(")", "").replace("'", "");
-        return downStr.split(",")[0];
-    }
-
-    private static void loginPageUrl(WebDriver driver) throws Exception {
-        // 设置打开窗口大小
-        driver.get(CommonInfo.PAGE_URL_LOGIN);
-        TimeUnit.SECONDS.sleep(1);
-        Set<Cookie> cookies = driver.manage().getCookies();
-        String cookieStr = "";
-        for (Cookie cookie : cookies) {
-            cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + "; ";
-        }
-        // 获取验证码 并登录
-        getCodeAndLogin(driver, cookieStr);
-    }
-
-    private static void getCodeAndLogin(WebDriver driver, String cookieStr) throws Exception {
-        driver.findElement(By.id("verifyCode")).clear();
-        driver.findElement(By.id("swm1")).clear();
-        driver.findElement(By.id("swm2")).clear();
-        driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-        // 获取验证码
-        // String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL,
-        // cookieStr);
-        // String code = platGetCode(fileName);
-        try {
-            // driver.findElement(By.id("verifyCode")).sendKeys(code);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.findElement(By.id("sub3")).click();
-            TimeUnit.SECONDS.sleep(5);
-
-            String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-            if (!CommonUtils.isEmpty(errorMsg) || CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-                log.info("验证码识别失败");
-            }
-        } catch (NoSuchElementException e) {
-            log.info("验证码识别成功");
-        }
-    }
-
-    public static DesiredCapabilities setDownloadsPath() {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        // 设置为 headless 模式 （无头浏览器）
-        // chromeOptions.addArguments("headless");
-        // 由于新旧版本问题,两个都弄上
-        caps.setCapability("goog:chromeOptions", options);
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-}
Index: src/test/java/test/newpdf/PdfDown.java
===================================================================
--- src/test/java/test/newpdf/PdfDown.java	(版本 28937)
+++ src/test/java/test/newpdf/PdfDown.java	(不存在的)
@@ -1,128 +0,0 @@
-package test.newpdf;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.util.CommonUtils;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class PdfDown {
-
-    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        DesiredCapabilities capabilities = setDownloadsPath();
-        WebDriver driver = null;
-
-        try {
-            String bjh = "121000000222452001";
-            driver = new ChromeDriver(capabilities);
-            // 登录
-            loginPageUrl(driver);
-            log.info("登录成功");
-            // 打开网站
-            driver.get("https://swapp.singlewindow.cn/ecertwebserver/sw/ecert/login/query");
-            TimeUnit.SECONDS.sleep(3);
-            // 下载pdf
-            downLoadPdf(driver, bjh);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    private static void downLoadPdf(WebDriver driver, String bjh) throws Exception {
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("ecertLoginClear")).click();
-        TimeUnit.MILLISECONDS.sleep(100);
-        driver.findElement(By.id("certNo")).sendKeys(bjh);
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("reportDate")).clear();
-        LocalDate localDate = LocalDate.now();
-        String startDateParam = localDate.minus(30, ChronoUnit.DAYS).toString();
-        driver.findElement(By.id("reportDate")).sendKeys(startDateParam);
-        TimeUnit.MILLISECONDS.sleep(300);
-        driver.findElement(By.id("ecertLoginQuery")).click();
-        TimeUnit.SECONDS.sleep(2);
-        driver.findElement(By.name("downloadPDF")).click();
-        TimeUnit.SECONDS.sleep(10);
-
-    }
-
-    private static void loginPageUrl(WebDriver driver) throws Exception {
-        // 设置打开窗口大小
-        driver.get(CommonInfo.PAGE_URL_LOGIN);
-        TimeUnit.SECONDS.sleep(1);
-        Set<Cookie> cookies = driver.manage().getCookies();
-        String cookieStr = "";
-        for (Cookie cookie : cookies) {
-            cookieStr = cookieStr + cookie.getName() + "=" + cookie.getValue() + "; ";
-        }
-        // 获取验证码 并登录
-        getCodeAndLogin(driver, cookieStr);
-    }
-
-    private static void getCodeAndLogin(WebDriver driver, String cookieStr) throws Exception {
-        driver.findElement(By.id("verifyCode")).clear();
-        driver.findElement(By.id("swm1")).clear();
-        driver.findElement(By.id("swm2")).clear();
-        driver.findElement(By.id("swm1")).sendKeys(CommonInfo.USER_NAME);
-        // 获取验证码
-        // String fileName = ImgUtil.downloadImgByNet(CommonInfo.CODE_URL,
-        // cookieStr);
-        // String code = platGetCode(fileName);
-        try {
-            // driver.findElement(By.id("verifyCode")).sendKeys(code);
-            driver.findElement(By.id("swm2")).sendKeys(CommonInfo.PASS_WORD);
-            driver.findElement(By.id("sub3")).click();
-            TimeUnit.SECONDS.sleep(5);
-
-            String errorMsg = driver.findElement(By.id("errorMsg")).getText();
-            if (!CommonUtils.isEmpty(errorMsg) || CommonInfo.CODE_ERROR_MSG.equals(errorMsg)) {
-                log.info("验证码识别失败");
-            }
-        } catch (NoSuchElementException e) {
-            log.info("验证码识别成功");
-        }
-    }
-
-    public static DesiredCapabilities setDownloadsPath() {
-        String downloadsPath = CommonInfo.PDF_DOWN_LOCAL_URL;
-        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
-        chromePrefs.put("download.default_directory", downloadsPath);
-        ChromeOptions options = new ChromeOptions();
-        options.setExperimentalOption("prefs", chromePrefs);
-        DesiredCapabilities caps = new DesiredCapabilities();
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        // 设置为 headless 模式 （无头浏览器）
-        // chromeOptions.addArguments("headless");
-        // 由于新旧版本问题,两个都弄上
-        caps.setCapability("goog:chromeOptions", options);
-        caps.setCapability(ChromeOptions.CAPABILITY, options);
-        return caps;
-    }
-
-}
Index: src/test/java/test/newpdf/Test.java
===================================================================
--- src/test/java/test/newpdf/Test.java	(版本 28937)
+++ src/test/java/test/newpdf/Test.java	(不存在的)
@@ -1,66 +0,0 @@
-package test.newpdf;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class Test {
-    static {
-        System.setProperty("webdriver.chrome.driver", "C:\\hk\\chromedriver.exe");
-    }
-
-    public static void main(String[] args) {
-        WebDriver driver = null;
-
-        try {
-            driver = new ChromeDriver();
-            log.info("登录成功");
-            // 打开网站
-            driver.get("C:\\Users\\Gz\\Desktop\\single.html");
-            // 下载pdf
-            downLoadPdf(driver);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            if (driver != null) {
-                driver.close();
-                driver.quit();
-            }
-        }
-    }
-
-    private static void downLoadPdf(WebDriver driver) throws Exception {
-
-        List<WebElement> trList = driver.findElements(By.name("downloadPDF"));
-        // 总条数
-        Integer pageNum = handleQueryPageNum(driver);
-        System.out.println("pageNum:" + pageNum);
-        for (WebElement tr : trList) {
-            log.info("text:" + tr.getText());
-            log.info("onclick:" + tr.getAttribute("onclick"));
-            log.info(tr.findElement(By.tagName("u")).getText());
-            tr.click();
-            TimeUnit.SECONDS.sleep(3);
-        }
-    }
-
-    private static Integer handleQueryPageNum(WebDriver driver) {
-        String pageNum = driver.findElement(By.className("pagination-info")).getText();
-        // 总条数
-        int strStartIndex = pageNum.indexOf("共") + 1;
-        int strEndIndex = pageNum.indexOf("条");
-        String newPageNum = pageNum.substring(strStartIndex, strEndIndex);
-        strStartIndex = newPageNum.indexOf("共") + 1;
-        /* 开始截取 */
-        pageNum = newPageNum.substring(strStartIndex);
-        return Integer.parseInt(pageNum.trim());
-    }
-
-}
Index: src/test/java/test/newpdf/TestDel.java
===================================================================
--- src/test/java/test/newpdf/TestDel.java	(版本 28937)
+++ src/test/java/test/newpdf/TestDel.java	(不存在的)
@@ -1,12 +0,0 @@
-package test.newpdf;
-
-public class TestDel {
-
-    public static void main(String[] args) {
-        String str = "downloadPDF('121000000222440001','202101211450380763030988271691','202100000000102859')";
-        str = str.replace("downloadPDF(", "").replace(")", "").replace("'", "");
-        System.out.println(str);
-        System.out.println(str.split(",")[0]);
-    }
-
-}
Index: src/test/java/test/pdf/Ftp.java
===================================================================
--- src/test/java/test/pdf/Ftp.java	(版本 28937)
+++ src/test/java/test/pdf/Ftp.java	(不存在的)
@@ -1,28 +0,0 @@
-package test.pdf;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.novaone.common.CommonInfo;
-import com.novaone.util.FtpUtil;
-
-public class Ftp {
-
-    public static void main(String[] args) throws Exception {
-        String fileName = "120000005486837001.pdf";
-        FtpUtil ftpUtil = new FtpUtil();
-        FileInputStream fileInputStream = new FileInputStream(CommonInfo.PDF_DOWN_LOCAL_URL + "\\" + fileName);
-        Map<String, InputStream> map = new HashMap<String, InputStream>();
-        map.put(fileName, fileInputStream);
-        boolean ftpStatus = ftpUtil.connect();
-        if (ftpStatus) {
-            boolean upStatus = ftpUtil.upload(map);
-            if (!upStatus) {
-                throw new Exception("ftp 文件上传失败");
-            }
-        }
-
-    }
-}
Index: src/test/java/test/pdf/Http.java
===================================================================
--- src/test/java/test/pdf/Http.java	(版本 28937)
+++ src/test/java/test/pdf/Http.java	(不存在的)
@@ -1,88 +0,0 @@
-package test.pdf;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-
-public class Http {
-
-    public static void main(String[] args) {
-        String urlStr = "http://ccsehg.singlewindow.cn/ccsehg/controller?SERVICE_ID=APQS_DECLARE_MANAGE_DOWNLOAD_FILE_SERVICE&certNoN=120000005385978002&serialNo=0741";
-
-        Map<String, String> parameterMap = new HashMap<String, String>();
-        parameterMap.put("framework_buttonName", "");
-        parameterMap.put("certNo", "");
-        try {
-            post(urlStr, parameterMap, "E9125A772ACB551B98537DB55A817EBB", "");
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 从网络Url中下载文件
-     * @param urlStr
-     * @param fileName
-     * @param savePath
-     * @throws IOException
-     */
-    public static void post(String urlStr, Map<String, String> parameterMap, String sessionId, String userId)
-            throws IOException {
-
-        StringBuffer parameter = new StringBuffer();
-        for (Entry<String, String> entry : parameterMap.entrySet()) {
-            parameter.append("&" + entry.getKey() + "=" + entry.getValue());
-        }
-
-        OkHttpClient client = new OkHttpClient();
-
-        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
-        RequestBody body = RequestBody.create(mediaType, parameter.toString());
-        Request request = new Request.Builder().url(urlStr).post(body).addHeader("Cookie", "JSESSIONID=" + sessionId)
-                .addHeader("cache-control", "no-cache").build();
-
-        Response response = client.newCall(request).execute();
-
-        InputStream is = null;
-        byte[] buf = new byte[2048];
-        int len = 0;
-        FileOutputStream fos = null;
-        // 储存下载文件的目录
-        String savePath = "D:\\ccsehgpdf\\download\\";
-        try {
-            is = response.body().byteStream();
-            File file = new File(savePath + "test1.pdf");
-            fos = new FileOutputStream(file);
-            while ((len = is.read(buf)) != -1) {
-                fos.write(buf, 0, len);
-            }
-            fos.flush();
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (is != null)
-                    is.close();
-            } catch (IOException e) {
-            }
-            try {
-                if (fos != null)
-                    fos.close();
-            } catch (IOException e) {
-            }
-        }
-
-    }
-
-}
Index: src/test/java/test/pdf/test.java
===================================================================
--- src/test/java/test/pdf/test.java	(版本 28937)
+++ src/test/java/test/pdf/test.java	(不存在的)
@@ -1,64 +0,0 @@
-package test.pdf;
-
-import java.io.File;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.concurrent.TimeUnit;
-
-import com.novaone.common.CommonInfo;
-
-public class test {
-
-    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-
-    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
-    public static void main(String[] args) throws ParseException {
-        String pageNum = "第1页 共6页 共56条";
-        // String pageNum = "第1页 共44页 共438条";
-        /* 找出指定的2个字符在 该字符串里面的 位置 */
-        int strStartIndex = pageNum.indexOf("共") + 1;
-        int strEndIndex = pageNum.indexOf("条");
-        String newPageNum = pageNum.substring(strStartIndex, strEndIndex);
-        strStartIndex = newPageNum.indexOf("共") + 1;
-        /* 开始截取 */
-        String result = newPageNum.substring(strStartIndex);
-        System.out.println("result:" + result);
-        System.out.println(pageNum.subSequence(9, 11));
-        LocalDate currentTime = LocalDate.now();
-        System.out.println("当前时间转换" + currentTime.format(formatter));
-        LocalDate start = currentTime.minusDays(1);
-        System.out.println("当前时间转换" + start.format(formatter));
-        System.out.println(sdf.parse(start.format(formatter)));
-        // try {
-        // for (int i = 0; i < 5; i++) {
-        // boolean fileStatus = judgeFileIsExist("\\test" + i + ".pdf", 5);
-        // if (fileStatus) {
-        // System.out.println("\\test" + i + ".pdf 下载完成");
-        // continue;
-        // }
-        // }
-        // } catch (Exception e) {
-        // e.printStackTrace();
-        // }
-
-    }
-
-    private static boolean judgeFileIsExist(String downFileName, int times) throws Exception {
-        TimeUnit.SECONDS.sleep(1);
-        if (times < 0) {
-            throw new Exception("judgeFileIsExist:一直未下载成功：" + downFileName);
-        }
-        System.out.println("filePath:" + CommonInfo.PDF_DOWN_LOCAL_URL + downFileName);
-        File file = new File(CommonInfo.PDF_DOWN_LOCAL_URL + downFileName);
-        if (file.exists()) {
-            return true;
-        } else {
-            TimeUnit.SECONDS.sleep(2);
-            times = times - 1;
-            return judgeFileIsExist(downFileName, times);
-        }
-    }
-}
