Sfoglia il codice sorgente

联想基金会v1.0

wzy 1 mese fa
parent
commit
9d1ab80b91

+ 63 - 0
mjava-lianxiang/src/main/java/com/malk/lianxiang/controller/LianxiangController.java

@@ -0,0 +1,63 @@
+package com.malk.lianxiang.controller;
+
+import com.malk.lianxiang.service.LianxiangService;
+import com.malk.server.common.McR;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import java.util.Objects;
+
+@RestController
+@RequestMapping
+public class LianxiangController {
+
+    @Autowired
+    private LianxiangService lianxiangService;
+
+    /**
+     * 项目立项
+     * @param map
+     * @return
+     */
+    @PostMapping("/projectInitiation")
+    public McR uploadFiles(@RequestBody Map<String,Object> map){
+        if (Objects.nonNull(map.get("formInstId"))){
+            String formInstId = map.get("formInstId").toString();
+            return lianxiangService.projectInitiation(formInstId);
+        }
+        return McR.errorParam("实例id不能为空!");
+    }
+
+    /**
+     * 项目文档上传
+     * @param map
+     * @return
+     */
+    @PostMapping("/uploadProjectFiles")
+    public McR uploadProjectFiles(@RequestBody Map<String,Object> map){
+        if (Objects.nonNull(map.get("formInstId")) && Objects.nonNull(map.get("type"))){
+            String formInstId = map.get("formInstId").toString();
+            String type = map.get("type").toString();
+            return lianxiangService.uploadProjectFiles(formInstId,type);
+        }
+        return McR.errorParam("实例id不能为空!");
+    }
+
+    /**
+     * 项目立项变更
+     * @param map
+     * @return
+     */
+    @PostMapping("/projectInitiationChange")
+    public McR projectInitiationChange(@RequestBody Map<String,Object> map){
+        if (Objects.nonNull(map.get("formInstId"))){
+            String formInstId = map.get("formInstId").toString();
+            return lianxiangService.projectInitiationChange(formInstId);
+        }
+        return McR.errorParam("实例id不能为空!");
+    }
+}

+ 11 - 0
mjava-lianxiang/src/main/java/com/malk/lianxiang/service/LianxiangService.java

@@ -0,0 +1,11 @@
+package com.malk.lianxiang.service;
+
+import com.malk.server.common.McR;
+
+public interface LianxiangService {
+    McR projectInitiation(String formInstId);
+
+    McR uploadProjectFiles(String formInstId, String type);
+
+    McR projectInitiationChange(String formInstId);
+}

+ 464 - 0
mjava-lianxiang/src/main/java/com/malk/lianxiang/service/impl/LianxiangServiceImpl.java

@@ -0,0 +1,464 @@
+package com.malk.lianxiang.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.malk.lianxiang.service.LianxiangService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.utils.UtilHttp;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
+
+@Slf4j
+@Service
+public class LianxiangServiceImpl implements LianxiangService {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private YDConf ydConf;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDConf ddConf;
+
+    @Value(value = "${dingtalk.unionId}")
+    private String unionId;
+
+    @Value(value = "${dingtalk.spaceId}")
+    private String spaceId;
+
+    @Value(value = "${saveFile.path}")
+    private String saveFilePath;
+
+    @Value(value = "${dingtalk.partnersDentryId}")
+    private String partnersDentryId;
+
+    @Value(value = "${dingtalk.unrestrictedDonationDentryId}")
+    private String unrestrictedDonationDentryId;
+
+    //key:项目文档类型  valueIndex:0:附件字段,1:标题字段, 2:项目名称字段
+    private static final Map<String,List<String>> DOCUMENT_TYPE = new HashMap<>();
+    
+    static {
+        DOCUMENT_TYPE.put("立项文件", Arrays.asList("attachmentField_m8pm41hk","textField_m8pm41gx"));
+
+        DOCUMENT_TYPE.put("项目产出成果文件", Arrays.asList("attachmentField_m8s488ko","textField_m9ko40z1","selectField_m8s3yt3o"));
+        DOCUMENT_TYPE.put("三方比价单文件", Arrays.asList("attachmentField_m8s4ejmk","textField_m9ko40z1","textField_m8s518bj"));
+        DOCUMENT_TYPE.put("合同文件", Arrays.asList("attachmentField_m9ko7k03","textField_m8s4w6yb","textField_m988ws0i"));
+        DOCUMENT_TYPE.put("捐赠发票文件", Arrays.asList("attachmentField_m9c3dzgx","textField_m9ko40z1","textField_m9kqf27r"));
+        DOCUMENT_TYPE.put("用印申报文件", Arrays.asList("attachmentField_m9koc6zh","textField_m9ko40z1","textField_m9kqxytx"));
+
+        DOCUMENT_TYPE.put("资助人费用登记文件", Arrays.asList("attachmentField_m9kszuos","textField_m9ko40z1"));
+        DOCUMENT_TYPE.put("合作伙伴文件", Arrays.asList("attachmentField_m8plqur3","textField_m9b1hlci"));
+    }
+
+    //钉盘提交文件文件名称冲突策略
+    private static final Map<String,String> CONFLICT_STRATEGY = new HashMap<>();
+
+    static {
+        CONFLICT_STRATEGY.put("自动重命名","AUTO_RENAME");
+        CONFLICT_STRATEGY.put("覆盖","OVERWRITE");
+        CONFLICT_STRATEGY.put("返回已存在文件","RETURN_DENTRY_IF_EXISTS");
+        CONFLICT_STRATEGY.put("文件已存在时报错","RETURN_ERROR_IF_EXISTS");
+    }
+
+    @Override
+    public McR projectInitiation(String formInstId) {
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        //1.创建项目名称文件夹
+        String projectName = formData.get("textField_m8pm41gx").toString();
+        Map dentry = createFolder(spaceId, "0", projectName, unionId);
+
+        String folderId = dentry.get("id").toString();
+
+        //2。创建项目各文档文件夹
+        String projectInitiationFolderUuid = "";
+        for (String documentType : DOCUMENT_TYPE.keySet()) {
+            if (documentType.equals("合作伙伴文件") || documentType.equals("资助人费用登记文件")){
+                continue;
+            }
+            Map dentry2 = createFolder(spaceId, folderId, documentType, unionId);
+            if(documentType.equals("立项文件")){
+                projectInitiationFolderUuid = dentry2.get("uuid").toString();
+            }
+        }
+
+        if (Objects.nonNull(formData.get("attachmentField_m8pm41hk"))){
+            List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(formData.get("attachmentField_m8pm41hk")));
+            for (Map file : fileList) {
+                String ydDownloadUrl = file.get("downloadUrl").toString();
+                String fileName = file.get("name").toString();
+
+                //将downloadurl下载到本地
+                try {
+                    downloadYdFile(ydDownloadUrl, saveFilePath + fileName);
+                    System.out.println("文件下载成功!");
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+
+                //上传至钉盘-项目文件夹-立项文件
+                uploadToDingTalk(saveFilePath + fileName ,projectInitiationFolderUuid,CONFLICT_STRATEGY.get("覆盖"));
+            }
+        }
+        return McR.success();
+    }
+
+    @Override
+    public McR uploadProjectFiles(String formInstId, String type) {
+        List<String> fieldList = DOCUMENT_TYPE.get(type);
+
+        if (Objects.nonNull(fieldList) && !fieldList.isEmpty()){
+            Map formData = ydClient.queryData(YDParam.builder()
+                    .formInstId(formInstId)
+                    .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+            String fileField = fieldList.get(0);//附件字段id
+            String title = formData.get(fieldList.get(1)).toString();//数据标题
+
+            if (Objects.nonNull(formData.get(fileField))){
+                String uploadFolderUuid = "";
+
+                List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(formData.get(fileField)));
+                for (Map file : fileList) {
+                    String ydDownloadUrl = file.get("downloadUrl").toString();
+                    String fileName = file.get("name").toString();
+
+                    //将downloadurl下载到本地
+                    try {
+                        downloadYdFile(ydDownloadUrl, saveFilePath + fileName);
+                        System.out.println("文件下载成功!");
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+
+                    if (type.equals("合作伙伴文件")){
+                        if (Strings.isBlank(uploadFolderUuid)){
+                            //查询标题文件夹是否存在
+                            Map titleFolder = getDentryList(spaceId, partnersDentryId, unionId, "").stream()
+                                    .filter(map -> map.get("name").toString().equals(title) && map.get("type").toString().equals("FOLDER"))
+                                    .findFirst()
+                                    .orElse(null);
+
+                            if (Objects.nonNull(titleFolder)){
+                                uploadFolderUuid = titleFolder.get("uuid").toString();
+                            }else {
+                                //创建该数据标题文件夹
+                                Map dentry = createFolder(spaceId, partnersDentryId, title, unionId);
+
+                                uploadFolderUuid = dentry.get("uuid").toString();
+                            }
+                        }
+
+                        //上传至钉盘-宜搭文件库-合作伙伴文件夹-标题文件夹
+                        uploadToDingTalk(saveFilePath + fileName ,uploadFolderUuid,CONFLICT_STRATEGY.get("覆盖"));
+                    }else if (type.equals("资助人费用登记文件")){
+                        if (Strings.isBlank(uploadFolderUuid)){
+                            //查询标题文件夹是否存在
+                            Map titleFolder = getDentryList(spaceId, unrestrictedDonationDentryId, unionId, "").stream()
+                                    .filter(map -> map.get("name").toString().equals(title) && map.get("type").toString().equals("FOLDER"))
+                                    .findFirst()
+                                    .orElse(null);
+
+                            if (Objects.nonNull(titleFolder)){
+                                uploadFolderUuid = titleFolder.get("uuid").toString();
+                            }else {
+                                //创建该数据标题文件夹
+                                Map dentry = createFolder(spaceId, unrestrictedDonationDentryId, title, unionId);
+
+                                uploadFolderUuid = dentry.get("uuid").toString();
+                            }
+                        }
+
+                        //上传至钉盘-宜搭文件库-资助人费用登记文件-标题文件夹
+                        uploadToDingTalk(saveFilePath + fileName ,uploadFolderUuid,CONFLICT_STRATEGY.get("覆盖"));
+                    }else {
+                        if (Strings.isBlank(uploadFolderUuid)){
+                            //项目文件名称
+                            String projectName = formData.get(fieldList.get(2)).toString();
+
+                            //查询项目文件夹信息
+                            Map projectFolder = getDentryList(spaceId, "0", unionId, "").stream()
+                                    .filter(map -> map.get("name").toString().equals(projectName) && map.get("type").toString().equals("FOLDER"))
+                                    .findFirst()
+                                    .orElse(null);
+
+                            if (Objects.nonNull(projectFolder)){
+                                String projectFolderId = projectFolder.get("id").toString();
+
+                                //查询项目文件夹下对应文档文件夹
+                                Map documentFolder = getDentryList(spaceId, projectFolderId, unionId, "").stream()
+                                        .filter(map -> map.get("name").toString().equals(type) && map.get("type").toString().equals("FOLDER"))
+                                        .findFirst()
+                                        .orElse(null);
+
+                                if (Objects.nonNull(documentFolder)){
+                                    //文档文件夹id
+                                    String documentFolderId = documentFolder.get("id").toString();
+                                    //查询标题文件夹是否存在
+                                    Map titleFolder = getDentryList(spaceId, documentFolderId, unionId, "").stream()
+                                            .filter(map -> map.get("name").toString().equals(title) && map.get("type").toString().equals("FOLDER"))
+                                            .findFirst()
+                                            .orElse(null);
+
+                                    if (Objects.nonNull(titleFolder)){
+                                        uploadFolderUuid = titleFolder.get("uuid").toString();
+                                    }else {
+                                        //创建该数据标题文件夹
+                                        Map dentry = createFolder(spaceId, documentFolderId, title, unionId);
+
+                                        uploadFolderUuid = dentry.get("uuid").toString();
+                                    }
+                                }else {
+                                    return McR.errorUnknown("未找到该文档文件夹!");
+                                }
+                            }else {
+                                return McR.errorParam("未找到该文档所属项目!");
+                            }
+                        }
+
+                        //上传至钉盘-宜搭文件库-项目文件夹-项目对应文档文件夹-标题文件夹
+                        uploadToDingTalk(saveFilePath + fileName ,uploadFolderUuid,CONFLICT_STRATEGY.get("覆盖"));
+                    }
+                }
+            }
+        }else {
+            return McR.errorParam("未找到该文档类型!");
+        }
+
+
+        return McR.success();
+    }
+
+    @Override
+    public McR projectInitiationChange(String formInstId) {
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        //1.查询项目名称文件夹
+        String projectName = formData.get("textField_m8pm41gx").toString();
+
+        Map projectFolder = getDentryList(spaceId, "0", unionId, "").stream()
+                .filter(map -> map.get("name").toString().equals(projectName) && map.get("type").toString().equals("FOLDER"))
+                .findFirst()
+                .orElse(null);
+
+        if (Objects.nonNull(projectFolder)){
+            String projectFolderId = projectFolder.get("id").toString();
+
+            //2.查询立项文件文件夹
+            Map projectInitiationFolder = getDentryList(spaceId, projectFolderId, unionId, "").stream()
+                    .filter(map -> map.get("name").toString().equals("立项文件") && map.get("type").toString().equals("FOLDER"))
+                    .findFirst()
+                    .orElse(null);
+
+            if (Objects.nonNull(projectInitiationFolder)){
+                String projectInitiationFolderUuid = projectInitiationFolder.get("uuid").toString();
+
+                //3.提交新立项文件
+                if (Objects.nonNull(formData.get("attachmentField_m8pm41hk"))){
+                    List<Map> fileList = (List<Map>) JSONArray.parse(String.valueOf(formData.get("attachmentField_m8pm41hk")));
+                    for (Map file : fileList) {
+                        String ydDownloadUrl = file.get("downloadUrl").toString();
+                        String fileName = file.get("name").toString();
+
+                        //将downloadurl下载到本地
+                        try {
+                            downloadYdFile(ydDownloadUrl, saveFilePath + fileName);
+                            System.out.println("文件下载成功!");
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+
+                        //上传至钉盘-项目文件夹-立项文件
+                        uploadToDingTalk(saveFilePath + fileName ,projectInitiationFolderUuid,CONFLICT_STRATEGY.get("自动重命名"));
+                    }
+                }
+            }else {
+                return McR.errorParam("未找到该立项变更原项目立项文件文件夹");
+            }
+        }else {
+            return McR.errorParam("未找到该立项变更原项目文件夹");
+        }
+
+        return McR.success();
+    }
+
+    //递归查询所有文件或文件夹列表
+    private List<Map> getDentryList(String spaceId, String parentId, String unionId, String nextToken) {
+        List<Map> dentryList = new ArrayList<>();
+
+        Map query = new HashMap();
+        query.put("parentId",parentId);
+        query.put("unionId",unionId);
+        query.put("maxResults",50);
+        if (Strings.isNotBlank(nextToken)){
+            query.put("nextToken",nextToken);
+        }
+
+        DDR_New ddrNew = (DDR_New) UtilHttp.doGet("https://api.dingtalk.com/v1.0/storage/spaces/"+spaceId+"/dentries", ddClient.initTokenHeader(), query, DDR_New.class);
+
+        dentryList.addAll(ddrNew.getDentries());
+
+        if (Objects.nonNull(ddrNew.getNextToken())){
+            dentryList.addAll(getDentryList(spaceId, parentId, unionId, ddrNew.getNextToken()));
+        }
+
+        return dentryList;
+    }
+
+    //上传文件至钉盘
+    private Map uploadToDingTalk(String filePath,String parentId,String conflictStrategy) {
+        //获取当前时间戳
+        long beginTimestamp = System.currentTimeMillis();
+        System.out.println("开始上传附件:" + DateUtil.format(new Date(beginTimestamp), "yyyy-MM-dd HH:mm:ss"));
+
+        //文件
+        File file = new File(filePath);
+
+        //获取文件上传信息
+        Map param = new HashMap();
+        param.put("unionId",unionId);
+        Map body = new HashMap();
+        body.put("protocol","HEADER_SIGNATURE");
+        body.put("multipart",false);
+
+        DDR_New ddr = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v1.0/storage/spaces/" + spaceId + "/files/uploadInfos/query", ddConf.initTokenHeader(ddClient.getAccessToken()), param, body, DDR_New.class);
+        String uploadKey = ddr.getUploadKey();
+        Map headerSignatureInfo = ddr.getHeaderSignatureInfo();
+        Map<String,String> headers = (Map<String,String>) headerSignatureInfo.get("headers");
+        List<String> resourceUrls = (List<String>) headerSignatureInfo.get("resourceUrls");
+        String resourceUrl = resourceUrls.get(0);
+
+        Map dentry = new HashMap();
+        //使用OSS的header加签方式上传文件
+        try {
+            URL url = new URL(resourceUrl);
+            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+            if (headers != null) {
+                for (Map.Entry<String, String> entry : headers.entrySet()) {
+                    connection.setRequestProperty(entry.getKey(), entry.getValue());
+                }
+            }
+            connection.setDoOutput(true);
+            connection.setRequestMethod("PUT");
+            connection.setUseCaches(false);
+            connection.setReadTimeout(10000);
+            connection.setConnectTimeout(10000);
+            connection.connect();
+            OutputStream out = connection.getOutputStream();
+            InputStream is = new FileInputStream(file);
+            byte[] b =new byte[1024];
+            int temp;
+            while ((temp=is.read(b))!=-1){
+                out.write(b,0,temp);
+            }
+            out.flush();
+            out.close();
+            int responseCode = connection.getResponseCode();
+            connection.disconnect();
+            if (responseCode == 200) {
+                System.out.println("上传成功");
+            } else {
+                System.out.println("上传失败");
+            }
+            //提交文件
+            Map body2 = new HashMap();
+            Map option = new HashMap();
+            option.put("conflictStrategy",conflictStrategy);
+            body2.put("uploadKey",uploadKey);
+            body2.put("name",file.getName());
+            body2.put("option",option);
+            DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://api.dingtalk.com/v2.0/storage/spaces/files/"+parentId+"/commit", ddClient.initTokenHeader(), param, body2, DDR_New.class);
+            dentry = ddrNew.getDentry();
+
+        }catch (IOException e){
+            log.info("上传文件异常:{}",e);
+        }
+
+        long endTimestamp = System.currentTimeMillis();
+        System.out.println("上传文件结束:" + DateUtil.format(new Date(endTimestamp), "yyyy-MM-dd HH:mm:ss"));
+        System.out.println("上传文件耗时:" + (endTimestamp - beginTimestamp)/1000.0 + "s");
+        return dentry;
+    }
+
+    //下载宜搭附件
+    private void downloadYdFile(String fileURL, String savePath) throws IOException {
+        //若是宜搭附件url 则需获得附件临时免登地址
+        fileURL = ydClient.convertTemporaryUrl(fileURL);
+
+        URL url = new URL(fileURL);
+        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+        int responseCode = httpConn.getResponseCode();
+
+        // 检查HTTP响应代码是否为200
+        if (responseCode == HttpURLConnection.HTTP_OK) {
+            InputStream inputStream = httpConn.getInputStream();
+            FileOutputStream outputStream = new FileOutputStream(savePath);
+
+            byte[] buffer = new byte[4096];
+            int bytesRead = -1;
+
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+
+            outputStream.close();
+            inputStream.close();
+        } else {
+            System.out.println("无法下载文件。HTTP响应代码: " + responseCode);
+        }
+        httpConn.disconnect();
+    }
+
+    //创建钉盘文件夹
+    private Map createFolder(String spaceId,String parentId,String folderName,String unionId){
+        String url = "https://api.dingtalk.com/v1.0/storage/spaces/"+spaceId+"/dentries/"+parentId+"/folders?unionId=iPPoZ001WAYlZxyoU04g2bgiEiE";
+
+        Map query = new HashMap();
+        query.put("unionId",unionId);
+
+        Map body = new HashMap();
+        body.put("name",folderName);
+
+        DDR_New ddrNew = (DDR_New) UtilHttp.doPost(url, ddClient.initTokenHeader(), query, body, DDR_New.class);
+
+        Map dentry = ddrNew.getDentry();
+
+        return dentry;
+    }
+
+    //删除钉盘文件夹或文件
+    private void deleteFolder(String spaceId,String dentryId,String unionId){
+        String url = "https://api.dingtalk.com/v1.0/storage/spaces/"+spaceId+"/dentries/"+dentryId;
+
+        Map query = new HashMap();
+        query.put("unionId",unionId);
+        query.put("toRecycleBin",true);
+
+        Map map = (Map) UtilHttp.doDelete(url, ddClient.initTokenHeader(), query, Map.class);
+    }
+
+
+}

+ 8 - 1
mjava-lianxiang/src/main/resources/application-dev.yml

@@ -20,9 +20,16 @@ dingtalk:
   corpId:
   aesKey:
   token:
-  operator: 344749020127590108
+  operator: 1656315499790273 #孙海生
+  unionId: iPPoZ001WAYlZxyoU04g2bgiEiE #孙海生
+  spaceId: 26395140381 #钉盘-团队文件-宜搭文件库
+  partnersDentryId: 176651024213 #钉盘-团队文件-宜搭文件库-合作伙伴文件
+  unrestrictedDonationDentryId: 176648777099 #钉盘-团队文件-宜搭文件库-资助人费用登记文件
 
 aliwork:
   appType: APP_TTZS5KICGVVQNZ3RS8T4
   systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
 
+saveFile:
+  path: d:\\
+

+ 9 - 2
mjava-lianxiang/src/main/resources/application-prod.yml

@@ -10,7 +10,7 @@ logging:
   config: classpath:logback-spring.xml
   path: /home/server/lianxiang/log/
   level:
-    com.malk.*: info
+    com.malk.*: debug
 
 # dingtalk
 dingtalk:
@@ -20,9 +20,16 @@ dingtalk:
   corpId:
   aesKey:
   token:
-  operator: 344749020127590108
+  operator: 1656315499790273 #孙海生
+  unionId: iPPoZ001WAYlZxyoU04g2bgiEiE #孙海生
+  spaceId: 26395140381 #钉盘-团队文件-宜搭文件库
+  partnersDentryId: 176651024213 #钉盘-团队文件-宜搭文件库-合作伙伴文件
+  unrestrictedDonationDentryId: 176648777099 #钉盘-团队文件-宜搭文件库-资助人费用登记文件
 
 aliwork:
   appType: APP_TTZS5KICGVVQNZ3RS8T4
   systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
 
+saveFile:
+  path: /home/server/lianxiang/file
+