题记
我的第一支流程(文档借阅审批流程)结束了,从需求分析到编码实现,历时9天,尽管这支流程还不是很完善,但让我对FileNet中的流程设计有了整体的认识,由WorkStep 到 Workflow,这是质的变化。
需求分析
文档借阅审批流程,是我在众多流程中选取的一条有代表性的流程。其一,文档借阅在大型企业中是经常发生的一个事件流;其二,文档借阅过程中会有多个不同概念节点的参与;其三,这支流程是我以前未处理过的流程。鉴于以上原因,考虑到公司对业务的要求,我设计出如下所示的流程图:
流程图分析
这支流程包含了两种结点:Component和Activity。这两种节点是流程设计中最常用的两种节点。Component节点是Document Permission,Activity节点包括Inner Dept Manager和Other Dept Manager。
Component节点主要使用以前开发好的程序Jar包来对节点进行验证,这里Document Permission的作用就是读取该文档是否具有借阅权限,如果有则进入下一步,否则流程结束。
Activity节点与Component节点的不同之处在于,Activity处理的程序不是使用已编译好的Jar来处理,而是独立写程序来实现相应的功能。其次,Activity节点在处理过程中需要暴露相应的字段,使系统有权限去自动处理。Activity节点还需要指定参与人,只有相关权限的用户在分配相应的任务后才可进行任务处理。
在该流程图中,Inner Dept Manager指定了Work Queue负责处理该节点,当任务发起后,Work Queue中的任何人都可以对任务进行处理,谁先拿到任务谁进行处理,也就是我们平时所说的“抢单”。
Other Dept Manager,我指定的是Participant,这里Partcipant中的所有都审批通过时,该流程才正式结束,它与Work Queue的不同之处在于这里需要所有人都参与,而Work Queue只需其中一人进行处理即可。
代码里的哲学
在FileNet开发过程中,应该考虑到面向对象的三大特征,将系统的可重用性,可维护性,灵活性发展到极致。在这里,对CE以及PE操作步骤都是确定的,我们无需自己去创造一种实现方式。
但是我们应该将我们常用的模块进行封装,以提高程序的重用性,比如我们对FileNet中的Session的处理,应该写成一个单独的模块去包装它。对于对象的处理,我们可以将它包装在现有的Map中,而不用再一行行的去写Set方法,增强程序的可读性。
MAP封装对象
private static Map<String,Object>getDataFieldMap(DocumentBorrowserVO documentBorrowser){ Map<String,Object>map = new HashMap<String,Object>(); map.put("documentName", documentBorrowser.documentName); map.put("documentExplain", documentBorrowser.documentExplain); map.put("documentType", documentBorrowser.documentType); map.put("applicant", documentBorrowser.applicant); map.put("dept", documentBorrowser.dept); map.put("stepName", documentBorrowser.stepName); return map; }
尾声
Workflow将我近期所学的知识串成一条线,从Flex界面设计,通过Cairgorm架构,借助BlazeDS,穿越到Java,过渡到FileNet。这条线只是Business图案中第一条,我还需要继续穿越,直到整个Business成为一个完整的图案。