-
java代码生成用户任务
UserTask userTask = new UserTask();
// 流程名称
userTask.setName("会签任务");
userTask.setId(IdGenerator.createId());
//使用变量名assignee从变量中获取办理人
userTask.setAssignee("${assignee}");
//设置候选审批人:提供给执行监听器MultiInstanceExecutionListener使用
userTask.setCandidateUsers(candidateUserList);
//设置执行监听器
List<FlowableListener> executionListeners=new ArrayList<>();
FlowableListener flowableListener=new FlowableListener();
//事件:start/end/
flowableListener.setEvent("start");
//类型:delegateExpression(表达式)/class(java类)
flowableListener.setImplementationType("class");
//设置表达式或java类路径
flowableListener.setImplementation("MultiInstanceExecutionListener");
executionListeners.add(flowableListener);
userTask.setExecutionListeners(executionListeners);
//会签规则设置
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
// 设置并行执行(每个审批人可以同时执行)
multiInstanceLoopCharacteristics.setSequential(false);
// 设置完成条件
// nrOfInstances--实例总数、 nrOfActiveInstances--还没有完成的数量 nrOfCompletedInstances--完成审批的数量
multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances >= 0.5}");
//直接指定一个数字
//multiInstanceLoopCharacteristics.setLoopCardinality("5");
//审批人集合参数:使用变量assigneeList查找办理人列表
multiInstanceLoopCharacteristics.setInputDataItem("assigneeList");
//迭代办理人列表时,以assignee为名保存到流程变量中
multiInstanceLoopCharacteristics.setElementVariable("assignee");
//设置多实例属性/会签
userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
生成的XML如下:
<userTask id="xxx" name="会签" flowable:assignee="${assignee}">
<extensionElements>
<flowable:executionListener event="start" class="MultiInstanceExecutionListener"></flowable:executionListener>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee">
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.5}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
执行监听器指定会签人员:把候选人以assigneeList为名放到本地变量中
public class MultiInstanceExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution delegateTask) {
//获取监听的对象
FlowElement currentFlowElement = delegateTask.getCurrentFlowElement();
if(currentFlowElement instanceof UserTask){
//用户任务
UserTask userTask = (UserTask) currentFlowElement;
//获取任务的候选办理人
List<String> candidateUsers = userTask.getCandidateUsers();
//候选办理人设为本地变量(节点所有)
delegateTask.setVariableLocal("assigneeList", candidateUsers);
}
}
}
参考文档:https://flowable.com/open-source/docs/bpmn/ch07b-BPMN-Constructs/#multi-instance-for-each