sharepoint 2010 - ¿Cómo establecer programáticamente el resultado de la tarea(respuesta de la tarea) de una tarea de Nintex Flexi?
sharepoint-2010 nintex-workflow (2)
Aquí está mi código para cambiar el resultado de la tarea de nintex flexi. Mi problema es el permiso. Pasé token de administrador al sitio. Es resolver el problema.
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;
}
¿Hay alguna manera de establecer una tarea de Nintex Flexi a través de los servicios web de Sharepoint? Hemos intentado actualizar los campos "WorkflowOutcome", "ApproverComments" y "Status" sin éxito (en realidad, los comentarios y el estado se han actualizado correctamente, pero no puedo encontrar la manera de actualizar el campo del sistema WorkflowOutcome).
No puedo usar el servicio web de Nintex (ProcessTaskResponse) porque necesita las credenciales del usuario asignado de la tarea (inicio de sesión, contraseña, dominio).
La página de Asp.net no tiene esa información, solo tiene las credenciales de administrador de SharePoint. Una forma es delegar primero la tarea al administrador y luego llamar a ProcessTaskResponse, pero no es eficiente y es propenso a errores.
En mis pruebas hasta ahora, cualquier actualización (UpdateListItems) al campo WorkflowOutcome establece automáticamente el campo Estado en "Completado" y el campo Porcentaje completado en "1" (100%), finalizando la tarea (y continuando el flujo), pero con el respuesta incorrecta : siempre "Rechazar", sin importar a qué intente configurarlo.
¿Has probado este código? (El truco es el bloque try-cacth con redirección)
//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
{
}
?