最近在开发项目时,遇到了一个流程问题——在流转到下一节点的时候,下一节点的任务会进行分发处理,然后下一节点还可以进行分发处理。
任务分发其实就是Activiti中的会签了,因此很自然地想到了使用Activiti的会签功能了。
首先看一下完整的流程图:
整个流程:由提交人提交表单,选择X个部门责任人,然后创建X个责任人Task,然后每个责任人Task可以选择Y个部门人员回复,最后待Y个部门人员回复完成后由责任人统一将处理意见转给监控员,监控员等待所有责任人的处理意见完成后填写处理意见转给提交人确认。
因此在责任人处理节点是一次会签,在部门人员回复这个地方又存在着一次会签,2次会签存在着父子关系。因此这个地方需要将第二次会签放置到一个子流程中。
第一次会签——子流程
我将dutyUser变量取出来作为责任人处理的流程参与人,如下图:
第二次会签
同理,在部门人员回复这个地方设置会签条件,注意一下:上面的deptUser可直接作为本节点的参与人,如下:
这样就把这种多级会签的流程完成了。
说一下过程中需要注意的地方:
1、在一个节点或者子流程上设置会签,必须要待所有子任务或者达到结束条件后流程节点才会往下一个节点进行流转。
2、Activiti提供了2种子流程的实现,分别为CallActiviti和SubProcess,网上说CallActiviti好用些,因此在第一次我就使用的是它,但是dutyUser怎么都传不到子流程中,直到后面换成了SubProcess才将值传入进去,这个具体的原因我看了一下数据表,CallActiviti的形式在存储变量时excution_id和Task表中的excution_id没法匹配,而SubProcess配可以正常匹配,但这个更加深入的原因我就没有去研究了。
补充一个查询子任务的方法:
Task temp = taskService.createTaskQuery()
.taskId(taskId).singleResult();
List<Execution> elist = runtimeService
.createExecutionQuery()
.parentId(temp.getExecutionId())
.list();
for(Execution exe : elist){
String tid = taskService.createTaskQuery()
.executionId(exe.getId())
.singleResult().getId();
taskService.complete(tid);
}
第一次使用会签功能,就遇到了这种多级会签的情况,在此记录下来,有问题的也希望各位多多指导。