remove - 移除老的工具类

This commit is contained in:
wangli 2024-08-12 16:16:11 +08:00
parent 384b43b51b
commit f34067907c

View File

@ -1,432 +0,0 @@
package cn.axzo.workflow.core.common.utils;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.ExclusiveGateway;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.FlowableListener;
import org.flowable.bpmn.model.MultiInstanceLoopCharacteristics;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.bpmn.model.StartEvent;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.repository.Model;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO;
import static cn.axzo.workflow.common.constant.BpmnConstants.OR_SIGN_EXPRESSION_ONE_PASS;
import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_META_DATA_FORMAT_ERROR;
import static cn.axzo.workflow.core.common.code.ConvertorRespCode.CONVERTOR_UNKNOW_NODE_TYPE;
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_END;
import static org.flowable.engine.delegate.BaseExecutionListener.EVENTNAME_START;
/**
* 该工具是以前枢智版本使用后续迭代都通过 BpmnJsonConverterUtil 该工具操作
*/
@Slf4j
@Deprecated
public class BpmTransformUtil {
public static byte[] transformBpmnJsonToXml(BpmnJsonNode bpmnJson, Model model) {
return transformBpmnJsonToXml(bpmnJson, model, null);
}
public static byte[] transformBpmnJsonToXml(BpmnJsonNode bpmnJson, Model model, String category) {
BpmnModel bpmnModel = new BpmnModel();
Process process = new Process();
bpmnModel.addProcess(process);
process.setId(model.getKey());
process.setName(model.getName());
if (BpmnFlowNodeType.NODE_STARTER.equals(bpmnJson.getType())) {
process.addFlowElement(createStartEvent(bpmnJson.getId(), Objects.nonNull(bpmnJson.getProperty()) ?
bpmnJson.getProperty().getFormKey() : ""));
}
List<SequenceFlow> sequenceFlows = Lists.newArrayList();
Map<String, BpmnJsonNode> childNodeMap = new HashMap<>();
String lastNode = null;
try {
lastNode = create(bpmnJson.getId(), bpmnJson.getChildren(), process, bpmnModel, sequenceFlows,
childNodeMap);
} catch (WorkflowEngineException e) {
throw e;
} catch (Exception e) {
throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR);
}
EndEvent endEvent = createEndEvent();
process.addFlowElement(endEvent);
process.addFlowElement(sequenceFlow(lastNode, endEvent.getId(), sequenceFlows, childNodeMap, process));
if (StringUtils.isNotBlank(category)) {
bpmnModel.setTargetNamespace(category);
}
new BpmnAutoLayout(bpmnModel).execute();
byte[] xmlMeta = new BpmnXMLConverter().convertToXML(bpmnModel);
String xmlResult = new String(xmlMeta);
return xmlMeta;
}
private static String id(String prefix) {
return prefix + "_" + UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
private static ServiceTask serviceTask(String name) {
ServiceTask serviceTask = new ServiceTask();
serviceTask.setName(name);
return serviceTask;
}
public static SequenceFlow sequenceFlow(String from, String to, List<SequenceFlow> sequenceFlows, Map<String,
BpmnJsonNode> childNodeMap, Process process) {
SequenceFlow flow = new SequenceFlow();
String sequenceFlowId = id("sequenceFlow");
if (process.getFlowElement(from) != null && process.getFlowElement(from) instanceof ExclusiveGateway) {
BpmnJsonNode childNode = childNodeMap.get(to);
if (childNode != null) {
String parentId = childNode.getParentId();
if (StringUtils.isNotBlank(parentId)) {
BpmnJsonNode parentNode = childNodeMap.get(parentId);
if (parentNode != null) {
if (BpmnFlowNodeType.NODE_CONDITION.equals(parentNode.getType())) {
sequenceFlowId = parentNode.getId();
flow.setName(parentNode.getName());
if (!ObjectUtils.isEmpty(parentNode.getProperty()) && !Boolean.TRUE.equals(parentNode.getProperty().getDefaultBranch())) {
//解析条件表达式
// StringBuffer conditionExpression = new StringBuffer();
// conditionExpression.append("${ ")
// .append("var:eq('")
// .append(parentNode.getProperty()
// .getConditionBranchKey())
// .append("', ")
// .append(parentNode.getProperty()
// .getConditionBranchValue())
// .append(")");
// conditionExpression.append(" }");
//
// flow.setConditionExpression(conditionExpression
// .toString());
}
}
}
}
}
}
flow.setId(sequenceFlowId);
flow.setSourceRef(from);
flow.setTargetRef(to);
sequenceFlows.add(flow);
return flow;
}
public static StartEvent createStartEvent(String id, String formKey) {
StartEvent startEvent = new StartEvent();
startEvent.setId(id);
// startEvent.setInitiator("applyUserId");
if (Objects.nonNull(formKey) && !formKey.trim().isEmpty()) {
startEvent.setFormKey(formKey);
}
return startEvent;
}
public static EndEvent createEndEvent() {
EndEvent endEvent = new EndEvent();
endEvent.setId(END_EVENT_ID);
return endEvent;
}
public static String create(String fromId, BpmnJsonNode flowNode, Process process, BpmnModel bpmnModel,
List<SequenceFlow> sequenceFlows, Map<String, BpmnJsonNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
String nodeType = flowNode.getType().getType();
if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.isEqual(nodeType)) {
return createExclusiveGatewayBuilder(fromId, flowNode, process, bpmnModel, sequenceFlows, childNodeMap);
} else if (BpmnFlowNodeType.NODE_TASK.isEqual(nodeType)) {
childNodeMap.put(flowNode.getId(), flowNode);
flowNode.setIncoming(Collections.singletonList(fromId));
String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
// 如果当前任务还有后续任务则遍历创建后续任务
BpmnJsonNode children = flowNode.getChildren();
if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
} else {
return id;
}
} else if (BpmnFlowNodeType.NODE_STARTER.isEqual(nodeType)) {
childNodeMap.put(flowNode.getId(), flowNode);
flowNode.setIncoming(Collections.singletonList(fromId));
String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
// 如果当前任务还有后续任务则遍历创建后续任务
BpmnJsonNode children = flowNode.getChildren();
if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
} else {
return id;
}
} else {
throw new WorkflowEngineException(CONVERTOR_UNKNOW_NODE_TYPE, nodeType);
}
}
public static ExclusiveGateway createExclusiveGateWayEnd(String id) {
ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
exclusiveGateway.setId(id);
return exclusiveGateway;
}
private static String createExclusiveGatewayBuilder(String formId, BpmnJsonNode flowNode, Process process,
BpmnModel bpmnModel, List<SequenceFlow> sequenceFlows,
Map<String, BpmnJsonNode> childNodeMap) throws InvocationTargetException, IllegalAccessException {
childNodeMap.put(flowNode.getId(), flowNode);
String name = flowNode.getName();
String exclusiveGatewayId = flowNode.getId();
ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
exclusiveGateway.setId(exclusiveGatewayId);
exclusiveGateway.setName(name);
process.addFlowElement(exclusiveGateway);
process.addFlowElement(sequenceFlow(formId, exclusiveGatewayId, sequenceFlows, childNodeMap, process));
if (Objects.isNull(flowNode.getBranches()) && Objects.isNull(flowNode.getChildren())) {
return exclusiveGatewayId;
}
List<BpmnJsonNode> branches = flowNode.getBranches();
List<String> incoming = Lists.newArrayListWithCapacity(branches.size());
List<Map> conditions = Lists.newCopyOnWriteArrayList();
for (BpmnJsonNode element : branches) {
if (!ObjectUtils.isEmpty(element.getProperty())) {
Boolean typeElse = element.getProperty().getDefaultBranch();
if (Boolean.TRUE.equals(typeElse)) {
exclusiveGateway.setDefaultFlow(element.getId());
}
}
childNodeMap.put(element.getId(), element);
BpmnJsonNode children = element.getChildren();
String nodeName = element.getName();
if (!ObjectUtils.isEmpty(element.getProperty()) && (Objects.isNull(children) || StringUtils.isBlank(children.getId()))) {
incoming.add(exclusiveGatewayId);
Map condition = new HashMap();
//解析条件表达式
// StringBuffer conditionExpression = new StringBuffer();
// conditionExpression.append("${ ");
// conditionExpression.append("var:eq('" + element.getProperty().getConditionBranchKey
// () + "', " + element.getProperty().getConditionBranchValue() + ") ");
// conditionExpression.append(" }");
// condition.put("nodeName", nodeName);
// condition.put("expression", conditionExpression.toString());
conditions.add(condition);
continue;
}
// 只生成一个任务同时设置当前任务的条件
children.setIncoming(Collections.singletonList(exclusiveGatewayId));
String identifier = create(exclusiveGatewayId, children, process, bpmnModel, sequenceFlows, childNodeMap);
List<SequenceFlow> flows = sequenceFlows.stream().filter(flow -> StringUtils.equals(exclusiveGatewayId,
flow.getSourceRef()))
.collect(Collectors.toList());
flows.stream().forEach(
e -> {
if (StringUtils.isBlank(e.getName()) && StringUtils.isNotBlank(nodeName)) {
e.setName(nodeName);
}
// 设置条件表达式
// if (Objects.isNull(e.getConditionExpression()) && StringUtils
// .isNotBlank(expression)) {
// e.setConditionExpression(expression);
// }
}
);
if (Objects.nonNull(identifier)) {
incoming.add(identifier);
}
}
BpmnJsonNode childNode = flowNode.getChildren();
if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) {
String parentId = childNode.getParentId();
BpmnJsonNode parentChildNode = childNodeMap.get(parentId);
if (BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY.equals(parentChildNode.getType())) {
String endExId = parentChildNode.getId() + "end";
process.addFlowElement(createExclusiveGateWayEnd(endExId));
if (incoming == null || incoming.isEmpty()) {
return create(exclusiveGatewayId, childNode, process, bpmnModel, sequenceFlows,
childNodeMap);
} else {
// 所有 service task 连接 end exclusive gateway
childNode.setIncoming(incoming);
FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
// 1.0 先进行边连接, 暂存 nextNode
BpmnJsonNode nextNode = childNode.getChildren();
childNode.setChildren(null);
String identifier = endExId;
for (int i = 0; i < incoming.size(); i++) {
process.addFlowElement(sequenceFlow(incoming.get(i), identifier, sequenceFlows, childNodeMap,
process));
}
// 针对 gateway 空任务分支 添加条件表达式
if (!conditions.isEmpty()) {
FlowElement flowElement1 = bpmnModel.getFlowElement(identifier);
// 获取从 gateway 到目标节点 未设置条件表达式的节点
List<SequenceFlow> flows = sequenceFlows.stream().filter(
flow -> StringUtils.equals(flowElement1.getId(), flow.getTargetRef()))
.filter(
flow -> StringUtils.equals(flow.getSourceRef(), exclusiveGatewayId))
.collect(Collectors.toList());
flows.stream().forEach(sequenceFlow -> {
if (!conditions.isEmpty()) {
Map condition = conditions.get(0);
String nodeName = (String) condition.get("nodeName");
String expression = (String) condition.get("expression");
if (StringUtils.isBlank(sequenceFlow.getName()) && StringUtils
.isNotBlank(nodeName)) {
sequenceFlow.setName(nodeName);
}
// 设置条件表达式
if (Objects.isNull(sequenceFlow.getConditionExpression())
&& StringUtils.isNotBlank(expression)) {
sequenceFlow.setConditionExpression(expression);
}
conditions.remove(0);
}
});
}
// 1.1 边连接完成后在进行 nextNode 创建
if (StringUtils.isNotBlank(childNode.getId())) {
return create(identifier, childNode, process, bpmnModel, sequenceFlows,
childNodeMap);
} else {
return identifier;
}
}
}
}
return exclusiveGatewayId;
}
private static String createTask(Process process, BpmnJsonNode flowNode, List<SequenceFlow> sequenceFlows,
Map<String, BpmnJsonNode> childNodeMap) {
List<String> incoming = flowNode.getIncoming();
// 自动生成id
// String id = id("serviceTask");
String id = flowNode.getId();
if (incoming != null && !incoming.isEmpty()) {
UserTask userTask = new UserTask();
userTask.setName(flowNode.getName());
userTask.setId(id);
process.addFlowElement(userTask);
process.addFlowElement(sequenceFlow(incoming.get(0), id, sequenceFlows, childNodeMap, process));
FlowableListener createTaskListener = new FlowableListener();
createTaskListener.setEvent(TaskListener.EVENTNAME_ALL_EVENTS);
createTaskListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
createTaskListener.setImplementation("${engineTaskEventListener}");
List<FlowableListener> taskListeners = new ArrayList<>();
taskListeners.add(createTaskListener);
userTask.setTaskListeners(taskListeners);
if ("root".equalsIgnoreCase(id)) {
} else {
List<FlowableListener> executionListeners = new ArrayList<>();
createExecutionListener(EVENTNAME_START, executionListeners);
// End 事件,主要想用于多实例节点保留一条历史的任务信息, 后续研究过程中, 发现通过更优的解决方案, 所以注释掉下面一行
// createExecutionListener(EVENTNAME_END, executionListeners);
userTask.setExecutionListeners(executionListeners);
if (!ObjectUtils.isEmpty(flowNode.getProperty()) && Boolean.TRUE.equals(flowNode.getProperty().getIsMultiTask())) {
BpmnJsonNodeProperty property = flowNode.getProperty();
BpmnFlowNodeMode mode = property.getMultiMode();
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics =
new MultiInstanceLoopCharacteristics();
// 审批人集合参数
multiInstanceLoopCharacteristics.setInputDataItem(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO + userTask.getId());
// 迭代集合
multiInstanceLoopCharacteristics.setElementVariable("assigneeName");
// 并行
multiInstanceLoopCharacteristics.setSequential(false);
userTask.setAssignee("${assigneeName}");
// 设置多实例属性
userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
if (BpmnFlowNodeMode.OR.getType().equals(mode.getType())) {
multiInstanceLoopCharacteristics.setCompletionCondition(OR_SIGN_EXPRESSION_ONE_PASS);
} else if (BpmnFlowNodeMode.AND.getType().equals(mode.getType())) {
multiInstanceLoopCharacteristics.setCompletionCondition(AND_SIGN_EXPRESSION);
}
}
// 设置审批人为空时,允许自动通过
// if (!ObjectUtils.isEmpty(flowNode.getProperty()) && flowNode.getProperty()
// .getAllowSkip()) {
// userTask.setSkipExpression("${" + BPM_ALLOW_SKIP_USER_TASK + "}");
// }
if (!ObjectUtils.isEmpty(flowNode.getProperty()) && StringUtils.isNotBlank(flowNode.getProperty().getFormKey())) {
userTask.setFormKey(flowNode.getProperty().getFormKey());
}
}
}
return id;
}
/**
* 根据 Execution 事件类型, 创建 Execution 监听器
*
* @param eventName @see ExecutionListener
* @return
*/
private static void createExecutionListener(String eventName, List<FlowableListener> listeners) {
FlowableListener executionListener = new FlowableListener();
executionListener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
executionListener.setEvent(eventName);
switch (eventName) {
case EVENTNAME_START:
executionListener.setImplementation("${engineExecutionStartListener}");
break;
case EVENTNAME_END:
executionListener.setImplementation("${engineExecutionEndListener}");
break;
default:
return;
}
listeners.add(executionListener);
}
}