activiti操作之流程状态、任务分配及流程变量

一、流程状态的挂起与激活与业务标记

业务标记

// 在流程开始时添加业务id,5555是业务标记的id
runtimeService.startProcessInstanceByKey("work_over_time","5555");

流程的挂起与激活

单个挂起:针对流程实例。使用的服务:TaskServiceImpl

@Test
    void processInstanceSuspend(){
        // 查询当前运行流程实例
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey("work_over_time").singleResult();
        // 流程实例为挂起状态,激活流程,为激活状态,挂起流程
        if (processInstance.isSuspended()) {
            runtimeService.activateProcessInstanceById(processInstance.getProcessInstanceId());
            System.out.println("激活当前流程");
        }else {
            runtimeService.suspendProcessInstanceById(processInstance.getProcessInstanceId());
            System.out.println("挂起当前流程");
        }

    }

全部挂起:针对流程定义及当前定义的所有流程实例。使用的服务: RepositoryServiceImpl

 @Test
    void processDefinitionSuspend() {
        // 测试流程定义挂起
        // 1. 查询改流程定义
        List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("work_over_time")
                .list();
        // 挂起,激活流程定义
        processDefinitionList.forEach(processDefinition -> {
            // 判断是否被挂起
            boolean processDefinitionSuspended = repositoryService.isProcessDefinitionSuspended(processDefinition.getId());
            if (processDefinitionSuspended) {
                // 挂起状态进行激活
                repositoryService.activateProcessDefinitionById(processDefinition.getId());
                System.out.println("流程:" + processDefinition.getName() + "版本:" + processDefinition.getVersion() + "已被激活");
            } else {
                // 激活状态进行挂起
                repositoryService.suspendProcessDefinitionById(processDefinition.getId());
                System.out.println("流程:" + processDefinition.getName() + "版本:" + processDefinition.getVersion() + "已被挂起");
            }


        });

    }

挂起后完成任务或者新增实例的时候会抛一个任务挂起的异常。

二、个人任务分配

分配任务负责人

  • 固定分配

    直接在assignee中指定分配人
  • 表达式分配

在bpmn流程定义中的assignee 中使用表达式${deptManager},deptManager是变量名,如图
在这里插入图片描述
在启动流程时传入表达式的参数
在这里插入图片描述
在数据库中查询当前任务的指定人为deptManager-a
在这里插入图片描述
数据库中查询到流程变量名与变量值的对应
在这里插入图片描述

  • 监听器分配

监听器的配置类型
事件(all create assiginement delete)
类别(class ,expression – 表达式,delegateExpression)
值(具体的值,类名,或者具体表达式)
在这里插入图片描述
在任务流程开启时指定负责人(部门经理指定人为 deptManager-a,总经理指定人为 generalManager-b)

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        /**
         * (部门经理指定人为 deptManager-a,总经理指定人为 generalManager-b)
         */
        // 判断是否在申请创建时期
        if ("create".equals(delegateTask.getEventName())) {
            if ("部门经理审批".equals(delegateTask.getName())) {
                delegateTask.setAssignee("deptManager-a");
            }
            if ("总经理审批".equals(delegateTask.getName())){
                delegateTask.setAssignee("generalManager-b");
            }
        }
    }
}

查询任务

查询任务与以前查询代码一样
@Test
    void taskQuery() {
        // 任务查询
        List<Task> taskList = taskService.createTaskQuery().taskAssignee("deptManager-a").list();
        taskList.forEach(task -> {
            System.out.println("任务名称" + task.getName());
            System.out.println("拥有者" + task.getAssignee());
            System.out.println("任务流程定义id" + task.getProcessDefinitionId());
            System.out.println("任务实例id" + task.getProcessInstanceId());
            System.out.println("-------------");
        });
    }

办理任务

完成任务

@Test
    void completeTask() {
        // 完成任务
        // 1.查询请假流程任务(通过流程实例与当前处理者查询)
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myTaskListener")
                .taskAssignee("deptManager-a")
                .singleResult();
        // 2.完成任务
        taskService.complete(task.getId());
    }

此时,任务通过监听流转到generalManager-b去了
在这里插入图片描述

三、流程变量

定义

流程变量是activiti在管理流程中需要设置的变量,例如在请假流程中,请假3天及以内需要主管审批,3天以上需要总经理审批,请假时间就可以是一个流程变量。

作用域

global变量
默认是流程实例,全局变量。后设置变量值会覆盖前值。
local变量: 作用域小,名称可以与global重复,不互相影响。

使用方式

流程变量两种使用方式
属性上使用uel表达式

${assignee}

连线上使用uel表达式

${item.day>3}

流程变量支持类型
在这里插入图片描述
这是强调一下自定义的类对象需要实现serializable接口。
例如

public class Holiday  implements Serializable {

    /**
     * 假期开始时间
     */
    private Date createTime;

    /**
     * 假期时长
     */
    private Double day;

    /**
     * 假期单名称
     */
    private String name;
    }

实例

请假流程需求 超过3天总经理审批,否则部门经理审批。
流程定义与部署
在这里插入图片描述
在这里插入图片描述

设置global流程变量

1.启动流程时设置流程变量。

Map<String, Object> paramMap = new HashMap<>();

Holiday holiday = new Holiday();
holiday.setDay(1d);
holiday.setCreateTime(new Date());
holiday.setName("1天请假流程");
paramMap.put("item",holiday);

// 设置不同节点办理人
paramMap.put("user1","user");
paramMap.put("user2","dept");
paramMap.put("user3","money");
paramMap.put("user4","general");

// 开始任务,生成流程实例
runtimeService.startProcessInstanceByKey("holiday",paramMap);

2.任务办理时设置变量。

// 完成任务时设置流程变量
Map<String, Object> paramMap = new HashMap<>();

Holiday holiday = new Holiday();
holiday.setDay(5d);
holiday.setCreateTime(new Date());
holiday.setName("5天请假流程");
paramMap.put("item",holiday);
// 设置不同节点办理人
paramMap.put("user2","dept");
paramMap.put("user3","money");
paramMap.put("user4","general");
taskService.complete(task.getId(),paramMap);

3.通过当前流程设置。

Task task = taskService.createTaskQuery()
        .taskAssignee("money")
        .singleResult();
// 通过流程设置变量
String processInstanceId = task.getProcessInstanceId();
runtimeService.setVariable(processInstanceId,"user2","user3");

4.通过当前任务设置。

Task task = taskService.createTaskQuery()
        .taskAssignee("money")
        .singleResult();
// 设置变量
taskService.setVariable(task.getId(),"user1","dept");

设置local变量

1.任务办理时设置

runtimeService.setVariableLocal();

2.通过当前任务设置

taskService.setVariableLocal();
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值