《XBPM开发指南V1[1].0.doc》由会员分享,可在线阅读,更多相关《XBPM开发指南V1[1].0.doc(22页珍藏版)》请在三一办公上搜索。
1、1 目标读者希望使用XBPM做业务流程开发的开发人员。必须有一定流程概念。XBPM开发人员必须具有Ta+开发知识。2 名词解释2.1 XBPMXBPM是基于java开发并且集成于Ta平台的一个业务流程开发框架,包括了流程引擎和满足社保业务流程开发的支撑框架以及一个绩效分析的基础支撑。 2.2 JPDLJPDL是基于xml的流程设计的承载文件。2.3 流程引擎负责解析业务流程定义,协调处理活动间的路由,处理客户端的请求(如启动流程、提交工作项、查询工作项、工作流监控等),处理引擎自身的调度(比如自动归档、时限控制等)。它会提供一些客户端API让你控制流程和查询流程。2.4 流程定义对一个业务过程
2、通过抽象以流程图的方式进行定义,改定义通过xml文件承载,里面描述了业务环节之间的前后因果关系。已经流程的标识、名称。2.5 流程实例相对于流程定义,流程实例是该业务具体经办了某一对象或事件所形成的实际例子。2.6 参与者策略参与者策略是针对Task(人工)节点的概念。每个人工节点都应该有对应的处理人员。而这些人的选择可以通过角色,部门,岗位,甚至是前面执行过的Task节点的执行者来最终确定一些人员作为Task的处理人员。在社保业务系统中,一个Task任务只会有一个人处理,也就是任务是抢占式的,其中一个人处理了其他人就不在看见这个任务了。注意:流程的第一个节点不需要设置参与者策略,流程的启动权
3、限是放在菜单里授权的,也就是是否有经办此业务流程的权限还是通过流程菜单授权进行控制。2.7 流程变量将每一个流程实例有且仅有那份流程相关数据存放在流程实例一个数据容器中,该流程下的所有活动实例共享该容器。这些数据可以被XBPM流程引擎自动使用,作为流程实例推进和各活动实例状态变迁的依据;也可以被该流程实例所调用的应用程序访问或修改。 流程变量在目前XBPM版本只有在流程实例运行范围内存在。2.8 业务主键贯穿业务流程始、终的一个业务主线,通过他能够找到此次业务流程实例所经办的是那个对象的那个业务,在后继节点中能够通过它来唯一确定所做的是那件事情。2.9 任务列表任务是用户从流程引擎获取到的自己
4、有权限处理的任务的队列。任务是业务流程每个Task节点所生成的,那么某一个经办人的任务列表就是根据此人在这些Task节点中的权限来过滤出自己有权限处理的那些任务。任务又因为参与者策略的不同或人员对任务的领取导致任务分为“我的任务”和“可办任务”。我的任务:1、 参与者策略设置的时候就是指定此人来处理。2、 通过“可办任务”点击处理但是确没有真实处理完成业务而退出业务操作界面。此时流程引擎认为你已经领取了此任务,所以该任务成了你的任务,他人不处理(不能看见)。可办任务:参与者策略设置为某一角色、部门等最终形成改任务为多人可选参与人时候,该任务定义生成任务的时候就会在这些多人可选参与人的“可办任务
5、”中看见。3 开发环境要求3.1 JDK:jdk1.63.2 Tomcat6(以此为例)/weblogic10.2/jboss3.2.1 更改Tomcat的默认启动编码为UTF-8找到$(tomcat_home)/conf/server.xml里面的Connector标签,里面增加属性URIEncoding=UTF-8,更改后类似如下:3.2.2 配置虚拟目录找到$(tomcat_home)/conf/server.xml里面的Host标签,里面增加标签context,更改后类似如下: 其中docBase里面的路径根据你的tomcat路径做相应的改动。注意:$(tomcat_home)是tom
6、cat6安装路径,以下皆是。3.2.3 替换更改el-api.jar包1. 删除$(tomcat_home)/lib/el-api.jar包。2. 从XBPM发布包中找到juel.jar包,将其拷贝到$(tomcat_home)/lib目录下。注意:其实这两个包是功能相同版本不一的包,只是名字不同。3.3 Eclipse3.3,Myeclipse6.5,eclipse3.51. 其中eclipse3.3+MyEclipse6.5用于业务与流程开发。2. Eclipse3.5用于流程设计,需要下载流程设计插件。也可以从银海公共信息门户里的产品博客下载eclipse3.5(已经集成了流程设计插件)
7、。注意:为了jpdl文件编辑的时候对中文更好的支持,需要修改启动文件eclipse.ini文件,加入: -Dfile.encoding=UTF-8。说明:由于流程设计插件对Eclipse的要求最低版本是3.5,但是3.5版本的Eclipse有没有对应的MyEclipse支持,所以暂时用两个Eclipse。3.4 weblogic部署需要修改相关启动项目。由于流程使用的antlr.jar包与weblogic103版本中的同类jar包冲突,所以需要修改使用新的jar包。1、 windows平台解决办法首先,将发布包中的antlr.jar包复制到E:beauser_projectsdomainsmy
8、domainbin目录中。然后,找到E:beauser_projectsdomainsmydomainbin startWebLogic.cmd(根据实际安装调整)文件中的set CLASSPATH=%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH% 这一行,在这一行之后添加如下一行内容:set CLASSPATH=E:beauser_projectsdomainsmydomainbinantlr.jar;%CLASSPATH%实际路径根据安装调整。2、 unix平台解决首先,将发布包中的antlr.jar包复制到E:beauser_projectsdomainsm
9、ydomainbin目录中。然后,找到E:beauser_projectsdomainsmydomainbin startWebLogic.cmd(根据实际安装调整)文件中的CLASSPATH=$CLASSPATH$CLASSPATHSEP$MEDREC_WEBLOGIC_CLASSPATH这一行,在这一行后添加一行如下:CLASSPATH=”/ bea/user_projects/domains/mydomain/bin/antlr.jar:$CLASSPATH”4 流程设计流程设计的承载是以“.jpdl.xml”为结尾的XML文件,俗称JPDL文件。流程的设计工具:基于Eclipse3.5
10、的流程设计插件。4.1 JPDL文件内容简介JPDL文件时XBPM流程的流程设计承载文件,以.jpdl.xml为文件后缀名。文件名构成规定:流程名+“.jpdl.xml”,比如changeinfo.jpdl.xml。注意:所有节点的g属性是流程图用以记录位置的,请勿手工修改。流程示例:该流程的JPDL文件如下: 个人信息修改流程 4.1.1 process标签process标签是JPDL文件根节点的标签,是对一个流程的总的描述。属性作用Key流程定义唯一名称(这里规定必须是拼音或英文命名),该属性需要在source状态下手工增加。Name这里规定与流程key相同内容4.1.2 descript
11、ion标签该标签用与对流程做中文描述,比如“个人信息修改流程”。注意:在XBPM开发中每个流程都必须使用该标签,写明流程的中文名称,该标签需要在source状态下手工增加。4.1.3 start标签流程的开始节点。每个流程都必须有开始节点,而且不能有多个开始节点。属性作用name节点名称,一般写“开始”form第一个人工节点功能的url路径,参考task节点的form说明4.1.4 end标签流程的结束节点。每个流程都应该有结束节点,而且可以有多个结束节点,但是只要有一个结束,整个流程将结束,其他正在运行的节点都会被结束。4.1.5 task标签人工节点。对应流程中每个需要人工交互的功能模块。
12、Task节点需要在流程文件部署后对每一个Task节点进行参与人策略的设置(具体参考XBPM用户手册)。属性作用name节点名称,与该节点对应的操作功能模块名称对应。form节点对应功能模块的URL路径。form属性的说明:form属性其实就是该节点所对应功能模块的Action地址。该地址从web.xml配置的config/yhxnb /WEB-INF/struts-config-yhxnb.xml路径作为开始,比如:在struts-config-yhxnb.xml 文件中的一个功能的路径为“/person/personregAction”,那么在form属性中就应该配置为“/yhxnb/per
13、son/personregAction.do?reqCode=init”,这里注意,reqCode是访问的action哪个方法,这个参数必须配置,即使是init方法也必须配置。4.1.6 decision标签路由决定标签,主要功能是根据用户提供的流程变量或接口实现来决定下一步路由走向,decision只能决定走其中一条路。如下例子:其中“#content”是EL表达式,它会自动从流程变量里面获取以content为key的值,当然之前放到流程变量中的content的值必须是good、bad、ugly三个其中之一,否则系统会报错。decision节点的前面一个人工节点就应该通过人员界面选择或计算所
14、得放置用以判断走向的流程变量,比如content必须放置“good、bad、ugly”其中之一。4.1.7 fork标签在流程有多个外向分支的时候需要使用fork。4.1.8 join标签在使用fork多个分支出来后,如果有需要等待多个分支汇聚才能继续往下走,需要使用join。4.1.9 transition标签路由标签,用来连接节点与节点之间的路径。5 流程开发5.1 流程部署功能:每个流程定义(JPDL)都需要部署到服务器中才可以运行该流程。流程部署需要在XBPM提供的“流程部署”的功能进行部署。流程部署分为两步:1、 将定义好的JPDL文件打成zip包。这里使用rar或zip软件进行打包
15、。操作如下截图:这里规定:将压缩文件格式选择为zip,压缩文件名改成changinfo.zip。2、 部署打包好的zip文件通过流程定义文件上传,将打包好的zip文件上传。点“浏览”选择zip文件后,点上传。上传完成后点“部署”按钮。如果部署成功,会在“已部署流程定义”列表中体现。部署好流程后还需要配置流程菜单才能看到启动流程首页。请看下节。5.2 流程菜单配置在系统管理找到资源管理模块。如下图:找到需要增加的位置,点“新建应用菜单项”在弹出的页面中填入“流程名称”和“访问地址”,如下图:访问地址的填写需要注意:每个流程菜单的访问地址都是: processAction.do?reqCode=i
16、nit&dto(_processName)=changeinfo唯一不同的是dto(_processName)后面的参数,这个参数就是流程定义的唯一标识key。配置完成后还需要给相应的人员授权,才能看到菜单。正确配置后应该系统人员登录应该可以看到该流程的首页了:5.3 流程业务主键配置流程业务主键主要是在流程访问首页作为该流程的查询条件展现。通过数据库表 JBPM4_BODEFINE表来定义,该表定义如下:业务主键可以是多个联合构成,也就是一个流程可以配置多条查询条件。如下图最后一条记录,该流程只有个人编号作为业务主键:配置完成后刷新流程首页,点击“查看过往业务流程”可以看到查询条件里多了个人
17、编号:完成了以上步骤还不能启动流程,接下来必须编写每个Task(人工)节点的功能模块。请看下节。5.4 Action与Jsp开发与配置 Action开发每个Task(人工)节点都应该有人工处理界面,即该环节的功能模块。以前面定义的“个人信息修改流程”为例。我们应该建立4个action和对应的jsp。1. ChangeInfoAction - changeinfo.jsp2. ChangeInfoZBAction - changeinfozb.jsp3. ChangeInfoSPAction - changeinfosp.jsp4. ChangeInfoRSAction - changeinfo
18、rs.jsp每个action的示例代码请看发布包中对应的文件。注意:Struts-config文件配置的ActionForm必须使用ActionFormForXBPM jsp开发1、 每个jsp页面都应该在form标签内加入2、 每个jsp页面都应该标签中的key写上当前Task节点的节点名称。这个是为了保证页面路径显示的正确性,比如:框架会根据你写的key自动将当前名称加入到上图的路径最后,以表示当前经办的节点。5.5 Service开发以前面定义的“个人信息修改流程”为例,我们建立了“ChangeInfoService”和“ChangeInfoServiceImpl”,具体请查看请看发布包
19、中对应的文件。5.5.1 XBPM客户端调用方法说明 completeFirstTask (processdomain)u 针对第一个Task节点完成的时候调用 u 传入processdomain,针对第一个节点processdomain中必须设置如下项目: l processDomain.setProcessKey(processKey)/流程定义key l processDomain.setAssignee(userId);/当前经办人员idl processDomain.setSyab003(syab003);/经办人员所在分中心 l processDomain.setByab003(b
20、yab003);/参保人员所在分中心 l processDomain.setBusinessMainObj(key1);/业务主键 completeTask (processdomain)u 非第一个Task节点完成的时候调用 u 传入processdomain,针对第一个节点processdomain中必须设置如下项目: l processDomain.setTaskId(taskId);/任务id getVariable(tasked,“变量名”);通过界面获取到当前任务id String taskId = cForm.getDtoAsString(XbpmClientService.TA
21、SKID);根据任务id来获取流程变量String userid = (String)xbpmClientService.getVariable(taskId, userid); isBoInProcessInstance(processKey, key)/判断是否此人已经有该流程在办理String processKey = dto.getParamAsStr(ProcessTempleteService.PROCESSKEY); Key key = new Key();key.put(userid, userid);boolean inProcessInstance = xbpmClient
22、Service.isBoInProcessInstance(processKey, key);if (inProcessInstance) throw new AppException(此人已有该流程在办理,请核实);5.6 电子档案集成开发待完善.5.7 Task节点参与者策略配置以developer用户登录,找到流程管理-流程参与者定义,如下图找到需要定义的流程点“定义”图标,下面的流程图会变成选择的流程图。然后逐一对人工节点进行参与者策略的设置。比如单击“准备审批材料”节点,该节点的参与者为前一节点的操作者,那么在弹出的设置界面就可以设置为如下图:针对“审批”节点我们可以设置它为某一角色
23、来经办。比如我们设置为“审批岗”这一个角色,如下图:对于上图标记的“是否限定参与者在经办对象所属分中心”的选项,如下解释:这个选项主要是社保应用有分中心的概念,比如成都市锦江区的人可以到武侯区的某一社区经办机构去办理业务,那么该业务需要上级审批的时候,系统会根据该参保人所在分中心来确定审批任务应该是该分中心的审批人员来审批,而其他分中心同角色的审批人员不会看到这个任务。那么针对新农保的应用也可以这么理解,通过限定参与者在经办对象所属分中心,A村人的业务职能由A村所在县的业务人员来处理,而其他县的同类角色的人看不到非本县人员的业务申请。 补充说明这个问题。6 FAQ6.1 报“业务主体Key不能
24、为空“错误什么原因?1、 请查看你的JSP页面的Form标签内是否引入了processInc.jsp文件。2、 strutsconfig配置文件中actionform是否为ActionFormForXBPM。3、 流程菜单配置的时候dto(_processName)后面是否加上了流程定义key。6.2 前后节点均是同一参与人均有权限为什么不能自动跳转到下一页面?1、 可能是你的tomcat配置文件中的编码不是UTF-8,,请检查,如果不是请更改后,从新设置流程每个节点的参与者策略。2、 action在业务执行完后没有加入如下代码,而且service中必须在outputDTO中put进去流程实例
25、id。if (outputDTO.get(instanceId) != null) ActionForward forward = xbpmClientService.getForward(us.getUser().getUserId(), outputDTO.getAsString(instanceId);if (forward != null) return (forward);6.3 节点结束后下一结点的参与人为什么任务台没显示?1、 下一节点没有设置参与者策略2、 可能是你的tomcat配置文件中的编码不是UTF-8,,请检查,如果不是请更改后,从新设置流程每个节点的参与者策略。6.4
26、 下一个节点为什么没有消息提示?1、 你的toptj.jsp没有引入消息的脚本。script language=JavaScript type=text/javascript src=/resource/javascript/showMyMsg.js var interval = 5000;/5miaofunction showMessage()if(!bShow)$.ajax(type: POST,url: Getmsg.jsp,success: function(o)var oXmlTmp = new ActiveXObject(Microsoft.XMLDOM);oXmlTmp.load
27、XML(o);o = oXmlTmp;var s = success10000;if(s=success10000)var msgBody = o.selectSingleNode(/msgs/msg).text;var msgNum = o.selectSingleNode(/msgs/succ).text;if(bShow = (msgNum!=false) & msgBody!=) try var MSG1 = new CLASS_MSN_MESSAGE(消息提醒,320,200,您有消息,msgNum,msgBody); MSG1.rect(null,null,null,screen.
28、height+50); MSG1.speed = 10; MSG1.step = 5; MSG1.show();catch(e)else / showMsgInt = window.setTimeout(showMessage(), interval);,error:function(o)/alert(error);window.clearInterval(showMsgInt););window.setTimeout(showMessage(),2000);if(isShowMyMsg) showMsgInt = window.setInterval(showMessage(), interval);6.5 Task不能正确的跳到相应的经办界面1、 流程定义的时候,Task的Form属性的action路径写的不对。请参考4.1.5task标签中队form的说明。6.6 报taskId为空必须放在标签中