应用场景:在企业或事业单位,经常需要把一个任务分派给多条线去处理,每条线可以由一个或多个步骤构成,多条线的任务完成后需要再汇总一起于某个任务上。如下例子为一个公文下发流程,这个流程就涉及到任务的两级分发。
图一 原流程定义图
qq:1848175569
图二 执行过程中流程图
以上黄色的代表任务分发,紫黄代表任务汇总。
解决方法一:
我们可以把多个任务线用子流程去实现也可以,这样在分发那里会产生多个子流程,子流程完成后,需要汇总。但若有多级分发与汇总,则需要子流程再嵌套子流程。
解决方法二:
把分发的任务线当作普通的任务来实现,该产生多少个任务可由分发任务决定,这些任务的名称是一样的,但任务实例id不一样,执行人不一样。
在jbpm4或Activiti5上,动态创建子流程及对子流程的处理上,相对要完成的工作多一些,主要是activity或jbpm4上没有提供这块api。而动态创建任务在jbpm4或activiti5上也是没有提供的,只有activiti5上提供了一个taskService.newTask,而该方法产生的新任务则跟流程定义无关,则表示该任务完成后,不能产生后续的任务。在此,我们先提供activiti5的解决办法。Jbpm4的解决方法可以参照该方式实现,以下为解决方案的步骤:
1. 第二种解决方案的关键点在于如何动态创建任务,在这里,我们绕过activiti的API直接对activiti5表进行生成处理,让他生成我们需要流程数据。
如下所示:
- /**
- * 按任务Id,复制另一会签任务出来
- * @param orgTaskId
- * @param assignee
- * @return
- */
- public ProcessTask newTask(String orgTaskId,String assignee)
- {
- String newExecutionId=UniqueIdUtil.getNextId();
- String newTaskId=UniqueIdUtil.getNextId();
- TaskEntity taskEntity=getTask(orgTaskId);
- ExecutionEntity executionEntity=null;
- if(taskEntity.getExecution()!=null){
- executionEntity=taskEntity.getExecution();
- }else{
- executionEntity=getExecution(taskEntity.getExecutionId());
- }
- ProcessExecution newExecution=new ProcessExecution(executionEntity);
- newExecution.setId(newExecutionId);
- ProcessTask newTask=new ProcessTask(taskEntity);
- newTask.setId(newTaskId);