「Activiti精品 悟纤出品」流程模型搭建-小试牛刀 - 第324篇
前言
基本环境搭建好了,我们可以简单搭建一个模型来体验下。我们在前面开始的章节说过Activiti是基于BPMN,所以要构建一个流程模型,对于BPMN的一些建模元素还是要所有了解的。所以本节的主要内容就是:
(1)BPMN的简单介绍;
(2)使用Activiti进行构建一个流程模型;
一、BPMN
1.1 BPMN是一种流程建模的通用和标准语言
BPMN是一门符号语言。就像任何语言的目的一样,BPMN是为了方便沟通。旨在促进业务流程的沟通和理解。使用BPMN建模的目的是运用BPMN来绘制流程图,以便更好地让各部门之间理解业务流程和相互关系。BPMN 2.0的最大优势之一是消除了业务人员和IT技术人员之间沟通沟壑。
记住这句话就足够笑傲江湖了:BPMN是一种流程建模的通用和标准语言。
1.2 BPMN = 图形表达 + XML
BPMN2.0通过引入XML,使BPMN不仅仅是一个漂亮的图形表达,更能够描述业务流程间很多含糊不清的问题。通过XML来定义每个BPMN对象,使BPMN规范地保证每个图形,无论是流程模型还是所有在流程模型中的对象,都能清晰地进行表述。不过大家不用担心,BPMN流程设计器能够自动生成XML。
1.3 流程模型与BPM软件
由于采用了通用的语法,许多工作流建模工具和流程引擎支持BPMN。因此,许多不同的软件套件可以共享和处理BPMN的流程文件。BPMN 2.0为建模工具、流程引擎、业务活动监控(BAM)工具和其他业务工具,提供了交流沟通的渠道。通过BPMN 2.0,流程模型可以无缝地传输在不同厂商的 BPM软件中。
1.4 三个基本建模元素
大多数流程并不需要建模者了解整个规范。只要了解以下 三个基本建模元素,就能掌握BPMN2.0的核心。
(1)事件符号;(2)活动符号;(3)网关符号
1.4.1 事件(Event)
让我们来看看在三种主要类型的事件:
(1)开始 - 表示一个流程的开始。
(2)中间 - 发生的开始和结束事件之间,影响处理的流程。
(3)结束 - 表示该过程结束。
这些是很简单的,但要有一点重要的要记住。如果您添加一个信封的图标给上述任何某个事件,那你将触发一个消息事件(Message Event)。即可以是由一个消息的到达而启动一个进程,也可以是在中间的某个位置与中间事件中发送一个消息(或捕获消息),或者可以在一个过程结束时发送的消息。
1.4.2 活动(Activity)
一个活动是工作或任务的一个通用术语。首先,一个活动可以是原子或非原子(组合活动)。换句话说,一个活动可以是一个任务,或者它可以是一个当前流程的子处理流程;其次,你还可以指定不同类型的活动。例如,任务可以是需要人工完成的任务,也可以自动完成的任务,比如由脚本完成的任务,或服务任务(交由web服务器处理的指令)。
1.4.3 网关(Gateway)
网关用来处理决策,有两种常用网关需要了解:
(1)排他型(X) ——这种决策分支通常根据一定的条件,通过顺序流来决定流程走向。通常,只有一条路径会被选择。
(2)并行型 (+) ——这种决策分支指代一个路径或多个路径合并后被分割成两个或多个平行的路径。所有路径会被同时选择。
1.5 描述性建模符号
描述性建模子类则让BPMN更丰满。
(1)泳道(Pool):代表流程中的参与者,用来对活动进行组织和分类)
(2)泳池 (Lane):泳道里的一个子划分
(3)信息流(message flow) - 虚线表示
(4)数据对象和仓库
(5)文本注释
1.6 Activit建模器
从这个建模器也可以看出这个BPMN的一些核心的建模元素。
1.7 BPMN常用建模工具
介绍几个可供选择的建模工具:
(1)bpmn-js
bpmn官放提供的开源建模工具bpmn-js,支持基本的模型设计,但缺少属性配置,不过可能是故意这样设计的,这个工具主要是给activiti开发者进行二次开发。
https://demo.bpmn.io/
(2)YaoqiangBPMN Editor
yaoqiang用java开发的bpmn设计器,由于是java开发,所以支持跨平台。
http://www.yaoqiang.org/
(3)actiBPM
actiBPM,idea插件。
(4)activitidesigner
activiti designer 是一个eclipse插件。它跟随activiti一起发布。
1.8 more…
本文这里只是一个基本的介绍了下BPMN,想要更多的学习,还需要自己进行深入学习,这里提供一些学习资料:
(1)2019最详细Activiti6.0之BPMN2.0规范
http://www.uml.org.cn/modeler/201907312.asp?artid=22245
(2)bpmn2.0文档
https://gitee.com/Flowable_BPMN/docs
2.1 说明
这里我们创建一个请假流程模型:部门的任何一个人发起都需要领导进行审批。
(1)有三个用户:张三、李四、悟纤(领导);
(2)张三和李四都是IT部门的,他们的领导是悟纤;
所以一个流程包括如下几个方面:
(1)用户和用户组;
(2)流程模型以及流程的发起者和处理者;
(3)流程表单;
2.2 创建用户
我们的流程里需要有用户进行参与,所以需要进行创建用户:
点击“Identitymanagement”进行用户和组的管理。
在“Users”进行创建用户:
依次创建张三、李四、悟纤三个用户,那么创建完之后的结果是:
其中admin是系统默认的用户。
2.3 创建用户组
在“Users”旁边就是“Groups”,点击进行创建:
创建完成之后,把张三和李四添加到技术部中:
2.4 创建一个新的流程模型
2.4.1 创建模型
进入activiti-app,进入Kickstar App->Create Process创建新的流程模型,需要输入模型名称和模型主键,这个主键必须唯一,代码中发起流程需要用到:
另外这里也支持直接导入已经创建好的流程模型。
2.4.2 搭建请假流程
使用左边的元素进行创建出来一个如下的模型:
(1)开始 : Start Events –Start event;
(2)提交审批、部门审批:Activities– User task;
(3)结束:End Events – Endevent;
另外在每个元素进行设置Id和name属性,就可以看到上面截图的效果了:
2.4.3 分配模型处理人
单击Assignments时,显示如下图所示:
对于提交审批截图下:
对于部门审批如下:
2.4.4 流程表单设计
请假是需要提交个请假表单的,请假时间和请假事由。
点击“Processes”旁边的Forms进行创建表单。
我们先创建一个请假表单:
创建好一个表单之后,需要进行构建这个表单里的元素,比如:
最后应该是这样子:
另外我们还需要一个领导审批表单:
2.4.5 流程绑定表单
将流程和表单进行绑定,回到Processes中,进行绑定:
点击“Referenced form”:
将提交审批的流程节点绑定员工请假表单;将部门审批绑定到领导审批单。
2.5 流程发布
到上面我们的流程模型已经创建了,我们可以创建一个App跑一下我们的这个流程。
2.5.1 创建模型
在“Processes”的最右边有一个“Apps”,进入,点击“Create App”进行创建App:
2.5.2 将应用和流程绑定
将我们的应用和流程进行绑定。
记得记得保存。绑定之后的效果:
2.5.3 发布流程
绑定之后就可以点击“Publish”:
2.5.3 发布结果
发布完成后回到首页可以看到发布结果:
2.6 流程测试
2.6.1 流程说明
这里我们需要使用张三或者李四进行登录,然后提交审批单,这个审批单就会到上一节悟纤进行审批。
2.6.2 发起请假任务
(1)登录“zhangsan”账号,进入请假App:
(2)在“Processess”, 点击“Startprocess”开始一个流程:
Show diagram查看流程当前流转状态(当前的状态被标绿了):
Cancel process就是取消流程了。
还有一个地方可以进行编辑,就是“提交申请”这里,进入是:
点击 complete, 任务流转到下一个流程节点。这个任务就流转到到了部门经理了。
2.6.3 审批流程
使用“wuqian”账号进行登录,点击“请假”App,然后”Tasks”可以看到提交上来的任务:
点击“Claim”进行审批操作:
至此流程流程。
2.7 流程管理activiti-admin
activity-admin应用提供一些基本的流程运行时管理功能,可以查看当前运行的所有实例和任务,也可以上传流程文件。
2.7.1 登录
访问地址为http://localhost:8080/activiti-admin,默认账号为 admin/admin,登录。
2.7.2 配置应用服务节点
进入“Configuration”,然后点击“EditActiviti REST endpoint”进行配置应用服务节点:
然后点击“CheckActiviti REST endpoint”,查看状态是否是:
Endpoint valid,Engine at endpoint: default – 6.0.0.4。
2.7.3查看历史流程记录
点击“Tasks”可以查看历史流程记录:
2.8 流程模型的XML
最后我们要知道我们的这个流程模型是由一堆的XML构成的,可以下载到本地进行查看(可以导出也可以导入):
- <?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:activiti="http://activiti.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.activiti.org/processdef">
- <process id="Leave" name="请假流程" isExecutable="true">
- <documentation>请假流程定义</documentation>
- <startEvent id="start" name="开始"></startEvent>
- <userTask id="submit" name="提交申请" activiti:candidateGroups="it" activiti:formKey="leaveForm">
- <extensionElements>
- <modeler:group-info-name-it xmlns:modeler="http://activiti.com/modeler"><![CDATA[技术部]]></modeler:group-info-name-it>
- <modeler:activiti-idm-candidate-group xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-group>
- <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
- </extensionElements>
- </userTask>
- <userTask id="deptApprove" name="部门审批" activiti:candidateUsers="wuqian" activiti:formKey="approveForm">
- <extensionElements>
- <modeler:user-info-email-wuqian xmlns:modeler="http://activiti.com/modeler"><![CDATA[wuqian@163.com]]></modeler:user-info-email-wuqian>
- <modeler:user-info-firstname-wuqian xmlns:modeler="http://activiti.com/modeler"><![CDATA[悟]]></modeler:user-info-firstname-wuqian>
- <modeler:user-info-lastname-wuqian xmlns:modeler="http://activiti.com/modeler"><![CDATA[纤]]></modeler:user-info-lastname-wuqian>
- <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
- <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
- </extensionElements>
- </userTask>
- <sequenceFlow id="sid-7B016F7C-1A5F-4233-ACFF-9461C7BD1499" sourceRef="start" targetRef="submit"></sequenceFlow>
- <sequenceFlow id="sid-64AC564C-E7EB-4A56-AE62-AAE075FF2704" sourceRef="submit" targetRef="deptApprove"></sequenceFlow>
- <endEvent id="end" name="结束"></endEvent>
- <sequenceFlow id="sid-E33E0C42-AD11-418C-A7C4-20A1F88C81A8" sourceRef="deptApprove" targetRef="end"></sequenceFlow>
- </process>
- <bpmndi:BPMNDiagram id="BPMNDiagram_Leave">
- <bpmndi:BPMNPlane bpmnElement="Leave" id="BPMNPlane_Leave">
- <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start">
- <omgdc:Bounds height="30.0" width="30.0" x="60.0" y="160.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="submit" id="BPMNShape_submit">
- <omgdc:Bounds height="80.0" width="100.0" x="180.0" y="135.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="deptApprove" id="BPMNShape_deptApprove">
- <omgdc:Bounds height="80.0" width="100.0" x="420.0" y="135.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end">
- <omgdc:Bounds height="28.0" width="28.0" x="675.0" y="161.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNEdge bpmnElement="sid-64AC564C-E7EB-4A56-AE62-AAE075FF2704" id="BPMNEdge_sid-64AC564C-E7EB-4A56-AE62-AAE075FF2704">
- <omgdi:waypoint x="280.0" y="175.0"></omgdi:waypoint>
- <omgdi:waypoint x="420.0" y="175.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- <bpmndi:BPMNEdge bpmnElement="sid-E33E0C42-AD11-418C-A7C4-20A1F88C81A8" id="BPMNEdge_sid-E33E0C42-AD11-418C-A7C4-20A1F88C81A8">
- <omgdi:waypoint x="520.0" y="175.0"></omgdi:waypoint>
- <omgdi:waypoint x="675.0" y="175.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- <bpmndi:BPMNEdge bpmnElement="sid-7B016F7C-1A5F-4233-ACFF-9461C7BD1499" id="BPMNEdge_sid-7B016F7C-1A5F-4233-ACFF-9461C7BD1499">
- <omgdi:waypoint x="90.0" y="175.0"></omgdi:waypoint>
- <omgdi:waypoint x="180.0" y="175.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- </bpmndi:BPMNPlane>
- </bpmndi:BPMNDiagram>
- </definitions>
对于这个XML这里就不展开了,此文章篇幅已经超负载了。
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287