( 五 )、Activiti 用户任务

( 五 )、Activiti 用户任务

 

 

 

一、分配任务负责人

1.1 固定分配

填写assignee为项目负责人。注意事项:由于固定分配方式,任务只管一步一步执行任务,执行到每一个任务将按照 bpmn 的配置去分配任务负责人。

1.2、表达式分配(官网介绍

1.2.1 UEL 表达式方式

Activiti 使用 UEL 表达式,UEL 是 java EE6 规范的一部分,UEL(Unified Expression Language)即统一表达式语言,activiti 支持两个 UEL 表达式:UEL-value 和 UEL-method。

UEL-value 定义如下:

assignee 这个变量是 activiti 的一个流程变量。或:

 user 也是 activiti 的一个流程变量,user.assignee 表示通过调用 user 的 getter 方法获取值。

1.2.2、 UEL-method 方式

 userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUserId()方法。

1.2.3 、UEL-method 与 UEL-value 结合

再比如:

${ldapService.findManagerForEmployee(emp)}

ldapService 是 spring 容器的一个 bean,findManagerForEmployee 是该 bean 的一个方法,emp 是 activiti流程变量,emp 作为参数传到 ldapService.findManagerForEmployee 方法中。

1.2.4 、其它

表达式支持解析基础类型、bean、list、array 和 map,也可作为条件判断。如下:

${order.price > 100 && order.price < 250}

1.2.5 代码演示

设置流程变量,在启动流程实例时设置流程变量,如下:

 /**
     * 启动流程实例,设置流程变量
     */
    @Test
    public void startInstance3() {

        String processDefinitionKey = "holiday2";

        //定义流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        //设置流程变量assignee
        variables.put("assignee", "张三");

        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);

        //4.输出实例的相关信息
        System.out.println("流程部署ID" + processInstance.getDeploymentId());//null
        System.out.println("流程定义ID" + processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID" + processInstance.getId());//2501
        System.out.println("活动ID" + processInstance.getActivityId());//null
    }

 

1.2.6 注意事项

由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:

某个任务使用了表达式 ${order.price > 100 && order.price < 250},当执行该任务时必须保证 order 在流程变量中存在,否则 activiti 异常

 

1.3监听器分配

任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑 或表达式。任务监听事件包括:

idea插件中没有,在Camunda modeler中可以查询。

java 逻辑 或表达式:

表达式参考上边介绍的 UEL 表达式,这里主要介绍监听类使用。定义任务监听类,且类必须实现 org.activiti.engine.delegate.TaskListener 接口

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.setAssignee("zhangsan");
    }
}

使用监听器分配方式,按照监听事件去执行监听类的 notify 方法,方法如果不能正常执行也会影响任务的执行。

 

二、查询任务

2.1 查询任务负责人的待办任务

taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).includeProcessVariables().taskAssignee(assignee).list();

   // 查询当前个人待执行的任务
    @Test
    public void findPersonalTaskList() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 流程定义key
        String processDefinitionKey = "holiday2";
    // 任务负责人
        String assignee = "zhangsan";
    // 创建TaskService
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()//
                .processDefinitionKey(processDefinitionKey)//
                .includeProcessVariables().taskAssignee(assignee).list();
        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());
        }
    }

2.2 关联businesskey查询

需求:

在 activiti 实际应用时,查询待办任务可能要显示出业务系统的一些相关信息,比如:查询待审批请假单任务列表需要将请假单的日期、请假天数等信息显示出来,请假天数等信息在业务系统中存在,而并没有在 activiti 数据库中存在,所以是无法通过 activiti 的 api 查询到请假天数等信息。

在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的请假单表,查询出请假天数等信息。

 // 查询当前个人待执行的任务,关联businesskey
    @Test
    public void findPersonalTaskList2() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 1.流程定义key
        String processDefinitionKey = "holiday";
        // 任务负责人
        String assignee = "zhangsan";

        //2.创建TaskService
        TaskService taskService = processEngine.getTaskService();
        //3.通过taskservice查询到个人任务
        Task task = taskService.createTaskQuery()
.processDefinitionKey(processDefinitionKey)
.includeProcessVariables().taskAssignee(assignee).singleResult();
//4.通过task获得流程实例id String processInstanceId = task.getProcessInstanceId(); //5.创建runtimeservice RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //6.根据processInstance对象,得到businessKey String businessKey = processInstance.getBusinessKey(); //7.根据businessKey就可以得到请假单的信息 System.out.println("businessKey:"+businessKey); }

 

三、处理任务

指定任务 id,调用 TaskService 完成任务:注意:在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限。

  /**
     * 处理任务 根据task_ID
     */
    @Test
    public void dealTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //任务id
        String taskId = "25005";
        //任务负责人
        String assign = "zhangsan";

        // 创建TaskService
        TaskService taskService = processEngine.getTaskService();

        //校验用户是否有权限处理任务:
        //这里只指定任务id并没有指定任务负责人,只要调用complete,该任务就完成
        //所以说必须完成任务前校验
        //校验方法:
        //根据任务id和任务负责人assignee查询当前任务,如果查到说该用户有完成该任务权限,否则没有权限
        Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(assign).singleResult();
        if(task != null){
            taskService.complete(taskId);
            System.out.println("完成任务");
        }
    }

 

posted @ 2022-04-09 15:20  邓维-java  阅读(540)  评论(0编辑  收藏  举报