节点会签
目录
BPMN设置
会签是通过节点UserTask
的属性多实例Multi Instance
来设置的,要设置如下
-
Sequential:执行顺序,true表示多实例顺序执行,false表示多实例并行。
-
Loop Cardinality:循环基数,选填,会签人数。
-
Completion Condition:完成条件,Activiti预定义了3个变量,可以在UEL表达式中直接使用,可以根据表达式设置按数量、按比例、一票通过、一票否定等条件。
-
nrOfInstances:总实例数,Collection中的数量。
-
nrOfCompletedInstances:已经完成的实例数。
-
nrOfActiveInstances:还没有完成的实例数。
-
-
Collection:Assignee集合,可以在启动实例时赋值变量。
-
Element Variable:元素变量,必须和Assignee一样。
-
Assignee:负责人占位符,用流程变量来写,变量名与Element Variable保持一致,会通过Collection自动赋值。
Completion Condition
设置为UEL表达式,有如下三种情况
// 一个人完成审批,整个任务就算通过
${nrOfCompletedInstances==1}
// 所有人完成审批,整个任务才算过
${nrOfCompletedInstances==nrOfInstances}
// 一半人以上完成审批整个任务才算通过
${nrOfCompletedInstances/nrOfInstances > 0.5}
会签任务 Assignee
设置的会签任务如下,只要负责人超过半数同意通过,流程就会进入下一节点
流程实例部署代码和启动代码如下
@Test
public void testStart() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署bpmn
Deployment deploy = processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("bpmn/multiInstance.bpmn")
.name("会签")
.deploy();
//启动流程实例 并设置流程变量approveUserList的值 这代表设置会签人员 对应Completion Condition属性
Map<String, Object> variables = new HashMap<>();
variables.put("approveUserList", Arrays.asList("zhagnsan", "lisi", "wangwu"));
processEngine.getRuntimeService()
.startProcessInstanceByKey("multiInstance", variables);
}
会签任务 Candidate Users
区别于Assignee
那种直接把任务绑定到具体的人,然后让这些人投票表决
Candidate Users
圈定一定范围的人,让这些人自己决定要不要参与表决
会签设置:${nrOfCompletedInstances/nrOfInstances==1}
${manageList}
为会签节点所有用户集合
manage
为集合元素
使用执行监听器,为会签节点manageList
添加用户
public class TaskListLineListener implements ExecutionListener {
private ActivitiMapper activitiMapper = SpringContextHolder.getBean(ActivitiMapper.class);
@Override
public void notify(DelegateExecution delegateExecution) throws Exception {
Map<String, Object> map= new HashMap<>();
List<String> manageList = new ArrayList<>();
List<String> cooperates = new ArrayList<>();
List<String> units = new ArrayList<>();
String cooperate = activitiMapper.findCooperate(delegateExecution.getProcessDefinitionId());
String unit = activitiMapper.findUnit(delegateExecution.getProcessDefinitionId());
if(!ObjectUtils.isEmpty(cooperate)){
cooperates = Arrays.asList(cooperate.split(","));
}
if(!ObjectUtils.isEmpty(unit)){
units = Arrays.asList(unit.split(","));
}
manageList.addAll(units);
manageList.addAll(cooperates);
map.put("manageList", manageList);
delegateExecution.setVariables(map);
}
}