Activiti工作流(一)

一、Activiti表说明

1、表结构介绍

以下是activiti生成的25张表

1.1 表的命名规则和作用


看到刚才创建的表,我们发现Activiti 的表都以 ACT_ 开头。

第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。
ACT_RE :'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE : GE 表示 general。 通用数据, 用于不同场景下
 

1.2Activiti数据表介绍

2 什么场景下要操作哪些表?

2.1 流程部署涉及到的表

流程部署,就是将bpmn文件,就是我们画好的流程图,保存到数据库里面;一共有25张表,那么会保存到哪几个表里面呢?

首先我们写代码,就是流程部署的代码,只要执行这个代码,我们的bpmn文件就可以保存到数据库了

 @Test
    //初始化流程部署
    void d1(){
        //1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3、使用RepositoryService进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("process/aaa.bpmn20.xml")
                .addClasspathResource("process/diagram.png").name("请假申请流程").deploy();
        //4、输出部署信息
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
        //流程部署id:1
        //流程部署名称:请假申请流程

    }

执行这个代码,会在控制台打印很多的东西,其中就有很多的sql语句,我们根据这些sql语句,就可以知道这段代码操作了哪些表;通过查看sql语句,分析得知,操作的表有:

ACT_GE_PROPERTY:系统相关属性

 ACT_RE_PROCDEF:已部署的流程定义

ACT_RE_DEPLOYMENT:部署单元信息

ACT_GE_BYTEARRAY:通用的流程定义和流程资源

2.1.1流程定义表 :[ACT_RE_DEPLOYMENT]

这个表就是部署单元信息表;
我们根据表名可以看到是属于RE表,RE表是资源信息相关的表;
执行完以上的代码,我们看数据库这个表里面存的是什么?

 相当于只存了两个字段,一个是当前流程的名称,一个数执行代码时间,也就是部署时间;部署时间是自动生成的,当前流程名称是从哪来的?
原来我们在执行代码的时候,已经自己定义了

2.1.2流程部署表 :[ACT_RE_PROCDEF]

这个表里面存的是已部署的流程定义;

 

2.1.3一般数据 :[ACT_GE_BYTEARRAY]

GE表,里面存的是通用数据
这个表里面存的是通用的流程定义和流程资源

 就是将我们的bpmn文件,png文件保存到数据库,这个表就是资源文件

2.1.4一般数据 :[ACT_GE_PROPERTY]

这个表里面存放的是 系统相关属性数据,只要操作这个数据库,就会修改这个表

这个表不是部署的时候唯一操作的表

2.1.5 总结 : 操作数据表


流程定义部署后操作activiti的3张表如下:

act_re_deployment 流程定义部署表,每部署一次增加一条记录

act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录

act_ge_bytearray 流程资源表

注意:

act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录,bpmn和png。

建议一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。

2.2 启动流程实例涉及到的表

启动流程实例,就相当于张三创建出差申请

相关的代码

 /**
     * 开始流程
     */
    @Test
    public void testStartProcess() {
        //1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qjsq");

        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程部署id:" + processInstance.getId());
       // System.out.println("流程部署名称:" + processInstance.getName());
       // System.out.println("processInstanceId:" + processInstance.getProcessInstanceId());

        //        流程定义id:qjsq
        //        流程实例id:20001
        //        当前活动Id:null
    }

那么以上代码操作的数据库的表有哪几个?

2.2.1 一般数据 [ACT_GE_PROPERTY]

这个是系统相关属性相关的 表,只要操作数据库,这个表里面的数据就会变化,就是对这个表进行更新操作

2.2.2 流程历史记录 [ACT_HI_ACTINST]

这个表里面存的是历史的流程实例;

 刚提交一个申请,这个表里就只有俩个数据

 

创建请假申请的时候,开始标志已经完成,所以这个里面第一个数据有开始时间,有结束时间;

只是提交请假申请,所以第二个数据是没有结束时间的

 以下这3个的字段值,是我们在bpmn里面定义的

 

2.2.3 流程历史记录[ACT_HI_IDENTITYLINK]

历史的流程运行过程中用户关系
就是在走流程的时候,涉及到的人,都会保存在这个表里面;

 

2.2.6 运行实例表[ACT_RU_EXECUTION]

运行时流程执行实例;

这个表里面主要记录的是当前已经执行到哪个节点了,把对应的节点对象记录到这个里面

当前任务运行到这个id的节点上了

2.2.7 运行实例表[ACT_RU_IDENTITYLINK]

运行时用户关系信息,存储任务节点与参与者的相关信息
也就是只要当前任务有参与者,就会将参与者的信息保存到这个表,多个人参与,保存多个信息

2.2.8 运行实例表[ACT_RU_TASK]

运行时任务

一个流程有多个节点,到某一个节点的时候,都会更新这个表,将当前节点的数据更新到这个表

2.2.9 总结: 操作数据表


act_hi_actinst 流程实例执行历史

act_hi_identitylink 流程的参与用户历史信息

act_hi_procinst 流程实例历史信息

act_hi_taskinst 流程任务历史信息

act_ru_execution 流程执行信息

act_ru_identitylink 流程的参与用户信息

act_ru_task 任务信息

2.3 个人任务查询–所涉及到的表

  /**
     * 查询流转到该所属角色的任务
     */
    @Test
    public void testFindPersonalTaskList() {
        //对应各流程节点流转下一步人名称,这里第一步从worker开始
        //调用下方completTask方法可通过审批,再查询下一个名称leader,以此类推直到结束,因为流程图没有不通过的情况所以暂不考虑
        String assignee = "jingli";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery().processDefinitionKey("qjsq").taskAssignee(assignee).list();
        for (Task task : list) {
            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        }
    }


也就是,某一个人登录系统,可以查看属于自己的节点,就是是否流程走到自己这里了;如果走到这里,就查询出来;

流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。

那么当一个人获取数据,是要查询数据库里面的哪个表呢?

我们执行完查询的代码,看到控制台打印了查询日志

select distinct RES.*
 FROM ACT_RU_TASK RES
 INNER JOIN ACT_RE_PROCDEF D
 ON RES.PROC_DEF_ID_ = D.ID_
 WHERE RES.ASSIGNEE_ = 'jingli' and D.KEY_ = 'qjsq' order by RES.ID_ asc
 LIMIT 2147483647 OFFSET 0;

我们分析这个sql语句, 查询了两个表,ACT_RU_TASK 和ACT_RE_PROCDEF表;

ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息;
ACT_RE_PROCDEF 已部署的流程定义表 ,就是部署流程的时候,创建的流程信息;

两个表联查,就可以查询到某一个用户,在某一个流程中,自己所需要处理的任务的list集合;

 2.4 完成个人任务–所涉及到的表

/**
     * 完成任务
     */
    @Test
    public void completTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        //根据流程key和任务的负责人 查询任务
        //返回一个任务对象
        //对应各流程节点流转下一步人名称,这里第一步从worker开始,分别为worker-->leader-->finance
        Task task = taskService.createTaskQuery().processDefinitionKey("qqq").taskAssignee("jingli").singleResult();
        //完成任务,参数:任务id
        taskService.complete(task.getId());
    }

张三要提交申请单,就是要完成自己的任务,让其他人进行审核,张三完成任务的代码就是以上的代码;

ACT_RU_TASK 运行时任务表,就是对于一个流程,已经走到哪个节点了,这个里面保存的就是当前正在走的节点的信息;也就是保存的是当前正在执行的任务;

 act_hi_taskinst 流程任务历史信息 已经执行完成的任务,都会保存在这个里面

**[ACT_HI_ACTINST]**历史的流程实例

 **[ACT_HI_IDENTITYLINK]**历史的流程运行过程中用户关系

**[ACT_RU_EXECUTION]**运行时流程执行实例

**[ACT_RU_IDENTITYLINK]**运行时用户关系信息,存储任务节点与参与者的相关信息 这个是更新操作

 2.4 完成整个流程任务,哪些表还有数据

 

 

 

 

一个流程实例走完了之后,关于运行的表,里面的数据都没有了

以下这些表都没有了

2.5 查询流程定义–所涉及到的表

 /**
     * 查询流程定义
     */
    @Test
    public void queryProcessDefinition(){
        //        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        得到ProcessDefinitionQuery 对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//          查询出当前所有的流程定义
//          条件:processDefinitionKey =evection
//          orderByProcessDefinitionVersion 按照版本排序
//        desc倒叙
//        list 返回集合
        List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myJtxx")
                .orderByProcessDefinitionVersion()
                .desc()
                .list();
//      输出流程定义信息
        for (ProcessDefinition processDefinition : definitionList) {
            System.out.println("流程定义 id="+processDefinition.getId());
            System.out.println("流程定义 name="+processDefinition.getName());
            System.out.println("流程定义 key="+processDefinition.getKey());
            System.out.println("流程定义 Version="+processDefinition.getVersion());
            System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
        }

    }

2.6 流程删除–所涉及到的表

删除的代码是

public void deleteDeployment() {
		// 流程部署id
		String deploymentId = "1";
		
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过流程引擎获取repositoryService
		RepositoryService repositoryService = processEngine
				.getRepositoryService();
		//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
		repositoryService.deleteDeployment(deploymentId);
		//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
		//repositoryService.deleteDeployment(deploymentId, true);
	}

执行完以上的代码,删除了哪些表?

和创建流程的表是一样的,就是这3个表;
[ACT_RE_DEPLOYMENT]
[ACT_RE_PROCDEF]
[ACT_GE_BYTEARRAY]

历史记录里面的表是不会删除的

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值