pruple_boy 9 months ago
parent
commit
07cf2af413

+ 10 - 2
mjava-aipocloud/src/main/java/com/malk/aipocloud/controller/ABController.java

@@ -12,6 +12,8 @@ import com.malk.utils.UtilDateTime;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -55,10 +57,16 @@ public class ABController {
     @Autowired
     private McDelegate mcDelegate;
 
-    @PostMapping("test")
+    @Value("${server.ssl.key-store}")
+    private String keyStore;
+
+    @Value("${server.ssl.key-store-password}")
+    private String keyStorePassword;
+
+    @GetMapping("test")
     McR test() {
 
-        log.info("11111");
+        log.info("11111, {}, {}", keyStore, keyStorePassword);
 
         mcDelegate.setTimeout(() -> {
 

+ 18 - 13
mjava-aiwei/src/main/java/com/malk/aiwei/controller/TBxYDController.java

@@ -6,7 +6,6 @@ package com.malk.aiwei.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.malk.aiwei.server.YDSearch;
 import com.malk.aiwei.service.AWClint;
 import com.malk.delegate.McDelegate;
 import com.malk.server.aliwork.YDConf;
@@ -25,7 +24,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @RestController
@@ -291,11 +293,11 @@ public class TBxYDController {
     Map getProductList(@RequestParam Map param) {
         System.out.println(JSONObject.toJSONString(param));
 //        String projectId="65f2855b5a2065ad7ad7d084";
-        String projectId=UtilMap.getString(param,"projectId");
-        String q=UtilMap.getString(param,"q");
-        String objectId=UtilMap.getString(param,"objectId");
-        List result=awClint.getProductList(projectId,q);
-        return UtilMap.map("options",result);
+        String projectId = UtilMap.getString(param, "projectId");
+        String q = UtilMap.getString(param, "q");
+        String objectId = UtilMap.getString(param, "objectId");
+        List result = awClint.getProductList(projectId, q);
+        return UtilMap.map("options", result);
     }
 
     /**
@@ -305,11 +307,11 @@ public class TBxYDController {
     Map getProductVersionList(@RequestParam Map param) {
         System.out.println(JSONObject.toJSONString(param));
 //        String projectId="65f2855b5a2065ad7ad7d084";
-        String projectId=UtilMap.getString(param,"projectId");
-        String q=UtilMap.getString(param,"q");
-        String objectId=UtilMap.getString(param,"objectId");
-        List result=awClint.getProductList(projectId,q,objectId);
-        return UtilMap.map("options",result);
+        String projectId = UtilMap.getString(param, "projectId");
+        String q = UtilMap.getString(param, "q");
+        String objectId = UtilMap.getString(param, "objectId");
+        List result = awClint.getProductList(projectId, q, objectId);
+        return UtilMap.map("options", result);
     }
 
     //////// test ////////
@@ -368,6 +370,9 @@ public class TBxYDController {
     McR tmp(String programIds) {
 
 //        awClint.tmp();
-        return McR.success();
+
+        List<String> tags = tbClient.queryProjectTag("66c763a2a86f837e07c418e9", tbConf.getOperatorId());
+        tags.add("111");
+        return McR.success(tags);
     }
 }

+ 125 - 82
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java

@@ -49,7 +49,7 @@ public class AWImplClient implements AWClint {
     // 单据环境映射
     private String _matchFormUuid(String code) {
         Map<String, String> formUuid = UtilMap.empty();
-        if (UtilEnv.getActiveProfile().equals(UtilEnv.ENV_PROD)||UtilEnv.getActiveProfile().equals(UtilEnv.ENV_TEST)) {
+        if (true || UtilEnv.getActiveProfile().equals(UtilEnv.ENV_PROD) || UtilEnv.getActiveProfile().equals(UtilEnv.ENV_TEST)) {
             formUuid.put("DENTRY", "FORM-BD73A57B62EA4153B896C9BB3EA14D28GWSQ");                // 文件夹/文件版本记录
             formUuid.put("PERMISSION", "FORM-3380221DFDF84FBD8BCF503198294257TFWB");            // 文件夹权限
             formUuid.put("REVIEW", "FORM-812FD46AF391449A8F206EDB3221B38840UQ");                // 交付物审批记录
@@ -58,6 +58,7 @@ public class AWImplClient implements AWClint {
             formUuid.put("APPROVE", "FORM-A25299893F614A6EAA672514D3A76BB0QDBF");               // 交付物审批矩阵
             formUuid.put("CHECK", "FORM-1A5D4D7FBF88409B956EBE51F9342A6BKOLP");                 // 预检项
             formUuid.put("RECORD", "FORM-6E2C0D1197264B8AA23EB3FECAE7344B00BN");                // 预检项记录
+            formUuid.put("RTO", "FORM-DF879E2CC586467C97203B7F16733228Y2MN");                   // RTO检查项控
             formUuid.put("ROLE", "FORM-3C7396A12ADB48A8833EBD90089C93833R21");                  // 项目角色
             formUuid.put("ROLE_PDT", "FORM-69B6A8151F3346DCA20B0ED54F5380675LJX");              // PDT角色
             formUuid.put("CRM_LOG", "FORM-16DD578308E64763AE1539D8176CCCD0GX6F");               // crm推送日志
@@ -471,12 +472,39 @@ public class AWImplClient implements AWClint {
             } else {
                 rProject = pList.get(0);
                 String proType = UtilMap.getString(rProject, "textField_ltwcq7s6");
+                Map searchCondition = UtilMap.map("selectField_lrncf4hk, radioField_lrnddfq6", tCode, "启用");
+                /// prd 8.21 RTO 任务只需要查看 IC技术评审
+                if (tCode.contains("RTO-")) {
+                    searchCondition.put("selectField_lrnd3h0s", "IC技术检查表");
+                }
                 tList = ydService.queryFormData_all(YDParam.builder()
                         .formUuid(_matchFormUuid("CHECK"))
-                        .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lrncf4hk, radioField_lrnddfq6", tCode, "启用")))
+                        .searchFieldJson(JSON.toJSONString(searchCondition))
                         .build());
                 // prd 多模板适配: [任务号 + 项目类型]
                 tList = tList.stream().filter(item -> tCode.equals(item.get("selectField_lrncf4hk")) && UtilMap.getList(item, "multiSelectField_ltwjre9s").contains(proType)).collect(Collectors.toList());
+                /// prd 8.21 RTO任务关联技术检查项自动化处理
+                if (tCode.contains("RTO-")) {
+                    // 按照技术领域区分, 非必填
+                    List<Map> rtoList = ydService.queryDataList_FormData(_matchFormUuid("RTO"), UtilMap.map("selectField_lrncf4hk", tCode));
+                    rtoList = rtoList.stream().filter(item -> tCode.equals(item.get("selectField_lrncf4hk"))).collect(Collectors.toList());
+                    if (rtoList.size() == 1) {
+                        Map searchMap = UtilMap.map("radioField_lrnddfq6, textField_8n5ib3y", "启用", UtilMap.getString(rtoList.get(0), "textField_8n5ib3y"));
+                        List<Map> rtoCheck = ydService.queryFormData_all(YDParam.builder()
+                                .formUuid(_matchFormUuid("CHECK"))
+                                .searchFieldJson(JSON.toJSONString(searchMap))
+                                .build());
+                        List<String> nodes = UtilMap.getList(rtoList.get(0), "multiSelectField_ltejinaz");
+                        // 匹配评审点\项目类型\数据去重
+                        for (Map rCheck : rtoCheck) {
+                            if (nodes.contains(UtilMap.getString(rCheck, "textField_rfwx8lk")) &&
+                                    UtilMap.getList(rCheck, "multiSelectField_ltwjre9s").contains(proType) &&
+                                    !tList.stream().filter(row -> rCheck.get("textField_lrnd3h0r").equals(row.get("textField_lrnd3h0r"))).findAny().isPresent()) {
+                                tList.add(rCheck);
+                            }
+                        }
+                    }
+                }
                 if (tList.size() == 0) {
                     resultTitle = "未配置预检项";
                 } else {
@@ -642,6 +670,14 @@ public class AWImplClient implements AWClint {
                 if (!formData.get("textField_ltsdsti7").equals(projectMaps.get(0).get("textField_ltsdsti7"))) {
                     formData.put("src_state", formData.get("textField_ltsdsti7"));
                 }
+                /// 8.21 项目信息\项目重要性分级, 也添加差异同步, 避免新增字段历史项目不同步问题
+                if (!formData.get("textareaField_lrj7vnxl").equals(projectMaps.get(0).get("textareaField_lrj7vnxl"))) {
+                    formData.put("src_desc", formData.get("textareaField_lrj7vnxl"));
+                }
+                if (!formData.get("textField_lwj1r7n6").equals(projectMaps.get(0).get("textField_lwj1r7n6"))) {
+                    formData.put("src_level", formData.get("textField_lwj1r7n6"));
+                }
+
                 ydParam2.setFormInstanceId(String.valueOf(projectMaps.get(0).get("instanceId")));
                 ydClient.operateData(ydParam2, YDConf.FORM_OPERATION.update); // 主表为增量更新
                 // 保留tb项目号, 避免冲重复通过模板参加项目 [供新增用]
@@ -778,16 +814,21 @@ public class AWImplClient implements AWClint {
         if (StringUtils.isNotBlank(groupName)) {
             List<Map> tagList = tbClient.queryTagList(UtilMap.map("q", groupName));
             if (tagList.size() > 0) {
-                tbClient.updateProjectTag(projectId, Arrays.asList(UtilMap.getString(tagList.get(0), "id"), staffRoleId), tbConf.getOperatorId());
+                /// 更新项目分组, 不会保留原分组, 需要兼容
+                List<String> tags = tbClient.queryProjectTag(projectId, tbConf.getOperatorId());
+                tags.add(UtilMap.getString(tagList.get(0), "id"));
+                tbClient.updateProjectTag(projectId, tags, tbConf.getOperatorId());
             }
         }
         // prd 人员变更, 自动同步更新执行人: 仅触发存在执行人 & 未完成场景 [5.10 新增项目不执行, TB任务号宜搭回写有延迟, 避免异常]
         if (!isCreate) {
             updateProjectRole(projectId, Arrays.asList("全部", "自动更新"), "", "");
         }
-        // prd 5.23 更新项目概览信息
-        if (isCreate) {
+        // prd 5.23 更新项目概览信息 8.21 项目信息\项目重要性分级, 也添加差异同步, 避免新增字段历史项目不同步问题
+        if (UtilMap.isNotBlankString(formData, "src_desc")) {
             tbClient.updateProjectStatusField(projectId, tbConf.getOperatorId(), TBConf.assembleCustomFieldName("项目描述", UtilMap.getString(formData, "textareaField_lrj7vnxl")));
+        }
+        if (UtilMap.isNotBlankString(formData, "src_level")) {
             tbClient.updateProjectStatusField(projectId, tbConf.getOperatorId(), TBConf.assembleCustomFieldName("项目重要等级", UtilMap.getString(formData, "textField_lwj1r7n6")));
         }
         // 项目添加到项目集
@@ -1262,7 +1303,7 @@ public class AWImplClient implements AWClint {
                         .formUuid("FORM-B40420AFCDB84AD69FE78D82D6D5CFD2C2D2")
                         .build();
                 // 任务号, 描述, ID(标题), 任务名称, 适用项目类型
-                Map<String, ?> compIds2 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_ltzl9mpc, multiSelectField_ltwjre9s", "selectField_bclg9y5, textField_k1e08ji, textField_96ikaoh, textField_lsa0d856, multiSelectField_ltwjre9s");
+                Map<String, ?> compIds2 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_ltzl9mpc, multiSelectField_ltwjre9s, textField_8n5ib3y, textField_rfwx8lk", "selectField_bclg9y5, textField_k1e08ji, textField_96ikaoh, textField_lsa0d856, multiSelectField_ltwjre9s, textField_8n5ib3y, textField_rfwx8lk");
                 syncCheckList(ydParam2, compIds2, "selectField_bclg9y5", "textField_96ikaoh", "IC技术检查表", "associationFormField_lrrn5csg");
                 break;
 
@@ -1692,44 +1733,12 @@ public class AWImplClient implements AWClint {
         return dataList.stream().map(item -> {
             return item;
         }).collect(Collectors.toList());
-
-    }
-
-    @Override
-    public void test() {
-        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));
-
-//        String creatorUnionId = String.valueOf(ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), "095358016629044412").get("unionid"));
-//        List<Map> allMembers = ddClient_storage.queryDentryPermissions(ddClient.getAccessToken(), "14lgGw3P8vMDNPvMC7aw11LzJ5daZ90D", creatorUnionId, null);
-//        log.info("xxxx, {}", allMembers);
-//
-//        String taskId = "65addc57055591ee7d17d807";
-//        Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_APPROVE_LINK, AWServer.TASK_APPROVE_VERSION, AWServer.TASK_STAGE, AWServer.TASK_ROLE);
-//        List<Map> checkList = _getCustomFieldList(taskData, AWServer.TASK_APPROVE_LINK);
-
-//        checkList = new ArrayList<>();
-//        String url = "https://kabom7.aliwork.com/APP_H7WUJTKB448F9IBDC6C4/processDetail?formUuid=FORM-FBC1A390B4C348089020C763938A6F54RUNY&procInsId=5bd917c4-b23c-4f2f-ba4b-cef533118cdf&isAdmin=true&navConfig.layout=1180";
-//        String url = "https://kabom7.aliwork.com/APP_H7WUJTKB448F9IBDC6C4/submission/FORM-7B63BB056145452F8BC0A2C52492DE00QVBH?taskId=65addc57055591ee7d17d807";
-//        _updateApproveField(taskId, checkList, url, "技术检查项确认", "待提交", AWServer.TASK_APPROVE_LINK);
-
-    }
-
-    @Override
-    public void tmp() {
-//        this.tmp_617();
     }
 
     @Override
     public List<Map> getProductList(String projectId, String q) {
         // 获取主数据中产品列表
-        return getProductData(projectId,q,"textField_lhsxurnt",null);
+        return getProductData(projectId, q, "textField_lhsxurnt", null);
 
     }
 
@@ -1740,72 +1749,106 @@ public class AWImplClient implements AWClint {
         String tCode = UtilMap.getString(taskData, AWServer.TASK_PRODUCT);
         McException.assertAccessException(StringUtils.isBlank(tCode), "请先选择产品型号!");
         // 获取主数据中产品版本
-        return getProductData(projectId,q,"textField_lo2ludkv",tCode);
+        return getProductData(projectId, q, "textField_lo2ludkv", tCode);
     }
 
     @Override
     public void custFieldUpdate(JSONObject data) {
-        List<Map> list=tbClient.queryTaskDetail(data.getString("taskId"),"","");
-        McException.assertAccessException(list==null||list.size()<1, "未匹配到任务!");
-        Map rTask =list.get(0);
-        Map<String, String> proData = getProjectCFID(UtilMap.getString(rTask,"projectId"), Arrays.asList(AWServer.SELECT_TASK_PRODUCT, AWServer.SELECT_TASK_PRODUCT_VERSION));
-        if(data.getString("customfieldId").equals(proData.get(AWServer.SELECT_TASK_PRODUCT))){
+        List<Map> list = tbClient.queryTaskDetail(data.getString("taskId"), "", "");
+        McException.assertAccessException(list == null || list.size() < 1, "未匹配到任务!");
+        Map rTask = list.get(0);
+        Map<String, String> proData = getProjectCFID(UtilMap.getString(rTask, "projectId"), Arrays.asList(AWServer.SELECT_TASK_PRODUCT, AWServer.SELECT_TASK_PRODUCT_VERSION));
+        if (data.getString("customfieldId").equals(proData.get(AWServer.SELECT_TASK_PRODUCT))) {
             // 更新自定义字段--产品型号
             Map body = null;
-            if(data.getJSONArray("customfieldValue").size()<1){
-                body=TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT);
-            }else{
-                body=TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT, data.getJSONArray("customfieldValue").getJSONObject(0).getString("title"));
+            if (data.getJSONArray("customfieldValue").size() < 1) {
+                body = TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT);
+            } else {
+                body = TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT, data.getJSONArray("customfieldValue").getJSONObject(0).getString("title"));
             }
             tbClient.updateTaskCustomField(data.getString("taskId"), tbConf.getOperatorId(), body);
-        }else if(data.getString("customfieldId").equals(proData.get(AWServer.SELECT_TASK_PRODUCT_VERSION))){
+        } else if (data.getString("customfieldId").equals(proData.get(AWServer.SELECT_TASK_PRODUCT_VERSION))) {
             // 更新自定义字段--产品版本
             Map body = null;
-            if(data.getJSONArray("customfieldValue").size()<1){
-                body=TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT_VERSION);
-            }else{
-                body=TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT_VERSION, data.getJSONArray("customfieldValue").getJSONObject(0).getString("title"));
+            if (data.getJSONArray("customfieldValue").size() < 1) {
+                body = TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT_VERSION);
+            } else {
+                body = TBConf.assembleCustomFieldName(AWServer.TASK_PRODUCT_VERSION, data.getJSONArray("customfieldValue").getJSONObject(0).getString("title"));
             }
             tbClient.updateTaskCustomField(data.getString("taskId"), tbConf.getOperatorId(), body);
         }
     }
 
-    private List<Map> getProductData(String projectId,String q,String qKey,String tCode){
+    private List<Map> getProductData(String projectId, String q, String qKey, String tCode) {
         // 校验项目号
-        YDSearch ytbProjectId=new YDSearch("textField_lqxtykce",projectId,"TB项目编号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
-        List<Map> tbProjectList =(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-141E21DF183846028E21727CE43CD1C75CLZ")
+        YDSearch ytbProjectId = new YDSearch("textField_lqxtykce", projectId, "TB项目编号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
+        List<Map> tbProjectList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-141E21DF183846028E21727CE43CD1C75CLZ")
                 .appType("APP_R5EBUF2FPN3Y8DRF93M4").systemToken("ON566NC1VNIHPANP9TNVHB3TBIWS3E0TUZ5RLF3")
                 .searchCondition(JSONObject.toJSONString(Arrays.asList(ytbProjectId)))
                 .pageSize(10).build(), YDConf.FORM_QUERY.retrieve_list).getData();
 
-        McException.assertAccessException(tbProjectList==null||tbProjectList.size()<1, "未匹配到主数据!");
-        String pId=UtilMap.getString(UtilMap.getMap(tbProjectList.get(0),"formData"),"textField_lrj7vnxb");
+        McException.assertAccessException(tbProjectList == null || tbProjectList.size() < 1, "未匹配到主数据!");
+        String pId = UtilMap.getString(UtilMap.getMap(tbProjectList.get(0), "formData"), "textField_lrj7vnxb");
         McException.assertAccessException(StringUtils.isBlank(pId), "未匹配到主数据!");
 
-        YDSearch ydSearch=new YDSearch("textField_lha7mqbs","G","物料子类", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
-        YDSearch ydSearch2=new YDSearch("textField_lha7mqbn",pId,"项目号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
-        YDSearch ydSearch3=new YDSearch(qKey,q,"产品料号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.LIKE);
-        List qList=Arrays.asList(ydSearch,ydSearch2,ydSearch3);
-        if(tCode!=null){
-            YDSearch ydSearch4=new YDSearch("textField_lhsxurnt",tCode,"产品料号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
-            qList=Arrays.asList(ydSearch,ydSearch2,ydSearch3,ydSearch4);
+        YDSearch ydSearch = new YDSearch("textField_lha7mqbs", "G", "物料子类", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
+        YDSearch ydSearch2 = new YDSearch("textField_lha7mqbn", pId, "项目号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
+        YDSearch ydSearch3 = new YDSearch(qKey, q, "产品料号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.LIKE);
+        List qList = Arrays.asList(ydSearch, ydSearch2, ydSearch3);
+        if (tCode != null) {
+            YDSearch ydSearch4 = new YDSearch("textField_lhsxurnt", tCode, "产品料号", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ);
+            qList = Arrays.asList(ydSearch, ydSearch2, ydSearch3, ydSearch4);
         }
-        List<Map> list =(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-4W8667D17CAAGFXI9VO0J9J7RFNL2QDFL7AHLJ")
+        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-4W8667D17CAAGFXI9VO0J9J7RFNL2QDFL7AHLJ")
                 .appType("APP_QBWQITQBSPJNYTUTNPDK").systemToken("8F966HB12J27MQJM6V4IQDYHYTPA2G4GTZGCLN1")
                 .searchCondition(JSONObject.toJSONString(qList))
                 .pageSize(100).build(), YDConf.FORM_QUERY.retrieve_list).getData();
-        List<Map> result=new ArrayList<>();
-        Map<String,String> keyMap=new HashMap<>();
-        for (Map map:list){
-            String data=UtilMap.getString(UtilMap.getMap(map,"formData"),qKey);
-            if(!StringUtils.isBlank(data)&&!keyMap.containsKey(data)){
-                result.add(UtilMap.map("title",data));
-                keyMap.put(data,data);
+        List<Map> result = new ArrayList<>();
+        Map<String, String> keyMap = new HashMap<>();
+        for (Map map : list) {
+            String data = UtilMap.getString(UtilMap.getMap(map, "formData"), qKey);
+            if (!StringUtils.isBlank(data) && !keyMap.containsKey(data)) {
+                result.add(UtilMap.map("title", data));
+                keyMap.put(data, data);
             }
         }
         return result;
     }
 
+
+    /************************************* ------------------- *************************************/
+
+    @Override
+    public void test() {
+        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));
+
+        //        String creatorUnionId = String.valueOf(ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), "095358016629044412").get("unionid"));
+        //        List<Map> allMembers = ddClient_storage.queryDentryPermissions(ddClient.getAccessToken(), "14lgGw3P8vMDNPvMC7aw11LzJ5daZ90D", creatorUnionId, null);
+        //        log.info("xxxx, {}", allMembers);
+        //
+        //        String taskId = "65addc57055591ee7d17d807";
+        //        Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_APPROVE_LINK, AWServer.TASK_APPROVE_VERSION, AWServer.TASK_STAGE, AWServer.TASK_ROLE);
+        //        List<Map> checkList = _getCustomFieldList(taskData, AWServer.TASK_APPROVE_LINK);
+
+        //        checkList = new ArrayList<>();
+        //        String url = "https://kabom7.aliwork.com/APP_H7WUJTKB448F9IBDC6C4/processDetail?formUuid=FORM-FBC1A390B4C348089020C763938A6F54RUNY&procInsId=5bd917c4-b23c-4f2f-ba4b-cef533118cdf&isAdmin=true&navConfig.layout=1180";
+        //        String url = "https://kabom7.aliwork.com/APP_H7WUJTKB448F9IBDC6C4/submission/FORM-7B63BB056145452F8BC0A2C52492DE00QVBH?taskId=65addc57055591ee7d17d807";
+        //        _updateApproveField(taskId, checkList, url, "技术检查项确认", "待提交", AWServer.TASK_APPROVE_LINK);
+
+    }
+
+    @Override
+    public void tmp() {
+        //        this.tmp_617();
+    }
+
     /// tmp: 6.18 临时修改权限
     private void tmp618() {
         // 知识库返回根节点 rootNodeId, 即根目录的 dentryUuid, 可添加整个知识库编辑权限, 通过知识库创建者赋权
@@ -1846,14 +1889,14 @@ public class AWImplClient implements AWClint {
             }
             details = details.stream().filter(row -> !"IC技术检查表".equals(row.get("selectField_lrnd3h0s"))).collect(Collectors.toList());
             details.forEach(record -> {
-//                String tmp = ((List<Map<String, String>>) JSON.parse(String.valueOf(JSON.parse(String.valueOf(record.get("associationFormField_lrrnem5r_id")))))).get(0).get("title");
-//                if (tmp.startsWith("TR")) {
-//                    record.put("selectField_lrnd3h0s", "TR评审要素表");
-//                } else if (tmp.contains("-")) {
-//                    record.put("selectField_lrnd3h0s", "IC技术检查表");
-//                } else {
-//                    record.put("selectField_lrnd3h0s", "经验库");
-//                }
+                //                String tmp = ((List<Map<String, String>>) JSON.parse(String.valueOf(JSON.parse(String.valueOf(record.get("associationFormField_lrrnem5r_id")))))).get(0).get("title");
+                //                if (tmp.startsWith("TR")) {
+                //                    record.put("selectField_lrnd3h0s", "TR评审要素表");
+                //                } else if (tmp.contains("-")) {
+                //                    record.put("selectField_lrnd3h0s", "IC技术检查表");
+                //                } else {
+                //                    record.put("selectField_lrnd3h0s", "经验库");
+                //                }
                 if ("技术评审要素表".equals(record.get("selectField_lrnd3h0s"))) {
                     record.put("selectField_lrnd3h0s", "IC技术检查表");
                 }

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

@@ -57,10 +57,10 @@ dingtalk:
   token:
   operator: "095358016629044412"   # OA管理员账号
 
-#  aliwork
-aliwork:
-  appType: "APP_H7WUJTKB448F9IBDC6C4"
-  systemToken: "DHA66081DN6GRFNC6GTRW5NIJS082ZF0UN9PLLF"
+##  aliwork
+#aliwork:
+#  appType: "APP_H7WUJTKB448F9IBDC6C4"
+#  systemToken: "DHA66081DN6GRFNC6GTRW5NIJS082ZF0UN9PLLF"
 
 # teambition
 teambition:
@@ -69,10 +69,10 @@ teambition:
   TenantId: 6034c885e71842e1e5bb5218        # 管理后台 - 企业xx - 企业ID
   OperatorId: 5e698cca21f5ad70dfba7d2b      # 公共账号, 需要有操作权限 [牧语]
 
-## aliwork - prod
-#aliwork:
-#  appType: "APP_R5EBUF2FPN3Y8DRF93M4"
-#  systemToken: "ON566NC1VNIHPANP9TNVHB3TBIWS3E0TUZ5RLF3"
+# aliwork - prod
+aliwork:
+  appType: "APP_R5EBUF2FPN3Y8DRF93M4"
+  systemToken: "ON566NC1VNIHPANP9TNVHB3TBIWS3E0TUZ5RLF3"
 #
 ## dingtalk
 #dingtalk:

+ 1 - 0
mjava-aiwei/src/main/resources/application-test.yml

@@ -43,3 +43,4 @@ teambition:
   AppSecret: jyd7DVu3MGYwzt562qPmLAaacV65FIyQ
   TenantId: 658e7239b580fdc87e4a7ca4                # 管理后台 - 企业xx - 企业ID
   OperatorId: 667e8282df3131f8e588526e              # 公共账号, 需要有操作权限 [x]
+  ApiHost: https://tbtest.awinic.com:443/gateway        # 私有部署

+ 19 - 23
mjava-aiwei/src/test/java/com/malk/aiwei/AwTbTest.java

@@ -1,24 +1,20 @@
 package com.malk.aiwei;
 
 import com.alibaba.fastjson.JSONObject;
-import com.malk.aiwei.server.YDSearch;
-import com.malk.server.aliwork.YDConf;
-import com.malk.server.aliwork.YDParam;
-import com.malk.server.dingtalk.DDR_New;
 import com.malk.server.teambition.TBConf;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.teambition.TBClient;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.assertj.core.util.Strings;
 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;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 @Slf4j
 @SpringBootTest
@@ -31,17 +27,17 @@ public class AwTbTest {
     private TBConf tbConf;
 
     @Test
-    public void test(){
-        List<String> users=Arrays.asList("5f3a250040ce230ba377bf3c","5e698cca21f5ad70dfba7d2b","616fb6f78ad4104a10515809");
-        String programId ="662a69aceda740b4e63d3976";
+    public void test() {
+        List<String> users = Arrays.asList("5f3a250040ce230ba377bf3c", "5e698cca21f5ad70dfba7d2b", "616fb6f78ad4104a10515809");
+        String programId = "662a69aceda740b4e63d3976";
 //        tbClient.createProgramMember(programId,tbConf.getOperatorId(),users);
-        List addUsers=new ArrayList();
-        for (String userId:users){
-            List resut=tbClient.queryProgramMember(programId,tbConf.getOperatorId(), UtilMap.map("userIds", userId));
+        List addUsers = new ArrayList();
+        for (String userId : users) {
+            List resut = tbClient.queryProgramMember(programId, tbConf.getOperatorId(), UtilMap.map("userIds", userId));
             if (resut.size() < 1) addUsers.add(userId);
         }
-        log.info("需要添加到项目集的userId:{}",tbClient);
-        if (addUsers.size() > 0) tbClient.createProgramMember(programId,tbConf.getOperatorId(),addUsers);
+        log.info("需要添加到项目集的userId:{}", tbClient);
+        if (addUsers.size() > 0) tbClient.createProgramMember(programId, tbConf.getOperatorId(), addUsers);
     }
 
     @Autowired
@@ -52,9 +48,8 @@ public class AwTbTest {
     //    'yida_pub_account', "selectField_lchafcgt", "selectField_lchafcgt", "selectField_lywdbrk1", 100);
 
 
-
     @Test
-    public void adad(){
+    public void adad() {
 //        YDSearch ydSearch=new YDSearch("textField_lha7mqbs","G","物料子类", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
 //        YDSearch ydSearch2=new YDSearch("textField_lha7mqbn","A2443","项目号", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
 //        List<Map> list =(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-4W8667D17CAAGFXI9VO0J9J7RFNL2QDFL7AHLJ")
@@ -70,13 +65,14 @@ public class AwTbTest {
 //            }
 //        }
 //        print(result);
-        DDR_New ddr_new = ydClient.queryData(YDParam.builder()
-                .appType("APP_QBWQITQBSPJNYTUTNPDK").systemToken("8F966HB12J27MQJM6V4IQDYHYTPA2G4GTZGCLN1")
-                .pageSize(100)
-                .build(), YDConf.FORM_QUERY.retrieve_forms);
-        print(ddr_new);
+//        DDR_New ddr_new = ydClient.queryData(YDParam.builder()
+//                .appType("APP_QBWQITQBSPJNYTUTNPDK").systemToken("8F966HB12J27MQJM6V4IQDYHYTPA2G4GTZGCLN1")
+//                .pageSize(100)
+//                .build(), YDConf.FORM_QUERY.retrieve_forms);
+//        print(ddr_new);
     }
-    private void print(Object o){
+
+    private void print(Object o) {
         System.out.println(JSONObject.toJSONString(o));
     }
 

+ 2 - 0
mjava-cloudpure/src/main/java/com/malk/cloudpure/controller/TSController.java

@@ -172,6 +172,8 @@ public class TSController {
                     .appType("APP_ERBDTFS82HOVBPL3NFH0")
                     .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
                     .formInstanceId(UtilMap.getString(item, "formInstanceId"))
+                    .useLatestVersion(true)
+                    .updateFormDataJson(JSON.toJSONString(new HashMap<>()))
                     .build(), YDConf.FORM_OPERATION.update);
         });
     }

+ 54 - 0
mjava-ruisi/pom.xml

@@ -0,0 +1,54 @@
+<?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">
+    <parent>
+        <artifactId>java-mcli</artifactId>
+        <groupId>com.malk</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mjava-ruisi</artifactId>
+    <description>瑞思COS 投入对接企业账号</description>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>mjava</artifactId>
+            <version>${mjava.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                    <!-- 如果没有该配置,devtools不会生效: 打包时关闭 -->
+                    <fork>false</fork>
+                    <!-- 避免中文乱码 -->
+                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
+                </configuration>
+                <!-- 允许生成可运行jar -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+</project>

+ 32 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/Boot.java

@@ -0,0 +1,32 @@
+package com.malk.ruisi;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+import javax.persistence.EntityManager;
+
+/**
+ * corp项目: 扫描公共模块
+ * -
+ * 若是无需数据库模块, 配置无效地址也可启动, 引入mjava不支持直接 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 配置
+ * 需要配置 jpa.hibernate.ddl-auto 为 none. 标识对表没有任何操作. 若不设置为 none, flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+ */
+@EnableJpaAuditing
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+public class Boot {
+
+    public static void main(String... args) {
+        SpringApplication.run(Boot.class, args);
+    }
+
+    /**
+     * 让Spring管理JPAQueryFactory [不使用Qualifier详见mjava-Boot]
+     */
+    @Bean
+    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
+        return new JPAQueryFactory(entityManager);
+    }
+}

+ 89 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/controller/CosController.java

@@ -0,0 +1,89 @@
+package com.malk.ruisi.controller;
+
+/**
+ * 错误抛出与拦截详见 CatchException
+ */
+
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.common.McR;
+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.UtilMap;
+import com.malk.utils.UtilServlet;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping
+public class CosController {
+
+    @Autowired
+    private YDService ydService;
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private YDConf ydConf;
+
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+    @Autowired
+    private DDClient ddClient;
+
+
+    /**
+     * 创建企业账号: loginI/userId 都为 SHR 工号
+     */
+    private void createExclusiveUser(String loginId, String name) {
+
+        final long DEPT_ID = 965111354L;
+        final String PASS_WORD = "tzr@111111";
+
+        Map info = UtilMap.map("userid, email", loginId, "pruple_boy@163.com");
+        ddClient_contacts.createUser_dingTalk(ddClient.getAccessToken(), loginId, PASS_WORD, name, Arrays.asList(DEPT_ID), info);
+    }
+
+    /**
+     * 创建投资人用户
+     */
+    @PostMapping("user")
+    McR user(HttpServletRequest request) {
+        Map data = UtilServlet.getParamMap(request);
+        log.info("user, {}", data);
+
+        createExclusiveUser(UtilMap.getString(data, "jobNo"), UtilMap.getString(data, "name"));
+        return McR.success();
+    }
+
+    /**
+     * 重置密码流程
+     */
+    @PostMapping("reset")
+    McR dept(HttpServletRequest request) {
+
+        Map data = UtilServlet.getParamMap(request);
+        log.info("reset, {}", data);
+
+//        ddClient_contacts.updateUser_dingTalk(ddClient.getAccessToken(), userId, deptIds, UtilMap.map("dept_title_list", titles));
+
+        return McR.success();
+    }
+
+    @PostMapping("test")
+    McR test() {
+
+        return McR.success();
+    }
+}

+ 64 - 0
mjava-ruisi/src/main/resources/application-dev.yml

@@ -0,0 +1,64 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api/ruisi
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 主库
+    primary:
+      username: root
+      password: mu123
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 从库
+    slave:
+      username: root
+      password: mu123
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: "3079562924"
+  appKey: "dingprswtas7kluqst2c"
+  appSecret: "ukquGx_DjznsTQtKQtFFNutn1NFhSgL9ZbTfCtl_9mJYWacFYu--vj_zThTxjsYN"
+  corpId: "dingccd7fff754e440cf24f2f5cc6abecb85"
+  aesKey:
+  token:
+  operator:           # OA管理员账号 [首字符若为0需要转一下字符串]
+
+# aliwork
+aliwork:
+  appType: "APP_VCTRP6227CC8368NDOID"
+  systemToken: "5H9662C1X8XJLFFCE841M5VBEBQ73DM5IBPULPI3"
+

+ 38 - 0
mjava-ruisi/src/main/resources/application-prod.yml

@@ -0,0 +1,38 @@
+# 环境配置
+server:
+  port: 9031
+  servlet:
+    context-path: /api/ruisi
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# dingtalk
+dingtalk:
+  agentId: "3079562924"
+  appKey: "dingprswtas7kluqst2c"
+  appSecret: "ukquGx_DjznsTQtKQtFFNutn1NFhSgL9ZbTfCtl_9mJYWacFYu--vj_zThTxjsYN"
+  corpId: "dingccd7fff754e440cf24f2f5cc6abecb85"
+  aesKey:
+  token:
+  operator:           # OA管理员账号 [首字符若为0需要转一下字符串]
+
+# aliwork
+aliwork:
+  appType: "APP_VCTRP6227CC8368NDOID"
+  systemToken: "5H9662C1X8XJLFFCE841M5VBEBQ73DM5IBPULPI3"

+ 39 - 0
mjava-ruisi/src/test/resource/server.sh

@@ -0,0 +1,39 @@
+#!/bin/bash
+
+appname='mjava-ruisi'
+
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+    tail -f log/info.log
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+      tail -f log/info.log
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 0 - 1
mjava/src/main/java/com/malk/base/BaseDto.java

@@ -96,7 +96,6 @@ public abstract class BaseDto {
         return formData;
     }
 
-
     /**
      * Map时间格式化, 直接从数据库取值后Map会有市区差, 方法1见BasePo, @Temporal & @JsonFormat 注解
      * -

+ 1 - 0
mjava/src/main/java/com/malk/server/common/VenR.java

@@ -31,6 +31,7 @@ public class VenR extends BaseDto {
     public static final String RC_FXK = "com.malk.server.fxiaoke.FXKR ";
     public static final String RC_XBB = "com.malk.server.xbongbong.XBBR";
     public static final String RC_VK = "com.malk.server.vika.VKR";
+    public static final String RC_TB = "com.malk.server.teambition.TBR";
 
     /**
      * 通用post请求

+ 5 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Contacts.java

@@ -248,6 +248,11 @@ public class DDImplClient_Contacts implements DDClient_Contacts {
         return (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/v2/user/create", null, param, body).getResult();
     }
 
+    /**
+     * 更新钉钉自建企业账号
+     *
+     * @apiNote https://open.dingtalk.com/document/orgapp/update-dedicated-accounts-information
+     */
     @Override
     public Map updateUser_dingTalk(String access_token, String userId, List<Long> dept_id_list, Map body_ext) {
         Map param = UtilMap.map("access_token", access_token);

+ 11 - 2
mjava/src/main/java/com/malk/service/teambition/TBClient.java

@@ -74,6 +74,15 @@ public interface TBClient {
      */
     Map projectUpdate(String projectId, Map<String, String> data, String operatorId);
 
+
+    /**
+     * 查看项目的项目分组 [ fixme 更新项目分组, 不会保留原分组, 若兼容需要先查询 ]
+     *
+     * @apiNote https://open.teambition.com/docs/apis/6321c6d0912d20d3b5a49a2e
+     */
+    List<String> queryProjectTag(String projectId, String operatorId);
+
+
     /**
      * 更新项目的项目分组 [ ppExt: 若修改分组相同, 不返回204, 会报错400, 已兼容 ]
      *
@@ -284,14 +293,14 @@ public interface TBClient {
      *
      * @apiNote https://open.teambition.com/docs/apis/66693d96912d20d3b5ee560b
      */
-    Map createProgramMember(String programId , String operatorId, List<String> users);
+    Map createProgramMember(String programId, String operatorId, List<String> users);
 
     /**
      * 查询项目集内成员
      *
      * @apiNote https://open.teambition.com/docs/apis/66693d96912d20d3b5ee5737
      */
-    List<Map> queryProgramMember(String programId , String operatorId, Map body);
+    List<Map> queryProgramMember(String programId, String operatorId, Map body);
 
     /**
      * 查询全部数据 [函数回调]

+ 7 - 1
mjava/src/main/java/com/malk/service/teambition/impl/TBClientImpl.java

@@ -121,6 +121,12 @@ public class TBClientImpl implements TBClient {
         return (List<Map>) tbr.getResult();
     }
 
+    @Override
+    public List<String> queryProjectTag(String projectId, String operatorId) {
+        TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project/" + projectId + "/project-tag", initHeaderToken(operatorId), null, TBR.class);
+        return (List<String>) tbr.getResult();
+    }
+
     @Override
     public Map projectUpdate(String projectId, Map<String, String> data, String operatorId) {
         TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/v3/project/" + projectId, initHeaderToken(operatorId), data, TBR.class);
@@ -389,7 +395,7 @@ public class TBClientImpl implements TBClient {
 
     @Override
     public Map createProgramMember(String programId, String operatorId, List<String> users) {
-        Map body=UtilMap.map("userIds",users);
+        Map body = UtilMap.map("userIds", users);
         TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/program/" + programId + "/member/create", initHeaderToken(operatorId), body, TBR.class);
         return (Map) tbr.getResult();
     }

+ 11 - 0
mjava/src/main/java/com/malk/utils/UtilList.java

@@ -85,4 +85,15 @@ public abstract class UtilList {
             return data;
         }).collect(Collectors.toList());
     }
+
+    /// 判定集合是否包含另一个集合任一元素
+    public static boolean isContainsOne(List<String> oneList, List<String> otherList) {
+        for (String one : otherList) {
+            boolean contains = oneList.contains(one);
+            if (contains) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

+ 1 - 0
pom.xml

@@ -31,6 +31,7 @@
         <module>mjava-dongfangxinhua</module>
         <module>mjava-aiwei</module>
         <module>mjava-lemeng</module>
+        <module>mjava-ruisi</module>
     </modules>
     <packaging>pom</packaging>