sharepoint高效率工作流开发_第1页
sharepoint高效率工作流开发_第2页
sharepoint高效率工作流开发_第3页
sharepoint高效率工作流开发_第4页
sharepoint高效率工作流开发_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

本章主要阐述SharePoint Designer 2007(SPD)的工作流应用及利用WF对SharePoint Designer工作流组件(动作和条件)进行扩展,讲解利用WF和Visual Studio 2008开发工作流模板的方法。本章提供视频教程:采用SPD设计工作流的默认方式和定制后的方式。本章包括:n 工作流开发概述n 采用SharePoint Designer设计工作流n SharePoint Designer工作流的扩展n 采用Visual Studio 2008 开发工作流模板7.1 工作流开发概述SharePoint基于WF(Window Workflow Foundation)构建了它的工作流功能。WF是SharePoint工作流框架的基础,要深入了解SharePoint工作流的开发,首先应该了解WF的一些基础知识,本章对WF的技术细节并不会过多讲解。本节将讲述SharePoint工作流的基础知识,并介绍系统自带的工作流模板的使用和默认的工作流任务操作方式。7.1.1 工作流开发环境的搭建如果使用Visual Studio 2005开发SharePoint工作流应用,首先需要安装Visual Studio 2005的WF扩展Visual Studio 2005 Extensions for Windows Workflow Foundation ,可以在以下地址下载:/downloads/details.aspx?familyid= 5D61409E-1FA3-48CF- 8023-E8F38E709BA6&displaylang=zh-cn。然后安装Office SharePoint Server 2007 SDK。采用Visual Studio 2005开发SharePoint工作流,无论是开发环境的搭建还是开发时调试和测试,都比较烦琐。Visual Studio 2008已经发布正式版了,VS 2008提供了对SharePoint工作流开发更好的支持,直接集成了开发、部署和调试。本章的示例将采用VS 2008来进行。为了便于调试和测试工作流,选择直接在SharePoint服务器环境下开发,因此VS 2008要直接安装在SharePoint服务器上。7.1.2 SharePoint工作流的基本概念SharePoint工作流是一个预先定义好的对列表项或文档库文档的处理流程。一个工作流实例跟一个列表项或文档进行关联,工作流实例不能脱离列表项存在。当需要用户处理数据的时候,比如进行审批操作,系统会创建一个任务到某个任务列表中,审批用户操作列表中的任务来实现跟流程实例的交互。工作流实例可以在列表新建、修改时自动启动,或者可以由用户手动启动。MOSS支持两种工作流的开发方式。l 利用SharePoint Designer可以设计简单的无代码顺序工作流。在SharePoint Designer中,可以直接创建跟某个列表或文档库关联的工作流,在工作流中,可以直接访问列表项的字段,获取字段的值作逻辑判断或者给字段赋值,给用户分配审批任务并动态生成审批界面。SharePoint Designer设计的工作流只能跟一个列表(或文档库)关联,单个工作流无法用于多个列表,不同列表(或文档库)的工作流处理逻辑即使一样,也只能分别进行设计。 采用SharePoint Designer设计工作流的优点是操作简单,无须编译和部署,缺点是只能实现顺序操作逻辑,无法实现退回等循环逻辑,审批界面自动生成,也无法实现一些复杂的操作。7.2节将演示采用SharePoint Designer设计工作流的步骤。l 利用Visual Studio可以开发复杂的顺序或状态机工作流。在Visual Studio 2008中,可以直接在WF设计器中开发工作流,工作流开发好后,编译成DLL,然后采用Feature部署到SharePoint服务器,在网站中将Feature激活后,工作流即可使用了,可以把这种工作流关联到多个列表。所以又称Visual Studio 2008设计的工作流为工作流模板。Visual Studio 2008开发工作流的优点是能实现很复杂的流程逻辑,开发出来的工作流模板可以供多个网站、多个列表使用。流程任务的操作界面可以采用infopath或者直接采用aspx页面,这样就可以实现较复杂的页面操作。缺点就是开发部署比较复杂,对开发人员要求较高。7.1.3 SharePoint工作流的操作方式SharePoint的工作流的默认操作方式并不适合用户的操作习惯,一般来说其他工作流产品的操作方式是用户在一个页面上完成所有操作,包括查看业务数据(被审批数据)、填写审批意见等。而SharePoint工作流的操作方式是:业务数据跟审批数据分离,业务数据可以用列表项或文档库中的文档来表示,用户审批的时候默认只看到审批页面,只有单击链接才能查看业务数据,这种操作方式对文档审批还是说的过去的,但是对列表数据的审批操作就有点“不够人性化”了。在实际的项目中,需要对用户的操作习惯进行引导。SharePoint默认提供了很多工作流模板,这些工作流模板跟采用VS 2008开发的工作流模板操作上是一样的。下面看一下系统自带的“审批”工作流模板的使用。要在SharePoint中使用一个工作流模板,首先需要将工作流模板跟文档库或列表关联,操作步骤如下。Step1 在文档库的设置页面单击“工作流设置”链接,如图7-1所示。图7-1 工作流设置Step2 在添加工作流页面中,选择工作流模板为“审批”,输入工作流名称为“文档审批”,单击“下一步”,如图7-2所示。图7-2 添加工作流任务列表是用户存放工作流给审批用户分配的任务列表项的列表,可选择系统已经存在的任务列表或者新建一个任务列表。历史记录列表用户存放工作流运行工程中产生的日志信息。Step3 在工作流参数设置页面中,选择任务分配对象为“串行”,输入两个用户作为审批者,选择“文档被拒绝”时取消工作流,选择“工作流完成后”为“更新审批状态”,如图7-3所示。单击“确定”按钮完成设置。图7-3 设置工作流参数设置工作流参数页面又叫做工作流关联界面,本示例中的关联界面是采用InfoPath表单开发的,这个表单叫做工作流关联表单,7.4.7节将讲述工作流关联表单的开发。Step4 为了方便审批用户的操作,需要将用户任务WebPart添加到网站的首页,如图7-4所示。图7-4 添加用户任务WebPart工作流的配置操作已经完成,下面我们看一下这个工作流的使用。Step1 在文档库中新建或上传一个文档,然后在下拉列表中选择“工作流”选项,如图7-5所示。图7-5 选择“工作流”选项Step2 单击“文档审批”工作流,如图7-6所示。图7-6 选择工作流Step3 在接下来的配置审批参数页面中,可以输入审批信息,如图7-7所示。再单击“启动”按钮。图7-7 配置审批参数这个配置审批参数的页面在工作流启动(初始化)的时候出现,因此叫做初始化表单,可以采用infopath开发,在7.4.8节将具体讲述工作流初始化表单的开发。现在文档审批工作流已经启动,返回到文档库页面,可以看到文档库上多出来一个“文档审批”栏,如图7-8所示。通过“文档审批”栏中的链接可以链接到工作流监控和管理页面,如图7-9所示。通过工作流监控和管理页面,可以查看工作流任务的分配和完成情况,强制终止工作流。图7-8 文档库中工作流链接图7-9 工作流监控页面用第一个审批用户的账号登录系统,可以在用户任务Web部件中看到需要操作的任务,如图7-10所示。图7-10 工作流任务单击任务链接,在接下来的任务操作页面中可以通过链接查看被审批的文档,通过下方的“批准”和“拒绝”按钮进行审批,如图7-11所示。图7-11 任务页面任务操作页面又称为任务表单,可以采用infopath开发,在7.4.4节将具体讲述。用第2个审批用户的账号登录系统,进行批准操作。两个审批用户都批准之后,返回到文档库页面,可以看到文档审批的状态已经变成“已批准”,如图7-12所示。图7-12 文档库7.2 采用SharePoint Designer设计工作流SharePoint Designer可以设计无代码的工作流,对列表项或文档启用处理逻辑。SharePoint Designer只能设计出简单的顺序工作流,本节了解一下具体的操作方法。7.2.1 列表项流程示例本节演示一个员工请假流程的设计:员工提交请假单,由审批人进行审批,审批人批准之后,自动添加一个日程到日历列表中,如果不批准,则邮件通知提交人。具体的操作步骤如下。Step1 创建列表。新建一个自定义列表,名称为“员工请假”,添加如图7-13所示的栏。图7-13 创建列表Step2 启用列表的内容审批。通过“列表设置”“版本控制设置”,启用列表的内容审批。设置“仅限可批准项目的用户”可以查看列表中的草稿项目,如图7-14所示。图7-14 启用内容审批Step3 新建工作流。用SharePoint Designer 打开站点,选择“文件”“新建”“工作流”命令,如图7-15所示。图7-15 新建工作流Step4 指定工作流名称和启动方式。在定义新工作流界面中,输入工作流名称为“员工请假流程”,选择附加到“员工请假”列表,再选择“允许从项目中手工启动此工作流”,如图7-16所示。图7-16 定义新工作流界面Step5 添加审批步骤。将步骤名称改为“经理审批”,在操作中,选择“从用户处收集数据”,单击“此用户”链接,在弹出的对话框中选择一个审批人,如图7-17和图7-18所示。图7-17 添加审批步骤图图7-18 选择审批用户Step6 设计审批步骤需要采集的数据。单击“数据”链接,在自定义任务向导中输入任务名称为“请假审批”,如图7-19所示,再单击“下一步”按钮。图7-19 添加“请假申请”添加一个名称为“审批意见”的多行域,如图7-20所示。添加一个名称为“是否同意”的选项类型域,选项为“批准和拒绝”,如图7-21所示。图7-20 添加“审批意见”域 图7-21 添加“是否同意”域以上的操作实际上是创建了一个任务内容类型,并且创建了其编辑表单,如图7-22所示。图7-22 请假审批内容类型Step7 修改审批任务ID变量名。通过添加“从用户处收集数据”动作创建了一个任务内容类型,在工作流运行的时候,会创建一个任务列表项,这个列表项的ID会被放到流程的变量中,以便从工作流中可以访问任务数据。我们把存放这个任务列表项ID的变量名修改为“请假审批任务ID”,如图7-23和图7-24所示。图7-23 修改工作流变量名图7-24 重新选择任务ID绑定到的变量Step8 添加审批完成后的处理逻辑。再添加一个工作流步骤,名称为“审批完成”,如图7-25所示。图7-25 添加审批完成步骤Step9 添加判断条件。经理审批同意时需要批准列表项,并且将请假休息添加进日程列表中,首先需要添加判断经理审批是否同意的条件,查找到审批任务列表项的是否同意字段,进行判断即可。从“条件”菜单中选择“比较任意数据源”,如图7-26和图7-27所示。图7-26 添加比较任意数据源条件图7-27 比较任意数据源比较任意数据源条件是“如果值等于值”的形式,第一个值可以绑定到当前列表项的任意字段,或者是其他列表项的字段。这里我们要把它绑定到任务列表的“是否同意”字段。单击“值”,再单击“绑定”图标,在定义工作流查找窗口中,选择数据源为“任务”,选择域为“是否同意”,设置匹配值为任务ID匹配工作流变量中的“请假审批任务ID”,如图7-28所示。图7-28 绑定到是否同意字段设置条件为任务的“是否同意”字段值等于“批准”,如图7-29所示。图7-29 设置判断条件为“批准”Step10 添加列表项审批操作。在“操作”中选择“设置内容审批状态”,并将内容审批状态设置为“已批准”,如图7-30所示。图7-30 添加审批操作Step11 创建日历信息。添加一个“创建列表项”操作,选择列表为“个人日历”(若不存在,则先创建此日历列表),将日历的标题设置为“请假”,将开始时间和结束时间绑定到当前列表项的相应字段,如图7-31所示。图7-31 创建日历项Step12 添加批准未通过的操作。添加一个Else If条件分支,添加设置内容审批状态操作,将内容审批状态设置为“已拒绝”,添加一个发送邮件操作,给启动流程的用户发送一封提醒邮件,如图7-32所示。图7-32 添加内容审批为“拒绝”和发送邮件操作SharePoint Designer设计的工作流的使用和7.1.3节描述的操作方式基本是一样的。不同的是,单击任务链接首先进入的任务查看页面,在任务查看页面中单击“编辑项目”链接后才会转到任务编辑页面,如图7-33,图7-34和图7-35所示。图7-33 任务列表图7-34 任务查看页面图7-35 任务编辑7.2.2 SharePoint Designer工作流的迁移SharePoint Designer设计工作流的功能是提供给最终用户使用的,就如同用SPD定制站点页面一样,并没有提供专门的流程迁移工具。最终用户可以直接在生产环境中设计流程。对开发人员来说,如果在开发环境中设计好了一个比较复杂的流程,需要迁移到生产环境,必须手工操作,可以参考如下步骤。Step1 确保生产环境已经建好了相应的列表,并确保列表的配置跟开发环境完全一致,包括列表名称、列表的所有栏。Step2 用SharePoint Designer打开生产环境的站点,新建一个与开发环境名称一样的流程,绑定到同名称的列表,直接保存。Step3 SharePoint Designer打开开发环境的站点,将工作流的所有文件复制到生产环境。Step4 打开所有工作流的文件,将其中所有的列表项ID替换成生产环境相应的列表项ID。7.3 SharePoint Designer工作流的扩展SharePoint Designer提供了常用的很多条件和活动,但是这些条件和活动并不能满足所有需要。本节就来讲述SPD动作和条件的扩展。7.3.1 动作的扩展SPD工作流的动作是一个普通的WF活动类。WF活动类开发好以后,部署到GAC中,然后修改SPD工作流的配置文件,注册新开发的活动。SPD工作流配置文件路径为C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATE2052Workflow,2052表示中文语言,英文语言的配置文件路径为C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATE1033 Workflow,在这个路径下,有个WSS.ACTIONS文件,这是一个XML文件,这个文件里面配置了所有系统自带的动作和条件。WSS.ACTIONS在Actions节点下声明了所有的动作。SDP工作流是基于规则来定义的。在ACTIONS配置文件中,将动作类的属性与各种规则设计器关联。以下是“从用户处收集数据”动作的声明。 以下是对配置文件中主要元素的说明。l ClassName和Assembly分别是动作类的全名和所在的程序集。l AppliesTo指定动作是应用到文档库还是列表,允许的值为list和all。l CreatesTask指定是否需要创建任务项。l Parameters节点中声明了WF活动类需要跟上下文数据进行绑定或进行设置的属性。在Parameter节点中,Name为WF活动类的属性名,Type为属性的类型,Direction声明属性是需要赋值的还是对外提供值,有3个可选值:In、Out、Optional,指定In时必须给属性赋值,指定Out时必须将属性跟某个工作流变量进行绑定,Optional表示可选项,指定Optional时可以不对属性进行操作。以下为3个特殊的Parameter。l _Context:当Action类需要访问工作流数据时,必须声明此属性,类型是Microsoft.SharePoint.WorkflowActions.WorkflowContext。l _ListId:当需要访问工作流关联的列表时,需要指定此属性。l _ItemID:当需要访问工作流关联的列表项时,需要指定此属性。以上的3个属性定义在Action类中,然后声明在配置文件中,工作流运行时引擎会自动为其赋值。RuleDesigner节点声明了对Action类属性的设计规则。Sentence指定了设计时显示的提示信息,其中的占位符号与RuleDesigner中的FieldBind的ID属性配置,FieldBind定义了对某个属性的设计规则。Field为属性的名字,Text为占位符处显示的文本,ID跟占位符前的数字对应。DesignerType指定了对属性应用的设计器,系统支持如下的设计器。l Survey:生成收集数据的表单,表单对应的内容类型ID和标题需要分别映射到两个属性中。l SinglePerson:单个用户或用户组。l Person:多个用户或用户组。l ParameterNames:工作流变量。l StringBuilder:生成可以跟当前工作流数据混合的字符串。l Operator:选项,用Option指定可选值。如: l fieldNames:列表栏,采用此设计器将工作流关联列表的某个栏和Action类的属性绑定。l E-mail:邮件设计器,设计邮件的标题、内容和收件人等,需要将收件人、抄送人、标题、内容4个属性分别绑定,如: 7.3.2 动作扩展示例自定义E-mail活动系统默认的发送邮件动作只能发送简单的文本,很多时候,用户希望审批任务的提醒邮件中带一个链接,可以直接链接到任务操作页面。本节我开发一个可以发送任务链接的E-mail活动,这个E-mail活动具有系统发送邮件动作的所有功能,可以动态绑定收件人、指定主题等,如图7-36所示。唯一跟系统默认功能的区别就是:在发送出去的邮件内容中带有任务操作链接。图7-36 发送邮件动作Step1 新建一个工作流活动项目,如图7-37所示。将默认产生的Activity1类改名为“MailWithTaskLinkActivity”。图7-37 新建工作流活动项目Step2 添加Microsoft.SharePoint.dll和microsoft.sharepoint.WorkflowActions.dll两个程序集的引用。这两个程序集位于服务器上的C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12ISAPI目录中。Step3 切换到代码视图,将MailWithTaskLinkActivity的基类由SequenceActivity改为Activity。复核活动可以从SequenceActivity类继承,但是MailWithTaskLinkActivity并不需要使用子活动(也就是不是一个复核活动),所有应该从基本的Activity类继承。Step4 添加对SharePoint API主要名称空间的引用,代码如下所示。using Microsoft.SharePoint;using Microsoft.SharePoint.Utilities;using Microsoft.SharePoint.Workflow;using Microsoft.SharePoint.WorkflowActions;namespace CodeArt.SharePoint.WorkflowActions public class MailWithTaskLinkActivity : Activity public MailWithTaskLinkActivity() Step5 希望MailWithTaskLinkActivity部署成SharePoint Designer的动作之后,依然具有系统自带的发送邮件活动的功能可以动态绑定到收件人、指定邮件主题等,所以需要给MailWithTaskLinkActivity添加相应的属性。添加一个_Context属性,代码如下所示。public static DependencyProperty _ContextProperty = DependencyProperty.Register(_Context, typeof(WorkflowContext), typeof(SendMail); Browsable(true), ValidationOption(ValidationOption.Required), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), Description(Context) public WorkflowContext _Context get return (WorkflowContext)base.GetValue(_ContextProperty); set base.SetValue(_ContextProperty, value); _Context属性用来绑定到工作流的上下文,以便获取工作流运行环境的网站集、网站等信息。这个属性的名称是不能变的,后面的步骤会讲述如何在配置文件中配置这个属性。添加一个_ListId属性,代码如下所示。public static DependencyProperty _ListIdProperty = DependencyProperty.Register(_ListId, typeof(string), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public string _ListId get return (string)base.GetValue(_ListIdProperty); set base.SetValue(_ListIdProperty, value); _ListId属性用来绑定到工作流的关联的列表ID。添加一个_ListItem属性,代码如下所示。public static DependencyProperty _ListItemProperty = DependencyProperty.Register(_ListItem, typeof(int), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public int _ListItem get return (int)base.GetValue(_ListItemProperty); set base.SetValue(_ListItemProperty, value); _ListItem属性用来绑定到工作流的关联的列表项ID。添加一个To属性,代码如下所示。public static DependencyProperty ToProperty = DependencyProperty.Register(To, typeof(ArrayList), typeof(MailWithTaskLinkActivity); ValidationOption(ValidationOption.Required) public ArrayList To get return (ArrayList)base.GetValue(ToProperty); set base.SetValue(ToProperty, value); To属性是一个ArrayList类型的集合,在SharePoint Designer进行设计的时候可以直接绑定到用户。同样,添加邮件的抄送(CC)、暗送(BCC)、主题(Subject)、内容(Body)4个属性代码如下所示。public static DependencyProperty CCProperty = DependencyProperty.Register(CC, typeof(ArrayList), typeof(MailWithTaskLinkActivity); /抄送 ValidationOption(ValidationOption.Optional) public ArrayList CC get return (ArrayList)base.GetValue(CCProperty); set base.SetValue(CCProperty, value); public static DependencyProperty BCCProperty = DependencyProperty.Register(BCC, typeof(ArrayList), typeof(MailWithTaskLinkActivity); /暗送 ValidationOption(ValidationOption.Optional) public ArrayList BCC get return (ArrayList)base.GetValue(BCCProperty); set base.SetValue(BCCProperty, value); public static DependencyProperty SubjectProperty = DependencyProperty.Register(Subject, typeof(String), typeof(MailWithTaskLinkActivity); /主题 ValidationOption(ValidationOption.Required) public string Subject get return (string)base.GetValue(SubjectProperty); set base.SetValue(SubjectProperty, value); public static DependencyProperty BodyProperty = DependencyProperty.Register(Body, typeof(String), typeof(MailWithTaskLinkActivity); /邮件内容 ValidationOption(ValidationOption.Optional) public string Body get return (string)base.GetValue(BodyProperty); set base.SetValue(BodyProperty, value); Step6 上一步把MailWithTaskLinkActivity需要的所有属性都添加好了,下面来添加发送邮件的处理代码。重载Execute方法,代码如下所示。 protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) /获取到工作流服务 ISharePointService service = (ISharePointService)provider.GetService(typeof(ISharePointService); if (service = null) throw new InvalidOperationException(); try /获取到列表 SPList list = _Context.Web.Listsnew Guid(_ListId); /获取到列表项 SPListItem item = list.GetItemById(Convert.ToInt32(_ListItem); /计算任务查看URL string url = this._Context.Web.Url + _layouts/codeArt/SPTaskRedirect.aspx?ListId= + item.ParentList.ID + &ItemId= + item.ID; /发送邮件参数 StringDictionary headers = new StringDictionary(); headersto = this.ParseSendTo(this.To); headerssubject = this.Subject; if (null != this.CC) headerscc = this.ParseSendTo(this.CC); if (null != this.BCC) headersbcc = this.ParseSendTo(this.BCC); string body = null; if (null != this.Body) Activity parent = provider.Activity; while (parent.Parent != null) parent = parent.Parent; /处理邮件内容中的属性绑定,Helper是系统自带的类 body = Helper.ProcessStringField(this.Body, parent, this._Context); body += 点击此处查看或处理任务; /发送邮件 service.SendEmail(base.WorkflowInstanceId, false, headers, body); return ActivityExecutionStatus.Closed; catch (Exception ex) /将异常信息记录到日志列表 service.LogToHistoryList(base.WorkflowInstanceId, SPWorkflowHistoryEventType.WorkflowError, _Context.Web.CurrentUser.ID, TimeSpan.MinValue, MailWithTaskLinkActivity Error, ex.Message + ex.StackTrace, ); return ActivityExecutionStatus.Faulting; 发送邮件活动一般放置在从用户处收集数据活动之前,那么在发送邮件活动执行的时候审批任务是没有创建的,这时候无法获取任务的路径

温馨提示

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

评论

0/150

提交评论