代码改变世界

SharePoint工作流开发点滴(7) - 用代码完成任务

  Windie Chai  阅读(4315)  评论(6编辑  收藏  举报

我们知道,SharePoint的工作流是通过任务来驱动的,在真实场景中,我们可能会希望工作流的任务处理方式能够更加灵活,比如批 量处理、通过Office Communicator等IM软件处理任务等等,这时候我们就需要以编程的方式在外部完成任务。

按照正常的想法,SharePoint的任务列表也是一个SPList,所以我们会这样尝试:

复制代码
SPSite site = new SPSite("http://windstyle");
SPWeb web 
= site.OpenWeb();
web.AllowUnsafeUpdates 
= true;
SPList taskList 
= web.Lists["任务"];
SPListItem task 
= taskList.Items[0];
task[
"状态"= "已完成";
task[
"Completed"= true;
task.Update();
web.AllowUnsafeUpdates 
= false;
复制代码

 

执行之后,发现任务确实已经被设置为已完成状态,但工作流却没有继续执行,也就是说,工作流的OnTaskChanged活动并没有捕捉到任务被更改的事件。

其实SharePoint对象模型提供了更改工作流任务属性的方法,即SPWorkflowTask.AlterTask,此方法不仅能够更改工作流任务的属性,还会将这一更改通知相应的工作流,使得相应的工作流能够继续执行。

此方法的用法也很简单:

复制代码
SPSite site = new SPSite("http://windstyle");
SPWeb web 
= site.OpenWeb();
SPList doclib 
= web.Lists["共享文档"];
SPListItem doc 
= doclib.Items[0];
SPWorkflowTaskCollection tasks 
= doc.Workflows[doc.Workflows.Count-1].Tasks; //找到具体的SPWorkflowTask
Hashtable ht = new Hashtable();
ht.Add(SPBuiltInFieldId.FormData, SPWorkflowStatus.Completed);
ht.Add(SPBuiltInFieldId.Completed, 
true); //将任务设置为完成状态
ht.Add(SPBuiltInFieldId.TaskStatus, "已完成");//将任务在任务列表中的显示状态设置为“已完成”
ht.Add(SPBuiltInFieldId.PercentComplete, 1); //将任务在任务列表中的完成百分比设置为“100%”
ht.Add(SPBuiltInFieldId.WorkflowOutcome, "Some output infomation"); //设置任务的输出消息,等同于使用Visual Studio设计工作流 时,CompleteWorkflow活动的TaskOutput属性
SPWorkflowTask.AlterTask(tasks[0], ht, true);
复制代码

从上段代码可以看出,以编程的方式来完成 任务并不困难,其中比较麻烦的是如何找到正确的工作流任务。因为SPListItem.Workflows可能包含不止一个SPWorkflow,这些 SPWorkflow可能源于同一个SPWorkflowTemplate,也可能源于不同的SPWorkflowTemplate。而且还可能包含源于 同一个SPWorkflowTemplate的多个SPWorkflow,当然,我们知道,同一个工作流模板在同一个SPListItem上只能启动一个 工作流实例,所以这些SPWorkflow中只有一个的IsCompleted属性为true。

所以在编写代码来完成工作流任务时,注意获取到正确的工作流任务,然后就可以轻松的完成任务了。

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示