Commit b5f6545d5a1909e8bb750c36939ded2f9a8d2320

Authored by YunaiV
1 parent fdc6f6ed

【代码评审】BPM:Simple 设计器 - userTask 监听器

yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmListenerMapType.java
... ... @@ -6,6 +6,7 @@ import lombok.Getter;
6 6  
7 7 import java.util.Arrays;
8 8  
  9 +// TODO @芋艿:枚举值的类名,在考虑下
9 10 /**
10 11 * BPM 任务监听器键值对类型
11 12 *
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java
... ... @@ -96,15 +96,19 @@ public class BpmSimpleModelNodeVO {
96 96 */
97 97 private AssignEmptyHandler assignEmptyHandler;
98 98  
  99 + // TODO @lesan:建议改成 taskCreateListener;
99 100 /**
100 101 * 创建任务监听器
101 102 */
102 103 private ListenerHandler createTaskListener;
103 104  
104 105 @Schema(description = "任务监听器")
  106 + @Valid
105 107 @Data
106 108 public static class ListenerHandler {
107 109  
  110 + // TODO @lesan:参数校验,需要加下
  111 +
108 112 @Schema(description = "是否开启任务监听器", example = "false")
109 113 private Boolean enable;
110 114  
... ... @@ -117,6 +121,8 @@ public class BpmSimpleModelNodeVO {
117 121 @Schema(description = "请求体", example = "[]")
118 122 private List<ListenerMap> body;
119 123  
  124 + // TODO @芋艿:这里后续要不要复用;
  125 +
120 126 @Schema(description = "任务监听器键值对")
121 127 @Data
122 128 public static class ListenerMap {
... ... @@ -125,11 +131,14 @@ public class BpmSimpleModelNodeVO {
125 131 private String key;
126 132  
127 133 @Schema(description = "值类型", example = "1")
  134 + @InEnum(BpmListenerMapType.class)
128 135 private Integer type;
129 136  
130 137 @Schema(description = "值", example = "xxx")
131 138 private String value;
  139 +
132 140 }
  141 +
133 142 }
134 143  
135 144 @Schema(description = "审批节点拒绝处理策略")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java
... ... @@ -431,11 +431,14 @@ public class SimpleModelUtils {
431 431 flowableListener.setEvent(TaskListener.EVENTNAME_CREATE);
432 432 flowableListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
433 433 flowableListener.setImplementation(DELEGATE_EXPRESSION);
  434 + // TODO @lesan:可以加个 addExtensionElementJson() 方法;
  435 + // TODO @lesan:是不是不用带 "create" + EXTENSION_SUFFIX 这种,直接给个 "config" 就完事了!
434 436 addExtensionElement(userTask, "create" + EXTENSION_SUFFIX,
  437 + // TODO @lesan:默认使用项目里的 JsonUtils 方法
435 438 JSONUtil.toJsonStr(node.getCreateTaskListener()));
436 439 flowableListeners.add(flowableListener);
437 440 }
438   - if (!flowableListeners.isEmpty()) {
  441 + if (CollUtil.isNotEmpty(flowableListeners)) {
439 442 userTask.setTaskListeners(flowableListeners);
440 443 }
441 444 return userTask;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/listener/BpmUserTaskListener.java
... ... @@ -46,20 +46,24 @@ public class BpmUserTaskListener implements TaskListener {
46 46 HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(delegateTask.getProcessInstanceId());
47 47 BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(delegateTask.getProcessDefinitionId());
48 48 FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, delegateTask.getTaskDefinitionKey());
  49 + // TODO @lesan:可以写到 FlowableUtils 里,简化解析逻辑!
49 50 BpmSimpleModelNodeVO.ListenerHandler listenerHandler = JSONUtil.toBean(
50 51 parseExtensionElement(userTaskElement, delegateTask.getEventName() + EXTENSION_SUFFIX),
51 52 BpmSimpleModelNodeVO.ListenerHandler.class);
52   - Map<String, Object> processVariables = processInstance.getProcessVariables();
  53 +
53 54 // 2. 获取请求头和请求体
54   - HashMap<String, String> headers = new HashMap<>();
55   - HashMap<String, Object> body = new HashMap<>();
  55 + Map<String, Object> processVariables = processInstance.getProcessVariables();
  56 + Map<String, String> headers = new HashMap<>();
  57 + Map<String, Object> body = new HashMap<>();
56 58 listenerHandler.getHeader().forEach(item -> {
  59 + // TODO @lesan:可以写个统一的方法,解析参数。然后非空,put 到 headers 或者 body 里!
57 60 if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) {
58 61 headers.put(item.getKey(), item.getValue());
59 62 } else if (item.getType().equals(BpmListenerMapType.FROM_FORM.getType())) {
60 63 headers.put(item.getKey(), processVariables.getOrDefault(item.getValue(), "").toString());
61 64 }
62 65 });
  66 + // TODO @lesan:header 里面,需要添加下 tenant-id!
63 67 listenerHandler.getBody().forEach(item -> {
64 68 if (item.getType().equals(BpmListenerMapType.FIXED_VALUE.getType())) {
65 69 body.put(item.getKey(), item.getValue());
... ... @@ -67,10 +71,13 @@ public class BpmUserTaskListener implements TaskListener {
67 71 body.put(item.getKey(), processVariables.getOrDefault(item.getValue(), ""));
68 72 }
69 73 });
  74 +
70 75 // 3. 异步发起请求
  76 + // TODO @lesan:最好打印下日志!
71 77 HttpRequest.post(listenerHandler.getPath())
72 78 .addHeaders(headers).form(body).executeAsync();
73   - // 4. 是否需要后续操作?
  79 +
  80 + // 4. 是否需要后续操作?TODO 芋艿:待定!
74 81 }
75 82  
76 83 }
77 84 \ No newline at end of file
... ...