소스 검색

艾为项目分组

pruple_boy 1 년 전
부모
커밋
69d7c2f4f5

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

@@ -16,6 +16,7 @@ import com.malk.service.teambition.TBClient;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -23,6 +24,7 @@ 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.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -202,7 +204,7 @@ public class TBxYDController {
     @GetMapping("tmp")
     McR tmp() {
 
-        String projectId = "659376ba950780b816c33d3b";
+        String projectId = "65bb77bb530c668c1a82754b";
 
 //        tbClient.queryGanttBaseline(projectId, null);
 //        String cfid = getProjectCFID(projectId, Arrays.asList(AWServer.TASK_CODE)).get(AWServer.TASK_CODE);
@@ -211,7 +213,16 @@ public class TBxYDController {
 //        tbClient.queryProjectRoles(projectId)
 //        tbClient.queryProjectMember(projectId, null);
 
-        awClint.test();
+//        awClint.test();
+
+
+        String groupName = "LQ";
+        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")), tbConf.getOperatorId());
+            }
+        }
         return McR.success();
     }
 }

+ 39 - 26
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java

@@ -50,6 +50,7 @@ public class AWImplClient implements AWClint {
             formUuid.put("ROLE", "FORM-3C7396A12ADB48A8833EBD90089C93833R21"); // 项目角色
             formUuid.put("DOMAIN", "https://yida.awinic.com/"); // 宜搭域名
         } else {
+            // [ ppExt: 测试环境添加主数据, 匹配不同架构下企业成员 ]
             formUuid.put("REVIEW", "FORM-FBC1A390B4C348089020C763938A6F54RUNY");
             formUuid.put("REVIEW_PROCESS", "TPROC--YU966T91PIDH4XDR82OJC8GVOP7Z19PODTXQL6");
             formUuid.put("PROJECT", "FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI");
@@ -180,7 +181,7 @@ public class AWImplClient implements AWClint {
     @Autowired
     private DDConf ddConf;
 
-    // 获取任务详情 todo 提取到 tbservice
+    // 获取任务详情 fixme 提取到 tbservice
     private Map _getTaskFieldMap(String taskId, String... fieldNames) {
 
         Map rTask = tbClient.queryTaskDetail(taskId, null, null).get(0);
@@ -211,7 +212,7 @@ public class AWImplClient implements AWClint {
         return String.valueOf(customFlowStatus.get(0).get("id"));
     }
 
-    // 前置过滤 todo 提取方法
+    // 前置过滤 fixme 提取方法
     List<String> _getWorkFlowStatusList(String projectId, String... workFlowStatusNames) {
         List<String> workFlowStatusList = new ArrayList<>();
         for (String name : workFlowStatusNames) {
@@ -221,7 +222,7 @@ public class AWImplClient implements AWClint {
         return workFlowStatusList;
     }
 
-    // 后置过滤 todo 提取方法
+    // 后置过滤 fixme 提取方法
     List<String> _getWorkFlowStatusList(String projectId, List<String> workFlowStatusNames) {
         //List<String> names = Arrays.stream(workFlowStatusNames).collect(Collectors.toList());
         List<Map> customFlowStatus = tbClient.queryProjectCustomFlowStatus(projectId, null);
@@ -313,7 +314,7 @@ public class AWImplClient implements AWClint {
         Map formData = UtilMap.map("selectField_lqxuswzd, textField_lrndwu00, textField_lr3dlwsa, textField_lr3er4qb", tCode, pCode, taskId, creatorId);
         // 项目信息
         formData.putAll(UtilMap.map("selectField_lqxuswze, textField_lrndwu07, textField_lqxuc9m4", UtilMap.getString(rProject, "textField_lrj7vnxb"), UtilMap.getString(rProject, "textareaField_lrj7vnxl"), UtilMap.getString(rProject, "textField_lqxtykcd")));
-        // 任务信息 todo  userInfo 取值
+        // 任务信息 [TBManager 操作]
         Map<String, String> extra = (Map) tbClient.idMapQuery(creatorId, "dingTalk-user", ddConf.getCorpId()).get(0).get("extra");
         formData.putAll(UtilMap.map("textField_lrndwu09, textField_lrndwu0a, textField_lrndwu0b, employeeField_lrndwu0e", rTask.get("content"), taskData.get(AWServer.TASK_STAGE), taskData.get(AWServer.TASK_ROLE), Arrays.asList(UtilMap.map("value, name", extra.get("userId"), extra.get("userId")))));
         // 返回检查项
@@ -348,7 +349,6 @@ public class AWImplClient implements AWClint {
         // 新增场景下, 提供实例ID回写TB项目编号
         Map formData = null;
 
-        // fixme: test生产环境, 人员组件不能同步, 更新后人员会为空. todo 测试环境建立模拟项目主数据单据
         // 查询项目主数据 [艾为应用]
         YDParam ydParam = YDParam.builder()
                 .appType("APP_QBWQITQBSPJNYTUTNPDK")
@@ -365,7 +365,6 @@ public class AWImplClient implements AWClint {
         }
         log.info("项目主数据, {}", mapBaseList.size());
         McException.assertAccessException(mapBaseList.isEmpty(), "未匹配项目主数据");
-
         // 查询项目角色
         YDParam ydParam1 = YDParam.builder()
                 .formUuid(_matchFormUuid("ROLE"))
@@ -376,11 +375,15 @@ public class AWImplClient implements AWClint {
         for (Map baseFormData : mapBaseList) {
             // 项目主数据
             formData = new HashMap();
-            formData.put("textField_lqxtykcd", baseFormData.get("textField_lo2c1f0l"));      //项目名称
-            formData.put("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0"));      //项目号
-            formData.put("textField_lrj7vnxc", baseFormData.get("textField_le6o88w1"));      //项目简称
-            formData.put("textareaField_lrj7vnxl", baseFormData.get("textField_le6o88w2"));  //项目描述
-            formData.put("textField_lrj7vnxf", baseFormData.get("formInstanceId"));          //项目实例ID
+            formData.put("textField_lqxtykcd", baseFormData.get("textField_lo2c1f0l"));      // 项目名称
+            formData.put("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0"));      // 项目号
+            formData.put("textField_lrj7vnxc", baseFormData.get("textField_le6o88w1"));      // 项目简称
+            formData.put("textareaField_lrj7vnxl", baseFormData.get("textField_le6o88w2"));  // 项目描述
+            formData.put("textField_lrj7vnxf", baseFormData.get("formInstanceId"));          // 项目实例ID
+            formData.put("textField_ltsdsti6", baseFormData.get("textField_libg2ea8"));      // PDT (项目分组)
+            formData.put("textField_ltsdsti7", baseFormData.get("textField_llouhiyf"));      // 项目状态
+            formData.put("textField_ltsdsti8", baseFormData.get("textField_lo2c1f0r"));      // mPDT
+            formData.put("textField_ltsdsti9", baseFormData.get("textField_lki3egzn"));      // Charter子类
             // 项目角色详情
             List<Map> details = new ArrayList<>();
             mapRool.forEach(root -> {
@@ -393,11 +396,9 @@ public class AWImplClient implements AWClint {
                 }
             });
             formData.put("tableField_lqxtykcf", details);
-
             // 通过项目号获取项目是否已存在
             List<Map> projectMaps = ydService.queryDataList_FormData(_matchFormUuid("PROJECT"), UtilMap.map("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0")));
             projectMaps = projectMaps.stream().filter(sub -> baseFormData.get("textField_le6o88w0").equals(sub.get("textField_lrj7vnxb"))).collect(Collectors.toList());
-
             YDParam ydParam2 = YDParam.builder()
                     .formUuid(_matchFormUuid("PROJECT"))
                     .formDataJson(JSON.toJSONString(formData))
@@ -406,25 +407,29 @@ public class AWImplClient implements AWClint {
                     .build();
             if (projectMaps.size() > 0) {
                 ydParam2.setFormInstanceId(String.valueOf(projectMaps.get(0).get("instanceId")));
-                ydClient.operateData(ydParam2, YDConf.FORM_OPERATION.update);
-                // 保留tb项目号, 避免冲重复通过模板参加项目
+                ydClient.operateData(ydParam2, YDConf.FORM_OPERATION.update); // 主表为增量更新
+                // 保留tb项目号, 避免冲重复通过模板参加项目 [供新增用]
                 formData.put("textField_lqxtykce", UtilMap.getString(projectMaps.get(0), "textField_lqxtykce"));
                 formData.put("formInstanceId", projectMaps.get(0).get("instanceId"));
             } else {
                 String formInstId = (String) ydClient.operateData(ydParam2, YDConf.FORM_OPERATION.create);
                 formData.put("formInstanceId", formInstId);
             }
-            log.info("同步项目主数据", projectCode);
-        }
-        // tb项目成员更新
-        String projectId = UtilMap.getString(formData, "textField_lqxtykce");
-        if (StringUtils.isBlank(projectId) && StringUtils.isBlank(projectCode)) {
-            _syncProjectRole(formData, projectId);
+            // tb项目成员更新 [兼容存量创建项目, 被删除后执行异常]
+            String projectId = UtilMap.getString(formData, "textField_lqxtykce");
+            if (StringUtils.isNotBlank(projectId) && StringUtils.isBlank(projectCode)) {
+                try {
+                    _syncProjectRole(formData, projectId);
+                } catch (Exception e) {
+                    // 记录错误信息
+                    e.printStackTrace();
+                }
+            }
+            log.info("同步项目主数据, code = {}, id = {}", projectCode, projectCode);
         }
         return formData;
     }
 
-
     @Autowired
     private TBConf tbConf;
 
@@ -454,7 +459,7 @@ public class AWImplClient implements AWClint {
         _syncProjectRole(formData, projectId);
     }
 
-    // 同步TB项目成员 todo 群成员
+    // 同步TB项目成员/项目分组 todo 群成员
     void _syncProjectRole(Map formData, String projectId) {
         // prd TB项目成员, 项目经理设置为管理者
         List<String> pmUserId = new ArrayList<>();
@@ -490,10 +495,18 @@ public class AWImplClient implements AWClint {
         if (!pmUserId.isEmpty()) {
             tbClient.updateProjectMember(_convertUserId(pmUserId, false), Arrays.asList(pmRoleId), projectId);
         }
+        // 同步项目分组 [prd 主数据建立产品与分组对照表,绑定末级分类接口,若未匹配则不添加]
+        String groupName = UtilMap.getString(formData, "textField_ltsdsti6");
+        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")), tbConf.getOperatorId());
+            }
+        }
         log.info("TB项目信息, {}, {}", projectId, roleIds.size());
     }
 
-    // todo 提取方法, 参考 getProjectCFID 实现
+    // fixme 提取方法, 参考 getProjectCFID 实现
     private String _getProjectRoleId(String projectId, String roleName) {
         List<Map> roles = tbClient.queryProjectRoles(projectId);
         Optional optional = roles.stream().filter(item -> roleName.equals(item.get("name"))).findAny();
@@ -593,7 +606,7 @@ public class AWImplClient implements AWClint {
         });
     }
 
-    // TB与宜搭userId转换 todo 提取 tbService
+    // TB与宜搭userId转换 fixme 提取 tbService
     private String _convertUserId(String userId, boolean isTBID) {
         List<Map> tbMap = tbClient.idMapQuery(userId, isTBID);
         // 过滤未匹配人员信息 [ppExt: TB人员未匹配, 不执行修改也无报错]
@@ -609,7 +622,7 @@ public class AWImplClient implements AWClint {
         }
     }
 
-    // TB与宜搭userId转换 todo 提取 tbService
+    // TB与宜搭userId转换 fixme 提取 tbService
     private List<String> _convertUserId(List<String> userIds, boolean isTBID) {
         return userIds.stream().distinct()
                 .map(id -> _convertUserId(id, isTBID))

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

@@ -57,7 +57,7 @@ dingtalk:
   token:
   operator: ""   # OA管理员账号
 
-# aliwork
+## aliwork
 aliwork:
   appType: "APP_H7WUJTKB448F9IBDC6C4"
   systemToken: "DHA66081DN6GRFNC6GTRW5NIJS082ZF0UN9PLLF"
@@ -79,7 +79,7 @@ teambition:
 #  token:
 #  operator: ""   # OA管理员账号
 
-## aliwork
+# aliwork
 #aliwork:
 #  appType: "APP_R5EBUF2FPN3Y8DRF93M4"
 #  systemToken: "ON566NC1VNIHPANP9TNVHB3TBIWS3E0TUZ5RLF3"

+ 0 - 9
mjava-hake/src/main/java/com/malk/hake/service/impl/HKImplClient.java

@@ -73,15 +73,6 @@ public class HKImplClient implements HKClient {
                 formData.put(key, details);
             } else {
                 Object value = data.get(component.get(key));
-                // prd 3.5 销售订单审批和通知里面有个reason字段
-                if ("numberField_lnmyrzwx".equals(key)) {
-                    if ("0".equals(value)) {
-                        value = "价格变更";
-                    }
-                    if ("1".equals(value)) {
-                        value = "数量或交期变更";
-                    }
-                }
                 formData.put(key, value);
             }
         }

+ 23 - 1
mjava/src/main/java/com/malk/service/teambition/TBClient.java

@@ -20,6 +20,7 @@ public interface TBClient {
      * @param query 用户名、用户拼音、用户名简拼、邮箱、手机号码 [实测 name, email, phone 有效; pinyin, py 无效, 且这两个字段在个人信息页面不透出]
      * @apiNote https://open.teambition.com/help/docs/5eb5431141b191001bcda95c
      */
+    @Deprecated
     List<Map> userSearch(String query);
 
     /**
@@ -70,6 +71,13 @@ public interface TBClient {
      */
     Map projectUpdate(String projectId, Map<String, String> data, String operatorId);
 
+    /**
+     * 更新项目的项目分组 [ ppExt: 若修改分组相同, 不返回204, 会报错400, 已兼容 ]
+     *
+     * @apiNote https://open.teambition.com/docs/apis/6321c6d0912d20d3b5a49a5c
+     */
+    Map updateProjectTag(String projectId, List<String> projectTagIds, String operatorId);
+
     /**
      * 创建项目成员 [新版本] ppExt: 成员ID不能为空\不能重复, 重复创建会增量更新但不会删除成员
      *
@@ -77,7 +85,6 @@ public interface TBClient {
      */
     List<Map> createProjectMember(String projectId, List<String> userIds, String operatorId);
 
-
     /**
      * 获取项目角色列表
      *
@@ -207,6 +214,21 @@ public interface TBClient {
      */
     List<Map> queryGanttBaseline(String projectId, Map body);
 
+    /**
+     * 查询项目分组 [ppExt: TB分组有继承关系,传递当前最后一层即可]
+     *
+     * @apiNote https://open.teambition.com/docs/apis/6321c6d1912d20d3b5a4a2c7
+     */
+    List<Map> queryTagList(Map param);
+
+    /**
+     * 修改项目分组
+     *
+     * @apiNote https://open.teambition.com/docs/apis/6363bcfb912d20d3b56fb36f
+     */
+    Map updateTag(String projectTagId, Map param);
+
+
     /**
      * 查询全部数据 [函数回调]
      * - ppExt -

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

@@ -2,6 +2,7 @@ package com.malk.service.teambition.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.auth0.jwt.algorithms.Algorithm;
+import com.malk.server.common.McException;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.teambition.TBConf;
 import com.malk.server.teambition.TBR;
@@ -125,6 +126,24 @@ public class TBClientImpl implements TBClient {
         return (Map) tbr.getResult();
     }
 
+    @Override
+    public Map updateProjectTag(String projectId, List<String> projectTagIds, String operatorId) {
+        Map body = UtilMap.map("projectTagIds", projectTagIds);
+        Map result = null;
+        try {
+            TBR tbr = (TBR) UtilHttp.doPut(tbConf.getApiHost() + "/v3/project/" + projectId + "/project-tag", initHeaderToken(operatorId), body, TBR.class);
+            result = (Map) tbr.getResult();
+        } catch (McException e) {
+            // ppExt: 若修改分组相同, 不返回204, 会报错400, 已兼容
+            if (!"400".equals(e.getCode())) {
+                // 记录错误信息
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    @Deprecated
     @Override
     public List<Map> userSearch(String query) {
         Map param = UtilMap.map("orgId, query, pageSize", tbConf.getTenantId(), query, TBConf.PAGE_SIZE_LIMIT);
@@ -286,7 +305,21 @@ public class TBClientImpl implements TBClient {
     @Override
     public List<Map> queryGanttBaseline(String projectId, Map body) {
         body = UtilMap.put(body, "pageSize", TBConf.PAGE_SIZE_LIMIT);
-        TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/gantt/baseline", initHeaderToken(), UtilMap.map("projectId", projectId), TBR.class);
+        body.put("projectId", projectId);
+        TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/gantt/baseline", initHeaderToken(), body, TBR.class);
+        return (List<Map>) tbr.getResult();
+    }
+
+    @Override
+    public List<Map> queryTagList(Map param) {
+        param = UtilMap.put(param, "pageSize", TBConf.PAGE_SIZE_LIMIT);
+        TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project-tag/query", initHeaderToken(), param, TBR.class);
         return (List<Map>) tbr.getResult();
     }
+
+    @Override
+    public Map updateTag(String projectTagId, Map param) {
+        TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project-tag/" + projectTagId, initHeaderToken(), param, TBR.class);
+        return (Map) tbr.getResult();
+    }
 }