目录

  • 1. 前言
  • 2. 捋清三个概念
    • 2.1. 流程定义
    • 2.2. 流程实例
    • 2.3. 执行实例
  • 3. 流程启动方式
  • 4. `Flowable` 完整流程操作
    • 4.1. 流程部署
      • 4.1.1. 部署实现
      • 4.1.2. 部署涉及的表结构
        • 4.1.2.1. `act_re_deployment` 流程部署表
        • 4.1.2.2. `act_re_procdef` 流程定义表
        • 4.1.2.3. `act_ge_bytearray`
    • 4.2. 启动流程实例
      • 4.2.1. 启动流程实例实现
      • 4.2.2. 启动流程实例涉及的表结构
        • 4.2.2.1. `act_ru_execution`:运行时执行实例表
        • 4.2.2.2. `act_ru_identitylink`:运行时用户关系信息
        • 4.2.2.3. `act_ru_task`:运行时任务表
        • 4.2.2.4. `act_ru_variable`:运行时变量表
    • 4.3. 处理任务流程
      • 4.3.1. 处理任务的实现
      • 4.3.2. 处理任务涉及的表结构
        • 4.3.2.1. `act_ru_execution`:运行时执行实例表
        • 4.3.2.2. `act_ru_identitylink`:运行时用户关系信息
        • 4.3.2.3. `act_ru_task`:运行时任务表
        • 4.3.2.4. `act_ru_variable`:运行时变量表
    • 4.4. 完成任务流程(完整的流程)
      • 4.4.1. 完成任务流程的实现
      • 4.4.2. 完成任务涉及的表结构
        • 4.4.2.1. `act_ru_execution`:运行时执行实例表
        • 4.4.2.2. `act_ru_identitylink`:运行时用户关系信息
        • 4.4.2.3. `act_ru_task`:运行时任务表
        • 4.4.2.4. `act_ru_variable`:运行时变量表
      • 4.4.3. 历史表查询信息
    • 4.5. 删除流程实例

1. 前言

部署之后的流程,这个还不能直接运行,例如我们部署了一个请假流程,现在 zhangsan 想要请假,他就需要开启一个请假流程,lisi 想请假,他也需要开启一个请假流程,这一个一个开启的请假流程就是流程实例,而我们一开始部署的请假流程,则类似于一个模版,基于此模版,我们可以开启很多个具体的流程实例

2. 捋清三个概念

  • 流程定义 ProcessDefinition
  • 流程实例 ProcessInstance
  • 执行实例 Execution

2.1. 流程定义

流程定义 ProcessDefinition 这个好说,其实就是我们上篇文章中和大家介绍的内容。将一个流程 XML 文件部署到 flowable 中,这就是一个定义好的流程了,基于这个定义好的流程,我们可以开启很多流程实例

2.2. 流程实例

流程实例 ProcessInstance 就是通过流程定义启动的一个流程,他表示一个流程从开始到结束的最大的流程分支,在一个已经启动的流程中,只存在一个流程实例

2.3. 执行实例

在一个流程中,出口和入口可以算是一个流程实例的节点,而中间的过程则是执行实例。假如流程本身就是一条线,那么流程实例和执行实例基本上是一样的,但是如果流程中包含多条线,例如下图


这张图中有并行网关,并行任务执行的时候,每一个并行任务就是一个执行实例,这样大家就好理解了

结论就是,在一个流程实例中,除了开始和结束之外,其他的都是执行实例。即使流程只有一条线,中间的也都是执行实例,只不过此时的执行实例等于流程实例而已

3. 流程启动方式

// 通过流程定义的 id 去启动
RuntimeService.startProcessInstanceById()// 通过流程的 key 去启动
RuntimeService.startProcessInstanceByKey()// 通过流程的 key+tenantId 去启动
RuntimeService.startProcessInstanceByKeyAndTenantId()// 通过流程的 message 去启动
RuntimeService.startProcessInstanceByMessage()// 通过流程的 message+tenanId 去启动
RuntimeService.startProcessInstanceByMessageAndTenantId()

4. Flowable 完整流程操作

4.1. 流程部署

  • 请假发起人是小王
  • 主管是张主管
  • 经理是李经理

工作流程图如下

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"exporterVersion="6.7.2"><process id="MyLeave" name="MyLeave" isExecutable="true"><documentation>员工请假流程</documentation><startEvent id="sid-159DD77D-9878-4288-AC29-B898E08DC216" flowable:formFieldValidation="true"></startEvent><userTask id="zgID" name="主管审批" flowable:assignee="张主管" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="sid-1E8F84D7-6C11-4D88-84C9-B818474F880E" sourceRef="sid-159DD77D-9878-4288-AC29-B898E08DC216"targetRef="zgID"></sequenceFlow><exclusiveGateway id="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"></exclusiveGateway><sequenceFlow id="sid-08020782-2DDE-4C56-BFC0-224DC99FB50E" sourceRef="zgID"targetRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"></sequenceFlow><endEvent id="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"></endEvent><userTask id="jlID" name="经理审批" flowable:assignee="李经理" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><exclusiveGateway id="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"></exclusiveGateway><sequenceFlow id="sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14" sourceRef="jlID"targetRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"></sequenceFlow><endEvent id="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"></endEvent><endEvent id="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"></endEvent><sequenceFlow id="sid-A74937CE-02B1-493B-8033-08CA2D652771" name="同意"sourceRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0" targetRef="jlID"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='YES'}]]></conditionExpression></sequenceFlow><sequenceFlow id="sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A" name="同意"sourceRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"targetRef="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='YES'}]]></conditionExpression></sequenceFlow><sequenceFlow id="sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7" name="拒绝"sourceRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"targetRef="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='NO'}]]></conditionExpression></sequenceFlow><sequenceFlow id="sid-4CC613DD-7789-408B-AFA0-1241261A4E79" name="拒绝"sourceRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"targetRef="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='NO'}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_MyLeave"><bpmndi:BPMNPlane bpmnElement="MyLeave" id="BPMNPlane_MyLeave"><bpmndi:BPMNShape bpmnElement="sid-159DD77D-9878-4288-AC29-B898E08DC216"id="BPMNShape_sid-159DD77D-9878-4288-AC29-B898E08DC216"><omgdc:Bounds height="30.0" width="30.0" x="45.0" y="105.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="zgID" id="BPMNShape_zgID"><omgdc:Bounds height="80.0" width="100.0" x="165.0" y="80.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"id="BPMNShape_sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"><omgdc:Bounds height="40.0" width="40.0" x="360.0" y="100.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"id="BPMNShape_sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"><omgdc:Bounds height="28.0" width="28.0" x="366.0" y="225.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="jlID" id="BPMNShape_jlID"><omgdc:Bounds height="80.0" width="100.0" x="495.0" y="80.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"id="BPMNShape_sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"><omgdc:Bounds height="40.0" width="40.0" x="690.0" y="100.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"id="BPMNShape_sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"><omgdc:Bounds height="28.0" width="28.0" x="696.0" y="225.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"id="BPMNShape_sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"><omgdc:Bounds height="28.0" width="28.0" x="825.0" y="106.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sid-1E8F84D7-6C11-4D88-84C9-B818474F880E"id="BPMNEdge_sid-1E8F84D7-6C11-4D88-84C9-B818474F880E" flowable:sourceDockerX="15.0"flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="74.94999923927439" y="120.0"></omgdi:waypoint><omgdi:waypoint x="164.99999999991007" y="120.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-08020782-2DDE-4C56-BFC0-224DC99FB50E"id="BPMNEdge_sid-08020782-2DDE-4C56-BFC0-224DC99FB50E" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="20.5" flowable:targetDockerY="20.5"><omgdi:waypoint x="264.9499999999992" y="120.1509063444109"></omgdi:waypoint><omgdi:waypoint x="360.43939393938865" y="120.43939393939392"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-4CC613DD-7789-408B-AFA0-1241261A4E79"id="BPMNEdge_sid-4CC613DD-7789-408B-AFA0-1241261A4E79" flowable:sourceDockerX="20.5"flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"><omgdi:waypoint x="710.4194915254237" y="139.52220575783235"></omgdi:waypoint><omgdi:waypoint x="710.0588602435497" y="225.00012270930887"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14"id="BPMNEdge_sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="20.5" flowable:targetDockerY="20.5"><omgdi:waypoint x="594.9499999999981" y="120.15090634441087"></omgdi:waypoint><omgdi:waypoint x="690.4393939393933" y="120.43939393939394"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A"id="BPMNEdge_sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A" flowable:sourceDockerX="20.5"flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"><omgdi:waypoint x="729.516569086651" y="120.42578125"></omgdi:waypoint><omgdi:waypoint x="825.0001009915921" y="120.054279921789"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7"id="BPMNEdge_sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7" flowable:sourceDockerX="20.5"flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"><omgdi:waypoint x="380.4194915254237" y="139.52220575783235"></omgdi:waypoint><omgdi:waypoint x="380.05886024354976" y="225.00012270930887"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-A74937CE-02B1-493B-8033-08CA2D652771"id="BPMNEdge_sid-A74937CE-02B1-493B-8033-08CA2D652771" flowable:sourceDockerX="20.5"flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="399.50196526507943" y="120.44207317073172"></omgdi:waypoint><omgdi:waypoint x="494.9999999999935" y="120.15182370820669"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

4.1.1. 部署实现

@Test
public void test1() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/MyLeave.bpmn20.xml").name("员工请假流程").category("请假")// 分类.tenantId("user1Id")// 租户id.deploy();System.out.println("deploy.getId() = " + deploy.getId());System.out.println("deploy.getName() = " + deploy.getName());System.out.println("deploy.getCategory() = " + deploy.getCategory());
}

4.1.2. 部署涉及的表结构

4.1.2.1. act_re_deployment 流程部署表

  • act_re_deployment:流程部署表,每部署一个流程,这张表中就会新增一条记录

4.1.2.2. act_re_procdef 流程定义表

act_re_procdef:流程定义表,我们每定义的一个流程,都会记录在这张表中

  • 表中有一个 DEPLOYMENT_ID 字段和 act_re_deployment 表进行了关联,所以 act_re_deploymentact_re_procdef 表的关系,其实是一对一的关系,部署表中的一条记录对应流程定义表中的一条记录
  • 另外,该表中还有一个 VERSION_ 字段,这个看名字就知道是描述记录的版本号,当我们修改了流程的内容之后,重新部署的时候,act_re_deploymentact_re_procdef 表均会自动增加一条记录数;其中流程定义表 act_re_procdef 中的记录的 VERSION_ 字段的值会自动加 1,这样我们就能够看到不同历史版本的流程定义

4.1.2.3. act_ge_bytearray

act_ge_bytearray:通用数据存储表

  • 这个表中有一个 DEPLOYMENT_ID 字段,这个就是跟 act_re_deployment 表关联的字段,一条流程部署记录在 act_ge_bytearray 表中对应两条记录,分别是记录 XML 文件和记录流程图片
  • 这个表中有一个 BYTES_ 字段,我们部署的流程的 XML 文件就保存在这里,同时,系统默认还会根据 XML 文件生成一张流程图片,也保存在这里

4.2. 启动流程实例

4.2.1. 启动流程实例实现

@Test
public void test2() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();// 构建流程变量Map<String, Object> variables = new HashMap<>();variables.put("employee", "小王");// 谁申请请假variables.put("nrOfHolidays", 3); // 请几天假variables.put("description", "工作累了,想出去玩玩"); // 请假的原因// 启动流程实例,第一个参数是流程定义的idProcessInstance processInstance = runtimeService.startProcessInstanceById("MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001", variables);System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());System.out.println("流程实例的ID:" + processInstance.getId());System.out.println("当前活动的ID:" + processInstance.getActivityId());
}

4.2.2. 启动流程实例涉及的表结构

启动一个流程实例的时候涉及到的表有如下的表,它们之间的关联关系请 看这里,注意观察此时各个表的数据;处理任务流程完成之后,它们的数据会发生变化

4.2.2.1. act_ru_execution:运行时执行实例表


4.2.2.2. act_ru_identitylink:运行时用户关系信息

4.2.2.3. act_ru_task:运行时任务表


该表中有一条记录,这条记录其实就是提交请假申请这个节点,现在流程就停在这一步了,需要用户手动操作,才会继续向下走

  • 从这几张表中我们也可以大致上看出来,执行实例流程实例 之间的关系, act_ru_execution 表中的每一条记录就是一个 执行实例,多个 执行实例 对应同一个 PROC_INST_ID_ (流程实例 ID),而 act_ru_task 表中的每一条 任务 记录也都对应了一个 执行实例

4.2.2.4. act_ru_variable:运行时变量表

4.3. 处理任务流程

上面的流程已经流转到了 张主管 这个用户这里,然后可以开始审批了。注意观察此时 act_ru_task 表的数据,下面数据会发生变化


这个 张主管 是哪里来的呢?如下图所示


这个 李经理 是哪里来的呢?如下图所示

4.3.1. 处理任务的实现

@Test
public void test4() {// 获取流程引擎对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery()// 流程定义ID.processDefinitionId("MyLeave:1:8c16935c-5544-11ed-b9df-005056c00001").taskAssignee("张主管")// 被指派执行该任务的人,即张主管去处理此次任务.singleResult();// 添加流程变量Map<String, Object> variables = new HashMap<>();// 同意请假,变量 executeType 在绘制流程图时已指定variables.put("executeType", "YES");// 张主管完成自己的任务taskService.complete(task.getId(), variables);
}
  • 变量 executeType 在绘制流程图时已指定流条件

4.3.2. 处理任务涉及的表结构

4.3.2.1. act_ru_execution:运行时执行实例表


此时流程已经流转到了需要 李经理 处理任务了,任务 ID 就成为了 李经理 的 ID

4.3.2.2. act_ru_identitylink:运行时用户关系信息

增加了一条数据

4.3.2.3. act_ru_task:运行时任务表

此时查询到的任务就只有 李经理 需要处理的任务了

4.3.2.4. act_ru_variable:运行时变量表

  • 上述 test4() 处理任务方法执行完成后,首先会在 act_ru_task 表中插入一条新的需要 李经理 完成的任务,然后会更新 act_ru_execution 表中对应的执行实例信息,最后再从 act_ru_task 表中删除需要 张主管 完成的记录,这些操作是在同一个事务当中完成的
  • 当一个流程实例完成后,act_ru_taskact_ru_execution 表中的记录都会被删除,所以我们可以通过查询 act_ru_execution 表中是否还有记录,去判断一个流程目前是处于执行状态还是完成状态

4.4. 完成任务流程(完整的流程)

  • 如果张主管拒绝了小王的请假申请,该流程直接结束,也就是张主管完成了任务,表结构数据流转变化与下述一样
  • 如果李经理拒绝了小王的请假申请,该流程直接结束,也就是李经理完成了任务,表结构数据流转变化与下述一样
  • 如果李经理同意了小王的请假申请,该流程直接结束,就是下面的流程

上面的流程已经流转到了 李经理 这个用户这里,然后可以再次审批了。注意观察此时 act_ru_task 表的数据,下面数据会发生变化

4.4.1. 完成任务流程的实现

@Test
public void test5() {// 获取流程引擎对象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("2c495021-55bf-11ed-a800-005056c00001").taskAssignee("李经理").singleResult();// 添加流程变量Map<String, Object> variables = new HashMap<>();// 同意请假,变量 executeType 在绘制流程图时已指定variables.put("executeType", "YES");// 李经理完成自己的任务taskService.complete(task.getId(), variables);
}
  • 变量 executeType 在绘制流程图时已指定流条件

4.4.2. 完成任务涉及的表结构

4.4.2.1. act_ru_execution:运行时执行实例表

4.4.2.2. act_ru_identitylink:运行时用户关系信息

4.4.2.3. act_ru_task:运行时任务表

4.4.2.4. act_ru_variable:运行时变量表

  • 这四张表中对应的数据都没有了,也就是这个流程已经整个完成了。然后在对应的历史表中我们可以看到相关的信息

4.4.3. 历史表查询信息

  • act_hi_actinst:历史活动信息,这里记录流程流转过的所有节点

  • act_hi_identitylink:历史的流程运行过程中用户关系

  • act_hi_procinst:历史的流程实例
  • act_hi_taskinst:历史的任务实例

  • act_hi_varinst:历史的流程运行中的变量信息

4.5. 删除流程实例

@Test
public void test3() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();// 参数:流程实例id、删除原因runtimeService.deleteProcessInstance("acc4629b-5541-11ed-8bed-005056c00001", "想删除了");
}
  • 注意这个是删除正在执行的流程实例信息,并不会删除历史流程信息

Flowable工作流之核心流程操作的本质相关推荐

  1. Flowable工作流之查询历史流程信息

    目录 1. 前言 2. 流程历史数据查询 2.1. 查询历史流程实例信息 2.2. 查询历史活动信息 2.3. 查询历史任务信息 2.4. 查询历史流程变量 1. 前言 上篇文章 和大家分享的流程操作 ...

  2. flowable工作流简单请假流程,自定义完成的流程图表颜色字体以及连接线的颜色字体。

    效果图 代码 1.bpmn文件ExpenseProcess.bpmn20.xml(通过可视化工具生成[非常熟悉也可以手动编写]) <?xml version="1.0" en ...

  3. flowable工作流 流程变量_信也科技工作流平台的技术实践

    1 背景 随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下: 目前OA流程引擎无法满足企业特定业务流程需求,且移动端体验差,定制化困难,使用门槛高,影响简单流程 ...

  4. 驰骋工作流引擎的流程属性-节点属性-前台操作

    1:    工作流引擎功能-流程属性 •    支持客户参与流程:比如在一个erp系统里供应商相对企业来说是外部用户,在一个学校系统里,教师是内部用户,学生是外部用户.ccflow支持外部用户登录参与 ...

  5. 初识flowable工作流-实现简单请假流程SpringBoot+VUE

    一.前言 大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程. 二.代 ...

  6. flowable工作流子流程调用

    flowable工作流子流程介绍 工作流提供了子流程的调用,一种是内部子流程,可以让用户主要看主流程,保持业务清晰,另一种是引用外部子流程(call activity),复用外部流程功能. 工作中有用 ...

  7. flowable工作流架构分析

    flowable工作流 目录 概述 需求: 设计思路 实现思路分析 1.复杂的状态的或者状态的维度增加的状的条件极为复杂 2.工作流 3.BPMN2.0协议 4.协议的元素 5.互斥网关 包容性网关( ...

  8. Flowable工作流入门

    Flowable工作流入门 本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 下载地址:Flowable ...

  9. flowable 查询完成的流程_flowable中终止流程(一)

    使用flowable工作流框架时,为了将业务系统和工作流服务进行解耦,将工作流服务独立为一个核心模块,不涉及业务逻辑的处理.凡是需要业务数据的地方都通过配置化的形式请求业务系统,具体配置可参考 通过s ...

最新文章

  1. 一种清除windows通知区域“僵尸”图标的方案——Windows7系统解决方案
  2. 有必要将所有机器学习算法都实现一遍吗?
  3. MLlib 编程指导-spark-1.2.0
  4. 大话数据结构:线性表(2)
  5. python登录接口代码_(转载)Python 的 OAuth 登录接口 python-oauth2
  6. 【Linux】一步一步学Linux——mktemp命令(263)
  7. python 螺旋数组_LeetCode54,螺旋矩阵,一题学会一个重要技巧
  8. 开发环境入门 linux基础 (部分)while for 函数 计划任务
  9. Linux系统是什么
  10. python3 爬虫
  11. 使用Blender编辑Character Creater 4的人物形象
  12. 计算机浏览记录删除,如何完全删除本地计算机上的浏览历史记录?如何从计算机中完全删除Internet访问...
  13. android投屏功能开发,Android PC投屏功能实现的示例代码
  14. 怎么将两个css合并单元格,css table之合并单元格
  15. python代码 将文件夹下的.png图片转换为.mat图片 批量转换为mat
  16. English-Phonics
  17. ipa图片解密 php,ipa文件详解 - 如何提取App图片
  18. 前端如何判断用户是否打开了控制台
  19. SteamVR 2.x 手柄拾取3D物体(13)
  20. 计算机设备调试及维护,计算机安装、调试及维护工职业标准-简.doc

热门文章

  1. 冰羚 example-icedelivery-README.md翻译
  2. UnityEditor之VisualElement的样式uss的背景颜色和字体设置
  3. YUV420P视频裁剪
  4. 辉芒微IO单片机FT60F112
  5. 游戏服务器租用配置选择攻略(大型端游及中小型网页游戏选型)
  6. golang 根据生日计算星座和属相
  7. 《用微信测试公众号慰问你的好兄弟/姐妹》:用java简单实现微信公众号消息推送(入门且详细且有效)
  8. 关于遥感图像解译的思考
  9. 内存分配者-动态内存
  10. 七个好用且免费的在线代码编辑器,你喜欢哪个?