前言: 在Slickflow产品开发过程中,前端流程设计器经历了几个不同的版本(jsPlumb, mxGraph等),目的是为了在设计流程时的用户体验更加良好,得到客户的好评和认可。BpmnJS流程设计器的集成,更加让客户体验到了优秀的前端流程设计器带来的改变。通过这篇文章的介绍,让我们来认识一下Slickflow产品对BpmnJS设计器的集成和使用。

BPMN(Business Process Modeling Notation)是一种流程建模的通用和标准语言,用来绘制业务流程图,其好处是便于业务人员和技术人员共同参与对流程的分析和维护,其容易理解,更大程度地能够消除节点标识的歧义。目前BPMN的版本是2.0版本,关于BPMN标准的详细介绍,可以通过以下文章进行了解:

https://baike.baidu.com/item/BPMN/9818373?fr=aladdin

BpmnJS是一款Web流程设计器,可以绘制出符合BPMN2标准的流程图,这使得业务分析人员和程序开发人员更加方便流程的管理和维护。BpmnJS由 Camunda 团队研发,是一个 BPMN 2.0渲染工具包和web建模器。使得可以在浏览器中创建、嵌入和扩展 BPMN 流程图。它采用JavaScript编写,包含一个基础的查看器,与“增强”后的建模器,可以嵌入到任何web应用程序中,Bpmn.js 内部依赖 diagram.jsbpmn-moddle 。其项目GitHub地址如下:https://github.com/bpmn-io/bpmn-js

如下图,是一张BPMN标准的流程图,在处理复杂流程逻辑时候,需要业务人员和技术人员都容易理解,并且互相交流通畅,作为业界公认的流程语义标准,这是BPMN2的优势所在。

零:开发环境

Slickflow.Designer是集成BpmnJS的设计器项目,区别于传统的Asp.NETCore项目,它搭建于node环境基础之上,从项目文件package.json里面可以看到项目依赖的文件类库,初次配置时,需要在ClientApp目录下执行npm install 命令来安装所需的文件包。此外,编译调试发布时候,使用webpack.config来管理文件部署。作为技术开发人员,需要熟悉nodejs开发环境和项目部署等知识,这是跟Asp.NETCore项目开发方式的很大差别。

一:BpmnJS Modeler介绍
Modeler 用于读写Bpmn的Xml文档维护,等于元数据模型定义器。它将xml文件解析为对象树,该树在建模期间编辑和验证,并在保存建模的时候导出为XML。其中有两个核心库:
moddle:对象树的定义和处理
moddle-xml :基于moddle库读写XML文档。
此外也提供了简单的操作接口,比如:fromXML和toXML

Modeler的初始化配置构造如代码示例:

var bpmnModeler = new BpmnModeler({
container: '#js-canvas',
propertiesPanel: {
parent: '#js-properties-panel'
},
moddleExtensions: {
sf: sfModdleDescriptor,
magic: magicModdleDescriptor
},
additionalModules: [
BpmnPropertiesPanelModule,
SfCommandInterceptor,
SfCommandExtension,
identityPropertiesProviderModule,
actionPropertiesProviderModule,
transitionPropertiesProviderModule,
sectionPropertiesProviderModule,
boundaryPropertiesProviderModule,
gatewayPropertiesProviderModule,
multisignPropertiesProviderModule,
triggerPropertiesProviderModule,
servicetaskPropertiesProviderModule,
scripttaskPropertiesProviderModule,
performersPropertiesProviderModule
]
});

在初始化构建时候,提供了moddler的扩展和附加模块,这是定制化开发部分的个性集成,客户也可以根据自身的业务需要来继续扩充所需要的流程流转控制参数。  

二:BpmnJS Viewer介绍
Viewer方便流程图形的只读展示,而不是像Modeler那样可以编辑。当用户需要查看流程进度的时候,需要根据不同进度状态来渲染各个流程节点和路径,这个时候使用BpmnJS Viewer就能完成。其示例代码如下:
 
const bpmnViewer = new Viewer({
container: $('#js-canvas'),
height: 600,
additionalModules: [
MoveModule,
ModelingModule,
MoveCanvasModule
]
})

其渲染的图形效果如下图所示:

其中绿色节点表示流程当前所运行的节点位置,红色连线表示已经运行过的路径。

三:BpmnJS 属性扩展面板开发
虽然BpmnJS提供了标准BPMN2的XML定义,但是作为流程引擎的高级特性实现,还是需要各个厂商来定制开发的,这样就增加了extensionElements节点的配置,其中的xml片段示例如下:
    <bpmn2:task id="Activity_1kcsr5d" sf:guid="cf13dd79-df24-4503-92fe-88556238bf7e" name="Dept Manager Approval">
<bpmn2:extensionElements>
<sf:performers>
<sf:performer name="部门经理" outerId="2" outerCode="depmanager" outerType="Role" />
</sf:performers>
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_149y4hy</bpmn2:incoming>
<bpmn2:outgoing>Flow_0oks1po</bpmn2:outgoing>
</bpmn2:task>

示例代码中,增加了执行角色的定义,而执行角色一般又和业务系统的组织机构数据关联,所以需要灵活定义,要实现跟业务系统的对接便利性。属性面板的数据配置如下:

 四:Slickflow流程定义描述器

在实现BPMN2标准时候,流程引擎核心需要负责对流程的解析和执行,一套稳定的,规范良好的软件产品,更容易被客户接受和认可,毕竟客户也是需要在此基础上做二次开发。Slickflow产品组在考虑自定义特性实现时候,更加关注产品是否精简易读,所以其定义方式也容易被程序开发人员掌握和接受。考虑到流程设计的复杂性,尤其是不同节点类型的详细属性,几乎没个客户的考量都是不同的,所以采用了整体-分离模式,将各个离散的细节特性,通过不同的组装模式组合到一起。

1) BpmnJS属性面板默认模块

import {
BpmnPropertiesPanelModule,
BpmnPropertiesProviderModule
} from 'bpmn-js-properties-panel';

2) 扩展属性的描述器

Slickflow引擎核心需要对自定义的流程节点特性进行处理,通过描述器可以固定特性名称和限制条件等,加载描述的程序代码如下:

import sfModdleDescriptor from './slickflow/descriptors/sf';
import magicModdleDescriptor from './slickflow/descriptors/magic';
import identityModdleDescriptor from './slickflow/descriptors/identity';
import actionModdleDescriptor from './slickflow/descriptors/action';
import sectionModdleDescriptor from './slickflow/descriptors/section';
import boundaryModdleDescriptor from './slickflow/descriptors/boundary';
import transitionModdleDescriptor from './slickflow/descriptors/transition';
import performersModdleDescriptor from './slickflow/descriptors/performers';
import gatewayModdleDescriptor from './slickflow/descriptors/gateway';
import multisignModdleDescriptor from './slickflow/descriptors/multisign';
import servicetaskModdleDescriptor from './slickflow/descriptors/servicetask';
import scripttaskModdleDescriptor from './slickflow/descriptors/scripttask'; sfModdleDescriptor.types.push(identityModdleDescriptor.identity);
sfModdleDescriptor.types.push(transitionModdleDescriptor.transition);
sfModdleDescriptor.types.push(gatewayModdleDescriptor.gateway);
sfModdleDescriptor.types.push(multisignModdleDescriptor.multisign);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(actionModdleDescriptor.action);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(sectionModdleDescriptor.section);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(boundaryModdleDescriptor.boundary);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(servicetaskModdleDescriptor.service);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(scripttaskModdleDescriptor.script);
sfModdleDescriptor.types = sfModdleDescriptor.types.concat(performersModdleDescriptor.performers);

3)属性维护提供器

对增加的每一个属性映射到相应的界面控件,读写属性的数值,并用于维护。

import actionPropertiesProviderModule from './slickflow/provider/action';
import transitionPropertiesProviderModule from './slickflow/provider/transition';
import sectionPropertiesProviderModule from './slickflow/provider/section/';
import boundaryPropertiesProviderModule from './slickflow/provider/boundary/';
import gatewayPropertiesProviderModule from './slickflow/provider/gateway/';
import multisignPropertiesProviderModule from './slickflow/provider/multisign/';
import triggerPropertiesProviderModule from './slickflow/provider/trigger/';
import servicetaskPropertiesProviderModule from './slickflow/provider/servicetask/';
import scripttaskPropertiesProviderModule from './slickflow/provider/scripttask/';
import performersPropertiesProviderModule from './slickflow/provider/performers/';
import identityPropertiesProviderModule from './slickflow/provider/identity';

4)bpmnModeler的初始化加载

var bpmnModeler = new BpmnModeler({
container: '#js-canvas',
propertiesPanel: {
parent: '#js-properties-panel'
},
moddleExtensions: {
sf: sfModdleDescriptor,
magic: magicModdleDescriptor
},
additionalModules: [
BpmnPropertiesPanelModule,
SfCommandInterceptor,
SfCommandExtension,
identityPropertiesProviderModule,
actionPropertiesProviderModule,
transitionPropertiesProviderModule,
sectionPropertiesProviderModule,
boundaryPropertiesProviderModule,
gatewayPropertiesProviderModule,
multisignPropertiesProviderModule,
triggerPropertiesProviderModule,
servicetaskPropertiesProviderModule,
scripttaskPropertiesProviderModule,
performersPropertiesProviderModule
/* expressionPropertiesProviderModule,*/
/* customContextModule*/
]
});

五:Demo体验

为了方便各类用户的流程设计需求,可以在官网设计器地址进行体验,设计器本身提供XML和SVG文件的下载,便于流程设计人员体验和文件交互。

http://demo.slickflow.com/sfd/

1)基本绘制操作

一个非常典型的企业业务过程之请假流程示例如下:

 2)模板创建

企业中有一些常见的业务流程,也可以通过流程模板来配置创建,Demo中提供了常见的序列,分支和多实例会签等模式模板,方便用户创建流程。

六:总结

集成BpmnJS流程设计器,得到了客户的好评和认可,这是一款业界公认的优秀流程设计器,希望更多的企业客户可以使用。

  

.NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成的更多相关文章

  1. .NET 开源工作流: Slickflow流程引擎高级开发(七)--消息队列(RabbitMQ)的集成使用

    前言:工作流流程过程中,除了正常的人工审批类型的节点外,事件类型的节点处理也尤为重要.比如比较常见的事件类型的节点有:Timer/Message/Signal等.本文重点阐述消息类型的节点处理,以及实 ...

  2. .NET 开源工作流: Slickflow流程引擎高级开发(八) -- 审批网关(ApprovalOrSplit)模式的应用

    前言:业务流程流转过程中,审批类型的节点是比较常见的,在审批操作中,常见的操作就是就是主管人员对待办事项进行同意或者拒绝.所以网关处理节点,就是需要对这两种审批结果进行预备处理,审批网关是在或分支(O ...

  3. .NET 开源工作流: Slickflow流程引擎高级开发(九) -- 条件事件模式解释及应用

    前言:在流程流转过程中,有时候需要条件模式的支持,这样可以使得流程流转更加灵活多变.比如在业务变量满足一定的条件时,可以启动特定配置的流程(或者位于主流程内部的子流程).本文主要描述条件启动和条件中间 ...

  4. Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合

    前言:  流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...

  5. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  6. C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

    既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞 ...

  7. Slickflow.NET 开源工作流引擎高级开发(二) -- 流程快速测试增值服务工具介绍

    前言:流程是由若干个任务节点组成,流转过程就是从一个节点转移到下一个节点,通常需要不断切换用户身份来完成流程的测试,这样使得测试效率比较低下,本文从实战出发,介绍常见的两种快速测试方法,用于提升流程测 ...

  8. Slickflow.NET 开源工作流引擎高级开发(一) -- 流程外部事件的调用和变量存储实现

    前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且 ...

  9. Slickflow.NET 开源工作流引擎高级开发(六) -- WebTest 引擎接口模拟测试工具集

    前言:引擎组件的接口测试不光是程序测试人员使用,而且也是产品负责人员需要用到的功能,因为在每一步流转过程中,就会完整模拟实际用户发生的场景,也就容易排查具体是程序问题还是业务问题,从而快速定位问题,及 ...

随机推荐

  1. 开发工具-Visual Studio / Visual Studio Code 官方下载地址

    更新记录 2022年6月10日 完善标题. Visual Studio官方下载地址 https://visualstudio.microsoft.com/ Visual Studio Code官方下载 ...

  2. TypeScript(5)类、继承、多态

    前言 对于传统的 JavaScript 程序我们会使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来 ...

  3. vue基本原理

    当一个Vue实例创建时,Vue会遍历data中的属性,用Object.defineProperty(vue3.0使用proxy)将它们转为getter/setter,并且在内部追踪相关依赖,在属性被访 ...

  4. RPA供应链管制单修改机器人

    背景:供应链环节中,研发物料时而因为市场缺货等原因无法采购,资材部需登入系统修改物料管制单. 操作流程:登录PDM系统中读取数据.登录ERP系统中更新数据. 人工操作:每日耗时3.5小时,出现一定比例 ...

  5. linux web漏洞扫描arachni

    1. 下载arachni https://www.arachni-scanner.com/download/下载Linux x86 64bit 2. 上次解压直接使用 tar xzf arachni- ...

  6. Bitbucket 使用 SSH 拉取仓库失败的问题

    问题 在 Bitbucket 使用 Linux 机器上 ssh-keygen 工具生成的公钥作为 API KEY,然后在 Jenkins 里面存储对应的 SSH 私钥,最后执行 Job 的时候,Win ...

  7. python是什么?工作前景如何?怎么算有基础?爬数据违法嘛......

    随着python越来越火爆并在2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,且置于Java.C和JavaScript之上,于是越来越多的人开始了解python ...

  8. 【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例

    前言:如题.直接上手撸,附带各种截图,就不做介绍了. 1.influxDB的官网下载地址  https://portal.influxdata.com/downloads/ 打开以后,如下图所示,可以 ...

  9. 漫谈客户端存储技术之Cookie篇

    Cookie 说到Cookie,不管作为前端开发人员还是后端开发人员并不陌生,作为一种最古老.最稳定的客户端存储形式,即便是在当下各种新的客户端存储技术层出不穷的时代,它仍旧有其一席之位.Cookie ...

  10. Tapdata 等40余家行业知名企业,应邀参与共建 NextArch Foundation

      日前,Linux 基金会执行董事 Jim Zemlin 于 Linux 基金会会员峰会(The Linux Foundation Member Summit)上宣布,Linux 基金会正式成立 N ...