在工作使用了activiti工作流程进行业务场景。
系统发布了一个任务,可以进行审核,如果不需要审核则直接下发签收、处置。在下发处置的时候可以由多个用户进行处置,多个用户全部处置并且复核完毕,才能把处置反馈的数据进行整编,归档。
这样呢,肯定是需要用到activiti中的并行子流程。
子流程大家肯定熟悉的,并行子流程呢,我这边简单记录一下实现的方式。
我这边用的activti版本是5.22.0
流程编辑器使用了 activiti-modeler 版本也是5.22.0
完整的流程图:
开始配置并行子流程:
重要说明,集合(多实例):
现在配置成SubprocessUserList,这个只是一个名称,在定义流程变量的时候需要传入key为SubprocessUserList的对象,必须为集合对象,Map、List、Set随意,流程它会自己遍历SubprocessUserList,有多少条会生成多少子流程任务。比如我传了一个List<String>{张三、李四},那么就会生成两个子流程任务。
元素变量:
元素变量就是在启动子流程后,上面的List<String>{张三、李四},怎么把张三、李四放入到签收节点,就是用这个变量。看签收节点的图
当启动子流程的时候,传入的List<String>{张三、李四},会识别到SubprocessUser,自动放入到ASSIGNEE_(处理人中)。
完成条件:
在多实列的情况下需要设置这个,因为多个任务是并行执行的,真正结束并行的条件是什么?并行实列全部完成、只需要完成一半、或者百分之八十。完成条件就是用来控制这个的。我这边设置的是${nrOfCompletedInstances/nrOfInstances==1}。
nrOfCompletedInstances(已完成实例数)和nrOfInstances(总实列数)是流程自己定义的,不需要我们去干预,流程会自己生成完成数。
然后子流程中反馈节点的代理人我也设置的和签收一样,这个大家可以按照自己的需要自己去设置。
复核节点我这边设置一个全新的参数,这个需要我们自己额外设置,如下图:
到这里,所有的配置已经完毕了,其他普通的节点配置、网关判断网上其他资料也很多,请大家可以先把基础的使用学完再看这篇。
最后,流程保存、发布。
代码使用:
流程配置发布完毕后,我们也需要用起来。在代码里面配置流程的必要参数,启动流程。
启动流程:
@Override
public ResultObj startNccpSynergyProcess() {
//流程的key
String processDefinitionKey = "nccpSynergyProcess";
String businessKey = "NccpSynergyProcess-test";
//设置流程参数
HashMap<String, Object> variables = new HashMap<>();
try {
//设置不需要审核
variables.put("ExamineGateway", -1);
//设置子流程个数
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
variables.put("SubprocessUserList", list);
//设置checkUsers复核人员
variables.put("checkUsers", "复核人员");
//设置troopsUsers整编人员
variables.put("troopsUsers", "整编人员");
//设置documentationUsers归档人员
variables.put("documentationUsers", "归档人员");
log.info("流程参数设置完毕,开始启动流程!!!");
//启动流程
this.runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
return ResultObj.START_PROCESS_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
log.info("流程启动失败", e);
this.runtimeService.deleteProcessInstance(processDefinitionKey, businessKey);
return ResultObj.START_PROCESS_ERROR;
}
}
首先,我设置了子流程的集合是一个List,我设置了张三、李四、王五。
variables.put("SubprocessUserList", list); 流程参数通常都是使用Map进行传递。我put的Key就是上面配置的《集合(多实例)SubprocessUserList》。
也在流程启动的时候设置了
variables.put("checkUsers", "复核人员");
//设置不需要审核,流程启动自动进入子流程
variables.put("ExamineGateway", -1);
最后把流程变量Map放入,启动流程。
流程任务完成:
当我们启动流程后,会生成3条签收任务,我们看数据库:
生成了3条任务,处理人分别是张三、李四、王五。
然后加速跳到,3个人全部处理完毕后,再看数据库表:
会自动有三条反馈任务、因为我们前面反馈节点代理设置的变量和签收节点一致。然后我们全部处理完毕。
现在复核人员会分别收到三条反馈后的复核任务。由于我们设置的《完成条件》是${nrOfCompletedInstances/nrOfInstances==1},意味着需要复核人员全部通过复核,子流程才能结束。
全部复核后,就走到了整编节点。这样的话,我们整个并行子流程就结束了。
总结:
并行子流程和普通的子流程还是有一些差异的,并行子流程和并行节点、并行网关都差不多,都依赖于传入一个Collection集合。还需要根据自己业务场景设置完成条件,整体而言配置流程的时候需要细心。
最后也很希望和大家在网络上交流知识!!!!