一、模型架构概览
在流程资源文件中,每一个节点元素在activiti中都有对应的元素属性承载类,比如,UserTask任务节点,它的元素属性承载类为UserTask,相同,startEvent开始节点的元素承载类为StartEvent,在bpmn流程文件进行解析时,也是将xml文档中每个元素解析为对应的承载类,从而进行组装成一个BmpnModel模型,我们可以直接由activiti将bpmn xml文件解析为一个实例模型(下图所示),也可以完成通过自定义手动创建模型。
二、BpmnModel讲解
根据上图所示BpmnModel是流程资源文件的承载类,通过BpmnModel可以获取流程资源文件里面的节点资源信息
三、BpmnModel代码演示
//流程定义Id
String processDefId="process:1:7";
//通过流程资源部署类获取BpmnModel
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
三、根据BpmnModel获取流程节点信息演示
//通过BpmnModel获取Process
Process process = bpmnModel.getProcesses().get(0);
//通过Process获取UserTask信息
List<UserTask> UserTaskList = process.findFlowElementsOfType(UserTask.class);
四、获取UserTask的各类信息
for(UserTask userTask:UserTaskList){
String id = userTask.getId(); //流程节点Id
String assign = userTask.getAssignee(); //节点任务执行人
}
五、综合代码演示
public void getCurrentNextUserTaskAssign(){
//流程定义Id
String processDefId="process:1:7";
//当前流程节点Id,在任务表里面对应TASK_DEF_KEY_字段,可以根据taskId获取该字段数据
String flowElemetId = "leader";
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
Process process = bpmnModel.getProcesses().get(0);
//获取所有普通任务节点
List<UserTask> UserTaskList = process.findFlowElementsOfType(UserTask.class);
for(UserTask userTask:UserTaskList){
//获取当前任务节点Id
String id = userTask.getId();
if(id.equals(flowElemetId)){
//获取当前任务节点的所有出线信息
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
for(SequenceFlow sequenceFlow:outgoingFlows){
//获取出线连接的目标节点
FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement();
//获取到了下一个节点的Id
String nextId = targetFlowElement.getId();
List<UserTask> UserTaskLists = process.findFlowElementsOfType(UserTask.class);
//再次遍历所有普通任务节点
for(UserTask userTasks:UserTaskLists) {
//获取任务节点Id
String flowId = userTasks.getId();
//如果遍历的某个任务节点Id等于下一个节点的Id
if (flowId.equals(nextId)) {
//获取下一个任务节点的执行人
String assignee = userTasks.getAssignee();
System.out.println("下一个节点的执行人:"+assignee);
}
}
}
}
}
}