Skip to content

BPMN 2.0存储为XML,并包含可视化的部分:使用标准方式定义了每个步骤类型(人工任务,自动服务调用,等等)如何呈现,以及如何互相连接。这样BPMN 2.0标准使技术人员与业务人员能用双方都能理解的方式交流业务流程。

使用的流程定义示例为:

flowable-graph-example.png

流程定义说明:

  • 我们假定启动流程需要提供一些信息,例如雇员名字、请假时长以及说明。当然,这些可以单独建模为流程中的第一步。 但是如果将它们作为流程的“输入信息”,就能保证只有在实际请求时才会建立一个流程实例。否则(将提交作为流程的第一步),用户可能在提交之前改变主意并取消,但流程实例已经创建了。 在某些场景中,就可能影响重要的指标(例如启动了多少申请,但还未完成),取决于业务目标。
  • 左侧的圆圈叫做启动事件(start event)。这是一个流程实例的起点。
  • 第一个矩形是一个用户任务(user task)。这是流程中用户操作的步骤。在这个例子中,经理需要批准或驳回申请
  • 取决于经理的决定,排他网关(exclusive gateway) (带叉的菱形)会将流程实例路由至批准或驳回路径
  • 如果批准,则需要将申请注册至某个外部系统,并跟着另一个用户任务,将经理的决定通知给申请人。当然也可以改为发送邮件。
  • 如果驳回,则为雇员发送一封邮件通知他。

spring-application 配置

yaml
flowable:
  #关闭定时任务JOB
  async-executor-activate: true 
  #  将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。前提是数据库中只能有flowable-learn架构,架构中不能有表。
  database-schema-update: true

基本操作

flowable 核心 api:

flowable-core-api.png

简单流程部署

java
@Autowired
private ProcessEngine processEngine;
/**
 * 流程部署
 */
@Test
void deployFlow(){
    Deployment deploy = processEngine.getRepositoryService().createDeployment()
            .addClasspathResource("process/HolidayDemo1.bpmn20.xml") // 部署一个流程
            .name("第一个流程案例")
            .deploy();
    System.out.println(deploy.getId());
}

启动流程实例

java
@Test
void startProcess(){
    //  发起流程需要通过RuntimeService来实现
    RuntimeService runtimeService = processEngine.getRuntimeService();
    //	方法一:根据 act_re_procdef 表中的id
    String processId = "Exanple01:2:a7de575b-a73b-11ef-a2cb-005056c00001";
    //  根据流程定义Id启动 返回的是当前启动的流程实例 ProcessInstance
    ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId);
    System.out.println("processInstance.getId() = " + processInstance.getId());

    //  方法二:根据流程图中定义的Key启动
    // 构建流程变量
    Map<String,Object> variables = new HashMap<>();
    variables.put("employee","张三") ;// 谁申请请假
    variables.put("nrOfHolidays",3); // 请几天假
    variables.put("description","工作累了,想出去玩玩"); // 请假的原因
    // 启动流程实例,第一个参数是流程定义的id
    ProcessInstance processInstance = runtimeService
    .startProcessInstanceByKey("holidayRequest", variables);// 启动流程实例
    // 输出相关的流程实例信息
    System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
    System.out.println("流程实例的ID:" + processInstance.getId());
    System.out.println("当前活动的ID:" + processInstance.getActivityId());

这时我们可以在act_ru_task表中看到对应的记录。act_ru_task记录的都是当前待办的记录信息

还有一个要注意的:每启动一个流程实例那么就会在act_hi_procinst表中维护一条记录。然后在act_ru_execution会记录流程的分支

流程审批

java
/**
 * 待办任务查询
 */
@Test
void findTask(){
    // 任务查询这块我们可以通过 TaskService 来实现
    TaskService taskService = processEngine.getTaskService();
    // 查询的其实就是 act_ru_task 中的记录
    List<Task> list = taskService.createTaskQuery()
            .taskAssignee("zhangsan") // 根据审批人来查询
            .list();// 返回多条记录
    for (Task task : list) {
        System.out.println(task.getId());
    }
}
/**
 * 完成任务的审批
 */
@Test
void completeTask(){
    TaskService taskService = processEngine.getTaskService();
    // 需要审批的任务 Id
    String taskId = "926b41f8-7a4c-11ee-97fd-c03c59ad2248";
    taskService.complete(taskId); // 通过complete方法完成审批.

    // 带有参数
    Task task = taskService.createTaskQuery()
    .processDefinitionKey("holidayRequestNew")
    .taskAssignee("lisi")
    .singleResult();
    // 添加流程变量
    Map<String,Object> variables = new HashMap<>();
    variables.put("approved",false); // 拒绝请假
    // 完成任务
    taskService.complete(task.getId(),variables);
}

流程删除

java
RepositoryService repositoryService = processEngine.getRepositoryService();
// 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错
// repositoryService.deleteDeployment("1");
// 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删除操作。
repositoryService.deleteDeployment("2501", true);

act表和功能

Flowable 的常见表及其简要描述:

  1. ACT_GE_:GE 代表 General(全局),全局数据。
  2. ACT_RE_:RE 表示 Repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片)。
  3. ACT_RU_:RU 表示 Runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable 只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
  4. ACT_HI_:HI 表示 History。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
  5. ACT_ID_:ID 表示 Identity。这些表存储用户相关信息。

相关表和功能

  • act_ge_bytearray: 记录流程定义的资源信息。xml和流程图的图片信息
  • act_re_deployment: 流程部署表,记录这次的部署行为
  • act_re_procdef: 流程定义表,记录这次部署动作对应的流程定义信息
  • act_hi_actinst 流程实例执行历史
  • act_hi_identitylink 流程的参与用户的历史信息
  • act_hi_procinst 流程实例历史信息
  • act_hi_taskinst 流程任务历史信息
  • act_ru_execution 流程执行信息
  • act_ru_identitylink 流程的参与用户信息
  • act_ru_task 任务信息
类型表名说明
GeneralACT_GE_BYTEARRAY存储流程定义的字节码数据,包括 BPMN 文件和其他相关资源。
ACT_GE_PROPERTY存储全局属性,用于存储引擎的配置和运行时状态。
RepositoryACT_RE_DEPLOYMENT存储流程定义的部署信息,每次部署都会生成一条记录。
ACT_RE_PROCDEF存储流程定义的元数据信息,包括流程定义的ID、名称、版本等。
ACT_RE_MODEL存储流程模板相关描述信息。
RuntimeACT_RU_TASK存储任务的运行时数据,包括任务的ID、负责人、创建时间等。
ACT_RU_EXECUTION存储流程实例的运行时数据,包括当前活动节点、流程变量等。
ACT_RU_IDENTITYLINK存储运行时流程人员信息,常用于查询人员或部门的待办任务。
ACT_RU_JOB存储作业(Job)的数据,用于异步执行定时任务等。
ACT_RU_VARIABLE存储流程实例和任务的变量数据。
ACT_RU_EVENT_SUBSCR监听信息表。
HistoryACT_HI_ACTINST存储已完成的流程活动(节点)的历史数据,包括活动的类型、开始时间、结束时间等。
ACT_HI_PROCINST存储已完成的流程实例的历史数据,包括流程实例的开始时间、结束时间等。
ACT_HI_TASKINST存储已完成的任务的历史数据,包括任务的完成时间、处理人等。
ACT_HI_VARINST存储已完成的变量的历史数据。
ACT_HI_DETAIL存储已完成的流程实例和任务的详细变量数据。
ACT_HI_COMMENT存储已完成的审批意见的历史数据。
ACT_HI_ATTACHMENT存储已完成的历史附件。
ACT_HI_IDENTITYLINK存储已完成的参与者历史数据,包括各节点候选、办理人员信息,常用于查询某人或部门的已办任务。
IdentityACT_ID_GROUP存储用户组信息,包括用户组的ID、名称等。
ACT_ID_INFO存储用户扩展信息。
ACT_ID_MEMBERSHIP存储用户与用户组之间的关联关系。
ACT_ID_USER存储用户信息,包括用户的ID、用户名、密码等。

参考