Activiti6 任务有个人任务和组任务之分,理解两者的区别并且知道如何操作对应的任务是学习activiti重要一步。
本章承接上文章节,这里就不详细描述了
一、个人任务与组任务区别
个人任务:流程中的某个任务由指定的user来执行
组任务:流程中的某个任务由指定的group来完成,其中group由多个user组成
实例分析
1、填写请假申请任务:个人任务,比如张三提交请假申请
2、总监审批任务:组任务,这里我简单将总监理解为另一组权限的用户,不和实际意义相关;如 张三提交了请假申请后,总监一、和总监二都具有审批的权限,并且组任务中只要有一人审批了申请,组任务代表完成了,进入了下一个节点
3、经理审批:同2;
4、人力资源审核:同2
二、创建个人任务的三种方式
分配个人任务的三种方式
1、直接指定办理人
选择Main config 可以配置Assignee,可以指定一个用户来执行该任务,但是一般实际项目开发不会这么做,这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。
直接启动流程实例即可
//9、启动流程实例
@RequestMapping("/startProcessInstance")
public void startProcessInstance() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
启动程序,执行启动流程实例方法startProcessInstance()
流程启动后,会操作如下表
act_ru_execution:执行流程实例表,核心,启动后会生成一个流程实例和待执行的任务节点
act_ru_task:用户任务表,待执行的任务
act_ru_identitylink:用户身份关系表,存储待执行任务的用户关系
act_hi_taskinst:历史用户任务表,存储所有已执行或待执行的用户任务历史
act_hi_procinst:历史流程实例表,存储流程实例
act_hi_actinst:历史活动节点表,存储所有已执行的节点(各类节点)
act_hi_identitylink:历史用户身份关系表,历史用户任务的关系表
2、使用流程变量
使用动态的流程变量${userId} 来代替静态指定用户。
//10、启动流程实例--使用流程变量 userId
@RequestMapping("/startProcessInstance2")
public void startProcessInstance2() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userId", "user1");//这里传入id为user1的用户
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
3、使用监听类
流程图中任务节点的配置
Main config不作任何配置
选择Listeners ,选择TaskListenerImp监听类
package com.springboot.activiti.eimm.leave.controller;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskListenerImpl implements TaskListener {
private static final long serialVersionUID = 1L;
/**
* 用来指定任务的办理人
*/
@Override
public void notify(DelegateTask delegateTask) {
//指定个人任务的办理人,也可以指定组任务的办理人
//通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务办理人
delegateTask.setAssignee("user1");
}
}
//11、启动流程实例--使用监听类
@RequestMapping("/startProcessInstance3")
public void startProcessInstance3() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
执行程序即可
三、查询当前人的个人任务
@RequestMapping("/findMyPersonalTask")
public void findMyPersonalTask(){
String assignee = "user1";
List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
.createTaskQuery()//创建任务查询对象
/**查询条件(where部分)*/
.taskAssignee(assignee)//指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.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("########################################################");
}
}
}
四、完成个人任务
上面我们创建了个人任务,所有需要完成当前节点的任务,流程才会自动进入下一节点
前面我们已经启动了流程实例,并且设置了所让人Assignee为user1用户,
查看act_ru_task 代运行的任务中发现任务id为15,
//13、完成我的任务
@RequestMapping("/completeMyPersonalTask")
public void completeMyPersonalTask() {
// 任务ID
String taskId = "15";
//完成任务的同时,设置流程变量,根据流程变量的结果来节点进入哪一个节点任务
Map<String, Object> args = new HashMap<>();
args.put("time", 2);
processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.complete(taskId,args);
System.out.println("完成任务:任务ID:" + taskId);
这里设置表单变量submitTime=2,根据流程图分支条件知,流程会自动到经理审批任务节点处。
执行程序后,控制台输出
数据表数据更新
act_ru_execution 所标识的数据更新为usertask3,也就是经理审批任务
act_ru_task 待执行任务也变为经理审批
五、创建组任务
创建组任务有多种方式
1、静态配置候选人成员,可以配置一个或多个,多个用户用逗号分隔即可
@RequestMapping("/startProcessInstance1")
public void startProcessInstance1() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
启动程序即可
2、使用动态变量配置候选人成员
//10、启动流程实例--使用流程变量 userId和userId3
@RequestMapping("/startProcessInstance4")
public void startProcessInstance4() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userId", "user1");//这里传入id为user1的用户
variables.put("userId3", "user2,user3");//这里可以传入多个用户
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
3、使用监听类来实现
方法和创建个人任务监听类是一个道理,只是可以添加一个或多个用户
4、配置候选人组来实现
创建候选人中 group3, 对应act_id_group中经理组,表示经理组中的用户都具有【经理审批】任务权限
//10、启动流程实例--使用流程变量 userId
@RequestMapping("/startProcessInstance2")
public void startProcessInstance2() {
// 流程定义的Key
String processDefinitionKey = "myProcess";
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userId", "user1");//这里传入id为user1的用户
ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID:
System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流
}
其它步骤一样。
六、查询当前人的组任务
//14、查询当前人的组任务
@RequestMapping("/findMyGroupTask")
public void findMyGroupTask() {
String candidateUser = "user2";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.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("########################################################");
}
}
}
七、查询组用户的任务
@RequestMapping("/findPersonalTask")
public void findPersonalTask(){
String candidateUser = "user2";
List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
.createTaskQuery()//创建任务查询对象
/**查询条件(where部分)*/
//.taskAssignee(assignee)//指定个人任务查询,指定办理人
.taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.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("########################################################");
}
}
}
如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!
技术在交流中进步,知识在分享中传播