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");
}
}