日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编程方式操作WorkFlow

發布時間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程方式操作WorkFlow 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


???????????

背景: ????

???????? 剛進某地產公司,就是做一個工作流的小Demo,就是畫一條采購的工作流,然后代碼實現它。



???????????? 剛開始的時候真的其實挺迷茫的,然后就從自己比較熟悉的實體做起,接著是controller,然后是view,代碼都是參考過N份的,最后代碼寫的差不多了,然后才開始畫一條流程。流程圖就畫了前后有6份,然后改來改去,還好有各位哥哥幫忙,。最后一條流程總算是走了下來。就在上周五的時候,SA突然讓我就開始熟悉需求了,沒想到這么快就要開始干活了。


???

??

簡談

????????

????? 最開始做工作流的時候,感覺它跟職責鏈模式很像,它的處理都是一級一級的,尤其是用工作流處理一個大企業的工作流程的時候,必須要定義的非常嚴格,每一步都要在計劃之內,人只是這一步流程上的資源而已。


????? 做考核項目的時候,是用流程模板設計器做的圖,但是考核項目快要做的時候,看到了一個Training Video,,發現居然也能用編程方式編出整個流程。


???? 雖然編程方式不像可視環境那么舒服,但是學習這種方式操作工作流對于以后我們在編程中控制工作流是很有好處的。



?源碼展示



?

class Program{static void Main(string[] args){#region 編程創建流程——lhc——2015年1月7日14:52:07創建一個流程//WfProcessDescriptor process = new WfProcessDescriptor("workFlowTest");//process.Name = "工作流測試";//流程命名創建一個首節點//WfActivityDescriptor initActDesp = new WfActivityDescriptor("N0", WfActivityType.InitialActivity);//initActDesp.Name = "這是一個首節點";創建一個結束點//WfActivityDescriptor completeActDesp = new WfActivityDescriptor("N1", WfActivityType.CompletedActivity);//completeActDesp.Name = "結束點";//process.Activities.Add(initActDesp); //將首節點加入流程中//process.Activities.Add(completeActDesp);//將尾節點加入流程中// //創建一個正常點//WfActivityDescriptor normalActDesp = new WfActivityDescriptor("N2", WfActivityType.NormalActivity);//normalActDesp.Name = "這是一個比較正常點";從授權中心拿人//var users = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.LogOnName, "fanhy");加入資源到正常點中//normalActDesp.Resources.Add(new WfUserResourceDescriptor(users[0])); //加入資源//process.Activities.Add(normalActDesp);//加入到流程集合中流程之間的連線initActDesp.ToTransitions.AddForwardTransition(completeActDesp); //從起始點加一根向前的線到終結點completeActDesp.ToTransitions.AddBackwardTransition(initActDesp);//從終結點加一個到起始點的回去的線//initActDesp.ToTransitions.AddForwardTransition(normalActDesp); //從起點到正常點的連線//normalActDesp.ToTransitions.AddForwardTransition(completeActDesp);//從正常點到終結點的連線保存流程:從內存到DB//WfProcessDescriptorManager.SaveDescriptor(process); #endregion#region 讀取工作流信息——lhc——2015年1月7日15:33:15根據名稱讀取工作流// IWfProcessDescriptor processDesp = WfProcessDescriptorManager.GetDescriptor("workFlowTest"); // // Console.WriteLine(processDesp.Name);//輸出工作流名稱// EnumActivities(processDesp.InitialActivity); //打印起點#endregion#region 啟動流程——lhc——2015年1月7日16:25:40//根據名稱讀取工作流//IWfProcessDescriptor processDesp = WfProcessDescriptorManager.GetDescriptor("workFlowTest");//WfProcessStartupParams startupParams = new WfProcessStartupParams(); //啟動流程的參數//startupParams.ProcessDescriptor = processDesp; //要啟動的流程賦值運行態可以重新定義人(資源),流程設計器里提前配好的資源只是一個默認值//startupParams.Assignees.Add(processDesp.InitialActivity.Resources.ToUsers()); //將第一個節點的人抄過來//startupParams.ResourceID = UuidHelper.NewUuidString();//UUID賦值//IWfProcess process = WfRuntime.StartWorkflow(startupParams);//啟動流程打印//Console.WriteLine(process.ID);//流程ID//Console.WriteLine(process.Descriptor.Name);//流程描述--------在這之前,所有的操作都是在內存中的//WfRuntime.PersistWorkflows();//持久化工作流//Console.WriteLine(process.ID);//ID#endregion#region 獲取運行時流程——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);//獲取當前節點名稱//TODO:沒有找到UserTaskAdapter// UserTaskCollection tasks = UserTaskAdapter.Instance.LoadUserTasks(builder => builder.AppendItem("Activity_id",processStart .CurrentActivity .ID)); ////Console.WriteLine(task.count);//輸出數量#endregion#region 流程的流轉——lhc——2015年1月7日16:25:59// IWfProcess processStart = WfRuntime.GetProcessByProcessID("288926d4-8c53-bdb5-47b1-b655d002b1e7");// //找到起始點的下一個結點// IWfActivityDescriptor targetActDesp = processStart.InitialActivity.Descriptor.ToTransitions[0].ToActivity;// //流轉參數// WfTransferParams transferParams = new WfTransferParams(targetActDesp);// transferParams.Assignees.Add(targetActDesp.Resources.ToUsers()); //加入資源// processStart.MoveTo(transferParams); //從第一個節點流轉到下一個// //流程上下文WfRuntime.ProcessContext // //處理掛起的流程——一個流程只能有一個處于掛起的// //WfRuntime.ProcessPendingActivity();// //等待一個外部條件// //// processStart.ApplicationRumtimeParameters["Data"] = "lhc";//流程參數賦值,但是WfRuntime.PersistWorkflows(); 不能被此條語句保存// //強制保存的語句——important// //一般經過方法調用流程的都不用這句話。// WfRuntime.ProcessContext.AffectedProcesses.AddOrReplace(processStart );//請執行保存// //將內存中的操作持久化到數據庫// WfRuntime.PersistWorkflows(); //moveto這種大改動可以被此條語句保存// Console.WriteLine(processStart.CurrentActivity.Descriptor.Name); //打印出當前節點名稱#endregion#region executor啟動流程——lhc——2015年1月7日21:49:53//流程啟動參數WfProcessStartupParams startupParams = new WfProcessStartupParams();//獲取要啟動流程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啟動流程//改變標題——加入委托方法executor.PrepareMoveToTasks += new PrepareTasksEventHandler(executor_PrepareMoveToTasks);IWfProcess process= executor.Execute();//執行Console.WriteLine(process .ID);//輸出流程ID#endregion}#region executor啟動流程上搭載的方法——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 根據節點深度遍歷流程//foreach打印流程名稱//private static void EnumActivities(IWfActivityDescriptor astDesp)//{// Console.WriteLine(astDesp.Name); //打印節點名稱// astDesp.Resources.ToUsers().ForEach(u => Console.WriteLine(u.DisplayName)); //foreach打印節點資源名稱// if (astDesp.ActivityType !=WfActivityType .CompletedActivity)// {// //每個節點都有兩端,fromActivity和toActivity;// //深度遍歷搜索// astDesp.ToTransitions.ForEach(t => EnumActivities(t.ToActivity));// }//}#endregion}

?

PS: ????? 為了使用操作工作流的各種對象,還要引入一些平臺封裝的類庫什么的




小結

???????????? 感覺在程序中,所有的東西都是為一整條流程服務的,就連人也變成了資源依附在流程上,就像這里所提倡的,人依附于事的思想。

??????????
















??????????

總結

以上是生活随笔為你收集整理的编程方式操作WorkFlow的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。