多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 95. 基于Notes/Domino的文檔工作流系統(七)

95. 基于Notes/Domino的文檔工作流系統(七)

來源:程序員人生   發布時間:2015-03-28 08:43:24 閱讀次數:3561次

本文繼續剖析基于Notes/Domino的文檔工作流系統的設計和代碼,以方便用戶能利用和創建自己的工作流。(CSDN的下載資源1旦上傳就不能修改,很不方便,現已將下載地址改到GitHub,若發現下載有問題,請與我聯系。)
在前文對工作流建模時,我們抽象出以下幾類對象:
工作流:每一個工作流實例都寄存工作流名稱、當前節點等信息,并負責處理流程各節點的操作。
采取工作流的業務對象:在這里也就是采購單。
工作流的配置對象:不同工作流實例和各個節點的操作的實際差異都是從配置數據中讀取的。
最后1類對象體現為工作流、節點和操作3種配置文檔,在上文已介紹。前兩類對象在我們的Notes工作流里保存于同1個文檔,即流程文檔主文檔合1。現在我們就來看看與這個文檔對應的表單設計和代碼類。

流程子表單

流程文檔的字段都包括在FlowControls子表單內,主文檔對應的則是主表單,這樣只要將該子表單嵌入主表單,主文檔就具有了運行工作流的數據。
這里寫圖片描述
利用它創建你的工作流時需注意以下幾點:
1. 能進行工作流的操作的用戶有3類,1是流程在當前節點的處理人,保存在FlowControls子表單的PersonInCharge字段里。2是能進行像取消Cancel這樣的操作的特殊用戶,保存在FlowHandlers字段里。3是特權用戶角色,像本演示流程用的[IT]角色,能進行上述兩類操作。這個[IT]不宜配置,所以在Actions按鈕的隱藏公式和代碼里都直接用的。所以須將它換成你的系統里代表特權用戶的角色。
2. 流程名稱保存在FlowName字段里。由于位于通用的子表單內,沒法直接寫入特定的流程名稱,所以在創建主文檔時,要將利用的流程名稱寫入該字段。例如:

Dim doc As NotesDocument 'CreateDoc is a function in LS library lsNotes Set doc=CreateDoc("fmPurchasing") doc.FlowName="Purchasing" Dim ws As New NotesUIWorkspace Call ws.EditDocument(True, doc)

3.當前狀態保存在Status字段里。在表單上要顯示當前狀態的地方可以創建1個計算文本或顯示時計算字段援用Status字段的值。
4.ActionOptions和Action用于用戶點擊流程操作時容納操作選項和用戶的選擇。PersonInCharge和FlowHandlers分別保存流程確當前處理人和能進行特殊操作的用戶。FlowEnds保證流程是不是結束的標志,初始值為0,結束時為1。CreatedBy記錄文檔的創建者。FlowReaders保存文檔的讀者,FlowWriters保存除流程處理人以外的其他可能的編輯者。FlowComments用于臨時容納用戶進行流程操作時寫的意見。
5.當用戶點擊子表單上的流程操作Actions…時,系統需要從流程操作配置文檔讀取數據并計算出該用戶可見的操作選項。完成此功能的代碼類FlowActions保存在lsSimpleFlow腳本庫中。

工作流類

本流程系統在客戶端和XPages環境下運行使用的語言分別是LotusScript和Java。下面先討論LotusScript下的實現。處理流程各節點操作的通用代碼組成了3個類,都在lsSimpleFlow腳本庫里。之所以用3個類,是為了在普通利用以外滿足測試的需要。作為核心的后端代碼都在AbstractFlow類中。1般流程操作都使用它的子類SimpleFlow,作用是從NotesUIDocument獲得主文檔,處理字段校驗等觸及界面交互的任務。BatchFlow類在構造函數內傳入主文檔,沒使用到任何前端類,可用于測試或批量審批。為了方便無妨將這些類稱為流程引擎。
如前文所述,這些類能完成以下流程的通用功能:

  • 校驗必填字段。
  • 修改流程文檔的權限,包括有關的讀者域、作者域、存取控制區段。
  • 添加操作記錄。
  • 修改配置的業務字段。
  • 發送郵件通知相干處理人。

實際工作流常常會有特殊的需求,這就要求能以某種方式擴大流程類,基本上可概括為在流程提交前后履行1定的邏輯,無妨分別稱為QuerySubmit和PostSubmit的業務邏輯。在Lotus Notes中理論上有很多種方式可斟酌。
1. 將特定流程的代碼寫在配置文檔里。
由于LotusScript是1種解釋型的腳本語言,流程引擎可以像讀取其他配置數據1樣以文本的情勢讀取這些代碼,再解釋履行。
缺點是這些代碼不在Designer內編寫,沒有語法校驗、色彩標記、格式化等幫助,運行時若出錯很難調試,和沒有經過預處理速度也會稍慢。
2. 在流程類的代碼中添加運行特定流程邏輯的函數。
例如在流程類的Submit方法中調用QuerySubmit和PostSubmit函數,它們或與流程引擎同位于1腳本庫lsSimpleFlow,或在lsSimpleFlow援用的另外一腳本庫中。
缺點是通用的流程類對特定的流程邏輯產生了依賴。lsSimpleFlow腳本庫沒法單獨部署到某個利用程序里。如果QuerySubmit之類的函數保存在lsSimpleFlow腳本庫里,1旦流程引擎的代碼需要更正或升級,就不能簡單刷新該腳本庫。如果這些特定的邏輯存于lsSimpleFlow腳本庫援用的另外一個腳本庫內,則該庫的名稱須寫死,并且邏輯上讓通用代碼援用特定代碼的設計奇怪不容易理解。
3. 采取事件機制在流程引擎中調用特定流程的代碼。
要實現流程引擎與特定流程代碼之間的分離,在許多程序語言中都會采取所謂事件的機制。LotusScript也支持事件,但僅限于NotesUIDocument等對象預定義的事件。為了讓自定義類能夠支持事件機制,我們需要自己編寫代碼。在33. 面向對象的LotusScript(6)之為自定義對象摹擬事件和Java、LotusScript和JavaScript中的自定義事件編程等幾篇文章里我討論了在LotusScript實現事件機制的兩種途徑。以二者中較優的類似Java中自定義事件的實現方式為例,要在流程引擎的Submit方法前摹擬QuerySubmit事件,需要編寫1個包括QuerySubmit方法的FlowEventHandler類,然后調用流程引擎的AddEventHandler方法傳入該類的1個實例,最后在Submit方法中調用該實例的QuerySubmit方法。
4. 在通用流程類的子類中寫入特定流程的代碼
在AbstractFlow類的Submit方法中調用空的QuerySubmit和PostSubmit函數。在SimpleFlow的子類內,如我們演示的采購工作流的PurchaseFlow,再此兩函數中寫入實際的代碼。這類似于Java中的實現接口。
與采取事件機制相比,此方法也要求為某個特定的流程寫1個類。另外一個好處是有需要時在子類中可以覆蓋通用流程類的其他方法,例如流程操作配置文檔難以滿足某1操作選擇下1節點的復雜要求時,可以覆蓋GetNextNode方法,在其中寫入所需的邏輯。
5. 在1個援用流程引擎的腳本庫中以函數而不是類的方式編寫特定流程的代碼
上述兩種方式中的類代碼都是在某個援用lsSimpleFlow庫的腳本庫里編寫的,那末是不是1定要以面向對象的情勢呢,直接以1組函數的方式編寫特定流程的代碼,在主函數中順次序調用通用流程類和其它函數如何?
與方法4相比,此途徑只有幾個細微的劣處:
由于PostSubmit的邏輯從在SimpleFlow類的Submit方法內調用變成從主函數中調用Submit方法后運行,本來在Submit方法內完成的前端文檔NotesUIDocument的1系列Reload、Refresh、AutoRefresh操作也宜移至PostSubmit函數內。再加上QuerySubmit和PostSubmit函數里必定會用到主文檔等其他對象,必須寫代碼取得,而不能如在子類中那樣直接援用。
通常QuerySubmit的邏輯是在Submit方法內的表單校驗通過后再運行,以函數的方法順序調用QuerySubmit和SimpleFlow對象時就沒法做到這1點。
綜合以上討論,我們選擇方法4――在通用流程類的子類中寫入特定流程的代碼。特定流程類的代碼容納于lsLocalFlow腳本庫中,此腳本庫名不能不固定下來,由于在調用它的FlowControls子表單需要肯定地援用它的名稱。子表單的Actions操作終究調用的是這個腳本庫里的SubmitFlow函數:

Function SubmitFlow(flow As String, curNode As String, action As String) If Not IsDebuggingLS() Then On Error Goto ErrorHandler End If 'Dim objFlow As New SimpleFlow(flow,curNode,action) Dim objFlow As New PurchaseFlow(flow, curNode, action) Call objFlow.Submit Exit Function ErrorHandler: Call objFlow.RollBack() MessageBox Error & " occured when flow submitted at line " & CStr(Erl),64,"Error " & CStr(Err) Exit Function End Function

從上面的代碼可見,如果當前流程沒有特殊的業務邏輯,可使用通用的流程類SimpleFlow,否則便要用1個寫好的SimpleFlow的子類,即此處的PurchaseFlow。最后談談這里被包括在If語句中的毛病處理。

毛病處理和摹擬事務

上面的代碼如果利用普通的毛病處理,普通用戶看到的毛病信息會略微友好1些。但由于骨干代碼都包括在Submit方法里,捕捉到的毛病產生的行幾近注定就是這1行,而這對肯定真正出錯的代碼幫助不大。并且由于毛病被捕捉了,打開Notes客戶真個調試LotusScript工具也沒用。如此看來,仿佛不應當添加毛病處理代碼。但此處有1個奧妙的問題。流程類的Submit方法履行時如果產生毛病,很有可能已修改了當前主文檔,乃至已修改了文檔的狀態和存取控制字段的值,在這樣的數據“破損”狀態下,用戶關閉文檔時如果保存,則將產生1個沒法解釋其數據和進行后續操作的異常文檔,例如流程已處于下1節點,但文檔權限并未改變。通用的流程引擎類尚可以精心編寫反復測試,盡可能減少出錯的可能。但是特定于某流程的代碼,一樣可能造成上述問題,它們的質量卻取決于各自的作者。
在使用其他編程語言和關系型數據庫時,保證數據不會處于此種不1致狀態的解決方法是事務(transaction)。1個事務內的1系列狀態改變,或成功,或失敗時回滾至原位。LotusScript和Notes數據庫不支持此功能。我們能做到的只是盡可能摹擬,所以AbstractFlow類中有1個RollBack方法,可以將主文檔的所有域值恢復到保存在1個臨時備份文檔中的初始狀態。SubmitFlow函數里添加毛病處理代碼的目的就是利用RollBack方法避免毛病產生時主文檔的數據處于不肯定狀態。剩下的問題便是出錯時如何調試,最好有1個便捷的途徑在不修改代碼的情況下使毛病處理代碼失效。這就是IsDebuggingLS和1個工具代理ToolsToggle LS Error Handler的由來。它們通過設置和檢查1個特殊的Notes環境變量“DEBUG_LS”來控制毛病處理代碼是不是生效。后者將環境變量“DEBUG_LS”的值在0和1之間切換,前者檢查該值是不是為1。這樣在SubmitFlow函數里,如果檢查到處于“調試”狀態,就不進行毛病處理,此時便能用調試器跟蹤毛病。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩一级欧美一级毛片在 | 波多野结衣99 | 伊人不卡久久大香线蕉综合影院 | 69性视频| 在线观看 亚洲 | 啪网址| 免费看的成人yellow视频 | 97av在线| 亚洲黄色在线观看网站 | 日本精品中文字幕 | 综合自拍亚洲综合图区美腿丝袜 | 日本中文字幕一区二区有码在线 | 国产偷v国产偷v国产 | 91九色首页 | 亚洲一区成人 | 久久精品全国免费观看国产 | 亚洲欧美综合色区小说 | 日本特一级毛片免费视频 | 国产欧美一区二区三区小说 | 国产操女| 欧美视频在线观看视频 | 天天鲁一鲁 | 欧美一区二区三区四区在线观看 | 亚洲春色图片 | 无遮挡免费视频 | 成人免费观看视频久爱网 | 午夜影院在线观看视频 | 在线日本韩国 | 国产精品久久一区一区 | 超高清欧美同性videos | 国产又黄又爽又色的免费 | 欧美大尺寸| 精品久久久日韩精品成人 | 欧美日韩亚洲二区在线 | 欧美三级成人理伦 | 欧美性网 | 欧美性久久 | 国产aaa女人十八毛片 | 717影院理论午夜伦不卡久久 | 久久久久久国产精品免费免费 | 美国全免费特一级毛片 |