关于JBPM4的会签的设计及实现

在进入本文之前,有必要跟大家说一下会签的概念。

会签就是流程中某个任务需要多个人进行审批,并且根据不同的人的审批意见,决定流程的走向。多个人的审批意见需要汇总起来,这个就叫决策,在会签中有许多决策方式。比如一票否决制,少数服从多数,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);
			}
		}
		
	}
 

基于以上的设计理念,我们有可以比较容易完成这种单步会签,其他方式也可以类似。其最终的完整实现,在后面的文章加以介绍。

猜你喜欢

转载自man1900.iteye.com/blog/562382
今日推荐