From f429658e8bf3c88c4550171f61d6984033940b54 Mon Sep 17 00:00:00 2001
From: wanghc <2466022993@qq.com>
Date: Thu, 09 Mar 2023 09:22:47 +0800
Subject: [PATCH] 浦发分行系统文件上传

---
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java |   50 ++++++++
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java   |   29 ++++
 cmci-pfcs-gateway/pom.xml                                                          |    6 +
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java         |   10 +
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java                 |  115 +++++++++++++++++++
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java     |   21 ++
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java    |  106 +++++++++++++++++
 cmci-pfcs-gateway/src/main/resources/application.properties                        |    6 
 cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java            |    4 
 9 files changed, 337 insertions(+), 10 deletions(-)

diff --git a/cmci-pfcs-gateway/pom.xml b/cmci-pfcs-gateway/pom.xml
index df13059..e57d545 100644
--- a/cmci-pfcs-gateway/pom.xml
+++ b/cmci-pfcs-gateway/pom.xml
@@ -49,6 +49,12 @@
             <artifactId>okhttp</artifactId>
             <version>3.3.1</version>
         </dependency>
+        <!-- jcraft sftp -->
+        <dependency>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+            <version>0.1.53</version>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java
new file mode 100644
index 0000000..d17692b
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java
@@ -0,0 +1,29 @@
+package com.jttech.pfcs.conf;
+
+import com.jttech.pfcs.vo.resp.ResponseVo;
+import org.slf4j.Logger;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全域异常处理
+ * @author wanghc
+ * @version 1.0.0
+ * @date 2023-03-09
+ */
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    @ResponseBody
+    @ExceptionHandler(Exception.class)
+    public ResponseVo exceptionHandler(HttpServletRequest request, Exception exception) {
+        String errMsg = StringUtils.isEmpty(exception.getMessage()) ? "服务异常" : exception.getMessage();
+        //截取前面20个字符
+        errMsg = errMsg.substring(0,Math.min(20, errMsg.length()));
+        return ResponseVo.fail(-999, errMsg);
+    }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
index 18d4beb..c061e2d 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
@@ -2,15 +2,14 @@
 
 import com.jttech.pfcs.services.IBillService;
 import com.jttech.pfcs.vo.req.bill.BillApiReqVo;
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.jttech.pfcs.vo.resp.ResponseVo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 账单
@@ -34,7 +33,19 @@
             return mBillService.post(reqVo);
         } finally {
             final long endTime = System.currentTimeMillis();
-            mLogger.info("Execute heart the result is {} time spent is {} ", result, (endTime - beginTime));
+            mLogger.info("Execute post the result is {} time spent is {} ", result, (endTime - beginTime));
+        }
+    }
+
+    @RequestMapping(value = "/fileUpload")
+    public ResponseVo fileUpload(MultipartFile[] files, FtpServerParam ftpServer) {
+        final long beginTime = System.currentTimeMillis();
+        ResponseVo result = new ResponseVo();
+        try {
+            return mBillService.fileUpload(files, ftpServer);
+        } finally {
+            final long endTime = System.currentTimeMillis();
+            mLogger.info("Execute fileUpload the result is {} time spent is {} ", result, (endTime - beginTime));
         }
     }
 }
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
index cbbfb48..3a6715d 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
@@ -1,7 +1,9 @@
 package com.jttech.pfcs.services;
 
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
 import com.jttech.pfcs.vo.resp.ResponseVo;
 import com.jttech.pfcs.vo.req.bill.BillApiReqVo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @author wanghc
@@ -16,4 +18,12 @@
      * @return
      */
     ResponseVo post(BillApiReqVo reqVo);
+
+    /**
+     * 文件上传
+     * @param files
+     * @param pFtpServerParam
+     * @return
+     */
+    ResponseVo fileUpload(MultipartFile[] files, FtpServerParam pFtpServerParam);
 }
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
index 79d9963..d68cff3 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
@@ -1,9 +1,15 @@
 package com.jttech.pfcs.services.impl;
 
+import java.io.File;
 import java.util.concurrent.TimeUnit;
 
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.Session;
+import com.jttech.pfcs.util.SftpUtil;
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import com.alibaba.fastjson.JSONObject;
@@ -13,6 +19,7 @@
 import com.jttech.pfcs.vo.resp.bill.BillApiRespVo;
 
 import okhttp3.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 账单服务
@@ -62,4 +69,47 @@
             return ResponseVo.fail(-999, errMsg);
         }
     }
+
+    /**
+     * 文件上传
+     *
+     * @param files
+     * @param ftpServer
+     * @return
+     */
+    @Override
+    public ResponseVo fileUpload(MultipartFile[] files, FtpServerParam ftpServer) {
+        Session session = null;
+        ChannelSftp sftpChannel = null;
+        try {
+            session = SftpUtil.getSession(ftpServer.getIp(), ftpServer.getUser(), ftpServer.getPwd(), ftpServer.getPort());
+            sftpChannel = SftpUtil.openChannel(session);
+            //文件目录没有就需要创建
+            String saveDirPath = ftpServer.getSaveDirPath();
+            File targetDirFile = new File(saveDirPath);
+            if (!targetDirFile.exists()) {
+                if (!targetDirFile.mkdirs()) {
+                    // 创建处理目录失败
+                    throw new Exception("创建文件目录失败");
+                }
+            }
+            SftpUtil.cd(sftpChannel, saveDirPath);
+            for (MultipartFile file : files) {
+                String fileName = file.getOriginalFilename();
+                //放入文件
+                SftpUtil.put(sftpChannel, file.getBytes(), fileName);
+            }
+        } catch (Exception e) {
+            mLogger.error("BillServiceImpl.fileUpload err={} server={}", e, ftpServer);
+            throw new RuntimeException(e.getMessage());
+        } finally {
+            if (null != sftpChannel) {
+                sftpChannel.disconnect();
+            }
+            if (null != session) {
+                session.disconnect();
+            }
+        }
+        return ResponseVo.ok();
+    }
 }
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java
new file mode 100644
index 0000000..0e980f7
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java
@@ -0,0 +1,115 @@
+package com.jttech.pfcs.util;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.SftpException;
+
+/**
+ * sftp
+ *
+ * @author: yan xu
+ * @version: 1.0, 2017年12月21日
+ */
+public class SftpUtil {
+
+    public static Session getSession(String pIp, String pUser, String pPsw, int pPort) throws Exception {
+        Session session = null;
+        JSch jsch = new JSch();
+        if (pPort <= 0) {
+            // 连接服务器,采用默认端口
+            session = jsch.getSession(pUser, pIp);
+        } else {
+            // 采用指定的端口连接服务器
+            session = jsch.getSession(pUser, pIp, pPort);
+        }
+        // 设置登陆主机的密码
+        session.setPassword(pPsw);// 设置密码
+        // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
+        session.setConfig("StrictHostKeyChecking", "no");
+        // 设置登陆超时时间
+        session.connect(300000);
+        return session;
+    }
+
+
+
+    public static ChannelSftp openChannel(Session pSession) throws Exception {
+        ChannelSftp channel = (ChannelSftp) pSession.openChannel("sftp");
+        channel.connect(10000000);
+        return channel;
+    }
+
+
+
+    public static void cd(ChannelSftp pSftp, String pPath) throws Exception {
+        String[] folders = pPath.split("/");
+        boolean isFirst = true;
+        for (int i = 0; i < folders.length; i++) {
+            String folder = folders[i];
+            if (folder == null || folder.length() == 0) {
+                continue;
+            }
+            if (isFirst) {
+                folder = "/" + folder;
+                isFirst = false;
+            }
+            try {
+                pSftp.cd(folder);
+            } catch (SftpException e) {
+                pSftp.mkdir(folder);
+                pSftp.cd(folder);
+            }
+        }
+    }
+
+
+    public static void put(ChannelSftp pSftp, byte[] pFileBytes, String pPath) throws Exception {
+        InputStream inputs = new ByteArrayInputStream(pFileBytes);
+        pSftp.put(inputs, pPath);
+    }
+
+    public static void put(ChannelSftp pSftp, File pFile, String pPath) throws Exception {
+        FileInputStream inputStream = new FileInputStream(pFile);
+        try {
+            pSftp.put(inputStream, pPath);
+        } finally {
+            inputStream.close();
+        }
+    }
+
+
+
+    public static void get(ChannelSftp pSftp, String pDownloadFile, String pSaveDirectory) throws Exception {
+        File dir = new File(pSaveDirectory);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        String saveFile = pSaveDirectory + "/" + pDownloadFile;
+        File file = new File(saveFile);
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+        pSftp.get(pDownloadFile, fileOutputStream);
+        fileOutputStream.close();
+    }
+
+
+
+    public static List<String> listFiles(ChannelSftp pSftp, String pPath) throws Exception {
+        List<String> result = new ArrayList<>();
+        Vector ls = pSftp.ls(pPath);
+        if (null != ls && ls.size() > 0) {
+            for (Object l : ls) {
+                ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry) l;
+                String filename = lsEntry.getFilename();
+                result.add(filename);
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java
new file mode 100644
index 0000000..e98a518
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java
@@ -0,0 +1,106 @@
+package com.jttech.pfcs.vo.req.bill;
+
+import java.io.Serializable;
+
+/**
+ * ftp服务参数
+ * 
+ * @author wanghc
+ * @version 1.0.0
+ * @date 2023-03-09
+ */
+public class FtpServerParam implements Serializable {
+
+    private static final long serialVersionUID = 9215027608162929560L;
+
+    /**
+     * ip
+     */
+    private String            ip;
+
+    /**
+     * 端口
+     */
+    private Integer           port;
+
+    /**
+     * 登录用户
+     */
+    private String            user;
+
+    /**
+     * 登录密码
+     */
+    private String            pwd;
+
+    /**
+     * 保存路径
+     */
+    private String            saveDirPath;
+
+    public String getIp() {
+        return ip;
+    }
+
+
+
+    public void setIp(String pIp) {
+        ip = pIp;
+    }
+
+
+
+    public Integer getPort() {
+        return port;
+    }
+
+
+
+    public void setPort(Integer pPort) {
+        port = pPort;
+    }
+
+
+
+    public String getUser() {
+        return user;
+    }
+
+
+
+    public void setUser(String pUser) {
+        user = pUser;
+    }
+
+
+
+    public String getPwd() {
+        return pwd;
+    }
+
+
+
+    public void setPwd(String pPwd) {
+        pwd = pPwd;
+    }
+
+
+
+    public String getSaveDirPath() {
+        return saveDirPath;
+    }
+
+
+
+    public void setSaveDirPath(String pSaveDirPath) {
+        saveDirPath = pSaveDirPath;
+    }
+
+
+
+    @Override
+    public String toString() {
+        return "FtpServerParam{" + "ip='" + ip + '\'' + ", port=" + port + ", user='" + user + '\'' + ", pwd='" + pwd
+                + '\'' + ", saveDirPath='" + saveDirPath + '\'' + '}';
+    }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
index 2ddf3d4..43cea10 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
@@ -28,6 +28,10 @@
         return new ResponseVo(body);
     }
 
+    public static ResponseVo ok() {
+        return new ResponseVo();
+    }
+
     public static ResponseVo fail(int errorCode, String errMsg) {
         return new ResponseVo(errorCode, errMsg, null);
     }
diff --git a/cmci-pfcs-gateway/src/main/resources/application.properties b/cmci-pfcs-gateway/src/main/resources/application.properties
index b88b070..c255588 100644
--- a/cmci-pfcs-gateway/src/main/resources/application.properties
+++ b/cmci-pfcs-gateway/src/main/resources/application.properties
@@ -1,8 +1,4 @@
 spring.application.name=@pom.artifactId@
 server.port=8400
 server.servlet.context-path=/pf-api
-logging.config=classpath:logback.xml
-
-#### pf ������api ############
-pf.bill.trade.flow.qry.url=http://www.baidu.com
-pf.bill.file.notice.url=http://www.baidu.com
\ No newline at end of file
+logging.config=classpath:logback.xml
\ No newline at end of file

--
Gitblit v1.8.0