采用Visual Studio 2008 开发工作流模板
本节讲述采用Visual Studio 2008开发SharePoint工作流模板的一般步骤和方法。为了使读者更好地理解本节的内容,本节在讲述基本原理和操作的同时会附带讲解一个实例工作流的开发,这个工作流是一个文档审批工作流:提交者上传文档,然后启动工作流,最后提交给审批人审批。
创建工作流项目
Step1 新建项目。打开Visual Studio 2008新建项目,选择"Workflow"中的"SharePoint 2007 Sequential Workflow"项目模板,如图1所示。
图1 新建项目
Step2 指定调试工作流所用的站点路径,如图2所示。
图2 指定调试工作流所用的站点路径
Step3 指定工作流用来调试时附加到的列表。若列表不存在,则先到站点中创建,如图3所示。
图3 制定工作流用来调试时附加到的列表
Step4 指定工作流调试时的启动方式为手工启动,如图4所示。
图4 指定工作流调试时的启动方式
以上操作完成之后,可以看到VS 2008中如图5所示的布局。该图中左边工具栏上是系统提供的所有活动组件,中间是工作流设计器界面,右边是项目文件。
图5操作完后的布局
SharePoint 2007 Sequential Workflow项目模板会自动添加一个OnWorkflowActivated活动,这个活动在工作流启动的时候执行,它的WorkflowProperties属性绑定到工作流的workflowProperties字段,workflowProperties的类型是SPWorkflowActivationProperties,存放了跟工作流相关的数据,如表6所示。
表6 SPWorkflowActivationProperties属性说明
属 性 |
类 型 |
说 明 |
AssociationData |
String |
工作流关联数据,通过关联表单提供 |
HistoryList |
SPList |
存放工作流历史记录的列表 |
HistoryListId |
Guid |
存放工作流历史记录的列表ID |
InitiationData |
String |
工作流初始化数据,通过初始化表单提供 |
Item |
SPListItem |
工作流附加到的列表项对象 |
List |
SPList |
工作流附加到的列表 |
Originator |
String |
启动工作流的用户账号 |
OriginatorUser |
SPUser |
启动工作流的用户对象 |
Site |
SPSite |
工作流运行的站点集 |
Web |
SPWeb |
工作流运行的网站 |
TaskList |
SPList |
存储工作流任务的列表 |
任务的分配
SharePoint工作流是任务驱动的工作流,工作流按照各种逻辑分配任务给用户,用户通过完成任务跟工作流进行交互,驱动流程前进。任务分配跟以下几个活动有关。
l createTask:通过createTask活动创建任务,工作流代码必须处理createTask活动的MethodInvoking事件,创建任务ID,指定任务操作用户。
l onTaskChanged:通过onTaskChanged活动,等待用户完成任务,并可以处理Invoked方法,按照用户的输入进行逻辑处理。
l completeTask:通过completeTask活动,完成用户的任务。
一个任务的分配过程,都是需要以上3个活动进行配合的。下面是具体分配任务的操作过程。
Step1 从工具栏中拖曳createTask到设计器中,如图7所示。
Step2 指定createTask活动的CorrelationToken属性为"task1Token",OwnerActivityName为"Workflow1",如图8所示。
图7 从工具栏中拖曳CreateTask到设计器 |
图8 指定CreateTask活动的属性 |
Step3 绑定createTask活动的TaskId属性到工作里的字段。单击"TaskId"属性的设置按钮,在弹出的属性绑定窗口选择绑定到新成员标签,输入名称为"task1Id",选择创建字段,如图9所示。
图9 绑定CreateTask活动的TaskId属性到工作里的字段
Step4 绑定createTask活动的TaskProperties属性到工作流的字段task1Properties。
Step5 处理createTask的MethodInvoking事件。双击createTask,在自动生成的MethodInvoking事件处理函数中写入如下代码。
private void createTask1_MethodInvoking(object sender, EventArgs e)
{
this.task1Id = Guid.NewGuid(); //生成任务ID
this.task1Properties.Title = "文档审批";
this.task1Properties.AssignedTo = "codeart\user1"; //设置任务操作人
}
Step6 拖曳onTaskChanged到工作流设计器中,如图10所示。
图10 拖曳onTaskChanged到工作流设计器
Step7 设置onTaskChanged活动的CorrelationToken属性为"task1Token",如图11所示。
Step8 将onTaskChanged活动的TaskId属性绑定到已有的task1Id字段,如图12所示。
图11 CorrelationToken属性为"createTask1" |
图12 TaskId属性绑定到已有的task1Id字段 |
Step9 将onTaskChanged活动的BeforeProperties和AfterProperties属性均绑定到已有task1Properties字段。
Step10 拖曳completeTask活动到工作流设计器中,如图13所示。
图13 拖曳CompleteTask活动到工作流设计器
Step11 设置completeTask活动的CorrelationToken属性为"task1Token"。
Step12 将completeTask活动的TaskId属性绑定到已有的task1Id字段。
Step13 设置completeTask活动的TaskOutcome属性为"完成",如图14所示。
图14 设置TaskOutcome属性
以上是创建一个任务的基本过程。在实际过程中,任务操作人的获取可能有多种情形,比如从站点的某个组内获取用户,从第三方的角色管理系统中获取用户等。假设任务要分配给站点的部门经理组中的用户,则createTask活动的MethodInvoking事件可以如下。
private void createTask1_MethodInvoking(object sender, EventArgs e)
{
this.task1Id = Guid.NewGuid();
this.task1Properties.Title = "文档审批";
//获取到部门经理网站组
SPGroup group1 = this.workflowProperties.Web.SiteGroups["部门经理"];
SPUser user1 = group1.Users[0]; //获取部门经理网站组中的第一个用户
this.task1Properties.AssignedTo = user1.LoginName; //分配任务
}
createTask活动会在工作流对应的任务列表中创建一个任务列表项。在默认情况下,对任务列表具有操作权限的用户都可以操作这个任务列表项,但通常情况下,希望只有特殊的用户才可以进行操作,这就要用到createTask活动的SpecialPermissions属性。SpecialPermissions是一个集合类型,可以将有权限的用户加到它里面,实现对任务列表项的特殊权限控制。下面是具体的操作步骤。
Step1 选中createTask活动,单击SpecialPermissions属性的"绑定"图标,绑定属性到specialPermissions1字段中,如图15和图16所示。
图15 SpecialPermissions属性的绑定图标
图16 绑定属性到specialPermissions1字段
Step2 修改createTask的MethodInvoking事件处理方法,设置specialPermissions1集合,代码如下所示。
private void createTask1_MethodInvoking(object sender, EventArgs e)
{
this.task1Id = Guid.NewGuid();
this.task1Properties.Title = "任务标题";
this.task1Properties.AssignedTo = "codeart\\user1";
//设置任务权限
this.specialPermissions1.Add(this.task1Properties.AssignedTo,
SPRoleType.Contributor);
}
以上讲述的是单个任务的创建过程,重复这个过程,可以创建出多步的顺序审批流程。
工作流的测试和调试
上一节已经完成了任务分配的基本编码,直接按"F5"键即可部署和调试。如果只是单纯的部署,可以通过项目右键菜单的"Deploy"菜单项进行,如图17所示。
图17 右键菜单的"Deploy"菜单项
部署完成后,访问MOSS站点测试工作流关联的文档库(本节示例为名称为文档审批的文档库),新建或上传一个文档,然后选择名称栏右键菜单的"工作流"选项,选择要测试的工作流,如图18和图19所示。
图18 新建一个文档
图19 工作流选择
启动工作流后,返回文档库,会发现文档库上多出来一栏,以工作流的名称命名,可以称这一栏为工作流状态栏,如图20所示。
图20 工作流状态栏
单击工作流状态栏链接,可以转到工作流状态页面。在此页面,可以查看到工作流分配的所有任务情况,如图21所示。
图21 工作流状态页面
用具有编辑任务权限的用户登录站点,访问到工作流状态页面,通过任务标题栏的"编辑项目"菜单可以转到任务编辑页面,如图22所示。
图22 任务编辑页面
由于尚未定义任务操作页面,所以会看到如图23所示的默认任务编辑页面,单击"确定"按钮即可完成审批任务。
图23 默认任务编辑页面
完成任务之后,转回任务状态页面,可以看到任务的状态已经变成"已完成",如图24所示。
图24 任务状态页面
以上是在测试时可进行的快捷操作。工作流实际运行时,不可能要求用户采用这样的操作方式,一般采用用户任务Web部件,让用户直接在站点首页集中处理工作流任务。
在站点首页进入编辑模式,选择添加Web部件,选中添加用户任务Web部件即可,如图25所示。
图25 选择用户任务Web部件
转载:http://book.csdn.net/bookfiles/936/10093629438.shtml