知识传送门 》》》》》》》》》》》》》》》》》》》
一:会签
之前的任务负责人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。

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/118565.html