楼主: jieforest

应用jBPM4解决中国特色的流程需求

[复制链接]
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
11#
 楼主| 发表于 2009-9-27 09:08 | 只看该作者
3.3.2 会签

需求描述:

会签在政府或企业来讲都是必有的功能,尤其是审批流中。简单来说,会签是可以分为单步会签(只有一个审批环节),及多步会签(每一个子审批流有多个审批环节)的。

单步会签:很简单,就是在流程的某个环节需要由多个办理人(多个不同部门的领导)共同办理,或者签署意见。这个场景就不用说了,在企业或政府的内部都很常见。

多步会签(也叫并联审批):其实就是一个单步的审批环节就变为了在部门内部一个比较复杂的审批流程,这个审批流程有多个审批环节。

加签:在流程定义期已经定义好会签范围(例如某个岗位或部门),但是在运行期,会签发起人发现对于某个个例需要新增会签人或会签单位,而且新增的会签对象不在原来设定好的范围内。此时由会签发起人直接进行加签操作。

减签:同上,只是相反的操作而已。

补签:会签发起人已经将会签任务发送给张、李、王三个人,而此时,张发现这个任务还需要孙来会签,那么此时,可以由张直接发起一个给孙的补签任务,而不必回退到会签发起人那里。

会签百分比:会签发起人将任务发送给5个人办理,而结果是只要有80%的会签百分比即可算审批通过(也就是说只要有4个人审批通过就OK了)。

场景:

单步会签:对于单步会签的场景很简单不在此描述了。

单步会签的实现思路:可以对TaskService进行扩展开发,实现动态任务实例的创建,可参照TaskActivity这个类中的方法进行扩展,扩展之后再调用addTaskParticipatingUser()或addTaskParticipatingGroup()方法实现动态增加任务办理人,此时即实现了单步会签功能。

多步会签场景一:审批环节相同。在企业内部的各个部门之间(例如,办公室、采购部、财务部)进行并联审批,每个部门中都需要多个审批环节,而这些部门的审批环节完全相同,只是每个审批环节的办理人不同而已(例如在财务部,需要财务专员、财务经理、财务总监等审批;在办公室需要办公室科员、办公室副主任、办公室主任审批),因此可以公用一个子流程定义。

场景一的实现思路:最常见的方案是通过启动一个子流程定义的多个子流程实例来实现多步会签。这时,即便是对于会签的部门数是未知的,需要动态决定,也可以轻松实现,只需要在运行期根据会签部门数动态地创建同等数量的子流程实例就可以了。 但是不要高兴的太早J,由于在jBPM4 中,流程的推进是依赖于ExecutionImpl来执行的,而对于每一个流程实例 ProcessInstance持有的ExecutionImpl实例也只有一个与之关联的subProcessInstance,因此对于一个子流程节点SubProcessActivity来说也就只能有一个子流程实例与之关联了,此时要想通过启动一个子流程定义的多个子流程实例来实现多步会签,实现方法与在jBPM3中实现多子流程实例类似(可以在网上搜到很多demo),就是结合Event-Listener机制和对Variable的使用,去创建多个子流程实例(注意的是在jBPM4中没有ActionHandler了,取而代之的是基于观察者模式的Event-Listener机制)。

多步会签场景二: 审批环节不同。实际上与场景一相比,就是会签部门的审批环节不同了,也就是说在企业内部的每个部门都要有自己的审批流程,其它与场景一是完全一致的。

场景二的实现思路:此场景,可以和场景一的实现相同,唯一不同的是由一个子流程定义的多个实例,变为了不同子流程定义的不同实例。

多步会签场景三:分布式审批。在政府部门,例如我们需要去政府的行政大厅去办理新公司注册,那么在行政大厅启动一个新公司注册的流程,在申请人提交完所有资料后,流程继续向下执行,这时可能就需要工商局、公安局、地税、国税等多个委办局进行内部的并联审批,每个委办局都需要在内部走一个复杂的审批流程,每个委办局的流程审批完毕后,流程回到行政大厅的那个父流程中。此场景与场景二相比,其实就是企业内部的各个部门变为了不同的委办局或子公司,此时的流程是分布式部署在各个委办局或子公司的。

场景三的实现思路:由父流程执行到某个会签节点时,通过 jms消息向各个会签部门(注意这个会签部门一般都是分布的,例如公安局、工商局、税务局等)发送业务数据,而父流程在此等待会签结果,而各个会签部门都有自己的监听器,在监听到会签请求时,在内部发起自己的审批流,内部审批完毕再发送业务数据给父流程,父流程接收到审批结果的业务数据后,流程继续向下执行。

在jBPM4中实现起来就很简单了,因为jBPM4提供了jms的消息、Event-Listener机制,而jBPM4本身也完全是基于观察者模式进行设计的,此时通过在会签节点上绑定特定的Listener,在Listener中向特定的目标发送jms消息(可参见MailListener的实现)。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
12#
 楼主| 发表于 2009-9-27 09:08 | 只看该作者
小结

对于单步会签的应用场景较多,在jBPM4中也提供了直接的支持。

对于多步会签场景一,实际上这个场景在真实的企业中并不多见,因为大多数的需要会签的业务都是只需要部门中的一个关键领导审批就可以了,也就是单步会签的场景。当然如果在某个特定的企业中,这种情景很多,为了流程管理员使用方便,那么对jBPM4的代码做一定的修改也是可以的。

对于多步会签场景三,实际上,由于各个部门(公安局、工商局、税务局)都是分布的,采用的工作流产品也是不同的,即便是同一个公司的产品,也是分布式部署的,因此在这个场景中,是不需要用subprocess或subProcessActivity这些概念的。因为此时的并联审批本质上是两个相同等级的流程之间的通信而已。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
13#
 楼主| 发表于 2009-9-27 09:09 | 只看该作者
3.3.3 撤销

需求描述:

任务在发送给下一个办理人之后,发现任务发送错误了,此时在下一个办理人还没有办理之前,可以撤回当前任务,而重新选择其它人进行办理。

场景:

撤销的场景与回退的场景很类似,虽然有很多的场景,但是各个场景的处理情况是一样的,因此在此只给出最简单的一个场景,如下图6所示:

图6 串行流程示意图

image6.JPG (6.65 KB, 下载次数: 0)

image6.JPG

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
14#
 楼主| 发表于 2009-9-27 09:09 | 只看该作者
节点2的处理人(假设是张三),办理完毕之后,将任务提交,此时任务到达了节点3(假设李四办理),这时李四就会收到一个待办任务,在李四还没有办理之前,张三突然发现,有一个业务数据填写错误,或者粘贴的附件错误,这时张三需要将发送给李四的任务撤销(也叫收回),重新更正数据后或修改粘贴的附件后再发送给李四审批。还有一种情况是,假设节点3的办理人有2个人(李四和王五),那么张三需要在运行期根据业务特性手动地选择任务是提交给李四还是王五,但是由于李四的误操作,把本来应该发给王五的办理任务错发送给了李四,此时,在李四办理之前,张三也可以将发送给李四的任务撤销(或收回),然后重新发送给王五。

jBPM4实现:

在jBPM4中实现撤销,虽然场景有很多,但是各个场景的处理是一样的,也就是在撤销时,首先删除需要撤销的任务实例及其与此任务实例相关的所有工作流实例。在jBPM4提供了级联删除任务实例的相关方法,如下:

TaskServiceImpl.java

public void deleteTaskCascade(String taskId) {
        commandService.execute(new DeleteTaskCmd(taskId, true));
}

其次修改当前任务实例的状态,即将张三的已经办理完毕的节点2对应的TaskInstance的状态更改为待办状态:

(Task.STATE_OPEN)

                            task.setState(ask.STATE_OPEN);
                            taskService.saveTask(task);

小结:

撤销的需求在审批流中也是最常见的业务需求,毕竟人都有犯错的时候嘛,而且一般的软件都有Undo功能。但是对于jBPM4中的fork-join,sub-process都需要把撤销任务的相关实例都删除。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
15#
 楼主| 发表于 2009-9-27 09:09 | 只看该作者
3.3.4 自由流(动态路由)

需求描述:

针对于特定的业务实例,在原本没有转移关系的环节之间进行特定的跳转,例如在一个串行的流程中(1-2-3-4-5),节点2与节点5之间是没有任何转移存在的,但是针对于某个运行期的特定业务实例,要求,审批环节直接从节点2跳转到节点5(而略过了节点3和节点4)。

场景:

图7 串行流程示意图

image7.JPG (6.52 KB, 下载次数: 0)

image7.JPG

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
16#
 楼主| 发表于 2009-9-27 09:10 | 只看该作者
jBPM4实现:

图8 动态路由实现示意图

如图8所示,在节点2 和节点4之间由程序动态地创建一个转移(transition),并设定为优先级最高,那么在执行takeTransition()方法时,按照优先级优先执行动态的转移,然后对外暴露一个jumpTransition(String destinationActivityName)方法给客户端。在jBPM4中,可按照如下步骤实现:

   1. 参照CompleteTaskCmd.java扩展开发用于跳转的cmd:JumpTaskCmd(jBPM4中的动作都是基于Command模式的);
   2. 参照TransitionStartActivity.java的原子操作,定制开发用于跳转的原子操作JumpTransitionStartActivity;

小结:

jBPM4中的执行动作都是基于Command模式来实现的,因此我们在扩展开发自己的跳转动作时,就可以做到对jBPM4本身的代码不做侵入修改而实现。

image8.JPG (9.76 KB, 下载次数: 0)

image8.JPG

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
17#
发表于 2009-9-27 19:53 | 只看该作者
nice job

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2006-05-19 16:23:56ITPUB元老
日期:2006-07-17 15:19:30会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44CTO参与奖
日期:2009-02-12 11:45:48
18#
发表于 2009-10-15 12:00 | 只看该作者
look 1 look

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2009-10-16 23:57 | 只看该作者
厉害

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2009-10-16 23:57 | 只看该作者
新东西

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表