lfx 11 månader sedan
förälder
incheckning
79a78b7c5d

+ 13 - 1
src/main/java/com/muzhi/tianhe/controller/TBCallBackController.java

@@ -50,8 +50,20 @@ public class TBCallBackController {
             log.info("[TB]任务回调, {}, {}", eventName, eventJson);
             if(EVENT_NAME.contains(eventName)){
                 String taskId=eventJson.getJSONObject("data").getString("taskId");
+                String type;
+                switch (eventName){
+                    case "v3.task.customfield.update":
+                        type="1";
+                        break;
+                    case "v3.task.create":
+                        type="2";
+                        break;
+                    default:
+                        type="0";
+                        break;
+                }
                 try {
-                    thTbService.task(taskId);
+                    thTbService.task(taskId,type,eventJson.getJSONObject("data"));
                 }catch (Exception e){
                     e.printStackTrace();
                     log.error("回调执行出错!");

+ 3 - 1
src/main/java/com/muzhi/tianhe/service/ThTbService.java

@@ -1,8 +1,10 @@
 package com.muzhi.tianhe.service;
 
+import com.alibaba.fastjson.JSONObject;
+
 public interface ThTbService {
 
-    void task(String taskId);
+    void task(String taskId, String type, JSONObject data);
 
     void taskLink(String taskId,String linkedId);
 

+ 23 - 0
src/main/java/com/muzhi/tianhe/service/impl/TbApiService.java

@@ -177,6 +177,20 @@ public class TbApiService {
         return result.getJSONArray("result");
     }
 
+    public JSONObject addTaskLinks(String taskId,String title,String url,String linkedId){
+        Map map=new HashMap();
+        Map data=new HashMap();
+        data.put("title",title);
+        data.put("url",url);
+        map.put("linkedData",data);
+        map.put("linkedId",linkedId);
+        map.put("linkedType","task");
+        JSONObject result=header(HttpUtil.createPost(PRIVATE_API_URL + "/v3/task/"+ taskId +"/objectlinks")
+                .body(JSONObject.toJSONString(map))
+                .header("x-operator-id",tbOperatorId));
+        return result.getJSONObject("result");
+    }
+
     public Object updateTaskContent(String taskId,String content){
         Map map=new HashMap();
         map.put("content",content);
@@ -204,6 +218,15 @@ public class TbApiService {
                 .body(JSONObject.toJSONString(map)));
         return result;
     }
+    public Object updateTaskCustomfield(String taskId,String customfieldId,JSONArray value){
+        Map map=new HashMap();
+        map.put("customfieldId",customfieldId);
+        map.put("value", value);
+        JSONObject result=header(HttpRequest.post(PRIVATE_API_URL + "/v3/task/{taskId}/customfield/update".replace("{taskId}",taskId))
+                .header("x-operator-id",tbOperatorId)
+                .body(JSONObject.toJSONString(map)));
+        return result;
+    }
 
     public JSONObject addTask(JSONObject param){
         JSONObject result=header(HttpRequest.post(PRIVATE_API_URL + "/v3/task/create")

+ 80 - 31
src/main/java/com/muzhi/tianhe/service/impl/ThTbServiceImpl.java

@@ -20,7 +20,7 @@ public class ThTbServiceImpl implements ThTbService {
 
 
     @Override
-    public void task(String taskId) {
+    public void task(String taskId,String type,JSONObject data) {
         JSONObject task=tbApiService.getTasksInfo(taskId).getJSONObject(0);
         String projectId=task.getString("projectId");
         // 先判断项目分组
@@ -42,37 +42,28 @@ public class ThTbServiceImpl implements ThTbService {
         JSONObject taskType=((JSONObject) optional.get());
         String name=taskType.getString("name");
         String tfid=taskType.getString("taskflowId");
-        if(name.contains("变更")){
-            log.info("变更流程");
-            taskChange(task,taskId);
-        }else if(name.contains("任务取消")){
-            // 2024.6.5跟小燕沟通后调整为取消
-            log.info("任务取消");
-//            taskCancel(task,taskId);
-        }else if(name.contains("新增流程")){
-            // 2024.6.5跟小燕沟通后调整为取消
-            log.info("新增流程");
-//            String newName;
-//            if(name.contains("一级")){
-//                newName="一级任务";
-//            }else if(name.contains("二级")){
-//                newName="二级任务";
-//            }else if(name.contains("三级")){
-//                newName="三级任务";
-//            }else{
-//                log.error("任务类型名称判断异常:{}",name);
-//                return;
-//            }
-//            Optional optional2 = list.stream().filter(item -> newName.equals(item.get("name"))).findAny();
-//            JSONObject newTaskType=((JSONObject) optional2.get());
-//            taskAdd(task,taskId,newTaskType);
-        }else if(name.equals("年度指标")){
-            log.info("年度指标");
-            updateTaskState(task,tfid);
-        }else{
-            log.info("任务 {} 任务类型:{} 非期望类型任务 不处理",task.getString("content"),name);
+        if(type.equals("0")){
+            if(name.contains("变更")){
+                log.info("变更流程");
+                taskChange(task,taskId);
+            }else if(name.equals("年度指标")){
+                log.info("年度指标");
+                updateTaskState(task,tfid);
+            }else{
+                log.info("任务 {} 任务类型:{} 非期望类型任务 不处理",task.getString("content"),name);
+            }
+        }else if(type.equals("1")){
+            // 任务自定义字段变更
+            if(name.contains("级任务")){
+                taskCustChange(task,data);
+            }
+        }else if(type.equals("2")){
+            // 任务新增
+            if(name.contains("变更")){
+                log.info("新增变更流程任务");
+                creatChangeTask(task,name);
+            }
         }
-
     }
 
     @Override
@@ -343,4 +334,62 @@ public class ThTbServiceImpl implements ThTbService {
         JSONObject tfsnext=tbApiService.getProjectStateId(projectId,tfsName,tfid,"").getJSONObject(0);
         tbApiService.updateTaskStatus(taskId,tfsnext.getString("id"));
     }
+
+    // 任务自定义字段变更
+    public void taskCustChange(JSONObject task,JSONObject data){
+        String projectId=task.getString("projectId");// 项目ID
+        String customfieldId=data.getString("customfieldId");// 变更的自定义字段ID
+        JSONArray array=data.getJSONArray("customfieldValue");// 负责人
+        Map<String,String> projectCusts=new HashMap<>();
+        List<JSONObject> list=tbApiService.getProjectCustomfield(projectId).toJavaList(JSONObject.class);
+        list.forEach(item -> projectCusts.put(item.getString("name"),item.getString("id")));
+        if(!customfieldId.equals(projectCusts.get("责任人"))){
+            return;
+        }
+        String cid=projectCusts.get("上级任务责任人");
+        JSONArray tasks=tbApiService.getTasksByParent(task.getString("id"));
+        for (int i = 0; i < tasks.size(); i++) {
+            JSONObject taskDetail=tasks.getJSONObject(i);
+            String id=taskDetail.getString("id");
+            tbApiService.updateTaskCustomfield(id,cid,array);
+        }
+    }
+
+    public void creatChangeTask(JSONObject task,String name){
+        String projectId=task.getString("projectId");// 项目ID
+        // 查询项目自定义字段
+        Map<String,String> projectCusts=new HashMap<>();
+        List<JSONObject> list=tbApiService.getProjectCustomfield(projectId).toJavaList(JSONObject.class);
+        list.forEach(item -> projectCusts.put(item.getString("name"),item.getString("id")));
+        // 查询任务中的自定义字段值
+        Map<String,JSONArray> taskCustValues=new HashMap<>();
+        List<JSONObject> custs=task.getJSONArray("customfields").toJavaList(JSONObject.class);
+        custs.forEach(item -> taskCustValues.put(item.getString("cfId"),item.getJSONArray("value")));
+        String linkUrl=taskCustValues.get(projectCusts.get("原任务链接")).getJSONObject(0).getString("title");
+        if(PublicUtil.isNull(linkUrl)){
+           return;
+        }
+        String linkId=linkUrl.substring(linkUrl.indexOf("/task/")+6,linkUrl.indexOf("/task/")+30);
+        JSONObject linkTask=tbApiService.getTasksInfo(linkId).getJSONObject(0);
+        //添加关联任务
+        tbApiService.addTaskLinks(task.getString("id"),linkTask.getString("content"),linkUrl,linkId);
+        String custName;
+        if(name.contains("二级变更流程")){
+            custName="上级任务责任人";
+        }else if(name.contains("三级变更流程")){
+            linkTask=tbApiService.getTasksInfo(linkTask.getString("id")).getJSONObject(0);
+            custName="一级任务知晓人";
+        }else if(name.contains("年度指标变更")){
+//            linkTask=tbApiService.getTasksInfo(linkTask.getString("id")).getJSONObject(0);
+            custName="二级任务责任人";
+        }else{
+            log.info("非期望任务类型 不处理");
+            return;
+        }
+        List<JSONObject> linkCusts=linkTask.getJSONArray("customfields").toJavaList(JSONObject.class);
+        String cfid=projectCusts.get("上级任务责任人");
+        Optional optional = linkCusts.stream().filter(item -> cfid.equals(item.get("cfId"))).findAny();
+        JSONArray value=((JSONObject) optional.get()).getJSONArray("value");
+        tbApiService.updateTaskCustomfield(task.getString("id"),projectCusts.get(custName),value);
+    }
 }

+ 5 - 2
src/test/java/com/muzhi/tianhe/TbTest.java

@@ -52,10 +52,13 @@ public class TbTest {
         }
     }
 
+    private String data="{\"created\":\"2024-06-25T03:05:18.778Z\",\"creatorId\":\"65b1dc8355d0f38026a1c3db\",\"customfieldId\":\"65b9e3af475c2137f56d572d\",\"customfieldOldValue\":[],\"customfieldType\":\"lookup\",\"customfieldValue\":[{\"id\":\"65b1dc8355d0f38026a1c3db\",\"title\":\"顾虎臣\"}],\"taskId\":\"667127e4a830bd315b3baf44\",\"updated\":\"2024-06-25T03:05:18.778Z\"}";
+
+
     @Test
     public void tbTest(){
-        String taskId="6678fc279270f997bf9ef44f";
-        thTbService.taskLink(taskId,"");
+        String taskId="667a346caf606ea5af0a4ea4";
+        thTbService.task(taskId,"2",JSONObject.parseObject(data));
     }
 
     //ALTER TABLE `tianhe`