1. 分配任务负责人
(1)固定分配
在进行业务流程设计的时候指定固定的任务负责人
Properties ---> Main Config ---> Assignee
(2)表达式分配
在Activiti中支持使用UEL表达式,UEL表达式是Java EE6 规范的一部分, UEL(Unified Expression Language) 即统一表达式语言
Activiti支持两种UEL表达式: UEL-value
和 UEL-method
UEL-value
创建一个新的流程
使用表达式
之后的几个负责人以 ${assignee0}
, ${assignee1}
...的形式以此类推
流程绘制完成之后,进行部署,在启动流程实例时给 UEL 表达式赋值
@Test
public void deploy() {
//1.获取ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取RepositoryService
RepositoryService service = engine.getRepositoryService();
//3.部署
Deployment deploy = service.createDeployment()
.addClasspathResource("bpmn/evection-uel.bpmn")
.addClasspathResource("bpmn/evection-uel.png")
.name("出差申请流程-UEL")
.deploy();
System.out.println("id: " + deploy.getId());
System.out.println("name: " + deploy.getName());
}
@Test
public void createProcess() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RuntimeService service = engine.getRuntimeService();
//设置assignee
Map<String, Object> map = new HashMap<>();
map.put("assignee0", "zhangsan");
map.put("assignee1", "lisi");
map.put("assignee2", "wangwu");
map.put("assignee3", "xiaoming");
service.startProcessInstanceByKey("evection-uel", map);
}
启动成功后,可在 act_ru_variable
表中查找对应的赋值信息
UEL-method
UserBean即注册到Spring容器中的Bean,表示调用该对象的 getUserId
方法
UEL-method 与 UEL-value 结合
如: ${userService.findManager(emp)}
userService
是 Spring 容器的一个bean,findManager
是该 bean 的一个方法,emp 是 activiti 流程变量, emp作为参数传到 userService.findManager
方法中
其他
表达式支持解析基础类型、 bean、 list、 array 和 map,也可作为条件判断,如: ${order.price > 100 && order.price < 250}
(3)分配监听器
使用监听器来完成负责人的指定,在流程设计的时候就不需要指定assignee Event选项
Event分类:
- create:任务创建后触发
- assignment:任务分配后触发
- Delete:任务完成后触发
- All:所有事件都触发
自定义监听器
package com.sw.listener;
import org.activiti.engine.delegate.DelegateTask;
public class TaskListener implements org.activiti.engine.delegate.TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
if ("创建请假单".equals(delegateTask.getName()) && "create".equals(delegateTask.getEventName())) {
//指定任务负责人
delegateTask.setAssignee("zhangsan-listener");
}
}
}
测试
@Test
public void deploy() {
//1.获取ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取RepositoryService
RepositoryService service = engine.getRepositoryService();
//3.部署
Deployment deploy = service.createDeployment()
.addClasspathResource("bpmn/evection-listener.bpmn")
.addClasspathResource("bpmn/evection-listener.png")
.name("出差申请流程-Listener")
.deploy();
System.out.println("id: " + deploy.getId());
System.out.println("name: " + deploy.getName());
}
@Test
public void createProcess() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RuntimeService service = engine.getRuntimeService();
service.startProcessInstanceByKey("evection-listener");
}
(4)查询任务
查询指定任务负责人的待办任务
@Test
public void queryPersonalTaskList() {
//流程定义key
String processDefinitionKey = "evection";
//任务负责人
String assignee = "lisi";
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();
if (list != null && list.size() > 0) {
for (Task task : list) {
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 queryProcessInstance() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//查询流程实例id
TaskService taskService = engine.getTaskService();
Task task = taskService.createTaskQuery().processDefinitionKey("evection").taskAssignee("lisi").singleResult();
String instanceId = task.getProcessInstanceId();
//根据流程实例id查询businessKey
RuntimeService runtimeService = engine.getRuntimeService();
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
System.out.println("businessKey: " + instance.getBusinessKey());
}
(5)办理任务
@Test
public void completeTask() {
//任务id
String taskId = "10005";
//任务负责人
String assignee = "zhansan";
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(assignee).singleResult();
if (task == null) {
throw new IllegalArgumentException(assignee + " 无权限处理该任务!");
}
taskService.complete(taskId);
System.out.println("任务:" + taskId + ",已完成");
}
注:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限
评论 (0)