工作流 - 个人任务

suaxi
2023-05-25 / 0 评论 / 51 阅读 / 正在检测是否收录...

1. 分配任务负责人

(1)固定分配

在进行业务流程设计的时候指定固定的任务负责人

4.指定任务负责人.png

Properties ---> Main Config ---> Assignee


(2)表达式分配

在Activiti中支持使用UEL表达式,UEL表达式是Java EE6 规范的一部分, UEL(Unified Expression Language) 即统一表达式语言

Activiti支持两种UEL表达式: UEL-valueUEL-method

UEL-value

创建一个新的流程

2.UEL-value表达式1.png

使用表达式

2.UEL-value表达式2.png

之后的几个负责人以 ${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 表中查找对应的赋值信息

2.UEL-value表达式3赋值.png


UEL-method

3.UEL-method表达式.png

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选项

4.分配监听器.png


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.监听器debug.png


(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

评论 (0)

取消