remove - 移除老的工具类
This commit is contained in:
parent
384b43b51b
commit
f34067907c
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user