注意:如果NC中间件管理了多个帐套,则它们共享统一的动作脚本。
3.1 执行脚本编写
在脚本里可以对从UI端传递过来的单据聚合VO进行业务处理,这其中就包含有对审批流的处理。[单据动作执行脚本]功能点为方便执行脚本的编写,提供了单据类型注册的应用函数以及常用语法宏。
在开发环境中,我们一般把通过功能点生成的诸如N_40_APPROVE.java动作脚本源文件导入到项目中进行开发。但如果直接对源文件进行修改,记得要修改相应的getCodeRemark()方法,否则通过功能节点打开时,将会看到不一致的脚本。
下面对单据动作脚本中与审批流相关的常用语法宏进行分析。当然,完全可以不使用下述的语法宏而直接使用Java标准语法来编写动作执行脚本。
动作脚本类图:
nc.bs.pub.compiler.IPfRunAbstractCompilerAbstractCompiler2nc.bs.pub.action.N_88_SAVEN_30_APPROVE>>>
常用语法:
第 43 页
语法宏与实际代码的对照表: 单据动作处理 语法宏 setParameter(\setParameter(\setParameter(\setParameter(\setParameter(\setParameter(\runClassCom@\&PFBILLTYPE:String,&PFDATE:String,&PFFLOW:nc.vo.pub.pf.PfUtilWorkFlowVO, &PFVO:nc.vo.pub.AggregatedValueObject, &PFUSEROBJ:Object\@; runClass(\&PFBILLTYPE:String,&PFDATE:String,&PFFLOW:nc.vo.pub.pf.PfUtilWorkFlowVO, &PFVO:nc.vo.pub.AggregatedValueObject, &PFUSEROBJ:Object\if (retObj != null) { m_methodReturnHas.put(\} 单据动作批处理 setParameter(\setParameter(\setParameter(\setParameter(\setParameter(\setParameter(\runClassCom@\&PFBILLTYPE:String,&PFDATE:String,&PFVOS:nc.vo.pub.AggregatedValueObject[], &PFUSEROBJS:Object[],&PFFLOW:nc.vo.pub.pf.PfUtilWorkFlowVO\@; runClass(\&PFBILLTYPE:String,&PFDATE:String,&PFVOS:nc.vo.pub.AggregatedValueObject[], &PFUSEROBJS:Object[],&PFFLOW:nc.vo.pub.pf.PfUtilWorkFlowVO\vo,m_keyHas,m_methodReturnHas); if (retObj != null) { m_methodReturnHas.put(\ 审procActionFlow@@; 批处Object m_sysflowObj= procActionFlow(vo); 理 //###返回值:流程仍处于审批进行中时直接返回IWorkFlowRet if (m_sysflowObj!=null){ return m_sysflowObj; } 批审Hashtable m_sysHasNoPassAndGonging= procFlowBacth@@; 第 44 页
批Hashtable m_sysHasNoPassAndGonging= procFlowBacth(vo) ; 处理 弃procUnApproveFlow@@; 审处boolean isFinishToGoing = procUnApproveFlow(vo); 理 //###返回值:true-审批流程由完成态返回到运行态;false-其他情况 批弃审处理 procUnFlowBatch@@; for (int i = 0; i < getVos().length; i++) { setVo(getVos()[i]); boolean isFinishToGoing = procUnApproveFlow(vo); //###返回值:true-审批流程由完成态返回到运行态;false-其他情况 }
注意:单据批动作处理必须与批量的动作脚本相对应!
3.2 返回值
流程平台对某些动作脚本执行后的返回值具有特殊的要求,单据动作调用会对其进行特殊的处理。 返回对象 IWorkFlowRet Object[]数组 ArrayList String PfUtilActionVO IProcActionRetObject 取值 第一个元素为IWorkflowBatch对象 单据Id 说明 一般用于审批的动作脚本,且在流程审批进行中时才返回该对象。 一般用于批动作处理的动作脚本。 一般用于送审SAVE或EDIT的动作脚本,以便从返回值中获得单据Id。 UI端PfUtilClient动作处理完后显示UI界面(DLG或PNL) UI端PfUtilClient会执行业务组的前台动作执行后处理 第 45 页
4. 审批流平台
4.1 审批状态回写与查询 4.1.1状态回写
分为两种,一种是对单据聚合VO的回写;一种是对单据数据库表的回写,是在审批流检查类中完成。参见4.6.1节。
4.1.2状态查询
后台API:
int nc.bs.pub.pf.PfUtilBO.queryWorkFlowStatus( String busiType, //业务类型PK String billType, //单据类型PK String billId) //单据Id
返回值: 常量 IWorkFlowStatus.NOT_STARTED_IN_WORKFLOW IWorkFlowStatus.WORKFLOW_ON_PROCESS IWorkFlowStatus.WORKFLOW_FINISHED IWorkFlowStatus.BILLTYPE_NO_WORKFLOW IWorkFlowStatus.BILL_NOT_IN_WORKFLOW IWorkFlowStatus.ABNORMAL_WORKFLOW_STATUS 对应的内部状态 IPfRetCheckInfo.COMMIT IPfRetCheckInfo.GOINGON IPfRetCheckInfo.PASSING IPfRetBackCheckInfo.NOSTATE IWorkFlowStatus.NOT_APPROVED_IN_WORKFLOW IPfRetCheckInfo.NOPASS
4.2 送审
送审也称为提交,就是单据产生后进入到流程平台并启动审批流的步骤,通过调用单据动作处理来完成。审批流的触发支持两种单据动作,分别为“SAVE”和“EDIT”,即动作编码以两者结尾即可。送审后,流程平台会根据单据类型和制单人ID查找符合条件的流程定义并实例化然后启动它。如果找不到流程定义,则不启动审批流。
送审分为两种情形,一种是前台送审,即业务UI新增单据后保存并提交;另一种是后台送审,即某张单据在后台推式生成另一张单据时。
第 46 页
4.2.1动作处理
前台送审调用示例:
Object retObj = nc.ui.pub.pf.PfUtilClient.processAction(parentUI, “SAVE”, “D1”, “2005-05-30 12:23:44”, billVo, userObj, null, null )
如果单据数据billVo中没有保存制单人的信息,则可通过动作编码来传递。但要求原动作编码不能长于20个字符。
Object retObj = nc.ui.pub.pf.PfUtilClient.processAction(parentUI, “SAVE”+billMakerUserId, “D1”, “2005-05-30 12:23:44”, billVo, userObj, null, null )
后台送审调用示例:
Object retObj = new PfUtilBO().processAction(
“SAVE”, “D1”, “2005-05-30 12:23:44”, null, billVo, userObj )
前台送审与后台送审的区别在于,前台送审会先向服务器获取流程定义中第一个审批人的可指派信息,以便于与客户端交互。而后台送审则默认为不可指派。
对于单张单据的送审,也可以按照批量的方式来处理(这种应用在NC财务和供应链产品中比较常见),这时VO数组中传递的就是一张单据。
4.2.2动作脚本
送审的动作脚本没有特殊的要求,可以在脚本中进行单据VO的保存,也可以对单据VO进行更新。但如果单据UI的开发使用了UI工厂,为了维护单据数据的一致性,可在脚本中调用如下方法来保存单据并更新聚合VO。
retObj=runClass(\\
或者
SuperVO headVO = (SuperVO) billVo.getParentVO(); //主表必须为SuperVO SuperDMO dmo = new SuperDMO();
//从数据库获取到更新了ts的VO
billVo.setParentVO(dmo.queryByPrimaryKey(headVO.getClass(), headVO.getPrimaryKey()));
注意:NC30要求送审的动作脚本必须返回ArrayList或String类型的对象,在NC31中并没有这种限制了,但前提是单据聚合VO中包含有完整的单据号和单据ID信息。
第 47 页