Sharepoint «из коробки». Рабочий процесс утверждения. Утверждение / отклонение комментариев при программном изменении. - PullRequest
19 голосов
/ 13 октября 2011

У меня есть многократно используемый рабочий процесс утверждения sharepoint 2010, и я программно утверждаю / отклоняю рабочий процесс, используя приведенный ниже фрагмент кода внутри формформ infopath (2010).

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

Этот код работает нормально, но комментарии к задаче не изменяются и не включаются в электронное письмо.Что-то не так с ht ["Comments"], который я использую?Это не изменяется в комментариях к задаче.Это рабочие процессы SharePoint 2010, и я использую форму инфопатии также 2010.

Кто-нибудь сталкивался с подобной проблемой?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Если вам нужен код только для списков (не для DocLibs), вы можете использовать свойство item.ModerationInformation.Status.Как в следующем примере:

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

Но если вы хотите сделать это для всех типов списков, вы можете использовать внутренний метод UpdateInternal со следующими параметрами:

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

Вы можете использовать примеры из этого русского блога Item ModerationInformation и SPListItem.UpdateInternal ()

1 голос
/ 06 сентября 2012

Чтобы добавить комментарий к задаче при его утверждении / отклонении, вам просто нужно использовать строку перед AlterTask:

ht["ows_FieldName_Comments"] = comments;

После того, как задача утверждена, вы можете увидеть комментарии в истории рабочего процесса.Список.

Вы также можете получить все сводные комментарии по заданию с помощью:

Hashtable extProperties = SPWorkflowTask.GetExtendedPropertiesAsHashtable(currentTask);

string consolidatedComments = extProperties["FieldName_ConsolidatedComments"].ToString();

Удачи!

...