在工作流软件产品中,产品的扩展性和易用性是衡量软件产品的重要指标。

大家都知道,工作流软件系统会包含流程引擎,流程管理中心,流程设计器,任务调度,定时器管理等等......,其中流程引擎是核心,流程引擎完成对所有业务流程的抽象,建模,以及抽象的业务流程节点的定义、流转。但是流程引擎完成的是抽象的业务流程节点的流转,当给一个具体的业务流程建模后,启动这个业务流程,才开始一个具体的应用。在具体业务流程中,常常会伴随有一些具体的业务规则和业务过程的实现,这些是流程引擎中不包含的,流程引擎只负责通用的抽象的节点的流转和实现,具体的业务规则和过程,是和具体的应用系统紧密关联的。例如,审核月终报销的时候,要引入一些相应的规则来做判断,如部门经理引入部门经理级别的每月通讯费报销范围,餐费报销范围,交通费报销范围,等等,通过这些数据来判断报销申请是否审批通过。这个判断过程是和具体的应用紧密关联的。

在工作流引擎在设计之初,就应该考虑好如何方便的引入具体的业务规则和业务过程,当然这些业务规则和过程是需要有具体的实现的,不是流程引擎能做到的。
如何引入这些具体的业务规则和业务过程,常用的处理方案有3种。

1、在流程节点中挂接的业务模块中实现
2、在流程节点的前置后置事件和规则判断中引入
3、利用流程的变量表达式来实现

下面详解每种处理过程:

1、在流程节点中挂接的业务模块中实现
  
    工作流引擎给业务流程建模后,业务流程就按照定义的流程节点来流转,到达节点后,节点上挂接有业务模块,业务的办理就在业务模块中实现,工作流引擎是不负责具体的业务模块的实现。业务模块我们通常会利用开发工具做成一个页面或者是一个业务表单来实现,在业务表单中实现业务数据的录入,修改,甚至是和其它数据的关联交互等等。这种的业务表单,可以是利用开发工具定制的表单,如具体开发的jsp页面,aspx页面;也可以是利用表单工具可视化的画出的业务表单,如eform自定义表单通过拖拉的方式建立的htm页面。
    在业务表单中,可以方便的引入一些业务过程或者业务规则判断,如在提交产品入库单之后,更新产品库存表的库存数量,就可以在保存入库单的数据之后,再更新一下库存数据。

在业务模块业务表单中实现的业务过程和业务规则,通常都是和流程上下文关联不是很紧密的,只是业务处理过程。这种的就可以直接在业务模块中实现。

2、在流程节点的前置后置事件和规则判断中引入

工作流引擎抽象的节点,一般都会提供有前置后置事件函数,便于流程做业务过程的扩展。当流程运行到此节点的时候,会触发前置函数,离开此节点会执行后置函数,至于函数的内容,就是具体的业务过程了。
      在前置后置函数中,只需要实现固定的函数接口,如FunctionProvider,FunctionProvider接口有一个execute()方法,方法中包含3个参数(当函数运行时,通过execute()函数的3个参数,可以获得流程的相关信息,数据库链接,事务等等),业务过程就可以在此方法中实现。
 
 .net的FunctionProvider接口:
 void  execute(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps);
 
 java的FunctionProvider接口:
 public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
 
 
      业务规则的引入通常是在流程节点的条件判断中引入,例如审核加班单,需要引入加班当天的指纹打卡考勤记录,加班的时间段,是否在指纹打卡考勤记录的时间段中,是则审核通过。这个过程判断,就可以实现一个规则判断接口,如Condition接口,提供一个passesCondition()函数,返回true,或false.  在passesCondition()函数中写具体的规则判断,流程的相关信息,等等都通过passesCondition()函数的三个参数来获取。
 
 .net的Condition接口:
  bool passesCondition(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps);
 
 java的Condition接口:
  public boolean passesCondition(Map transientVars, Map args, PropertySet ps) throws WorkflowException;

3、利用流程的变量表达式来实现 
 
 有些业务规则和过程常常会每个流程实例都不一样,这通常就需要在流程建模时引入变量或表达式,当流程实例运行时,给变量赋值。每流程实例赋的值可能不一样,这样来达到每个流程实例的不一样。
 例如;费用报销单的一审人,需要是报销单填写人的直接上级。而可以填写费用报销单人,可能是各个部门或所有员工都能填写。这样的话,就可以给一审的审核人定义一个变量,例如${xx_leader},当费用报销单填写完成后,就通过前置函数的业务过程,查找到当前申请人的直接上级,将上级的用户id,存到变量xx_leader中,当到达一审节点时,这个变量就有值了。

变量又分为临时变量和持久化变量,临时变量仅存在于流程的一次流转当中,前面过程中给变量赋值,后面的过程就能获取到值了。
 持久化变量,只要保存了值了,后面的所有过程就都能使用了。
 
 
 利用流程的变量表达式的过程来实现业务规则和过程,常常还是需要辅助1,2两种方法来实现。
 
 
 在工作流软件产品中不需要包含具体的业务规则和业务过程的实现,但是一定要能方便的引入业务规则和业务过程,便于扩展。而通常工作流软件产品中,变量表达式,节点的前置后置事件等等都是为了方便做业务规则的扩展,合理的利用这些使得工作流软件系统和应用系统结合的更完美。

工作流系统之四十二 业务规则和业务过程相关推荐

  1. 工作流系统之四十 抄送功能的实现

    在OA审批流中,任务信息,经常需要抄送给相关人员.被抄送的人能查看到任务信息,但是不参与执行任务. 在工作流软件产品中,产生一条任务信息,任务有参与人,执行人,任务完成后,还有任务的完成人,这些是任务 ...

  2. Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline

    Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向 ...

  3. 高级计划排程APS系统的十二个应用方法

    战略家冯.毛奇说"没有什么计划在遇到敌人是不变的".计划即变化是我们新的思辨.不确定性导致多个计划,而多个预计计划又会导致更多的不确定性. 面对这个变化的复杂性, 我们必须从需求到 ...

  4. 深入Android系统(十二)Android图形显示系统-2-SurfaceFlinger与图像输出

    最近有些忙,切实体验了一把拖更的羞耻感 ( *︾▽︾) 本文和上一篇深入Android系统(十二)Android图形显示系统-1-显示原理与Surface关系比较密切,撸完前篇更易理解本文啦 (๑‾ ...

  5. 2021年春季学期-信号与系统-第十二次作业参考答案-第四小题

    ▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §04 第四小题 4. 画出X(z)X\left( z \right)X(z) 的零极点图,在下列三种收敛域下,求各对应的 ...

  6. 2021年春季学期-信号与系统-第十二次作业参考答案-第三小题

    ▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §03 第三小题 3. 设激励x(t)=e−tx\left( t \right) = e^{ - t}x(t)=e−t 时 ...

  7. 2021年春季学期-信号与系统-第十二次作业参考答案-第二小题

    ▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §02 第二小题 2. 用单边 zzz 变换求解下列差分方程,并求出零输入响应和零状态状态响应. (1) y[n]+3y[ ...

  8. 2021年春季学期-信号与系统-第十二次作业参考答案-第一小题

    ▓ 本文是2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §01 第一小题 1. 用拉普拉斯变换解下列微分方程: (1) d2dt2y(t)+2ddty(t)+y(t)=δ(t)+2 ...

  9. 2021年春季学期-信号与系统-第十二次作业参考答案-第五小题

    ▓ 本文是 2021年春季学期-信号与系统-第十二次作业参考答案中的小题答案 §05 第五小题 5. 给定实数序列 x[n]x\left[ n \right]x[n]及其Z变换表达式 X(z)X\le ...

最新文章

  1. Unity 游戏开发技巧集锦之创建自发光材质
  2. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)
  3. nodejs: mkdirs 递归创建目录
  4. 自动完成文本框AutoCompleteTextView
  5. linux aix 环境,Aix5.3安装Bash环境
  6. 大规模电机控制的方案选择-电机和驱动器篇
  7. Hadoop环境搭建(6) -- 克隆
  8. 2019全国大学生电子设计竞赛备赛笔记--风力摆--板球--模拟曲射电磁炮
  9. ps快捷键常用表,ps快捷键大全!最全面的PS快捷键使用指南(图文演示)
  10. canvas_requestAnimationFrame帧率显示fps
  11. 7.物理地址(MAC地址)是什么?
  12. C语言中宏定义函数的运算优先级问题
  13. 【前端知识之JS】JS的作用域链
  14. 手机如何查看图片分辨率?手机图片分辨率怎么修改?
  15. SpringBoot WEB怎么实现大文件上传
  16. 程序员年薪20万、30万、40万都是如何生活的?
  17. 德友圈服务器维护多久,原神蒙德城走一圈要多久
  18. Python数据转换-有符号短整型转换无符号短整型
  19. 读书笔记:《德鲁克管理思想精要》- 4
  20. VUE前端从后台请求过来的数据进行转换数据结构

热门文章

  1. OS和Linux笔记
  2. 树莓派配置记录——aria2
  3. 魔众微信管理系统,简单易用的微信公众号管理系统
  4. 电单车中的N车模长得啥样呢?
  5. js获取UEditor富文本编辑器的内容
  6. setoolkit进行钓鱼攻击
  7. MMDetection框架入门教程(三):配置文件详细解析
  8. 网校系统开发如何做才能保证系统稳定发展
  9. 三星同时发展两种电视面板技术,围追堵截LG
  10. 哲理故事与管理之道(11)-让自己成为领袖和榜样