activiti总结(二)常用API

一、查询所有已定义的流程

查询已定义的流程通过repositoryService.createProcessDefinitionQuery()创建一个流程定义查询器,查询器可以设置很多查询条件。

下面是一个查询的例子:

public
 List getAllProcess() {
        ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
        //添加排序条件
        query.orderByProcessDefinitionVersion().desc();

//        //添加分页查询
        query.listPage(0, 10);
        List list = query.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd.getKey());
        }
        return list;
    }
复制代码

上面的代码中只有两种查询条件,更多的查询方式可以参照activiti文档



通过文档可以很显然的发现,定义查询支持链式查询(activiti中的查询都支持链式查询)

二、创建流程实例

创建流程实例使用runtimeService.startProcessInstanceByKey方法,这个方法被重载了很多次,支持多种方式创建流程实例。详细可以参照activiti文档。

//设置流程创建者
        identityService.setAuthenticatedUserId(userId);
        //创建流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, vars);
        //返回流程实例id
        return processInstance.getId();
复制代码
  • 创建流程实例之前可以使用identityService.setAuthenticatedUserId方法设置流程创建者。
  • 实例创建完成后会自动流转到流程的第一个任务。
  • 创建实例的方法有多个,可以用根据key定义来创建实例,也可以根据流程id来创建实例,根据流程key创建流程会默认使用流程的最新版本。
  • 流程被重新定义后,已被创建的流程不受影响
三、根据任务完成人查询任务

和任务(task)有关的API通常是通过TaskService来调用,查询任务之前首先要使用createTaskQuery方法来创建一个任务查询器,然后设置查询条件,详细api解释可查看activiti官方文档。

/**
     * 根据任务完成人查询任务
     * @param assignee 任务完成者
     */
    @Override
    public void queryTasks(String assignee) {
        TaskQuery taskQuery = taskService.createTaskQuery();
        //添加查询条件 办理人
        taskQuery.taskAssignee(assignee);
        //查询所有
        List list = taskQuery.list();

        for (Task task : list) {
            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                    .processInstanceId(task.getProcessInstanceId()).singleResult();
            System.out.println("任务id:" + task.getId() + "-----任务名称:" + task.getName() + "------任务完成者" +
                    task.getAssignee() + "------任务所有(指派)者" + task.getOwner() + "-------流程创建人" + processInstance.getStartUserId());
            task.getProcessVariables();
        }

    }
复制代码
四、认领和完成任务

claimcomplete函数。

/**
     * 认领任务
     * @param taskId 任务id
     * @param assignee 任务认领人
     */
    @Override
    public void claimTask(String taskId, String assignee) {
        taskService.claim(taskId, assignee);
    }

    /**
     * 完成任务
     * @param taskId 任务id
     * @param varis 添加流程控制变量
     */
    @Override
    public void completeTask(String taskId, HashMap varis) {
        taskService.complete(taskId, varis);
    }
复制代码
  • 使用claim方法时要注意,已经设置过了Assignee的任务再次调用claim方法时会报错。
五、查询正在进行的流程实例

查询正在进行的流程相关的api通常是通过RuntimeService来调用。查询流程实例之前一样要创建流程查询器,然后设置查询条件。API的详细使用可以参照官方文档。

/**
     * 查询正在进行的流程实例
     * @param params 查询参数:包括userId, processInstanceId等字段
     */
    @Override
    public void queryProcess(HashMap params) {

        //获取流程实例查询器
        ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();

        for(String key : params.keySet()){

            if (key.equals("userId")) {//根据用户id查询
                processInstanceQuery.involvedUser(params.get(key).toString());//用户id
            }
            else if(key.equals("processInstanceId")){
                processInstanceQuery.processInstanceId(params.get(key).toString());//用户id
            }
        }

        List processInstances = processInstanceQuery.list();
        for (ProcessInstance processInstance : processInstances) {
            System.out.println("流程实例ID:" + processInstance.getId() + "------>" +
                    "流程定义ID:" + processInstance.getProcessDefinitionId() + "------>" +
                    "流程开始时间:" + processInstance.getStartTime() + "------>" +
                    "流程创建者:" + processInstance.getStartUserId() + "------>" +
                    "当前任务:" + processInstance.getActivityId()
            );
        }
    }
复制代码
六、查询历史流程 与 查询历史任务
  1. 查询历史流程相关的api通常是通过HistoryService来调用。查询历史流程实例之前一样要创建流程查询器,然后设置查询条件。API的详细使用可以参照官方文档。
/**
     * 查询历史流程
     * @param params 查询参数:包括userId等字段
     */
    @Override
    public void queryHistoricProcess(HashMap params) {
        HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery();

        for(String key : params.keySet()){

            if (key.equals("userId")) {//根据用户id查询
                processInstanceQuery.involvedUser(params.get(key).toString());//用户id
            }
        }
        processInstanceQuery.finished();//已结束的流程
        List processInstances = processInstanceQuery.list();
        for (HistoricProcessInstance processInstance : processInstances) {
            System.out.println("流程实例ID:" + processInstance.getId() + "------>" +
                    "流程定义ID:" + processInstance.getProcessDefinitionId() + "------>" +
                    "流程开始时间:" + processInstance.getStartTime() + "------>" +
                    "流程结束时间:" + processInstance.getEndTime() + "------>" +
                    "流程创建者:" + processInstance.getStartUserId());
        }


    }
复制代码
  • 默认情况下,历史流程查询器会将所有流程都查询出来,包括正在运行的和已经结束的流程。
  1. 查询历史任务与查询历史流程类似
/**
     * 根据任务Assignee查询历史任务(或根据任务Owner查询任务)
     */
    @Override
    public void queryHistoricTasks(String assignee, String owner) {
        //创建历史任务查询器
        HistoricTaskInstanceQuery historicTaskInstancesQuery = historyService.createHistoricTaskInstanceQuery();
        //根据任务完成人查询
        historicTaskInstancesQuery.taskAssignee(assignee);
        //根据任务所有人查询
        historicTaskInstancesQuery.taskOwner(owner);
        List  historicTaskInstances = historicTaskInstancesQuery.list();

        for(HistoricTaskInstance pi:historicTaskInstances){
            System.out.println("任务实例ID:" + pi.getId() + "------>" +
                    "任务定义ID" + pi.getProcessDefinitionId() + "------>" +
                    "任务名称:"+pi.getName() + "------>" +
                    "代理人:"+pi.getAssignee() + "------>" +
                    "任务所有者:" + pi.getOwner()
            );
        }
    }
复制代码
七、撤销一个流程

撤销流程实际上是对一个未结束的流程做删除操作,代码如下

/**
     * 根据流程实例id撤销一个流程
     * @param processInstanceId 流程实例id
     * @param taskId 若传入的流程实例id为空,则使用任务实例id来撤销一个流程
     * @param reason 流程删除原因
     */
    public void deleteProcess(String processInstanceId, String taskId, String reason){
        if(processInstanceId != null){
            runtimeService.deleteProcessInstance(processInstanceId, reason);
        }
        else{
            //根据任务实例id获取任务实例
            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
            //根据任务实例获取任务所在的流程实例id
            runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
        }
    }
复制代码