一、核心API

①ProcessEngine对象 流程引擎对象

说明:

1) 在Activiti中最核心的类,其他的类都是由他而来。

2) 产生方式

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

3)可以产生RepositoryService

RepositoryService repositoryService =processEngine.getRepositoryService();

4) 可以产生 RuntimeService

RuntimeService runtimeService = processEngine.getRuntimeService();

5) 可以产生TaskService

TaskService taskService =processEngine.getTaskService();

各个Service的作用

②RepositoryService

Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片该service可以用来删除部署的流程定义。

③RuntimeService

Activiti的流程执行服务类,可以从这个服务类中获取很多关于流程执行的相关的信息。

④TaskService

Activiti的任务服务类。可以从这个类中获取任务的相关信息,如当前正在执行的个人待办和用户组待办任务。

⑤HistoryService

Activiti的查询历史信息的类,在一个流程执行完成后,这个对象为我们提供查询历史信息,可以跟踪流程实例对应所有待办节点的运行情况。

⑥ProcessDefinition

流程定义类,可以从这里获得资源文件等。

⑦ProcessInstance

代表流程定义的执行实例,当一个部署的流程图启动后,该流程只有一条流程实例数据,但是它的流程任务可以有多个,每个任务对应流程图中相应的流程节点。

二、HelloWorld程序

建立一个请假的流程

在上篇博客中,我已经搭建好环境,也写好配置文件,以及生成了数据库的25张表,这里就不再多说。

首先创建流程图,bpmn:

各节点id和名字,以及处理人:

任务id和名字:

整个流程是这样的:A用户可以提交申请,然后先由B用户审批,B用户审批后,再由C用户审批,C审批后整个流程就完成。

①获取到ProcessEngine核心对象

这里在测试类里面进行,利用注解@Before获取

    ProcessEngine processEngine = null;

    @Before
    public void init(){
        processEngine = ProcessEngines.getDefaultProcessEngine();
    }

②部署流程定义,即将之前画的流程图部署到数据库

/**
     * 部署流程定义(操作数据表:act_re_deployment、act_re_procdef、act_ge_bytearray)
     */
    @Test
    public void test1(){
        RepositoryService service = processEngine.getRepositoryService();
        Deployment deployment = service.createDeployment()
                .name("helloworld入门")
                .addClasspathResource("diagrams/HelloWorld.bpmn")
                .addClasspathResource("diagrams/HelloWorld.png")
                .deploy();
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

③查询流程定义列表

    /**
     * 查询流程定义列表
     */
    @Test
    public void test2() {
        // 流程定义查询对象,用于查询表act_re_procdef
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        // 添加过滤条件,即根据之前画好的流程图的id来查询
        query.processDefinitionKey("HelloWorldKey");
        List<ProcessDefinition> list = query.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd.getId() + "--" + pd.getName());
        }
    }

④启动流程实例

    /**
     * 启动流程实例
     * runtimeService.startProcessInstanceByKey("HelloWorldKey")
     * 中的HelloWorldKey对应流程图中的ID值,在数据表中对应act_re_procdef流程定义表中的key字段;
     * 在act_ru_execution中产生一条数据,这条数据为当前流程正在执行的任务,其中act_id_字段的值对应流程图节点的ID值;
     * 在act_ru_task表中会产生一条任务数据,execution_id_对应act_ru_execution主键,proc_inst_id_为流程实例ID,
     * name_值为流程节点名称,assignee_字段为该待办当前的处理;
     */
    @Test
    public void test03(){
        String processDefinitionKey = "HelloWorldKey";
        //获取正在执行流程实例和执行对象相关的service
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //使用流程定义key启动流程实例,key对象是HelloWorld.bpmn文件中的ID属性值,对应的是act_re_procdef表中的key
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
        System.out.println(processInstance.getId()); //流程实例ID
    }

⑤查询个人任务列表,即查询A用户可以操作的流程,即A用户可以提交申请

    /**
     * 查询个人任务列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "A";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            System.out.println("待办任务ID:"+task.getId());
            System.out.println("待办任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());
            System.out.println("任务办理人:"+task.getAssignee());
            System.out.println("流程实例ID:"+task.getProcessInstanceId());
            System.out.println("执行对象ID:"+task.getExecutionId());
            System.out.println("流程定义ID:"+task.getProcessDefinitionId());
        }
    }

⑥办理任务,即A用户提交请假申请,使用的是待办任务的id

    /**
     * 办理任务
     * taskId对应act_ru_task表的主键ID,因为当前待办任务为第一个节点提交申请,
     * 当执行完这个待办后下一条待办数据将会流转到审批【部门经理】那,然后以此类推
     * 可以将部门经理和总经理的待办任务全部查询和执行完成。
     */
    @Test
    public void test05(){
        String taskId= "2504";
        processEngine.getTaskService().complete(taskId);
        System.out.println("办理完成,任务ID是:"+taskId);
    }

此时流程会自动提交给B用户,到⑤处执行查询B用户的流程,就可以看到,B用户有了需要办理的流程

    /**
     * 查询个人任务列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "B";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            System.out.println("待办任务ID:"+task.getId());
            System.out.println("待办任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());
            System.out.println("任务办理人:"+task.getAssignee());
            System.out.println("流程实例ID:"+task.getProcessInstanceId());
            System.out.println("执行对象ID:"+task.getExecutionId());
            System.out.println("流程定义ID:"+task.getProcessDefinitionId());
        }
    }

然后B用户去处理该流程,即⑥

    /**
     * 办理任务
     * taskId对应act_ru_task表的主键ID,因为当前待办任务为第一个节点提交申请,
     * 当执行完这个待办后下一条待办数据将会流转到审批【部门经理】那,然后以此类推
     * 可以将部门经理和总经理的待办任务全部查询和执行完成。
     */
    @Test
    public void test05(){
        String taskId= "5002";
        processEngine.getTaskService().complete(taskId);
        System.out.println("办理完成,任务ID是:"+taskId);
    }

然后流程又会提交到C用户,C用户也可以查询到需要处理的流程任务

    /**
     * 查询个人任务列表
     */
    @Test
    public void test04() {
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        String assignee = "C";
        query.taskAssignee(assignee);
        List<Task> list = query.list();
        for (Task task : list) {
            System.out.println("待办任务ID:"+task.getId());
            System.out.println("待办任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());
            System.out.println("任务办理人:"+task.getAssignee());
            System.out.println("流程实例ID:"+task.getProcessInstanceId());
            System.out.println("执行对象ID:"+task.getExecutionId());
            System.out.println("流程定义ID:"+task.getProcessDefinitionId());
        }
    }

C用户处理路程任务:

    /**
     * 办理任务
     * taskId对应act_ru_task表的主键ID,因为当前待办任务为第一个节点提交申请,
     * 当执行完这个待办后下一条待办数据将会流转到审批【部门经理】那,然后以此类推
     * 可以将部门经理和总经理的待办任务全部查询和执行完成。
     */
    @Test
    public void test05(){
        String taskId= "7502";
        processEngine.getTaskService().complete(taskId);
        System.out.println("办理完成,任务ID是:"+taskId);
    }

 

至此,整套流程执行完毕。

小结:

1.Activiti框架提供的Service对象

RepositoryService----操作静态的资源(流程定义,bpmn、png)

RuntimeService-----操作流程实例(启动流程实例、查询流程实例、结束流程实例)

TaskService-----操作任务(查询任务、办理任务)

HistoryService----操作历史数据

2.Activiti框架提供的对象(和表有对应关系)

Deployment-----act_re_deployment

ProcessDefinition----act_re_procdef

ProcessInstance-----act_ru_execution

Task-----act_ru_task

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐