Activiti进阶(十一)——分配组任务的三种方式
2016-07-04 17:21
639 查看
这篇博客要给大家介绍一下分配组任务的三种方式:
组任务分配方式一:直接指定组任务任务办理人
组任务分配方式二:使用流程变量
组任务分配方式三:使用类
下面呢将具体介绍这三种不同的方法:
一、流程图:
![](http://img.blog.csdn.net/20151227143212565)
图: 配组任务的三种方式
1.在任务节点设置办理人
![](http://img.blog.csdn.net/20151227151620604)
2.测试代码
![](http://img.blog.csdn.net/20160704155110741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、分配组任务方式二:使用流程变量
1.在任务节点设置变量
![](http://img.blog.csdn.net/20151227153328314)
2、测试代码
![](http://img.blog.csdn.net/20160704165731175?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
三、分配组任务方式三:使用类
1.编写类
![](http://img.blog.csdn.net/20151227154130920)
3.测试代码
说明:
1)在类中使用delegateTask.addCandidateUser(userId);的方式分配组任务的办理人,此时郭靖和黄蓉是下一个任务的办理人。
2)通过processEngine.getTaskService().claim(taskId,userId);将组任务分配给个人任务,也叫认领任务,即指定某人去办理这个任务,此时有郭靖去办理任务。
注意:认领任务的时候,可以是组任务成员中的人,也可以不是组成员中的人。此时通过type的类型
为participant来指定任务办理人。
3)addCandidateUser()即向组任务添加成员,deleteCandidateUser()即删除组任务成员。
4)在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四和王五,这样张三
提交任务,由李四或者王五去查询组任务,可以看到对应张三的申请,李四或者王五在通过任务认领(claim)
的方式,由某个人去完成这次任务。
四、总结
![](http://img.blog.csdn.net/20160704171937513?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
组任务分配方式一:直接指定组任务任务办理人
组任务分配方式二:使用流程变量
组任务分配方式三:使用类
下面呢将具体介绍这三种不同的方法:
一、流程图:
图: 配组任务的三种方式
1.在任务节点设置办理人
2.测试代码
public class group { ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine(); /**部署流程定义*/ @Test public void deployementProcessDefinition(){ String resourceNamebpmn = "group.bpmn"; String resourceNamepng = "group.png"; InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn"); InputStream inputStreamPng = this.getClass().getResourceAsStream("group.png"); /**部署流程定义*/ Deployment deployment = processEngine.getRepositoryService() .createDeployment()//创建部署对象 .name("组任务") .addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加载资源文件 .addInputStream(resourceNamepng, inputStreamPng) .deploy(); System.out.println("部署ID:"+deployment.getId()); } @Test public void startProcessInstance() { //启动流程实例 String processDefinitionKey ="group"; ProcessInstance pi = processEngine.getRuntimeService() .startProcessInstanceByKey(processDefinitionKey); System.out.println("流程实例ID:"+pi.getId()); System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); } /**查看小A当前的个人任务,未查询出结果*/ @Test public void findPersonTask(){ String assignee = "小A"; List<Task> list =processEngine.getTaskService() .createTaskQuery() .taskAssignee(assignee)//指定个人任务,指定办理人 .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("#######################################"); } } } /**查看小A当前的组任务*/ @Test public void findGroupTask(){ String candidateUser = "小A"; List<Task> list =processEngine.getTaskService() .createTaskQuery() .taskCandidateUser(candidateUser)//指定组任务 .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("#######################################"); } } /* * 查询结果: 任务ID:132504 任务的办理人:null 任务名称:审核 任务的创建时间:Mon Jul 04 14:14:38 GMT+08:00 2016 流程实例ID:132501 ####################################### 注意:任务办理人为null的话有两种可能1是没有办理人,2是组任务 */ } /**查询正在执行的任务的办理人*/ @Test public void findRunPersonTask(){ String taskId ="132504"; List<IdentityLink> list = processEngine.getTaskService() .getIdentityLinksForTask(taskId); if(list!=null && list.size()>0){ for(IdentityLink idLink:list){ System.out.println("UserID:"+idLink.getUserId()); System.out.println("类型(参与者或者候选者):"+idLink.getType()); System.out.println("任务ID:"+idLink.getTaskId()); System.out.println("流程实例ID:"+idLink.getProcessInstanceId()); System.out.println("#######################################"); } } /* *查询结果: UserID:小C 类型(参与者或者候选者):candidate 任务ID:132504 流程实例ID:null ####################################### UserID:小B 类型(参与者或者候选者):candidate 任务ID:132504 流程实例ID:null ####################################### UserID:小D 类型(参与者或者候选者):candidate 任务ID:132504 流程实例ID:null ####################################### UserID:小A 类型(参与者或者候选者):candidate 任务ID:132504 流程实例ID:null ####################################### */ //注意:由查询结果,我们可以看出组任务的办理人都有两种类型,一种是参与者类型(participant),一种是候选者类型 //候选者类型(candidate)的记录会指定任务ID,但是不会指定流程实例ID ,参与者类型不会指定任务ID,但是会指定流程实例ID //候选者不一定参与了任务 } /**查询历史任务的办理人表*/ @Test public void findHistoryPersonTask(){ String processInstanceId ="132501"; List<HistoricIdentityLink> list= processEngine.getHistoryService() .getHistoricIdentityLinksForProcessInstance(processInstanceId);//使用流程实例查(查询的参与者) //.getHistoricIdentityLinksForTask(taskId);//使用任务ID查询(查询的候选者) if(list!=null && list.size()>0){ for(HistoricIdentityLink hil:list){ System.out.println("UserID:"+hil.getUserId()); System.out.println("类型(参与者或者候选者):"+hil.getType()); System.out.println("任务ID:"+hil.getTaskId()); System.out.println("流程实例ID:"+hil.getProcessInstanceId()); System.out.println("#######################################"); } } /* * 查询结果: UserID:小C 类型(参与者或者候选者):participant 任务ID:null 流程实例ID:132501 ####################################### UserID:小B 类型(参与者或者候选者):participant 任务ID:null 流程实例ID:132501 ####################################### UserID:小D 类型(参与者或者候选者):participant 任务ID:null 流程实例ID:132501 ####################################### UserID:小A 类型(参与者或者候选者):participant 任务ID:null 流程实例ID:132501 ####################################### */ // 注意:当使用getHistoricIdentityLinksForProcessInstance()查询的时候查询的是参与者 } /**候选者不一定真正的参与任务的办理,所以我们需要拾取任务,将组任务分配给个人任务,即指定任务办理人字段*/ @Test public void cliam(){ //将组任务分配给个人任务 //任务ID String taskId ="132504"; //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员) String userId ="大F"; processEngine.getTaskService() .claim(taskId, userId); //当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值为'大F' //此时任务就指定给了大F,在用小A或者下B等在去查个人组任务的话,就查询不出来任何任务【组任务最终也是需要指定一个人办理的,所以需要拾取任务】 } /**将个人任务回退到组任务,前提:之前一定是一个组任务*/ @Test public void setAssigee(){ //将组任务分配给个人任务 //任务ID String taskId ="132504"; processEngine.getTaskService() .setAssignee(taskId, null); //当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值由'大F'变为了null, //将本来指定给大F的任务又回退成为组任务,这时就可以重新拾取任务将任务分配给组成员小A或者小B等 } /**向组任务中添加组成员*/ @Test public void addGroupUser(){ //任务ID String taskId ="132504"; //成员办理人 String userId ="大H"; processEngine.getTaskService() .addCandidateUser(taskId, userId); //当执行完之后查询正在执行的任务表(act_ru_identitylink`)可以发现大H添加进去了 } /**删除组任务中的成员*/ @Test public void deleteGroupUser(){ //任务ID String taskId ="132504"; //成员办理人 String userId ="小B"; processEngine.getTaskService() .deleteCandidateUser(taskId, userId); //当执行完之后查询正在执行的任务表(act_ru_identitylink`)可以发现小B类型为候选者类型(candidate)的那条记录被删除了 } /**拾取任务给小A*/ @Test public void cliamA(){ //将组任务分配给个人任务 //任务ID String taskId ="132504"; //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员) String userId ="小A "; processEngine.getTaskService() .claim(taskId, userId); //当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值为'小A' //此时任务就指定给了小A } /**小A完成任务*/ @Test public void completeTask(){ String taskId ="132504"; processEngine.getTaskService() .complete(taskId); } }
二、分配组任务方式二:使用流程变量
1.在任务节点设置变量
2、测试代码
public class group { ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine(); /**部署流程定义*/ @Test public void deployementProcessDefinition(){ String resourceNamebpmn = "group.bpmn"; String resourceNamepng = "group.png"; InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn"); InputStream inputStreamPng = this.getClass().getResourceAsStream("group.png"); /**部署流程定义*/ Deployment deployment = processEngine.getRepositoryService() .createDeployment()//创建部署对象 .name("组任务") .addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加载资源文件 .addInputStream(resourceNamepng, inputStreamPng) .deploy(); System.out.println("部署ID:"+deployment.getId()); } /** * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人 * 流程变量的名称,就是在group.bpmn中定义activiti:candidateUsers="#{userIDs}"的userIDs * 流程变量的值,就是任务的办理人(组任务) */ @Test public void startProcessInstance() { //启动流程实例 String processDefinitionKey ="group"; //设置流程变量 Map<String, Object> variables = new HashMap<String, Object>(); variables.put("userIDs", "大大,小小,中中"); //启动流程实例的时候设置流程变量 ProcessInstance pi = processEngine.getRuntimeService() .startProcessInstanceByKey(processDefinitionKey, variables);//使用流程定义的key的最新版本启动流程 System.out.println("流程实例ID:"+pi.getId()); System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); } /**查看大大当前的组任务*/ @Test public void findGroupTask(){ String candidateUser = "大大"; List<Task> list =processEngine.getTaskService() .createTaskQuery() .taskCandidateUser(candidateUser) .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("#######################################"); } } /* * 查询结果: 任务ID:162505 任务的办理人:null 任务名称:审核 任务的创建时间:Mon Jul 04 16:53:15 GMT+08:00 2016 流程实例ID:162501 ####################################### 注意:任务办理人为null的话有两种可能1是没有办理人,2是组任务 */ }
三、分配组任务方式三:使用类
1.编写类
public class TaskListenerImpl implements TaskListener { /** * 可以设置任务的办理人(个人组人和组任务) */ @Override public void notify(DelegateTask delegateTask) { //指定组任务 delegateTask.addCandidateUser("郭靖"); delegateTask.addCandidateUser("huangr"); } }2.设置任务监听
3.测试代码
public class TaskTest { //流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /**部署流程定义+启动流程实例*/ @Test public void deployementAndStartProcess(){ InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn"); InputStream inputStreampng = this.getClass().getResourceAsStream(group.png"); Deployment deployment = processEngine.getRepositoryService()// .createDeployment()//创建部署对象 .addInputStream("group.bpmn", inputStreamBpmn)//部署加载资源文件 .addInputStream("group.png", inputStreampng)// .deploy(); System.out.println("部署ID:"+deployment.getId()); //启动流程实例 ProcessInstance pi = processEngine.getRuntimeService()// .startProcessInstanceByKey("group");//使用流程定义的key的最新版本启动流程 System.out.println("流程实例ID:"+pi.getId()); System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); } /**查询我的个人任务*/ @Test public void findPersonalTaskList(){ //任务办理人 String assignee = "郭靖"; List<Task> list = processEngine.getTaskService()// .createTaskQuery()// .taskAssignee(assignee)//个人任务的查询 .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("#######################################"); } } } /**查询组任务*/ @Test public void findGroupTaskList(){ //任务办理人 String candidateUser = "郭靖"; List<Task> list = processEngine.getTaskService()// .createTaskQuery()// .taskCandidateUser(candidateUser)//参与者,组任务查询 .list(); if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("#######################################"); } } } /**完成任务*/ @Test public void completeTask(){ //任务ID String taskId = "6308"; processEngine.getTaskService()// .complete(taskId); System.out.println("完成任务:"+taskId); } /**查询正在执行的组任务列表*/ @Test public void findGroupCandidate(){ //任务ID String taskId = "5909"; List<IdentityLink> list = processEngine.getTaskService()// .getIdentityLinksForTask(taskId); if(list!=null && list.size()>0){ for(IdentityLink identityLink:list){ System.out.println("任务ID:"+identityLink.getTaskId()); System.out.println("流程实例ID:"+identityLink.getProcessInstanceId()); System.out.println("用户ID:"+identityLink.getUserId()); System.out.println("工作流角色ID:"+identityLink.getGroupId()); System.out.println("#########################################"); } } } /**查询历史的组任务列表*/ @Test public void findHistoryGroupCandidate(){ //流程实例ID String processInstanceId = "5905"; List<HistoricIdentityLink> list = processEngine.getHistoryService() .getHistoricIdentityLinksForProcessInstance(processInstanceId); if(list!=null && list.size()>0){ for(HistoricIdentityLink identityLink:list){ System.out.println("任务ID:"+identityLink.getTaskId()); System.out.println("流程实例ID:"+identityLink.getProcessInstanceId()); System.out.println("用户ID:"+identityLink.getUserId()); System.out.println("工作流角色ID:"+identityLink.getGroupId()); System.out.println("#########################################"); } } } /**将组任务指定个人任务(拾取任务)*/ @Test public void claim(){ //任务ID String taskId = "6308"; //个人任务的办理人 String userId = "郭靖"; processEngine.getTaskService()// .claim(taskId, userId); } /**将个人任务再回退到组任务(前提:之前这个任务是组任务)*/ @Test public void setAssignee(){ //任务ID String taskId = "6308"; processEngine.getTaskService()// .setAssignee(taskId, null); } /**向组任务中添加成员*/ @Test public void addGroupUser(){ //任务ID String taskId = "6308"; //新增组任务的成员 String userId = "李浩"; processEngine.getTaskService()// .addCandidateUser(taskId, userId); } /**向组任务中删除成员*/ @Test public void deleteGroupUser(){ //任务ID String taskId = "6308"; //新增组任务的成员 String userId = "黄蓉"; processEngine.getTaskService()// .deleteCandidateUser(taskId, userId); } }
说明:
1)在类中使用delegateTask.addCandidateUser(userId);的方式分配组任务的办理人,此时郭靖和黄蓉是下一个任务的办理人。
2)通过processEngine.getTaskService().claim(taskId,userId);将组任务分配给个人任务,也叫认领任务,即指定某人去办理这个任务,此时有郭靖去办理任务。
注意:认领任务的时候,可以是组任务成员中的人,也可以不是组成员中的人。此时通过type的类型
为participant来指定任务办理人。
3)addCandidateUser()即向组任务添加成员,deleteCandidateUser()即删除组任务成员。
4)在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四和王五,这样张三
提交任务,由李四或者王五去查询组任务,可以看到对应张三的申请,李四或者王五在通过任务认领(claim)
的方式,由某个人去完成这次任务。
四、总结
相关文章推荐
- 用python随机生成数据,再插入到postgresql中
- REST与Spring mvc(未完成)
- dispatch_semaphore
- leetcode——Majority Element II
- centos6.8国内镜像下载地址
- Android中Activity的finish()、destroy()、System.exit()区别
- http://blog.csdn.net/hguisu/article/details/7533759
- linux解决xhost: unable to open display ""
- 自定义Seekbar拖动条样式
- 判断奇偶 位运算
- 网页复制添加复制信息
- [置顶] Android Glide图片加载(加载监听、加载动画)
- 战争
- scrollview显示到任意位置的定位
- DPM学习
- -webkit-animation属性的一个误用
- RxJava学习笔记(二)--- 操作符
- Linux入门——适合初学者
- 封装缓存
- sql语句,获取2016年7月份,每日任务数量