您的位置:首页 > 其它

Activiti进阶(十一)——分配组任务的三种方式

2016-07-04 17:21 639 查看
这篇博客要给大家介绍一下分配组任务的三种方式:

组任务分配方式一:直接指定组任务任务办理人

组任务分配方式二:使用流程变量

组任务分配方式三:使用类

下面呢将具体介绍这三种不同的方法:

一、流程图:

                  


                   图: 配组任务的三种方式

               

 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)

的方式,由某个人去完成这次任务。

四、总结


                      
           
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: