Activiti7 调用子流程的配置和处理
一、主流程设置
如图所示,我们创建了一个主流程,在初步审核完成后调用子流程完成子流程的处理,最后到达终极审核处核对完毕后流程结束
人员配置节点不在进行说明,只对调用子流程的处理进行解释说明,配置如下图所示
1、需要将多实例类型设置为:Parallel
2、配置集合(多实例)为:${approvalGroups},此处变量为动态传递的人员参数
3、配置元素变量(多实例)为:currentGroup,此处也为自定义变量,作为参数传递给子流程
4、配置被调用元素:TYZLC,此处配置为子流程的ID
5、配置输入参数,详见下图,定义输入变量${currentGroup}即上述3处设置的变量,定义目标变量给子流程传递的数据:taskApprover
二、子流程设置
本文只对第一节点进行动态标识的说明,后续节点基本类似,在任务派遣处使用${taskApprover}即上述5处的输入参数变量,但是在实际的过程中,我在配置${}参数后,部署后xml中未能插入对应的Assignee配置,所以此处我进行了监听器的处理,在节点创建时监听。
三、添加监听器
在监听器中获取输入的变量信息,然后设置节点人员,达到人员的动态传递,并且此监听也进行了业务键的设置,这点也很重要,因为在测试过程中发现,达到子流程节点未能进行业务键插入,所以需要进行监听处理。
@Service
public class SubProcessTestListener implements TaskListener {private static final long serialVersionUID = 1L;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@Transactionalpublic void notify(DelegateTask delegateTask){//获取子流程变量DelegateExecution execution = delegateTask.getExecution();//获取输入的参数变量String approver = (String) delegateTask.getVariable("taskApprover");//通过流程实例获取“业务键”ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(execution.getRootProcessInstanceId()).singleResult();//给节点重新设置接收人taskService.setAssignee(delegateTask.getId(),approver);//给子流程设置相应的业务建runtimeService.updateBusinessKey(delegateTask.getProcessInstanceId(), pi.getBusinessKey());}
}
四、人员的动态添加
在对应的节点审核提交的方法中维护对应的变量即可
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
variables.put("approvalGroups", list);
taskService.complete(taskId, variables, true);