状态机工作流例子_第1页
状态机工作流例子_第2页
状态机工作流例子_第3页
状态机工作流例子_第4页
状态机工作流例子_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、例子1地址:状态机工作流主要跟以下几个活动有关。State:表示一个审批状态。内部可以放置StateInitialization、EventDrivenActivity和StateFinalization 3个活动。StateInitialization:用来初始化状态,一般在这个活动内部添加CreateTask实现任务的创建。StateFinalization:当状态结束时被执行。 EventDrivenActivity:用来接受事件,一般在内部放置一个OnTaskChange活动等待任务完成。SetState:用来实现流程状态的跳转。SetState活动一般放置在OnTaskCh

2、ange活动后,在任务完成后按照任务表单域设置流程状态。拖曳4个State活动到设计器中。分别改名为preApprovalActivity、approvalActivity、reSubmitActivity和completeActivity。通过右键菜单,将completeActivity活动设置为终止状态,如图。1 双击Workflow1InitialState活动中的"EventDriven"活动,在其中添加一个SetState活动,设置其TargetState为"preApprovalActivity"。2 添加CreateTask活动,创建审批任

3、务。拖曳stateInitializationActivity到preApprovalActivity内部,双击"stateInitializationActivity",在stateInitializationActivity内部添加一个CreateTask活动,改名为"createPreApprovalTask",指定其CorrelationToken为"preApprovalTaskToken",将其SpecialPermission属性绑定到工作流的preApprovalTaskSpecialPermissions字段Task

4、Id属性绑定到工作流的preApprovalTaskId字段TaskProperties属性绑定到工作流的preApprovalTaskProperties字段如图所示。3 处理createPreApprovalTask的MethodInvoking方法,代码如下。private void createPreApprovalTask_MethodInvoking(object sender, EventArgs e)preApprovalTaskId = Guid.NewGuid();preApprovalTaskProperties.Title = "文档预审"preAp

5、provalTaskProperties.TaskType = 0; /审批任务采用第一个任务表单preApprovalTaskProperties.AssignedTo = "codeartuser1" /指定审批人/设置任务编辑权限preApprovalTaskSpecialPermissions.Clear(); preApprovalTaskSpecialPermissions.Add(preApprovalTaskProperties. AssignedTo, SPRoleType.Contributor);以上代码将文档预审任务分配给user1。4 添加OnTa

6、skChanged活动,等待任务完成,并进行处理。返回到工作流设计器界面,拖曳EventDriven活动到preApprovalActivity,双击"EventDriven"活动,在EventDriven活动中添加OnTaskChanged活动,改名为"onPreApprovalTaskChanged"。设置CorrelationToken属性跟createPreApprovalTask活动一致,将AfterProperties和BeforeProperties属性均绑定到preApprovalTaskProperties字段,将TaskId属性绑定到

7、preApprovalTaskId字段,如图所示。5 处理Invoked事件,代码如下。  private void onApprovalTaskChanged_Invoked(object sender, ExternalDataEventArgs e)  /获取到产生事件的OnTaskChanged活动    OnTaskChanged onTaskChangedActivity = (OnTaskChanged)sender;SPWorkflowTaskProperties taskProp = onTaskChangedActivity

8、.AfterProperties;/按照表单中approvalState域设置审批状态this.approvalState = (ApprovalState)Enum.Parse(typeof(ApprovalState), taskProp.ExtendedProperties"approvalState".ToString(), true);string comments = "" + taskProp.ExtendedProperties"comments"/记录日志this.workflowProperties.Workflo

9、w.CreateHistoryEvent( (int) SPWorkflowHistoryEventType.WorkflowComment, 0, this.workflowProperties.OriginatorUser, this.approvalState.ToString(),"审批用户:" + taskProp.AssignedTo + "审批时间:" + DateTime.Now + "审批意见:" + comments, "");6 设置状态转换逻辑。添加一个IfElse活动到EventDrive

10、n活动中,并添加一个条件分支。设置第1个分支的Condition为规则条件,名称为"IsApproval",表达式为:this.approvalState = ApprovalState.Approval在第1个分支中添加1个SetState活动,设置其TargetState为approvalActivity。设置第2个分支的Condition为规则条件,名称为"IsReSubmit",表达式为:this.approvalState = ApprovalState.ReSubmit在第2个分支中添加1个SetState活动,设置其TargetState为

11、"reSubmitActivity"。设置第3个分支的Condition为规则条件,名称为"IsComplete",表达式为:this.approvalState = ApprovalState.Complete在第3个分支中添加1个SetState活动,设置其TargetState为completeActivity。最后的EventDriven活动设计器效果如图所示。7 按照同样的步骤,完成approvalActivity活动和reSubmitActivity活动的设置。最终的设计器如图所示。从以上的流程可以看出示例项目中实现的流转逻辑:preAppr

12、ovalActivity可以转向reSubmitActivity、approvalActivity或completeActivity,而reSubmitActivity只能转回preApprovalActivity,approvalActivity只能转向completeActivity。例子2地址:建立一个sharepoint 2007 状态机工作流项目1 打开vs20082 文件新建项目3 选择sharepoint 2007状态机工作流4 输入工作流名称ExpenseReportStateMachineWF5 输入有效的sharepoint web url,如:6 库或列表后面的选项选择要

13、附加的库或列表,然后下一步,完成。7 把workflow1.cs重命名为ExpenseReportStateMachineWorkflow.cs设计你的状态机工作流添加状态并设置开始和终止状态1 工作流里已经默认包含了一个名为Workflow1InitalState的状态。在它上面点右键,选属性,在属性窗口里把名字改成ReportInitialState。2 打开工具栏,点开sharepoint工作流控件列表和Windows Workflow v3.0控件列表。3 Windows Workflow v3.0类别中选择State,并且把它拖拽到设计器中。注:State就是状态机中的状态4 打开它

14、的属性,把名字改成ReportSubmittedState。5 再增加三个状态,它们的名字分别是ReportApprovedState, ReportRejectedState, ReportCompleteState。6 将ReportInitialState设置为开始状态,在它上面点右键,选设置为初始状态,在这个状态的左上角的小图标里多出了一个绿色的标志。7 将ReportCompleteState设置为结束状态,右键选择设置为已完成状态,在这个状态左上角的小图标里面多了一个红色的标志。开始和结束状态所有用到的状态已经在设计器中,下面为状态添加activities(行为)状态支持以下几种a

15、ctivities(行为): StateActivityEventDrivenActivityStateInitializationActivityStateFinalizationActivity这里只需要StateInitializationActivity和EventDrivenActivity两种行为1 选择ReportInitialState状态下的eventDrivenActivity1。2 在它的属性里重命名为eventInitWorkflow。3 拖拽一个StateInitializationActivity到ReportSubmittedState状态中,并重命名为state

16、InitReportSubmittedState。4 在ReportApprovedState和ReportRejectedState状态中重复上面一步的操作,并把它们重命名为stateInitReportApprovedState和stateInitReportRejectedState。5 Drag an EventDriven activity to the ReportSubmittedState. Rename it to eventReviewReport. 为ReportSubmittedState状态拖拽一个EventDrivenActivity,并重命名为eventRevie

17、wReport。注意:拖拽的EventDriven应该放在StateInitialization的下面。你的设计器中的工作流如下图:下面,该为每个状态填充更详细的内容。为初始化状态添加详细内容 1 双击ReportInitialState状态中的eventInitWorkflow,如图:你可以通过视图中顶部靠左边的链接回到前面的视图中。2 把onWorkflowActivated1重命名为onReportWorkflowActivated。3 在属性窗口里面找到CorrelationToken属性,并把它后面的下拉菜单中选择workflowToken。点开CorrelationToken前面的

18、(+),在OwnerActivityName后面选择ExpenseReportStateMachineWorkflow。找到WorkflowProperties属性,点他后面的(.)。4 在新弹出的对话框中,选择绑定到现有成员选项卡,选择下面的workflowProperties,点确定。5 最后,你可以在onReportWorkflowActivated上点右键,选择生成处理程序。它可以在后置代码断里自动生成一个方法,用来写你自己的代码。然后回到设计器中。6 拖拽一个CreateTask到onReportWorkflowActivated下面,并把它重命名为createReportTask。

19、7 在它的属性窗口里面找到CorrelationToken属性,输入taskToken。点开CorrelationToken前面的(+),找到OwnerActivityName,选择ExpenseReportStateMachineWorkflow。找到TaskId点击后面的(.)。8 在新弹出的绑定对话框中,选择绑定到新成员选项卡,输入taskId选择下面的创建字段,然后点确定。9 接下来,选择TaskProperties属性,点击后面的(.),在绑定对话框中选择绑定到新成员选项卡,输入taskProperties,选择创建字段,然后点确定。10 最后,可以在createReportTask

20、上点右键,选生成处理程序,在后置代码中自动生成一个方法。11 拖拽一个SetState到createReportTask下面。注意:在vs2008中有两个SetState。这里用到的是Windows Workflow v3.0下面的。12 把它重命名为setStateSubmitted,找到TargetStateName属性,选择ReportSubmittedState。点击视图顶部左边的ExpenseReportStateMachineWorkflow链接,回到状态视图中为Submitted 状态添加详细内容1. 双击ReportSubmittedState状态下的stateInitRepo

21、rtSubmittedState来打开详细视图。2. 拖拽一个LogToHistoryListActivity行为到设计界面,并重命名为logToHistoryReportSubmittedState。3. 右击logToHistoryReportSubmittedState,选择生成处理程序。然后回到设计视图中。4. 回到状态视图,双击ReportSubmittedState里面的eventReviewReport。拖拽一个onTaskChanged到设计视图中,并改名为onTaskChangedReportReviewed。在属性窗口中找到CorrelationToken,在下拉菜单中选择

22、taskToken。5. 找到AfterProperties属性,点开它后面的(.)。在绑定对话框中,选择绑定到新成员选项卡。输入afterProperties,选择创建字段,然后点确定。重复步骤来设置BeforeProperties。6. 找到TaskId属性,点击后面的(.)。在绑定对话框中,选择绑定到现有成员选项卡,选择下面的taskId,然后点确定。7. 右击onTaskChangedReportReviewed,选择生成处理程序来写自己的处理代码。然后返回设计视图。8. 拖拽IfElse到onTaskChangedReportReviewed下面,并重命名为ifElseReportR

23、eview。9. 把左边的if分支重命名为ifElseReportApproved。在它的属性里找到Condition属性,在后面的下拉菜单中选择代码条件。打开Condition前面的(+),在下面的Condition后面输入IsReportApproved,然后按回车。这时系统会自动建立一个空的方法,名为IsReportApproved,然后回到设计界面。10. 把第二个if分支重命名为ifElseReportRejected,在它的属性里找到Condition属性,在后面的下拉菜单中选择代码条件。打开Condition前面的(+),在下面的Condition后面输入IsReportReje

24、cted,然后按回车。11. 拖拽一个SetState到if的第一分支上,也就是ifElseReportApproved,然后重命名为setStateReportApproved。在它的属性里,找到TargetStateName属性,在它后面的下拉菜单中选择ReportApprovedState。12. 拖拽一个SetState到if的第二个分支上,然后重命名为setStateReportRejected。设置TargetStateName属性为ReportRejectedState。13. 点击设计视图左上角的ExpenseReportStateMachineWorkflow链接,回到状态视

25、图。为通过审批状态和没通过审批状态添加详细内容1 双击ReportApprovedState中的StateInitReportApprovedState。2 拖拽一个LogToHistoryListActivity到设计界面中,并重命名为logToHistoryReportApprovedState。3 右击logToHistoryReportApprovedState,选择生成处理程序。然后回到设计界面。4 拖拽一个CompleteTask到logToHistoryReportApprovedState下面,并重命名为completeTaskReportApproved。设置它的Correl

26、ationToken属性为taskToken。点击它的TaskId属性后面的(.)。在绑定对话框中,选择绑定到现有成员选项卡,然后选择下面的taskId,然后点确定。5 右击completeTaskReportApproved,选择生成处理程序。然后返回到设计视图。6 拖拽一个SetState到completeTaskReportApproved下面,并把它重命名为setStateReportApprovedComplete。设置它的TargetStateName属性为ReportCompleteState。7 重复上面步骤来设置ReportRejectedState。logToHistory

27、ReportrejectedState;completeTaskReportrejected;setStateReportrejectedComplete。8 Figure 5. Complete workflow layout添加代码Now that you have designed your workflow, you must add code to provide the logic.To add code to the workflowAdd your own fields, as follows. 添加你的字段C#Copy Code/ Status.   &#

28、160;            private bool isReportApproved;                / Report Information.                private string employeeName;         

29、;       private string mngrEmail;                private string mngrName;                private double reportTotal;               

30、; private string domain;                Add properties for each field. You do not have to provide setters; getters are sufficient. 给每个字段添加属性把下面代码添加到onReportWorkflowActivated_Invoked中C#/ Read in Expense Report form values.      

31、60;         employeeName = workflowProperties.ItemEmployee Name.ToString();                mngrName = workflowProperties.ItemManager Name.ToString();                mngrEmail

32、= workflowProperties.ItemManager Email Address.ToString(); reportTotal = (double)workflowProperties.ItemReport Total; domain = workflowProperties.ItemDomain.ToString(); 关于如何设置infopath表单字段域,请看Creating a Custom Approval Workflow for SharePoint Server 2007 Using SharePoint Designer 2007把

33、下面代码添加到createReportTask_MethodInvoking中C#/ Create unique Task Id.taskId = Guid.NewGuid();  / Set task properties. taskProperties.TaskType = 1; taskProperties.Title = Expense Report Approval; taskProperties.StartDate = DateTime.Today; taskProperties.PercentComplete = 0.0f; ta

34、skProperties.AssignedTo = Domain + + ManagerName;把下面代码添加到onTaskChangedReportReviewed_Invoked中C#/ Retrieve report approval value from task form.                string selVal = afterProperties.ExtendedPropertiesoptApproval.ToString();int val = 0;&

35、#160;if (!String.IsNullOrEmpty(selVal)                 if (Int32.TryParse(selVal, out val)                if (val = 1)   isReportApproved = true;         

36、                        / Show that the task is in progress. taskProperties.PercentComplete = 50; 把下面代码添加到IsReportRejected方法中C#/ Check to see if report is rejected.if (!isReportApproved)  e.Result = true; Add t

37、he following code to the IsReportApproved method. 把下面代码添加到IsReportApproved方法中C#/ Check to see if report is approved.if (isReportApproved)  e.Result = true;   把下面代码添加到completeTaskReportApproved_MethodInvoking和completeTaskReportRejected_MethodInvoking方法中C#/ Complete the task. taskP

38、roperties.PercentComplete = 100; 现在添加日志代码。把下面代码添加到logToHistoryReportSubmittedState_MethodInvoking方法中。C#LogToHistoryListActivity log = (LogToHistoryListActivity)sender;if (log != null) log.HistoryDescription = Report Submitted; 重复上面的步骤,把上面代码添加到logToHistroyReportApprovedState_MethodInvoking和logTo

39、HistoryReportRejectedState_MethodInvoking方法中,修改Report Submitted为Report Approved或者Report Rejected。修改Workflow.xml文件你要确定在Workflow.xml中包含你的费用报销流程表单添加下面的元素作为MetaData的子元素。Xml<Task1_FormURN>urn:schemas-microsoft-comffice:infopath: ExpenseReportApprovalForm: -myXSD-2008-04-09T15-47-41</Task1_FormURN> 用你自己的费用报销表单的URN替换上面的URN。你可以通过,在设计器中打开你的表单,然后点文件->属性查看。添加TaskListContentTypeId属性到Workflow元素中。XmlCopy CodeTaskListC 注意: 如果你的表单不能正确显示,请检查上面的编号是否正确。把CodeBesideClass的值为ExpenseReportStateMachineWF.ExpenseReportStateMachineWork

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论