编程方式操作WorkFlow
???????????
背景: ????
???????? 剛進(jìn)某地產(chǎn)公司,就是做一個(gè)工作流的小Demo,就是畫(huà)一條采購(gòu)的工作流,然后代碼實(shí)現(xiàn)它。
???????????? 剛開(kāi)始的時(shí)候真的其實(shí)挺迷茫的,然后就從自己比較熟悉的實(shí)體做起,接著是controller,然后是view,代碼都是參考過(guò)N份的,最后代碼寫(xiě)的差不多了,然后才開(kāi)始畫(huà)一條流程。流程圖就畫(huà)了前后有6份,然后改來(lái)改去,還好有各位哥哥幫忙,。最后一條流程總算是走了下來(lái)。就在上周五的時(shí)候,SA突然讓我就開(kāi)始熟悉需求了,沒(méi)想到這么快就要開(kāi)始干活了。
???
??
簡(jiǎn)談
????????
????? 最開(kāi)始做工作流的時(shí)候,感覺(jué)它跟職責(zé)鏈模式很像,它的處理都是一級(jí)一級(jí)的,尤其是用工作流處理一個(gè)大企業(yè)的工作流程的時(shí)候,必須要定義的非常嚴(yán)格,每一步都要在計(jì)劃之內(nèi),人只是這一步流程上的資源而已。
????? 做考核項(xiàng)目的時(shí)候,是用流程模板設(shè)計(jì)器做的圖,但是考核項(xiàng)目快要做的時(shí)候,看到了一個(gè)Training Video,,發(fā)現(xiàn)居然也能用編程方式編出整個(gè)流程。
???? 雖然編程方式不像可視環(huán)境那么舒服,但是學(xué)習(xí)這種方式操作工作流對(duì)于以后我們?cè)诰幊讨锌刂乒ぷ髁魇呛苡泻锰幍摹?/span>
?源碼展示
?
class Program{static void Main(string[] args){#region 編程創(chuàng)建流程——lhc——2015年1月7日14:52:07創(chuàng)建一個(gè)流程//WfProcessDescriptor process = new WfProcessDescriptor("workFlowTest");//process.Name = "工作流測(cè)試";//流程命名創(chuàng)建一個(gè)首節(jié)點(diǎn)//WfActivityDescriptor initActDesp = new WfActivityDescriptor("N0", WfActivityType.InitialActivity);//initActDesp.Name = "這是一個(gè)首節(jié)點(diǎn)";創(chuàng)建一個(gè)結(jié)束點(diǎn)//WfActivityDescriptor completeActDesp = new WfActivityDescriptor("N1", WfActivityType.CompletedActivity);//completeActDesp.Name = "結(jié)束點(diǎn)";//process.Activities.Add(initActDesp); //將首節(jié)點(diǎn)加入流程中//process.Activities.Add(completeActDesp);//將尾節(jié)點(diǎn)加入流程中// //創(chuàng)建一個(gè)正常點(diǎn)//WfActivityDescriptor normalActDesp = new WfActivityDescriptor("N2", WfActivityType.NormalActivity);//normalActDesp.Name = "這是一個(gè)比較正常點(diǎn)";從授權(quán)中心拿人//var users = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.LogOnName, "fanhy");加入資源到正常點(diǎn)中//normalActDesp.Resources.Add(new WfUserResourceDescriptor(users[0])); //加入資源//process.Activities.Add(normalActDesp);//加入到流程集合中流程之間的連線initActDesp.ToTransitions.AddForwardTransition(completeActDesp); //從起始點(diǎn)加一根向前的線到終結(jié)點(diǎn)completeActDesp.ToTransitions.AddBackwardTransition(initActDesp);//從終結(jié)點(diǎn)加一個(gè)到起始點(diǎn)的回去的線//initActDesp.ToTransitions.AddForwardTransition(normalActDesp); //從起點(diǎn)到正常點(diǎn)的連線//normalActDesp.ToTransitions.AddForwardTransition(completeActDesp);//從正常點(diǎn)到終結(jié)點(diǎn)的連線保存流程:從內(nèi)存到DB//WfProcessDescriptorManager.SaveDescriptor(process); #endregion#region 讀取工作流信息——lhc——2015年1月7日15:33:15根據(jù)名稱(chēng)讀取工作流// IWfProcessDescriptor processDesp = WfProcessDescriptorManager.GetDescriptor("workFlowTest"); // // Console.WriteLine(processDesp.Name);//輸出工作流名稱(chēng)// EnumActivities(processDesp.InitialActivity); //打印起點(diǎn)#endregion#region 啟動(dòng)流程——lhc——2015年1月7日16:25:40//根據(jù)名稱(chēng)讀取工作流//IWfProcessDescriptor processDesp = WfProcessDescriptorManager.GetDescriptor("workFlowTest");//WfProcessStartupParams startupParams = new WfProcessStartupParams(); //啟動(dòng)流程的參數(shù)//startupParams.ProcessDescriptor = processDesp; //要啟動(dòng)的流程賦值運(yùn)行態(tài)可以重新定義人(資源),流程設(shè)計(jì)器里提前配好的資源只是一個(gè)默認(rèn)值//startupParams.Assignees.Add(processDesp.InitialActivity.Resources.ToUsers()); //將第一個(gè)節(jié)點(diǎn)的人抄過(guò)來(lái)//startupParams.ResourceID = UuidHelper.NewUuidString();//UUID賦值//IWfProcess process = WfRuntime.StartWorkflow(startupParams);//啟動(dòng)流程打印//Console.WriteLine(process.ID);//流程ID//Console.WriteLine(process.Descriptor.Name);//流程描述--------在這之前,所有的操作都是在內(nèi)存中的//WfRuntime.PersistWorkflows();//持久化工作流//Console.WriteLine(process.ID);//ID#endregion#region 獲取運(yùn)行時(shí)流程——lhc——2015年1月7日16:25:49288926d4-8c53-bdb5-47b1-b655d002b1e7//IWfProcess processStart = WfRuntime.GetProcessByProcessID("288926d4-8c53-bdb5-47b1-b655d002b1e7");Console.WriteLine();//Console.WriteLine(processStart.CurrentActivity.Descriptor.Name);//獲取當(dāng)前節(jié)點(diǎn)名稱(chēng)//TODO:沒(méi)有找到UserTaskAdapter// UserTaskCollection tasks = UserTaskAdapter.Instance.LoadUserTasks(builder => builder.AppendItem("Activity_id",processStart .CurrentActivity .ID)); ////Console.WriteLine(task.count);//輸出數(shù)量#endregion#region 流程的流轉(zhuǎn)——lhc——2015年1月7日16:25:59// IWfProcess processStart = WfRuntime.GetProcessByProcessID("288926d4-8c53-bdb5-47b1-b655d002b1e7");// //找到起始點(diǎn)的下一個(gè)結(jié)點(diǎn)// IWfActivityDescriptor targetActDesp = processStart.InitialActivity.Descriptor.ToTransitions[0].ToActivity;// //流轉(zhuǎn)參數(shù)// WfTransferParams transferParams = new WfTransferParams(targetActDesp);// transferParams.Assignees.Add(targetActDesp.Resources.ToUsers()); //加入資源// processStart.MoveTo(transferParams); //從第一個(gè)節(jié)點(diǎn)流轉(zhuǎn)到下一個(gè)// //流程上下文WfRuntime.ProcessContext // //處理掛起的流程——一個(gè)流程只能有一個(gè)處于掛起的// //WfRuntime.ProcessPendingActivity();// //等待一個(gè)外部條件// //// processStart.ApplicationRumtimeParameters["Data"] = "lhc";//流程參數(shù)賦值,但是WfRuntime.PersistWorkflows(); 不能被此條語(yǔ)句保存// //強(qiáng)制保存的語(yǔ)句——important// //一般經(jīng)過(guò)方法調(diào)用流程的都不用這句話。// WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(processStart );//請(qǐng)執(zhí)行保存// //將內(nèi)存中的操作持久化到數(shù)據(jù)庫(kù)// WfRuntime.PersistWorkflows(); //moveto這種大改動(dòng)可以被此條語(yǔ)句保存// Console.WriteLine(processStart.CurrentActivity.Descriptor.Name); //打印出當(dāng)前節(jié)點(diǎn)名稱(chēng)#endregion#region executor啟動(dòng)流程——lhc——2015年1月7日21:49:53//流程啟動(dòng)參數(shù)WfProcessStartupParams startupParams = new WfProcessStartupParams();//獲取要啟動(dòng)流程startupParams.ProcessDescriptor = WfProcessDescriptorManager.GetDescriptor("workFlowTest");startupParams .ResourceID =UuidHelper .NewUuidString ();//流程GUID賦值//加入資源startupParams.Assignees.Add(startupParams.ProcessDescriptor.InitialActivity.Resources.ToUsers());WfStartWorkflowExecutor executor = new WfStartWorkflowExecutor(null, startupParams);//使用executor啟動(dòng)流程//改變標(biāo)題——加入委托方法executor.PrepareMoveToTasks += new PrepareTasksEventHandler(executor_PrepareMoveToTasks);IWfProcess process= executor.Execute();//執(zhí)行Console.WriteLine(process .ID);//輸出流程ID#endregion}#region executor啟動(dòng)流程上搭載的方法——lhc——2015年1月7日21:50:11private static void executor_PrepareMoveToTasks(WfExecutorDataContext dataContext, MCS.Library.SOA.DataObjects.UserTaskCollection tasks){tasks.ForEach(t => t.TaskTitle = "lhc");}#endregion#region 根據(jù)節(jié)點(diǎn)深度遍歷流程//foreach打印流程名稱(chēng)//private static void EnumActivities(IWfActivityDescriptor astDesp)//{// Console.WriteLine(astDesp.Name); //打印節(jié)點(diǎn)名稱(chēng)// astDesp.Resources.ToUsers().ForEach(u => Console.WriteLine(u.DisplayName)); //foreach打印節(jié)點(diǎn)資源名稱(chēng)// if (astDesp.ActivityType !=WfActivityType .CompletedActivity)// {// //每個(gè)節(jié)點(diǎn)都有兩端,fromActivity和toActivity;// //深度遍歷搜索// astDesp.ToTransitions.ForEach(t => EnumActivities(t.ToActivity));// }//}#endregion}?
PS: ????? 為了使用操作工作流的各種對(duì)象,還要引入一些平臺(tái)封裝的類(lèi)庫(kù)什么的
小結(jié)
???????????? 感覺(jué)在程序中,所有的東西都是為一整條流程服務(wù)的,就連人也變成了資源依附在流程上,就像這里所提倡的,人依附于事的思想。
??????????
??????????
總結(jié)
以上是生活随笔為你收集整理的编程方式操作WorkFlow的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: coj_1224: ACM小组的古怪象棋
- 下一篇: RK3399 Android7.1电脑端