Flowable工作流之核心流程操作的本质
目录
- 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_deployment
和act_re_procdef
表的关系,其实是一对一的关系,部署表中的一条记录对应流程定义表中的一条记录 - 另外,该表中还有一个
VERSION_
字段,这个看名字就知道是描述记录的版本号,当我们修改了流程的内容之后,重新部署的时候,act_re_deployment
和act_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_task
和act_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工作流之核心流程操作的本质相关推荐
- Flowable工作流之查询历史流程信息
目录 1. 前言 2. 流程历史数据查询 2.1. 查询历史流程实例信息 2.2. 查询历史活动信息 2.3. 查询历史任务信息 2.4. 查询历史流程变量 1. 前言 上篇文章 和大家分享的流程操作 ...
- flowable工作流简单请假流程,自定义完成的流程图表颜色字体以及连接线的颜色字体。
效果图 代码 1.bpmn文件ExpenseProcess.bpmn20.xml(通过可视化工具生成[非常熟悉也可以手动编写]) <?xml version="1.0" en ...
- flowable工作流 流程变量_信也科技工作流平台的技术实践
1 背景 随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下: 目前OA流程引擎无法满足企业特定业务流程需求,且移动端体验差,定制化困难,使用门槛高,影响简单流程 ...
- 驰骋工作流引擎的流程属性-节点属性-前台操作
1: 工作流引擎功能-流程属性 • 支持客户参与流程:比如在一个erp系统里供应商相对企业来说是外部用户,在一个学校系统里,教师是内部用户,学生是外部用户.ccflow支持外部用户登录参与 ...
- 初识flowable工作流-实现简单请假流程SpringBoot+VUE
一.前言 大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程. 二.代 ...
- flowable工作流子流程调用
flowable工作流子流程介绍 工作流提供了子流程的调用,一种是内部子流程,可以让用户主要看主流程,保持业务清晰,另一种是引用外部子流程(call activity),复用外部流程功能. 工作中有用 ...
- flowable工作流架构分析
flowable工作流 目录 概述 需求: 设计思路 实现思路分析 1.复杂的状态的或者状态的维度增加的状的条件极为复杂 2.工作流 3.BPMN2.0协议 4.协议的元素 5.互斥网关 包容性网关( ...
- Flowable工作流入门
Flowable工作流入门 本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 下载地址:Flowable ...
- flowable 查询完成的流程_flowable中终止流程(一)
使用flowable工作流框架时,为了将业务系统和工作流服务进行解耦,将工作流服务独立为一个核心模块,不涉及业务逻辑的处理.凡是需要业务数据的地方都通过配置化的形式请求业务系统,具体配置可参考 通过s ...
最新文章
- 一种清除windows通知区域“僵尸”图标的方案——Windows7系统解决方案
- 有必要将所有机器学习算法都实现一遍吗?
- MLlib 编程指导-spark-1.2.0
- 大话数据结构:线性表(2)
- python登录接口代码_(转载)Python 的 OAuth 登录接口 python-oauth2
- 【Linux】一步一步学Linux——mktemp命令(263)
- python 螺旋数组_LeetCode54,螺旋矩阵,一题学会一个重要技巧
- 开发环境入门 linux基础 (部分)while for 函数 计划任务
- Linux系统是什么
- python3 爬虫
- 使用Blender编辑Character Creater 4的人物形象
- 计算机浏览记录删除,如何完全删除本地计算机上的浏览历史记录?如何从计算机中完全删除Internet访问...
- android投屏功能开发,Android PC投屏功能实现的示例代码
- 怎么将两个css合并单元格,css table之合并单元格
- python代码 将文件夹下的.png图片转换为.mat图片 批量转换为mat
- English-Phonics
- ipa图片解密 php,ipa文件详解 - 如何提取App图片
- 前端如何判断用户是否打开了控制台
- SteamVR 2.x 手柄拾取3D物体(13)
- 计算机设备调试及维护,计算机安装、调试及维护工职业标准-简.doc