浏览代码

Merge remote-tracking branch 'origin/master'

fyz 7 月之前
父节点
当前提交
7932ef8978
共有 24 个文件被更改,包括 2634 次插入26 次删除
  1. 18 0
      mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java
  2. 7 0
      mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java
  3. 27 0
      mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java
  4. 6 8
      mjava-boyang/src/main/resources/application-dev.yml
  5. 7 9
      mjava-boyang/src/main/resources/application-prod.yml
  6. 63 0
      mjava-lianxiang/src/main/java/com/malk/lianxiang/controller/LianxiangController.java
  7. 11 0
      mjava-lianxiang/src/main/java/com/malk/lianxiang/service/LianxiangService.java
  8. 464 0
      mjava-lianxiang/src/main/java/com/malk/lianxiang/service/impl/LianxiangServiceImpl.java
  9. 8 1
      mjava-lianxiang/src/main/resources/application-dev.yml
  10. 9 2
      mjava-lianxiang/src/main/resources/application-prod.yml
  11. 34 6
      mjava-mc/src/main/java/com/malk/mc/controller/McDdController.java
  12. 13 0
      mjava-mc/src/main/java/com/malk/mc/controller/McYdController.java
  13. 4 0
      mjava-mc/src/main/java/com/malk/mc/service/McYdService.java
  14. 151 0
      mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java
  15. 68 0
      mjava-yiyao/pom.xml
  16. 17 0
      mjava-yiyao/src/main/java/com/malk/yiyao/YiyaoApplication.java
  17. 20 0
      mjava-yiyao/src/main/java/com/malk/yiyao/controller/YiyaoController.java
  18. 23 0
      mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java
  19. 1491 0
      mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java
  20. 26 0
      mjava-yiyao/src/main/resources/application-dev.yml
  21. 27 0
      mjava-yiyao/src/main/resources/application-prod.yml
  22. 15 0
      mjava-yiyao/src/main/resources/application.yml
  23. 61 0
      mjava-yiyao/src/main/resources/logback-spring.xml
  24. 64 0
      mjava-yiyao/src/test/java/com/malk/yiyao/YiyaoTest.java

+ 18 - 0
mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java

@@ -0,0 +1,18 @@
+package com.malk.boyang.controller;
+
+import com.malk.boyang.service.BoyangService;
+import com.malk.server.common.McR;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping
+public class BoyangController {
+
+    @Autowired
+    private BoyangService boyangService;
+
+
+
+}

+ 7 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java

@@ -0,0 +1,7 @@
+package com.malk.boyang.service;
+
+import com.malk.server.common.McR;
+
+public interface BoyangService {
+
+}

+ 27 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -0,0 +1,27 @@
+package com.malk.boyang.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.boyang.service.BoyangService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+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 com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+public class BoyangServiceImpl implements BoyangService {
+
+}

+ 6 - 8
mjava-boyang/src/main/resources/application-dev.yml

@@ -1,4 +1,3 @@
-#测试学习
 server:
   port: 9033
   servlet:
@@ -8,21 +7,20 @@ enable:
   scheduling: false
 logging:
   config: classpath:logback-spring.xml
-  path: /home/server/lianxiang/log/
+  path: /home/server/boyang/log/
   level:
     com.malk.*: debug
 
 # dingtalk
 dingtalk:
-  agentId: 3749205961
-  appKey: dingdcxnvojhmwi1lau0
-  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
+  agentId:
+  appKey:
+  appSecret:
   corpId:
   aesKey:
   token:
-  operator: 344749020127590108
 
 aliwork:
-  appType: APP_TTZS5KICGVVQNZ3RS8T4
-  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+  appType:
+  systemToken:
 

+ 7 - 9
mjava-boyang/src/main/resources/application-prod.yml

@@ -1,4 +1,3 @@
-#测试学习
 server:
   port: 9033
   servlet:
@@ -8,21 +7,20 @@ enable:
   scheduling: false
 logging:
   config: classpath:logback-spring.xml
-  path: /home/server/lianxiang/log/
+  path: /home/server/boyang/log/
   level:
-    com.malk.*: info
+    com.malk.*: debug
 
 # dingtalk
 dingtalk:
-  agentId: 3749205961
-  appKey: dingdcxnvojhmwi1lau0
-  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
+  agentId:
+  appKey:
+  appSecret:
   corpId:
   aesKey:
   token:
-  operator: 344749020127590108
 
 aliwork:
-  appType: APP_TTZS5KICGVVQNZ3RS8T4
-  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+  appType:
+  systemToken:
 

+ 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/
+

+ 34 - 6
mjava-mc/src/main/java/com/malk/mc/controller/McDdController.java

@@ -3,10 +3,10 @@ package com.malk.mc.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.server.common.McException;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR_New;
-import com.malk.service.dingtalk.DDClient;
-import com.malk.service.dingtalk.DDClient_Group;
-import com.malk.service.dingtalk.DDClient_Report;
+import com.malk.service.dingtalk.*;
+import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,7 +14,6 @@ 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 com.malk.service.dingtalk.DDClient_Attendance;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -35,6 +34,8 @@ public class McDdController {
 
     @Autowired
     private DDClient_Attendance ddClientAttendance;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
 
 
 
@@ -69,18 +70,45 @@ public class McDdController {
         String accessToken = ddClient.getAccessToken();
         List userIds = (List) param.get("userIds");
         String checkDateFrom = param.getString("checkDateFrom")+" 00:00:00";
-        String checkDateTo = param.getString("checkDateTo")+" 00:00:00";
+//        将字符串修改成时间
+        String checkDateTo = param.getString("checkDateTo")+" 23:59:59";
         List<Map> results = ddClientAttendance.listAttendanceRecord(accessToken, userIds, checkDateFrom, checkDateTo);
         log.info("获取考勤详情:{}",results);
         Set<String> addressList = new HashSet<>();
         String address = "";
         for(Map result:results){
             System.out.println("result:"+result.get("userAddress"));
-            addressList.add(result.get("userAddress").toString()) ;
+//            需要对result.get("userAddress")进行判断,如果为空则不添加
+            if(result.get("userAddress")!=null){
+                addressList.add(result.get("userAddress").toString()) ;
+            }else{
+                continue;
+            }
         }
         System.out.println("address:"+addressList) ;
          address = addressList.stream().collect(Collectors.joining(","));
         return McR.success(address);
     }
 
+
+    @PostMapping("/orgAccount/changeOrgAccount")
+    public McR changeEnterpriseAccount(@RequestBody JSONObject param){
+        log.info("修改企业账号:{}",param);
+        McException.assertParamException_Null(param,"userId","targetUserId");
+//        根据传过来的企业账号id查找下面的组织
+        String accessToken = ddClient.getAccessToken();
+        String  userId = UtilMap.getString(param,"userId");
+       UtilHttp.doGet("https://api.dingtalk.com/v1.0/contact/orgAccounts/ownedOrganizations?userId="+userId,DDConf.initTokenHeader(accessToken),param);
+        log.info("企业账号id:{}下的组织:{}",userId);
+
+
+
+//        没有组织直接给这个企业账号办理离职
+
+//        有组织将企业账号中所有组织转给传过来的企业账号id
+
+        return McR.success();
+
+    }
+
 }

+ 13 - 0
mjava-mc/src/main/java/com/malk/mc/controller/McYdController.java

@@ -12,11 +12,13 @@ import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.utils.PublicUtil;
 import com.malk.utils.UtilMap;
+import com.malk.utils.UtilServlet;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
 /***
@@ -141,4 +143,15 @@ public class McYdController {
         McException.assertParamException_Null(map,"formInstId","key");
         return mcYdService.saveApproverToForm(map);
     }
+
+    //海天二期开发部分(出库)
+    @PostMapping("/multiLocationOutbound")
+    public McR multiLocationOutbound(@RequestBody Map map){
+        return mcYdService.multiLocationOutbound(map);
+    }
+    //海天二期开发部分(入库)
+    @PostMapping("/WarehouseStorage")
+    public McR WarehouseStorage(@RequestBody Map map){
+        return mcYdService.WarehouseStorage(map);
+    }
 }

+ 4 - 0
mjava-mc/src/main/java/com/malk/mc/service/McYdService.java

@@ -14,4 +14,8 @@ public interface McYdService {
     McR convertSubTableNumber(Map map);
 
     McR saveApproverToForm(Map map);
+
+    McR multiLocationOutbound(Map map);
+
+    McR WarehouseStorage(Map map);
 }

+ 151 - 0
mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java

@@ -2,6 +2,7 @@ package com.malk.mc.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.core.McProject;
@@ -23,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import javax.rmi.CORBA.Util;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.*;
@@ -36,6 +38,8 @@ public class McYdServiceImpl implements McYdService {
     private DDClient ddClient;
     @Autowired
     private DDConf ddConf;
+    @Autowired
+    private YDConf ydConf;
 
     @Override
     @Async
@@ -229,6 +233,153 @@ public class McYdServiceImpl implements McYdService {
         return McR.success();
     }
 
+    @Override
+    public McR multiLocationOutbound(Map map) {
+
+        String formInstId = UtilMap.getString(map,"formInstId");//实例id(出库单)
+        Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
+                        .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F")
+                        .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                        .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                        .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println("出库单数据:"+d);
+        List<Map> mapList = (List<Map>)d.get("tableField_m8mo8506");
+        System.out.println("出库单明细数据:"+mapList);
+        ArrayList<Object> entries = new ArrayList<>();
+        for(Map map1 : mapList){
+            String LBJId = map1.get("textField_ma1usp6o").toString();//零部件的实例id
+            entries.add(LBJId);
+            System.out.println("物料名称:"+map1.get("textField_m99kztjo").toString());
+            BigDecimal InventoryCount = BigDecimal.valueOf(0);//库存数量
+            BigDecimal OutboundQuantity = BigDecimal.valueOf(0);//
+            if(!map1.get("numberField_m9qdwvu1_value").toString().isEmpty()){
+                 InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString());
+            }
+            BigDecimal numberFieldM9qdwvu1 = InventoryCount.subtract( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//存库数量 - 出库数量
+            System.out.println("出库后数量:"+numberFieldM9qdwvu1);
+
+            Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
+            System.out.println(map1.get("textField_m99kztjo").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
+
+            String s = d1.get("tableField_m96gje14").toString();
+            String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
+            String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
+            String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
+
+            ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
+            Map sss=new HashMap<>();
+            sss.put("selectField_m88f1qi8",warehouse);//所属仓库
+            sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
+            sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
+            sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
+            maps_YD.add(sss);
+
+            ydClient.operateData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
+                    .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
+            BigDecimal InventoryQuantity = new BigDecimal( d1.get("numberField_m8obn6wk").toString());//库存数量
+            BigDecimal FreezeQuantity = null;
+            if(!d1.get("numberField_m8obn6wl_value").toString().isEmpty()){
+                FreezeQuantity = new BigDecimal( d1.get("numberField_m8obn6wl").toString());//冻结数量
+            }else {
+                FreezeQuantity = BigDecimal.valueOf(0);
+            }
+
+            System.out.println("--------------------零部件子表数据修改完毕!---------------------");
+
+            BigDecimal FreezeQuantity_AAA = FreezeQuantity.add( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//冻结数量(新)
+            BigDecimal AvailableQuantity_AAA = numberFieldM9qdwvu1;//可用存库数量(新)
+            ydClient.operateData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wl, numberField_m8gz97nk",FreezeQuantity_AAA,AvailableQuantity_AAA)))
+                    .userId("332051151139376769")
+                    .build(),YDConf.FORM_OPERATION.update);
+            System.out.println("----------------------零部件主表数据修改完毕!------------------");
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR WarehouseStorage(Map map) {
+        String formInstId = UtilMap.getString(map,"formInstId");//实例id(入库单)
+        Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
+                .formUuid("FORM-6DED8EB4CF0446DB8841C7798E106F2886OH")
+                .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println("入库单数据:"+d);
+        List<Map> mapList = (List<Map>)d.get("tableField_m8mseubi");
+        System.out.println("入库单明细数据:"+mapList);
+        ArrayList<Object> entries = new ArrayList<>();
+        for(Map map1 : mapList){
+            String LBJId = map1.get("textField_ma3jhnpr").toString();//零部件的实例id
+            entries.add(LBJId);
+            System.out.println("物料名称:"+map1.get("textField_m9b1vd2w").toString());
+
+            BigDecimal numberFieldM9qdwvu1 = new BigDecimal( map1.get("numberField_ma3jwnr3").toString() ).add(new BigDecimal( map1.get("numberField_m8mseubm").toString()));//存库数量 + 入库数量
+            System.out.println("入库后数量:"+numberFieldM9qdwvu1);
+
+            Map d1 = ydClient.queryData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
+            System.out.println(map1.get("textField_m9b1vd2w").toString()+"的数据明细:"+ d1.get("tableField_m96gje14").toString());
+
+            String s = d1.get("tableField_m96gje14").toString();
+            String warehouse = JSON.parseArray(s).getJSONObject(0).get("selectField_m88f1qi8").toString();//所属仓库
+            String WarehouseLocation = JSON.parseArray(s).getJSONObject(0).get("textField_m8mnxgql").toString();//所属库位
+            String SafetyValue = JSON.parseArray(s).getJSONObject(0).get("numberField_m8873fn4").toString();//安全库存值
+
+            ArrayList<Map<String,String>> maps_YD = new ArrayList<>();
+            Map sss=new HashMap<>();
+            sss.put("selectField_m88f1qi8",warehouse);//所属仓库
+            sss.put("textField_m8mnxgql",WarehouseLocation);//所属库位
+            sss.put("numberField_m8873fn4",SafetyValue);//安全库存值
+            sss.put("numberField_m9c8n9go",numberFieldM9qdwvu1);//仓库数量
+            maps_YD.add(sss);
+
+            ydClient.operateData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("tableField_m96gje14",maps_YD)))
+                    .userId("332051151139376769").build(),YDConf.FORM_OPERATION.update);
+            BigDecimal InventoryQuantity = new BigDecimal( d1.get("numberField_m8obn6wk").toString());//库存数量
+            BigDecimal VirtualQuantity = null;
+            if(!d1.get("numberField_m8obn6wq_value").toString().isEmpty()){
+                VirtualQuantity = new BigDecimal( d1.get("numberField_m8obn6wq").toString());//虚拟数量
+            }else {
+                VirtualQuantity = BigDecimal.valueOf(0);
+            }
+
+            System.out.println("--------------------零部件子表数据修改完毕!---------------------");
+
+            BigDecimal VirtualQuantity_AAA = VirtualQuantity.add( new BigDecimal( map1.get("numberField_m8mseubm").toString()));//虚拟数量(新)
+            BigDecimal AvailableQuantity_AAA = InventoryQuantity .add (new BigDecimal( map1.get("numberField_m8mseubm").toString()));//可用存库数量(新)
+            ydClient.operateData(YDParam.builder().formInstId(LBJId)
+                    .formUuid("FORM-2353BE632D97434DAD55AEBD0866C44DVAT5")
+                    .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                    .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                    .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_m8obn6wq, numberField_m8gz97nk",VirtualQuantity_AAA,AvailableQuantity_AAA)))
+                    .userId("332051151139376769")
+                    .build(),YDConf.FORM_OPERATION.update);
+            System.out.println("----------------------零部件主表数据修改完毕!------------------");
+        }
+        return McR.success();
+    }
+
+
     private static void extractOperatorIds(JSONArray array, List<String> result) {
         for (Object item : array) {
             JSONObject obj = (JSONObject) item;

+ 68 - 0
mjava-yiyao/pom.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.0.RELEASE</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk.yiyao</groupId>
+    <artifactId>mjava-yiyao</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>boyang</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 17 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/YiyaoApplication.java

@@ -0,0 +1,17 @@
+package com.malk.yiyao;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class YiyaoApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(YiyaoApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 20 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/controller/YiyaoController.java

@@ -0,0 +1,20 @@
+package com.malk.yiyao.controller;
+
+import com.malk.server.common.McR;
+import com.malk.yiyao.service.YiyaoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping
+public class YiyaoController {
+
+    @Autowired
+    private YiyaoService yiyaoService;
+
+    public McR updateYiyao1(){
+        return yiyaoService.updateYiyao1();
+    }
+
+}

+ 23 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java

@@ -0,0 +1,23 @@
+package com.malk.yiyao.service;
+
+import com.malk.server.common.McR;
+
+public interface YiyaoService {
+    McR updateYiyao1();
+
+    McR updateYiyao2();
+
+    McR updateYiyao3();
+
+    McR updateYiyao4();
+
+    McR updateYiyao5();
+
+    McR updateYiyao6();
+
+    McR updateYiyao7();
+
+    McR updateYiyao8();
+
+    McR updateYiyao9();
+}

文件差异内容过多而无法显示
+ 1491 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java


+ 26 - 0
mjava-yiyao/src/main/resources/application-dev.yml

@@ -0,0 +1,26 @@
+server:
+  port: 9033
+  servlet:
+    context-path: /yiyao
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/yiyao/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 2691784047
+  appKey: dinghbynhnd2dbgypmsa
+  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
+  corpId: dingcc1b1ffad0d5ca1d
+  aesKey:
+  token:
+
+aliwork:
+  appType: APP_HJJ3X3QN4WEWDHU2BJR2
+  systemToken: 7X866C81QPIHJKBFFM1QW4S8BV1U3U4MFO5RLY1
+

+ 27 - 0
mjava-yiyao/src/main/resources/application-prod.yml

@@ -0,0 +1,27 @@
+server:
+  port: 9033
+  servlet:
+    context-path: /yiyao
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/yiyao/log/
+  level:
+    com.malk.*: info
+
+# dingtalk
+dingtalk:
+  agentId: 3749205961
+  appKey: dingdcxnvojhmwi1lau0
+  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
+  corpId:
+  aesKey:
+  token:
+  operator: 344749020127590108
+
+aliwork:
+  appType: APP_TTZS5KICGVVQNZ3RS8T4
+  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+

+ 15 - 0
mjava-yiyao/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

+ 61 - 0
mjava-yiyao/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 64 - 0
mjava-yiyao/src/test/java/com/malk/yiyao/YiyaoTest.java

@@ -0,0 +1,64 @@
+package com.malk.yiyao;
+
+import com.malk.yiyao.service.YiyaoService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class YiyaoTest {
+    @Autowired
+    private YiyaoService yiyaoService;
+
+
+    @Test
+    public void test() {
+        yiyaoService.updateYiyao1();
+    }
+
+    @Test
+    public void test2() {
+        yiyaoService.updateYiyao2();
+    }
+
+    @Test
+    public void test3() {
+        yiyaoService.updateYiyao3();
+    }
+
+    @Test
+    public void test4() {
+        yiyaoService.updateYiyao4();
+    }
+
+    @Test
+    public void test5() {
+        yiyaoService.updateYiyao5();
+    }
+
+    @Test
+    public void test6() {
+        yiyaoService.updateYiyao6();
+    }
+
+    @Test
+    public void test7() {
+        yiyaoService.updateYiyao7();
+    }
+
+    @Test
+    public void test8() {
+        yiyaoService.updateYiyao8();
+    }
+
+    @Test
+    public void test9() {
+        yiyaoService.updateYiyao9();
+    }
+
+}