2011-12-20 20 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