换掉bpmnjs,让前端更熟悉工作流业务前言看到这个标题可能有些同学会奇怪,bpmn.js不是工作流系统前端最普遍的

工作流的概念在百度百科和wiki上描述的都比较抽象,我们可以大致理解为做一些事情的时候,我们把做事情抽象为几个步骤,然后再合理的组织这些步骤,最终通过组织好的步骤来做这些事情。例如我们早上起来做的事情看做一项工作流,可以拆分为上厕所、洗手、刷牙、吃饭这些步骤。有的人“上厕所->洗手->吃饭->刷牙”;有的人“刷牙->上厕所->吃饭->洗手”。这里可以看到“组织步骤”的不同,最后表现的效果也不同。我们把事情的拆分、组织、执行、最后到管理都搬到计算机上面来,就可以叫做工作流。

工作流管理系统

这个就是我们平时开发的系统,这些系统大多是以流程为中心,用图形化的方式来表示工作流。既然是图形化,那就需要画图,现在大多数系统都把画图搬到网页上来,所以才需要我们前端参与进来。

工作流引擎

BPMN规范

bpmn-js

这个很好理解,就是一个开源的实现BPMN2.0规范的web建模器。需要注意一下,bpmn-js虽然名字中有bpmn,但是并不是提出BPMN规范的官方组织开发的。所以不代表工作流引擎支持BPMN规范,前端就一定要用bpmn-js。我们也可以基于BPMN规范重新开发一套符合自己业务的流程设计器。

从上面的介绍中,我们可以发现bpmn-js天然满足BPMN规范,而绝大多数工作流引擎也是支持BPMN规范,我们前端只需要把bpmn-js引入到项目中来,直接开箱即用。为什么还要想换掉bpmn-js呢?主要是因为bpmn-js给我们带来了下面几个痛点。

假设后端需要在某个节点产生的数据上加一个字段:有的人选择在数据导出的时候直接正则暴力替换,有的人选择到bpmn-js源码中去写死,有的人强制获取所有的节点,然后给对应的节点updateProperties。随着这样的随意写代码的地方越来越多,项目的前端开发人员的更换,最终会让项目难以维护。

目前网上有各种各样对bpmn-js进行自定义的教程,也有着各种”黑科技“。归根结底是因为bpmn-js对自定义并不是完全开放,虽然有很多预设场景的示例,但是并不能满足实际项目中所有的场景。

对前端来说,花费大量的精力去学习bpmn-js源码意义不大,我们作为一个铁打的bpmn-js前端对自己的择业和成长不利。单就bpmn-js来说,它的形态、规范都是固定的,并不能发挥我们前端在UI层面的专业性。如果任何需求,产品问能不能实现,我们都说”不能,bpmn-js没这个功能”,会让我们自身的专业性被挑战,不利于我们在这个领域深入发展。

虽然在BPMN2.0中,将流程执行语义分为Events(事件)、Gateways(网关)、Activities(活动)这三类要素,但是在实际项目中,我们并不需要按照BPMN规范来定义流程图的中内容,而是需要按照我们项目业务来定义流程图的内容。这里还是以我之前做的教育类审批为例:在流程图上有一个节点是审批,在bpmn规范中它实际是一个属于UserTask的Activities。我们之间定义一个ApprovalNode节点就行,然后再导出数据的时候,把数据转换为后端引擎需要的UserTask即可。这样的好处是不论产品说的“审批”还是后端说的“UserTask”在我们的代码中都有体现,我们将不再游离在业务之外了。

LogicFlow完全自定义节点主要代码如下:

import{h,RectNode,RectNodeModel}from'@logicflow/core';classApprovalModelextendsRectNodeModel{initNodeData(data){super.initNodeData(data);this.text={value:data.text||"",x:data.x,y:data.y+40,};this.width=100;this.height=80;}}classApprovalViewextendsRectNode{/***完全自定义节点外观方法*/getShape(){const{model,graphModel}=this.props;const{x,y,width,height,radius}=model;conststyle=model.getNodeStyle();returnh("g",{},[h("rect",{...style,x:x-width/2,y:y-height/2,rx:radius,ry:radius,width,height})]);}}exportdefault{type:'approval',view:ApprovalView,model:ApprovalModel,LogicFlow通过定义节点的model和view来实现节点的自定义机制。我们可以继承内置的或者其它已经定义好的节点,在它们的基础上进行扩展。这里不对LogicFlow的用法做过多的介绍,LogicFlow支持各种节点、连线、插件的自定义,基本上完全能满足我们产品的各种奇葩需求。

对于LogicFlow的自定义机制大家可以看这些资料:

bpmn-js完全自定义节点主要代码如下:

对于bpmn-js元素的定义,大家可以看这些资料:

在前面我们提到过,如果后续需要我们给某类节点加个属性,我们来看看LogicFlow是怎么做的。首先是LogicFlow在数据上预留了一个properties属性,支持我们在里面设置任何自定义属性。LogicFlow在数据层面将业务数据和图数据是分开的,这比较直观。

这里假设我们有一个属性叫做rollback,用来标识节点是否支持回滚。支持回滚节点颜色就是绿色,不支持就是蓝色。对于后端服务来说,他不需要关系颜色,只需要给他的节点信息中有rollback字段即可。

{id:"userTask",type:"rect",x:100,y:100,text:{x:100,y:100,value:'节点文本'},properties:{//这里可以放任何业务属性rollback:true}}在自定义节点的时候可以这样写:

classApprovalModelextendsRectNodeModel{getNodeStyle(){conststyle=super.getNodeStyle()const{properties}=thisif(properties.rollback){style.fill='green'}else{style.fill='blue'}returnstyle}}转换为流程引擎可识别的xml从上面的代码可以看到,我们代码中更多的是对业务和UI的定义,并没有过多的去涉及BPMN规范。那么我们如何把这类业务的代码产生的数据转换为流程引擎可识别的内容呢?

最方便的方法当前是让后端自己去转换,比如后端用Java就让他写一个filter。当然,很多时候后端不愿意做,我们也可以前端来转。写转换的过程也是前端对BPMN规范了解的过程。

在工作流项目中,一开始为了快速出成果,直接用bpmn-js也没有问题。而且很多项目可能只是给研发使用B端管理类项目,对UI也没有啥要求,甚至出现后端同学自己一套搞完,都不需要前端介入。

但是随着项目的发展,特别是项目中开始出现产品角色,打算拿出去做商业化应用的时候。这个时候如果还是保留bpmn-js作为流程设计器,会给前端研发带来巨大的压力。在必要的时候,建议前端同学激进一点,选择更易维护的流程设计器来开发。

LogicFlow确实是一个比较好的选择,文档全、源码也易理解,使用后会将你从bpmn-js的痛苦中解脱出来。当你的代码变得更易维护,也更贴近业务后,也方便其他同学快速接手项目,避免陷入谁做谁跑路的窘境。

THE END
1.社会工作专业的全球性定义社会工作专业的全球性定义由2014年7月召开的国际社会工作教育联盟(IASSW)大会和国际社会工作者联合会(IFSW)大会通过发布。 社会工作是促进社会变革和发展,提高社会凝聚力,赋权和推动人类进步的一门实践性职业和学科。维护社会公正、保障人权和集体责任,尊重多元化是社会工作的核心原则。基于社会工作、社会科学、人文科学的https://www.jianshu.com/p/62e2aca539e3
2.科技英语翻译的客观性与目的性分析论文英语科技术语的特点是词义繁多,专业性强,翻译时必须根据专业内容谨慎处理,稍不注意就会造成很大的错误。 综合以上三个方面,在科技英语翻译过程中,翻译人员需对时态语态,词汇语篇等方面重视,尊重原文的客观性,忠实原文,必须保持原文与译文的等值关系,科技文书,术语等书面文字作为科技事物中的重要文字依据在翻译过程中必须https://www.yjbys.com/bylw/waiyu/96565.html
3.考研学术型和专业型有什么区别考研学术型和专业型的区别主要体现在:1.培养目标不同;2.培养方式不同;3.招生条件不同;4.招生考试不同;5.导师制度不同;6.收费标准不同。但学术型硕士和专业型硕士都是硕士的一种。 1.培养目标不同学术型硕士和专业型硕士都是硕士的一种,但是在毕业择业和在学习期间的主要学习倾向不同,学术型学位按学科设立https://xue.baidu.com/okam/pages/strategy-tp/index?strategyId=122033173433080&source=natural
4.《中国注册会计师鉴证业务基本准则》指南全文法规库(3)鉴证业务的基础是独立性和专业性,通常由具备专业胜任能力和独立性的注册会计师来执行,注册会计师应当独立于责任方和预期使用者; (4)鉴证业务的“产品”是鉴证结论,注册会计师应当对鉴证对象信息提出结论,该结论应当以书面报告的形式予以传达。 二、鉴证对象信息的定义 本准则第五条第二款对鉴证对象信息的含义进https://law.esnai.com/view/33910/
5.干货打卡——新闻专业主义党性原则观念是马克思主义新闻观的第一观念,要求所有新闻媒体必须在思想上、政治上、行动上,与党保持高度一致;人民性原则要求新闻舆论工作的顺利进行必须依赖人民群众,以公共利益为最高宗旨。 【参考文献】 [1]吴飞,唐娟.新媒体时代的新闻专业主义:挑战、坚守与重构[J].新闻界,2018(08):18-29. https://m.douban.com/note/807871048/
6.电气工程学科方向范文实验室开放不够,研究生很少有机会进入专业性更强、设备更先进的科研实验室进行综合性与研究性的实验。有些研究生导师会利用自己的课题经费购置或研制一些先进的实验设备,但出于对设备的保护,利用率低,很少为研究生实验教学所公用。 二、研究生实验教学改革中采取的措施https://www.gwyoo.com/haowen/179625.html
7.2018级老年服务与管理专业人才培养方案培养思想政治坚定、德技并修、全面发展,适应人口老龄化的社会需要,掌握养老及涉老岗位必备的基础理论和专业知识,具备较强的现代养老机构管理能力、良好的人际沟通能力和对老年人实施整体照护的能力,具有良好职业道德,面向老年照护、养老护理管理、老年健康管理、老年社会工作、老年康复辅助器具应用、民政事务管理等领域的https://jwc.wfhlxy.com/info/1023/1358.htm
8.护理专业开题报告(15篇)1980年美国护理学会将护理定义为:“护理是诊断和处理人类对现存的或潜在的健康问题的反应。护理的基本属性是医疗活动,但它具有专业性、服务性的特点,并以其专业化知识和技术为人们提供健康服务,满足人们的健康需要。 四、文献回顾 急性白血病为血液系统恶性病,发生于所有年龄组,像其他肿瘤一样,年龄大于50岁发病率明显https://www.ruiwen.com/kaitibaogao/6228812.html
9.大宗商品贸易融资业务模式及风险分析贸易金融圈三是专业性强。行业特点明显,差别较大,需要专业的行业知识。 四是流动性强。大宗商品标准化程度高,市场流动性十分显著。 五是定价机制特殊。浮动报价与固定报价并存,但以浮动报价居多。 (二)大宗商品贸易融资定义与特征 1. 大宗商品贸易融资定义 广义上:只要金融机构或是供应链金融企业提供融资服务的对象是从事大宗https://www.shangyexinzhi.com/article/283108.html
10.律师办理建设工程法律业务操作指引分包工程的发包人:可以将其所承包工程中的非主体、非关键性工程、专业施工工程及劳务作业进行分包的承包人。 分包工程的承包人:接受分包工程或劳务作业的具有相应资质的当事人。 建设工程分包合同:分包工程的承包人进行分包工程建设,分包工程的发包人支付工程价款的合同。 https://china.findlaw.cn/xfwq/xiaofeiweiquanlunwen/52913_14.html
11.金融MBA2022级从消费行业投资浅析CVC与IVC对企业发展的影响此外产业资本独立募资还有以下三点优势[6]:(1)基石投资人的机制:企业作为基石投资者往往起到兜底的作用,对其他外部LP有较大的吸引力。(2)专业性:由于企业的CVC产业资本在自身的领域专注了多年,对产业的理解更深,专业性有背书。(3)产业价值:LP通过参与产业投资,能够享受到一个快速发展的产业增长所带来的效益。 https://fmba.pbcsf.tsinghua.edu.cn/info/1027/3647.htm
12.游戏开发和游戏设计职业发展研究报告.docx游戏开发职业路径涉及多个专业领域,如编程、美术设计、音频设计等,本报告将对游戏开发职业路径进行详细的探讨和分析。 一、游戏开发行业概述 游戏开发是指通过创意、技术和设计来开发各种类型的游戏,包括电子游戏、手机游戏、电脑游戏等。游戏开发行业的核心目标是打造吸引人并具有娱乐性的游戏产品,涵盖了从游戏概念到发布https://www.renrendoc.com/paper/302077703.html
13.专业实践工作总结15篇专业实践工作总结15篇 总结是指社会团体、企业单位和个人在自身的某一时期、某一项目或某些工作告一段落或者全部完成后进行回顾检查、分析评价,从而肯定成绩,得到经验,找出差距,得出教训和一些规律性认识的一种书面材料,它有助于我们寻找工作和事物发展的规律,从而掌握并运用这些规律,不如我们来制定一份总结吧。你所见https://www.gdyjs.com/shiyongwen/gongzuozongjie/331736.html
14.风险隐患排查工作方案范文(精选9篇)2)专业检查主要是对特种设备、电气设施、机械设备、安全防护设施、危险物品、运输车辆、避雷设施、仪器仪表、自动控制设施等分别进行的专业检查,及在装置开、停机前、新装置竣工及试运行等时期进行的专项安全检查。 3)季节性检查是根据各季节特点开展的专项检查。 https://www.jy135.com/gongzuofangan/956357.html
15.第二课堂的重要性范文第二课堂课程建设是按照课程的理念对第二课堂进行设计,必须在课程建设中注重理论与方法的及时更新,课程建设理论与体制的创新,同时大力加强课程设置的系统性和理论性,树立全面、协调、可持续发展的第二课堂课程建设发展新理念。学院应将第二课堂活动纳入学校教学计划统筹考虑安排中,同基础课、专业课程、人文素质类课程等https://www.haoqikan.com/haowen/42265.html