U8开发之工作流集成.docx
《U8开发之工作流集成.docx》由会员分享,可在线阅读,更多相关《U8开发之工作流集成.docx(42页珍藏版)》请在冰豆网上搜索。
U8开发之工作流集成
U8工作流集成
1.摘要
工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动、最终达到协同多人或服务共同完成工作任务的目的。
工作流系统的使用过程分为三个阶段:
设计时、配置时、运行时;设计时阶段需要完成流程模型设计;配置时阶段需要完成系统的运行环境配置、工作流模型发布及版本管理等工作;运行时阶段需要负责发起和完成流程实例等工作。
U8系统安装完毕后,首先需要配置HR基础档案数据和运行参数。
工作流程流转中需要人工参与的活动(比如审批)是以HR档案数据为基础进行流转的,包括人员的组织结构、岗位、职位等,人员和操作员的对应关系,这些数据需要在配置时录入完成。
工作流在流转时需要和外界交互,包括消息、邮件审批、UTU审批等,这些交互需要一些运行参数,比如邮件服务器的设置、应用服务器的外网地址、UTU服务器等,这些运行时参数也需要提前配置好。
环境配置完毕后,可以进行流程模型设计工作。
通过流程设计器,设计过程中结合UAP工具中设计出来的业务对象和单据本身的模板和数据,生成流程模型。
流程设计器设计出来的流程模型还不能直接投入使用,还需要“流程发布”,发布后的流程模型才能进入系统准备运行。
流程模型发布后,业务应用就可通过消息发送接口发送特定类型的消息,消息通知工作流引擎,生成对应的流程实例,在流程实例处理过程中调用业务服务、生成需要人工交互的任务项、并最终协调完成流程实例的处理。
流程实例可以被流程实例管理模块加以管理、修改。
2.概念说明
1)审批
●提交:
启动流程实例,单据开始在流程中流转
●审批之同意:
审核单据内容并批准,流程流向下一个节点;审批在流程模型中的类型是人工节点
●审批之不同意:
1)流程继续:
对单据内容表示不同意见,但允许流程向下一个节点流转
2)退回某一个审批人:
对单据内容表示不同意见,流程回退到某一个审批人重新审批
3)退回提交人:
对单据内容表示不同意见,流程回退到开始节点
●弃审:
放弃对单据的审批,流程回退,单据处于待审状态
●撤销:
流程完全回退,整个流程实例被撤销,单据回到开立状态
●重新提交:
当流程被退回到开始节点,需要执行重新提交操作,重新发起流程
●审批进程:
以时间先后顺序列示审批过程,包括审批人、审批时间、审批意见、审批动作等
●驳回:
审批不同意并退回给提交人
●转签:
审批人将当前审批任务转给另外一个人完成
●工作任务委托:
审批人可以按单据类型将审批任务委托给别人代为进行,和转签的区别是:
转签针对一张单据,工作任务委托针对一种单据类型的所有单据
●邮件审批:
工作流引擎可以给审批人发送一封邮件,其中包括了待审单据的内容,收件人可以直接在邮件正文或者打开邮件附件完成单据的审批操作
●UTU审批:
工作流引擎可以给UTU发送一条待审消息,审批人可以在UTU中完成审批操作
●快速审批:
在CS和BS的消息中心中,可以不用打开单据,直接根据待审任务完成单据的审批
●自动提醒:
当流程停在某一个审批节点一定时间后,工作流引擎可以给审批人发送消息提醒其尽快审批
●自动转签:
当流程停在某一个审批节点一定时间后,工作流引擎可以将当前审批任务转签给指定的另外一个人
●邮件审批模板:
发送给接收人的审批邮件、审批UTU消息、快速审批任务,附带的单据内容和格式是根据设定的邮件审批模板确定的
2)流程设置
●本人逐级弃审:
不能弃审掉别人对单据做的审批,并且弃审的时候不能选择弃审到的节点,必须由审核人自己弃审。
●必须制单人提交:
提交人和制单人必须是同一个人
●判断用户数据权限:
在审核、弃审、撤销的时候,系统会判断当前操作人对前面已经完成审批的的人员的“用户”类别数据权限,这个数据权限可以在系统里的“数据权限控制”中的“记录级权限”中设置
●流程发起规则:
针对一种单据可以定义多个流程模型,在“提交”时,每张单据用数据配置流程发起规则,单据最终按照匹配成功的流程模型走流程。
●审批中修改控制:
执行单据审批时可以修改单据的某个字段,配置时以单据的字段级权限为基础
●邮件审批发送表头附件:
发送待审邮件的时候是否将单据上的表头附件一起发出
3.目标
本文主要介绍工作流的基本概念、使用方法、二次开发方法,主要面向二次开发人员。
4.开发指南
4.1.工作流二次开发流程图
在上述流程涉及到业务系统开发人员的活动中,服务开发、服务注册、预制业务对象、编写预制运行时活动插件、编写客户端审批提交代码等工作是在业务模块中实现审批功能都可能涉及的动作。
4.2.服务开发
本处服务是指业务部门提供能、为了能满足特定业务功能而实现的组件中的方法;这些服务可在流程设计过程中运用于流程模型,体现为流程模型中的自动服务。
服务开发无特别约定,服务内部如果需要CallContext、发起人等工作流系统内置变量信息,可以在流程设计过程中,指定变量->服务传入参数的映射方式来获得。
流程模型内置变量:
变量名
类型
说明
ActivityName
string
[活动名称]
StartPerformer
string
[流程发起人工号]
CurrentPerformer
string
[执行者工号]
StartTime
string
[流程发起时间]
ActivityStartTime
string
[活动开始时间]
ActivityDelay
string
[延迟时间]
StartPerformerName
string
[流程发起人姓名]
CurrentPerformerName
string
[执行者姓名]
KeySet
string
[人工活动UNDO接口参数KeySet]
CalledContext
object
[人工活动UNDO接口参数CalledContext]
CallResult
string
[人工活动UNDO接口返回值]
LoginContext
object
[工作流构造LoginContext对象]
在工作流模型中,自动活动所调用的服务需要预先注册到MOM上,注册过程如下:
1)如果MOM上没建立所属子产品功能点,则首先建立该子产品功能点;建立方法:
打开U8API资源管理器,在U8WorkFlow下注册子分类目录,如下图:
2)在所属子产品功能点的“服务接口”节点上,注册服务接口,如下图:
进入注册服务接口界面后,首先设置服务接口编码和服务接口名,服务接口编码是用于识别该注册服务的,要求在同一子产品节点下编码惟一。
然后需要设置服务接口定义/描述(如果是.NET组件,需要考虑调用路径问题!
):
MSDCOM(1.0)注册
DotNetAssemblyForRPC组件注册
MSDCOM(RPC)注册
设置服务路径时可以使用MOM预置的三个宏变量:
%U8SOFT%表示U8安装目录
%UFCOMSQL%表示ufcomsql目录
%U8APPSRV%表示u8应用服务器
例如:
注册:
D:
\U8SOFT\SA\MyLib.DLL组件,
使用宏变量后应该为:
%U8SOFT%\SA\MyLib.DLL
自动服务开发中的参数约束
1、所有参数类型必须是基本类型和可SOAP序列化的类型;
2、非基本类型的参数必须部署在GAC中;
3、对于部署在本地的服务,支持ref,out参数(VB的ByRef同ref);
4、对于VB中声明为ByRef的参数,必须是Variant类型。
支持的基本类型包括:
"void",
"string",(对应设计器变量类型string)
"short",(对应设计器变量类型float)
"int",(对应设计器变量类型int)
"long",(对应设计器变量类型int)
"double",(对应设计器变量类型double)
"bool",(对应设计器变量类型bool)
"datetime",(对应设计器变量类型datetime)
"object"(对应设计器变量类型object)
如果工作流实例中,对该服务调用后,由于某些原因,流程实例回滚(Rollback)时,该服务也需要回滚,则该服务还需要注册对应的Undo接口信息。
约定Undo接口方法名为Un+方法名,参数、返回值同原注册的服务方法一致。
为了能正确描述Undo接口,需要在扩展属性中增加3个属性:
undo_class:
如果是COM就表示为progid,是.Net表示为类的完全限定名
undo_type:
assembly,com
undo_location:
当是.Net程序的时候表示为程序集的名
如下图:
服务例代码
4.3.人工活动插件开发
插件必须包含如下三个方法,名称可以不同,但参数必须一致
接口:
publicinterfaceIAuditPlugin
{
boolUndoAudition(stringprimBizData,stringauditAction,refstringbizdata,objectcalledCtx,refstringerrMsg);
boolDoAudition(stringprimBizData,stringauditAction,refstringbizdata,objectcalledCtx,refstringerrMsg);
boolHandleBizException(stringprimBizData,stringauditAction,refstringhandleResult,refstringbizdata,objectcalledCtx,refstringerrMsg);
}
primBizData:
KeySet
参数:
auditAction的取值
///
///审批动作枚举类型
///
[Serializable]
publicenumAuditAction
{
Submit=0,//提交
Agree=1,//同意
Disagree=2,//不同意
Dispatch=3,//转签
Reject=4,//打回
Revocation=5,//撤销
Return=6,//退回
Abandon=7,//弃审
}
Bizdata:
业务需要传出的参数
handleResult:
是否需要重做,取值ReHandle/UnHandle
C#插件代码示例
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingUFSoft.U8.Framework.LoginContext;
usingUFIDA.U8.Audit.Interface;
usingUFSoft.U8.EX.Common;
usingUFSoft.U8.EX.Common.Args;
usingUFSoft.U8.EX.Server.BusinessObject;
usingUFSoft.U8.EX.Framework.DataModel;
namespaceUFSoft.U8.EX.CreditPlugins
{
classFinalAuditPlugin:
IAuditPlugin
{
#regionIAuditPlugin成员
publicboolDoAudition(stringprimBizData,stringauditAction,refstringbizdata,objectcalledCtx,refstringerrMsg)
{
LoginServicelogin=newLoginService((CalledContext)calledCtx);
OrderBObo=newOrderBO(login);
AuditArgsauditArg=newAuditArgs();
intid=int.Parse(GetVoucherId(primBizData));
bo.GetData(id);
Orderorder=bo.dataasOrder;
auditArg.ID=order.orderHeader.id;
auditArg.Guid=order.orderHeader.guid;
auditArg.ufts=order.orderHeader.ufts;
auditArg.cCode=order.orderHeader.ccode;
auditArg.VarifyState=order.orderHeader.iverifystate;
auditArg.Version=order.orderHeader.iversion;
auditArg.UserName=login.UserInfo.UserName;
auditArg.VerifierDate=login.UserInfo.operDate;
auditArg.Verifier=login.UserInfo.UserName;
auditArg.Row=-1;
bo.BatchAudit(newAuditArgs[]{auditArg});
returntrue;
//thrownewException("Themethodoroperationisnotimplemented.");
}
privatestringGetVoucherId(stringkeySetData)
{
KeySetDataReaderreader=newKeySetDataReader(keySetData);
returnreader["VoucherId"];
}
privatestringGetVoucherType(stringkeySetData)
{
KeySetDataReaderreader=newKeySetDataReader(keySetData);
returnreader["VoucherType"];
}
privatestringGetVoucherCode(stringkeySetData)
{
KeySetDataReaderreader=newKeySetDataReader(keySetData);
returnreader["VoucherCode"];
}
publicboolHandleBizException(stringprimBizData,stringauditAction,stringcontext,refstringhandleResult,refstringbizdata,objectcalledCtx,refstringerrMsg)
{
thrownewException("Themethodoroperationisnotimplemented.");
}
publicboolUndoAudition(stringprimBizData,stringauditAction,stringcontext,refstringbizdata,objectcalledCtx,refstringerrMsg)
{
LoginServicelogin=newLoginService((CalledContext)calledCtx);
OrderBObo=newOrderBO(login);
AuditArgsauditArg=newAuditArgs();
intid=int.Parse(GetVoucherId(primBizData));
bo.GetData(id);
Orderorder=bo.dataasOrder;
auditArg.ID=order.orderHeader.id;
auditArg.Guid=order.orderHeader.guid;
auditArg.ufts=order.orderHeader.ufts;
auditArg.cCode=order.orderHeader.ccode;
auditArg.VarifyState=order.orderHeader.iverifystate;
auditArg.Version=order.orderHeader.iversion;
auditArg.UserName=login.UserInfo.UserName;
auditArg.VerifierDate=login.UserInfo.operDate;
auditArg.Verifier=login.UserInfo.UserName;
auditArg.Row=-1;
bo.BatchUnAudit(newAuditArgs[]{auditArg});
returntrue;
// thrownewException("Themethodoroperationisnotimplemented.");
}
#endregion
}
}
VB插件代码示例:
OptionExplicit
DimserviceAsPuServiceAdapter
PublicFunctionDoAudition(keyDataAsString,auditActionAsString,ByRefbizDataAsString,calledCtxAsObject,ByReferrMsgAsString)AsBoolean
Setservice=NewPuServiceAdapter
DoAudition=service.VerifyVoucher(keyData,auditAction,context,calledCtx,bizData)
EndFunction
PublicFunctionUndoAudition(keyDataAsString,auditActionAsString,ByRefbizDataAsString,calledCtxAsObject,ByReferrMsgAsString)AsBoolean
Setservice=NewPuServiceAdapter
UndoAudition=service.UnVerifyVoucher(keyData,auditAction,calledCtx,bizData)
EndFunction
PublicFunctionHandleBizException(keyDataAsString,auditActionAsString,ByRefhandleResultAsString,ByRefbizDataAsString,calledCtxAsObject,ByReferrMsgAsString)AsBoolean
HandleBizException=True
DimbizDataObjAsNewBizDataMap
bizDataObj.LoadXMLbizData
IfMsgBox(bizDataObj.Value("Error"),vbRetryCancel)=vbRetryThen
handleResult="ReHandle"
bizDataObj.Value("Action")="Retry"
bizDataObj.Value("Check")="False"
Else
handleResult="UnHandle"
bizDataObj.Value("Action")="Done"
EndIf
bizData=bizDataObj.XML
MsgBox"BizData="&bizData
EndFunction
4.4.预置业务对象
业务对象是指审批流程处理的各种类型业务对象(比如:
采购订单、材料出库单、出口订单等)。
新的审批流利用UAP的数据引擎来定义这些业务对象,这样就可以通过修改数据引擎中的业务对象的查询结果来形成不同的业务对象的Schema,从而可以将这些对象的Schema用作流程定义的条件并在流程运行时获取业务对象实例的属性值来进行相应的处理。
4.4.1.UAP数据引擎进行业务对象设计
审批流中用到的是UAP数据引擎中查询结果的数据,具体设计步骤及其与预置数据之间的关系如下:
在数据引擎中添加业务对象
设置业务对象基本属性
为业务对象添加功能
设置业务功能基本属性
为功能添加业务实体关系查询
设置实体关系查询基本属性
为查询添加基础业务实体
为查询添加列。
查询结果中必须包含结果列VoucherId,Vouch