动态业务工作流引擎Superflow研究之四---流程直通车技术

SuperFlow8.0可视化流程设计

  工作流的可视化设计是实现可配置的业务流程重组的一个重要手段,也是Superflow8.0的一个重要特色。

 Superflow8.0有着优秀的数学模型和周密的计算方法,如果不能把这些特色体现在一个让用户游刃有余的定制界面中,那简直是一个遗憾。

 作为Superflow8.0需求表达机(业务需求、操作需求、界面需求)的一个重要组成部分,可视化流程设计平台必须具有如下特色:

 (1)       把业务流程看作一个可视化的有向图,我们成为视图。

 (2)       基于视图的全拖放式流程绘制。

 (3)       完全基于视图的非线性的自适应流转。

 (4)       基于流转条件和运行条件的工作流逻辑。

  

一、设计理念

 8.0以前的版本中,沿用了一种“非线性流程线性化”的机制。也就是说,采用有向图的理论建立工作流模型,然后采用某些流转方法和动作规定把有向图转化为一个简单的有向图,这个简单的有向图在C方法的作用下,可以等价为一棵树。这棵树上的每一个分支对应一个流程子队列。于是,一个线性的流程表达完成了。

 基于流程队列的模型,虽然在理论上可以满足任意复杂的业务流程,但是实现起来非常麻烦,而且效率很低。这种模型有很多弊端:

 1)非线性的有向图转化为一个线性的队列,存在许多算法上的难题,必须施加太多的用户规定才能满足要求。

 2)描述一个有向图的线性队列过于复杂,控制繁琐,不易于扩充。

 3)仅仅凭借C方法、D方法和U方法理论上可以实现有向图的线性化,但是实现起来非常复杂。事实上很难实现,因此必须手工的编制业务流程。

 为什么不直接采用有向图模型来驱动业务的运作呢?

 1)把表达任意复杂业务流程的有向图看作一个视图---可视化的业务流程图,不仅仅流程可视,流程的路由过程也应该是可视的。今后逐步采用视图的概念取代业务流程图的概念。

 2)由用户在wizard的指导下以视图的方式绘制任意复杂的业务流程图。

 3)采用一个动态链表结构维护这个视图,由这个链表来驱动该业务流程的所有实例的流转。

 4)用户可以设置流转条件和运行条件。

 5)这是一个真正的满足任意复杂业务流程的引擎,并且是所见即所得的。

  

二、节点的分类

 视图---ChartView,是可视化流程设计平台的核心。视图是一个有向图的逻辑模型,用一个庞大的数据结构维持视图的完整性。

 视图将以链表的形式维护有向图的结构,其节点有四种模式:业务组节点、流转条件节点、虚拟节点、子图节点。

 业务组节点是实际的业务流程流经的业务组,在系统中体现为用户的角色,也是实际业务流程的组成要素。一个业务组可以对应个节点,而不论其行为(动作队列)是否一样。

 流转条件节点用来存放其父亲节点的流转条件,一个业务组节点可以有多个流转条件节点。一个业务组节点如果没有流转条件节点则是无条件流转。节点的条件有如下几种情况:无条件(唯一性、并发性)和有条件(唯一性,并发性和不确定性),如果一个流转条件节点没有条件,等价于无条件流转。

 流转条件节点有三种情况: c条件,d条件,u条件。多种条件同时存在,则有多个流转条件节点。关于这些条件的形态和机理,后面要做专门的讨论。

 虚拟节点则是为了有向图展示形式上的美观而设置。有时候,两个节点之间的直接链路可能会横跨其他节点之间的链路,造成显示上的不美观,带来可读性的问题,因此,需要虚拟节点对链路作延展,保持有向图的整洁和美观。虚拟节点与流程逻辑无关,只是一个数据流的转发中继。在业务实际流转的时候,我们认为虚拟节点是不存在的。

 子图节点用来简化一个独立业务流程图的复杂性,子图节点必须一一对应,由各一个主子图节点,便有一个辅子图节点。主子图节点没有出度,辅子图节点没有入度。主子图节点和辅子图节点互为关联节点,子图可以嵌套。

 注意,子图与子流程不是一个概念。

  

三、视图逻辑结构与保存

 逻辑链表是一个视图,也是有向图的内存映像,逻辑链表的任何改变都会直接通过onpaint方法反映在界面上。

 1)四种节点用同一个节点结构

 业务组节点,流转条件节点,虚拟节点和子流程节点的属性都不一样,如果定义各自的数据结构,那么在链表的操作中会比较麻烦,所以统一为一种数据结构。虽然浪费了一些空间,但是简化了操作。

 四种节点在有向图链表中统一看待,根据其节点类型来区分不同的属性和施加不同的操作。

 2)链表结构

     采用行结构链表。

     每一行的头部节点记载了该节点的全部属性,其后跟随的是该节点的儿子节点,这些儿子节点的结构非常简单,只是记载节点内部编号而已。

     所有的头部节点构成的第一列是也是一个队列。这个队列纯粹是为了勾连整个链表,与实际的有向图逻辑无关。

     要获取某个节点的详细信息,必须到链表的头部列中去搜索。

     3)链表结构的保存

     有向图的保存是个大问题,由于设计到地址和空间的问题,显然无法直接保存整个结构。因此,必须把节点中的数据抽取出来后再保存。

     经过仔细斟酌,采用3个表来保存一个有向图,这3个表都有一个共同的key:流程编号。

 l         1,流程试图概要表---TSuperflow_outline

 存放流程视图的全局概要特性,包括用户定义的流程编号,流程名称,流程特性(主表,从表,业务编号后缀等等),这个表不存放链表数据。

 字段如下:

 流程编号: S-001掩码

 流程名称:

 业务编号后缀:

 业务主表:(一个主表,不带帐套前缀)

 业务从表:(多个从表名用空格隔开,不带帐套前缀)

 业务分配方式:

 生效标志:流程构建完毕后,由流程设计者设置生效标志。尚未生效的业务流程不参与任何流程运作,完全是一个孤岛,在生效之前,自动进行语法检查,有语法问题的流程视图不能生效。

 l         2,节点表---tSuperflow_content

 存放流程视图的节点数据体,也就是链表头部列的数据体。

 这其中有枚举类型和集合类型的转换。

 l         3,节点关系表---tSuperflow_relation

 存放流程视图的节点关系。

 流程编号;

 节点编号:

 儿子编号。

 四、视图的绘制

 l         有向图的绘制

 定义一个链表来维护有向图,对有向图的任何操作,都直接操作链表,然后采用paintbox动态刷新。

 绘制有向图,可以是全新的绘制,也可以是读取已经存在的链表而绘制。对有向图的任何操作都直接影响到业务流程运作。

 (1)       增加节点,就是插入链表的头部列。重画。

 (2)       删除节点,1--删除这个链表列中对应的某一行;2-在其他行中删除这个儿子。重画。

 (3)       修改节点,修改属性列表,及时更新到链表中。

 (4)       画线,就是在某个父亲的节点行中增加一个儿子,有向的。重画。

 (5)    删除线,就是在某个父亲的节点中删除这个儿子。重画。但是因为无法定位这个线段,所以采用重复画一次的方式来删除。也就是说如果这个线段存在,我在重复画一次,则是删除它。

 

五、流转条件

 (1)C方法流转

 条件唯一性跳转方法:满足C条件的值,流程跳转到指定的唯一的节点。

 (2)D方法

 无条件并发分流方法,该节点方法等价于无条件流转。当遇到D条件时,流程新产生一个分支流转。

 3U方法

 条件不确定性方法:U的值可以有一个或者多个,满足U条件时(U的值包含了某个u条件的值!),流程分流到对应的一个或者多个节点

 4)参数方法

 P方法:取消当前节点的动作,暂时不受理。

 FA方法:强迫结束整个业务,和正常结束一样

 FC方法:强迫结束当前节点的业务流,和正常结束一样,其它业务流正常流转。

 SC方法:睡眠当前节点的业务流;

 SA方法:睡眠整个业务。

 

六、运行条件

 每一个节点都有一个运行条件:满足该条件时可以执行节点动作队列。条件具有如下形式:

 条件1;条件2;条件n

 满足上述任何一个条件,节点允许独立执行。

 其中:条件n具有如下的与或表达式:

 i|j*k*(m|p)……

 优先级括号,与,或,就是谓词逻辑表达式。

 

七、视图的语法检查

 切记:下面这些规则,可以更加苛刻,但是不能放松。因为服务器上把这些作为默认的前提条件了!!!否则,麻烦大了。

 n         Superflow的业务流程图不含有环

 有向图中如果一条边的起点和终点为同一个节点,那么这条边称为环(自回路)。

 n         Superflow的业务流程图不含平行边

 有向图中如果一个节点有两个平行的有向线段指向同一个节点。那么该有向图含有行边。

 n             Superflow的业务流程图只有一个业务起点,它可以没有入度,也可以有入度(如采购审核流程),如果一个业务组节点没有入度,那一定是业务起点。

 n         子图节点必须一一对应。主子图节点没有出度,辅子图节点没有入度,而且出度必须唯一。

 n             Superflow的业务流程图是连通图

 n         流转条件节点一定有父亲,而且其父亲必须是业务组节点;

 n         流转条件节点一定有儿子,而且其儿子必须是业务组节点和子图节点。也就是说不允许有多层条件,若一定要多层条件,那么可以归并为一层。

 n         如果是C条件,其儿子节点必须唯一,C值不能为0U条件的值不能为空。它们是程序中的复位值。

 n         虚拟节点必须有父亲和儿子,而且只能有一个儿子

 n     虚拟节点的逻辑儿子必须不能是虚拟节点,也就是说,最终必须唯一的非虚拟节点后代。

 n      子图节点不可能存在自环路,因为其要么只有唯一的儿子(出度),要么只有一个或者多个父亲。虚拟节点也不可能存在自环路,因为已经考虑了虚拟环

 n         业务节点不能有自环路(考虑了虚拟节点和子图节点)。

 n         如果存在环路,那么这个环路一定是由业务组节点、虚拟节点和流转条件节点构成,子图节点一定不在环路中(已经考虑)。不允许存在没有流转条件节点的环路,否则,业务死循环。

 绘制过程中已经考虑的情况:

 l         两个节点之前不可能有两条相同的直接有向线段,不可能有两个相同的儿子。

 上述问题已经全部解决。




你可能感兴趣的:(数据结构,c,工作,工作流引擎,平台,wizard)