前言
有次面试过程中被问到了JBPM如何实现会签,于是回来后查了写相关资料,整理了一下,跟大家一起分享下。
正题
一、会签概述
会签就是多人同时对一个任务进行操作,那么针对会签有一下几种情况:
1)会签中某一个人不同意,就马上退回节点到申请;
2)全部会签结束后,如果有不同意的,则退回节点到申请;
3)全部会签结束后,超过半数不同意的,退回节点到申请。
二、jbpm4.4实现会签
我们知道工作流要支持串行和并行,所以它肯定也支持我们的会签(并行)。今天主要以第一种情况“一票否决制”来进行编写。
1.实现思路
在会签节点任务创建后,通过程序按会签人数创建出对应的会签子任务,对应到具体的审批人上。
即提交到会签后,获取到会签的task,然后针对这个task创建subtask。
2.流程图
流程图很简单,就是一个Task来表示会签节点,由于我们的思路是在会签节点上创建子节点,所以具体的实现需要从我们的代码中进行查看。
process.jpd.xml
<?xml version="1.0" encoding="UTF-8"?> <process name="会签实例" xmlns="http://jbpm.org/4.3/jpdl" description="会签中一个不同意,会签就结束"> <start g="110,14,48,48" name="Start"> <transition g="-95,-17" name="to JointlySign" to="会签"/> </start> <end g="110,264,48,48" name="End"/> <task g="88,96,92,52" name="会签"> <assignment-handler class="com.baihe.testjbpm2.AssignTask"> </assignment-handler> <transition g="-71,-17" name="to 执行" to="执行"/> <transition g="-41,-17" name="to 结束" to="End"/> </task> <state g="16,180,92,52" name="执行"> <transition g="-41,-17" name="to End" to="End"/> </state> </process>
3.实现代码
环境:MyEclipse8.5+jbpm4.4
AssignTask.java
package com.baihe.testjbpm2; import java.util.List; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.TaskService; import org.jbpm.api.model.OpenExecution; import org.jbpm.api.task.Assignable; import org.jbpm.api.task.AssignmentHandler; import org.jbpm.api.task.Participation; import org.jbpm.api.task.Task; import org.jbpm.pvm.internal.task.OpenTask; public class AssignTask implements AssignmentHandler{ private static final long serialVersionUID = 1L; List<String> participants; ProcessEngine processEngine=Configuration.getProcessEngine(); TaskService taskService=processEngine.getTaskService(); @SuppressWarnings("unchecked") public void assign(Assignable assignable, OpenExecution execution) throws Exception { //System.out.println("分配"); String pid=execution.getProcessInstance().getId(); //System.out.println("pid :"+pid); Task task=taskService.createTaskQuery().processInstanceId(pid).activityName(execution.getName()).uniqueResult(); //System.out.println(task.getName()); participants=(List<String>)taskService.getVariable(task.getId(), "participants"); if(participants!=null){ for(String participant:participants){ //System.out.println(participant); Task subTask=((OpenTask)task).createSubTask(); subTask.setAssignee(participant); taskService.addTaskParticipatingUser(task.getId(), participant, Participation.CLIENT); } } } }
Sign.java
package com.baihe.testjbpm2; import org.jbpm.api.TaskService; import org.jbpm.api.cmd.Command; import org.jbpm.api.cmd.Environment; import org.jbpm.api.task.Task; public class Sign implements Command<Boolean>{ private static final long serialVersionUID = 1L; public static String VAR_SIGN="同意"; private String PASS; private String NOPASS; private String parentTaskId; private Task parentTask; private Task joinTask; String pid; public Sign(String parentTaskId,Task joinTask,String PASS,String NOPASS){ this.parentTaskId=parentTaskId; this.PASS=PASS; this.NOPASS=NOPASS; this.joinTask=joinTask; } public String getPid(){ return pid; } public Boolean execute(Environment environment) throws Exception { TaskService taskService=environment.get(TaskService.class); parentTask=taskService.getTask(parentTaskId); pid=parentTask.getExecutionId(); String sign=(String)taskService.getVariable(joinTask.getId(), VAR_SIGN); if(sign!=null&&sign.equals("不同意")){ taskService.completeTask(joinTask.getId()); taskService.completeTask(parentTask.getId(), NOPASS); return true; } taskService.completeTask(joinTask.getId()); if(taskService.getSubTasks(parentTaskId).size()==0){ taskService.completeTask(parentTaskId,PASS); return true; } return false; } }
test.java
package com.baihe.testjbpm2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jbpm.api.Configuration; import org.jbpm.api.ExecutionService; import org.jbpm.api.HistoryService; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import org.jbpm.api.RepositoryService; import org.jbpm.api.TaskService; import org.jbpm.api.history.HistoryProcessInstance; import org.jbpm.api.task.Task; public class Test { public static void main(String []args){ ProcessEngine processEngine=Configuration.getProcessEngine(); ExecutionService executionService=processEngine.getExecutionService(); TaskService taskService=processEngine.getTaskService(); RepositoryService repositoryService=processEngine.getRepositoryService(); repositoryService.createDeployment().addResourceFromClasspath("com/baihe/jbpm/process.jpdl.xml").deploy(); Map<String,Object> variables=new HashMap<String,Object>(); List<String> pariticipants=new ArrayList<String>(); pariticipants.add("yunix"); pariticipants.add("snrqtdhuqf"); variables.put("participants", pariticipants); ProcessInstance processInstance=executionService.startProcessInstanceByKey("会签实例",variables); Task task=taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .activityName(processInstance.findActiveActivityNames().iterator().next()).uniqueResult(); //System.out.println(task.getId()); Task joinTask=taskService.findPersonalTasks("yunix").get(0); Sign sign=new Sign(task.getId(),joinTask,"to 执行","to 结束"); processEngine.execute(sign); joinTask=taskService.findPersonalTasks("snrqtdhuqf").get(0); sign=new Sign(task.getId(),joinTask,"to 执行","to 结束"); processEngine.execute(sign); processInstance=executionService.findProcessInstanceById(processInstance.getId()); System.out.println(processInstance.isActive("执行")); String executionId = processInstance.findActiveExecutionIn("执行").getId(); processInstance=executionService.signalExecutionById(executionId); System.out.println("流程是否结束:"+processInstance.isEnded()); processInstance=executionService.startProcessInstanceByKey("会签实例",variables); System.out.println("会签不通过流程开始,流程ID为:"+processInstance.getId()+" "); task=taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .activityName(processInstance.findActiveActivityNames().iterator().next()) .uniqueResult(); joinTask=taskService.findPersonalTasks("yunix").get(0); Map<String,Object> v=new HashMap<String,Object>(); v.put(Sign.VAR_SIGN, "不同意"); taskService.setVariables(joinTask.getId(), v); sign=new Sign(task.getId(),joinTask,"to 执行","to 结束"); System.out.println(processEngine.execute(sign)); HistoryService historyService=processEngine.getHistoryService(); List<HistoryProcessInstance> hProcessInstances = historyService.createHistoryProcessInstanceQuery().processInstanceId(processInstance.getId()) .list(); for(HistoryProcessInstance h:hProcessInstances){ System.out.println("流程"+processInstance.getId()+"状态:"+h.getState()); } } }
测试结果:
true
流程是否结束:true
会签不通过流程开始,流程ID为:会签实例.17
true
流程会签实例.17状态:ended
注:本文属于转载,原文地址:http://blog.163.com/wex660@126/blog/static/24153065201142301621118/