浅谈业务流程的开发软件三部董子良PrimetonEOS是上海普元信息技术有限责任公司自主研发的面向构件的中间件,是基于J2EE之上的面向构件的完整的互联网应用体系。普元EOS工作流是与EOS面向对象中间件平台无缝集成的工作流管理系统。EOS工作流平台是普元公司结合我司的实际业务需要,在我司相关人员参与下完成的基于web模式的工作流管理系统。我司于2005年引入EOS面向对象中间件平台,2006年引入工作流平台,两年来工作流平台已成为我司服务保障系统、电子运维系统的重要组成部分。从安徽服务保障系统一期到中国电信集团电子运维系统、从山西网通电子运维系统到四川公用信产电子运维系统二期,到处都有工作流平台的身影。但因为公司项目紧,好多员工的培训不彻底,导致在项目开发过程中对流程开发不是很清楚,下面就我的理解对流程开发过程中的一些概念和方法做一点简要说明,希望对大家有些帮助。一、何为流程相关数据区大家在EOS的一些文档中应该了解了这个概念。但究本质其实是数据库流程实例表中一个大字段(WFProcessInst表relateData字段),该字段保存是一段xml文形式的字符串。我们可以调用相关数据管理构件包WFRelativeData或者bwflow/bizlet下面的com.starit.bwflow包中的WFRelativeDataManager、WFRelativeConfExtDataManager进行操作,其中WFRelativeDataManager、WFRelativeConfExtDataManager是普元公司为我们公司的工作量平台重构的操作相关数据区的方法,在操作相关数据区时会自动把环节定义ID添加到相关数据区路径中。下面结合集团电子运维项目的一个例子谈一下如何灵活利用流程的相关数据区。如图1示,“派单或结单”环节的参与者可由图1集团服务保障通用流程“是否升级”、“是否升级2”、“待升级2”三个环节设置,而我们的流程平台目前还不能做到这样复杂的配置,但利用流程的相关数据可以很容易就实现了,首先无论是“是否升级”、“是否升级2”或“待升级2”都把要设置的“派单或结单”环节的参与者保存到相关数据区的一个固定节点下面,如sendsheet节点(如果已经存在则覆盖),然后开发一个业务逻辑从相关数据区中取sendsheet节点的值,返回一个参与者list(注意要符合流程引擎的格式,参见EOS帮助文档EOSWorkFlow用户指南概念与活动属性相关的概念什么是活动参与者部分),最后把“派单或结单”环节的参与者设置成有规则逻辑返回值确定,规则逻辑为我们开发的取相关数据区参与者的业务逻辑。虽然流程相关数据区用起来比较方便,但是由于流程相关数据区是常驻数据库的,为了减轻数据库压力,所以我们在使用过程还是要慎重。那么什么情况下使用才好呢?一是对那些数据量较小,而流程前后环节都要使用的信息;二是在流程引擎本身使用的一些业务逻辑(如流程触发事件等)中用到的一些数据;三是那些在流程运转过程中使用,但是有不好用数据库表保存的数据,如上面例子提到的流程参与者情况。最后注意在确定流程不在使用的数据要及时从相关数据区删除。二、流程环节参与者几多设置流程环节参与者,顾名思义就是环节有哪些人来做,这里的参与者是一个集体概念,可以是一个机构,一个具体的人员,也可以是一个角色。如何设置流程环节的参与者是流程开发过程中最重要的组成部分。普元的工作流引擎只支持以下五种参与者设置方式:1、组织机构与角色2、流程启动者3、活动执行者4、从相关数据获取5、从规则逻辑获取这五种参与者设置方式我们运用的灵活性可分为以下两类型:一、直接应用型这种类型参与者格式相对比较固执,我们只有傻瓜式的按照普元公司给的格式去设置,无法做出灵活运用和扩展。像组织机构与角色、流程启动者、活动执行者都是属于这种类型。在运用这类参与者设置方式需要注意下面两点:1、组织机构与角色设置中有一个“是否允许前驱活动根据如上参与者列表指派活动的参与者”选项,是指在已选组织机构列表中指定一个或多个参与者。至于如何指派可参照工作流wfworklist构建包中的相关方法来做。2、活动执行者指的所选环节的具体执行人,是个体概念,具体到每个人,不是最初该环节定义的参与者,如一个流程有A、B两个环节,其中B环节的参与者定义的是A环节的执行者(A环节在B环节前),A还参与者定义的是C机构,而执行者是C机构下面的员工D,那么B环节的参与者就是员工D而非机构C。二、扩展应用型此类参与者设置方式我们可以灵活运用和扩展,从相关数据获取和从规则逻辑获取属于这种类型。这种类型我们在项目开发种应用较多,并且可以解决较复杂的流程设置。下面是这两种参与者设置方式在我们公司不同项目中的灵活应用。1、利用“从相关数据获取”流程平台中“由前面环节指定”选项就是利用“从相关数据区获取”参与者设置方式,保存一个带指定环节定义ID的相关数据区路径,对于这个选项我们在开发过程中不需要考虑太多,在流程平台中定义好,利用bwflow包中的WFRelativeDataManager里的相应方法保存参与者到相关数据区即可。这种应用在公司个流程项目都有应用,但是也有些差别,09年以前的项目,一个活动的参与者只能有一个指定的环节设置,而09年的流程项目,则可以由前面的不同的环节指定,灵活性要强一些。2、同时“从相关数据获取”和“从规则逻辑获取”中国电信集团电子运维项目如图1示,“派单或结单”环节参与者可由多个环节任意一个指定,这里实现方法是在流程相关数据区专门设置一个路径保存参与者信息,如果该路径已经有值的话则覆盖,“派单或结单”在启动时指定一个规则业务逻辑取固定路径下的参与者。3、利用“从规则逻辑获取”加数据库表安徽移动项目的机构加岗位、安徽电信服务保障项目的派单根据都是这种应用,环节参与者是利用一个规则业务逻辑到相关数据库表根据一定的规则取的参与者返回给该环节。4、利用“从规则逻辑获取”加第三方工具如安徽电信服务保障项目规则引擎既是这种方法的典型运用,在此方法中,环节参与者是利用一个规则业务逻辑调用一第三方的规则引擎,把相应的规则条件传给规则引起,规则引擎根据条件得到人员列表返回给该环节。随着公司流程项目的增多,各项目的需求也千奇百怪,这里就要求我们开发人员认真理解需求,同时也要熟悉流程引擎,尽量利用流程引擎现有的参与者设置方式,如果实在不行,要抽象需求模型,在流程平台中做好相应扩展,确保在定义流程时能选到相应的选项。如果“从规则逻辑获取”要注意业务逻辑返回的参与者格式(具体格式可参照EOS帮助文档)。三、连线条件设置一点建议EOS工作流引擎的连线条件实际上也是相关数据区的一个节点值。在我们的流程平台中则是一个带有环节定义ID和操作输出值表达式的一个节点值,在每个环节结束前用bwflow包中的WFRelativeDataManager里的相应方法保存操作输出表达式到相关数据区即可。对于连线和操作在我们的工作流平台中已经比较成熟,但是对开发过程中的一些误区我想这里做两点说明:一是操作的输出表达式,不知道出于什么考虑,大家喜欢一个操作只对应一个表达式,其实一个操作是支持多个输出表达式的,无论是前端操作还是后端操作。如对于“审核”操作,其实一个审核按钮,两次操作输出表达式就可以了,可是大家都喜欢定义两个操作“审核通过”和“审核不通过”,当然不是说不可以,只是感觉有些别扭。二是关于输出表达式的编码,大家在定义是都是使用optId,这在单一分支、单一具体、全部分支和全部聚合时可以正常运行,但是在多路分支和多路聚合时就会出现逻辑错误,后边设置的值会把前面设置的值覆盖掉,导致流程无法正常流转,因此建议大家在定义操作的输出表达式时应注意,特别是出现多路分支和多路聚合的地方。四、环节、工作项、参与者之间的关系对于这三者的关系,我想很多同事都不太清楚或者不是很清楚。具体为一个人工环节实例可对应一个或多个(自动环节无工作项),一个工作项对应一个或多个参与者。但不管工作项的个数有多少相关人员每个人至多只能执行一个。详细说明参见EOS帮助文档EOSWorkFlow用户指南概念与活动属性相关的概念什么是多工作项部分。在工作流平台中定义时对于人工环节属性的“并发”选项。以上几点是本人对EOS工作流的理解和心得,也许有些地方有误,希望各位同事能指出,我们一起共同学习。EOS工作流引擎是普元公司的产品,规则和标准都是有他们来定,我们只有合理利用他们的规则来开发我们的应用程序。大家也许有感觉有诸多不便,但是没有办法,规则是人家制定的,我们要想使用,只有遵守。什么时间我们公司能有自己的工作流,自己定义规则,我想大家到时都会有更好的发挥,期待这一天!薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿羁膂莈蚅袇膁蒀蒈螃膀膀蚃虿腿节蒆羈芈莄蚁袄芈蒆蒄螀芇膆蚀蚆袃莈蒃蚂袂蒁螈羀袁膀薁袆袁芃螆螂袀莅蕿蚈衿蒇莂羇羈膇薇袃羇艿莀蝿羆蒂薆螅羅膁蒈蚁羅芄蚄罿羄莆蒇袅羃蒈蚂螁羂膈蒅蚇肁芀蚁薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿羁膂莈蚅袇膁蒀蒈螃膀膀蚃虿腿节蒆羈芈莄蚁袄芈蒆蒄螀芇膆蚀蚆袃莈蒃蚂袂蒁螈羀袁膀薁袆袁芃螆螂袀莅蕿蚈衿蒇莂羇羈膇薇袃羇艿莀蝿羆蒂薆螅羅膁蒈蚁羅芄蚄罿羄莆蒇袅羃蒈蚂螁羂膈蒅蚇肁芀蚁薃肀莂蒃袂肀肂虿袈聿芄薂螄肈莇螇蚀肇葿薀罿肆腿莃袅肅芁薈螁膄莃莁蚇膄肃薇薃膃芅荿螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁螆膈艿蚇螅芀蒄薃螄羀芇葿袃肂蒃螈袂膄芅蚄袂芇蒁蚀袁肆芄薆袀腿蕿蒂衿芁莂螁袈羁薇蚇袇肃莀薃羆膅薆葿羆芈荿螇羅羇膁螃羄膀莇虿羃节芀薅羂羂蒅蒁羁肄芈螀羀膆蒃蚆肀芈芆薂聿羈蒂蒈肈肀芅袆肇芃薀螂肆莅莃蚈肅肅薈薄蚂膇莁蒀蚁艿薇蝿螀罿荿蚅蝿肁薅薁螈膄莈薇螈莆膀袆螇肆蒆螁