个人任务,就是需要一个人执行的流程,这个比较简单,我们可以采用直接在assignee选项中添加执行人就可以了。但是问题来了,这样写的话太限制了,如果我使用相同的流程,可是执行人换了呢??这就需要用变量这种动态的方法来指定某个人来处理这个流程任务。下面介绍两种个人任务的方法:
个人任务
第一种:使用流程变量指定:
代码如下:
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();//定义工作流引擎
@Test public void deploymentProcessDefinition_zip(){ //因为测试类和Bpmn文件在同一个目录下,所以不用getClassLoader方法 InputStream inputStreamBpmn=this.getClass().getResourceAsStream("personalTask.bpmn"); InputStream inputStreamPng=this.getClass().getResourceAsStream("personalTask.png"); Deployment deployment =processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("个人任务")//添加部署的名称 .addInputStream("personalTask.bpmn", inputStreamBpmn) .addInputStream("personalTask.png",inputStreamPng) .deploy();//完成部署 System.out.println(deployment.getId()); System.out.println(deployment.getName()); }
/**启动流程实例*/ @Test public void startProcessInstance(){ //流程定义的key String processDefinitionKeyString="personalTask"; //启动流程实例的同时,设置流程变量,使用流程便令用来指定任务的办理人,对应.bpmn文件中的#{userID} HashMap<String, Object> variables =new HashMap<String,Object>(); variables.put("userID", "EricaLi");
ProcessInstance pInstance= processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service .startProcessInstanceByKey(processDefinitionKeyString,variables);
System.out.println(pInstance.getId());//流程实例ID System.out.println(pInstance.getProcessDefinitionId());//流程定义ID } |
这样,在开发中,就可以通过页面获取指定的业务办理人的方法来通过流程变量设置下一个任务的办理人。
第二种方法:使用实现TaskListener的方法:
新建一个实现类:
package cn.itcast.k_personalTask;
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener;
@SuppressWarnings("serial") public class TaskListenerImplimplements TaskListener {
//用来指定任务的办理人 @Override public void notify(DelegateTask delegateTask) { //指定个人任务的办理人,也可以指定组任务的办理人 //个人任务:通过类查询数据库,将下一个任务的办理人查询获取 根据业务查询,比如查到了"郭襄"
//然后通过setAssignee()的方法指定任务的办理人 delegateTask.setAssignee("郭襄");
}
} |
选择刚刚新建的实现类
启动流程的代码如下:
/**启动流程实例*/ @Test public void startProcessInstance(){ //流程定义的key String processDefinitionKeyString="personalTask";
ProcessInstance pInstance= processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service .startProcessInstanceByKey(processDefinitionKeyString);
System.out.println(pInstance.getId());//流程实例ID System.out.println(pInstance.getProcessDefinitionId());//流程定义ID } |
这样运行的时候,到了这个任务节点,就会先走实现类,来实例化一个处理人,然后再执行流程。
还可以分配任务从一个人到另一个人(认领任务):在一个人没有时间处理的时候,可以指定给另一个人处理
public void setAssigneeTask(){ //任务ID String taskId ="5804"; //指定的办理人 String userId ="BANGBANG"; processEngine.getTaskService() .setAssignee(taskId, userId);
} |
上面是针对个人任务的,还有组任务,我的理解就是:需要这个组的人同意,流程才可以往下进行。
同样,我们设置组任务的时候可以在任务节点的main config中的cand中直接指定有哪些人可以作为一组。如下:
但是这样做又会有限制的问题,我不能每次都重新手动填写这个组的成员,所以就有了其他两种方法来分配组任务:
组任务
第一种:使用流程变量
/**启动流程实例*/ @Test public void startProcessInstance(){ //流程定义的key String processDefinitionKeyString="groupTask"; //启动流程实例的同时,设置流程变量,使用流程变量用来指定任务办理人组 java.util.Map<String,Object> variables =new HashMap<String, Object>(); variables.put("userIds", "哈哈,颂乐,泰妍");
ProcessInstance pInstance= processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service .startProcessInstanceByKey(processDefinitionKeyString,variables);
System.out.println(pInstance.getId());//流程实例ID System.out.println(pInstance.getProcessDefinitionId());//流程定义ID } |
第二种:实用实现TaskListener类的方法:
这里Listeners里面选择GroupTaskListenerImpl类
@SuppressWarnings("serial") public class GroupTaskListenerImpl implements TaskListener {
//用来指定任务的办理人 @Override public void notify(DelegateTask delegateTask) { //指定个人任务的办理人,也可以指定组任务的办理人 //组任务: delegateTask.addCandidateUser("颂乐"); delegateTask.addCandidateUser("泰妍");
}
} |
这样启动流程代码如下:
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();//定义工作流引擎
@Test public void deploymentProcessDefinition_zip(){ //因为测试类和Bpmn文件在同一个目录下,所以不用getClassLoader方法 InputStream inputStreamBpmn=this.getClass().getResourceAsStream("groupTask.bpmn"); InputStream inputStreamPng=this.getClass().getResourceAsStream("groupTask.png"); Deployment deployment =processEngine.getRepositoryService()//与流程定义和部署对象相关的service .createDeployment()//创建一个部署对象 .name("组任务")//添加部署的名称 .addInputStream("groupTask.bpmn", inputStreamBpmn) .addInputStream("groupTask.png",inputStreamPng) .deploy();//完成部署 System.out.println(deployment.getId()); System.out.println(deployment.getName()); }
/**启动流程实例*/ @Test public void startProcessInstance(){ //流程定义的key String processDefinitionKeyString="groupTask";
ProcessInstance pInstance= processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service .startProcessInstanceByKey(processDefinitionKeyString);
System.out.println(pInstance.getId());//流程实例ID System.out.println(pInstance.getProcessDefinitionId());//流程定义ID } |
组任务和个人任务的不同是,组任务可以把任务节点指定给一个人,也可以添加或者删除某个人到组任务中。
//拾取任务,将组任务分配给个人任务 public void claim(){ //将组任务分配个个人任务
String taskId ="6204"; String userId ="Tiffany"; //分配的个人任务(可以是组任务中的成员,也可以是非组任务中的成员) processEngine.getTaskService() .claim(taskId, userId); }
//将个人任务回退到组任务,前提:之前一定是一个组任务 public void setAssigee(){ String taskId ="6204"; processEngine.getTaskService() .setAssignee(taskId, null); }
//向组任务中添加成员 public void addGroupUser(){ String taskId ="6204"; String userId ="Jessica"; processEngine.getTaskService() .addCandidateUser(taskId, userId); }
//向组任务中删除成员 public void deleteGroupUser(){ String taskId ="6204"; String userId ="颂乐"; processEngine.getTaskService() .deleteCandidateUser(taskId, userId); } |