1.分配任务负责人
1.1 固定分配
在进行业务流程建模时指定固定的任务负责人;
在properties视图中,填写Assignee项为任务负责人;
注意事项:由固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照bpmn的配置去分配任务负责人;
1.2 表达式分配
1.2.1 UEL表达式
Activiti使用UEL表达式,UEL是java EE6规范的一部分,UEL即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method;
1.2.1.1 UEL定义如下:
assignee这个变量是activiti的一个流程变量;
或:
user也是activiti的一个流程变量,user.assignee表示调用user的getter方法获取值;
1.2.1.2 UEL-method方式如下:
userBean是spring容器中的一个bean,表示调用该bean的getUserId()方法;
1.2.1.3 UEL-method与UEL-value结合:
${ldapService.findManagerForEmployee(emp)}
ldapService是spring容器的一个bean,findManagerForEmployee是该bean的一个方法,emp是activiti流程变量,emp作为参数传到ldapService.findManagerForEmployee方法中;
流程变量,emp作为参数传到ldapService.findManagerForEmployee方法中;
1.2.1.4 其他:
表达式支持解析基础类型,bean,list,array和map,也可作为条件判断;
如下:
${order.price>100 && order.price<250}
1.3 使用流程变量分配任务
1.3.1 定义任务分配流程变量
1.3.2 设置流程变量
在启动流程实例时设置流程变量,如下:
package com.wn.hoilday; import com.wn.entity.Hoilday; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; import org.activiti.engine.runtime.ProcessInstance; import java.util.HashMap; import java.util.Map; /*启动流程*/ public class StartInstance { public static void main(String[] args) { //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //设置流程变量 Hoilday hoilday=new Hoilday(); hoilday.setNum(3); //定义一个map集合,存放assignee的值 Map<String ,Object> assMap=new HashMap<>(); assMap.put("hoilday",hoilday); //启动一个流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("hoilday2", assMap); System.out.println("流程启动成功!"); } }
1.4 注意事项
由于使用表达式分配,必须保证在任务执行过程,表达式执行成功,比如:某个任务使用了表达式${order.price>100 && order.price<250},当执行该任务时必须保证order在流程变量中存在,否则activiti异常;
1.5 监听器分配
任务监听器是发生对应的任务相关事件时执行自定义java逻辑或表达式;
create:任务创建后触发;
Assignment:任务分配后触发;
Delete:任务完成后触发;
All:所有事件发生后触发;
定义任务监听类,且类必须实现org.activiti.engine.delegate.TaskListener接口;
package com.wn.entity; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { //这里执行任务负责人 delegateTask.setAssignee("zhangsan"); } }
1.6 注意事项
使用监听器分配方法,按照监听事件去执行类的notify方法,方法如果不能正常执行也会影响任务的执行;
2. 查询任务
查询任务负责人的代办任务;
package com.wn.hoilday; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import java.util.List; /*查看代办任务*/ public class GetTask { public static void main(String[] args) { //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取一个TaskService对象 TaskService taskService = processEngine.getTaskService(); //查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey执行查看流程 //查看hoilday流程中zhangsan代办的任务 //taskCandidateOrAssigned匹配规则: 1.Assigned 2.配置bpmn文件中定义的值 /*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("zhangsan").processDefinitionKey("hoilday").list();*/ //taskAssignee查看当前指定人的指定任务 List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("hoilday").list(); for (Task task:list){ System.out.println("任务名称:"+task.getName()); System.out.println("任务执行人:"+task.getAssignee()); System.out.println("任务ID:"+task.getId()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } } }
3. 关联businessKey
在activiti实际应用时,查询待办任务可能要显示出业务系统的一些相关信息,比如:查询待审批请假单任务列表需要将请假单的日期,请假天数等信息显示出来,而并没有在activiti数据库中存在,所以是无法通过activiti的api查询到请假天数等信息;
实现:在查询待办任务时,通过businessKey关联查询业务系统的请假单表,查询出请假天数等信息;
4.办理任务
指定任务ID,调用TaskService完成任务;
package com.wn.hoilday; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; /*任务处理 * `act_hi_identitylink` 历史参与者信息 * `act_hi_taskinst` 历史任务信息 * `act_ru_execution` 任务执行信息 * `act_ru_task` 任务信息 * 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息 * */ public class CompleteTask { public static void main(String[] args) { //获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取TaskService对象进行流程部署 TaskService taskService = processEngine.getTaskService(); //任务处理 taskService.complete("7502"); } }
来源:https://www.cnblogs.com/wnwn/p/12641760.html