在进入本文之前,有必要跟大家说一下会签的概念。
会签就是流程中某个任务需要多个人进行审批,并且根据不同的人的审批意见,决定流程的走向。多个人的审批意见需要汇总起来,这个就叫决策,在会签中有许多决策方式。比如一票否决制,少数服从多数,N票认可制,20%否决制,60%赞同制等。基于这种决策方式,我们需要知道会签有哪一些人员参与,决策方式如何。因此我们设计了下面的表:
在会签过程中,有单步会签,多步会签。前者实现相对简单,不过非常常见,几乎所有的政府的OA系统中都存在这种方式,而另一种则相对少用,并且实现相对复杂,不过,其实现方式也可以基于第一种方式进行扩展,所以在本文中仅介绍单步会签。如下流程案例,我们可以看到,在多部门的领导会签审批中,就是这种单步会签,当任务走向该节点时,就需要为每个参与者动态创建任务,这个任务的参与者可以在pro_user_assign表中进行存储,当流程运行至该任务节点时,我们需要根据有多少人员来创建任务。然后再根据每个人员审批意见在该会签节点中进行汇总。
要实现会签,则就需要动态为流程提供创建任务的功能。Jbpm4的Service接口没有提供动态添加的newTask,因此需要扩展TaskServiceImpl,该类中提供了newTask的方法。如:
public void newTask(String parentTaskId,String assignIds){ TaskServiceImpl taskServiceImpl=(TaskServiceImpl) taskService; Task parentTask=taskServiceImpl.getTask(parentTaskId); if(assignIds!=null){ String []userIds=assignIds.split("[,]"); for(int i=0;i<userIds.length;i++){ Task task=taskServiceImpl.newTask(parentTaskId); task.setAssignee(userIds[i]); task.setName(parentTask.getName()); task.setDescription(parentTask.getDescription()); //保存 taskServiceImpl.saveTask(task); //为该任务指派审批人 //taskService.assignTask(task.getId(), assign.getUserId()); //taskService.addTaskParticipatingUser(task.getId(),upIds.toString(),Participation.CANDIDATE); //taskService.addTaskParticipatingGroup(task.getId(), assign.getRoleId(), Participation.CANDIDATE); } } }
基于以上的设计理念,我们有可以比较容易完成这种单步会签,其他方式也可以类似。其最终的完整实现,在后面的文章加以介绍。