Activiti 中有互斥网关和并行网关,但是在实际项目开发中,经常会出现一些看起来离奇的需求,比如任务分配给多人审批,只要指定数量的人审批通过就可以进入下一个流程。
<userTask id="usertask1" name="会签(多人参与)" activiti:assignee="${assignee}">
<multiInstanceLoopCharacteristics
isSequential="false"
activiti:collection="assigneeList"
activiti:elementVariable="assignee">
<completionCondition>${nrOfCompletedInstances/nrOfInstances >=0.5}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
新增流程实例:
Map<String, Object> variables = new HashMap<String, Object>();
List<String> candiateUserList= Arrays.asList(new String[] {"1","2","3","4"});
variables.put("assigneeList", candiateUserList);
ProcessInstance in = runtimeService.startProcessInstanceByKey("counterSign", variables);
System.out.println("实例ID"+in.getId());
List<Task> list = taskService.createTaskQuery().processInstanceId(in.getId()).list();
System.out.println("任务数量:"+list.size());
list.forEach(task -> {
System.out.println("任务ID"+task.getId());
System.out.println("指派人ID"+task.getAssignee());
});
任务查询:
TaskQuery query = taskService.createTaskQuery();
List<Task> list = query.taskAssignee(userId).taskDefinitionKey("counterSign").list();
list.forEach(task -> {
System.out.println("任务ID"+task.getId());
});
处理任务:
//会签,满足两人以上即可,表达式:${nrOfCompletedInstances/nrOfInstances >=0.5}
taskService.claim(taskId, userId);
taskService.complete(taskId);
根据表达式,只要满足两人以上执行了此任务就会进入下一个流程。