Index: pom.xml
===================================================================
--- pom.xml	(revision 29041)
+++ pom.xml	(working copy)
@@ -26,10 +26,16 @@
 		<scope>provided</scope>
 	</dependency>
 	<dependency>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-jta-atomikos</artifactId>
+		<groupId>org.apache.commons</groupId>
+		<artifactId>commons-lang3</artifactId>
+		<version>3.9</version>
 	</dependency>
 	<dependency>
+		<groupId>com.google.code.gson</groupId>
+		<artifactId>gson</artifactId>
+		<version>2.8.5</version>
+	</dependency>
+	<dependency>
 		<groupId>com.alibaba</groupId>
 		<artifactId>fastjson</artifactId>
 		<version>1.2.56</version>
Index: src/main/java/com/novaone/common/CommonInfo.java
===================================================================
--- src/main/java/com/novaone/common/CommonInfo.java	(revision 29041)
+++ src/main/java/com/novaone/common/CommonInfo.java	(working copy)
@@ -131,4 +131,42 @@
 
     // 鍟嗗搧绫诲瀷 鍐昏倝
     public static final String GOODS_TYPE_DY = "C";
+
+    /**
+     * 鍙戦�佸績璺崇殑URL鍦板潃
+     */
+    public static final String WECHAT_REFRESHTIME_URL = "http://www.fruitease.com:8009/IFView/PortHandler.ashx?action=wechatRefreshTime&modulecode=ccsehgpdf&token=1";
+
+    /**
+     * 琛ㄢ�漜ertificate_download_info鈥滀腑鐨勬暟鎹姸鎬�
+     *     -1锛氭湭杩涜涓嬭浇鎿嶄綔銆�
+     *      0锛氫笅杞藉け璐�
+     *      1锛氫笂浼犲け璐�
+     *      2锛氫笂浼犳垚鍔�
+     *      3锛氭牴鎹姤鍏冲崟鍙锋煡璇㈠埌澶氭潯涓氬姟鏁版嵁
+     */
+    public static final int CERT_STATE_INITIAL = -1;
+    public static final int CERT_STATE_DOWN_FAIL = 0;
+    public static final int CERT_STATE_UP_FAIL = 1;
+    public static final int CERT_STATE_UP_SUCCESS = 2;
+    public static final int CERT_STATE_REPEAT = 3;
+
+    /**
+     * 琛細certificate_retry_job鏍囪鏄惁鏄悎鍚屼笅杞藉け璐ヤ换鍔°��
+     *      0锛氫笅杞芥垚鍔�
+     *      1锛氫笅杞藉け璐�
+     */
+    public static final int JOB_CERT_DOWN_FAIL = 1;
+    public static final int JOB_CERT_DOWN_SUCCESS = 0;
+
+    /**
+     * 琛細certificate_retry_job鏍囪鏄惁鏄悎鍚屼笂浼犲け璐ヤ换鍔°��
+     *      0锛氭湭杩涜涓婁紶鎿嶄綔銆�
+     *      1锛氫笂浼犲け璐�
+     */
+    public static final int JOB_CERT_UP_UNLOADED = 0;
+    public static final int JOB_CERT_UP_FAIL = 1;
+
+
+
 }
Index: src/main/java/com/novaone/config/MySqlDataSourceConfig.java
===================================================================
--- src/main/java/com/novaone/config/MySqlDataSourceConfig.java	(revision 29041)
+++ src/main/java/com/novaone/config/MySqlDataSourceConfig.java	(working copy)
@@ -1,9 +1,6 @@
 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;
Index: src/main/java/com/novaone/controller/SmsController.java
===================================================================
--- src/main/java/com/novaone/controller/SmsController.java	(revision 29041)
+++ src/main/java/com/novaone/controller/SmsController.java	(working copy)
@@ -1,13 +1,14 @@
 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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-import javax.servlet.http.HttpServletRequest;
+
+import javax.validation.constraints.NotEmpty;
 import java.util.*;
 
 /*
@@ -25,24 +26,28 @@
     private QueryCodeService queryCodeService;
 
     @PostMapping("/add")
-    public R add(@RequestBody SmsInfo smsInfo, HttpServletRequest request){
+    public R add(@RequestBody @Validated SmsInfo smsInfo){
         try {
             queryCodeService.saveQueryCode(smsInfo);
             return R.success();
         } catch (Exception e) {
+            log.error(e.getMessage());
             e.printStackTrace();
-        return R.error(e.getMessage());
+            return R.error(e.getMessage());
         }
     }
 
     @PostMapping("/putList")
-    public R add(@RequestBody Set<SmsInfo> smsSet){
-        if (smsSet == null || smsSet.size() == 0)
-            return R.error("璇锋眰鏁版嵁涓虹┖");
+    public R putList(@RequestBody Set<SmsInfo> smsSet){
+        if (smsSet == null || smsSet.isEmpty()) {
+            log.error("APP绔帹閫佺煭淇″垪琛ㄤ负绌�");
+            return R.error("鑷冲皯鍖呭惈涓�鏉＄煭淇�");
+        }
         try {
             queryCodeService.saveList(smsSet);
             return R.success();
         } catch (Exception e) {
+            log.error(e.getMessage());
             e.printStackTrace();
             return R.error(e.getMessage());
         }
Index: src/main/java/com/novaone/entity/BgSyrsz.java
===================================================================
--- src/main/java/com/novaone/entity/BgSyrsz.java	(nonexistent)
+++ src/main/java/com/novaone/entity/BgSyrsz.java	(working copy)
@@ -0,0 +1,18 @@
+package com.novaone.entity;
+
+import lombok.Data;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 琛細yw_bg_syrsz
+ * @author: Ma.ChengJian
+ * @create: 2021-11-09 13:13
+ */
+@Data
+public class BgSyrsz {
+    private String id;//ID
+    private String bm;//閮ㄩ棬
+    private String jcka;//杩涘嚭鍙ｅ哺
+    private String syrmc;//浣跨敤浜哄悕绉�
+    private String syrdh;//浣跨敤浜虹數璇�
+}
Index: src/main/java/com/novaone/entity/CertificateRetryJob.java
===================================================================
--- src/main/java/com/novaone/entity/CertificateRetryJob.java	(revision 29041)
+++ src/main/java/com/novaone/entity/CertificateRetryJob.java	(working copy)
@@ -1,6 +1,6 @@
 package com.novaone.entity;
 
-import com.alibaba.fastjson.annotation.JSONField;
+import com.novaone.common.CommonInfo;
 import lombok.Data;
 import java.util.Date;
 
@@ -15,7 +15,6 @@
     private Long id;
     private Long infoId;
     private String queryCode;
-    @JSONField(ordinal = 1)
     private String certificateNo;
     private Integer failDownload;
     private Date downloadTime;
@@ -33,10 +32,10 @@
         job.setCreateTime(new Date());
         job.setUpdateTime(new Date());
         job.setRetryCount(0);
-        job.setFailDownload(1);//涓嬭浇澶辫触
+        job.setFailDownload(CommonInfo.JOB_CERT_DOWN_FAIL);//涓嬭浇澶辫触 1
         job.setQueryCode(queryCode);
         job.setCertificateNo(certificateNo);
-        job.setFailUpload(0);//鏈繘琛屼笂浼犳搷浣�
+        job.setFailUpload(CommonInfo.JOB_CERT_UP_UNLOADED);//鏈繘琛屼笂浼犳搷浣� 0
         job.setYwbh(ywbh);
         job.setMessage(message);
         return job;
@@ -49,10 +48,10 @@
         job.setUpdateTime(new Date());
         job.setDownloadTime(new Date());
         job.setRetryCount(0);
-        job.setFailDownload(0);//涓嬭浇鎴愬姛
+        job.setFailDownload(CommonInfo.JOB_CERT_DOWN_SUCCESS);//涓嬭浇鎴愬姛 0
         job.setQueryCode(queryCode);
         job.setCertificateNo(certificateNo);
-        job.setFailUpload(1);//涓婁紶澶辫触
+        job.setFailUpload(CommonInfo.JOB_CERT_UP_FAIL);//涓婁紶澶辫触 1
         job.setYwbh(ywbh);
         job.setMessage(message);
         job.setFilePath(path);//鏂囦欢瀛樺偍璺緞
Index: src/main/java/com/novaone/entity/Hddz.java
===================================================================
--- src/main/java/com/novaone/entity/Hddz.java	(revision 29041)
+++ src/main/java/com/novaone/entity/Hddz.java	(working copy)
@@ -15,6 +15,8 @@
     private String jyjyzs;  //涓婁紶鐨勬枃浠跺悕绉�,澶氫釜鏂囦欢鍚嶇О涔嬮棿浣跨敤 ; 鍒嗛殧锛屼笖绗竴涓枃浠跺悕绉板墠闈篃甯︽湁 ;
     private String bgdh;//妫�鐤瘉涔﹀搴旂殑鎶ュ叧鍗曞彿
     private String ywbh;//涓氬姟缂栧彿
+    private String bm;//閮ㄩ棬
+    private String jcka;//杩涘嚭鍙ｅ哺
 
     public Hddz() {
     }
Index: src/main/java/com/novaone/entity/SmsInfo.java
===================================================================
--- src/main/java/com/novaone/entity/SmsInfo.java	(revision 29041)
+++ src/main/java/com/novaone/entity/SmsInfo.java	(working copy)
@@ -4,16 +4,24 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 @Data
 public class SmsInfo {
+    @NotNull(message = "id鏄繀椤荤殑鍙傛暟")
     private Long id;                        //鐭俊鐨処D
     private String address;                  //鍙戦�佸湴鍧�
     private int type;                        //绫诲瀷
+    @NotEmpty(message = "鐭俊鍐呭鏄繀椤荤殑鍙傛暟")
     private String body;                     //鐭俊鍐呭
+    @NotNull(message = "鐭俊鏃ユ湡鏄繀椤荤殑鍙傛暟")
     private Date date;                       //鏃堕棿
+    @NotEmpty(message = "璇佷功缂栧彿鏄繀椤荤殑鍙傛暟")
     private String certificateNo;
+    @NotEmpty(message = "鏌ヨ鐮佹槸蹇呴』鐨勫弬鏁�")
     private String queryCode;
 
     public SmsInfo() { }
Index: src/main/java/com/novaone/fdao/BgSyrszDao.java
===================================================================
--- src/main/java/com/novaone/fdao/BgSyrszDao.java	(nonexistent)
+++ src/main/java/com/novaone/fdao/BgSyrszDao.java	(working copy)
@@ -0,0 +1,21 @@
+package com.novaone.fdao;
+
+import com.novaone.entity.BgSyrsz;
+
+import java.util.List;
+
+/*
+ * @program: ccsehgpdf
+ * @description: 琛細yw_bg_syrsz鐨勮鍐欐搷浣�
+ * @author: Ma.ChengJian
+ * @create: 2021-11-09 13:38
+ */
+public interface BgSyrszDao {
+    /**
+     * 鏍规嵁缁欏畾鏉′欢鏌ヨ鑱旂郴浜�
+     * @param bm 閮ㄩ棬
+     * @param jcka 杩涘嚭鍙ｅ哺
+     * @return 鑱旂郴浜�
+     */
+    List<BgSyrsz> findByCondition(String bm, String jcka);
+}
Index: src/main/java/com/novaone/job/EasipassHeartbeatCron.java
===================================================================
--- src/main/java/com/novaone/job/EasipassHeartbeatCron.java	(revision 29041)
+++ src/main/java/com/novaone/job/EasipassHeartbeatCron.java	(working copy)
@@ -1,5 +1,6 @@
 package com.novaone.job;
 
+import com.novaone.common.CommonInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -25,16 +26,15 @@
 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);
+            String result = HttpUtil.get(CommonInfo.WECHAT_REFRESHTIME_URL);
             log.info("EasipassHeartbeatCron sendResult: " + result);
         } catch (Exception e) {
             log.error("EasipassHeartbeatCron ERROR:" + e.getMessage(), e);
+            e.printStackTrace();
         }
     }
 }
Index: src/main/java/com/novaone/job/Timer.java
===================================================================
--- src/main/java/com/novaone/job/Timer.java	(revision 29041)
+++ src/main/java/com/novaone/job/Timer.java	(working copy)
@@ -8,6 +8,7 @@
 import com.novaone.entity.QueryCodeRetryJob;
 import com.novaone.service.CertificateService;
 import com.novaone.service.QueryCodeService;
+import com.novaone.service.impl.CertificateServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -38,37 +39,38 @@
     private QueryCodeService queryCodeService;
 
     //姣忓皬鏃舵暣鐐瑰拰鍗婄偣鎵ц涓�娆°��
-    @Scheduled(cron = "0 0/30 * * * *")
+//    @Scheduled(cron = "0 0/30 * * * *")
     public void certificateUpload(){
-        List<CertificateDownloadInfo> list = certificateInfoDao.findByBusinesState(-1);
+        List<CertificateDownloadInfo> list = certificateInfoDao.findByBusinesState(CommonInfo.CERT_STATE_INITIAL);
         log.info("[妫�鐤瘉涔︿笂浼犱换鍔鏈寰呬笅杞藉苟涓婁紶妫�鐤瘉涔︽暟閲�:"+list.size());
-        list.parallelStream().forEach(item->certificateService.upload(item));
+        for (CertificateDownloadInfo info : list) {
+            certificateService.upload(info);
+        }
     }
 
     /**
-     * 姣忓皬鏃剁殑25鍒嗐��40鍒嗐��55鍒嗘墽琛屼竴娆°��
+     * 姣忓皬鏃剁殑10鍒嗐��25鍒嗐��40鍒嗐��55鍒嗘墽琛屼竴娆°��
      */
-    @Scheduled(cron = "0 10/15 * * * *")
+//    @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)));
+        for (CertificateRetryJob job : retryJob) {
+            certificateService.retryDownload(job);
+        }
     }
 
-
-    @Scheduled(cron = "0 5/10 * * * *")
+    /**
+     * 姣忓皬鏃剁殑5鍒嗐��15鍒�
+     */
+//    @Scheduled(cron = "0 5/10 * * * *")
     public void retrySaveQueryCode(){
         List<QueryCodeRetryJob> retryJob = queryCodeService.findAll();
-        if (retryJob.size()<1)return;
+        if (retryJob.isEmpty())return;
         log.info("[鏌ヨ鐮佸啓鍏ラ噸璇曚换鍔鏈閲嶈瘯浠诲姟鏁伴噺:{}",retryJob.size());
-        retryJob.parallelStream().forEach(item -> queryCodeService.retrySave(item));
+        for (QueryCodeRetryJob job : retryJob) {
+            queryCodeService.retrySave(job);
+        }
     }
 
 }
Index: src/main/java/com/novaone/service/CertificateService.java
===================================================================
--- src/main/java/com/novaone/service/CertificateService.java	(revision 29041)
+++ src/main/java/com/novaone/service/CertificateService.java	(working copy)
@@ -13,13 +13,7 @@
  */
 public interface CertificateService {
 
-    /**
-     * 閲嶈瘯涓嬭浇鎴愬姛浣嗕笂浼犲け璐ョ殑浠诲姟銆�
-     * @param job 閲嶈瘯浠诲姟
-     */
-    void retryUpload(CertificateRetryJob job);
 
-
     /**
      * 閲嶈瘯涓嬭浇澶辫触鐨勪换鍔★紝閲嶆柊鎵ц涓嬭浇骞朵笂浼犮��
      * @param job
Index: src/main/java/com/novaone/service/SmsService.java
===================================================================
--- src/main/java/com/novaone/service/SmsService.java	(revision 29041)
+++ src/main/java/com/novaone/service/SmsService.java	(working copy)
@@ -1,8 +1,11 @@
 package com.novaone.service;
 
 import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.SmsInfo;
 
+import java.net.URISyntaxException;
 
+
 /*
  * @program: ccsehgpdf
  * @description:
@@ -12,4 +15,7 @@
 public interface SmsService {
     public void save(CertificateDownloadInfo certificateDownloadInfo);
 
+    public void forwardSMS(String ywbh, SmsInfo sms) throws URISyntaxException;
+
+
 }
Index: src/main/java/com/novaone/service/impl/CertificateServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/CertificateServiceImpl.java	(revision 29041)
+++ src/main/java/com/novaone/service/impl/CertificateServiceImpl.java	(working copy)
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.novaone.common.CommonInfo;
 import com.novaone.dao.CertificateDownloadInfoDao;
 import com.novaone.dao.CertificateRetryJobDao;
 import com.novaone.entity.CertificateDownloadInfo;
@@ -17,10 +18,14 @@
 import org.apache.commons.lang.StringUtils;
 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.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.*;
 
 
@@ -33,7 +38,7 @@
 @Slf4j
 @Service
 public class CertificateServiceImpl implements CertificateService {
-
+    // todo 鏂囦欢涓婁紶鍩虹璺緞
     private final String BASE_DIR = "/download_test/";
 //    private final String BASE_DIR = "/wenjian/CIQ TAX/";
 
@@ -49,71 +54,101 @@
      * @param certificate
      */
     @Override
+    @Transactional
     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);
-        //鏌ヨ涓嶅埌璇佷功鍒楄〃鍜屼笅杞藉け璐ラ兘浼氳繑鍥瀗ull
-        if (inputStream == null) {
-            updateCertificateInfo(0,certificateId);
-            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode, certificateNo,ywbh,"璇佷功涓嬭浇澶辫触"));
+        log.info("[妫�鐤瘉涔︿笂浼燷寮�濮嬫墽琛屾鐤瘉涔︿笅杞藉苟涓婁紶,CertificateNo:{}",certificateNo);
+        //涓嬭浇鏂囦欢锛岃幏鍙栨枃浠跺瓨鍌ㄨ矾寰勩��
+        String filePath = null;
+        try {
+            filePath = downLoad(certificate);
+        } catch (IOException e) {
+            //鏈湴瀛樺偍澶辫触锛屾坊鍔犱笅杞介噸璇曚换鍔�
+            addRetryJob(CertificateRetryJob.downloadJob(certificate.getId(),
+                    certificate.getQueryCode(),
+                    certificate.getCertificateNo(),
+                    certificate.getYwbh(),
+                    "妫�鐤瘉涔︽湰鍦板瓨鍌ㄥけ璐�;"+e.getMessage()));
+            updateCertificateInfo(CommonInfo.CERT_STATE_DOWN_FAIL,certificate.getId());
+            log.error("[妫�鐤瘉涔︿笅杞絵鏈湴瀛樺偍澶辫触,CertificateNo:{}",certificate.getCertificateNo());
+            e.printStackTrace();
             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);//涓婁紶澶辫触
+        if (filePath == null) return;
+        //鏂囦欢涓婁紶锛屼笂浼犲け璐ユ坊鍔犻噸璇曚换鍔�
+        File file = new File(filePath);
+        if (!uploadFile(certificate, file)){
+            if (file.exists() && !file.delete()) {
+                log.error("鏈湴鏂囦欢鍒犻櫎澶辫触,鏂囦欢璺緞:{}",file.getAbsolutePath());
             }
-          return;
+            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);//瀛樺偍鏂囦欢骞舵坊鍔犱笅杞介噸璇曚换鍔�
+        if (!file.delete()) {
+            log.error("鎴愬姛涓婁紶鐨勮瘉涔︽枃浠舵病鏈変粠鏈湴琚垹闄�,鏂囦欢璺緞:{}",file.getAbsolutePath());
         }
-        connect.disConnect();
+        Hddz hddz = new Hddz();
+        hddz.setBgdh(certificateNo.substring(0, certificateNo.length() - 3));
+        hddz.setSfyjyjyzs("Y");
+        hddz.setJyjyzs(certificateNo+".pdf");
+        hddz.setYwbh(certificate.getYwbh());
+        hddzService.uploadSuccessful(hddz);//todo 鏇存柊姘存灉閫氫袱寮犺〃
+        updateCertificateInfo(CommonInfo.CERT_STATE_UP_SUCCESS, certificate.getId());//璇佷功涓婁紶鎴愬姛
+        log.info("[妫�鐤瘉涔︿笂浼燷妫�鐤瘉涔︿笂浼犳垚鍔�,CertificateNo:{}", certificateNo);
     }
 
-    @Override
-    public void addRetryJob(CertificateRetryJob retryJob) {
-        retryJobDao.add(retryJob);
-        log.info("[娣诲姞鍚堝悓閲嶈瘯浠诲姟]certificateRetryJob = "+ JSON.toJSONString(retryJob));
-    }
 
+
+    /**
+     * 閲嶈瘯涓嬭浇骞朵笂浼�
+     * @param job 閲嶈瘯浠诲姟
+     */
     @Override
-    public List<CertificateRetryJob> findRetryJob() {
-        return retryJobDao.findRetryJob();
+    @Transactional
+    public void retryDownload(CertificateRetryJob job) {
+        log.info("[妫�鐤瘉涔﹂噸璇曚笂浼燷寮�濮嬫墽琛屾鐤瘉涔﹂噸璇曚笅杞藉苟涓婁紶,CertificateNo:{}",job.getCertificateNo());
+        String certificateNo = Optional.of(job.getCertificateNo()).orElseThrow(()->new NullPointerException("The certificateNo cannot be Null"));
+        String fileName = certificateNo+".pdf";
+        String filePath = null;
+        try {
+            //涓嬭浇璇佷功鏂囦欢鍒版湰鍦�
+            filePath = downLoad(job);
+        } catch (IOException e) {
+            updateRetryJob(job,"妫�鐤瘉涔︽湰鍦板瓨鍌ㄥけ璐�;"+e.getMessage());
+            log.error("[妫�鐤瘉涔﹂噸璇曚笂浼爙鏈湴瀛樺偍澶辫触,CertificateNo:{}",job.getCertificateNo());
+            return;
+        }
+        if (filePath == null) return;
+        File file = new File(filePath);
+        //涓婁紶璇佷功鏂囦欢鍒版按鏋滈��
+        if (!uploadFile(job, file)){
+            if (file.exists() && !file.delete()) {
+                log.error("鏈湴鏂囦欢鍒犻櫎澶辫触,鏂囦欢璺緞:{}",file.getAbsolutePath());
+            }
+            return;
+        }
+        if (!file.delete()) {
+            log.error("鎴愬姛涓婁紶鐨勮瘉涔︽枃浠舵病鏈変粠鏈湴琚垹闄�,鏂囦欢璺緞:{}",file.getAbsolutePath());
+        }
+        //鏇存柊SqlServer鍜孧ySQL涓殑鏁版嵁銆�
+        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(CommonInfo.CERT_STATE_UP_SUCCESS,job.getInfoId());//璇佷功涓婁紶鎴愬姛 2
+        updateRetryJob(job,"FTP涓婁紶鎿嶄綔涓嶆垚鍔�");
     }
 
+
+    /**
+     * 鏇存柊閲嶈瘯浠诲姟
+     * @param job 浠诲姟
+     * @param message 浠诲姟鎻忚堪
+     */
     @Override
+    @Transactional
     public void updateRetryJob(CertificateRetryJob job, String message) {
         job.setMessage(message);
         job.setRetryCount(Optional.ofNullable(job.getRetryCount()).orElse(0)+1);
@@ -123,159 +158,159 @@
 
 
     /**
-     * 閲嶈瘯涓嬭浇鎴愬姛锛屼絾涓婁紶澶辫触鐨勪换鍔�
-     * @param job 閲嶈瘯浠诲姟
+     * 鏌ヨ鍏ㄩ儴閲嶈瘯浠诲姟
+     * @return 浠诲姟鍒楄〃
      */
     @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涓婁紶鎿嶄綔涓嶆垚鍔�");
+    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
+    public List<CertificateRetryJob> findRetryJob() {
+        return retryJobDao.findRetryJob();
     }
 
+
     /**
-     * 閲嶈瘯涓嬭浇骞朵笂浼�
-     * @param job 閲嶈瘯浠诲姟
+     * 鏂板涓�鏉￠噸璇曚换鍔�
+     * @param retryJob 浠诲姟
      */
     @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;
+    @Transactional
+    public void addRetryJob(CertificateRetryJob retryJob) {
+        retryJobDao.add(retryJob);
+        log.info("[娣诲姞鍚堝悓閲嶈瘯浠诲姟]certificateRetryJob = "+ JSON.toJSONString(retryJob));
+    }
+
+
+
+    /**
+     * 鏍规嵁鍒楄〃鏌ヨ缁撴灉锛岃В鏋愬嚭鏂囦欢鍔犺浇鐨勫繀瑕佸弬鏁扮粍瑁呬笅杞介摼鎺ャ��
+     * @param searchResult 鍒楄〃鏌ヨ缁撴灉
+     * @return 妫�鐤瘉涔︽枃浠朵笅杞介摼鎺�
+     */
+    private String getDownUrlBySearchResult(String searchResult) {
+        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){
+            log.error("[妫�鐤瘉涔︽煡璇鏈兘浠庡垪琛ㄦ煡璇㈢粨鏋滀腑瑙ｆ瀽鍑哄繀瑕佺殑鍙傛暟銆侱ownLoadUrl = {}",downUrl);
         }
-        FtpUtil connect = getConnect(3);
-        if (connect == null) {
-            log.error("[妫�鐤瘉涔︿笅杞介噸璇昡FTP鏈嶅姟鏃犳硶杩炴帴,閲嶈瘯澶辫触...");
-            updateRetryJob(job,"FTP鏈嶅姟鍣ㄨ繛鎺ュけ璐�");
-            return;
-        }
+        return downUrl;
+    }
 
-        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;
+
+
+    /**
+     * 鏍规嵁璇佷功鍙峰拰鏌ヨ鐮侊紝鏌ヨ妫�鐤瘉涔﹀垪琛ㄣ�傛煡璇笉鍒版鐤瘉涔﹀垯娣诲姞涓嬭浇閲嶈瘯浠诲姟銆�
+     * @param info 鍚堝悓涓嬭浇闇�瑕佺殑淇℃伅
+     * @param retryCount 楠岃瘉鐮侀敊璇殑閲嶈瘯娆℃暟
+     * @return 鍒楄〃鏌ヨ缁撴灉鐨凧SON涓诧紝澶辫触杩斿洖null
+     */
+    private String getSearchResult(CertificateDownloadInfo info, int retryCount) {
+        String searchResult;
+        String message;
+        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 = Optional.ofNullable(CertificateUtils.listPage(param.get("code"), param.get("cookie"), info.getQueryCode(), info.getCertificateNo())).orElse("{}");
+            JSONObject resultObject = JSON.parseObject(searchResult);
+            message = resultObject.getString("message");
+            if (!StringUtils.isEmpty(message) && message.contains("楠岃瘉鐮佷笉姝ｇ‘")) {
+                log.info("[妫�鐤瘉涔︽煡璇鍒楄〃鏌ヨ澶辫触,楠岃瘉鐮侀敊璇��");
+                continue;
+            }
+            if (resultObject.getJSONArray("rows").isEmpty()) {
+                log.error("[妫�鐤瘉涔︽煡璇鏈煡璇㈠埌妫�鐤瘉涔�,CertificateNo = {}", info.getCertificateNo());
+                // todo 妫�鐤瘉涔︽煡璇笉鍒帮紝娣诲姞涓嬭浇閲嶈瘯浠诲姟
+                addRetryJob(CertificateRetryJob.downloadJob(info.getId(), info.getQueryCode(), info.getCertificateNo(), info.getYwbh(),"鏍规嵁璇佷功缂栧彿鍜屾煡璇㈢爜鏈煡璇㈠埌妫�鐤瘉涔�"));
+                updateCertificateInfo(CommonInfo.CERT_STATE_DOWN_FAIL,info.getId());
+                return null;
+            }
+            break;
+        }while (--retryCount > 0);
+        if (message != null && message.contains("楠岃瘉鐮佷笉姝ｇ‘") ) {
+            //todo 妫�鐤瘉涔︿笅杞藉け璐ワ紝鍒楄〃鏌ヨ楠岃瘉鐮侀敊璇�傛坊鍔犻噸璇曚换鍔�
+            addRetryJob(CertificateRetryJob.downloadJob(info.getId(), info.getQueryCode(), info.getCertificateNo(), info.getYwbh(),"妫�鐤瘉涔︽煡璇㈠け璐�,楠岃瘉鐮侀敊璇�"));
+            updateCertificateInfo(CommonInfo.CERT_STATE_DOWN_FAIL,info.getId());
+            return null;
         }
-        updateRetryJob(job,"FTP涓婁紶鎿嶄綔涓嶆垚鍔�");
+        return searchResult;
     }
 
+
     /**
-     * 璁块棶璇佷功涓嬭浇閾炬帴
+     * 澶勭悊涓嬭浇閲嶈瘯浠诲姟锛屾牴鎹煡璇㈢爜鍜岃瘉涔︾紪鍙锋煡璇㈣瘉涔﹀垪琛紝鏌ヨ涓嶅埌鏇存柊閲嶈瘯浠诲姟銆�
+     * @param job 閲嶈瘯浠诲姟
+     * @param retryCount 楠岃瘉鐮侀敊璇噸璇曟鏁�
+     * @return 鍒楄〃鏌ヨ缁撴灉
      */
-    private InputStream getFileData(String queryCode, String certificateNo, int retryCount) {
+    private String getSearchResult(CertificateRetryJob job, int retryCount) {
         String searchResult;
+        String message;
         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);
+            searchResult = Optional.ofNullable(CertificateUtils.listPage(param.get("code"), param.get("cookie"), job.getQueryCode(), job.getCertificateNo())).orElse("{}");
             JSONObject resultObject = JSON.parseObject(searchResult);
-            String message = resultObject.getString("message");
+            message = resultObject.getString("message");
             if (!StringUtils.isEmpty(message) && message.contains("楠岃瘉鐮佷笉姝ｇ‘")) {
-                log.info("[妫�鐤瘉涔︽煡璇澶辫触,楠岃瘉鐮侀敊璇�...");
+                log.info("[妫�鐤瘉涔︽煡璇鍒楄〃鏌ヨ澶辫触,楠岃瘉鐮侀敊璇��");
                 continue;
             }
-            if (resultObject.getJSONArray("rows").size() < 1) {
-                log.info("[妫�鐤瘉涔︽煡璇鏈煡璇㈠埌妫�鐤瘉涔�,certificateNo = {}",certificateNo);
+            if (resultObject.getJSONArray("rows").isEmpty()) {
+                log.error("[妫�鐤瘉涔︽煡璇鏈煡璇㈠埌妫�鐤瘉涔�,CertificateNo = {}", job.getCertificateNo());
+                updateRetryJob(job,"鏍规嵁璇佷功缂栧彿鍜屾煡璇㈢爜鏈煡璇㈠埌妫�鐤瘉涔�");
                 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());
+        if (message != null && message.contains("楠岃瘉鐮佷笉姝ｇ‘") ) {
+            updateRetryJob(job,"妫�鐤瘉涔︽煡璇㈠け璐�,楠岃瘉鐮侀敊璇�");
             return null;
-        } catch (IOException e) {
-            log.error("[妫�鐤瘉涔︽煡璇涓嬭浇閾炬帴璇锋眰寮傚父,URL{}",downUrl);
-            e.printStackTrace();
-            return null;
         }
+        return searchResult;
     }
 
-    private String storage(long certificateId, String queryCode, String certificateNo, String ywbh, InputStream inputStream) {
-        File file = new File(certificateNo + ".pdf");
+
+    /**
+     * 涓嬭浇璇佷功鏂囦欢鍒版湰鍦�
+     * @param bo 鍚堝悓涓嬭浇蹇呰鐨勪俊鎭垨鑰呴噸璇曚换鍔�
+     * @return 鏂囦欢瀛樺偍璺緞
+     * @throws IOException 鏂囦欢瀛樺偍澶辫触
+     */
+    private String downLoad(Object bo) throws IOException {
+        InputStream fileStream = null;
+        String fileName = null;
+        if (bo instanceof CertificateDownloadInfo){
+            fileStream = getFileStream((CertificateDownloadInfo)bo);
+            fileName = ((CertificateDownloadInfo)bo).getCertificateNo();
+        }else if (bo instanceof CertificateRetryJob){
+            fileStream = getFileStream((CertificateRetryJob)bo);
+            fileName = ((CertificateRetryJob) bo).getCertificateNo();
+        }else {
+            throw new IllegalArgumentException("闈炴硶鐨勫弬鏁扮被鍨�");
+        }
+        if (fileStream == null)return null;
+        File file = new File(fileName + ".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();
+            FileUtils.copyToFile(fileStream,file);
+        } finally {
+            fileStream.close();
         }
-        return null;
+        log.info("[妫�鐤瘉涔︿笅杞絵鏈湴瀛樺偍鎴愬姛,鏂囦欢璺緞{}",path);
+
+        return path;
     }
 
+
+    /**
+     * 鑾峰彇HTTP杩炴帴
+     */
     private FtpUtil getConnect(int count) {
         FtpUtil ftpUtil = new FtpUtil();
         boolean connect = false;
@@ -296,6 +331,71 @@
         return null;
     }
 
+
+
+    private InputStream getFileStream(CertificateDownloadInfo certificate) {
+        //鍒楄〃鏌ヨ妫�鐤瘉涔︺�傚鏋滄病鏈夊垪琛ㄦ煡璇㈢粨鏋滐紝閲嶈瘯浠诲姟鍦ㄥ垪琛ㄦ煡璇㈡柟娉曚腑娣诲姞
+        String searchResult = getSearchResult(certificate, 4);
+        if (searchResult == null)return null;
+        //瑙ｆ瀽鍒楄〃鏌ヨ缁撴灉锛岀粍瑁呰瘉涔︽枃浠剁殑涓嬭浇URL
+        String downUrl = getDownUrlBySearchResult(searchResult);
+        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("ResponseMessage",connection.getResponseMessage());
+            logObj.put("ContentType",connection.getContentType());
+            log.error("[妫�鐤瘉涔︽煡璇璇佷功鏂囦欢璇诲彇澶辫触,鎺ュ彛鍝嶅簲淇℃伅:{}",logObj.toJSONString());
+            addRetryJob(CertificateRetryJob.downloadJob(certificate.getId(),certificate.getQueryCode(), certificate.getCertificateNo(), certificate.getYwbh(),
+                    "璇佷功涓嬭浇璇锋眰鍝嶅簲寮傚父,鎺ュ彛鍝嶅簲淇℃伅:"+logObj.toJSONString()));
+            return null;
+        } catch (IOException e) {
+            log.error("[妫�鐤瘉涔︽煡璇涓嬭浇閾炬帴璇锋眰寮傚父,DownLoadUrl = {}",downUrl);
+            e.printStackTrace();
+            addRetryJob(CertificateRetryJob.downloadJob(certificate.getId(),certificate.getQueryCode(), certificate.getCertificateNo(), certificate.getYwbh(),
+                    "涓嬭浇閾炬帴璇锋眰寮傚父,DownLoadUrl = {}"+downUrl));
+            return null;
+        }
+    }
+
+
+
+    private InputStream getFileStream(CertificateRetryJob job) {
+        String searchResult = getSearchResult(job, 4);
+        //濡傛灉娌℃湁鍒楄〃鏌ヨ缁撴灉锛岄噸璇曚换鍔″湪鍒楄〃鏌ヨ鏂规硶涓坊鍔�
+        if (searchResult == null)return null;
+        String downUrl = getDownUrlBySearchResult(searchResult);
+        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("ResponseMessage",connection.getResponseMessage());
+            logObj.put("ContentType",connection.getContentType());
+            log.error("[妫�鐤瘉涔︽煡璇璇佷功鏂囦欢璇诲彇澶辫触,{}",logObj.toJSONString());
+            updateRetryJob(job,"璇佷功涓嬭浇璇锋眰鍝嶅簲寮傚父"+logObj.toJSONString());
+            return null;
+        } catch (IOException e) {
+            log.error("[妫�鐤瘉涔︽煡璇涓嬭浇閾炬帴璇锋眰寮傚父,DownLoadUrl = {}",downUrl);
+            e.printStackTrace();
+            updateRetryJob(job,"涓嬭浇閾炬帴璇锋眰寮傚父,DownLoadUrl = {}"+downUrl);
+            return null;
+        }
+    }
+
+
+
+    /**
+     * 鏇存柊certificate_download_info琛ㄤ腑鐨勪笟鍔℃暟鎹姸鎬佸瓧娈�
+     * @param businessState 鐘舵�佸��
+     */
     private void updateCertificateInfo(int businessState,Long infoId) {
         CertificateDownloadInfo info = new CertificateDownloadInfo();
         info.setBusinessState(businessState);
@@ -304,5 +404,106 @@
         certificateInfoDao.updateById(info);
     }
 
+
+
+    /**
+     * 涓婁紶鏈湴鏂囦欢
+     * @param file 涓婁紶鐨勬枃浠跺璞�
+     */
+    private boolean uploadFile(CertificateDownloadInfo bo, File file) {
+        String certificateNo = Optional.of(bo.getCertificateNo()).orElseThrow(()->new NullPointerException("The certificateNo cannot be Null"));
+        String fileName = certificateNo + ".pdf";
+        Long certificateId = bo.getId();
+        String queryCode = bo.getQueryCode();
+        String ywbh = bo.getYwbh();
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(file);
+        } catch (FileNotFoundException e) {
+            log.error("[妫�鐤瘉涔︿笂浼燷璇佷功鏂囦欢涓嶅瓨鍦�,涓婁紶澶辫触銆侰ertificateNo:{},鏂囦欢璺緞:{}", certificateNo, file.getAbsolutePath());
+            e.printStackTrace();
+            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode, certificateNo, ywbh, "璇诲彇鏈湴璇佷功鏂囦欢澶辫触,鎵句笉鍒版湰鍦拌瘉涔︽枃浠�"));
+            updateCertificateInfo(CommonInfo.CERT_STATE_DOWN_FAIL,bo.getId());
+            return false;
+        }
+        FtpUtil connect = getConnect(5);
+        if (connect == null) {
+            log.error("[妫�鐤瘉涔︿笂浼燷澶辫触,FTP鏈嶅姟鏃犳硶杩炴帴...");
+            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode, certificateNo, ywbh, "鑾峰彇FTP杩炴帴澶辫触"));
+            updateCertificateInfo(CommonInfo.CERT_STATE_DOWN_FAIL,bo.getId());
+            try {
+                in.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return false;
+        }
+        /**
+         * 涓婁紶涓嬭浇鐨勬鐤瘉涔�
+         * http://www.fruitease.com:8009/wenjian/CIQ TAX/310040115012788.pdf
+         */
+        HashMap<String, InputStream> ftpFile = new HashMap<>();
+        ftpFile.put(BASE_DIR + fileName, in);
+        boolean flag = connect.upload(ftpFile);
+        if (!flag){
+            log.error("[妫�鐤瘉涔︿笂浼犲け璐FTP涓婁紶鎿嶄綔涓嶆垚鍔�,CertificateNo:{}", certificateNo);
+            addRetryJob(CertificateRetryJob.downloadJob(certificateId, queryCode, certificateNo, ywbh,"FTP涓婁紶鎿嶄綔澶辫触"));
+        }
+        try {
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        connect.disConnect();
+        return flag;
+    }
+
+
+    /**
+     * 涓婁紶鏂囦欢锛岄拡瀵规墽琛岀殑閲嶈瘯浠诲姟銆�
+     * @param bo 璇佷功閲嶈瘯浠诲姟
+     */
+    private boolean uploadFile(CertificateRetryJob bo, File file){
+        String certificateNo = Optional.of(bo.getCertificateNo()).orElseThrow(()->new NullPointerException("The certificateNo cannot be Null"));
+        String fileName = certificateNo + ".pdf";
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(file);
+        } catch (FileNotFoundException e) {
+            log.error("[妫�鐤瘉涔︿笂浼犻噸璇昡璇佷功鏂囦欢涓嶅瓨鍦�,涓婁紶澶辫触銆侰ertificateNo:{},鏂囦欢璺緞:{}", certificateNo, file.getAbsolutePath());
+            e.printStackTrace();
+            updateRetryJob(bo,"璇诲彇鏈湴璇佷功鏂囦欢澶辫触,鎵句笉鍒版湰鍦拌瘉涔︽枃浠�");
+            return false;
+        }
+        FtpUtil connect = getConnect(5);
+        if (connect == null) {
+            log.error("[妫�鐤瘉涔︿笂浼犻噸璇昡澶辫触,FTP鏈嶅姟鏃犳硶杩炴帴...");
+            updateRetryJob(bo,"鑾峰彇FTP杩炴帴澶辫触");
+            try {
+                in.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return false;
+        }
+        /**
+         * 涓婁紶涓嬭浇鐨勬鐤瘉涔�
+         * http://www.fruitease.com:8009/wenjian/CIQ TAX/310040115012788.pdf
+         */
+        HashMap<String, InputStream> ftpFile = new HashMap<>();
+        ftpFile.put(BASE_DIR + fileName, in);
+        boolean flag = connect.upload(ftpFile);
+        if (!flag){
+            log.error("[妫�鐤瘉涔﹂噸璇曚笂浼燷FTP涓婁紶鎿嶄綔涓嶆垚鍔�,CertificateNo:{}", certificateNo);
+            updateRetryJob(bo,"FTP涓婁紶鎿嶄綔澶辫触");
+        }
+        try {
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        connect.disConnect();
+        return flag;
+    }
 }
 
Index: src/main/java/com/novaone/service/impl/HddzServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/HddzServiceImpl.java	(revision 29041)
+++ src/main/java/com/novaone/service/impl/HddzServiceImpl.java	(working copy)
@@ -12,6 +12,7 @@
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 
@@ -25,6 +26,7 @@
 @Service
 public class HddzServiceImpl implements HddzService {
 
+    // todo 鏂囦欢璁块棶鍩虹璺緞
     private final String BASE_PATH = "http://www.fruitease.com:8009/wenjian/CIQ TAX/";
 
     @Autowired
@@ -34,6 +36,7 @@
 
 
     @Override
+    @Transactional
     public void addQueryCode(Hddz hddz) {
         hddzDao.update(hddz);
     }
@@ -49,16 +52,23 @@
         hddzOcrwjsb.setSfcz("Y");
         hddzOcrwjsb.setWjlj(BASE_PATH+fileName);//FTP鏈嶅姟鐨勬枃浠惰闂矾寰�
         hddzDao.update(hddz);
-        hddzOcrwjsbDao.add(hddzOcrwjsb);
+        try {
+            // todo 鍚慼ddzOcrwjs琛ㄤ腑鎻掑叆鏁版嵁锛岃琛ㄤ笉涓笉鑳藉嚭鐜伴噸澶嶅�笺��
+            hddzOcrwjsbDao.add(hddzOcrwjsb);
+        } catch (Exception e) {
+            System.err.println("["+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"]----- 鍐嶅悜琛ㄤ腑鍐欏叆鏁版嵁鏃跺紓甯镐簡 ----- message锛�"+e.getMessage()+" 鎶ュ叧鍗曞彿锛�"+hddz.getBgdh());
+        }
         log.info("---鏂囦欢涓婁紶--- SqlServer鏁版嵁鍥炲啓鎴愬姛,hddz = "+ JSON.toJSONString(hddz)+" hddzOcrwjsb = "+JSON.toJSONString(hddzOcrwjsb));
     }
 
     @Override
+    @Transactional
     public void uploadSuccessful(Hddz hddz) {
         this.uploadSuccessful(hddz,hddz.getJyjyzs());
     }
 
     @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
     public List<Hddz> findByBgdh(String bgdh) {
         return hddzDao.findByBgdh(bgdh);
     }
Index: src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java	(revision 29041)
+++ src/main/java/com/novaone/service/impl/QueryCodeServiceImpl.java	(working copy)
@@ -1,6 +1,7 @@
 package com.novaone.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.novaone.common.CommonInfo;
 import com.novaone.dao.CertificateDownloadInfoDao;
 import com.novaone.dao.QueryCodeJobDao;
 import com.novaone.entity.CertificateDownloadInfo;
@@ -13,6 +14,7 @@
 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.text.SimpleDateFormat;
@@ -53,15 +55,19 @@
             if (hddzList.size() > 1) {
                 byBgdh = new Hddz();
                 certificateInfo.setYwbh("bgdh閲嶅");
-                certificateInfo.setBusinessState(3);
+                certificateInfo.setBusinessState(CommonInfo.CERT_STATE_REPEAT);//閲嶅锛岀姸鎬�3
                 log.error("[鏌ヨ鐮佸啓鍏瀛樺湪鎶ュ叧鍗曞彿閲嶅鐨勬暟鎹�,bgdh={},鏌ヨ鍒皗}鏉℃暟鎹�",bgdh,hddzList.size());
-            }else {
+            }else if (hddzList.isEmpty()){
+                log.error("[鏌ヨ鐮佸啓鍏鏍规嵁鎶ュ叧鍗曞彿{},鍦ㄦ按鏋滈�氫腑鏈煡璇㈠埌浠讳綍鏁版嵁銆�",bgdh);
+                return;
+            } else {
                 byBgdh = hddzList.get(0);
                 byBgdh.setJyjyzscxm(queryCode);
                 byBgdh.setBgdh(bgdh);
                 hddzService.addQueryCode(byBgdh);
+                smsService.forwardSMS(byBgdh.getYwbh(),smsInfo);
                 certificateInfo.setYwbh(byBgdh.getYwbh());
-                certificateInfo.setBusinessState(-1);
+                certificateInfo.setBusinessState(CommonInfo.CERT_STATE_INITIAL);//鍐欏叆鎴愬姛-1
             }
         } catch (Exception e) {
             log.error("[鏌ヨ鐮佸啓鍏鏁版嵁搴撳啓鍏ュけ璐�,hddz={}",JSON.toJSONString(byBgdh));
@@ -107,22 +113,25 @@
             List<Hddz> list = hddzService.findByBgdh(bgdh);
             if (list.size() > 1) {
                 byBgdh = new Hddz();
-                byBgdh.setBgdh("瀛樺湪閲嶅");
-                Info.setBusinessState(3);
+                Info.setYwbh("瀛樺湪閲嶅");
+                Info.setBusinessState(CommonInfo.CERT_STATE_REPEAT);//鍚堝悓閲嶅鐘舵��3
                 log.error("[鏌ヨ鐮佸啓鍏ラ噸璇昡瀛樺湪鎶ュ叧鍗曞彿閲嶅鐨勬暟鎹�,bgdh{}鏌ヨ鍒皗}鏉℃暟鎹�",bgdh,list.size());
-            }else {
+            }else if (list.isEmpty()){
+                log.error("[鏌ヨ鐮佸啓鍏ラ噸璇昡鏍规嵁鎶ュ叧鍗曞彿{},鍦ㄦ按鏋滈�氫腑鏈煡璇㈠埌浠讳綍鏁版嵁銆�",bgdh);
+                updateJob(job,"鏍规嵁鎶ュ叧鍗曞彿涓嶈兘鍐嶆按鏋滈�氫腑鏌ヨ鍒版暟鎹�,bgdh="+bgdh);
+                return;
+            } else {
                 byBgdh = list.get(0);
                 byBgdh.setJyjyzscxm(queryCode);
                 byBgdh.setBgdh(bgdh);
                 hddzService.addQueryCode(byBgdh);
+                Info.setYwbh(byBgdh.getYwbh());
+                Info.setBusinessState(CommonInfo.CERT_STATE_INITIAL);//鏂板啓鍏�-1
             }
         } 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);
+            updateJob(job, e.getMessage());
             return;
         }
         Info.setCertificateNo(certificateNo);
@@ -129,8 +138,6 @@
         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);
@@ -138,7 +145,15 @@
         queryCodeJobDao.deleteById(job);
     }
 
+    private void updateJob(QueryCodeRetryJob job, String message) {
+        job.setMessage(message);
+        job.setUpdateTime(new Date());
+        job.setRetryCount(Optional.ofNullable(job.getRetryCount()).orElse(0)+1);
+        queryCodeJobDao.updateById(job);
+    }
+
     @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
     public List<QueryCodeRetryJob> findAll() {
         return queryCodeJobDao.find();
     }
@@ -145,7 +160,8 @@
 
 
     @Override
-    public void addRetryJob(SmsInfo smsInfo,String message) {
+    @Transactional
+    public void addRetryJob(SmsInfo smsInfo, String message) {
         QueryCodeRetryJob queryCodeRetryJob = new QueryCodeRetryJob();
         queryCodeRetryJob.setQueryCode(smsInfo.getQueryCode());
         queryCodeRetryJob.setCertificateNo(smsInfo.getCertificateNo());
Index: src/main/java/com/novaone/service/impl/SmsServiceImpl.java
===================================================================
--- src/main/java/com/novaone/service/impl/SmsServiceImpl.java	(revision 29041)
+++ src/main/java/com/novaone/service/impl/SmsServiceImpl.java	(working copy)
@@ -2,11 +2,19 @@
 
 import com.novaone.dao.CertificateDownloadInfoDao;
 import com.novaone.entity.CertificateDownloadInfo;
+import com.novaone.entity.SmsInfo;
 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.io.File;
+import java.io.FilenameFilter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
 /*
  * @program: ccsehgpdf
  * @description:
@@ -24,4 +32,14 @@
     public void save(CertificateDownloadInfo certificateDownloadInfo) {
         certificateDownloadInfoDao.add(certificateDownloadInfo);
     }
+
+    @Override
+    @Transactional
+    public void forwardSMS(String ywbh, SmsInfo sms) throws URISyntaxException {
+        /**
+         * 鏍规嵁涓氬姟缂栧彿鏌ヨ涓氬姟鎺ュ崟鏁版嵁锛屽湪涓氬姟鎺ュ崟鏁版嵁涓湁褰曞叆浜哄憳鐨勯儴闂ㄥ拰杩涘嚭鍙ｅ哺鏁版嵁锛坆m銆乯cka锛夈�傞�氳繃bm鍜宩cka鍦ㄨ仈绯讳汉琛ㄤ腑鍖归厤鍒板叿浣撶殑鑱旂郴浜恒��
+         */
+
+
+    }
 }
Index: src/main/java/com/novaone/util/CertificateUtils.java
===================================================================
--- src/main/java/com/novaone/util/CertificateUtils.java	(revision 29041)
+++ src/main/java/com/novaone/util/CertificateUtils.java	(working copy)
@@ -94,8 +94,8 @@
         try {
             String url = CommonInfo.PALTCODE_API_URL;
             String ret = HttpUtil.postJson(url, obj);
-            log.info("plat code result:" + ret);
             JSONObject jsonObject = JSONObject.parseObject(ret);
+            log.info("[妫�鐤瘉涔︽煡璇楠岃瘉鐮佽瘑鍒垚鍔�:" + ret);
             if (jsonObject.getBoolean("success")) {
                 code = jsonObject.getJSONObject("data").getString("result");
                 return code;
Index: src/main/java/com/novaone/util/HttpUtil.java
===================================================================
--- src/main/java/com/novaone/util/HttpUtil.java	(revision 29041)
+++ src/main/java/com/novaone/util/HttpUtil.java	(working copy)
@@ -1,10 +1,10 @@
 package com.novaone.util;
 
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
@@ -11,12 +11,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.alibaba.fastjson.JSONObject;
-
 public class HttpUtil {
 
     // public static final String url =
@@ -37,14 +31,18 @@
 
         // 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");
+        BufferedReader br = null; // 鑾峰彇杈撳叆娴�
+        StringBuilder sb;
+        try {
+            br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
+            String line = null;
+            sb = new StringBuilder();
+            while ((line = br.readLine()) != null) {
+                sb.append(line + "\n");
+            }
+        } finally {
+            if (br != null) br.close();
         }
-        br.close();
-        // System.out.println(sb.toString());
         return sb.toString();
     }
 
@@ -55,16 +53,18 @@
         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");
+        BufferedReader br = null;
+        StringBuilder sb;
+        try {
+            br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
+            String line = null;
+            sb = new StringBuilder();
+            while ((line = br.readLine()) != null) {
+                sb.append(line + "\n");
+            }
+        } finally {
+            if (br != null) br.close();
         }
-        br.close();
         // System.out.println(sb.toString());
         return sb.toString();
     }
@@ -91,19 +91,22 @@
         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");
+        BufferedReader br = null;
+        StringBuilder sb;
+        OutputStream os = null;
+        try {
+            os = connection.getOutputStream();
+            os.write(parameter.toString().getBytes("UTF-8"));
+            br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+            String line = null;
+            sb = new StringBuilder();
+            while ((line = br.readLine()) != null) { // 璇诲彇鏁版嵁
+                sb.append(line + "\n");
+            }
+        } finally {
+            if (br != null) br.close();
+            if (os != null) os.close();
         }
-        br.close();
-        // System.out.println(sb.toString());
         return sb.toString();
     }
 
@@ -110,7 +113,7 @@
     public static String postJson(String url, JSONObject obj) throws IOException {
         URL u;
         HttpURLConnection con;
-        DataOutputStream osw;
+        DataOutputStream osw = null;
         StringBuffer buffer = new StringBuffer();
         u = new URL(url);
         con = (HttpURLConnection) u.openConnection();
@@ -120,15 +123,20 @@
         con.setUseCaches(false);
         con.setInstanceFollowRedirects(true);
         con.setRequestProperty("Content-Type", "application/json");
-        osw = new DataOutputStream(con.getOutputStream());
-        osw.writeBytes(obj.toString());
-        osw.flush();
-        osw.close();
-        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
-        String temp;
-        while ((temp = br.readLine()) != null) {
-            buffer.append(temp);
-            buffer.append('\n');
+        BufferedReader br = null;
+        try {
+            osw = new DataOutputStream(con.getOutputStream());
+            osw.writeBytes(obj.toString());
+            osw.flush();
+            br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                buffer.append(temp);
+                buffer.append('\n');
+            }
+        } finally {
+            if (osw != null) osw.close();
+            if (br !=null) br.close();
         }
         return buffer.toString();
     }
Index: src/main/java/com/novaone/util/JwtUtil.java
===================================================================
--- src/main/java/com/novaone/util/JwtUtil.java	(revision 29041)
+++ src/main/java/com/novaone/util/JwtUtil.java	(working copy)
@@ -1,7 +1,9 @@
 package com.novaone.util;
 
 import java.util.Date;
+import java.util.List;
 
+import com.novaone.entity.SmsInfo;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
@@ -29,6 +31,25 @@
 //        return token;
 //    }
 
+    public static String geneJsonWebToken(SmsInfo sms) {
+
+        String token = Jwts.builder().setSubject(SUBJECT).claim("id", sms.getId())
+                .claim("smsInfo", sms)
+                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
+                .signWith(SignatureAlgorithm.HS256, SECRETKEY).compact();
+
+        return token;
+    }
+
+    public static String geneJsonWebToken(List list) {
+
+        String token = Jwts.builder().setSubject(SUBJECT)
+                .claim("smsInfo", list)
+                .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/WechatUtil.java
===================================================================
--- src/main/java/com/novaone/util/WechatUtil.java	(nonexistent)
+++ src/main/java/com/novaone/util/WechatUtil.java	(working copy)
@@ -0,0 +1,117 @@
+package com.novaone.util;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 
+ *     
+ * 椤圭洰鍚嶇О锛歠oreignprocurement    
+ * 绫诲悕绉帮細WechatUtil    
+ * 绫绘弿杩帮細    
+ * 鍒涘缓浜猴細zhaojiyan    
+ * 鍒涘缓鏃堕棿锛�2017骞�7鏈�25鏃� 涓嬪崍2:57:56    
+ * 淇敼浜猴細zhaojiyan    
+ * 淇敼鏃堕棿锛�2017骞�7鏈�25鏃� 涓嬪崍2:57:56    
+ * 淇敼澶囨敞锛�    
+ * @version     
+ *
+ */
+@Slf4j
+public class WechatUtil {
+
+    private WechatUtil() {
+
+    }
+
+    private static WechatUtil single = null;
+
+    // 璁块棶鐨勫井淇℃帴鍙ｅ湴鍧�
+    private static final String SEND_MSG_URL = "http://member.freshport.com";
+
+    // 杩斿洖error鐘舵��
+    public static final String SUCCESS = "0"; // 鍙戦�佹垚鍔�
+
+    public static final String ERROR = "1"; // 鍙戦�佸け璐�
+    
+    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100),  new ThreadPoolExecutor.DiscardOldestPolicy());
+
+    public static synchronized WechatUtil getInstance() {
+        if (single == null) {
+            single = new WechatUtil();
+        }
+        return single;
+    }
+
+    public static class ThreadPoolTask implements Runnable{  
+        // 淇濆瓨浠诲姟鎵�闇�瑕佺殑鏁版嵁  
+        private HashMap<String, String> parameterMap;  
+  
+        ThreadPoolTask(HashMap<String, String> parameterMap) {  
+            this.parameterMap = parameterMap;  
+        }  
+  
+        public void run() {  
+            try {  
+                String info = HttpUtil.post(SEND_MSG_URL, parameterMap, null, null);
+                log.info("璋冪敤寰俊鎺ㄩ�侊紝杩斿洖淇℃伅:"+info);
+                if (StringUtils.isNotEmpty(info)) {
+                    JsonObject obj = new JsonParser().parse(info).getAsJsonObject();
+                    String error = obj.get("error").getAsString();
+                    if (error.equals(ERROR)) {
+                        // 澶辫触
+                        log.error("鎵嬫満鍙�:" + parameterMap.get("sendphone") + "鎺ㄩ�佸け璐�,鍘熷洜:" + obj.get("message").getAsString() + ";");
+                    }
+                }
+            } catch (Exception e) {  
+                e.printStackTrace();  
+            }  
+            parameterMap = null;  
+        }  
+    }   
+    
+    /**
+     * 
+       
+     * sendWechatMsg(鍙戦�佸井淇℃秷鎭牳蹇冨姛鑳�)    
+       
+     * @param   phones 鎵嬫満鍙烽泦鍚�
+       
+     * @param  msgContent 娑堟伅鍐呭    
+       
+     * @return String    DOM瀵硅薄    
+       
+     * @Exception 寮傚父瀵硅薄
+     */
+    public void sendWechatMsg(List<String> phones, String msgContent) {
+        StringBuffer des = new StringBuffer();
+        String info = "";
+        for (String phone : phones) {
+            try {
+                Pattern p = Pattern.compile("\t|\r|\n");
+                Matcher m = p.matcher(msgContent);
+                msgContent = m.replaceAll("").trim();
+            	HashMap<String, String> parameterMap = new HashMap<String, String>();
+            	parameterMap.put("action", "sendTest");
+            	parameterMap.put("sendtxt", msgContent);
+            	parameterMap.put("sendphone", phone);
+            	threadPool.execute(new ThreadPoolTask(parameterMap));
+            } catch (Exception e) {
+                e.printStackTrace();
+                des.append("鎵嬫満鍙�:" + phone + "鎺ㄩ�佸け璐�,鍘熷洜:" + e.getMessage() + "; info:"+info);
+            }
+        }
+    }
+}
Index: src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml
===================================================================
--- src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml	(revision 29041)
+++ src/main/resources/mapper/mySqlMapper/QueryCodeJobMapper.xml	(working copy)
@@ -4,7 +4,7 @@
 
 
   <select id="find" resultType="com.novaone.entity.QueryCodeRetryJob">
-    SELECT id, jyjyzscxm, certificate_no, receive_time, sms_id, retry_count, create_time, update_time, message
+    SELECT id, query_code, certificate_no, receive_time, sms_id, retry_count, create_time, update_time, message
     FROM query_code_retry_job
   </select>
 
@@ -28,8 +28,8 @@
   <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 test="queryCode != null and queryCode != ''">
+        query_code,
       </if>
       <if test="certificateNo != null  and certificateNo != ''" >
         certificate_no,
@@ -54,8 +54,8 @@
       </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides="," >
-      <if test="jyjyzscxm != null and jyjyzscxm != ''">
-        #{jyjyzscxm},
+      <if test="queryCode != null and queryCode != ''">
+        #{queryCode},
       </if>
       <if test="certificateNo != null and certificateNo != ''" >
         #{certificateNo},
@@ -84,8 +84,8 @@
   <update id="updateById" parameterType="com.novaone.entity.QueryCodeRetryJob">
     UPDATE query_code_retry_job
     <set>
-      <if test="jyjyzscxm != null and jyjyzscxm != ''">
-        jyjyzscxm = #{jyjyzscxm},
+      <if test="queryCode != null and queryCode != ''">
+        query_code = #{queryCode},
       </if>
       <if test="certificateNo != null  and certificateNo != ''" >
         certificate_no = #{certificateNo},
@@ -103,7 +103,7 @@
         update_time = #{updateTime},
       </if>
       <if test="message != null and message != ''" >
-        message
+        message = #{message}
       </if>
     </set>
     WHERE id = #{id}
Index: src/main/resources/mapper/sqlServerMapper/BgSyrsMapper.xml
===================================================================
--- src/main/resources/mapper/sqlServerMapper/BgSyrsMapper.xml	(nonexistent)
+++ src/main/resources/mapper/sqlServerMapper/BgSyrsMapper.xml	(working copy)
@@ -0,0 +1,16 @@
+<?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.BgSyrszDao">
+    <select id="findByCondition" parameterType="string" resultType="com.novaone.entity.BgSyrsz">
+        SELECT id, bm, jcka, syrmc, syrdh
+        FROM yw_bg_syrsz
+        <where>
+            <if test="bm != null and bm.length() > 0">
+                bm = #{bm}
+            </if>
+            <if test="jcka != null and jcka.length() > 0">
+                AND jcka = #{jcka}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
Index: src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml
===================================================================
--- src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml	(revision 29041)
+++ src/main/resources/mapper/sqlServerMapper/HddzMapperMapper.xml	(working copy)
@@ -19,7 +19,7 @@
   </update>
 
   <select id="findByBgdh" parameterType="string" resultType="com.novaone.entity.Hddz">
-    SELECT sfyjyjyzs,jyjyzs,bgdh,ywbh,jyjyzscxm FROM yw_hddz WHERE bgdh = #{bgdh};
+    SELECT sfyjyjyzs,jyjyzs,bgdh,ywbh,jyjyzscxm,bm,jcka FROM yw_hddz WHERE bgdh = #{bgdh};
   </select>
 
 </mapper>
\ No newline at end of file
