標籤:工作流程 wf
工作流程
根據 WfMC 的定義,工作流程(WorkFlow)就是自動運作的業務過程部分或整體,表現為參與者對檔案、資訊或任務按照規程採取行動,並令其在參與者之間傳遞。官方的總是很抽象,抽象是為了能夠體現各種情況,更加嚴謹可客觀。可以這樣理解這個工作流程,在現實工作中辦公室審批文檔的流程。
傳統方式:李四申報項目,找王二麻子經理審批完成,接著趙六副總簽字,又跑到頂層張三董事畫押。
而工作流程的操作就是將這樣一個流程完全的自動化、電子化,省去了李四到處跑這樣一個流程。
簡單地說,工作流程就是一系列相互銜接、自動進行的商務活動或任務。我們可以將整個業務過程看作是一條河,其中流過的就是工作流程。
解決了什麼問題:
複雜的業務處理流程
繁瑣的工作流程和大量的人工的手動交流表單
對於業務經常變化的業務,儘可能的利用變更維度情況下調用不同的工作流程來針對的處理
將人從傳統的手動填寫表單的效率低下中解脫出來;
在哪裡用?
在什麼樣的業務中,可以使用到這樣一個流程呢?其實如果理解之上的概念,在哪裡使用也就知道了。
關鍵商務程序:訂單、報價處理、採購處理、合約審核、客戶電話處理、供應鏈管理等
行政管理類:各種申請類項目,出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報周報等凡是原來手工流轉處理的行政表單。
人事管理類: 員工培訓安排、績效考評、職位變動處理、員工檔案資訊管理等。
財務相關類: 付款請求、應收款處理、日常報銷處理、出差報銷、預算和計劃申請等。
客戶服務類: 客戶資訊管理、售後服務管理等管理等。
總的可以發現在之上業務中總會有這樣一個流動的檔案或者資訊結構一致的資訊流,根據許可權不一經過各個參與者來完成一個業務的流程都是可以適用這樣一個工作流程的。
如何使用?
配置環境:vs 2020 .net 4.0 windows 8.1
一般流程
配置工作流程-配置許可權-啟用工作流程
1.建立工作流程項目或者建立工作流程xaml
a.建立工作流程項目
建立好相應的項目後,出現一個program.cs 宿主程式、xaml配置好的工作流程。
b.建立工作流程
與上不同的是,沒有宿主程式檔案。直接添加了相應的工作流程即可。
在原有的項目基礎上,直接右鍵添加新項,活動即可。
2.添加活動
Vs2010需要添加或活動的.cs檔案,並重建,這時候就可以在左邊的工具列內將這個產生好的活動以標籤的形式添加到順序圖表中去。這時候在左邊相應的工具列這裡看到產生好的活動圖表標了
3.繪製活動圖表
左邊眾多的工作流程,以及自訂的活動配合繪製活動圖表即可。
實質上還是規定了一系列方法執行的步驟,按照可視化的方式呈現出來。而調用則是在程式聲明這個工作流程對象,然後把工作交給對應的工作流程去就可以了。
執行個體demo verifyUser
繪製的活動圖表
,繪製了驗證使用者名稱和密碼的過程,本例只是示範工作流程,沒有結合相應的商務邏輯。
配置好全域參數enUser
verifyUuser
public sealed class VerifyUser : CodeActivity { // 定義一個字串類型的活動輸入參數 public InArgument<UserEntity.user> ToUser{ get; set; } public OutArgument<UserEntity.user> OutUser{set;get;} // 如果活動傳回值,則從 CodeActivity<TResult> // 派生並從 Execute 方法返回該值。 protected override void Execute(CodeActivityContext context) { user enUser = new user(); // 擷取使用者名稱 enUser.UserName = ToUser.Get(context).UserName; //輸出參數 enUser.InstanceID = context.WorkflowInstanceId; context.SetValue(OutUser, enUser); }
這裡需要注意的是在相應的可視化介面的verify的屬性欄中也需要配置相應的參數名,本機為enUser,需要和傳入的參數
名一直,否則則會報錯。
verfiyPWD
// 定義一個字串類型的活動輸入參數 public InArgument<UserEntity.user> ToUser { get; set; } // 如果活動傳回值,則從 CodeActivity<TResult> // 派生並從 Execute 方法返回該值。 protected override void Execute(CodeActivityContext context) { user enUser = new user(); // 擷取pwd enUser.UserName = ToUser.Get(context).UserPWD; enUser.UserPWD = ToUser.Get(context).UserPWD; }
這裡只需要傳入參數即可,故無需傳出參數。
宿主程式
/// <summary> /// 建立並啟動工作流程-2014年8月23日20:54:11 /// </summary> /// <param name="Request">相關參數</param> /// <returns>返回工作流程對應ID</returns> public static Guid CreateAndRun(user Request) { //索引值對的泛型集合,用來傳入參數 IDictionary<string, object> input = new Dictionary<string, object> { { "Request" , Request } }; //為工作流程的單個執行個體提供宿主,也就是建立好的工作流程,可選傳入參數 WorkflowApplication application = new WorkflowApplication(new VerifyWF(), input); //application.InstanceStore = instanceStore; //將當前工作流程設定為閑置 application.PersistableIdle = (e) => { //將當前工作流程終止, instanceUnloaded.Set(); return PersistableIdleAction.Unload; }; application.Unloaded = (e) => { instanceUnloaded.Set(); }; //出現異常時會調用該方法 application.OnUnhandledException = (ex) => { Console.Write("Exception"); return UnhandledExceptionAction.Terminate; }; Guid id = application.Id; //啟動當前工作流程 application.Run(); //中止當前工作流程 instanceUnloaded.WaitOne(); return id; }
這裡就是工作流程委身的宿主程式,進入工作流程也是通過這個程式來調用的。類似在java中的main。
本例沒有中斷工作流程,故無需持久化到資料庫。
效果
檔案下載:http://pan.baidu.com/s/1jGJuYYa
結語
工作流程解決了這樣一個傳統手動表單傳遞的這樣一個過程,當然如果需要中斷時處理還需要結合持久化資料庫。這裡的例子,僅限簡單瞭解工作流程這樣一個過程。從程式內傳參,到工作流程處理。類似於委託,將這樣一個方法委託給相應的工作流程,工作流程根據規定好的步驟來處理其中的參數和資料。又有點類似模板方法,定義好了演算法的流程然後具體就自己來重寫每個活動的excute方法即可。也相當於流程的處理和實現的解耦,突然覺得還是挺不錯。
再說說我在研究這樣一個新的技術的感悟,確實很困惑,特別是相關資料不是太多的情況下。研究了兩天,瞭解了當中僅限基礎中的基礎。回想我這樣一個經過的時候,從到處找象-盲人摸象-茅塞頓開。
有點撥開雲霧的一絲味道!
初步學習 W F 工作流程