这里写目录标题
- 一、分配任务负责人
- 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 使用流程变量分配任务
@Testpublic 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 查询负责人待办
@Testpublic void test2(){//1、创建ProcessEngine对象ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();//任务负责人String assigness="zhangsan";//创建TaskServiceTaskService 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查询到请假天数等信息。
@Testpublic void test3(){//1、创建ProcessEngine对象ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();//2、创建RuntimeServiceRuntimeService runtimeService=processEngine.getRuntimeService();TaskService taskService=processEngine.getTaskService();//3、通过TaskService查询到个人任务Task task=taskService.createTaskQuery().processDefinitionKey("holiday2").taskAssignee("zhangsan").singleResult();//4、通过task对象,得到任务idString processInstanceId=task.getProcessInstanceId();//5、通过流程实例id,得到流程实例对象ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();//6、processInstance对象,得到businessKeyString 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("完成任务");
}
注意:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限。