BPMN-js=>安桩2 设想方案

针对一些开发中可能遇到的问题,进行设想和总结

写在最前

一些已经掌握的技术点分享

bpmn-js生成的xml结构

  • 主要分成2大块
image.png
  • bpmndi节点 是图像渲染的部分,和我们的业务逻辑关系不大
  • process包含了几种节点,
    1.开始 startEvent
    2.线 sequenceFlow
    3.任务(方块) task
    4.判断节点,网关(菱形) exclusiveGateway
    5.结束 endEvent
    更多元素内容参考BPMN2规范内容
  • 每个都包含id,name属性,name就是现实在上面的文字
  • 任务,判断 节点包含 incoming,outgoing子节点
  • 线 只有 起点-sourceRef,指向-targetRef 属性
  • 起点只有 outgoing 节点,结束 只有 incoming 节点

incoming,outgoing,sourceRef,targetRef 都是指向一个id

我们只要通过这些数据就能记录某次操作去向何方,并且通过时间可以得知当前运行时的流程 当前执行到哪里已经过去所有的操作过程.

给一个基础的"单步操作记录实体"设计:

    /// <summary>
    /// 每一步操作,包括了开始和结束,进入和离开
    /// </summary>
    public class Operation
    {
        public string Id { get; set; }

        /// <summary>
        /// 从哪来
        /// </summary>
        public string From { get; set; }

        /// <summary>
        /// 现在在哪里
        /// </summary>
        public string Here { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        
        /// <summary>
        /// 做了啥
        /// </summary>
        public string Remark { get; set; }

    }
image.png

大胆猜测 其实Properties Panel 无非是修改了xml的字段属性(由于是nodejs的项目,目前还没办法测试)


下面介绍一下我的解决方案和一些思路

首先,我画了一个简化安桩流程图如下


image.png
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="sid-38422fae-e03e-43a3-bef4-bd33b32041b2" targetNamespace="http://bpmn.io/bpmn" exporter="http://bpmn.io" exporterVersion="0.10.1">
  <collaboration id="Collaboration_13mq84e">
    <participant id="Participant_0g75ubx" processRef="Process_1" />
  </collaboration>
  <process id="Process_1" isExecutable="false">
    
    <!--泳道-->
    <laneSet>
      <lane id="Lane_05t1wqa" name="经销商">
        <flowNodeRef>Task_1</flowNodeRef>
        <flowNodeRef>Task_1y56h2p</flowNodeRef>
        <flowNodeRef>StartEvent_1</flowNodeRef>
      </lane>
      <lane id="Lane_1vbqiw2" name="服务商">
        <flowNodeRef>Task_1ubxr83</flowNodeRef>
        <flowNodeRef>ExclusiveGateway_01todg7</flowNodeRef>
        <flowNodeRef>Task_0cxcj51</flowNodeRef>
        <flowNodeRef>IntermediateThrowEvent_0pknvty</flowNodeRef>
      </lane>
    </laneSet>
    <!--/泳道-->
    
    
    <!--开始-->
    <startEvent id="StartEvent_1" name="开始">
      <outgoing>SequenceFlow_1</outgoing>
    </startEvent>
    <!--/开始-->

    <sequenceFlow id="SequenceFlow_1" name="" sourceRef="StartEvent_1" targetRef="Task_1" />
    
    <task id="Task_1" name="收集信息并创建工单">
      <incoming>SequenceFlow_1</incoming>
      <outgoing>SequenceFlow_13cmz0x</outgoing>
    </task>

    <sequenceFlow id="SequenceFlow_13cmz0x" sourceRef="Task_1" targetRef="Task_1y56h2p" />
    
    <task id="Task_1y56h2p" name="选择服务商">
      <incoming>SequenceFlow_13cmz0x</incoming>
      <incoming>SequenceFlow_0pfete3</incoming>
      <outgoing>SequenceFlow_00i63bm</outgoing>
    </task>
    
    <task id="Task_1ubxr83" name="签收">
      <incoming>SequenceFlow_00i63bm</incoming>
      <outgoing>SequenceFlow_1v2dj37</outgoing>
    </task>

    <sequenceFlow id="SequenceFlow_1v2dj37" sourceRef="Task_1ubxr83" targetRef="ExclusiveGateway_01todg7" />

    <exclusiveGateway id="ExclusiveGateway_01todg7" name="是否合格">
      <incoming>SequenceFlow_1v2dj37</incoming>
      <outgoing>SequenceFlow_0j75wny</outgoing>
      <outgoing>SequenceFlow_0pfete3</outgoing>
    </exclusiveGateway>
    
    <sequenceFlow id="SequenceFlow_0j75wny" name="是" sourceRef="ExclusiveGateway_01todg7" targetRef="Task_0cxcj51" />

    <task id="Task_0cxcj51" name="安装">
      <incoming>SequenceFlow_0j75wny</incoming>
      <outgoing>SequenceFlow_14n5686</outgoing>
    </task>

    <sequenceFlow id="SequenceFlow_14n5686" sourceRef="Task_0cxcj51" targetRef="IntermediateThrowEvent_0pknvty" />

    <sequenceFlow id="SequenceFlow_00i63bm" sourceRef="Task_1y56h2p" targetRef="Task_1ubxr83" />
    
    <sequenceFlow id="SequenceFlow_0pfete3" name="否" sourceRef="ExclusiveGateway_01todg7" targetRef="Task_1y56h2p" />
    
    <!--结束-->
    <endEvent id="IntermediateThrowEvent_0pknvty" name="结束">
      <incoming>SequenceFlow_14n5686</incoming>
    </endEvent>
    <!--结束-->
    
  </process>
  
  
  <bpmndi:BPMNDiagram id="BpmnDiagram_1">
    <!--图像渲染部分省略-->
  </bpmndi:BPMNDiagram>
  
  
</definitions>

现有问题汇总:

1.如何应用表达式

2.如何绑定视图

3.如何通过视图泳道来判断权限等问题

4.如何生成流程

5.流程如何运行

我的方案

后端设计好表达式和视图,并指定特定的Id/Name标识,通过 Properties Panel 加到流程图上(xml) 以下拉框等方式让用户选择,并指定给 方块/菱形 ,这样 视图引擎运行到某个task或者 gateway的时候,可以通过 其上绑定的属性 找到指定的 方法/视图.

后端我建议我们自己开发一套流程解析引擎

大致包括数据内容:
1.流程图
2.运行时任务
3.任务操作
4.表达式
5.视图
6.相关数据
...

针对流程图的修改,我建议每次修改都必须重新生成新的流程图,之前的 运行时任务 不能迁移到新流程上.
要废弃老流程图,必须在其上的运行时任务都结束/终止

关于泳道

流程图中保存了泳道,我们可以把对应的用户存入其中,而泳道的子节点涵盖了所有在其中的模块Id如图:

image.png

关于引擎如何运作

我们需要有
一个展示方法:传入[流程图],[运行时任务],[当前用户],方法通过查询所有[任务操作]返回视图/表达式表单 等待用户操作
一个操作方法:传入[操作结果],[流程图],[运行时任务],[当前用户],方法会添加一个[任务操作],这样就任务就到"下一步"了
总结,我们需要有一个通用的方法来解析传入的task/gateway,他们可能包含不同的表单,判断,而通用方法需要给出指定的操作

关于数据隔离

参考之前我做的一个流程项目,他们的做法是 每个新的 流程图 都会有自己独立的表 由系统自动创建,但他们的设计和我们的不太一样,他们的引擎生成的每个表的字段非常多,几乎涵盖了所有相关数据,我认为这个是没有必要的.

方案风险

1.Properties Panel 的二次开发
由于这个东西是nodejs的 集成到我们.net项目中没有相关经验,二次开发修改成我们想要的样子,比如视图选择框等功能难度较大.

2.子流程开发问题
如何双击进入某个流程的子流程,这个也是需要对bpmn进行深入研究的

3.流程解析引擎
如果需要实现所有bpmn2.0的规范与要求,我们自主开发的流程引擎短时间内肯定做不到,但要实现安装2的需求,并部分实现bpmn2.0是可能的

4.表单设计器
针对每一步需要填写的表单资料,如何设计,是固定还是需要有编辑器,如果要编辑器,则需要开发时间,但一劳永逸

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 本文会包含几块内容 · 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图)有什么不同?· 为什么需...
    戰敭阅读 13,412评论 15 221
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,139评论 25 707
  • UML建模(二)--流程图 本文会包含几块内容: 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图...
    liumw1203阅读 38,185评论 2 50
  • 世事几存真,脉脉含情浅画唇。既见君子气如玉,怯临,寂寞心扰寂寞身。 流光几番新,旧梦开解展颦颦。探向游鱼借尺素,经...
    木羽心阅读 343评论 3 1
  • 他是一个光头
    秃头老大阅读 98评论 0 0