2011-12-20 5 views
3

Есть ли способ установить выполнение задачи Nintex Flexi через веб-службы Sharepoint? Мы попытались обновить поля «WorkflowOutcome», «ApproverComments» и «Status» без успеха (на самом деле комментарии и статус успешно обновлены, однако я не могу найти способ обновления поля WorkflowOutcome).Как программно установить результат задачи (ответ задачи) задачи Nintex Flexi?

Я не могу использовать веб-службу Nintex (ProcessTaskResponse), потому что ей нужны учетные данные назначенного пользователя (логин, пароль, домен).

На странице Asp.net нет этой информации, она имеет только учетные данные администратора SharePoint. Один из способов - сначала делегировать задачу администратору, а затем вызвать ProcessTaskResponse, но он не эффективен и подвержен ошибкам.


В моих тестах до сих пор, любые обновления (UpdateListItems) в поле WorkflowOutcome автоматически устанавливается в поле Состояние «Completed» и поле PercentComplete на «1» (100%), заканчивая задачу (и продолжение поток), но с неправильным ответом: всегда «Отклонить», независимо от того, что я пытаюсь установить.

+0

попробуйте мой ответ ниже, пожалуйста! – devi

ответ

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 (я попробовал). Он показывает себя как «Завершено», но на самом деле задача находится на рассмотрении. Я хотел бы узнать ответ на этот вопрос. –

+0

@JakubHolovsky, пожалуйста, попробуйте мой обновленный ответ, перенаправляйте с помощью try-catch очень важно здесь! – devi

+0

Эй, что вам нужно сделать для использования Nintex.Workflow.Utility.RedirectOrCloseDialog (HttpContext.Current, Web.Url); ? Спасибо –

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 в вашем коде? –

+0

Какое пространство имен требуется для GetFlexiTaskOutcomeId? –

+1

Я отредактировал ответ, пожалуйста, проверьте. Мы можем прочитать результат из свойства скрытого элемента задачи рабочего потока. А также есть функция для получения идентификатора результата в workflow.dll из nintex. –