2011-12-20 65 views
3

有没有通过Sharepoint的Web服务设置Nintex Flexi任务完成的方法?我们尝试更新“WorkflowOutcome”,“ApproverComments”和“Status”字段而未成功(实际上注释和状态已成功更新,但无法更新WorkflowOutcome系统字段)。如何以编程方式设置Nintex Flexi任务的任务结果(任务响应)?

我无法使用Nintex Web服务(ProcessTaskResponse),因为它需要任务的指定用户凭据(登录名,密码,域)。

Asp.net页面没有这些信息,它只有Sharepoint管理员凭证。 一种方法是首先将任务委派给管理员,然后调用ProcessTaskResponse,但效率不高,并且容易出错。


在我的测试中,到目前为止,任何更新(UpdateListItems)到WorkflowOutcome场自动设置状态字段为“已完成”,并且PERCENTCOMPLETE字段为“1”(100%),结束任务(和持续流程),但与错误的答案:总是“拒绝”,无论我尝试设置它。

+0

请在下面试试我的答案! – devi 2014-03-20 10:32:02

回答

1

你试试这个代码:(带重定向尝试-cacth块的伎俩)

\\set to actual outcome id here, for ex. from OutComePanel control 
taskItem[Nintex.Workflow.Common.NWSharePointObjects.FieldDecision] = 0; 

taskItem[Nintex.Workflow.Common.NWSharePointObjects.FieldComments] = " Some Comments"; 
taskItem.Update(); 
try 
{ 
    Nintex.Workflow.Utility.RedirectOrCloseDialog(HttpContext.Current, Web.Url); 
} 
catch 
{ 
} 

+0

此代码不会批准它。它不适用于Flexi任务不幸(我尝试过)。它确实显示为“已完成”,但实际上该任务正在等待处理。我很想知道这个答案。 – 2014-03-17 20:15:58

+0

@JakubHolovsky,请尝试我更新的答案,重新定向与try-catch在这里非常重要! – devi 2014-03-20 10:14:29

+0

嘿,你有什么Dll你必须参考使用Nintex.Workflow.Utility.RedirectOrCloseDialog(HttpContext.Current,Web.Url); ?谢谢 – 2014-04-16 01:45:48

1

这里是我的代码,以改变nintex flexi任务的结果。我的问题是许可。我已将管理令牌传递到站点。它解决了这个问题。

  var siteUrl = "..."; 
      using (var tempSite = new SPSite(siteUrl)) 
      { 
       var sysToken = tempSite.SystemAccount.UserToken; 
       using (var site = new SPSite(siteUrl, sysToken)) 
       { 
        var web = site.OpenWeb(); 
        ... 

            var cancelled = "Cancelled"; 
            task.Web.AllowUnsafeUpdates = true; 
            Hashtable ht = new Hashtable(); 
            ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]); 
            ht["Completed"] = true; 
            ht["PercentComplete"] = 1; 
            ht["Status"] = "Completed"; 
            ht["WorkflowOutcome"] = cancelled; 
            ht["Decision"] = CommonHelper.GetFlexiTaskOutcomeId(task, cancelled); 
            ht["ApproverComments"] = "cancelled"; 
            CommonHelper.AlterTask((task as SPListItem), ht, true, 5, 100); 

            task.Web.AllowUnsafeUpdates = false; 
           } 
          } 
         } 
        } 
       } 
      } 



    public static string GetFlexiTaskOutcomeId(Microsoft.SharePoint.Workflow.SPWorkflowTask task, string outcome) 
      { 
       if (task["MultiOutcomeTaskInfo"] == null) 
       { 
        return string.Empty; 
       } 
       string xmlOutcome = HttpUtility.HtmlDecode(task["MultiOutcomeTaskInfo"].ToString()); 
       if (string.IsNullOrEmpty(xmlOutcome)) 
       { 
        return string.Empty; 
       } 
       XmlDocument doc = new XmlDocument(); 
       doc.LoadXml(xmlOutcome); 
       var node = doc.SelectSingleNode(string.Format("/MultiOutcomeResponseInfo/AvailableOutcomes/ConfiguredOutcome[@Name='{0}']", outcome)); 
       return node.Attributes["Id"].Value; 
      } 
public static bool AlterTask(SPListItem task, Hashtable htData, bool fSynchronous, int attempts, int milisecondsTimeout) 
     { 
      if ((int)task[SPBuiltInFieldId.WorkflowVersion] != 1) 
      { 
       SPList parentList = task.ParentList.ParentWeb.Lists[new Guid(task[SPBuiltInFieldId.WorkflowListId].ToString())]; 
       SPListItem parentItem = parentList.Items.GetItemById((int)task[SPBuiltInFieldId.WorkflowItemId]); 
       for (int i = 0; i < attempts; i++) 
       { 
        SPWorkflow workflow = parentItem.Workflows[new Guid(task[SPBuiltInFieldId.WorkflowInstanceID].ToString())]; 
        if (!workflow.IsLocked) 
        { 
         task[SPBuiltInFieldId.WorkflowVersion] = 1; 
         task.SystemUpdate(); 
         break; 
        } 

        if (i != attempts - 1) 
        { 
         Thread.Sleep(milisecondsTimeout); 
        } 
       } 
      } 

      var result = SPWorkflowTask.AlterTask(task, htData, fSynchronous); 
      return result; 
     } 
+0

什么是CommonHelper在你的代码中? – 2017-03-10 09:20:59

+0

GetFlexiTaskOutcomeId需要哪个命名空间? – 2017-03-10 10:50:00

+1

我编辑了答案,请检查。我们可以从工作流任务的隐藏项属性中读取结果。并且在nintex的workflow.dll中还有一个获取结果id的函数。 – 2017-03-14 09:15:23