




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
金富瑞(北京)科技有限公司第2頁共53頁UCML工作流與現(xiàn)有應(yīng)用集成方案說明
目錄一 概述 3二 集成說明 41. 使用UCML組織機(jī)構(gòu)模塊 42. 不使用UCML組織機(jī)構(gòu)模塊 18三 流程開發(fā)案例 381. 在UCML開發(fā)平臺(tái)中定義流程模塊 392. 發(fā)布流程模型并啟動(dòng)工作量引擎 403. 創(chuàng)建自己的工作流業(yè)務(wù)表單 414. 案例中使用到流程API說明 49
概述UCML.NET工作流系統(tǒng)是國內(nèi)領(lǐng)先的工作流平臺(tái),涵蓋了從流程開發(fā)、發(fā)布、管理配置到運(yùn)行、監(jiān)控的整個(gè)過程。主要包括可視化的流程設(shè)計(jì)環(huán)境、獨(dú)立的工作流引擎服務(wù)、WEB客戶端管理、可視化的流程監(jiān)控、流程套路生產(chǎn)線幾個(gè)部分,是.Net領(lǐng)域用戶最多,覆蓋面最廣的工作流平臺(tái)。一方面,UCML工作流系統(tǒng)與UCML平臺(tái)其它部分(業(yè)務(wù)單元開發(fā),Web報(bào)表)無縫集成,可以完成復(fù)雜的業(yè)務(wù)處理及流程流轉(zhuǎn);另一方面,UCML工作流系統(tǒng)與業(yè)務(wù)之間采用松耦合設(shè)計(jì),不僅可以與UCML業(yè)務(wù)系統(tǒng)集成,還可以與其它現(xiàn)成的應(yīng)用系統(tǒng)實(shí)現(xiàn)無縫集成。UCML工作流在與現(xiàn)有應(yīng)用系統(tǒng)集成時(shí),一般有兩種方式:第一種:使用UCML現(xiàn)有的組織機(jī)構(gòu)、用戶及權(quán)限體系第二種:不使用UCML提供的組織機(jī)構(gòu)、用戶及權(quán)限體系,完全采用客戶原有的組織機(jī)構(gòu)權(quán)限體系。第一種方式,使用現(xiàn)有組織機(jī)構(gòu)、用戶權(quán)限模塊可以更好支撐流程,可直接使用流程公共模塊(待辦、已辦、權(quán)限管理、會(huì)簽、轉(zhuǎn)簽、加簽等),降低使用成本和學(xué)習(xí)成本,實(shí)現(xiàn)難度相對(duì)較小,。使用這種方式集成流程需要一下幾個(gè)主要步驟:將組織機(jī)構(gòu)、人員數(shù)據(jù)同步到UCML應(yīng)用系統(tǒng)中導(dǎo)入U(xiǎn)CML提供的“公共模塊”包或者導(dǎo)入“工作流API”資源包,前者包括后者完成集成工作第二種實(shí)現(xiàn)方案適合已存在成熟穩(wěn)定的組織機(jī)構(gòu)模塊的用戶使用,這種方式降低現(xiàn)有系統(tǒng)與UCML工作流系統(tǒng)耦合度,集成時(shí)對(duì)現(xiàn)有系統(tǒng)影響相對(duì)較小,但基礎(chǔ)公共模塊和流程權(quán)限需自定義開發(fā),主要集成步驟如下:導(dǎo)入“UCML工作流API”資源包根據(jù)項(xiàng)目需求開發(fā)流程公共模塊,一般包括待辦事宜、已辦事宜、任務(wù)委托、流程權(quán)限等通過UCML工作流權(quán)限接口,實(shí)現(xiàn)現(xiàn)有組織機(jī)構(gòu)與流程權(quán)限整合。一般包括:活動(dòng)節(jié)點(diǎn)執(zhí)行人設(shè)定、上下級(jí)人員規(guī)則定義、部門領(lǐng)導(dǎo)定義、公司領(lǐng)導(dǎo)定義等完成集成工作該文檔讀者需對(duì)工作流相關(guān)產(chǎn)品基本概念、應(yīng)用場(chǎng)景有充分認(rèn)識(shí),能夠理解并熟練使用UCML開發(fā)工具開發(fā)審批流程。集成說明本章節(jié)詳細(xì)介紹不同項(xiàng)目集成工作流操作步驟,從用戶是否使用UCML組織機(jī)構(gòu)模塊角度來詳細(xì)介紹ASP.NET應(yīng)用系統(tǒng)和WinForm應(yīng)用系統(tǒng)集成方式。使用UCML組織機(jī)構(gòu)模塊UCML工作流和UCML組織機(jī)構(gòu)模塊是無縫集成的,這種方式只需將UCML工作流API導(dǎo)入現(xiàn)有系統(tǒng)即可完成集成工作,下面詳細(xì)介紹。ASP.NET應(yīng)用系統(tǒng)UCML工作流提供《公共模塊集成解決方案》包,這個(gè)包包括所有和流程相關(guān)的公共模塊、流程API等,我們導(dǎo)入這個(gè)包即可完成集成工作,下面詳細(xì)介紹公共模塊包?!豆材K集成解決方案》包主要內(nèi)容包括:流程審批模塊(待辦事宜、已辦事宜、歷史任務(wù)、任務(wù)委托、任務(wù)閱辦等);組織機(jī)構(gòu)與用戶管理(組織機(jī)構(gòu)管理、崗位管理、人員管理、群組管理、人員換崗等)流程管理功能(流程權(quán)限設(shè)定、流程實(shí)例管理、流程狀態(tài)統(tǒng)計(jì)、流程狀態(tài)查詢、數(shù)據(jù)歸檔配置等)系統(tǒng)日志(系統(tǒng)業(yè)務(wù)日志、業(yè)務(wù)維護(hù)日志)權(quán)限管理(責(zé)任設(shè)置、二級(jí)權(quán)限)開發(fā)配置(業(yè)務(wù)模型管理、業(yè)務(wù)流程配置)工作日管理(標(biāo)準(zhǔn)工作日定義、定義節(jié)假日)流程目錄管理(業(yè)務(wù)分類、流程層分類、核心流程)流程效率分析(全年總體流程效率趨勢(shì)圖、流程時(shí)間效率、流程時(shí)間效率環(huán)比、流程時(shí)間效率同比、重要流程效率、流程負(fù)荷情況、單節(jié)點(diǎn)審批超時(shí)情況、崗位回退流程效率、錯(cuò)誤流程效率情況、同崗位流程效率情況)如果用戶現(xiàn)有系統(tǒng)也是使用ASP.NET4.0及以上版本開發(fā),可通過對(duì)上述公共模塊進(jìn)行源碼級(jí)的整合實(shí)現(xiàn)在現(xiàn)有系統(tǒng)中直接使用這些模塊。公共模塊解決方案(UCMLWorkFlow.sln)可以直接用MicrosoftVisualStudio2010或以上版本打開并獨(dú)立運(yùn)行。(公共資源包解決方案截圖)(登錄頁面,用戶名:ADMIN密碼:ADMIN)(主頁面) 注:運(yùn)行前參看下文修改UCMLCONF.XML中的數(shù)據(jù)庫連接字符串實(shí)現(xiàn)步驟公共模塊源碼整合將“UCMLWorkFlow.WebApp”文件夾下的文件引入自己項(xiàng)目解決方案中??截悺癠CMLCONF.XML”、“UCMLDBLayer.XML”、“UCMLLic.xml”三個(gè)文件,其中UCMLCONF.XML記錄數(shù)據(jù)庫連接字符串,需修改為當(dāng)前系統(tǒng)連接字符串,一般同流程引擎目錄下的UCMLCONF.XML保持一致數(shù)據(jù)庫連接字符串修改,下圖:Global文件整合對(duì)應(yīng)的“Global.asax.cs”文件在根目錄下的“OtherSource”文件夾中,可將代碼整合到用戶當(dāng)前系統(tǒng)對(duì)應(yīng)文件中,讓后刪除該文件。Web.Config文件內(nèi)容整合在Web.config文件中標(biāo)注為“-S==UCML”和“E==UCML”之間的節(jié)點(diǎn)需要整合到自己的web.config文件中,具體如下:第一處第二處第三處公共模塊與現(xiàn)有系統(tǒng)權(quán)限集成由于UCML公共模塊是有權(quán)限控制的,普通用戶必須登錄系統(tǒng)后才可以使用,所以我們需要在現(xiàn)有系統(tǒng)登錄成功后調(diào)用一下授權(quán)函數(shù)“Authorization”,代碼如下:UserLoginServiceuls=newUserLoginService();//登錄到UCML系統(tǒng)if(uls.Authorization(用戶登錄名)>0){//登錄成功跳轉(zhuǎn)頁面}else{//登錄失敗}至此我們完成UCML工作流集成工作,可以開發(fā)自己業(yè)務(wù)流程。注意事項(xiàng)解決方案“UCMLWorkFlow.sln”中的項(xiàng)目默認(rèn)是SQLServer版本如果當(dāng)前項(xiàng)目使用Oracle數(shù)據(jù)庫,建議先用UCML開發(fā)平臺(tái)建一個(gè)Oracle數(shù)據(jù)庫的項(xiàng)目;然后在解決方案中重新引用DBLayer.dll、UCMLBC.dll、SysDBModel.dll、UCMLBase.dll、WorkFlow.dll;編譯通過運(yùn)行正常后在進(jìn)行整合。公共模塊頁面風(fēng)格為UCML默認(rèn)風(fēng)格,如需調(diào)整可修改“ubsc_green”皮膚WinForm應(yīng)用系統(tǒng)WinForm應(yīng)用程序?yàn)镃/S模式,我們可以通過引入《UCML工作流API包》實(shí)現(xiàn)同工作流引擎交互,但《UCML工作流API包》不包括流程常用模塊(待辦、已辦),需單獨(dú)開發(fā)。我們建議部署一套Web版《公共模塊集成解決方案》包,可在該系統(tǒng)中進(jìn)行流程權(quán)限管理,WinForm程序也可以使用“webBrowser1”控件嵌入一些常用公共模塊(比如:流程跟蹤頁面,如下圖1),下面詳細(xì)介紹集成步驟:圖1:流程跟蹤窗體效果引入U(xiǎn)CMl工作流API從“1.UCML工作流API包”文件夾對(duì)應(yīng)bin文件夾下引入(DBLayer.dll、SysDBModel.dll、UCMLBase.dll、WorkFlow.dll),并將WorkflowClient.cs拷貝到項(xiàng)目中。將UCMLCONF.XML、UCMLDBLayer.XML、UCMLLic.xml三個(gè)文件拷貝到現(xiàn)有系統(tǒng)bin目錄下,其中UCMLCONF.XML文件中有數(shù)據(jù)庫連接字符串,需同工作流引擎目錄下的該文件保持一致。UCMLConf.xml數(shù)據(jù)庫連接字符串初始化工作流API接口在“Program.cs”的Main函數(shù)添加初始化代碼:UCMLCommon.UCMLInitEnv.fInServer=true;UCMLCommon.UCMLInitEnv.LoadEnvVariable();newDBLayer.LogicDBModel();UCMLCommon.UCMLOIDMemSrv.Init();UCMLCommon.UCMLOIDTaskoidTask=newUCMLCommon.UCMLOIDTask();oidTask.Signal(TaskEvent.kStartEvent);開發(fā)流程公共模塊待辦窗體privatevoidBindData(){//查詢所有待辦任務(wù),條件為:resolutionCode=0,并且從TaskTicket得到流程名稱,任務(wù)名稱SysDBModel.AssignTaskassign=newSysDBModel.AssignTask();SysDBModel.AssignTaskInfoss=newSysDBModel.AssignTaskInfo();stringsql="select";sql+="(selectFlowNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)as流程名稱";sql+=",(selectActivityChineseNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)as任務(wù)名稱";sql+=",AssignTask.PersonNameas執(zhí)行人";sql+=",AssignTask.SYS_Createdas創(chuàng)建日期";sql+=",(selectActivityIDfromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)ASActivityID";sql+=",AssignTask.AssignTaskOID,AssignTask.InstanceID,AssignTask.SYS_CreatedBy,AssignTask.Idea";sql+="fromAssignTaskwhereAssignTask.resolutionCode='0'orderbyAssignTask.SYS_Createddesc";dataGridView1.DataSource=assign.ExecuteQuery(sql);}privatevoidbtnExecTask_Click(objectsender,EventArgse){if(dataGridView1.SelectedRows.Count<=0){MessageBox.Show("操作失敗,請(qǐng)先選擇!");return;}stringInstanceID=dataGridView1.SelectedRows[0].Cells["InstanceID"].Value.ToString();stringTaskID=dataGridView1.SelectedRows[0].Cells["AssignTaskOID"].Value.ToString();TaskExForma=newTaskExForm();a.InstanceID=InstanceID;a.TaskOID=TaskID;a.ShowDialog();BindData();}privatevoidbtnTrace_Click(objectsender,EventArgse){if(dataGridView1.SelectedRows.Count<=0){MessageBox.Show("操作失敗,請(qǐng)先選擇!");return;}stringInstanceID=dataGridView1.SelectedRows[0].Cells["InstanceID"].Value.ToString();stringTaskID=dataGridView1.SelectedRows[0].Cells["AssignTaskOID"].Value.ToString();FlowTraceForma=newFlowTraceForm();a.InstanceID=InstanceID;a.TaskOID=TaskID;a.ShowDialog();}已辦窗體privatevoidBindData(){//查詢所有待辦任務(wù),條件為:resolutionCode=0,并且從TaskTicket得到流程名稱,任務(wù)名稱SysDBModel.AssignTaskassign=newSysDBModel.AssignTask();SysDBModel.AssignTaskInfoss=newSysDBModel.AssignTaskInfo();stringsql="select";sql+="(selectFlowNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)as流程名稱";sql+=",(selectActivityChineseNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)as任務(wù)名稱";sql+=",AssignTask.PersonNameas執(zhí)行人";sql+=",AssignTask.SYS_Createdas創(chuàng)建日期";sql+=",(selectActivityIDfromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)ASActivityID";sql+=",AssignTask.AssignTaskOID,AssignTask.InstanceID,AssignTask.SYS_CreatedBy,AssignTask.Idea";sql+="fromAssignTaskwhereAssignTask.resolutionCode='1'orderbyAssignTask.SYS_Createddesc";dataGridView1.DataSource=assign.ExecuteQuery(sql);}流程跟蹤整合將“2.公共模塊集成解決方案(ASP.NET版)”部署到IISWeb應(yīng)用服務(wù)上,在WinForm程序窗體上用“webBrowser1”控件來顯示流程跟蹤圖,代碼如下:stringwebURL=Web服務(wù)器地址;//Properties.Settings.Default.WebSitestringUrl=string.Format("{0}/UCMLCommon/WF/BPO_WF_FlowTrace.aspx?TaskID={1}&InstanceID={2}",webURL,TaskOID,InstanceID);webBrowser1.Url=newUri(Url);至此完成WinForm項(xiàng)目集成UCML工作流工作,可實(shí)現(xiàn)基本流程辦理功能,如果需要使用《公共資源解決方案》中的流程會(huì)簽、加簽、轉(zhuǎn)簽等流程組件功能,可采用嵌入Web應(yīng)用系統(tǒng)頁面的方式,也可自定義開發(fā),具體數(shù)據(jù)源可參考UCML標(biāo)準(zhǔn)開發(fā)庫中的對(duì)應(yīng)模塊。如下圖:不使用UCML組織機(jī)構(gòu)模塊這個(gè)集成模式優(yōu)勢(shì)是松耦合,對(duì)技術(shù)水平要求較高。工作流系統(tǒng)和組織權(quán)限系統(tǒng)是緊密聯(lián)系的,比如:做一個(gè)報(bào)銷流程,報(bào)銷人填寫完報(bào)銷單后提交自己領(lǐng)導(dǎo)審核、在提交到分管領(lǐng)導(dǎo)審批、到公司財(cái)務(wù)部經(jīng)理審批等,“領(lǐng)導(dǎo)審批”、“分管領(lǐng)導(dǎo)審批”、“公司財(cái)務(wù)部經(jīng)理審批”這些工作節(jié)點(diǎn)執(zhí)行人是相對(duì)于申請(qǐng)人而定的,不能是固定的某一個(gè)人。這就需要定義一套根據(jù)當(dāng)前申請(qǐng)人獲取相關(guān)上下級(jí)邏輯規(guī)則來滿足,由于組織機(jī)構(gòu)模塊是用戶現(xiàn)有系統(tǒng)的,需使用UCML工作流系統(tǒng)提供的面向切面的編程接口,客戶可以集成該接口擴(kuò)展自己也為了邏輯,后文將會(huì)詳細(xì)說明。UCML工作流是基于關(guān)系型數(shù)據(jù)的工作流系統(tǒng),工作流系統(tǒng)有一套自己獨(dú)立的數(shù)據(jù)庫,正式使用時(shí)我們建議業(yè)務(wù)數(shù)據(jù)庫和流程數(shù)據(jù)庫獨(dú)立分開來用。如果用戶需要將流程數(shù)據(jù)表整合到現(xiàn)有系統(tǒng),UCML工作流也是支持的,具體需整合那些數(shù)據(jù)表可參考《UCML工作流相關(guān)數(shù)據(jù)表》文檔,該文檔列舉需要整合的數(shù)據(jù)表。由于UCML工作流工作節(jié)點(diǎn)審批人唯一標(biāo)識(shí)是通過Guid類型的字段來定義的,需要在客戶現(xiàn)有的用戶表(存儲(chǔ)登錄帳號(hào)、密碼表)中增加一個(gè)Guid類型的字段,并賦值,不影響客戶現(xiàn)有的系統(tǒng)。這個(gè)字段的字段名命名規(guī)范為:字段名:客戶表名+OID,即“客戶表名OID”字段類型:MSSQLServer中是Uniqueidentifier,Oracle中為VARCHAR類型。在現(xiàn)有業(yè)務(wù)系統(tǒng)中用戶的登錄ID代表用戶的唯一身份,如果現(xiàn)有用戶表中已有數(shù)據(jù),則需為“客戶表名OID”字段賦值;另外,在增加用戶的程序中要同時(shí)給“客戶表名OID”賦值。下面將分別介紹ASP.NET應(yīng)用系統(tǒng)和WinForm應(yīng)用系統(tǒng)具體整合步驟:注:SQLServer數(shù)據(jù)庫賦值直接用newid()可獲取新值。Oracle數(shù)據(jù)中默認(rèn)沒有這樣的函數(shù),需單獨(dú)創(chuàng)建,代碼如下:CREATEORREPLACEFUNCTIONGET_GUID
RETURNCHAR
IS
v_guid
CHAR(36);
v_guid_part_one
CHAR(8);
v_guid_part_two
CHAR(4);
v_guid_part_three
CHAR(4);
v_guid_part_four
CHAR(4);
v_guid_part_five
CHAR(12);
BEGIN
SELECTSYS_GUID()
INTOv_guid
FROMDUAL;
v_guid_part_one:=SUBSTR(v_guid,0,8);
v_guid_part_two:=SUBSTR(v_guid,8,4);
v_guid_part_three:=SUBSTR(v_guid,12,4);
v_guid_part_four:=SUBSTR(v_guid,16,4);
v_guid_part_five:=SUBSTR(v_guid,20,12);
v_guid:=
CONCAT
(CONCAT
(CONCAT
(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(v_guid_part_one,
'-'),
v_guid_part_two
),
'-'
),
v_guid_part_three
),
'-'
),
v_guid_part_four
),
'-'
),
v_guid_part_five
);
RETURN(NLS_LOWER(v_guid));
ENDGET_GUID;ASP.NET應(yīng)用系統(tǒng)集成步驟現(xiàn)有系統(tǒng)引入U(xiǎn)CML工作流API將“相關(guān)資料》1.UCML工作流API包”目錄下的資源文件拷貝到項(xiàng)目根目錄下,如下圖:選擇現(xiàn)有項(xiàng)目bin文件夾,右擊【添加引用】,將“1.UCML工作流API包>bin”目錄下的DLL文件引入到當(dāng)前項(xiàng)目中。在手工將UCMLCONF.XML、UCMLDBLayer.XML、UCMLLic.xml三個(gè)文件拷貝到現(xiàn)有系統(tǒng)bin目錄下,其中UCMLCONF.XML文件中有數(shù)據(jù)庫連接字符串,需同工作流引擎目錄下的該文件保持一致。如下圖:“Global.asax.cs”文件需同現(xiàn)有系統(tǒng)的Global文件進(jìn)行整合。UCMLConf.xml數(shù)據(jù)庫連接字符串創(chuàng)建工作流公共模塊使用工作流需要待辦事宜、已辦事宜兩個(gè)模塊,原理就是讀取工作流數(shù)據(jù)庫的任務(wù)表(TaskTicket)和任務(wù)分配表(AssignTask)數(shù)據(jù)來實(shí)現(xiàn)。下面介紹自己如何實(shí)現(xiàn)這兩個(gè)模塊。待辦事宜待辦事宜頁面展現(xiàn)方式一般是一個(gè)列表如下圖:數(shù)據(jù)綁定代碼://查詢所有待辦任務(wù),條件為:resolutionCode=0,并且從TaskTicket得到流程名稱,任務(wù)名稱SysDBModel.AssignTaskassign=newSysDBModel.AssignTask();//底層數(shù)據(jù)對(duì)象,引入API后可直接使用SysDBModel.AssignTaskInfoss=newSysDBModel.AssignTaskInfo();//底層數(shù)據(jù)對(duì)象,引入API后可直接使用//查詢工作流相關(guān)數(shù)據(jù)表獲取數(shù)據(jù)stringsql="selectAssignTask.AssignTaskOID,AssignTask.InstanceID,AssignTask.PersonName,AssignTask.SYS_CreatedBy,AssignTask.Idea,AssignTask.SYS_Created,";sql+="(selectActivityIDfromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)ASActivityID";sql+=",(selectActivityChineseNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)asActivityChineseName";sql+=",(selectFlowNamefromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)asFlowName";sql+=",(selectBPOIDfromTaskTickettwheret.TaskTicketOID=AssignTask.TaskTicketOID)asBPOID";sql+="fromAssignTaskwhereAssignTask.resolutionCode='0'orderbyAssignTask.SYS_Createddesc";//返回DataTable直接綁定到數(shù)據(jù)控件Repeater1.DataSource=assign.ExecuteQuery(sql);Repeater1.DataBind();【執(zhí)行任務(wù)】按鈕代碼:<ahref="WorkFlowPage/FlowExecute.aspx?insID=<%#Eval("InstanceID")%>&taskOID=<%#Eval("AssignTaskOID")%>&ActivityID=<%#Eval("ActivityID")%>"target="navTab"rel="flowExcute">執(zhí)行</a>其中“FlowExecute.aspx”為執(zhí)行頁面表單,如果待辦對(duì)應(yīng)多個(gè)不同流程模塊,該表單肯定是不同的,可通過獲取“BPOID”字段值得到表單名稱??蓞⒖计脚_(tái)待辦事宜模塊【執(zhí)行任務(wù)】按鈕的代碼?!玖鞒谈櫋堪粹o代碼:"~/../UCMLCommon/WF/BPO_WF_FlowTrace.aspx?TaskID="+$(a).attr("taskOID")+"&InstanceID="+$(a).attr("insID")BPO_WF_FlowTrace.aspx為公共流程跟蹤頁面,在引入API時(shí)已整合到現(xiàn)有系統(tǒng)中,調(diào)用方法只需傳入TaskID(任務(wù)key)和InstanceID(流程實(shí)例key)兩個(gè)參數(shù)即可已辦事宜已辦同上,獲取的是一般辦結(jié)的數(shù)據(jù),過濾條件同待辦不同。詳細(xì)參看《3.Web系統(tǒng)或WinForm程序調(diào)用UCML工作流實(shí)例程序》目錄下WebFrame項(xiàng)目,如下圖:初始化工作流API接口在“Global.asax.cs”的Application_Start函數(shù)添加初始化代碼:UCMLCommon.UCMLInitEnv.fInServer=false;UCMLCommon.UCMLInitEnv.LoadEnvVariable();newDBLayer.LogicDBModel();UCMLCommon.UCMLOIDMemSrv.Init();UCMLCommon.UCMLOIDTaskoidTask=newUCMLCommon.UCMLOIDTask();oidTask.Signal(TaskEvent.kStartEvent);流程跟蹤頁面說明BPO_WF_FlowTrace.aspx為工作流流程跟蹤頁面,可以實(shí)時(shí)了解流程審批狀態(tài)。需要傳遞兩個(gè)參數(shù)TaskID(任務(wù)分配OID)以及InstanceID(流程實(shí)例ID)例如:window.open("文件所在相對(duì)路徑/UCMLCommon/WF/BPO_WF_FlowTrace.aspx?TaskID=任務(wù)分配OID&InstanceID=實(shí)例ID");流程跟蹤效果圖工作節(jié)點(diǎn)的審批人定義在工作流中任務(wù)分配的方式有幾種:通過群組配置分配任務(wù)回調(diào)函數(shù)分配任務(wù)指定固定執(zhí)行人重寫底層群組串解析規(guī)則自定義組織機(jī)構(gòu)變量如果組織機(jī)構(gòu)不采用平臺(tái)自帶的組織框架,將無法使用“通過群組配置分配任務(wù)”的方式,只能采用“回調(diào)函數(shù)分配任務(wù)”或自己實(shí)現(xiàn)執(zhí)行人群組解析接口,等功能實(shí)現(xiàn)流程節(jié)點(diǎn)執(zhí)行人的配置。基于“回調(diào)函數(shù)分配任務(wù)”是指在每個(gè)流程審批節(jié)點(diǎn)上寫代碼指定具體執(zhí)行人,一般編程思路是將流程模型下每個(gè)節(jié)點(diǎn)執(zhí)行人信息寫入數(shù)據(jù)表中,在該編程時(shí)刻寫代碼動(dòng)態(tài)獲取。具體案例參看《UCML工作流業(yè)務(wù)手冊(cè)》UCML工作流編程章節(jié)。指定固定執(zhí)行人我們指定流程節(jié)點(diǎn)審批人時(shí)可以直接選擇組織機(jī)構(gòu)用戶,該用戶即為當(dāng)前節(jié)點(diǎn)執(zhí)行人。實(shí)現(xiàn)方法就在用戶表擴(kuò)展字段值賦給工作流活動(dòng)節(jié)點(diǎn)表(ActivityInfoEx)的主辦人字段(MasterRunner).重寫底層群組串解析規(guī)則UCML工作流任務(wù)執(zhí)行人默認(rèn)是通過“群組串”來指定的,群組串是一組有特定含義的字符串,比如“O:29640B83-B0A1-4281-A7B2-068768EAF75E”代表key為“29640B83-B0A1-4281-A7B2-068768EAF75E”的組織、P代表崗位,等。關(guān)于群組串介紹可參考《UCML業(yè)務(wù)開發(fā)手冊(cè)》中“通用選人及人員串”章節(jié)。群組串代表一種規(guī)則,這個(gè)規(guī)則具體代表什么含義用戶是可以自定義的,如申請(qǐng)人的部門主管、申請(qǐng)人公司總經(jīng)理等我們可以用自己的規(guī)則來定義,具體代表什么含義我們可以通過實(shí)現(xiàn)群組串解析接口來完成,這是一個(gè)面向切面的編程接口,實(shí)現(xiàn)步驟如下:接口介紹從接口代碼中我們可以看到返回值為Object類型數(shù)據(jù),這個(gè)返回值就是在用戶表中擴(kuò)展“表名+OID”字段的值。重新UserOIDList函數(shù),根據(jù)傳入的“群組串字符串”、申請(qǐng)人相關(guān)信息根據(jù)自己業(yè)務(wù)規(guī)則在現(xiàn)有系統(tǒng)中獲得對(duì)應(yīng)人員數(shù)據(jù)后以參數(shù)的形式返回。實(shí)現(xiàn)步驟用MicrosoftVisualStudio新建一個(gè)類庫項(xiàng)目。引用UCML底層類庫,實(shí)現(xiàn)IgroupParser接口。如下圖:(新建類庫CustomUserGroup)(引用UCMl類庫,實(shí)現(xiàn)IgroupParser接口的UserOIDList方法,在該方法中寫自己的人員分配規(guī)則)比如:我們定義規(guī)則字母A代表部門經(jīng)理,這時(shí)我們?cè)诹鞒棠P椭性O(shè)置某個(gè)節(jié)點(diǎn)主辦人為A.代碼業(yè)務(wù)邏輯是:通過參數(shù)“GroupStr”獲取到字母“A”,通過參數(shù)“Starter”獲取到當(dāng)前流程申請(qǐng)人,根據(jù)這兩個(gè)參數(shù)即可找到現(xiàn)有系統(tǒng)中對(duì)應(yīng)的部門經(jīng)理將該類庫編譯成DLL文件,放在工作流引擎目錄下。修改UCMLCONF.XML文件,添加如下相關(guān)節(jié)點(diǎn)fCustomGroupParser:是否啟用定義人員分配規(guī)則 GroupParserAssembly:自定義人員分配規(guī)則類庫名稱 GroupParserClass:自定義人員分配規(guī)則類名稱 自定義組織機(jī)構(gòu)變量也可以實(shí)現(xiàn),具體使用說明參見《5.組織變量定義實(shí)現(xiàn)自定義流程執(zhí)行人》自定義組織機(jī)構(gòu)變量當(dāng)流程參與人是非UCML組織模塊人員時(shí),比如某項(xiàng)目負(fù)責(zé)人,但在系統(tǒng)組織中并沒有聲明此人員,就可以通過手寫代碼轉(zhuǎn)換組織關(guān)系來找到系統(tǒng)組織中對(duì)應(yīng)的人員,再通過流程中組織變量定義來實(shí)現(xiàn)這個(gè)自定義的流程參與人1.項(xiàng)目包上右鍵——.NetStudio類解決方案(根據(jù)需要選擇根級(jí)或子級(jí))2.解決方案名稱可以使用默認(rèn),也可以修改為有含義的名稱3.選中解決方案,右鍵——新建.Net源碼類項(xiàng)目必須填寫輸出程序Dll名稱5.項(xiàng)目文件右鍵——新建UCML接口實(shí)現(xiàn)類——流程(組織)變量接口實(shí)現(xiàn)6.修改圖中三處名稱為有含義的名稱(防止添加多個(gè)時(shí)重名),修改類文件,通過手寫代碼轉(zhuǎn)換組織關(guān)系返回想要的流程參與人7.選中解決方案,右鍵——生成本地.NetStudio解決方案,則在BPObject下生成此解決方案的文件夾8.選中項(xiàng)目文件,右鍵——一鍵源碼生成、編譯工程文件,在此解決方案下生成此項(xiàng)目文件包含的類文件,且在bin文件夾下產(chǎn)生Dll文件,此時(shí)需要把此Dll文件復(fù)制到WorkFlow文件夾的Bin目錄下9.選中要使用的工作流模型,右鍵——組織變量定義10.編碼和名稱寫有含義的自己能看懂的名稱,類名稱格式為:命名空間.類名稱,部署名稱寫用到的類所在項(xiàng)目文件的輸出程序Dll名稱(只寫名稱,不用帶.Dll),保存,導(dǎo)出11.這時(shí),在流程某節(jié)點(diǎn)上選取執(zhí)行人時(shí),會(huì)顯示出剛才自己定義的組織變量,選取某項(xiàng)時(shí),流程流轉(zhuǎn)到此節(jié)點(diǎn)時(shí),分配給組織變量中定義的人12.把組織變量定義中的用到的Dll復(fù)制到WorkFlow文件夾的Bin目錄下,流程源碼生成,編譯,發(fā)布工作流到服務(wù)器WinForm應(yīng)用系統(tǒng)同“使用UCML組織機(jī)構(gòu)模塊”中“WinForm應(yīng)用系統(tǒng)”集成步驟一致。由于“不使用UCML組織機(jī)構(gòu)模塊”需要實(shí)現(xiàn)現(xiàn)有系統(tǒng)組織機(jī)構(gòu)權(quán)限與UCML流程整合,實(shí)現(xiàn)方法與上文“HYPERLINK工作流節(jié)點(diǎn)審批人定義”一致。流程開發(fā)案例完成UCML工作流集成后可以開始開發(fā)自己的流程業(yè)務(wù),流程開發(fā)主要分幾個(gè)步驟:流程模型定義、流程表單定義、流程權(quán)限定義、發(fā)布測(cè)試等。接下來我們?cè)谝粋€(gè)使用UCML組織機(jī)構(gòu)且已完成UCML工作流集成的系統(tǒng)上做一個(gè)簡單審批流程,主要了解一下流程開發(fā)的步驟:在UCML開發(fā)平臺(tái)中定義流程模塊流程模型定義參考《UCML工作流手冊(cè)》或UCML標(biāo)準(zhǔn)培訓(xùn)視頻。直接使用UCML組織權(quán)限模塊,將執(zhí)行人設(shè)置為相對(duì)崗位,如下圖:發(fā)布流程模型并啟動(dòng)工作量引擎發(fā)布流程流程引擎程序創(chuàng)建自己的工作流業(yè)務(wù)表單需要至少建立兩個(gè)個(gè)表單,一個(gè)表單做為流程啟動(dòng)時(shí)使用;一個(gè)表單做為流程審批時(shí)使用;流程啟動(dòng)表單,主要實(shí)現(xiàn)保存業(yè)務(wù)表數(shù)據(jù),啟動(dòng)流程??蓞⒖肌笆纠绦颉敝械摹癢orkFlowPage\AddCustomer.aspx”頁面。該頁面主要實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)保存到數(shù)據(jù)庫中,并可以啟動(dòng)流程。代碼如下:保存業(yè)務(wù)數(shù)據(jù):啟動(dòng)審批流程:///<summary>///啟動(dòng)流程///</summary>///<returns></returns>privatestringstartFlow(HttpContextcontext){try{DBLayer.Customercustomer=newDBLayer.Customer();DBLayer.CustomerInfocustomerInfo=newDBLayer.CustomerInfo();stringbusikey="";//流程模型IDstringflowId=System.Configuration.ConfigurationManager.AppSettings["FlowID"].ToString();if(context.Request["type"]=="startFlowE"){//編輯狀態(tài)啟動(dòng)流程busikey=context.Request["CustomerOID"];}else{//增加狀態(tài)創(chuàng)建流程customerInfo.CustomerOID=Guid.NewGuid();customerInfo.customerNo=context.Request["customerNo"].ToString();customerInfo.customerName=context.Request["customerName"].ToString();customerInfo.customerType=context.Request["customerType"].ToString();customerInfo.iD_Number=context.Request["customerType"].ToString();customerInfo.createDate=Convert.ToDateTime(context.Request["createDate"].ToString());customer.Insert(customerInfo);busikey=customerInfo.CustomerOID.ToString();}/*****啟動(dòng)流程開始****/WorkFlow.WorkflowClientflowClient=newWorkFlow.WorkflowClient();GuidinsID=flowClient.CreateFlowEx(flowId,Guid.NewGuid(),Guid.Empty,Guid.Empty,Guid.Empty);/****啟動(dòng)流程結(jié)束***/flowClient.WriteFlowData(flowId,insID,"BusinessKey",busikey);customerInfo.CustomerOID=newGuid(busikey);customer.Load(customerInfo);customerInfo.InstanceID=insID;customerInfo.BusinessState=1;customer.Update(customerInfo);return"{\"statusCode\":\"200\",\"message\":\"流程啟動(dòng)成功!\",\"navTabId\":\"createFlow\",\"rel\":\"\",\"callbackType\":\"closeCurrent\",\"forwardUrl\":\"\",\"confirmMsg\":\"\"}";}catch(Exceptione){return"{\"statusCode\":\"300\",\"message\":\""+e.ToString()+"\",\"navTabId\":\"\",\"rel\":\"\",\"callbackType\":\"\",\"forwardUrl\":\"\",\"confirmMsg\":\"\"}";}}頁面效果:流程審批表單,主要實(shí)現(xiàn)保存業(yè)務(wù)表數(shù)據(jù),完成當(dāng)前節(jié)點(diǎn)審批流程??蓞⒖肌笆纠绦颉敝械摹癢orkFlowPage\FlowExecute.aspx”頁面,頁面按鈕權(quán)限參考”FlowExecute.aspx.cs”中“Page_Load”函數(shù)中的代碼。執(zhí)行任務(wù)代碼:///<summary>///執(zhí)行任務(wù)///</summary>///<paramname="context"></param>///<returns></returns>privatestringflowExecute(HttpContextcontext){try{//流程API實(shí)例化WorkFlow.WorkflowClientflowClient=newWorkFlow.WorkflowClient();stringinsID=context.Request["insID"];stringtaskOID=context.Request["taskOID"];stringhdCmd=context.Request["hdCmd"];//流程模型IDstringflowId=System.Configuration.ConfigurationManager.AppSettings["FlowID"].ToString();stringreMessage=string.Empty;if(hdCmd=="WF_FINISHTASK"){/*執(zhí)行任務(wù)開始*/reMessage=flowClient.FinishTask(flowId,taskOID);/*執(zhí)行任務(wù)結(jié)束*/}elseif(hdCmd=="WF_READ"){//發(fā)送知會(huì)任務(wù)fn_ExeApp(taskOID,"00000000-0000-0000-0000-000000000001","false","1","知會(huì)任務(wù)流程消息","WF_READ");}elseif(hdCmd=="WF_SIGN"){//發(fā)送加簽任務(wù)fn_ExeApp(taskOID,"00000000-0000-0000-0000-000000000001","false","1","加簽任務(wù)流程消息","WF_SIGN");}elseif(hdCmd=="WF_SIGNTO"){//發(fā)送轉(zhuǎn)簽任務(wù)fn_ExeApp(taskOID,"00000000-0000-0000-0000-000000000001","false","1","轉(zhuǎn)簽任務(wù)流程消息","WF_SIGNTO");}stringidea=context.Request["Idea"];SysDBModel.AssignTaskassTask=newSysDBModel.AssignTask();stringsql="updateAssignTasksetIdea='"+idea+"'whereAssignTaskOID='"+taskOID+"'";assTask.ExecuteNonQuery(sql);return"{\"statusCode\":\"200\",\"message\":\""+reMessage+"\",\"navTabId\":\"db\",\"rel\":\"\",\"callbackType\":\"closeCurrent\",\"forwardUrl\":\"\",\"confirmMsg\":\"\"}";}catch(Exceptione){return"{\"statusCode\":\"300\",\"message\":\""+e.ToString()+"\",\"navTabId\":\"\",\"rel\":\"\",\"callbackType\":\"\",\"forwardUrl\":\"\",\"confirmMsg\":\"\"}";}}///<summary>///調(diào)用流程接口///</summary>///<paramname="FlowTaskID">任務(wù)ID</param>///<paramname="strCounterSignPerformers">執(zhí)行人字符串</param>///<paramname="strfSignOneByeOne">是否順序執(zhí)行</param>///<paramname="strMessageType">消息工具</param>///<paramname="strMessageContent">消息內(nèi)容</param>///<paramname="strBusinesType">業(yè)務(wù)編碼</param>///<returns></returns>publicboolfn_ExeApp(stringFlowTaskID,stringstrCounterSignPerformers,stringstrfSignOneByeOne,stringstrMessageType,stringstrMessageContent,stringstrBusinesType){boolbolRe=false;try{//if(this.BusinessParams["TaskID"]==null)returnfalse;BooleanfSignOneByeOne=false;if(strfSignOneByeOne!=""&&strfSignOneByeOne!=null){fSignOneByeOne=Boolean.Parse(strfSignOneByeOne);}intMessageType=0;if(strMessageType!=""&&strMessageType!=null){MessageType=int.Parse(strMessageType);}//stringFlowTaskID=string.Empty;stringFlowInstanceID=string.Empty;stringFlowActivityID=string.Empty;stringFlowFlowID=string.Empty;//FlowTaskID=this.BusinessParams["TaskID"];SysDBModel.AssignTaskobj=newSysDBModel.AssignTask();SysDBModel.AssignTaskInfoinfo=newSysDBModel.AssignTaskInfo();info.AssignTaskOID=FlowTaskID;obj.Load(info);SysDBModel.TaskTickettobj=newSysDBModel.TaskTicket();SysDBModel.TaskTicketInfotinfo=newSysDBModel.TaskTicketInfo();tinfo.TaskTicketOID=info.TaskTicketOID;tobj.Load(tinfo);if(info.InstanceID!=null)FlowInstanceID=info.InstanceID.ToString();if(!string.IsNullOrEmpty(tinfo.FlowID)){FlowFlowID=tinfo.FlowID;}if(!string.IsNullOrEmpty(tinfo.ActivityID)){FlowActivityID=tinfo.ActivityID;}WorkFlow.WorkflowClientflowClient=newWorkFlow.WorkflowClient();switch(strBusinesType){//加簽WF_SIGN,知會(huì)WF_READ,轉(zhuǎn)簽WF_SIGNTOcase"WF_READ"://知會(huì)flowClient.MansualAssignReadTask(FlowFlowID,info.TaskTicketOID.ToString(),strCounterSignPerformers);break;case"WF_SIGN"://加簽flowClient.FlowSessionEx(FlowFlowID).AddSignPerformer(FlowFlowID,newGuid(FlowInstanceID),newGuid(FlowTaskID),newGuid(),strCounterSignPerformers,fSignOneByeOne,true,false,MessageType,strMessageContent);break;case"WF_SIGNTO"://轉(zhuǎn)簽flowClient.FlowSessionEx(FlowFlowID).AddSignPerformer(FlowFlowID,newGuid(FlowInsta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 場(chǎng)地廠房租賃合同
- 福建三支一扶考試中需要掌握的試題及答案
- 固體礦產(chǎn)地質(zhì)勘查規(guī)范應(yīng)用
- 2024年份8月《觀察魚》與同位素示蹤技術(shù)結(jié)合的洄游路徑教學(xué)
- 武漢鏈家租房合同
- 公司美食城建筑設(shè)計(jì)合同
- 附義務(wù)贈(zèng)與土地合同
- 浙江省商品房買賣合同
- 用人單位不簽勞動(dòng)合同范本
- 江西西部計(jì)劃模擬試題與解答
- 安全生產(chǎn)、文明施工資金保障制度11142
- 安徽省C20教育聯(lián)盟2024-2025學(xué)年九年級(jí)下學(xué)期3月月考數(shù)學(xué)試題 (原卷版+解析版)
- 2025新疆機(jī)場(chǎng)(集團(tuán))有限責(zé)任公司阿克蘇管理分公司第一季度招聘(75人)筆試參考題庫附帶答案詳解
- 2025年高級(jí)育嬰師的試題及答案
- 2025年北京電子科技職業(yè)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗(yàn)
- 2025年廣東深圳市職業(yè)病防治院選聘事業(yè)單位常設(shè)崗位3人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《陸上風(fēng)電場(chǎng)工程概算定額》NBT 31010-2019
- 贊美詩歌400首全集
- 橫向分布系數(shù)計(jì)算剖析
- 北京市建筑施工作業(yè)人員安全生產(chǎn)知識(shí)教育培訓(xùn)考核試卷A及答案知識(shí)講解
評(píng)論
0/150
提交評(píng)論