Как программно установить результат задачи (ответ на задачу) для Nintex Flexi Task? - PullRequest
3 голосов
/ 21 декабря 2011

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

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

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


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

Ответы [ 2 ]

1 голос
/ 06 марта 2017

Вот мой код для изменения результата задачи 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;
        }
1 голос
/ 28 января 2013

Вы пробовали этот код: (блок try-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
{
}

...