响应实体类:
package com.ddmc.workflow.response.activiti;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Data
public class BpmnModelResp implements Serializable {
/**
* 流程实例ID
*/
private String processDefinitionId;
private String processDefinitionName;
private String processDefinitionDesc;
/**
* 租户号
*/
private String tenantId;
/**
* 分类
*/
private String category;
/**
* 任务节点
*/
private List<UserTask> userTaskListResp = new ArrayList<>();
/**
* 开始节点
*/
private List<StartEvent> startEventListResp = new ArrayList<>();
/**
* 网关节点
*/
private List<GatewayResp> gatewayListResp = new ArrayList<>();
public BpmnModelResp() {
}
@Setter
@Getter
public static class UserTask implements Serializable {
private String id;
private String name;
private String category;
private String formKey;
private String assignee;
private String owner;
private String desc;
/*
模板设计指定工作流会签人员变量
*/
private String countersignParameters;
/**
* ALL-会签,ANY-任签; 默认任签
*/
private String type = "ANY";
private List<ApproverResp> approverList = new ArrayList<>();
}
@Setter
@Getter
public static class StartEvent implements Serializable {
private String id;
private String name;
private String formKey;
private String owner;
private String desc;
}
@Setter
@Getter
public static class GatewayResp implements Serializable {
//上一个节点Id
private Set<String> parentIds;
private String id;
private String name;
private Set<String> conditionExpressions;
}
}
获取节点代码:
private BpmnModelResp fillBaseInfo(BpmnModelResp bpmnModelResp, String processDefinitionId, org.activiti.bpmn.model.Process process) {
bpmnModelResp.setProcessDefinitionId(processDefinitionId);
bpmnModelResp.setProcessDefinitionName(process.getName());
bpmnModelResp.setProcessDefinitionDesc(process.getDocumentation());
return bpmnModelResp;
}
public BpmnModelResp fillUserTasks(BpmnModelResp bpmnModelResp, List<org.activiti.bpmn.model.UserTask> userTasks) {
userTasks.stream().forEach(user -> {
BpmnModelResp.UserTask UserTask = new BpmnModelResp.UserTask();
UserTask.setFormKey(user.getFormKey());
UserTask.setId(user.getId());
UserTask.setName(user.getName());
UserTask.setOwner(user.getOwner());
UserTask.setCategory(user.getCategory());
UserTask.setAssignee(user.getAssignee());
UserTask.setDesc(user.getDocumentation());
MultiInstanceLoopCharacteristics loopCharacteristics = user.getLoopCharacteristics();
if (loopCharacteristics != null) {
String countersignParameters = loopCharacteristics.getInputDataItem();
if (StringUtils.isNotEmpty(countersignParameters)) {
String replace = countersignParameters.replace("#{", "").replace("${", "").replace("}", "");
UserTask.setCountersignParameters(replace);
}
}
bpmnModelResp.getUserTaskListResp().add(UserTask);
});
return bpmnModelResp;
}
private BpmnModelResp fillStartEvent(BpmnModelResp bpmnModelResp, List<org.activiti.bpmn.model.StartEvent> startEventList) {
startEventList.stream().forEach(event -> {
BpmnModelResp.StartEvent startEvent = new BpmnModelResp.StartEvent();
startEvent.setFormKey(event.getFormKey());
startEvent.setId(event.getId());
startEvent.setName(event.getName());
startEvent.setOwner(event.getInitiator());
startEvent.setDesc(event.getDocumentation());
bpmnModelResp.getStartEventListResp().add(startEvent);
});
return bpmnModelResp;
}
/**
* 每一个路由解析他的出线的表达式参数
*
* @param gateways
* @return
*/
private BpmnModelResp fillGateway(BpmnModelResp bpmnModelResp, List<? extends Gateway> gateways) {
if (CollectionUtils.isEmpty(gateways)) {
return bpmnModelResp;
}
gateways.stream().forEach(gat -> {
if (gat instanceof ExclusiveGateway) {
Set<String> conditionKeys = new HashSet();
BpmnModelResp.GatewayResp gatewayResp = new BpmnModelResp.GatewayResp();
List<SequenceFlow> outgoingFlows = ((ExclusiveGateway) gat).getOutgoingFlows();
if (CollectionUtil.isNotEmpty(outgoingFlows)) {
outgoingFlows.forEach(flow -> {
conditionKeys.addAll(getCountersignParameters(flow.getConditionExpression()));
});
}
List<SequenceFlow> incomingFlows = ((ExclusiveGateway) gat).getIncomingFlows();
if (CollectionUtil.isNotEmpty(incomingFlows)) {
Set<String> incoming = incomingFlows.stream().map(SequenceFlow::getSourceRef).collect(Collectors.toSet());
gatewayResp.setParentIds(incoming);
}
gatewayResp.setId(gat.getId());
gatewayResp.setName(((ExclusiveGateway) gat).getName());
gatewayResp.setConditionExpressions(conditionKeys);
bpmnModelResp.getGatewayListResp().add(gatewayResp);
}
});
return bpmnModelResp;
}
private static final Set<String> getCountersignParameters(String param) {
Set<String> resList = new HashSet<>();
param = param.replace("#{", "").replace("${", "").replace("}", "");
char[] res = param.toCharArray();
Queue s = new ArrayBlockingQueue(500);
for (int i = 0; i < res.length; i++) {
char c = res[i];
if (c != '>' && c != '<' && c != '=' && c != '&' && c != '|' && !isInteger(String.valueOf(c))) {
s.add(c);
} else {
int j = 0;
String temp = "";
while (!s.isEmpty()) {
temp += (Character) s.poll();
}
if (StringUtils.isNotEmpty(temp)) {
resList.add(temp);
}
}
}
return resList;
}
private static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}