下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Foundation,NetBPM, CCFlow.

NetBPM 与 CCFlow 是两款国内知名的开源软件,尤其是ccflow在国内的发展势头强劲。

这个典型的流程假设:公司有两级领导,一级为主管Chief,一级为老板Boss

场景描述:

在某公司中,部门员工休假需要主管Chief的批准。 
  如果休假天数大于10天,则 在部门主管同意后,还必须老板Boss批准。 
  如果是部门主管请假则直接提交老板批准。 
  在休假被批准之前,申请人可以撤销休假申请。 
  申请批准后,对休假天数进行修改(也可以是其他业务数据处理)。 每次休假申请结束之 后,不管通过未通过或是否取消,都必须记录下来。 
  流程结束时,系统要把请假的结果信息Email给申请人。

对于大于10天的申请,如果部门主管已批准同意而上级主管还未批准,这时申请人撤销申请后,系统应发Email通知部门主管申请已撤销。

我们这里只是一个模拟,当然现实生活中情况比这个更加复杂一些;

Windows Workflow Foundation

微软的工作流产品,提供一套工作流引擎和VS解决方案自带的流程设计器,但是该流程设计器面对的是程序员而非业务人员,所以界面比较专业,流程运行只能创建控制台应用程序,没有流程运行界面,没有表单库,如需要表单和界面需要二次开发。

使用WWF创建流程:

1. 启动VS2010,创建一个顺序工作流控制台的程序。
2. 输入项目名称,点击确定,将自动进入流程设计界面。
3. 自动生成的Workflow1.cs是一个工作流组件。
4. 工具箱中拖放一个IfElse活动组件到设计界面上。
5. 此时就需要较多的编码工作和表单界面设计工作,如在idelseBranchActivitiy1左侧分支,用以判断请假人是否新申请请假还是取消请假,激活Conditiong属性,并且添加内部事件EvaluateQingJiaNoValidCode,并激活,在内部输入逻辑代码根据数据库记录判断请假是否通过,未通过则取消请假。也可以走另一分支EvaluateQingJiaCode继续申请新的请假;
6. 拖放parallelActivity1组件在IfElse节点后,用以判断请假人是否为Chief,设置sequenceActivity1中的codeActivity3属性的ExecuteCode处理程序为EvaluateChiefNoValidCode,并激活,内部代码用以判断不是Chief的情况,另一分支sequenceActivity1中则判断是Chief的情况;
7.如果不是Chief请假,则需要在EvaluateChiefNoValidCode中进行逻辑判断和表单的设计,填写请假申请单, 并拖放IfElse组件,实现其中的codeActivity6代码用以判断大于10天的情况。
8.F5即可运行控制台程序,其中的通过未通过或是否取消的数据需要记录,需要通过代码和设计数据库来实现,发送Email也需要代码实现,WWF没有提供该功能。

WWF下设计的流程图如下:

NetBPM

从JBpm1移植到.NET平台下的开源工作流项目,二次开发有一定的难度,因为其使用的Castle框架有很多子项目,技术点较多,需要一一熟悉后才能进行流程的二次开发。

使用NetBPM创建工作流过程:
1.    使用NetBPM的难点之一是要理解生成配置文件,提交请假单配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?xml version="1.0"?>
<!-- NOTE:在定义流程时,建议先画出流程图,然后再来定义,这样思维清晰,也不易于出错
    关于processdefiniton.xml如何定义,请严格按照nPdl规定 -->
<process-definition>
 
  <!-- =================================== -->
  <!-- == PROCESS DEFINITION PROPERTIES == -->
  <!-- =================================== --> 
  <name>请假DEMO</name>
  <description>该流程模拟公司的请假流程,  </description>
  <responsible>ae</responsible>
 
  <!-- ====================== -->
  <!-- == START & ENDSTATE == -->
  <!-- ====================== -->
  <start-state name="start leave request">
    <description>提交请假单</description>
    <!-- 定义了role,引擎在该start-state节点执行时,就会把执行者信息赋值给角色对应的属性“requester” -->
    <role>requester</role>
    <!-- 在这里定义start-state的field,它表示该filed相关联的属性,并且在该state,它对属性的访问权利。
         如果需要定义其在web表单上的操作界面,如何进行web表单显示等,需要在webinterface.xml文件对应节点补充该field -->
    <field attribute="start date" access="write-only-required" />
    <field attribute="end date"   access="write-only-required" />
    <field attribute="leave days"    access="write-only-required" />
    <field attribute="comment"    access="write-only" />
    <transition to="Is Cancel Fork" />
  </start-state>
   
  <!-- 结束节点除名称外不要定义其他-->
  <end-state name="end" />
 
 
  <!-- ====================== -->
  <!-- ==      Actions     == -->
  <!-- ====================== -->
  <!-- 解释:这里定义process-definition节点的action,有效的事件类型为:process-instance-start, process-instance-end and process-instance-cancel -->
   
  <!-- 此处具体为:在流程结束的时候, 发送E-Mail消息给申请者,记录请假日志 -->   
  <action event="process-instance-end"
        handler="NetBpm.Example.LeaveOfAbsence.EmailAction, NetBpm.Example.LeaveOfAbsence"   on-exception="log">
        <!--定义action参数,供委托类实例化类调用方法时获取使用。如这里的EmailAction的run方法发送邮件,需要知道发给谁,邮件标题等等,那么
            参数可以提供辅助-->
        <parameter name="to">previousActor</parameter>
        <parameter name="subject">您提交了请假申请</parameter>
        <parameter name="message">you requested a holiday from ${start date} to ${end date} with comment ${comment}</parameter>
      </action>
    <!-- 此处具体为:在流程结束的时候记录请假日志, 此处Log模拟 注意:每个节点可以定义多个action -->
    <action event="process-instance-end"
        handler="NetBpm.Example.LeaveOfAbsence.LogLeaveInfoAction, NetBpm.Example.LeaveOfAbsence"   on-exception="log">
    <parameter name="LogInfo">记录请假日志? :) </parameter>
  </action>
 
  <!-- ================ -->
  <!-- == ATTRIBUTES == -->
  <!-- ================ -->
  <!-- 解释:定义属性值及其序列化方式。属性值一般包括3类 -->
  <!-- one:角色对应的属性 -->
  <attribute name="requester" type="actor" />
  <attribute name="chief" type="actor" />
  <attribute name="boss" type="actor" />
   
  <!-- two:所有acitivity-state(包括start-state)处需要更新的属性,和用户表单内容对应 -->
  <attribute name="start date" type="date" />
  <attribute name="end date" type="date" />
  <attribute name="leave days" type="integer" />
  <attribute name="comment" type="text" initial-value="请假理由或者备注" />
  <attribute name="Chief evaluation result" type="evaluation" />
  <attribute name="Boss evaluation result" type="evaluation" />
 
  </concurrent-block>
   
</process-definition>

2. 其它配置文件代码太长就不一一贴出来;
3. 定义委托类:委托类包含在lib文件夹下的程序集中。

因为委托类数目众多,这里仅贴出几个典型的委托类:

1. NetBpm.Example.LeaveOfAbsence.AutoSetAttributionsAction:该委托类设计为一个通用委托类,这里用来设置表识属性,如流程经过用户取消请假路径,则把RunTrace属性设置为requestercancel,供WhichWayDicision作判断用。
2. NetBpm.Example.LeaveOfAbsence.AnyOneJoin: 该委托主要用来设置激活父flow机制,这里是只要任何一条路径到达了join,则激活父flow,流程往下流。
3. NetBpm.Example.LeaveOfAbsence.WhichWayDecision:该委托根据流程实际流过路径,根据标识属性RunTrace等进行走哪条边的抉择。
4. 本文仅仅是一个示例,给大家提供一个运用nPdl定义NetBPM流程的参考,如果要把该流程投入现实中使用显然还需要做很多优化。其中的代码量还是很大的。

NetBPM下设计的流程图如下:

CC Flow

ccflow是一款国产开源工作流。支持SQLServer、Oracle、Access、MySQL数据库,支持群集计算、支持多国语言。流程设计、表单设计都是可视化的,所见即所得。 ccflow提供了强大的数据分析功能:流程运行的各种报表、图形、挖掘、赚取,可以对实(时)效性、成本分析(人力、时间、财物),进行全方位的分析、监控。 Ccflow更可与手机+手机短信+短信猫+电子邮件无缝连接,让您的工作第一时间沟通,第一时间处理。

使用CC Flow创建工作流过程:

1.    在web容器中安装好程序后,打开流程设计器,建立请假流程,即可生成填写请假单和结束节点;
2.    拖动Chief审批节点、 Boss审批节点,添加连线以及标签注明;
3.    设置表单:邮件选择傻瓜型表单或者自由类型表单,设置表单后,设置每个节点的工作岗位;
4.    设置流程跳转方向条件,如判断情人是谁,判断请假天数等,选择的数据来源自表单数据。
5.    点击运行即可运行流程;可打开windows service,即可使用自带的消息提醒以及邮件发送功能;

CC Flow设计的流程图如下:

综上所述,三款的工作流区别如下表:

本文相关软件链接:

CCFlow: http://www.oschina.net/p/ccflow  使用中的问题可与 @ccflow 联系
NetBPM: http://www.oschina.net/p/netbpm
jBPM: http://www.oschina.net/p/jbpm
WWF: http://msdn.microsoft.com/zh-cn/library/aa480214.aspx

三款工作流引擎比较:WWF、netBPM 和 ccflow的更多相关文章

  1. .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

  2. 工作流引擎JFlow与activiti 对比分析(一)5种基本控制流模式的对比

    为了更好的说明activiti 与jflow的两款工作流引擎的特点与区别,我们按照如下几个方面做一次全面的.客观的对比. 首先activiti是国外的一款开源的工作流程引擎,在国际上影响比较深远与广泛 ...

  3. F2工作流引擎之 工作流运转模型(三)

    1流程单起点单终止模型 单起点:一个流程定义必须有且唯一起点 单结束点:一个流程定义必须有且唯一结束点. 约定:提单与结束是每个流程必须有的活动,且唯一只有一个提单和结束. 2串行模型 描述:串行(S ...

  4. 分享一款自带工作流引擎的NodeJS全栈框架,接单快手、创业神器

    CabloyJS是什么 CabloyJS是一款自带工作流引擎的Node.js全栈框架, 接单快手.创业神器, 基于koa + egg + vue + framework7 + mysql 在线演示 场 ...

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

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

  6. 我的微型工作流引擎-功能解析及API设计

    一.前言 上一篇我给大家介绍了我的工作流的模型和基本的设计,这篇我想详细说明下我这款工作流的功能及使用示例.这款工作流主要是面向开发者设计的,为了先让大家有个全局的认识,局部功能的设计实现就不细说了, ...

  7. .net之工作流工程展示及代码分享(二)工作流引擎

    在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: [Serializable] public class Flow { [Xml ...

  8. F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)

          Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回.传阅.转交,都可以非常方便快捷地实现,管理员 ...

  9. F2.Net工作流引擎系列索引

    索引如下 F2工作流引擎遵循参考WFCM标准规范,符合中国国情特色,更轻量级的工作流引擎,支持多种数据库(mmsqlserver,mysql,oracle),有强大智能的组织模型接口可快速应用到任何基 ...

随机推荐

  1. HTML+CSS小技巧

    网页标题前引入ico图标 <link rel="shortcut icon" href="img/icoTest.ico">

  2. electron主进程引入自定义模块

    对于electron以及nodejs开发,是一只小菜鸟,第一次想做个应用 只能边学边做,遇到各种各样的问题. 1.不想把所有的主进程函数放到一个文件中,这样文件比较乱,并且不好处理 想法:将另一个js ...

  3. linux技巧-持续更新

    终端下锁屏ctrl + s,解锁 ctrl + q 长时间运行命令,防中断 screen 注意,screen命令里面是不可以滚动屏幕,查看以前记录的 :  ctrl+A + [ 终端切割屏幕,类似vi ...

  4. centos6.5 下安装mysql5.7

    http://blog.csdn.net/cryhelyxx/article/details/49757217 按步骤一路执行下去. 以下是补充: linux下,在mysql正常运行的情况下,输入my ...

  5. python 2 如何安装 MySQL 数据库操作库

    我试了好几种网上的办法,在 windows 10 VS2017 环境下不是缺了头文件,就是缺 .lib,反正十分繁琐,以后我也懒得搞了,都用 annaconda 来搞定就好了,时间宝贵. 在 控制台中 ...

  6. 湖南大学ACM程序设计新生杯大赛(同步赛)H - Yuanyuan Long and His Ballons

    题目描述 Yuanyuan Long is a dragon like this picture?                                     I don’t know, ...

  7. Python类总结-封装(私有属性,方法)

    封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...

  8. nyoj 作业题 dp

    作业题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过程, ...

  9. 「CSA49」Bunny on Number Line

    「CSA49」Bunny on Number Line 题目大意:有一个人从0开始走,每次可以向前走一步或者回到1,那么会产生一个位置序列,其中给出 \(k\) 个位置是好的.定义一个位置序列是好的, ...

  10. 「ZJOI2009」多米诺骨牌

    「ZJOI2009」多米诺骨牌 题目描述 有一个n × m 的矩形表格,其中有一些位置有障碍.现在要在这个表格内 放一些1 × 2 或者2 × 1 的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任 ...