这里写目录标题
- 一、分配任务负责人
- 1.1 固定分配
- 1.2 表达式分配
- 1.2.1 UEL表达式
- 1.2.2 使用流程变量分配任务
- 1.2.3 注意事项
- 1.3 监听器分配
- 二、查询任务
- 2.1 查询负责人待办
- 2.2 关联businessKey
- 三、办理任务
一、分配任务负责人
1.1 固定分配
在进行业务流程建模时指定固定的任务负责人,Assignee项为任务负责人。
由于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照bpmn的配置去分配任务负责人。
1.2 表达式分配
1.2.1 UEL表达式
Activiti使用
-
UEL-value表达式
assignee这个变量是activiti的一个流程变量。
user也是activiti的一个流程变量,user.assignee表示通过调用user的getter方法获取值。 -
UEL-method表达式
-
UEL-method和UEL-value结合
${ldapService.findManagerForEmployee(emp)}
ldapService 是 spring 容器的一个 bean,findManagerForEmployee 是该 bean 的一个方法,emp 是 activiti
流程变量,emp 作为参数传到 ldapService.findManagerForEmployee 方法中。 -
其他
表达式支持解析基础类型、bean、list、array 和 map,也可作为条件判断。
如下:
${order.price > 100 && order.price < 250}
1.2.2 使用流程变量分配任务
@Test
public void test2(){
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.设置assignee的取值 用户可以在界面上设置流程的执行人
Map<String,Object> map = new HashMap<String,Object>();
map.put("assignee0","zhangsan");
map.put("assignee1","lishi");
map.put("assignee2","wangwu");
//4.启动流程实例,同时还要设置流程定义的assignee的值
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday1", map);
//5.输出
System.out.println(processEngine.getName());
}
分配完成后可以通过ACT_RU_IDENTITYLINK查看部署信息。
1.2.3 注意事项
由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:
某个任务使用了表达式${order.price > 100 && order.price < 250},当执行该任务是必须保证order在流程变量中存在,否在activiti异常。
1.3 监听器分配
任务监听器是发生对应的任务相关事件时执行的子定义java逻辑或表达式。
public class MyTaskListener implements TaskListener {
public void notify(DelegateTask delegateTask) {
System.out.println("方法执行了");
delegateTask.setAssignee("zhangsan");
}
}
使用监听器分配方式,按照监听时间去执行监听类的notify方法,方法如果不能正常执行也会影响任务的执行。
二、查询任务
2.1 查询负责人待办
@Test
public void test2(){
//1、创建ProcessEngine对象
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
//任务负责人
String assigness="zhangsan";
//创建TaskService
TaskService taskService=processEngine.getTaskService();
List<Task> list=taskService.createTaskQuery()
.processDefinitionKey("holiday2")
.taskAssignee(assigness)
.list();
for(Task task:list){
System.out.println(" 流 程 实 例 id : " +
task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
2.2 关联businessKey
需求:
在activiti实际应用时,查询待办任务可能要显示出业务员系统的一些相关信息,比如:查询待审批请假单任务列表需要将请假单的日期、请假天数等信息显示出来,请假天数等信息在业务系统中存在,而并没有在activiti数据库中存在,所以是无法通过activiti的api查询到请假天数等信息。
@Test
public void test3(){
//1、创建ProcessEngine对象
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
//2、创建RuntimeService
RuntimeService runtimeService=processEngine.getRuntimeService();
TaskService taskService=processEngine.getTaskService();
//3、通过TaskService查询到个人任务
Task task=taskService.createTaskQuery().processDefinitionKey("holiday2")
.taskAssignee("zhangsan").singleResult();
//4、通过task对象,得到任务id
String processInstanceId=task.getProcessInstanceId();
//5、通过流程实例id,得到流程实例对象
ProcessInstance processInstance=runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
//6、processInstance对象,得到businessKey
String businessKey=processInstance.getBusinessKey();
System.out.println("businessKey: "+businessKey);
}
三、办理任务
指定任务 id,调用 TaskService 完成任务:
// 完成任务
@Test
public void completTask() {
//任务id
String taskId = "10305";
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
taskService.complete(taskId);
System.out.println("完成任务");
}
注意:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限。