概述
如下图为一个流程图,其需求过程如下:
1、某业务员发起一个登记单
2、领导审批
3、领导选择多个部门进行阅办,每个部门并行进行
4、部门内有两个审批环节(环节一:部门经理或经理助理或签,环节二:部门内的多个主管会签)
5、每个部门各自进行,互不影响,等所有部门都办理完成后进行汇总归档,登记单状态为“已归档”
6、流程结束
特殊场景:在多个部门进行并行阅办的过程中,只要登记单的状态还不是已归档状态,第二个节点的领导,还可以随时增加阅办的部门(从技术的角度来说,只要子流程节点还是活动状态,就可以随时增加子流程活动节点的实例数)。
结合上面的需求和已经画好的流程图,综合来看已经很清楚实现了,并行子流程应对 “多节点为一组” 独立并行流转的场景最为合适。
在中途为子流程环节增加实例的代码如下:
// RuntimeService 为 camunda 内置的对象,可以直接注入使用
@Autowired
private RuntimeService runtimeService;
@Test
public void addInstance(){
// 整个流程的流程实例Id
String processInstanceId = "d0a284f3-af8e-11ea-88c4-000ec6dd34b8";
// 子流程节点的Id,在流程图中查看,此为固定值(一般起一个正规的名字,本例是自动生成的随机名)
String activityId = "Activity_0qs5wc1";
runtimeService.createProcessInstanceModification(processInstanceId)
.startBeforeActivity("Activity_0qs5wc1") // 子流程Id,在流程图中看,固定值(一般起一个正规的名字)
.setVariable("带入子流程的变量key","变量值Object类型")
.execute();
System.out.println("增加子流程实例成功");
}
代码执行完成后,观察数据库表
act_ru_excution
、act_ru_task
和act_ru_variable
会有数据变化。
其他说明:
1、节点的并行实例,就是为节点设置
Parallel Multi Instance
属性,即节点上的三个竖线的那个状态。
2、为节点设置Parallel Multi Instance
并行属性,是实现节点会签的方法。
3、为并行节点设置Completion Condition
条件为${nrOfCompletedInstances == 1}
,是实现或签的方法。
4、为节点设置Sequential Multi Instance
属性,是实现顺序依次签的方法。
5、参考上述代码,设置变量.setVariable("assignee","新加签的用户")
,可以为并行会签节点进行加签。
6、为并行节点设置Completion Condition
属性,条件设置为${nrOfPassInstances / nrOfInstances > 0.5}
,是实现会签比例大于 50% 自动通过的方法(其中nrOfPassInstances
不是 camunda 内置变量,是通过 complete 监听器自己维护的一个变量,节点每个实例完成后如果是同意则 nrOfPassInstances 加1)。
下面是跳转节点
的实现代码:
在一些业务场景中,允许管理员或某个角色对运行中的流程进行节点跳转(或成为调度)操作,也就是可以将流程的任意一个节点设置为一个活动节点(为了保证流程允许的完整性同时会取消当前所有的活动节点)。
可以代码如下:
// RuntimeService 和 TaskService 为 camunda 内置的对象,可以直接注入使用
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Test
public void jumpNode(){
// 整个流程的流程实例Id
String processInstanceId = "d0a284f3-af8e-11ea-88c4-000ec6dd34b8";
// 需要跳转到的节点Id(可以是任意节点)
String targetActivityId = "Activity_0qs5wc1";
ProcessInstanceModificationBuilder processInstanceModificationBuilder = runtimeService.createProcessInstanceModification(processInstanceId);
Set<String> activityIdSet = new HashSet<>();
taskService.createTaskQuery().processInstanceId(processInstanceId).active().list().forEach(taskQuery -> {
String activityId = taskQuery.getTaskDefinitionKey();
if(activityIdSet.add(activityId)){
processInstanceModificationBuilder.cancelAllForActivity(activityId);
}
});
processInstanceModificationBuilder.startBeforeActivity(targetActivityId)
.setVariable("带入目标节点的变量key","变量值Object类型")
.execute();
System.out.println("流程处理成功");
}
(END)
最后
以上就是清爽小松鼠为你收集整理的Camunda 工作流并行子流程、工作流会签、或签、加签、比例签、跳转节点的全部内容,希望文章能够帮你解决Camunda 工作流并行子流程、工作流会签、或签、加签、比例签、跳转节点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复