2011-01-27 29 views
6

Tôi đã tạo quy trình làm việc là SharePoint Designer và liên kết nó với một danh sách. Luồng công việc tạo ra một quy trình phê duyệt, do đó SharePoint tạo một tác vụ trong danh sách Nhiệm vụ để người dùng có thể chấp thuận hoặc từ chối.Phê duyệt tác vụ dòng công việc SharePoint bằng cách sử dụng Dịch vụ Web SharePoint/Mô hình Đối tượng

Điều tôi cần làm là phê duyệt hoặc từ chối tác vụ mà không cần mở nhiệm vụ trong danh sách nhiệm vụ. Sau một số nghiên cứu tôi đã tìm ra rằng tôi có thể sử dụng Dịch vụ Web SharePoint. Tuy nhiên tôi cảm thấy bị mất vì tôi không biết dịch vụ nào, ví dụ: Lists.asmx và phương thức nào, ví dụ: UpdateListItems, để gọi.

Ai đó có thể hướng dẫn tôi qua những điều sau đây:
1- Có khả thi để phê duyệt tác vụ quy trình làm việc Dịch vụ web SharePoint không?
2- Bạn có thể chỉ cho tôi một ví dụ về cách phê duyệt một tác vụ hay không, ví dụ: dịch vụ và phương thức nào để gọi và những thông số nào?

Cập nhật
tôi đã được sử dụng XML sau đây để thiết lập các quy trình làm việc để hoàn thành: danh sách

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>"; 

Nhiệm vụ mục được cập nhật nhưng WorkflowOutcome vẫn trống rỗng và các công việc không di chuyển đến bước tiếp theo.
Còn gì khác nữa?

Cập nhật # 2
Tôi đang nghi ngờ ExtendedProperties của mục danh sách công việc. Đối với một mục được hoàn thành bằng giao diện người dùng, các ExtendedProperties hiển thị ws_TaskStatus = 'Approved'. Tuy nhiên đối với một mục đã được phê duyệt bằng cách sử dụng mã ws_TaskStatus không tồn tại.

Cập nhật # 3
Từ bài đăng MSDN, tôi được yêu cầu sử dụng Luồng công việc.asmx thay vì Lists.asmx.
Tôi đã sử dụng đoạn mã sau:

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 Tôi đang sử dụng để phê duyệt nhiệm vụ là

<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> 

Nhưng một lần nữa các nhiệm vụ đã được cập nhật nhưng công việc không di chuyển về phía trước.

Cập nhật # 4
Tôi đã thực hiện một thử nghiệm cuối cùng với mô hình đối tượng máy chủ SharePoint tuy nhiên, một lần nữa, nhiệm vụ được cập nhật nhưng luồng công việc không được chuyển tiếp.
Đây là mã của tôi:

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();
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;
web.AllowUnsafeUpdates = true; SPWorkflowTask.AlterTask((task as SPListItem), ht, true); }

Trả lời

4

Sau rất nhiều thử nghiệm và điều tra tôi chỉ có đoạn mã sau làm việc phê duyệt nhiệm vụ

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); 
} 

Tôi nghi ngờ rằng ht["TaskStatus"] = "Approved"; là thuộc tính mà giải quyết nó. Dù sao tôi sẽ cố gắng thu hẹp vào tập hợp các thuộc tính cần được thay đổi.

3

Bạn có thể sử dụng mã sau sử dụng dịch vụ web danh sách và phương pháp UpdateListItems.Điều quan trọng là sử dụng Cmd = 'vừa phải'

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; 


} 
3

Tôi không chắc chắn nếu giải pháp Madhur của hoạt động trên mục liên quan hoặc vào các nhiệm vụ, nhưng để cập nhật các thử nhiệm vụ:

<?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> 

Thông tin về các dịch vụ:

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

thông tin về các lĩnh vực đã được phê duyệt:

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

+0

+1 cho các liên kết hữu ích –

Các vấn đề liên quan