McTbEventImpl.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package com.malk.tuosi.event;
  2. import cn.hutool.core.map.MapUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.malk.delegate.TBEvent;
  5. import com.malk.server.common.McException;
  6. import com.malk.service.teambition.TBClient;
  7. import com.malk.utils.PublicUtil;
  8. import com.malk.utils.UtilMap;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.scheduling.annotation.Async;
  13. import org.springframework.stereotype.Service;
  14. import java.util.*;
  15. @Primary
  16. @Service
  17. @Slf4j
  18. public class McTbEventImpl implements TBEvent {
  19. @Autowired
  20. private TBClient tbClient;
  21. @Async
  22. @Override
  23. public void callBackTask(JSONObject eventJson) {
  24. String event = eventJson.getString("event");
  25. if(event.equals("v3.task.node.status.update")){
  26. JSONObject data = eventJson.getJSONObject("data");
  27. String taskId = data.getString("taskId");
  28. String status = data.getString("status");
  29. String nodeId = data.getString("nodeId");
  30. // String creatorId = data.getString("creatorId");
  31. String creatorId = "61a8c27a143030d9110a66d4";
  32. // Map task = tbClient.queryTaskDetail(taskId,null,null).get(0);
  33. // if(!"6970a3ff4f887b90bfdbe7e3".equals(String.valueOf(task.get("projectId")))){
  34. // return;
  35. // }
  36. // if(!Arrays.asList("622ee3450cf3bb5e1a486f1f","61a9e8a36355609fb6383d40").contains(creatorId)){
  37. // return;
  38. // }
  39. log.info("XXXXXX 进入节点更新流程,节点ID:{},状态:{},任务ID:{}",nodeId,status,taskId);
  40. if(status.equals("finish")){
  41. List<Map> list=tbClient.queryNodeList(taskId);
  42. Map node = _getNodeDetail(list,nodeId);
  43. if(String.valueOf(node.get("name")).contains("接单")){
  44. try {
  45. Thread.sleep(3000);
  46. }catch (InterruptedException e){
  47. e.printStackTrace();
  48. }
  49. List<String> assigneeIds = UtilMap.getList(node,"assigneeIds");
  50. String startDate = UtilMap.getString(node,"startDate");
  51. String dueDate = UtilMap.getString(node,"dueDate");
  52. Map nextMap=_getNextNode(list,nodeId);
  53. log.info("XXXXXX 接单完成,更新下一节点数据:{},{}-{}",assigneeIds,startDate,dueDate);
  54. if(nextMap!=null){
  55. String nextId = UtilMap.getString(nextMap,"id");
  56. Map result=tbClient.updateNodeById(taskId,nextId,assigneeIds,startDate,dueDate,creatorId);
  57. log.info("XXXXXX 更新结果{}:{}",nextId,result);
  58. }
  59. }
  60. }else if(status.equals("begin")){
  61. if(!"finish".equals(data.getJSONObject("old").getString("status"))){
  62. return;
  63. }
  64. log.info("XXXXXX 接单开始,清空后续节点数据");
  65. try {
  66. Thread.sleep(3000);
  67. }catch (InterruptedException e){
  68. e.printStackTrace();
  69. }
  70. List<Map> list=tbClient.queryNodeList(taskId);
  71. // Map node = _getNodeDetail(list,nodeId);
  72. // if(String.valueOf(node.get("name")).contains("接单")){
  73. nextNode(taskId,list,nodeId,creatorId);
  74. // }
  75. }
  76. }else if(event.equals("v3.task.node.dueDate.update") || event.equals("v3.task.node.startDate.update")){
  77. JSONObject data = eventJson.getJSONObject("data");
  78. String taskId = data.getString("taskId");
  79. String nodeId = data.getString("nodeId");
  80. String creatorId = "61a8c27a143030d9110a66d4";
  81. List<Map> list=tbClient.queryNodeList(taskId);
  82. Map node = _getNodeDetail(list,nodeId);
  83. String nodeName =getContainsName(String.valueOf(node.get("name")));
  84. if(!PublicUtil.isNull(nodeName)){
  85. try {
  86. Thread.sleep(3000);
  87. }catch (InterruptedException e){
  88. e.printStackTrace();
  89. }
  90. boolean isDue = event.equals("v3.task.node.dueDate.update");
  91. String date = data.getString(isDue?"dueDate":"startDate");
  92. String key = NODE_FIELDNAME.get(nodeName)[isDue?0:1];
  93. log.info("XXXXXX {}时间变更,更新任务{}:{}-{}",nodeName,key,taskId,date);
  94. tbClient.updateTaskCustomField(taskId,creatorId, UtilMap.map("customfieldName, value",key,Arrays.asList(new JSONObject().fluentPut("title",date))));
  95. }
  96. }
  97. }
  98. private String getContainsName(String name){
  99. for (String key : NODE_FIELDNAME.keySet()) {
  100. if(name.contains(key)){
  101. return key;
  102. }
  103. }
  104. return null;
  105. }
  106. private static Map<String,String[]> NODE_FIELDNAME=new HashMap<>();
  107. static{
  108. NODE_FIELDNAME.put("设计接单",new String[]{"设计截止时间","设计开始时间"});
  109. NODE_FIELDNAME.put("版线组接单",new String[]{"版线组接单截止时间","版线组接单开始时间"});
  110. NODE_FIELDNAME.put("制作接单",new String[]{"制作截止时间","制作开始时间"});
  111. NODE_FIELDNAME.put("打样组接单",new String[]{"打样组接单截止时间","打样组接单开始时间"});
  112. NODE_FIELDNAME.put("CTP接单",new String[]{"CTP接单截止时间","CTP接单开始时间"});
  113. NODE_FIELDNAME.put("设计完成",new String[]{"设计截止时间","设计开始时间"});
  114. NODE_FIELDNAME.put("版线组完成",new String[]{"版线组接单截止时间","版线组接单开始时间"});
  115. NODE_FIELDNAME.put("制作完成",new String[]{"制作截止时间","制作开始时间"});
  116. NODE_FIELDNAME.put("打样组完成",new String[]{"打样组接单截止时间","打样组接单开始时间"});
  117. NODE_FIELDNAME.put("CTP完成",new String[]{"CTP接单截止时间","CTP接单开始时间"});
  118. }
  119. private void nextNode(String taskId,List<Map> list,String nodeId,String creatorId){
  120. Map nextMap=_getNextNode(list,nodeId);
  121. if(nextMap!=null){
  122. String nextId = UtilMap.getString(nextMap,"id");
  123. Map result=tbClient.updateNodeById(taskId,nextId,new ArrayList<>(),null,null,creatorId);
  124. log.info("XXXXXX 清空结果{}:{}",nextId,result);
  125. nextNode(taskId,list,nextId,creatorId);
  126. }
  127. }
  128. @Override
  129. public void callBackProject(JSONObject eventJson) {
  130. }
  131. @Async
  132. @Override
  133. public void callBackWorktime(JSONObject eventJson) {
  134. }
  135. private Map _getNodeDetail(List<Map> list, String nodeId) {
  136. Optional optional = list.stream().filter(item -> nodeId.equals(item.get("id"))).findAny();
  137. McException.assertAccessException(!optional.isPresent(), nodeId + ": 节点不存在");
  138. return (Map) optional.get();
  139. }
  140. private Map _getNextNode(List<Map> list, String nodeId) {
  141. for(Map map : list) {
  142. List<String> prevIds = UtilMap.getList(map,"prevIds");
  143. if(prevIds.contains(nodeId)){
  144. return map;
  145. }
  146. }
  147. return null;
  148. }
  149. }