流程的二次开发
1. 流程基本原理 
1.1 基本概念 

流程(flow)是定义流转的过程,即流转经过的步骤、执行步骤的人、流转的条件。 

表单(formset)主要为定义数据的格式和内容,即流转的实际内涵。 

一个流程可以对应多个表单。 

1.2 流程模板(proc_info) 

一个流程模板由节点(activity)和连线(transition)、执行角色(participant)组成。 

流程有一个开始节点和结束节点,不能删除。 

模板由版本控制。包括历史版本(0个或多个)、修改版本(1个)和发布版本(0个或1个)。一开始建立流程的时候有一个修改版本,修改版本修改完成后发布得到一个新的发布版本(这是修改版本保留,内容和发布版本一样),当再次发布时,旧的发布版本变成历史版本,当前的修改版本被拷贝成新的发布版本。 

1.3 节点(activity) 

节点属性包括名称、描述、执行者过滤器、外部jsp页面、类型、执行角色、系统执行角色、启动前执行的外部程序、完成后执行的外部程序、优先级、流转限制条件。 

名称在表单模板和其他配置的项目中使用,描述是显示为公文处理页的标题,和意见列表的步骤名称(如果描述为空,则显示名称)。 

优先级是节点排列的顺序,在表单绑定显示、跳转中使用。 

其中用作流转控制的包括:执行者过滤器、外部jsp页面、类型、执行角色、系统执行角色、启动前执行的外部程序、完成后执行的外部程序、流转限制条件。 

1.4 连线(transition) 

连线属性包括名称、互斥设置、优先级、检查条件、发出条件、接收条件、角色过滤、发出步骤、进入步骤。 

优先级是在发送框中后续步骤排列的顺序。 

其中用作流转控制的包括:互斥设置、检查条件、发出条件、接收条件、角色过滤。 

1.5 表单模板(form) 

表单的版本信息。表单是流转的入口。 

模板由版本控制。包括历史版本(0个或多个)、修改版本(1个)和发布版本(0个或1个)。一开始建立流程的时候有一个修改版本,修改版本修改完成后发布得到一个新的发布版本(这是修改版本保留,内容和发布版本一样),当再次发布时,旧的发布版本变成历史版本,当前的修改版本被拷贝成新的发布版本。 

1.6 表单绑定(doc_attributes) 

表单版本和流程版本的关联,只有绑定流程的表单才能流转。 

绑定中定义了表单的元素在各个节点中的权限。 

绑定中的基本流转属性包括:缺省显示页面、角色控件、角色控件类型、是否加锁、强制回收、退回类型。 

1.7 实例(formset_inst) 

实例是实际流转中的表单内容,以及由此产生的各种数据,如意见数据、附件等。 

1.8 工作项(workitem) 

工作项标记一个人在实例中做的工作。每个收到实例的人,都会有一个工作项。如果一个人有一个未完成的工作项,则不会再收到新的工作项。 

[编辑]2. 流程基本控制 
基本控制就是不用编写二次开发代码,只要做一定配置就可以完成的控制。 

2.1 节点上的控制 

节点使用以下属性进行基本控制:外部jsp页面、类型、执行角色、系统执行角色、流转限制条件。 

外部jsp页面:控制地址本的扩展属性。只需在空白处填写属性值,用半角分号格开。可以用的属性包括: 
单选:只能选一个人,默认选多人 
列表:用列表方式显示,默认树状 
只显示用户:只显示用户名字,默认显示部门和用户 
只显示部门:只显示部门名字,默认显示部门和用户 
全部展开:树的叶子全部展开 
不显示组:部门下不显示组 
股级:在列表显示的时候,部门从股级开始显示 
科级:在列表显示的时候,部门从科级开始显示 
处级:在列表显示的时候,部门从处级开始显示 
局级:在列表显示的时候,部门从局级开始显示 
部级:在列表显示的时候,部门从部级开始显示 
类型:分成普通、串行、传阅、子流。 
普通:工作项在待办中显示。如果多人,同时收到。只能执行发送。 
串行:工作项在待办中显示。如果多人,按照发送顺序一个接一个收到,最后一个人确定后续步骤。 
传阅:工作项在待阅中显示。可以执行已阅和发送。 
子流:工作项在待办中显示。节点对应一个其他的流程。 
执行角色:发送时可以选择后续步骤执行者的范围。 
系统执行角色:可以选择流程启动者。当执行角色和系统执行角色同时存在时,以系统执行角色为先。 
流转限制条件:分成条件1(连线条件)和条件2(人数条件),两者可以只选一个,也可以同时选择,当同时选择 
的时候,他们之间可以是与的关系,也可以是或的关系。 

>条件1(连线条件)这些条件均对有执行者的前一步骤定义。 
只有一条线到达即可启动:有一条线到达 
全部到达才可以启动:全部线到达 
用户选定的一批线到达才可以启动:在连线属性的接收条件选择必须收到的连线。 
n%线到达才可以启动:在到达线的百分比填写百分数 
>条件2(人数条件) 
接收人发送的所有目标人员:当前处理人发送的接收人之前发送的所有人都完成。如A发送给B、C、D,当B发回给A 
时,在该条件中接收人发送的所有目标人员就是A发送的所有人,即B、C、D。 

到达的人数:前导步骤接收人处理的人数 
2.2 连线上的控制 

连线使用以下属性进行基本控制:互斥设置、检查条件、发出条件、接收条件、角色过滤。 

互斥设置:当该连线在发送页被选择时,对同一前导节点的所有后续连线的影响。弹出窗口有一个同一前导节点的所有后续连线的列表。 
可以选择:当该连线被选择时,另外的连线可以选择。 
不能选择:当该连线被选择时,另外的连线不能选择。如果已经选择,则自动取消选择。 
必须选择:当该连线被选择时,另外的连线自动被选择。 
检查条件:填写组名或机构名。 
如果组名或机构名被[]包括,则当前用户在这些组或机构中的时候,该连线才被显示。 
如果组名或机构名被()包括,则当前用户不在这些组或机构中的时候,该连线才被显示。 
发出条件:是否必选的连线。 
提供选择:可以选择该连线是否发送。 
必须发出:必须发送该连线。 
接收条件:对应节点的流转限制条件中的条件1(连线条件)中的用户选定的一批线到达才可以启动。 
不是必须收到:不用收到也可以启动。 
必须收到:必须收到才能启动。 
角色过滤:对节点的执行角色作进一步的过滤,或者用一些系统角色代替执行角色。 
所有:不过滤 
本股:只显示和当前处理人同一个股的人,需要在机构设置行政级别。 
本科:只显示和当前处理人同一个科的人,需要在机构设置行政级别。 
本处:只显示和当前处理人同一个处的人,需要在机构设置行政级别。 
本局:只显示和当前处理人同一个局的人,需要在机构设置行政级别。 
本厅:只显示和当前处理人同一个厅的人,需要在机构设置行政级别。 
流程所有处理人:本流程的所有处理人(除去当前处理人),使用该选项后执行角色将固定不能选择。 
节点所有处理人:目标节点的所有处理人(除去当前处理人),使用该选项后执行角色将固定不能选择。 
节点最后处理人:目标节点的最后一个处理人,使用该选项后执行角色将固定不能选择。 
发送人:该工作项的发送人,使用该选项后执行角色将固定不能选择。 
相关发送人:从目标节点发送到当前处理人的那个处理人,使用该选项后执行角色将固定不能选择。 
2.3 绑定里的控制 

绑定里使用以下属性进行基本控制:角色控件、角色控件类型、是否加锁、强制回收、退回类型。 

角色控件:选择角色控件的那个控件。 
角色控件类型:选择那个角色控件的行为。 
选择:角色控件中的人员作为后续节点的执行角色,固定不能选择。 
过滤:角色控件中的人员从后续节点的执行角色中过滤。 
是否加锁:如果加锁,则一个用户打开后,其他用户不能保存该实例。 
强制回收:回收被保存的工作项。 
退回类型:退回工作项。 
退回最近一个处理人:退回发送者。 
退回前导节点处理人:退回框选择前导节点的所有处理人。 
退回流程任意处理人:退回框选择流程所有的处理人。 
[编辑]3. 二次开发说明 
3.1 可以进行代码编写的地方 

节点的以下属性可以编写二次开发代码。在以下几个执行环境中,都有一些对象在环境初始化的时候由系统自动初始化,用户可以直接调用。代码在Rihno V1.5R5环境下执行,由mozilla发布,开源软件。所有对象的更改只对当次操作有效,不写入数据库,如需写入数据库,需要调用相应接口或在表单提交时写入。 

执行者过滤器:对节点的后续步骤作进一步的过滤,在读取后续步骤完成后、显示后续步骤前执行。 
启动前执行的外部程序:在节点发送完成后,启动节点前执行,针对目标节点。 
完成后执行的外部程序:在节点发送完成后,但是在生成后面的工作项前执行,针对源节点。 
3.2 对象说明 

3.2.1 各节点可以使用的对象 




属性 helper out workItemVO formsetInstVO userInfo targets routes  
执行者过滤器 可用 可用 可用 可用 不可用 不可用 可用  
启动前执行的外部程序 可用 可用 可用 可用 可用 不可用 不可用  
完成后执行的外部程序 可用 可用 可用 可用 可用 可用 不可用  


3.2.2 对象详细说明 

helper: 助手对象,里面包含几个静态常用对象。 
helper.processor: MissiveProcessorLocal,可用的方法包括: 
方法 参数 描述  
completeConcurrentWorkItems(int workItemId) 工作项ID 完成与本工作项同时发出的其他工作项  
getWorkItemsByActivityNames(int formsetInstId,String[] actNames) 实例ID,节点名称数组 根据节点名称返回相关工作项,如果actNames为空则返回所有工作项  
getParticipantsByActivityNames(int formsetInstId,String[] actNames) 实例ID,节点名称数组 根据节点名称返回相关执行者,如果actNames为空则返回所有执行者  


helper.admin: MissiveAdminLocal 
helper.serviceLocator: ServiceLocator,可用的方法包括: 
方法 参数 描述  
getLocalHome(String jndiName) EJB的JNDI名称 得到EJB的local接口  


helper.sqlUtil: SQLUtil 
out: 就是System.out,可以在后台输出一些信息。 
workItemVO: 工作项类。属性如下: 
属性 类型 描述  
id int 工作项Id  
activityType short 类型,1:待办;2:待阅  
senderId int 发送者Id  
sender String 发送者名称  
receiverId int 接收人Id  
receiver String 接收人名称  




formsetInstVO: 实例类。属性如下: 
属性 类型 描述  
id int 实例Id  
name String 实例名称  
extXX(1-30) String或int或Date 数据项内容(1-22 String,23-26 int,27-30 Date)  




userInfo: 当前用户信息类。属性如下: 
属性 类型 描述  
account String 帐号  
username String 用户名  
org String 主机构id  
orgName String 主机构名字  
unitId int 单位id  
unitName String 单位名字  
id String 用户id  
ip String 用户登录时使用的ip地址  
machine String 用户登录时使用的机器名  




targets: 发送步骤列表(ArrayList,里面包含SendTargetVO)。SendTargetVO中可用的属性如下: 
属性 类型 描述  
activityId int 节点Id  
participants ArrayList 节点角色列表(里面包含的对象是ParticipantVO)  




routes: 后续步骤列表(ArrayList,里面包含SendTargetVO)。SendTargetVO中可用的属性如下: 
属性 类型 描述  
activityId int 节点Id  
activityName String 节点名称  
activityType short 节点类型  
transitionName String 连线名称  
participants ArrayList 节点角色列表(里面包含的对象是ParticipantVO)  
filter short 根据行政级别的角色过滤  
roleObjectItems ArrayList 选择的角色控件中的用户信息(里面包含的对象是ParticipantVO)  
rejectedRoleObjectItems ArrayList 需要过滤的角色控件中的用户信息(里面包含的对象是ParticipantVO)  
condition String 连线的条件  
addressBookExtension String 地址本扩展参数  
mutex String 互斥信息  




ParticipantVO: 执行者 
属性 类型 描述  
name String 执行者名称  
objectId int 执行者ID  
objectType short 执行者类型,用户为2  




[编辑]4. 典型样例 
执行者过滤器 
读取节点“中间步骤1”和“传阅”的工作项,把这些工作项的接收者在后续步骤“提交过滤”的执行者列表中过滤掉 
 var acts=new Array();
 acts[acts.length]='中间步骤1';
 acts[acts.length]='传阅';
 var items=helper.processor.getWorkItemsByActivityNames(workItemVO.getFormSetInstId(),acts);
 var parts=new java.util.ArrayList();
 for (var i=0;i1&&st.getTransitionName().equals("提交结束")) i.remove();
 }
节点完成时执行 
当节点任意一个工作项完成时,自动完成其余的工作项 
 helper.processor.completeConcurrentWorkItems(workItemVO.getId());

posted on 2004-12-28 13:29  我叹云儿走,风儿送我愁  阅读(580)  评论(0)    收藏  举报