pruple_boy 11 miesięcy temu
rodzic
commit
2d1c6bdbc0

+ 73 - 14
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java

@@ -120,7 +120,7 @@ public class AWImplClient implements AWClint {
             }
         }
         // ppExt: TB有卡控, 校验交付物不能为空, 同时兼容非交付件任务类型
-        List<Map> docs = _getDocs(taskData);
+        List<Map> docs = _getDocs(taskData, AWServer.TASK_APPROVE_ATTACHMENT);
         McException.assertAccessException(!isCallback && docs.size() == 0, "任务交付件不能为空, 请填写后再操作!");
         String executorId = UtilMap.getString(rTask, "executorId");
         if (!isCallback) {
@@ -159,8 +159,8 @@ public class AWImplClient implements AWClint {
                     result = "未配置交付物审批";
                 }
             }
-            /// 发起评审
-            if (StringUtils.isBlank(result)) {
+            /// 发起评审 prd 630 若无交付物审批, 则配置发起人自动通过, 以兼容全部任务类型可提交交付件评审
+            if (StringUtils.isBlank(result) || "未配置交付物审批".equals(result)) {
                 List<Map> roles = (List<Map>) rProject.get("tableField_lqxtykcf");
                 Map formData = UtilMap.map("selectField_lqxuswzd, textField_lrncs2fu", tCode, pCode);
                 formData.put("attachmentField_lqxtebtq", docs);
@@ -172,6 +172,7 @@ public class AWImplClient implements AWClint {
                 formData.put("textareaField_lw0nmvko", UtilMap.getString(taskData, AWServer.TASK_APPROVE_DESC));         // 交付件描述
                 formData.put("textField_lvbrueqs", UtilMap.getString(taskData, AWServer.TASK_PRODUCT));                  // 产品型号
                 formData.put("textField_lvbrueqt", UtilMap.getString(taskData, AWServer.TASK_PRODUCT_VERSION));          // 产品版本
+                formData.put("radioField_ly2o9rxn", "未配置交付物审批".equals(result) ? "是" : "否");                        // 审批分支
                 // 匹配任务编码与项目角色
                 List<Map<String, String>> compIds = Arrays.asList(  // 任务表角色, 交付物评审表: 角色, 审批人
                         UtilMap.map("tsRole, prRole, prEmp", "multiSelectField_lrokzlo7, multiSelectField_lrokzlo7, employeeField_lqxtebtw"),
@@ -343,12 +344,12 @@ public class AWImplClient implements AWClint {
      * 1. 宜搭附件传递 downloadUrl 和 name 即可实现在线预览
      * 2. 知识库绑定没有文件后缀, 宜搭识别目前仅能点击下载跳转预览, 添加统一docx后缀, 文档会自行区分
      * -
-     * ppExt: 获取任务字段需要传递 AWServer.TASK_APPROVE_ATTACHMENT 以获取ID, 另外添加 .doc 只是重定向若是文件夹也不影响访问
+     * ppExt: 获取任务字段需要传递字段名称以获取ID, 另外添加 .doc 只是重定向若是文件夹也不影响访问
      */
-    List<Map> _getDocs(Map taskData) {
+    List<Map> _getDocs(Map taskData, String fieldName) {
         Map rTask = UtilMap.getMap(taskData, "task");
         List<Map> customfields = UtilMap.getList(rTask, "customfields");
-        String deliverable = String.valueOf(taskData.get(AWServer.TASK_APPROVE_ATTACHMENT + "_id")); // 交付物任务字段ID
+        String deliverable = String.valueOf(taskData.get(fieldName + "_id")); // 交付物任务字段ID
         List<Map> attachments = TBConf.getTaskFieldValue(customfields, deliverable).stream().map(item -> {
             Map link = (Map) JSON.parse(String.valueOf(item.get("metaString")));
             Map row = UtilMap.map("downloadUrl, name", link.get("url"), link.get("title") + ".docx");
@@ -1284,6 +1285,8 @@ public class AWImplClient implements AWClint {
         String result = "";
         String formInstanceId = "";
         List<String> staffIds = new ArrayList<>();
+        List<Map> subList = null;
+
         // 通用账户unionId
         String unionId = String.valueOf(ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), ddConf.getOperator()).get("unionid"));
         // 知识库 & 项目信息处理
@@ -1302,6 +1305,7 @@ public class AWImplClient implements AWClint {
                     staffIds.addAll((List) detail.get("employeeField_lqxtykch_id"));
                 }
             }
+            subList = details; // 子表数据
             if (StringUtils.isBlank(workspaceId)) {
                 // 获取知识库空间Id [ ppExt: 知识库列表接口, 查询受到 operatorId 权限控制, 仅会返回操作者有权限知识库 ] todo tb提供接口返回知识库相关信息
                 List<Map> workspaces = ddClient_storage.searchWorkspaces(ddClient.getAccessToken(), unionId, pCode, null);
@@ -1333,7 +1337,7 @@ public class AWImplClient implements AWClint {
                 log.error(e.getMessage(), e);
             }
             // 知识库文件夹 & 拷贝处理 [prd 文件目录结构 TR评审节点/资源名称]
-            Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_APPROVE_ATTACHMENT, AWServer.TASK_STAGE, AWServer.TASK_ROLE);
+            Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_APPROVE_ATTACHMENT, AWServer.TASK_APPROVE_VERSION, AWServer.TASK_STAGE, AWServer.TASK_ROLE);
             Map rTask = UtilMap.getMap(taskData, "task");
             // fixme: 知识库所有操作和权限都与依赖于权限, 通过 spaceId + dentryId 查询创建人需要传递操作者, 操作者需要有查看以上权限. todo 目前临时读取执行人, tb文档相关信息需要返回创建人信息
             Map<String, String> extra = (Map) tbClient.idMapQuery(UtilMap.getString(rTask, "executorId"), "dingTalk-user", ddConf.getCorpId()).get(0).get("extra");
@@ -1363,7 +1367,7 @@ public class AWImplClient implements AWClint {
             fileName = fileName + "/" + tName;
             record = _upsertFileAbsolutePath("文件夹", fileName, pCode, UtilMap.getString(rTask, "projectId"), workspaceId, rootNodeId, unionId);
             rootNodeId = UtilMap.getString(record, "rootNodeId"); // 最新文件路径下ID
-            List<Map> docs = _getDocs(taskData);
+            List<Map> docs = _getDocs(taskData, AWServer.TASK_APPROVE_ATTACHMENT);
             log.info("docs, {}", docs);
             List<Map> attas = new ArrayList<>();
             for (Map doc : docs) {
@@ -1389,6 +1393,7 @@ public class AWImplClient implements AWClint {
                 DDR_New ddr_new;
                 try {
                     ddr_new = ddClient_storage.copyDentries(ddClient.getAccessToken(), unionId, workspaceId, UtilMap.getString(doc, "instanceId"), workspaceId, rootNodeId, docName);
+                    _updatePermission(ddr_new.getDentryUuid(), unionId, tName, subList); // 设置文件权限矩阵
                 } catch (McException e) {
                     // ppExt: 权限异常可能原因是重复授权, 依然执行复制操作, 再跳过
                     log.error(e.getMessage(), e);
@@ -1410,6 +1415,17 @@ public class AWImplClient implements AWClint {
             if (attas.isEmpty()) {
                 result = "无编辑权限, 复制失败";
             } else {
+                // prd 630 多文件传递时, 可能会删除其中交付件, 交付件版本保留全量的记录
+                for (Map doc : _getDocs(taskData, AWServer.TASK_APPROVE_VERSION)) {
+                    Optional optional = attas.stream().filter(item -> {
+                        String curName = UtilMap.getString(doc, "title").split(" v")[0];
+                        String preName = UtilMap.getString(item, "title").split(" v")[0];
+                        return curName.equals(preName);
+                    }).findAny();
+                    if (!optional.isPresent()) {
+                        attas.add(UtilMap.map("title, metaString", UtilMap.getString(doc, "title"), JSON.toJSONString(doc)));
+                    }
+                }
                 // 多文件更新回写 [ fixme: 更新任务自定义字段值 ]
                 tbClient.updateTaskCustomField(taskId, tbConf.getOperatorId(), UtilMap.map("customfieldName, value", AWServer.TASK_APPROVE_VERSION, attas));
             }
@@ -1422,9 +1438,52 @@ public class AWImplClient implements AWClint {
         log.info("知识库版本管理, {}", result);
     }
 
+    /// 交付件权限设置,包括TBManager账号设置为只读,针对文件. 移除非权限矩阵的项目成员
+    private void _updatePermission(String dentryUuid, String creatorUnionId, String roleName, List<Map> details) {
+
+        ddClient_storage.updateDentryPermissionsInheritances(ddClient.getAccessToken(), dentryUuid, creatorUnionId, "BREAK");
+        List<String> staffIds = new ArrayList<>();
+        try {  // todo 目前权限绑定群聊会异常, BUG
+            List<Map> allMembers = ddClient_storage.queryDentryPermissions(ddClient.getAccessToken(), dentryUuid, creatorUnionId, null);
+            for (Map member : allMembers) {
+                Map<String, String> team = UtilMap.getMap(member, "member");
+                if ("USER".equals(UtilMap.getString(team, "type"))) {
+                    String roleId = UtilMap.getString(UtilMap.getMap(member, "role"), "id");
+                    String userId = UtilMap.getString(team, "id");
+                    if (!Arrays.asList("OWNER", "MANAGER").contains(roleId)) {
+                        staffIds.add(userId);
+                    }
+                }
+            }
+            // ppExt: 不移除 TBManager 权限, 避免不可见
+            if (staffIds.contains(ddConf.getOperator())) {
+                staffIds.remove(ddConf.getOperator());
+            }
+            log.info("删除文件权限 {}, {}, {}", dentryUuid, staffIds);
+
+            // 权限成员列表,最大size30, 通过 partition 快速切割[ 只读权限]
+            List<List<String>> parts = Lists.partition(staffIds, DDConf.WORKSPACE_PERMISSION_SIZE);
+            for (List<String> ids : parts) {
+                List<Map> members = ids.stream().map(userId -> UtilMap.map("type, id", "USER", userId)).collect(Collectors.toList());
+                // ppExt 会自动移除更低的权限
+                ddClient_storage.deleteDentryPermissions(ddClient.getAccessToken(), dentryUuid, creatorUnionId, "EDITOR", members, null);
+            }
+        } catch (McException e) {
+            log.error(e.getMessage(), e);
+        }
+
+        // 获取角色在项目主数据对应成员 [ todo 取值权限矩阵 ]
+        Optional optional = details.stream().filter(item -> roleName.equals(item.get("selectField_lqxu6bgf"))).findAny();
+        if (!optional.isPresent()) {
+            return;
+        }
+        List<String> roleIds = (List<String>) UtilMap.getList((Map) optional.get(), "employeeField_lqxtykch_id");
+        List<Map> members = roleIds.stream().map(userId -> UtilMap.map("type, id", "USER", userId)).collect(Collectors.toList());
+        ddClient_storage.updateDentryPermissions(ddClient.getAccessToken(), dentryUuid, creatorUnionId, "READER", members, null);
+    }
+
     /// 更新一级归档目录 dentryUuid 权限打断, 并更新项目成员只读权限, 且更新记录实例ID [ 用于后续项目全量同步时, 刷新权限 ]
-    private void _breakPermission(String rootNodeId, String dentryUuid, List<String> staffIds, String
-            creatorUnionId, String formInstanceId) {
+    private void _breakPermission(String rootNodeId, String dentryUuid, List<String> staffIds, String creatorUnionId, String formInstanceId) {
 
         ddClient_storage.updateDentryPermissionsInheritances(ddClient.getAccessToken(), dentryUuid, creatorUnionId, "BREAK");
         try {  // todo 目前权限绑定群聊会异常, BUG
@@ -1489,14 +1548,14 @@ public class AWImplClient implements AWClint {
 
     @Override
     public void test() {
-//        approveVersion("659a681d44ade3345fdc0d39", "99999");
+        approveVersion("659a681d44ade3345fdc0d39", "99999");
 
         String pCode = "99999";
 //        String pCode = "A240407DryRun";
 //
-        List<Map> pList = ydService.queryDataList_FormData(_matchFormUuid("PROJECT"), UtilMap.map("textField_lrj7vnxb", pCode));
-        pList = pList.stream().filter(item -> pCode.equals(item.get("textField_lrj7vnxb"))).collect(Collectors.toList());
-        _assembleBreakPermission(pList.get(0));
+//        List<Map> pList = ydService.queryDataList_FormData(_matchFormUuid("PROJECT"), UtilMap.map("textField_lrj7vnxb", pCode));
+//        pList = pList.stream().filter(item -> pCode.equals(item.get("textField_lrj7vnxb"))).collect(Collectors.toList());
+//        _assembleBreakPermission(pList.get(0));
 
 //        String creatorUnionId = String.valueOf(ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), "095358016629044412").get("unionid"));
 //        List<Map> allMembers = ddClient_storage.queryDentryPermissions(ddClient.getAccessToken(), "14lgGw3P8vMDNPvMC7aw11LzJ5daZ90D", creatorUnionId, null);

+ 62 - 1
mjava-cloudpure/src/main/java/com/malk/cloudpure/controller/TSController.java

@@ -9,6 +9,7 @@ import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -18,9 +19,11 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -50,9 +53,11 @@ public class TSController {
         //updatePosition("2445432306884832");
 //        tianhua618();
 
-        updateVersion("7d59681c-b898-448f-ac2a-d2f411a45161");
+//        updateVersion("7d59681c-b898-448f-ac2a-d2f411a45161");
 //        lanyun621();
 
+        lanyun630();
+
         return McR.success();
     }
 
@@ -69,6 +74,62 @@ public class TSController {
 
     }
 
+    /// 630 蓝云项目点数据更新
+    private void lanyun630() {
+
+
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                .formUuid("FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC")
+//                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lrr3rg6h", "XM00363")))
+                .build());
+        log.info("项目点数据, {}", dataList.size());
+        dataList.forEach(formData -> {
+            List<Map> details = UtilMap.getList(formData, "tableField_lrru2tnq");
+//            details = details.stream().filter(item -> UtilMap.isNotBlankString(item, "dateField_lrru2tnr")).collect(Collectors.toList());
+            // 数据格式化
+//            details.forEach(row -> {
+//                row.put("textField_luh0k82j", UtilDateTime.format(new Date(UtilMap.getLong(row, "dateField_lrru2tnr")), "yyyy-MM"));
+//            }
+//            });
+//            Collections.sort(details, Comparator.comparingLong(o -> UtilMap.getLong(o, "dateField_lrru2tnr")));
+
+            // 查找当月数据
+            LocalDateTime currentDate = UtilDateTime.firstDayOfLastMonth(LocalDateTime.now());
+            Optional optional = details.stream().filter(item -> UtilDateTime.getLocalDateTimeTimeStamp(currentDate) == UtilMap.getLong(item, "dateField_lrru2tnr")).findAny();
+            log.info("上个月数据, {}, {}", currentDate, optional);
+            if (!optional.isPresent() || StringUtils.isNotBlank(UtilMap.getString((Map) optional.get(), "numberField_lrru2tnz"))) {
+                return;
+            }
+
+            LocalDateTime lastMonthDate = UtilDateTime.firstDayOfLastMonth(currentDate);
+            Map currentRow = (Map) optional.get();
+            optional = details.stream().filter(item -> UtilDateTime.getLocalDateTimeTimeStamp(lastMonthDate) == UtilMap.getLong(item, "dateField_lrru2tnr")).findAny();
+            log.info("上上月数据, {}, {}", lastMonthDate, optional);
+
+            float price;
+            if (!optional.isPresent() || StringUtils.isBlank(UtilMap.getString((Map) optional.get(), "numberField_lrru2tnz"))) {
+                price = UtilMap.getFloat(currentRow, "numberField_lrru2tns");
+                currentRow.put("numberField_lrru2tnz", price); // 取本月收入定额
+            } else {
+                price = UtilMap.getFloat((Map) optional.get(), "numberField_lrru2tnz");
+                currentRow.put("numberField_lrru2tnz", price); // 取上月收入预估
+            }
+            price += UtilMap.getFloat(formData, "numberField_lutjev0u");
+            log.info("price, {}", price);
+            // 合计初始化
+//            price = details.stream().map(item -> UtilMap.getFloat(item, "numberField_lrru2tnz")).collect(Collectors.toList()).stream().reduce(0f, (acc, cur) -> acc + cur);
+            ydClient.operateData(YDParam.builder()
+                    .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                    .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                    .formInstanceId(UtilMap.getString(formData, "formInstanceId"))
+//                    .useLatestVersion(true)
+                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lrru2tnq, numberField_lutjev0u", details, price)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        });
+    }
+
     /// 6.21 蓝云数据版本问题
     private void lanyun621() {
 

+ 51 - 59
mjava-hake/src/main/java/com/malk/hake/controller/HKController.java

@@ -2,15 +2,11 @@ package com.malk.hake.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.malk.hake.service.HKClient;
-import com.malk.server.aliwork.YDConf;
-import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 import com.malk.server.common.McREnum;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
-import com.malk.utils.UtilDateTime;
-import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
 import lombok.SneakyThrows;
 import lombok.Synchronized;
@@ -19,11 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 错误抛出与拦截详见 CatchException
@@ -112,42 +104,42 @@ public class HKController {
 
 
         /// 衣念
-        List<Map> dataList = (List<Map>) ydService.queryFormData_all(YDParam.builder()
-                .appType("APP_ZTKQXN2ISL7TWFDR6PSK")
-                .systemToken("GM866LB1OJTBPZB471GENBEO35YB270I085JLN1")
-                .formUuid("FORM-PR8667D1F4NBYLKI9ZKT9AEDZ6SP2CU4OA5JLQ")
-                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lk82ds02, dateField_lili3nyt", "是", Arrays.asList(UtilDateTime.parseDate("2024-04-01").getTime(), new Date().getTime()))))
-                .useLatestVersion(true)
-                .build());
-        log.info("dataList, {}", dataList.size());
-
-        dataList.forEach(item -> {
-            List<Map> details = (List<Map>) item.get("tableField_lili3nz6");
-            Map formData = UtilMap.map("tableField_lili3nz6", details.stream().map(row -> {
-                row.put("textField_lvf16s5q", String.valueOf(row.get("selectField_lk2byq2q")).replace("-1", "").replace("-2", "").replace("-3", "").replace("-4", "").replace("-5", ""));
-                return row;
-            }).collect(Collectors.toList()));
-            log.info("------, {}", item.get("formInstanceId"));
-            ydClient.operateData(YDParam.builder()
-                    .appType("APP_ZTKQXN2ISL7TWFDR6PSK")
-                    .systemToken("GM866LB1OJTBPZB471GENBEO35YB270I085JLN1")
-                    .formInstanceId(UtilMap.getString(item, "formInstanceId"))
-                    .updateFormDataJson(JSON.toJSONString(formData))
-                    .build(), YDConf.FORM_OPERATION.update);
-        });
+//        List<Map> dataList = (List<Map>) ydService.queryFormData_all(YDParam.builder()
+//                .appType("APP_ZTKQXN2ISL7TWFDR6PSK")
+//                .systemToken("GM866LB1OJTBPZB471GENBEO35YB270I085JLN1")
+//                .formUuid("FORM-PR8667D1F4NBYLKI9ZKT9AEDZ6SP2CU4OA5JLQ")
+//                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lk82ds02, dateField_lili3nyt", "是", Arrays.asList(UtilDateTime.parseDate("2024-04-01").getTime(), new Date().getTime()))))
+//                .useLatestVersion(true)
+//                .build());
+//        log.info("dataList, {}", dataList.size());
+//
+//        dataList.forEach(item -> {
+//            List<Map> details = (List<Map>) item.get("tableField_lili3nz6");
+//            Map formData = UtilMap.map("tableField_lili3nz6", details.stream().map(row -> {
+//                row.put("textField_lvf16s5q", String.valueOf(row.get("selectField_lk2byq2q")).replace("-1", "").replace("-2", "").replace("-3", "").replace("-4", "").replace("-5", ""));
+//                return row;
+//            }).collect(Collectors.toList()));
+//            log.info("------, {}", item.get("formInstanceId"));
+//            ydClient.operateData(YDParam.builder()
+//                    .appType("APP_ZTKQXN2ISL7TWFDR6PSK")
+//                    .systemToken("GM866LB1OJTBPZB471GENBEO35YB270I085JLN1")
+//                    .formInstanceId(UtilMap.getString(item, "formInstanceId"))
+//                    .updateFormDataJson(JSON.toJSONString(formData))
+//                    .build(), YDConf.FORM_OPERATION.update);
+//        });
         return McR.success();
     }
 
     @GetMapping("test2")
     McR test2() {
-
-        ydClient.operateData(YDParam.builder()
-                .appType("APP_ERBDTFS82HOVBPL3NFH0")
-                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
-                .formInstanceId("ce82e168-ade5-494c-b781-5e5ce3fc451e")
-                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lr383i3u", "test")))
-                .useLatestVersion(true)
-                .build(), YDConf.FORM_OPERATION.update);
+//
+//        ydClient.operateData(YDParam.builder()
+//                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+//                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+//                .formInstanceId("ce82e168-ade5-494c-b781-5e5ce3fc451e")
+//                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lr383i3u", "test")))
+//                .useLatestVersion(true)
+//                .build(), YDConf.FORM_OPERATION.update);
         return McR.success();
     }
 
@@ -162,32 +154,32 @@ public class HKController {
 //        String appType = "APP_ERBDTFS82HOVBPL3NFH0";
 //        String systemToken = "RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP";
 
-        String instanceId = "31e7bd1a-7f06-444e-af56-90f8ffa1c8d3";
-        String appType = "APP_ERBDTFS82HOVBPL3NFH0";
-        String systemToken = "RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP";
-
-        ydClient.operateData(YDParam.builder()
-                .appType(appType)
-                .systemToken(systemToken)
-                .formInstanceId(instanceId)
-                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_lr383i3y", "")))
-                .useLatestVersion(true)
-                .build(), YDConf.FORM_OPERATION.update);
+//        String instanceId = "31e7bd1a-7f06-444e-af56-90f8ffa1c8d3";
+//        String appType = "APP_ERBDTFS82HOVBPL3NFH0";
+//        String systemToken = "RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP";
+//
+//        ydClient.operateData(YDParam.builder()
+//                .appType(appType)
+//                .systemToken(systemToken)
+//                .formInstanceId(instanceId)
+//                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_lr383i3y", "")))
+//                .useLatestVersion(true)
+//                .build(), YDConf.FORM_OPERATION.update);
         return McR.success();
     }
 
     @GetMapping("/delete")
     McR tmp() {
 
-        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
-                .formUuid("FORM-4E69EBA1416047078D14601AF17A05643350")
-//                .formUuid("FORM-FCD09241E15D4E53A901D54CA3FBB084PQ6P")
-                .build());
-        dataList.forEach(item -> {
-            ydClient.operateData(YDParam.builder()
-                    .formInstanceId(UtilMap.getString(item, "formInstanceId"))
-                    .build(), YDConf.FORM_OPERATION.delete);
-        });
+//        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+//                .formUuid("FORM-4E69EBA1416047078D14601AF17A05643350")
+////                .formUuid("FORM-FCD09241E15D4E53A901D54CA3FBB084PQ6P")
+//                .build());
+//        dataList.forEach(item -> {
+//            ydClient.operateData(YDParam.builder()
+//                    .formInstanceId(UtilMap.getString(item, "formInstanceId"))
+//                    .build(), YDConf.FORM_OPERATION.delete);
+//        });
 
         return McR.success();
     }

+ 1 - 1
mjava-hake/src/main/java/com/malk/hake/schedule/HKScheduleTask.java

@@ -62,7 +62,7 @@ public class HKScheduleTask {
     @Scheduled(cron = "0 0 2 * * ? ")
     public void timer_4() {
         try {
-//            hkClient.syncMonitor("YFKSQ");
+            hkClient.syncMonitor("YFKSQ");
         } catch (Exception e) {
             // 记录错误信息
             e.printStackTrace();

+ 7 - 0
mjava/src/main/java/com/malk/service/dingtalk/DDClient_Storage.java

@@ -123,6 +123,13 @@ public interface DDClient_Storage {
      */
     boolean updateDentryPermissions(String accessToken, String dentryUuid, String unionId, String roleId, List<Map> members, Map option);
 
+    /**
+     * 删除权限 [ ppExt: 会自动移除更低的权限 ]
+     *
+     * @apiNote https://open.dingtalk.com/document/orgapp/delete-permissions-file
+     */
+    boolean deleteDentryPermissions(String accessToken, String dentryUuid, String unionId, String roleId, List<Map> members, Map option);
+
     /**
      * 设置权限继承模式
      * ppExt: 设置为打断模式, 与手动修改权限效果一致. 后续知识库成员调整, 非管理者与所有者人员不会传递到当前路径下, 即该文件若要可见需要重新对成员赋权

+ 8 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Storage.java

@@ -191,6 +191,14 @@ public class DDImplClient_Storage implements DDClient_Storage {
         return ddr_new.isSuccess();
     }
 
+    @Override
+    public boolean deleteDentryPermissions(String accessToken, String dentryUuid, String unionId, String roleId, List<Map> members, Map option) {
+        Map param = UtilMap.map("unionId", unionId);
+        Map body = UtilMap.map("roleId, members, option", roleId, members, option);
+        DDR_New ddr_new = DDR_New.doPost("https://api.dingtalk.com/v2.0/storage/spaces/dentries/" + dentryUuid + "/permissions/remove", DDConf.initTokenHeader(accessToken), param, body);
+        return ddr_new.isSuccess();
+    }
+
     @Override
     public boolean updateDentryPermissionsInheritances(String accessToken, String dentryUuid, String unionId, String inheritance) {
         Map param = UtilMap.map("unionId", unionId);