项目: itcast0711 > cn.itcast.l_group
组任务: 即需要由一组人来完成的任务.
组任务的分配和上节个人任务分配类似, 也是三种方式。
方式一: 直接指定具体办理组
- 流程图配置
- 部署启动流程后正在执行的任务表(act_ru_task)变动
- 正在执行的任务办理人表(包含个人任务, 组任务) act_ru_identitylink
- 历史任务办理人表(包含个人任务, 组任务) act_hi_identitylink
- 查询当前人的组任务 (act_ru_task)
/**查询当前人的组任务 (act_ru_task)*/
@Test
public void findMyGroupTask(){
String candidateUser = "小A";
List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
.createTaskQuery()//创建任务查询对象
/**查询条件(where部分)*/
// .taskAssignee(assignee)//指定个人任务查询,指定办理人
.taskCandidateUser(candidateUser)//组任务的办理人查询
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
6. 获取正在执行的组任务办理人(act_ru_identitylink)
/**
* 获取正在执行的组任务办理人
* 查询正在执行的任务办理人表 act_ru_identitylink
*/
@Test
public void findRunPersonTask(){
//任务ID
String taskId = "6204";
List<IdentityLink> list = processEngine.getTaskService()
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
- 获取历史组任务办理人(act_hi_identitylink)
/**
* 获取历史组任务办理人
* 查询历史任务的办理人表 act_hi_identitylink
*/
@Test
public void findHistoryPersonTask(){
//流程实例ID
String processInstanceId = "6201";
List<HistoricIdentityLink> list = processEngine.getHistoryService()
// 通过流程实例ID查询, 查询的都是参与者(participant)
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
// 通过任务ID查询, 查询的都是候选者(candidate)
// .getHistoricIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(HistoricIdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+
identityLink.getType()+" "+
identityLink.getProcessInstanceId()+" "+
identityLink.getUserId());
}
}
}
注:可根据已知情况, 选择使用流程实例processInstanceId 或者 任务ID, 查询历史组任务的办理人。二者查询数据并无区别。
- 拾取任务,将组任务分配给个人,指定任务的办理人字段
/**拾取任务,将组任务分配给个人,指定任务的办理人字段*/
@Test
public void claim(){
//将组任务分配给个人任务
//任务ID
String taskId = "6905";
//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
String userId = "大F";
processEngine.getTaskService()//
.claim(taskId, userId);
}
- 正在执行的任务表(act_ru_task)
- 查询当前人的个人任务
/**查询当前人的个人任务*/
@Test
public void findMyPersonalTask(){
String assignee = "大F";
List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
.createTaskQuery()//创建任务查询对象
/**查询条件(where部分)*/
.taskAssignee(assignee)//指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
10. 将个人任务回退到组任务,前提:之前一定是个组任务
/**将个人任务回退到组任务,前提:之前一定是个组任务*/
@Test
public void setAssigee(){
//任务ID
String taskId = "6204";
//直接将该任务办理人设置null即可
processEngine.getTaskService()
.setAssignee(taskId, null);
}
- 向组任务中添加/删除成员
/**向组任务中添加成员*/
@Test
public void addGroupUser(){
//任务ID
String taskId = "6204";
//成员办理人
String userId = "大H";
processEngine.getTaskService()
.addCandidateUser(taskId, userId);
}
/**从组任务中删除成员*/
@Test
public void deleteGroupUser(){
//任务ID
String taskId = "6204";
//成员办理人
String userId = "小B";
processEngine.getTaskService()
.deleteCandidateUser(taskId, userId);
}
- 正在执行的任务办理人表(act_ru_identitylink)
方式二: 使用流程变量
- 流程图配置
2.启动流程实例, 设置流程变量
/**启动流程实例, 设置流程变量*/
@Test
public void startProcessInstance(){
//流程定义的key
String processDefinitionKey = "task";
/**启动流程实例的同时,设置流程变量,使用流程变量用来指定组任务的办理人,对应task.pbmn文件中#{userIDs}*/
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userIDs", "大大,中中,小小");
ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
System.out.println("流程实例ID:"+pi.getId());//流程实例ID
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID
}
方式三: 使用类
项目: cn.itcast.l_group02
说明: 与上一节个人任务分配的第三种方式一致, 唯一有点变动的是这个Listener监听类.
package cn.itcast.l_group02;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener {
/**用来指定任务的办理人*/
@Override
public void notify(DelegateTask delegateTask) {
//指定个人任务的办理人,也可以指定组任务的办理人
//个人任务:通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务的办理人
//delegateTask.setAssignee("灭绝师太");
//组任务(添加候选办理人):
delegateTask.addCandidateUser("洪洗象");
delegateTask.addCandidateUser("徐脂虎");
}
}
注:使用类分配任务的要点:
- 流程图任务节点Main config 中的办理人不要配置
- 创建Listener监听类
- 流程图任务节点配置Listener属性中监听类