1. 个人任务
1.1 分配任务责任人
1.1.1 固定分配
在进行业务流程建模的时候指定固定的任务负责人:
在Properties视图中,填写Assiginee项为任务负责人
1.1.2 表达式分配
在Activiti中支持使用UEL表达式,UEL表达式是Java EE6 规范的一部分, UEL(Unified Expression Language) 即 统一表达式语音, Activiti支持两种UEL表达式: UEL-value 和UEL-method
UEL-value
在assignee中使用流程变量处理
然后我们可以来操作
首先我们需要将定义的流程部署到Activiti数据库中
/** * 先将新定义的流程部署到Activiti中数据库中 */ @Test public void test01(){ // 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService进行部署操作 RepositoryService service = engine.getRepositoryService(); // 3.使用RepositoryService进行部署操作 Deployment deploy = service.createDeployment() .addClasspathResource("bpmn/evection-uel.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/evection-uel.png") // 添加png资源 .name("出差申请流程-UEL") .deploy();// 部署流程 // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); } 复制代码
部署成功后我们需要启动一个新的流程实例,然后在流程实例创建的其实关联UEL表达式
/** * 创建一个流程实例 * 给流程定义中的 UEL表达式赋值 */ @Test public void test02(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 设置 assignee 的取值, Map<String,Object> map = new HashMap<>(); map.put("assignee0","张三"); map.put("assignee1","李四"); map.put("assignee2","王五"); map.put("assignee3","赵财务"); // 创建流程实例 runtimeService.startProcessInstanceByKey("evection-uel",map); } 复制代码
启动成功后我们在 act_ru_variable中可以看到UEL表达式对应的赋值信息
UEL-method
userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUserId()方法。
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}
2.1.3 监听器分配
可以使用监听器来完成很多Activiti的流程业务。
我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee
Event选项
create:任务创建后触发 assignment:任务分配后触发 Delete:任务完成后触发 All:所有事件都触发 复制代码
自定义的监听器
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { if("创建请假单".equals(delegateTask.getName()) && "create".equals(delegateTask.getEventName())){ // 指定任务的负责人 delegateTask.setAssignee("张三-Listener"); } } } 复制代码
测试代码
/** * 先将新定义的流程部署到Activiti中数据库中 */ @Test public void test01(){ // 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService进行部署操作 RepositoryService service = engine.getRepositoryService(); // 3.使用RepositoryService进行部署操作 Deployment deploy = service.createDeployment() .addClasspathResource("bpmn/evection-listener.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/evection-listener.png") // 添加png资源 .name("出差申请流程-UEL") .deploy();// 部署流程 // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); } /** * 创建一个流程实例 * 给流程定义中的 UEL表达式赋值 */ @Test public void test02(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 创建流程实例 runtimeService.startProcessInstanceByKey("evection-listener"); } 复制代码
1.2 查询任务
查询任务负责人的待办任务
代码如下:
// 查询当前个人待执行的任务 @Test public void findPersonalTaskList() { // 流程定义key String processDefinitionKey = "myEvection1"; // 任务负责人 String assignee = "张三"; // 获取TaskService TaskService taskService = processEngine.getTaskService(); List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey(processDefinitionKey) .includeProcessVariables() .taskAssignee(assignee) .list(); for (Task task : taskList) { System.out.println("----------------------------"); System.out.println("流程实例id: " + task.getProcessInstanceId()); System.out.println("任务id: " + task.getId()); System.out.println("任务负责人: " + task.getAssignee()); System.out.println("任务名称: " + task.getName()); } } 复制代码
关联 businessKey
需求: 在 activiti 实际应用时,查询待办任务可能要显示出业务系统的一些相关信息。
比如:查询待审批出差任务列表需要将出差单的日期、 出差天数等信息显示出来。
出差天数等信息在业务系统中存在,而并没有在 activiti 数据库中存在,所以是无法通过 activiti 的 api 查询到出差天数等信息。 实现: 在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的出差单表,查询出出差天数等信息。
@Test public void findProcessInstance(){ // 获取processEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取TaskService TaskService taskService = processEngine.getTaskService(); // 获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 查询流程定义的对象 Task task = taskService.createTaskQuery() .processDefinitionKey("myEvection1") .taskAssignee("张三") .singleResult(); // 使用task对象获取实例id String processInstanceId = task.getProcessInstanceId(); // 使用实例id,获取流程实例对象 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); // 使用processInstance,得到 businessKey String businessKey = processInstance.getBusinessKey(); System.out.println("businessKey=="+businessKey); } 复制代码
1.3 办理任务
注意:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限 。
/** * 完成任务,判断当前用户是否有权限 */ @Test public void completTask() { //任务id String taskId = "15005"; // 任务负责人 String assingee = "张三"; //获取processEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 创建TaskService TaskService taskService = processEngine.getTaskService(); // 完成任务前,需要校验该负责人可以完成当前任务 // 校验方法: // 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成 Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(assingee) .singleResult(); if(task != null){ taskService.complete(taskId); System.out.println("完成任务"); } }