Activiti7学习笔记———activiti进阶

一、流程实例

1、通过Businesskey关联业务

    /**
     * 启动流程实例,添加businessKey
     */
    @Test
    public void addBusinessKey(){
//        1、得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
        ProcessInstance processInstance = runtimeService.
                startProcessInstanceByKey("myFlow01","C00001");
//        4、输出processInstance相关属性
        System.out.println("业务id=="+processInstance.getBusinessKey());

    }

运行结果
Activiti7学习笔记———activiti进阶_第1张图片

这样创建的流程实例就能够根据自己实际业务系统的C00001业务相关联,而这个字段会被保存在act_ru_execution表的Businesskey字段中。
Activiti7学习笔记———activiti进阶_第2张图片

2、流程挂起

/**
     * 全部流程实例挂起与激活
     */
    @Test
    public void SuspendAllProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        查询流程定义的对象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
                processDefinitionKey("myFlow01").
                singleResult();
//        得到当前流程定义的实例是否都为暂停状态(默认以查询到的第一个流程为标准)
        boolean suspended = processDefinition.isSuspended();
//        流程定义id
        String processDefinitionId = processDefinition.getId();
//        判断是否为暂停
        if(suspended){
//         如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
            repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
            System.out.println("流程定义----"+processDefinitionId+",已激活");
        }else{
//          如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
            repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
            System.out.println("流程定义----"+processDefinitionId+",已挂起");
        }

    }

运行结果
在这里插入图片描述
在数据表中两个流程实例均被挂起
Activiti7学习笔记———activiti进阶_第3张图片
如果是要单个流程实例挂起则需要使用查询流程实例的ProcessInstanceQuery

/**
     * 单个流程实例挂起与激活
     */
    @Test
    public void SuspendSingleProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        查询流程定义的对象
        ProcessInstance processInstance = runtimeService.
                createProcessInstanceQuery().
                processInstanceId("25001").
                singleResult();
//        得到当前流程定义的实例是否都为暂停状态
        boolean suspended = processInstance.isSuspended();
//        流程定义id
        String processDefinitionId = processInstance.getId();
//        判断是否为暂停
        if(suspended){
//         如果是暂停,可以执行激活操作 ,参数:流程定义id
            runtimeService.activateProcessInstanceById(processDefinitionId);
            System.out.println("流程定义:"+processDefinitionId+",已激活");
        }else{
//          如果是激活状态,可以暂停,参数:流程定义id
            runtimeService.suspendProcessInstanceById( processDefinitionId);
            System.out.println("流程定义:"+processDefinitionId+",已挂起");
        }

    }

运行结果
在这里插入图片描述
在这里插入图片描述

2、流程任务

1、流程任务的分配

Activiti7学习笔记———activiti进阶_第4张图片
方式一:直接输入

Activiti7学习笔记———activiti进阶_第5张图片

通过部署流程定义,启动流程实例后通过查询打印

    @Test
    public void testQueryTest(){
        String ass = "操作员01";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee(ass).list();
        for (Task task:list)
            System.out.println(ass + "的任务名为" + task.getName() + "---" + task.getId());
    }

运行结果:
在这里插入图片描述
对应数据库中
在这里插入图片描述

方式二:UEL表达式
1、bpmn图输入表达式
Activiti7学习笔记———activiti进阶_第6张图片
2、在代码中分配

    /**
     * 设置流程负责人
     */
    @Test
    public void assigneeUEL(){
//      获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        设置assignee的取值,用户可以在界面上设置流程的执行
        Map<String,Object> assigneeMap = new HashMap<>();
        assigneeMap.put("assignee","张三");
//        启动流程实例,同时还要设置流程定义的assignee的值
        runtimeService.startProcessInstanceByKey("myFlow02",assigneeMap);
    }
}

通过方式一的代码获取任务
Activiti7学习笔记———activiti进阶_第7张图片
在这里插入图片描述
方式三:使用监听器
1、实现 org.activiti.engine.delegate.TaskListener 接口

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        if(delegateTask.getName().equals("")&&
                delegateTask.getEventName().equals("create")){
            //这里指定任务负责人
            delegateTask.setAssignee("张三");
        }
    }
} 

2、在bpmn图中设置我们写好的监听器(这里我插件出了问题,无法扩展)
Activiti7学习笔记———activiti进阶_第8张图片

2、任务关联 businessKey

通过获取任务对象的流程实例Id来获取流程实例中的businessKey,通过businessKey来获取业务数据库中的数据。

@Test
    public void findProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        查询流程定义的对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection1")
                .taskAssignee("张三")
                .singleResult();
//        使用task对象获取实例id
        String processInstanceId = task.getProcessInstanceId();
//          使用实例id,获取流程实例对象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();
//        使用processInstance,得到 businessKey
        String businessKey = processInstance.getBusinessKey();
        System.out.println("businessKey=="+businessKey);
    }

3、流程变量

1、流程变量作用域

globa变量

流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量

local变量

任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

2、流程变量类型

Activiti7学习笔记———activiti进阶_第9张图片

3、使用流程变量控制流程

如定义该流程
Activiti7学习笔记———activiti进阶_第10张图片

1、在创建流程实例时设置流程变量
流程业务对象

/**
 * 自定义流程实例业务对象
 */
public class EventPOJO implements Serializable {
    //条件
    private Integer num;
    public Integer getNum() {
        return num;
    }
    public void setNum(Integer num) {
        this.num = num;
    }
}

在对流程实例部署之后启动流程实例中设置流程变量如果在bpmn中是以${eventPOJO.num < 3}设置条件的则用方式2来设置

    /**
     * 启动流程实例并定义流程变量
     */
    @Test
    public void testStartProcess02(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //创建自定义的流程业务对象
        EventPOJO eventPOJO = new EventPOJO();
        eventPOJO.setNum(1);
        //将设置的流程变量或是其他变量放入map
        Map<String, Object> map = new HashMap<>();
        //方式1
        map.put("num",1);
        //方式2(在以下的方式同理)
//        map.put("eventPOJO",eventPOJO);
        //        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myFlow04",map);
//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

接下来完成“事件01”后默认执行的就是“事件03”

Activiti7学习笔记———activiti进阶_第11张图片

2、在任务办理时设置流程变量
在部署和流程实例创建后

    @Test
    public void completTask() {
        //任务id
        String key = "myFlow04";
//        任务负责人
//      String assingee = "张三";
//       获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//       创建TaskService
        TaskService taskService = processEngine.getTaskService();
//       创建变量集合
        Map<String, Object> map = new HashMap<>();
//      定义流程变量
        map.put("num",4);
//        完成任务前,需要校验该负责人可以完成当前任务
//        校验方法:
//        根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
//              .taskAssignee(assingee)
                .singleResult();
        if(task != null){
            //完成任务是,设置流程变量的值
            taskService.complete(task.getId(),map);
            System.out.println("任务执行完成");
        }
    }

在办理事件01时设置流程变量为4,此时num>3则如bpmn图接下来要执行事件02
Activiti7学习笔记———activiti进阶_第12张图片

3、通过当前流程实例设置
通过流程实例id设置全局变量,该流程实例必须未执行完成。

    @Test
    public void setGlobalVariableByExecutionId(){
//    当前流程实例执行 id,通常设置为当前执行的流程实例
        String executionId="2601";
//     获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//      通过流程实例 id设置流程变量
        runtimeService.setVariable(executionId, "num", 1);
//      一次设置多个值
//      runtimeService.setVariables(executionId, variables)
    }

4、通过当前任务设置

@Test
	public void setGlobalVariableByTaskId(){
		//当前待办任务id
		String taskId="1404";
//     获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		//通过任务设置流程变量
		taskService.setVariable(taskId, "num", 1);
		//一次设置多个值 
		//taskService.setVariables(taskId, variables)
	}

5、local流程变量设置
只需通过TaskService对象的以下这个方法就可以设置

//  通过任务设置流程变量
    taskService.setVariableLocal(taskId, "num", 1);

4、组任务

在对组任务进行查询逻辑基本都与前面一致,无非是通过任务查询器TaskQuery来通过各种条件对于任务内容进行查询(这里是通过候选人进行任务的查询)。
拾取组任务

         //拾取任务 claim(要拾取的任务id,任务候选人id)
           taskService.claim(taskId, userId);

归还组任务、交接组任务
本质就是修改Assignee

       // 如果设置为null,归还组任务,该 任务没有负责人
       taskService.setAssignee(taskId, null);

5、网关

参考

你可能感兴趣的:(activiti,activiti)