Утвердить задачу рабочего процесса SharePoint с использованием веб-служб SharePoint / объектной модели - PullRequest
6 голосов
/ 27 января 2011

Я создал рабочий процесс SharePoint Designer и связал его со списком.Рабочий процесс создает процесс утверждения, поэтому SharePoint создает задачу в списке задач, чтобы пользователь мог одобрить или отклонить ее.

Что мне нужно сделать, это подтвердить или отклонить задачу, не открывая задачу в задачесписок.После некоторых исследований я понял, что могу использовать веб-службы SharePoint.Однако я чувствую себя потерянным, поскольку не знаю, какую службу, например Lists.asmx, и какой метод, например UpdateListItems, вызвать.

Может ли кто-нибудь подсказать мне следующее:
1- Возможно ли этоутвердить задачу рабочего процесса SharePoint Web Services?
2- Можете ли вы показать мне пример того, как утвердить задачу, например, какую службу и метод вызывать и какими должны быть параметры?

Обновление
Я использовал следующий XML-файл, чтобы установить завершение рабочего процесса:

 batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" // Also used Moderate
                + "<Field Name='ID'>115</Field>"
                + "<Field Name='Status'>Completed</Field>"
                + "<Field Name='FormData'>Completed</Field>" // Also used Approved
                + "<Field Name='WorkflowOutcome'>Approved</Field>"
                + "<Field Name='Completed'>True</Field>"
                + "<Field Name='PercentComplete'>1</Field>"
                + "<Field Name='_ModerationStatus'>0</Field>"
                + "</Method>";

Элемент списка задач обновлен, но WorkflowOutcome остается пустым, и рабочий процесс не перемещается вследующий шаг.
Что еще мне не хватает?

Обновление # 2
Я подозреваю, что ExtendedProperties элемента списка задач.Для элемента, который был выполнен с использованием пользовательского интерфейса, ExtendedProperties показывает ws_TaskStatus = 'Approved'.Однако для элемента, который был утвержден с использованием кода, ws_TaskStatus не существует.

Обновление # 3
Из сообщения MSDN мне сказали использовать Workflow.asmx вместо Lists.asmx.
Я использовал следующий код:

WorkflowService.Workflow listProxy = new WorkflowService.Workflow();
listProxy.Url = "http://<server_name>/_vti_bin/workflow.asmx";
listProxy.UseDefaultCredentials = true;

int todoID = 118;
Guid tasklistID = new Guid("{79ABFDE7-0398-4AD7-918A-0D40204E7726}");
string itemURL = "http://<server_name>/TestLibrary/volshext.log";
XmlDocument taskData = new XmlDocument();
taskData.Load(@"..\..\TaskData.xml");

try
{
   XmlNode response = listProxy.AlterToDo(itemURL, todoID, tasklistID, taskData.DocumentElement);
   Console.WriteLine(response.InnerText);
}

XML, который я использую для утверждения задачи:

<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD" >
 <my:TaskStatus>#</my:TaskStatus>
 <my:Comments />
 <my:DelegateTo />
 <my:NewDescription>Please approve Workflow Demo</my:NewDescription>
 <my:NewDueDate />
 <my:RequestTo />
 <my:Decline>0</my:Decline>
 <my:dcr>0</my:dcr>
 <my:Status>Completed</my:Status>
</my:myFields>

Но снова задача была обновлена, но рабочий процесс не продвинулся.

Обновление № 4 Я провел одно последнее испытание с объектной моделью сервера SharePoint, однако, опять же, задача обновляется, но рабочий процесс не продвигается.Вот мой код:

SPSite site = new SPSite("http://sitenamehere/");
using (SPWeb web = site.OpenWeb())
{
   SPList list = web.Lists["Shared Documents"];
   //SPListItem item = list.GetItemById(18);
   SPListItem item = list.GetItemByUniqueId(new Guid("5300d16e-94f8-4338-8206-4a57ab7c369b"));
   SPWorkflow workflow = item.Workflows[0];
   SPWorkflowTask task = workflow.Tasks[0];
   Hashtable ht = new Hashtable();<br>
   ht[SPBuiltInFieldId.Completed] = "TRUE";
   ht["Completed"] = "TRUE";
   ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
   ht["PercentComplete"] = 1.0f;
   ht["Status"] = "Completed";
   ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]);
   //ht["TaskStatus"] = "#";
   //ht["ows_TaskStatus"] = "Approved";
   //ht["FormData"] = SPWorkflowStatus.Completed;
   //ht["Outcome"] = "Approved";
   //task.ModerationInformation.Status = SPModerationStatusType.Approved;<br/>
   web.AllowUnsafeUpdates = true;
   SPWorkflowTask.AlterTask((task as SPListItem), ht, true);
}

Ответы [ 3 ]

5 голосов
/ 23 февраля 2011

После многих испытаний и расследований у меня только что был следующий код, работающий для утверждения задачи

SPSite site = new SPSite("http://servername/");
using (SPWeb web = site.OpenWeb())
{
    SPList list = web.Lists["TestList"];
    SPListItem item = list.GetItemById(22);
    SPWorkflow workflow = item.Workflows[0];
    SPWorkflowTask task = workflow.Tasks[0];

    Hashtable ht = new Hashtable();             
    ht[SPBuiltInFieldId.Completed] = "TRUE";
    ht["Completed"] = "TRUE";
    ht[SPBuiltInFieldId.PercentComplete] = 1.0f;
    ht["PercentComplete"] = 1.0f;
    ht["Status"] = "Completed";
    ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]);
    ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
    ht["TaskStatus"] = "Approved";
    ht["FormData"] = SPWorkflowStatus.Completed;

    web.AllowUnsafeUpdates = true;
    SPWorkflowTask.AlterTask((task as SPListItem), ht, true);
}

Я подозреваю, что ht["TaskStatus"] = "Approved"; - это тот атрибут, который решил ее.В любом случае я попытаюсь сузить набор свойств, которые необходимо изменить.

3 голосов
/ 27 января 2011

Я не уверен, работает ли решение Мадхура над связанным элементом или над задачей, но для обновления задачи попробуйте:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<UpdateListItems
xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>Tasks</listName>
<updates>
<Batch OnError="Continue" ListVersion="1">
<Method ID="1" Cmd="Update">
<Field Name="ID">199</Field>
<Field Name="Outcome">Approved</Field>
<Field Name="Status">Completed</Field>
<Field Name="ows_TaskStatus">Approved</Field>
</Method>
</Batch>
</updates>
</UpdateListItems>
</soap:Body>
</soap:Envelope>

Информация об услуге:

http://objectmix.com/sharepoint/800144-updatelistitems-web-service-does-not-update-field.html

Информация об утвержденном поле:

http://social.msdn.microsoft.com/Forums/en/sharepointworkflow/thread/6712d379-2df6-4223-9a29-b2e60493f1b6

http://social.msdn.microsoft.com/Forums/en/sharepointworkflow/thread/3dc95190-cc61-4067-ac35-2d1a82fad499

3 голосов
/ 27 января 2011

Вы можете использовать следующий код, который использует веб-службу списков и метод UpdateListItems. Ключ должен использовать Cmd = 'Moderate'

 public static XmlNode UpdateListItemApprove()
 {
            listservice.Lists listProxy = new listservice.Lists();


            string xml = "<Batch OnError='Continue'><Method ID='1' Cmd='Moderate'><Field Name='ID'/><Field Name='FileRef'>http://basesmcdev2/sites/tester1/approvals/KL022030.lic</Field><Field Name=\"_ModerationStatus\" >0</Field></Method></Batch>";

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlNode batchNode = doc.SelectSingleNode("//Batch");

            listProxy.Url = "http://basesmcdev2/sites/tester1/_vti_bin/lists.asmx";
            listProxy.UseDefaultCredentials = true;

            XmlNode resultNode = listProxy.UpdateListItems("approvals", batchNode);

            return resultNode;


}
...