节点会签

目录

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);
    }
}
posted @ 2022-11-08 14:04  夏·舍  阅读(260)  评论(0编辑  收藏  举报