c# - office - flujo de trabajo de aprobacion sharepoint online
Sharepoint Fuera de la caja Flujo de trabajo de aprobaciĆ³n Aprobar/Rechazar el problema de los comentarios al modificarlo mediante programaciĆ³n (2)
Tengo un flujo de trabajo de aprobación 2010 para uso compartido de SharePoint, y estoy programado para aprobar / rechazar el flujo de trabajo utilizando el siguiente fragmento de código dentro de infopath formcode (2010).
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]);
if (isApprove)
{
ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved";
ht["TaskStatus"] = "Approved";
ht[SPBuiltInFieldId.Comments] = "Approved by Manager";
ht["Comments"] = "Approved by Manager";
}
else
{
XPathNavigator navigatorRejectComments
= this.MainDataSource.CreateNavigator().SelectSingleNode
(XPATH_REJECT_COMMENTS, this.NamespaceManager);
ht[SPBuiltInFieldId.WorkflowOutcome] = "Rejected";
ht["TaskStatus"] = "Rejected";
ht[SPBuiltInFieldId.Comments] = navigatorRejectComments.Value.Trim();
ht["Comments"] = navigatorRejectComments.Value.Trim();
}
ht["FormData"] = SPWorkflowStatus.Completed;
web.AllowUnsafeUpdates = true;
isApproveReject = AlterTask(task, ht, true, 5, 100);
web.AllowUnsafeUpdates = false;
Método de alterar la tarea
private static bool AlterTask(SPListItem task, Hashtable htData, bool fSynchronous, int attempts, int millisecondsTimeout)
{
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(millisecondsTimeout);
}
}
return SPWorkflowTask.AlterTask(task, htData, fSynchronous);
}
Este código funciona bien, pero los comentarios de la tarea no se modifican y tampoco se incluyen en el correo electrónico. ¿Hay algo malo con ht ["Comentarios"] que uso? No se está alterando en los comentarios de la tarea. Este es el flujo de trabajo de SharePoint 2010 y el formulario de información que estoy usando también es 2010.
¿Alguien enfrentó un problema similar?
Para agregar un comentario a una tarea cuando lo apruebe / rechace, solo necesita usar la línea antes de AlterTask:
ht["ows_FieldName_Comments"] = comments;
Una vez aprobada la tarea, puede ver los comentarios en la Lista de historial de flujo de trabajo.
También puede obtener todos los comentarios consolidados de una tarea con:
Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask);
string consolidatedComments = extProperties["FieldName_ConsolidatedComments"].ToString();
¡Buena suerte!
Si necesita código solo para Listas (no para DocLibs) puede usar la propiedad item.ModerationInformation.Status
. Como el siguiente ejemplo:
var url = @"http://server/Lists/ContentApList";
var web = new SPSite(url).OpenWeb();
var list = web.GetList(url);
var item = list.GetItemById(1);
item["MyCheck"] = "test23";
item.ModerationInformation.Status = SPModerationStatusType.Pending;
item.ModerationInformation.Comment = "my coment";
item.SystemUpdate();
Pero si desea hacerlo para todos los tipos de lista, puede usar el método interno UpdateInternal
, con los siguientes parámetros:
static void UpdateMigrate(SPListItem item)
{
UpdateInternal(item, true, false, Guid.Empty, true, false,false, false, false, false);
}
static void CheckList5()
{
var url = @"http://server/Lists/ContentApList";
var web = new SPSite(url).OpenWeb();
var file = web.GetFile("CheckDocLib/logo.gif");
var item = file.ListItemAllFields;
item["MyComments"] = "test23ddd";
item.ModerationInformation.Status = SPModerationStatusType.Approved;
item.ModerationInformation.Comment = "my coment";
UpdateMigrate(item);
}
Puede usar ejemplos de este blog ruso Item ModerationInformation y SPListItem.UpdateInternal ()