From 67bc268ffdc203fd0f3081261c8778bd61a23541 Mon Sep 17 00:00:00 2001
From: liyj <1003249715@qq.com>
Date: Sat, 31 Aug 2024 16:03:38 +0800
Subject: [PATCH] 1、新增附件管理模块

---
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileInfoService.java                    |   86 +++
 dyh-service/dyh-base/src/main/java/cn/huge/module/sys/dto/FileInfoBaseDTO.java                        |   33 
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java |  173 ++++++
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpUtils.java                             |  256 +++++++++
 dyh-service/dyh-sys/pom.xml                                                                           |   10 
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FileUtils.java                            |   40 +
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileRelateService.java                  |   42 +
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpMultipartFileWrapper.java              |  184 +++++++
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/config/FtpFileConfig.java                       |  108 ++++
 dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileBaseConsts.java                    |   44 +
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileInfo.java                         |   49 +
 dyh-service/dyh-sys/src/main/resources/config/application.yml                                         |   11 
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java       |  140 +++++
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileRelate.java                       |    2 
 dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/dto/UploaderDTO.java                     |   37 +
 dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java                  |  188 +++++++
 dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileOwnerTypeBaseEnum.java             |   24 
 dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/CustClient.java                           |   74 ++
 18 files changed, 1,474 insertions(+), 27 deletions(-)

diff --git a/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileBaseConsts.java b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileBaseConsts.java
new file mode 100644
index 0000000..948e129
--- /dev/null
+++ b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileBaseConsts.java
@@ -0,0 +1,44 @@
+package cn.huge.module.sys.constant;
+
+/**
+ * @title: 附件相关常量类
+ * @description: 附件相关常量类
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+public class FileBaseConsts {
+
+    /**
+     * 上传人类型,1:工作人员,2:申请方当事人,3:申请方代理人,4:被申请方当事人,5:被申请方代理人
+     */
+    public static final int UPLOADER_TYPE_1 = 1;
+    public static final int UPLOADER_TYPE_2 = 2;
+    public static final int UPLOADER_TYPE_3 = 3;
+    public static final int UPLOADER_TYPE_4 = 4;
+    public static final int UPLOADER_TYPE_5 = 5;
+
+}
+/**
+ * -------------------_ooOoo_-------------------
+ * ------------------o8888888o------------------
+ * ------------------88" . "88------------------
+ * ------------------(| -_- |)------------------
+ * ------------------O\  =  /O------------------
+ * ---------------____/`---'\____---------------
+ * -------------.'  \\|     |//  `.-------------
+ * ------------/  \\|||  :  |||//  \------------
+ * -----------/  _||||| -:- |||||-  \-----------
+ * -----------|   | \\\  -  /// |   |-----------
+ * -----------| \_|  ''\---/''  |   |-----------
+ * -----------\  .-\__  `-`  ___/-. /-----------
+ * ---------___`. .'  /--.--\  `. . __----------
+ * ------."" '<  `.___\_<|>_/___.'  >'"".-------
+ * -----| | :  `- \`.;`\ _ /`;.`/ - ` : | |-----
+ * -----\  \ `-.   \_ __\ /__ _/   .-` /  /-----
+ * ======`-.____`-.___\_____/___.-`____.-'======
+ * -------------------`=---='
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ * ---------佛祖保佑---hugeinfo---永无BUG----------
+ */
diff --git a/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileOwnerTypeBaseEnum.java b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileOwnerTypeBaseEnum.java
index 628bdc9..f70e518 100644
--- a/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileOwnerTypeBaseEnum.java
+++ b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/constant/FileOwnerTypeBaseEnum.java
@@ -228,6 +228,10 @@
 
             case "22_00018-501":
                 return OWNER_CAT_7.getIndex();
+            case "22_00018-506":
+                return OWNER_CAT_7.getIndex();
+            case "22_00018-507":
+                return OWNER_CAT_7.getIndex();
 
             case "22_00018-502":
                 return OWNER_CAT_9.getIndex();
@@ -247,7 +251,7 @@
             case "22_00018-604":
                 return OWNER_CAT_8.getIndex();
             case "22_00018-605":
-                return OWNER_CAT_9.getIndex();
+                return OWNER_CAT_8.getIndex();
 
             default:
                 return OWNER_CAT_4.getIndex();
@@ -273,6 +277,13 @@
                 return OWNER_CAT_5;
             case "22_00014-6":
                 return OWNER_CAT_6;
+            case "22_00014-7":
+                return OWNER_CAT_7;
+            case "22_00014-8":
+                return OWNER_CAT_8;
+            case "22_00014-9":
+                return OWNER_CAT_9;
+
             case "22_00018-101":
                 return OWNER_TYPE_101;
             case "22_00018-102":
@@ -327,6 +338,8 @@
                 return OWNER_TYPE_305;
             case "22_00018-306":
                 return OWNER_TYPE_306;
+            case "22_00018-307":
+                return OWNER_TYPE_307;
 
             case "22_00018-401":
                 return OWNER_TYPE_401;
@@ -334,6 +347,8 @@
                 return OWNER_TYPE_402;
             case "22_00018-403":
                 return OWNER_TYPE_403;
+            case "22_00018-405":
+                return OWNER_TYPE_405;
             case "22_00018-406":
                 return OWNER_TYPE_406;
             case "22_00018-407":
@@ -345,12 +360,19 @@
 
             case "22_00018-501":
                 return OWNER_TYPE_501;
+            case "22_00018-506":
+                return OWNER_TYPE_506;
+            case "22_00018-507":
+                return OWNER_TYPE_507;
+
             case "22_00018-502":
                 return OWNER_TYPE_502;
             case "22_00018-503":
                 return OWNER_TYPE_503;
             case "22_00018-504":
                 return OWNER_TYPE_504;
+            case "22_00018-505":
+                return OWNER_TYPE_505;
 
             case "22_00018-601":
                 return OWNER_TYPE_601;
diff --git a/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/dto/FileInfoBaseDTO.java b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/dto/FileInfoBaseDTO.java
index f50d37d..262daf2 100644
--- a/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/dto/FileInfoBaseDTO.java
+++ b/dyh-service/dyh-base/src/main/java/cn/huge/module/sys/dto/FileInfoBaseDTO.java
@@ -1,5 +1,6 @@
 package cn.huge.module.sys.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
 import java.util.Date;
@@ -41,18 +42,18 @@
     private String suffix;
 
     /**
-    * 附件分类,音频|视频|图片等
-    */
+     * 附件分类,音频|视频|图片等
+     */
     private String cat;
 
     /**
-    * 附件大小
-    */
+     * 附件大小
+     */
     private Double size;
 
     /**
-    * 单位
-    */
+     * 单位
+     */
     private String unit;
 
     /**
@@ -91,9 +92,14 @@
     private String zipUrl;
 
     /**
-     * 文件上传时间
+     * 删除状态,0:已删除,1:未删除
      */
-    private Date createTime;
+    private Integer deleteStatus;
+
+    /**
+     * 顾客编号
+     */
+    private String custId;
 
     /**
      * 状态时间
@@ -101,9 +107,9 @@
     private Date updateTime;
 
     /**
-    * 顾客编号
-    */
-    private String custId;
+     * 创建时间
+     */
+    private Date createTime;
 
     /**
      * 所属业务编号
@@ -141,6 +147,11 @@
     private String uploaderName;
 
     /**
+     * 上传人类型,1:工作人员,2:申请方当事人,3:申请方代理人,4:被申请方当事人,5:被申请方代理人
+     */
+    private Integer uploaderType;
+
+    /**
      * 前端固定参数,值为:done
      */
     private String status;
diff --git a/dyh-service/dyh-sys/pom.xml b/dyh-service/dyh-sys/pom.xml
index e3ca2fa..124dc92 100644
--- a/dyh-service/dyh-sys/pom.xml
+++ b/dyh-service/dyh-sys/pom.xml
@@ -18,7 +18,7 @@
     </parent>
 
     <properties>
-
+        <commons-net.version>3.1</commons-net.version>
     </properties>
 
     <dependencies>
@@ -59,6 +59,14 @@
             <scope>test</scope>
         </dependency>
         <!-- junit end -->
+
+        <!-- net -->
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>${commons-net.version}</version>
+        </dependency>
+        <!-- net end -->
     </dependencies>
 
     <build>
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/CustClient.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/CustClient.java
new file mode 100644
index 0000000..4bc8525
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/CustClient.java
@@ -0,0 +1,74 @@
+package cn.huge.module.client.api;
+
+import cn.huge.base.common.bo.ReturnBO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @title: 客户用户中心微服务调用接口
+ * @description: 客户用户中心微服务调用接口
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+@FeignClient(name = "dyh-cust")
+public interface CustClient {
+
+    /**
+     * 内部用户-获取登录用户
+     * @url {ctx}/api/v1/ctUser/clientGetUser?userId=
+     * @param userId 登录用户编号
+     * @return ReturnBO
+     */
+    @GetMapping("/api/v1/ctUser/clientGetUser")
+    ReturnBO clientGetUser(@RequestParam("userId") String userId);
+
+    /**
+     * 内部用户-获取登录用户
+     * @url {ctx}/api/v1/ctUser/clientGetUserAll?userId=
+     * @param userId 登录用户编号
+     * @return
+     */
+    @GetMapping("/api/v1/ctUser/clientGetUserAll")
+    ReturnBO clientGetUserAll(@RequestParam("userId") String userId);
+
+    /**
+     * 当事人-获取登录用户
+     * @url {ctx}/api/v1/paUser/clientGetUserAll?userId=
+     * @param userId 登录用户编号
+     * @return ReturnBO
+     */
+    @GetMapping("/api/v1/paUser/clientGetUserAll")
+    ReturnBO paclientGetUser(@RequestParam("userId") String userId);
+
+    /**
+     * 根据组织和角色查询
+     * @url {ctx}/api/v1/ctUser/listUserByUnitRole
+     * @return unitId 组织编号
+     * @return roleCode 角色代码
+     * @return ReturnBO
+     */
+    @GetMapping("/api/v1/ctUser/listUserByUnitRole")
+    ReturnBO listUserByUnitRole(@RequestParam(value = "unitId") String unitId, @RequestParam(value = "roleCode") String roleCode);
+
+    /**
+     * 根据部门和角色查询
+     * @url {ctx}/api/v1/ctUser/listUserByDeptRole
+     * @return deptId 部门编号
+     * @return roleCode 角色代码
+     * @return ReturnBO
+     */
+    @GetMapping("/api/v1/ctUser/listUserByDeptRole")
+    ReturnBO listUserByDeptRole(@RequestParam(value = "deptId") String deptId, @RequestParam(value = "roleCode") String roleCode);
+
+    /**
+     * 查询客户下的法院
+     * @url {ctx}/api/v1/ctUnit/listCourt1
+     * @param userId 用户编号
+     * @return ReturnBO
+     */
+    @GetMapping("/api/v1/ctUnit/listCourt1")
+    ReturnBO listCourt1(@RequestParam(value = "userId") String userId);
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java
new file mode 100644
index 0000000..cf056ca
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java
@@ -0,0 +1,188 @@
+package cn.huge.module.client.api.impl;
+
+import cn.huge.base.common.bo.ReturnBO;
+import cn.huge.base.common.constant.ReturnConsts;
+import cn.huge.base.common.dto.SelectTermDTO;
+import cn.huge.base.common.exception.ClientException;
+import cn.huge.base.common.exception.ServiceException;
+import cn.huge.module.client.api.CustClient;
+import cn.huge.module.cust.dto.CtUserDTO;
+import cn.huge.module.cust.dto.PaUserDTO;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * @title: 客户用户中心微服务调用接口实现
+ * @description: 客户用户中心微服务调用接口实现
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+@Slf4j
+@Component
+public class CustClientImpl {
+
+    private CustClient custClient;
+
+    @Autowired
+    public CustClientImpl(CustClient custClient) {
+        this.custClient = custClient;
+    }
+
+    /**
+     * ObjectMapper工具类
+     */
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    /**
+     * 内部用户-获取登录用户
+     * @param userId 用户编号
+     * @return CtUserDTO
+     */
+    public CtUserDTO clientGetUser(String userId){
+        try{
+            ReturnBO returnBo = custClient.clientGetUser(userId);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                CtUserDTO loginUser = objectMapper.convertValue(returnBo.getData(), CtUserDTO.class);
+                return loginUser;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.clientGetUser]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.clientGetUser", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.clientGetUser]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.clientGetUser", e);
+        }
+    }
+
+    /**
+     * 内部用户-获取登录用户
+     * @param userId
+     * @return
+     */
+    public CtUserDTO clientGetUserAll(String userId){
+        try{
+            ReturnBO returnBo = custClient.clientGetUserAll(userId);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                CtUserDTO loginUser = objectMapper.convertValue(returnBo.getData(), CtUserDTO.class);
+                return loginUser;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.clientGetUserAll]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.clientGetUserAll", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.clientGetUserAll]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.clientGetUserAll", e);
+        }
+    }
+
+    /**
+     * 当事人-获取登录用户
+     * @param userId 用户编号
+     * @return
+     */
+    public PaUserDTO paclientGetUser(String userId){
+        try{
+            ReturnBO returnBo = custClient.paclientGetUser(userId);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                PaUserDTO loginUser = objectMapper.convertValue(returnBo.getData(), PaUserDTO.class);
+                return loginUser;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.paclientGetUser]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.paclientGetUser", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.paclientGetUser]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.paclientGetUser", e);
+        }
+    }
+
+    /**
+     * 根据组织和角色查询
+     * @return unitId 组织编号
+     * @return roleCode 角色代码
+     * @return Object
+     */
+    public List<CtUserDTO> listUserByUnitRole(@RequestParam(value = "unitId") String unitId, @RequestParam(value = "roleCode") String roleCode) {
+        List<CtUserDTO> ctUserDTOList = new ArrayList<>();
+        try{
+            ReturnBO returnBo = custClient.listUserByUnitRole(unitId, roleCode);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                List<LinkedHashMap> list = (List<LinkedHashMap>) returnBo.getData();
+                for (LinkedHashMap map : list) {
+                    CtUserDTO ctUserDTO = JSON.parseObject(JSON.toJSONString(map), CtUserDTO.class);
+                    ctUserDTOList.add(ctUserDTO);
+                }
+                return ctUserDTOList;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.listUserByUnitRole]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.listUserByUnitRole", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.listUserByUnitRole]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.listUserByUnitRole", e);
+        }
+    }
+
+    /**
+     * 根据部门和角色查询
+     * @return deptId 部门编号
+     * @return roleCode 角色代码
+     * @return Object
+     */
+    public List<CtUserDTO> listUserByDeptRole(@RequestParam(value = "deptId") String deptId, @RequestParam(value = "roleCode") String roleCode) {
+        List<CtUserDTO> ctUserDTOList = new ArrayList<>();
+        try{
+            ReturnBO returnBo = custClient.listUserByDeptRole(deptId, roleCode);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                List<LinkedHashMap> list = (List<LinkedHashMap>) returnBo.getData();
+                for (LinkedHashMap map : list) {
+                    CtUserDTO ctUserDTO = JSON.parseObject(JSON.toJSONString(map), CtUserDTO.class);
+                    ctUserDTOList.add(ctUserDTO);
+                }
+                return ctUserDTOList;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.listUserByDeptRole]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.listUserByDeptRole", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.listUserByDeptRole]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.listUserByDeptRole", e);
+        }
+    }
+
+    /**
+     * 查询客户下的法院
+     * @param userId
+     * @return
+     */
+    public List<SelectTermDTO> listCourt1(String userId){
+        List<SelectTermDTO> selectTermDTOList = new ArrayList<>();
+        try{
+            ReturnBO returnBo = custClient.listCourt1(userId);
+            if (ReturnConsts.OK == returnBo.getCode()){
+                List<LinkedHashMap> list = (List<LinkedHashMap>) returnBo.getData();
+                for (LinkedHashMap map : list) {
+                    SelectTermDTO selectTermDTO = JSON.parseObject(JSON.toJSONString(map), SelectTermDTO.class);
+                    selectTermDTOList.add(selectTermDTO);
+                }
+                return selectTermDTOList;
+            }else{
+                log.error("Client外服务接口[CustClientImpl.listCourt1]请求异常:" + returnBo.getMsg(), returnBo.getMsg());
+                throw new ClientException("CustClientImpl.listCourt1", returnBo.getMsg());
+            }
+        }catch (Exception e){
+            log.error("service方法[CustClientImpl.listCourt1]调用异常:"+e, e);
+            throw new ServiceException("CustClientImpl.listCourt1", e);
+        }
+    }
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/config/FtpFileConfig.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/config/FtpFileConfig.java
new file mode 100644
index 0000000..1dd048e
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/config/FtpFileConfig.java
@@ -0,0 +1,108 @@
+package cn.huge.module.file.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @title: JSON工具类
+ * @description: JSON工具类
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+@Component
+public class FtpFileConfig {
+
+    /**
+     * 服务器ip地址
+     */
+    public static String hostname;
+
+    /**
+     * 端口
+     */
+    public static int port;
+
+    /**
+     * 用户名
+     */
+    public static String username;
+
+    /**
+     * 密码
+     */
+    public static String password;
+
+    /**
+     * 附件存储根目录
+     */
+    public static String rootdir;
+
+    @Value("${ftp.hostname}")
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    @Value("${ftp.port}")
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    @Value("${ftp.username}")
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    @Value("${ftp.password}")
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    @Value("${ftp.rootdir}")
+    public void setRootdir(String rootdir) {
+        this.rootdir = rootdir;
+    }
+
+    public static String getHostname() {
+        return hostname;
+    }
+
+    public static int getPort() {
+        return port;
+    }
+
+    public static String getUsername() {
+        return username;
+    }
+
+    public static String getPassword() {
+        return password;
+    }
+
+    public static String getRootdir() {
+        return rootdir;
+    }
+}
+/**
+ * -------------------_ooOoo_-------------------
+ * ------------------o8888888o------------------
+ * ------------------88" . "88------------------
+ * ------------------(| -_- |)------------------
+ * ------------------O\  =  /O------------------
+ * ---------------____/`---'\____---------------
+ * -------------.'  \\|     |//  `.-------------
+ * ------------/  \\|||  :  |||//  \------------
+ * -----------/  _||||| -:- |||||-  \-----------
+ * -----------|   | \\\  -  /// |   |-----------
+ * -----------| \_|  ''\---/''  |   |-----------
+ * -----------\  .-\__  `-`  ___/-. /-----------
+ * ---------___`. .'  /--.--\  `. . __----------
+ * ------."" '<  `.___\_<|>_/___.'  >'"".-------
+ * -----| | :  `- \`.;`\ _ /`;.`/ - ` : | |-----
+ * -----\  \ `-.   \_ __\ /__ _/   .-` /  /-----
+ * ======`-.____`-.___\_____/___.-`____.-'======
+ * -------------------`=---='
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ * ---------佛祖保佑---hugeinfo---永无BUG----------
+ */
\ No newline at end of file
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java
index 088af92..340bf13 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/web/FileInfoWebController.java
@@ -1,19 +1,42 @@
 package cn.huge.module.file.controller.web;
 
+import cn.huge.base.common.exception.ClientException;
+import cn.huge.base.common.utils.ContentTypeUtils;
 import cn.huge.base.common.utils.ReturnFailUtils;
 import cn.huge.base.common.utils.ReturnSucUtils;
+import cn.huge.base.config.CurrentUser;
+import cn.huge.module.client.api.impl.CustClientImpl;
+import cn.huge.module.constant.BaseConsts;
+import cn.huge.module.cust.dto.CtUserDTO;
+import cn.huge.module.file.domain.dto.UploaderDTO;
 import cn.huge.module.file.domain.po.FileInfo;
 import cn.huge.module.file.service.FileInfoService;
+import cn.huge.module.file.service.FileRelateService;
+import cn.huge.module.file.utils.FileUtils;
+import cn.huge.module.file.utils.FtpUtils;
+import cn.huge.module.sys.constant.FileOwnerTypeBaseEnum;
+import cn.huge.module.sys.dto.FileInfoBaseDTO;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -36,5 +59,122 @@
 
     @Autowired
     private FileInfoService service;
+    @Autowired
+    private FileRelateService fileRelateService;
+    @Autowired
+    private CustClientImpl custClient;
+
+    /**
+     * 页面附件上传-文件流方式
+     * @url {ctx}/api/web/fileInfo/upload/{ownerId}/{ownerType}
+     * @param ownerId 所属业务编号
+     * @param ownerType 所属业务类型
+     * @param request 请求头
+     * @return Object
+     */
+    @PostMapping("/upload/{ownerId}/{ownerType}")
+    public Object upload(@PathVariable(value = "ownerId") String ownerId, @PathVariable(value = "ownerType") String ownerType,
+                         @CurrentUser String userId, MultipartHttpServletRequest request) {
+        try{
+            CtUserDTO loginUser = custClient.clientGetUser(userId);
+            UploaderDTO uploaderDTO = new UploaderDTO();
+            BeanUtils.copyProperties(loginUser, uploaderDTO);
+            List<FileInfoBaseDTO> files = new ArrayList<>();
+            Iterator<String> itr = request.getFileNames();
+            int fileCount = fileRelateService.countByOwnerIdAndType(ownerId, ownerType)+1;
+            while (itr.hasNext()) {
+                MultipartFile file = request.getFile(itr.next());
+                if(file.getSize() > 30000000){
+                    return ReturnFailUtils.getRepInfo("您上传的文件已超过30M大小限制!");
+                }else {
+                    String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+                    if (FileUtils.checkFileSuffix(fileSuffix)) {
+                        if (StringUtils.isEmpty(ownerType)) {
+                            ownerType = FileOwnerTypeBaseEnum.OWNER_TYPE_000.getIndex();
+                        }
+                        FileInfo fileInfo = service.webPploadFile(file, ownerId, ownerType, fileCount, uploaderDTO);
+                        FileInfoBaseDTO fileInfoBaseDTO = new FileInfoBaseDTO();
+                        BeanUtils.copyProperties(fileInfo, fileInfoBaseDTO);
+                        files.add(fileInfoBaseDTO);
+                        fileCount++;
+                    } else {
+                        return ReturnFailUtils.getRepInfo("您上传的文件格式不正确!");
+                    }
+                }
+            }
+            return ReturnSucUtils.getRepInfo( "上传成功!", files);
+        } catch (Exception e) {
+            return ReturnFailUtils.getRepInfo();
+        }
+    }
+
+    /**
+     * 在线查附件
+     * @url {ctx}/api/web/fileInfo/show/{id}
+     * @param id 附件编号
+     * @param response 响应头
+     * @throws Exception
+     */
+    @GetMapping("/show/{id}")
+    public void show(@PathVariable(value = "id") String id, HttpServletResponse response){
+        try {
+            FileInfo fileInfo = service.getById(id);
+            response.reset();
+            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
+            response.setContentType(contentType);
+            OutputStream outputStream = response.getOutputStream();
+            FtpUtils ftpUtil = new FtpUtils();
+            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
+
+//            double fileSize = fileInfo.getSize(); // 文件大小
+            int chunkSize = 512 * 1024; // 分块大小( KB)
+            byte[] buffer = new byte[chunkSize];
+            int bytesRead;
+
+            // 循环读取和发送文件的各个部分
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+                outputStream.flush();
+            }
+
+//            IOUtils.copy(inputStream, outputStream, chunkSize);
+            //关闭流
+            IOUtils.closeQuietly(inputStream);
+            IOUtils.closeQuietly(outputStream);
+        } catch (Exception e) {
+            log.error("controller接口[FileInfoWebController.show]请求异常:"+e, e);
+            throw new ClientException("FileInfoWebController.show", e);
+        }
+    }
+
+    /**
+     * 在线下载附件-文件流方式
+     * @url {ctx}/api/web/fileInfo/down/{id}
+     * @param id 附件编号
+     * @param response 响应头
+     */
+    @GetMapping("/down/{id}")
+    public void down(@PathVariable(value = "id") String id, HttpServletResponse response){
+        try {
+            FileInfo fileInfo = service.getById(id);
+            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
+            response.setContentType(contentType);
+            String fileName = URLEncoder.encode(fileInfo.getName() + BaseConsts.DOT + fileInfo.getSuffix(), "UTF-8");
+            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
+            OutputStream outputStream = response.getOutputStream();
+            FtpUtils ftpUtil = new FtpUtils();
+            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
+            IOUtils.copy(inputStream, outputStream);
+            //关闭流
+            IOUtils.closeQuietly(inputStream);
+            IOUtils.closeQuietly(outputStream);
+        } catch (Exception e) {
+            log.error("controller接口[FileInfoWebController.down]请求异常:"+e, e);
+            throw new ClientException("FileInfoWebController.down", e);
+        }
+    }
+
+
+
 
 }
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java
new file mode 100644
index 0000000..09a62b1
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java
@@ -0,0 +1,173 @@
+package cn.huge.module.file.controller.wechat;
+
+import cn.huge.base.common.exception.ClientException;
+import cn.huge.base.common.utils.ContentTypeUtils;
+import cn.huge.base.common.utils.ReturnFailUtils;
+import cn.huge.base.common.utils.ReturnSucUtils;
+import cn.huge.base.config.CurrentUser;
+import cn.huge.module.client.api.impl.CustClientImpl;
+import cn.huge.module.constant.BaseConsts;
+import cn.huge.module.cust.dto.CtUserDTO;
+import cn.huge.module.file.domain.dto.UploaderDTO;
+import cn.huge.module.file.domain.po.FileInfo;
+import cn.huge.module.file.service.FileInfoService;
+import cn.huge.module.file.service.FileRelateService;
+import cn.huge.module.file.utils.FileUtils;
+import cn.huge.module.file.utils.FtpUtils;
+import cn.huge.module.sys.constant.FileOwnerTypeBaseEnum;
+import cn.huge.module.sys.dto.FileInfoBaseDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @title: 附件信息表接口api-wechat端
+ * @description: 附件信息表接口api-wechat端
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2024-08-28 20:06:18
+ * @version: 1.0.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/wechat/fileInfo")
+public class FileInfoWechatController {
+
+    @Autowired(required = false)
+    private HttpServletRequest request;
+
+    @Autowired
+    private FileInfoService service;
+    @Autowired
+    private FileRelateService fileRelateService;
+    @Autowired
+    private CustClientImpl custClient;
+
+    /**
+     * 页面附件上传-文件流方式
+     * @url {ctx}/api/wechat/fileInfo/upload/{ownerId}/{ownerType}
+     * @param ownerId 所属业务编号
+     * @param ownerType 所属业务类型
+     * @param request 请求头
+     * @return Object
+     */
+    @PostMapping("/upload/{ownerId}/{ownerType}")
+    public Object upload(@PathVariable(value = "ownerId") String ownerId, @PathVariable(value = "ownerType") String ownerType,
+                         @CurrentUser String userId, MultipartHttpServletRequest request) {
+        try{
+            CtUserDTO loginUser = custClient.clientGetUser(userId);
+            UploaderDTO uploaderDTO = new UploaderDTO();
+            BeanUtils.copyProperties(loginUser, uploaderDTO);
+            List<FileInfoBaseDTO> files = new ArrayList<>();
+            Iterator<String> itr = request.getFileNames();
+            int fileCount = fileRelateService.countByOwnerIdAndType(ownerId, ownerType)+1;
+            while (itr.hasNext()) {
+                MultipartFile file = request.getFile(itr.next());
+                if(file.getSize() > 30000000){
+                    return ReturnFailUtils.getRepInfo("您上传的文件已超过30M大小限制!");
+                }else {
+                    String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+                    if (FileUtils.checkFileSuffix(fileSuffix)) {
+                        if (StringUtils.isEmpty(ownerType)) {
+                            ownerType = FileOwnerTypeBaseEnum.OWNER_TYPE_000.getIndex();
+                        }
+                        FileInfo fileInfo = service.webPploadFile(file, ownerId, ownerType, fileCount, uploaderDTO);
+                        FileInfoBaseDTO fileInfoBaseDTO = new FileInfoBaseDTO();
+                        BeanUtils.copyProperties(fileInfo, fileInfoBaseDTO);
+                        files.add(fileInfoBaseDTO);
+                        fileCount++;
+                    } else {
+                        return ReturnFailUtils.getRepInfo("您上传的文件格式不正确!");
+                    }
+                }
+            }
+            return ReturnSucUtils.getRepInfo( "上传成功!", files);
+        } catch (Exception e) {
+            return ReturnFailUtils.getRepInfo();
+        }
+    }
+
+    /**
+     * 在线查附件
+     * @url {ctx}/api/wechat/fileInfo/show/{id}
+     * @param id 附件编号
+     * @param response 响应头
+     * @throws Exception
+     */
+    @GetMapping("/show/{id}")
+    public void show(@PathVariable(value = "id") String id, HttpServletResponse response){
+        try {
+            FileInfo fileInfo = service.getById(id);
+            response.reset();
+            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
+            response.setContentType(contentType);
+            OutputStream outputStream = response.getOutputStream();
+            FtpUtils ftpUtil = new FtpUtils();
+            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
+
+//            double fileSize = fileInfo.getSize(); // 文件大小
+            int chunkSize = 512 * 1024; // 分块大小( KB)
+            byte[] buffer = new byte[chunkSize];
+            int bytesRead;
+
+            // 循环读取和发送文件的各个部分
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+                outputStream.flush();
+            }
+
+//            IOUtils.copy(inputStream, outputStream, chunkSize);
+            //关闭流
+            IOUtils.closeQuietly(inputStream);
+            IOUtils.closeQuietly(outputStream);
+        } catch (Exception e) {
+            log.error("controller接口[FileInfoWechatController.show]请求异常:"+e, e);
+            throw new ClientException("FileInfoWechatController.show", e);
+        }
+    }
+
+    /**
+     * 在线下载附件-文件流方式
+     * @url {ctx}/api/wechat/fileInfo/down/{id}
+     * @param id 附件编号
+     * @param response 响应头
+     */
+    @GetMapping("/down/{id}")
+    public void down(@PathVariable(value = "id") String id, HttpServletResponse response){
+        try {
+            FileInfo fileInfo = service.getById(id);
+            String contentType = ContentTypeUtils.getContentType(fileInfo.getSuffix());
+            response.setContentType(contentType);
+            String fileName = URLEncoder.encode(fileInfo.getName() + BaseConsts.DOT + fileInfo.getSuffix(), "UTF-8");
+            response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
+            OutputStream outputStream = response.getOutputStream();
+            FtpUtils ftpUtil = new FtpUtils();
+            InputStream inputStream = ftpUtil.retrieveFileStream(fileInfo.getFullPath());
+            IOUtils.copy(inputStream, outputStream);
+            //关闭流
+            IOUtils.closeQuietly(inputStream);
+            IOUtils.closeQuietly(outputStream);
+        } catch (Exception e) {
+            log.error("controller接口[FileInfoWechatController.down]请求异常:"+e, e);
+            throw new ClientException("FileInfoWechatController.down", e);
+        }
+    }
+
+
+
+
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/dto/UploaderDTO.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/dto/UploaderDTO.java
new file mode 100644
index 0000000..8be3d8e
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/dto/UploaderDTO.java
@@ -0,0 +1,37 @@
+package cn.huge.module.file.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * @title: 附件上传人信息
+ * @description: DTO数据传输对象。
+ * @company:hugeinfo
+ * @author: chenx
+ * @time: 2022-02-22 14:19:43
+ * @version 1.0.0
+ */
+@Data
+public class UploaderDTO {
+
+    /**
+     * 上传人编号
+     */
+    private String uploaderId;
+
+    /**
+     * 上传人姓名
+     */
+    private String uploaderName;
+
+    /**
+     * 上传人类型,1:工作人员,2:申请方当事人,3:申请方代理人,4:被申请方当事人,5:被申请方代理人
+     */
+    private Integer uploaderType;
+
+    /**
+     * 顾客编号
+     */
+    private String custId;
+
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileInfo.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileInfo.java
index 65f464c..49f1040 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileInfo.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileInfo.java
@@ -33,7 +33,7 @@
     private String name;
 
     /**
-    * 附件原本名称(不带后缀)
+    * 附件原本名称(带后缀)
     */
     @TableField(value = "true_name")
     private String trueName;
@@ -134,5 +134,52 @@
     */
     @TableField(value = "create_time")
     private Date createTime;
+    /**
+     * 所属业务编号
+     */
+    @TableField(exist = false)
+    private String ownerId;
+
+    /**
+     * 所属业务大类
+     */
+    @TableField(exist = false)
+    private String ownerCat;
+
+    /**
+     * 所属业务大类名称
+     */
+    @TableField(exist = false)
+    private String ownerCatName;
+
+    /**
+     * 所属业务类型W
+     */
+    @TableField(exist = false)
+    private String ownerType;
+
+    /**
+     * 所属业务类型名称
+     */
+    @TableField(exist = false)
+    private String ownerTypeName;
+
+    /**
+     * 上传人编号
+     */
+    @TableField(exist = false)
+    private String uploaderId;
+
+    /**
+     * 上传人姓名
+     */
+    @TableField(exist = false)
+    private String uploaderName;
+
+    /**
+     * 上传人类型,1:工作人员,2:申请方当事人,3:申请方代理人,4:被申请方当事人,5:被申请方代理人
+     */
+    @TableField(exist = false)
+    private Integer uploaderType;
 
 }
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileRelate.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileRelate.java
index e6eb19f..3fb96cd 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileRelate.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/domain/po/FileRelate.java
@@ -63,7 +63,7 @@
     private String uploaderName;
 
     /**
-    * 上传人类型,1:工作人员,2:申请方,3:被申请方
+    * 上传人类型,1:工作人员,2:申请方当事人,3:申请方代理人,4:被申请方当事人,5:被申请方代理人
     */
     @TableField(value = "uploader_type")
     private Integer uploaderType;
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileInfoService.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileInfoService.java
index a8018fd..0271ecd 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileInfoService.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileInfoService.java
@@ -4,19 +4,23 @@
 import cn.huge.base.common.utils.DateUtils;
 import cn.huge.base.common.utils.IdUtils;
 import cn.huge.module.client.api.impl.UtilsClientImpl;
+import cn.huge.module.constant.BaseConsts;
 import cn.huge.module.file.dao.mapper.FileInfoMapper;
+import cn.huge.module.file.domain.dto.UploaderDTO;
 import cn.huge.module.file.domain.po.FileInfo;
+import cn.huge.module.file.utils.FtpUtils;
+import cn.huge.module.file.utils.FtpMultipartFileWrapper;
+import cn.huge.module.sys.constant.FileOwnerTypeBaseEnum;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.PostConstruct;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -36,6 +40,8 @@
 
     @Autowired
     private FileInfoMapper mapper;
+    @Autowired
+    private FileRelateService fileRelateService;
 
     @Autowired
     private UtilsClientImpl utilsClient;
@@ -130,4 +136,80 @@
         }
     }
 
+    /**
+     * web端上传附件,保存附件信息和业务关系
+     * @param file 附件
+     * @param ownerId 所属业务编号
+     * @param ownerType 所属业务名称
+     * @param fileCount 第几份附件
+     * @param uploaderDTO 上传人信息
+     * @return
+     */
+    public FileInfo webPploadFile(MultipartFile file, String ownerId, String ownerType, int fileCount, UploaderDTO uploaderDTO) {
+        try {
+            String fileId = utilsClient.getNewTimeId();
+            // 创建附件信息
+            FileInfo fileInfo = new FtpMultipartFileWrapper(file).toWebFileInfo(fileId);
+            // 上传到ftp服务器
+            FtpUtils ftpUtils = new FtpUtils();
+            ftpUtils.upload(fileInfo.getPath(), fileInfo.getFileName(), file.getInputStream());
+            // 保存附件信息
+            fileInfo.setName(FileOwnerTypeBaseEnum.getDes(ownerType) + BaseConsts.UNDER + fileCount);
+            fileInfo.setOwnerId(ownerId);
+            fileInfo.setOwnerCat(FileOwnerTypeBaseEnum.getCat(ownerType));
+            fileInfo.setOwnerCatName(FileOwnerTypeBaseEnum.getDes(fileInfo.getOwnerCat()));
+            fileInfo.setOwnerType(ownerType);
+            fileInfo.setOwnerTypeName(FileOwnerTypeBaseEnum.getDes(ownerType));
+            fileInfo.setUploaderId(uploaderDTO.getUploaderId());
+            fileInfo.setUploaderName(uploaderDTO.getUploaderName());
+            fileInfo.setUploaderType(uploaderDTO.getUploaderType());
+            fileInfo.setCustId(uploaderDTO.getCustId());
+            mapper.insert(fileInfo);
+            // 保存业务关系
+            fileRelateService.saveByFileInfo(fileInfo);
+            return fileInfo;
+        } catch (Exception e) {
+            log.error("service方法[FileInfoService.uploadFile]调用失败,异常信息:"+e, e);
+            throw new ServiceException("FileInfoService.uploadFile", e);
+        }
+    }
+
+    /**
+     * wechat端上传附件,保存附件信息和业务关系
+     * @param file 附件
+     * @param ownerId 所属业务编号
+     * @param ownerType 所属业务名称
+     * @param fileCount 第几份附件
+     * @param uploaderDTO 上传人信息
+     * @return
+     */
+    public FileInfo wechatPploadFile(MultipartFile file, String ownerId, String ownerType, int fileCount, UploaderDTO uploaderDTO) {
+        try {
+            String fileId = utilsClient.getNewTimeId();
+            // 创建附件信息
+            FileInfo fileInfo = new FtpMultipartFileWrapper(file).toWechatFileInfo(fileId);
+            // 上传到ftp服务器
+            FtpUtils ftpUtils = new FtpUtils();
+            ftpUtils.upload(fileInfo.getPath(), fileInfo.getFileName(), file.getInputStream());
+            // 保存附件信息
+            fileInfo.setName(FileOwnerTypeBaseEnum.getDes(ownerType) + BaseConsts.UNDER + fileCount);
+            fileInfo.setOwnerId(ownerId);
+            fileInfo.setOwnerCat(FileOwnerTypeBaseEnum.getCat(ownerType));
+            fileInfo.setOwnerCatName(FileOwnerTypeBaseEnum.getDes(fileInfo.getOwnerCat()));
+            fileInfo.setOwnerType(ownerType);
+            fileInfo.setOwnerTypeName(FileOwnerTypeBaseEnum.getDes(ownerType));
+            fileInfo.setUploaderId(uploaderDTO.getUploaderId());
+            fileInfo.setUploaderName(uploaderDTO.getUploaderName());
+            fileInfo.setUploaderType(uploaderDTO.getUploaderType());
+            fileInfo.setCustId(uploaderDTO.getCustId());
+            mapper.insert(fileInfo);
+            // 保存业务关系
+            fileRelateService.saveByFileInfo(fileInfo);
+            return fileInfo;
+        } catch (Exception e) {
+            log.error("service方法[FileInfoService.uploadFile]调用失败,异常信息:"+e, e);
+            throw new ServiceException("FileInfoService.uploadFile", e);
+        }
+    }
+
 }
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileRelateService.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileRelateService.java
index 0bf31e4..50aea52 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileRelateService.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/service/FileRelateService.java
@@ -5,7 +5,10 @@
 import cn.huge.base.common.utils.IdUtils;
 import cn.huge.module.client.api.impl.UtilsClientImpl;
 import cn.huge.module.file.dao.mapper.FileRelateMapper;
+import cn.huge.module.file.domain.dto.UploaderDTO;
+import cn.huge.module.file.domain.po.FileInfo;
 import cn.huge.module.file.domain.po.FileRelate;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -130,4 +133,43 @@
         }
     }
 
+    /**
+     * 根据所属业务编号和类型统计
+     * @param ownerId 所属业务编号
+     * @param ownerType 所属业务类型
+     * @return int 统计数
+     */
+    public int countByOwnerIdAndType(String ownerId, String ownerType){
+        QueryWrapper<FileRelate> fileRelateQueryWrapper = new QueryWrapper<>();
+        fileRelateQueryWrapper.eq("owner_id", ownerId).eq("owner_type", ownerType);
+        return mapper.selectCount(fileRelateQueryWrapper);
+    }
+
+    /**
+     * 根据附件信息新增附件业务关系
+     * @param fileInfo 附件信息
+     */
+    public void saveByFileInfo(FileInfo fileInfo) {
+        try {
+            // 保存业务关系
+            FileRelate fileRelate = new FileRelate();
+            fileRelate.setId(utilsClient.getNewTimeId());
+            fileRelate.setFileId(fileInfo.getId());
+            fileRelate.setOwnerId(fileInfo.getOwnerId());
+            fileRelate.setOwnerCat(fileInfo.getOwnerCat());
+            fileRelate.setOwnerType(fileInfo.getOwnerType());
+            fileRelate.setUploaderId(fileInfo.getUploaderId());
+            fileRelate.setUploaderName(fileInfo.getUploaderName());
+            fileRelate.setUploaderType(fileInfo.getUploaderType());
+            fileRelate.setCustId(fileInfo.getCustId());
+            Date nowDate = DateUtils.getNowDate();
+            fileRelate.setCreateTime(nowDate);
+            fileRelate.setUpdateTime(nowDate);
+            mapper.insert(fileRelate);
+        } catch (Exception e) {
+            log.error("service方法[FileRelateService.uploadFile]调用异常:"+e, e);
+            throw new ServiceException("FileRelateService.uploadFile", e);
+        }
+    }
+
 }
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FileUtils.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FileUtils.java
new file mode 100644
index 0000000..e8bdc50
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FileUtils.java
@@ -0,0 +1,40 @@
+package cn.huge.module.file.utils;
+
+
+import cn.huge.base.common.constant.FileConsts;
+
+/**
+ * @author liyj
+ */
+public class FileUtils {
+
+    /**
+     * 校验文件格式
+     *
+     * @param fileSuffix
+     * @return
+     */
+    public static Boolean checkFileSuffix(String fileSuffix){
+        if(FileConsts._doc.equalsIgnoreCase(fileSuffix) || FileConsts._docx.equalsIgnoreCase(fileSuffix) ||
+                FileConsts._jpeg.equalsIgnoreCase(fileSuffix) || FileConsts._jpg.equalsIgnoreCase(fileSuffix) || FileConsts._png.equalsIgnoreCase(fileSuffix) || FileConsts._bmp.equalsIgnoreCase(fileSuffix) ||
+                FileConsts._pdf.equalsIgnoreCase(fileSuffix) || FileConsts._mp4.equalsIgnoreCase(fileSuffix) || FileConsts._mp3.equalsIgnoreCase(fileSuffix) || FileConsts._avi.equalsIgnoreCase(fileSuffix)
+                || FileConsts._xlsx.equalsIgnoreCase(fileSuffix)){
+            return true;
+        }else {
+            return false;
+        }
+        // 不做限制
+//        return true;
+    }
+
+    public static Boolean checkImageSuffix(String fileSuffix){
+        if(FileConsts._jpeg.equalsIgnoreCase(fileSuffix) || FileConsts._jpg.equalsIgnoreCase(fileSuffix) ||
+                FileConsts._png.equalsIgnoreCase(fileSuffix) || FileConsts._bmp.equalsIgnoreCase(fileSuffix) ||
+                FileConsts._gif.equalsIgnoreCase(fileSuffix)){
+            return true;
+        }else {
+            return false;
+        }
+    }
+
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpMultipartFileWrapper.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpMultipartFileWrapper.java
new file mode 100644
index 0000000..b405487
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpMultipartFileWrapper.java
@@ -0,0 +1,184 @@
+package cn.huge.module.file.utils;
+
+import cn.huge.base.common.constant.FileCatEnum;
+import cn.huge.base.common.exception.ServiceException;
+import cn.huge.base.common.utils.DateUtils;
+import cn.huge.module.constant.BaseConsts;
+import cn.huge.module.file.config.FtpFileConfig;
+import cn.huge.module.file.domain.po.FileInfo;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @title: 上传附件包装处理类
+ * @description: 上传附件包装处理类
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+public class FtpMultipartFileWrapper {
+
+    static final long kilobyte = 1024;
+    static final long megabyte = 1024 * 1024L;
+    static final long gigabyte = 1024 * 1024 * 1024L;
+
+    static final BigDecimal kilobyteDividend = new BigDecimal(kilobyte);
+    static final BigDecimal megabyteDividend = new BigDecimal(megabyte);
+    static final BigDecimal gigabyteDividend = new BigDecimal(gigabyte);
+
+    static final String SHOW_URL_WEB = "/api/web/fileInfo/show";
+    static final String DOWN_URL_WEB = "/api/web/fileInfo/down";
+    static final String SHOW_URL_WECHAT = "/api/wechat/fileInfo/show";
+    static final String DOWN_URL_WECHAT = "/api/wechat/fileInfo/down";
+
+    static final String STORE_WAY = "ftp";
+
+    private MultipartFile file;
+
+    public FtpMultipartFileWrapper(MultipartFile file) {
+        this.file = file;
+    }
+
+    /**
+     * web端上传附件
+     * @param fileId
+     * @return
+     */
+    public FileInfo toWebFileInfo(String fileId) {
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setId(fileId);
+        fileInfo.setSuffix(this.getFileSuffix());
+        fileInfo.setTrueName(this.getFileName() + BaseConsts.DOT + fileInfo.getSuffix());
+        fileInfo.setFileName(this.getFileName() + BaseConsts.UNDER + fileInfo.getId() + BaseConsts.DOT + fileInfo.getSuffix());
+        fileInfo.setCat(FileCatEnum.getFileCat(fileInfo.getSuffix()));
+        fileInfo.setSize(this.getFileSize());
+        fileInfo.setUnit(this.getFileUnit());
+        fileInfo.setMd5Code(this.getFileVerifyCode());
+        fileInfo.setStoreWay(STORE_WAY);
+        fileInfo.setPath(this.getFileDir());
+        fileInfo.setFullPath(fileInfo.getPath() + BaseConsts.SLANT + fileInfo.getFileName());
+        fileInfo.setShowUrl(SHOW_URL_WEB + BaseConsts.SLANT + fileInfo.getId());
+        fileInfo.setDownUrl(DOWN_URL_WEB + BaseConsts.SLANT + fileInfo.getId());
+        // todo
+        fileInfo.setZipUrl(fileInfo.getShowUrl());
+        Date nowDate = DateUtils.getNowDate();
+        fileInfo.setCreateTime(nowDate);
+        fileInfo.setUpdateTime(nowDate);
+        fileInfo.setDeleteStatus(BaseConsts.DELETE_STATUS_1);
+        return fileInfo;
+    }
+
+    /**
+     * wechat上传附件
+     * @param fileId
+     * @return
+     */
+    public FileInfo toWechatFileInfo(String fileId) {
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setId(fileId);
+        fileInfo.setSuffix(this.getFileSuffix());
+        fileInfo.setTrueName(this.getFileName() + BaseConsts.DOT + fileInfo.getSuffix());
+        fileInfo.setFileName(this.getFileName() + BaseConsts.UNDER + fileInfo.getId() + BaseConsts.DOT + fileInfo.getSuffix());
+        fileInfo.setCat(FileCatEnum.getFileCat(fileInfo.getSuffix()));
+        fileInfo.setSize(this.getFileSize());
+        fileInfo.setUnit(this.getFileUnit());
+        fileInfo.setMd5Code(this.getFileVerifyCode());
+        fileInfo.setStoreWay(STORE_WAY);
+        fileInfo.setPath(this.getFileDir());
+        fileInfo.setFullPath(fileInfo.getPath() + BaseConsts.SLANT + fileInfo.getFileName());
+        fileInfo.setShowUrl(SHOW_URL_WECHAT + BaseConsts.SLANT + fileInfo.getId());
+        fileInfo.setDownUrl(DOWN_URL_WECHAT + BaseConsts.SLANT + fileInfo.getId());
+        // todo
+        fileInfo.setZipUrl(fileInfo.getShowUrl());
+        Date nowDate = DateUtils.getNowDate();
+        fileInfo.setCreateTime(nowDate);
+        fileInfo.setUpdateTime(nowDate);
+        fileInfo.setDeleteStatus(BaseConsts.DELETE_STATUS_1);
+        return fileInfo;
+    }
+
+    /**
+     * 获取文件名称
+     */
+    public String getFileName() {
+        return StringUtils.substringBeforeLast(this.file.getOriginalFilename(), BaseConsts.DOT);
+    }
+
+    /**
+     * 获取文件后缀
+     */
+    public String getFileSuffix() {
+        return StringUtils.substringAfterLast(this.file.getOriginalFilename(), BaseConsts.DOT);
+    }
+
+    /**
+     * 获取文件存储目录,以斜杠开头(/home/ftp/huge-dyh/2022/3)
+     */
+    public String getFileDir() {
+        //按照年月构建目录
+        Calendar ca = Calendar.getInstance();
+        StringBuilder builder = new StringBuilder();
+        builder.append(FtpFileConfig.getRootdir());
+        builder.append(BaseConsts.SLANT);
+        builder.append(ca.get(Calendar.YEAR));
+        builder.append(BaseConsts.SLANT);
+        builder.append(ca.get(Calendar.MONTH) + 1);
+        return builder.toString();
+    }
+
+    /**
+     * 获取文件大小, 根据不同的单位进行运算
+     */
+    public double getFileSize() {
+        long size = this.file.getSize();
+        BigDecimal divisor = new BigDecimal(size);
+        String unit = this.getFileUnit();
+
+        if (BaseConsts.B.equals(unit)) {
+            return size;
+        } else if (BaseConsts.KB.equals(unit)) {
+            return divisor.divide(kilobyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
+        } else if (BaseConsts.MB.equals(unit)) {
+            return divisor.divide(megabyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
+        } else if (BaseConsts.GB.equals(unit)) {
+            return divisor.divide(gigabyteDividend, 2, RoundingMode.HALF_UP).doubleValue();
+        }
+        return 0.0;
+    }
+
+    /**
+     * 获取文件单位, B|KB|MB|GB
+     */
+    public String getFileUnit() {
+        long size = this.file.getSize();
+        if (size > 0 && size <= kilobyte) {
+            return BaseConsts.B;
+        } else if (size > kilobyte && size <= megabyte) {
+            return BaseConsts.KB;
+        } else if (size > megabyte && size <= gigabyte) {
+            return BaseConsts.MB;
+        } else if (size > gigabyte) {
+            return BaseConsts.GB;
+        }
+        return BaseConsts.B;
+    }
+
+    /**
+     * 获取文件校验码, MD5
+     */
+    public String getFileVerifyCode() {
+        try {
+            return DigestUtils.md5Hex(this.file.getBytes());
+        } catch (IOException e) {
+            throw new ServiceException("MultipartFileWrapper.getFileVerifyCode", e);
+        }
+    }
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpUtils.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpUtils.java
new file mode 100644
index 0000000..30c5e01
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/utils/FtpUtils.java
@@ -0,0 +1,256 @@
+package cn.huge.module.file.utils;
+
+import cn.huge.base.common.exception.MethodException;
+import cn.huge.module.constant.BaseConsts;
+import cn.huge.module.file.config.FtpFileConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPClientConfig;
+import org.apache.commons.net.ftp.FTPReply;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @title: ftp配工具类
+ * @description: ftp配工具类
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+@Slf4j
+@Component
+public class FtpUtils {
+
+    /**
+     * 上传附件.
+     * @param path 服务器存储路径(/home/ftp/huge-dyh)
+     * @param fileName 文件名(1.jpg)
+     * @param inputStream 文件流
+     */
+    public void upload(String path, String fileName, InputStream inputStream) {
+        FTPClient ftpClient = new FTPClient();
+        try {
+            if (connect(ftpClient)) {
+                // 检查文件目录是否存在,不存在创建目录
+                if (this.checkDir(ftpClient, path)) {
+                    // 检查是否上传成功
+                    if (storeFile(ftpClient, fileName, inputStream)) {
+                        disconnect(ftpClient);
+                    }else{
+                        disconnect(ftpClient);
+                        throw new MethodException("连接ftp成功,上传文件失败!");
+                    }
+                }else{
+                    disconnect(ftpClient);
+                    throw new MethodException("连接ftp成功,检查文件目录不存在!");
+                }
+            }else{
+                disconnect(ftpClient);
+                throw new MethodException("连接ftp失败!");
+            }
+        } catch (Exception e) {
+            disconnect(ftpClient);
+            log.error("方法[FtpUtils.upload]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.upload", e);
+        }
+    }
+
+    /**
+     * 从文件服务器获取文件流.
+     * @param filePath 文件存储完整路径(/home/ftp/huge-dyh/1.jpg)
+     * @return {@link InputStream}
+     * @throws IOException
+     */
+    public InputStream retrieveFileStream(String filePath) {
+        if (StringUtils.isBlank(filePath)) {
+            throw new MethodException("文件路径为空!");
+        }
+        log.info("读取文件路径[filePath]值" + filePath);
+        FTPClient ftpClient = new FTPClient();
+        try {
+            if (connect(ftpClient)) {
+                filePath = new String(filePath.getBytes("UTF-8"), "iso-8859-1");
+                InputStream inputStream = ftpClient.retrieveFileStream(filePath);
+                disconnect(ftpClient);
+                return inputStream;
+            }else{
+                disconnect(ftpClient);
+                throw new MethodException("连接ftp失败!");
+            }
+        } catch (Exception e) {
+            disconnect(ftpClient);
+            log.error("方法[FtpUtils.retrieveFileStream]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.retrieveFileStream", e);
+        }
+    }
+
+    /**
+     * 删除文件
+     * @param filePath 文件存储完整路径(/home/ftp/huge-dyh/1.jpg)
+     */
+    public void deleteFile(String filePath) {
+        try{
+            String workingPath = filePath.substring(0, filePath.lastIndexOf("/"));
+            String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+            deleteFile(workingPath, fileName);
+        }catch (Exception e){
+            log.error("方法[FtpUtils.deleteFile]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.deleteFile", e);
+        }
+    }
+
+    /**
+     * ftp操作-连接ftp
+     * @param ftpClient ftp工具
+     * @return boolean
+     */
+    private boolean connect(FTPClient ftpClient) {
+        boolean flag = false;
+        try {
+            // 远程ftp需要加上,允许被动连接
+            ftpClient.enterLocalPassiveMode();
+            FTPClientConfig clientConfig = new FTPClientConfig();
+            clientConfig.setLenientFutureDates(true);
+            ftpClient.configure(clientConfig);
+            // 连接ftp
+            ftpClient.connect(FtpFileConfig.getHostname(), FtpFileConfig.getPort());
+            if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
+                log.info("连接ftp成功!");
+                ftpClient.login(FtpFileConfig.getUsername(), FtpFileConfig.getPassword());
+                if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
+                    // 设置以二进制方式传输
+                    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
+                    // 设置UTF-8编码
+                    ftpClient.setControlEncoding("UTF-8");
+                    //设置传输方式为流方式
+                    ftpClient.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE);
+                    // 设置缓冲区大小
+                    ftpClient.setBufferSize(1024);
+                    log.info("登录ftp成功!");
+                    flag = true;
+                } else {
+                    log.error("登录ftp失败,可能用户名或密码错误!");
+                }
+            }else{
+                log.error("连接ftp失败,可能ip或端口错误!");
+            }
+            return flag;
+        } catch (IOException e) {
+            log.error("方法[FtpUtils.connect]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.connect", e);
+        }
+    }
+
+    /**
+     * ftp操作-检查文件目录不存在时,创建目录
+     * @param ftpClient ftp工具
+     * @param path 服务器存储路径(/home/ftp/huge-dyh)
+     * @return String
+     */
+    public Boolean checkDir(FTPClient ftpClient, String path){
+        try{
+            log.info("上传路径为:" + path);
+            Boolean flag = false;
+            if (!ftpClient.changeWorkingDirectory(path)) {
+                StringBuffer rootPath = new StringBuffer();
+                rootPath.append(FtpFileConfig.getRootdir());
+                // 创建文件目录
+                path = path.replace(FtpFileConfig.getRootdir() + BaseConsts.SLANT, "");
+                String[] paths = path.split(BaseConsts.SLANT);
+                for (String filePath: paths){
+                    if (StringUtils.isBlank(filePath)){
+                        continue;
+                    }else{
+                        rootPath.append(BaseConsts.SLANT);
+                        rootPath.append(filePath);
+                        if (!ftpClient.changeWorkingDirectory(rootPath.toString())){
+                            ftpClient.makeDirectory(rootPath.toString());
+                        }
+                    }
+                }
+                // 严谨一点,再检查文件目录是否存在
+                if (ftpClient.changeWorkingDirectory(rootPath.toString())) {
+                    flag = true;
+                }
+            }else{
+                flag = true;
+            }
+            return flag;
+        }catch (Exception e){
+            log.error("方法[FtpUtils.makeDir]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.makeDir", e);
+        }
+    }
+
+    /**
+     * ftp操作-上传文件到ftp
+     * @param ftpClient ftp工具
+     * @param fileName 文件名称(1.jpg)
+     * @param fileInputStream 文件流
+     * @return boolean
+     */
+    private boolean storeFile(FTPClient ftpClient, String fileName, InputStream fileInputStream) {
+        boolean flag = false;
+        try {
+            fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
+            log.info("上传文件名为:" + fileName);
+            ftpClient.storeFile(fileName, fileInputStream);
+            int reply = ftpClient.getReplyCode();
+            if (FTPReply.isPositiveCompletion(reply)) {
+                flag = true;
+                log.info("上传文件成功!");
+            }else{
+                log.error("上传文件失败!请求响应码[reply]值为:" + reply);
+            }
+            fileInputStream.close();
+            return flag;
+        } catch (IOException e) {
+            log.error("方法[FtpUtils.storeFile]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.storeFile", e);
+        }
+    }
+
+    /**
+     * ftp操作-删除附件.
+     * @param path 服务器存储路径(/home/ftp/huge-dyh)
+     * @param fileName 附件名称(1.jpg)
+     */
+    public void deleteFile(String path, String fileName) {
+        FTPClient ftpClient = new FTPClient();
+        try{
+            connect(ftpClient);
+            if (ftpClient.changeWorkingDirectory(path)) {
+                // 删除文件
+                ftpClient.dele(fileName);
+                disconnect(ftpClient);
+            }else {
+                disconnect(ftpClient);
+                throw new MethodException("文件路径不存在!");
+            }
+        }catch (Exception e){
+            disconnect(ftpClient);
+            log.error("方法[FtpUtils.deleteFile]调用异常:"+e, e);
+            throw new MethodException("FtpUtils.deleteFile", e);
+        }
+    }
+
+    /**
+     * ftp操作-断开ftp连接.
+     * @param ftpClient ftp工具
+     */
+    private void disconnect(FTPClient ftpClient) {
+        if (ftpClient.isConnected()) {
+            try {
+                ftpClient.disconnect();
+            } catch (IOException e) {
+                log.error("方法[FtpUtils.disconnect]调用异常:"+e, e);
+                throw new MethodException("FtpUtils.disconnect", e);
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/dyh-service/dyh-sys/src/main/resources/config/application.yml b/dyh-service/dyh-sys/src/main/resources/config/application.yml
index a05e20b..1f89e91 100644
--- a/dyh-service/dyh-sys/src/main/resources/config/application.yml
+++ b/dyh-service/dyh-sys/src/main/resources/config/application.yml
@@ -60,13 +60,4 @@
         logic-delete-value: 1
         #字段策略,IGNORED:忽略判断,NOT_NULL:非null判断,NOT_EMPTY:非空判断,DEFAULT:默认,NEVER:不加入sql
         update-strategy: IGNORED
-  mapper-locations: classpath*:/cn/huge/*/*/dao/mapper/xml/*Mapper.xml
-
-#附件配置
-file:
-  #存储方式
-  store-way: ftp
-  #查看地址
-  show-path: /api/fileInfo/show
-  #下载地址
-  down-path: /api/fileInfo/down
\ No newline at end of file
+  mapper-locations: classpath*:/cn/huge/*/*/dao/mapper/xml/*Mapper.xml
\ No newline at end of file

--
Gitblit v1.8.0