Activiti7工作流引擎:进阶篇(十一) 会签、或签

知识传送门 》》》》》》》》》》》》》》》》》》》

请添加图片描述

一:会签

之前的任务负责人Assignee都是一个,而任务可以有多个人有权限审批,只要其中有一部分人完成审批任务就算整个任务完成。同一个任务需要多个负责人来完成被称之为“会签”。 会签就是一种投票,满足投票人数就过。

在这里插入图片描述

会签是通过多实例Multi Instance来设置的:

  • Sequential:执行顺序,true表示多实例顺序执行,false表示多实例并行。
  • Loop Cardinality:循环基数,选填,会签人数。
  • Completion Condition:完成条件,Activiti预定义了3个变量,可以在UEL表达式中直接使用,可以根据表达式设置按数量、按比例、一票通过、一票否定等条件。
    • nrOfInstances:总实例数,Collection中的数量。
    • nrOfCompletedInstances:已经完成的实例数。
    • nrOfActiveInstances:还没有完成的实例数。
  • Collection:Assignee集合,可以在启动实例时赋值变量。
  • Element Variable:元素变量,必须和Assignee一样。
  • Assignee:负责人占位符,会通过Collection自动赋值的。
// 一个人完成审批,整个任务就算通过
${nrOfCompletedInstances==1}

// 所有人完成审批,整个任务才算过
${nrOfCompletedInstances==nrOfInstances}

// 一半人以上完成审批整个任务才算通过
${nrOfCompletedInstances/nrOfInstances > 0.5}

1.1 比例条件

在这里插入图片描述

@Test
public void testStart() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    Deployment deploy = processEngine.getRepositoryService()
            .createDeployment()
            .addClasspathResource("bpmn/multiInstance.bpmn")
            .name("会签")
            .deploy();

    Map<String, Object> variables = new HashMap<>();
    variables.put("approveUserList", Arrays.asList("zhagnsan", "lisi", "wangwu"));
    processEngine.getRuntimeService()
            .startProcessInstanceByKey("multiInstance", variables);
}

在这里插入图片描述

// 第一负责人完成审核
taskService.complete("5020");

在这里插入图片描述

// 第二个负责人再完成,3个人有2个人完成就超过一半了,所以这个UserTask就算过了,进入下一个UserTask
taskService.complete("5023");

在这里插入图片描述

1.2 自定义会签完成条件

在这里插入图片描述

@Component
public class MultiInstanceCompleteCondition implements Serializable {

    public boolean isCompleteTask(DelegateExecution execution) {
        // 总会签数量
        Object nrOfInstances = execution.getVariable("nrOfInstances");
        // 会签还没有完成正在激活的数量
        Object nrOfActiveInstances = execution.getVariable("nrOfActiveInstances");
        // 已经完成的实例数
        Object nrOfCompletedInstances = execution.getVariable("nrOfCompletedInstances");
        System.out.println(nrOfInstances + "-" + nrOfActiveInstances + "-" + nrOfCompletedInstances);
        // 通过外部传参来控制整个会签是否能结束
        Boolean isCompleteTaskFlag = (Boolean)execution.getVariable("isCompleteTaskFlag");
        return isCompleteTaskFlag;
    }
}
@Test
void delopyStartProcess() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    Deployment deploy = processEngine.getRepositoryService()
            .createDeployment()
            .addClasspathResource("processes/MultiInstaceProcess.bpmn")
            .name("多实例自定义完成条件")
            .deploy();

    Map<String, Object> variables = new HashMap<>();
    variables.put("approveList", Arrays.asList("huihui", "mondy", "hr"));
    runtimeService.startProcessInstanceByKey("MultiInstanceProcess", variables);
}
@Test
void completeMultiInstanceTask() {
    String currentUserId = "monday";
    boolean isCompleteTaskFlag = false;
    if ("monday".equals(currentUserId)) {
        // 根据业务逻辑自定义完成条件(只要mondy审批完成整个会签就结束)
        isCompleteTaskFlag = true;
    }

    Map<String, Object> variables = new HashMap<>();
    variables.put("isCompleteTaskFlag", isCompleteTaskFlag);

    Task task = taskService.createTaskQuery()
            .processInstanceId("7501")
            .taskAssignee("mondy")
            .singleResult();
    taskService.complete(task.getId(), variables);
}

在这里插入图片描述


二:或签

或签和会签都是使用的多实例来完成的(一个节点有多个人Assignee审批),不同的只是完成条件(Completion Condition)不同而已:

  • 会签:审批完成条件可以任意设置,可以一个人审批、几个人审批、所有人审批等。
  • 或签:审批条件时只要或者至少有一个人审批(无论通过或者拒绝),整个节点就会流转,完成条件:${nrOfCompletedInstances >= 1}

在这里插入图片描述

2.1 通过

Deployment deploy = repositoryService.createDeployment()
       .addClasspathResource("processes/MultiInstaceProcess.bpmn")
       .name("或签流程")
       .deploy();

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MultiInstanceProcess");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.setAssignee(task.getId(),"zhangsan");

Map<String, Object> variables = new HashMap<>();
variables.put("approveList", Arrays.asList("huihui", "mondy", "hr"));
taskService.complete(task.getId(), variables);

task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskAssignee("huihui").singleResult();
taskService.complete(task.getId());

会签节点审批人有3个:“huihui”, “mondy”, “hr”,其中"huihui"审批通过,整个审批节点流转到下一个节点。act_ru_task 删除该流程实例下的所有认为,act_hi_taskinst 所有会签人审批完成,end_time_都有值,真正审批的那个人delete_reason_是null,其它会签人的删除原因是有值的 “Multi-instance complete condition expression passed”。
在这里插入图片描述

2.2 审批拒绝

Deployment deploy = repositoryService.createDeployment()
        .addClasspathResource("processes/MultiInstaceProcess.bpmn")
        .name("或签流程")
        .deploy();

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MultiInstanceProcess");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.setAssignee(task.getId(),"zhangsan");

Map<String, Object> variables = new HashMap<>();
variables.put("approveList", Arrays.asList("huihui", "mondy", "hr"));
taskService.complete(task.getId(), variables);

// 多实例拿第一个
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list().get(0);

String currentTaskId = task.getId();
String targetTaskDefKey = "userCommit";
MoveTaskCommand moveTaskCommand = new MoveTaskCommand(currentTaskId, targetTaskDefKey);
managementService.executeCommand(moveTaskCommand);

act_ru_task 退回到上一节点。
在这里插入图片描述
act_hi_taskinst 中所有会签节点end_time_都有值了,但是delete_reason_不同,节点退回到上一个节点了(注意:MoveTaskCommand是自己实现的,这里如果如果不想其它审批人的end_time_为null时可以修改该方法实现)。
在这里插入图片描述
act_hi_actinst 这里的end_time_都为null。
在这里插入图片描述

知识传送门 》》》》》》》》》》》》》》》》》》》

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值