Добавление новых результатов выполнения заданий при согласовании документов в DirectumRX

49 1

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

В процессе разработки нового результата выполнения можно выделить следующие этапы:

  • перекрытие задачи на согласование по регламенту и необходимых заданий;
  • добавление нового действия в задании;
  • добавление строк локализации для диалогового окна подтверждения;
  • изменение отображаемого результата выполнения задания в дереве задачи.

Перекрытие задачи на согласование по регламенту и необходимых заданий

В начале необходимо определится на каких этапах будут использоваться новые результаты выполнения и, в зависимости от этого, перекрыть необходимые типы заданий. Также нужно продумать логику процессов по ходу согласования, чтобы обработать результат после выполнения задания . Для этого необходимо переопределять обработчики событий в схеме задачи.

Добавление нового действия в задании

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

При разработке нового действия необходимо вызвать базовую функцию выполнения, например, base.Approved(), которая принимает в себя объект типа Sungero.Workflow.Client.ExecuteResultActionArgs. Для создания экземпляра соответствующего класса используем свойства параметра e типа Sungero.Domain.Client.ExecuteActionArgs и стандартный конструктор.

var action = new Sungero.Workflow.Client.ExecuteResultActionArgs(e.FormType, e.Entity, e.Action);

После обрабатывания логики результата согласования следует выполнить задание.

_obj.Complete(Result.Approved);

Так как при выполнении метода Complete() система пытается получить доступ на редактирование карточки вложения, то необходимо проверить вложение на блокировку.

var accessInfo = Locks.GetLockInfo(_obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
if (accessInfo.IsLocked)
{
  e.AddError(accessInfo.LockedMessage);
  return;
}

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

e.CloseFormAfterAction = true;

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

public virtual void CustomApproved(Sungero.Domain.Client.ExecuteActionArgs e)
{
  var accessInfo = Locks.GetLockInfo(_obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
  if (accessInfo.IsLocked)
  {
    e.AddError(accessInfo.LockedMessage);
    return;
  }

  var action = new Sungero.Workflow.Client.ExecuteResultActionArgs(e.FormType, e.Entity, e.Action);
  base.Approved(action);
  _obj.Complete(Result.Approved);
  e.CloseFormAfterAction = true;
}

Добавление строк локализации для диалогового окна подтверждения

В базовых методах обработки выполнения задания задано отображения диалога подтверждения для действий. Чтобы изменить текст диалога нужно заполнить строки локализации сообщения подтверждения для действия. Это будет рассмотрено далее на примере.

Изменение отображаемого результата выполнения задания в дереве задачи

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

public override void BeforeComplete(Sungero.Workflow.Server.BeforeCompleteEventArgs e)
{
  base.BeforeComplete(e);
  e.Result = Solution.ApprovalAssignments.Resources.CustomApproved;
}

Пример реализации

Добавление результата выполнения «на переработку»

В постановке задачи зафиксировано, что согласующий может принять решение, что инициатору необходимо внести большие изменения в документ по результатам согласования. При этом на следующем круге согласования исправленную версию должны проверить все участники согласования, в независимости от того, с каким результатом они выполнили свои задания. В регламенте настроена возможность согласования с уменьшающимся кругом и необходимо оставить данную функциональность. Такую ситуацию можно разрешить добавлением нового результата выполнения «на переработку». При его использовании задания на следующем круге согласования будут отправляться всем участникам.

Перекроем задание на согласование и добавим новое действие «RejectApproval», которое будет включать в себя выполнение стандартного результата выполнения «На доработку».

Для того, чтобы отследить выполнение задания с новым результатом добавим новое логическое свойство «ForRemake», которое по умолчанию принимает значение false и будет заполняться только при выполнении соответствующего действия.

public virtual void RejectApproval(Sungero.Domain.Client.ExecuteActionArgs e)
{
  var accessInfo = Locks.GetLockInfo(_obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
  if (accessInfo.IsLocked)
  {
    e.AddError(accessInfo.LockedMessage);
    return;
  }

  var action = new Sungero.Workflow.Client.ExecuteResultActionArgs(e.FormType, e.Entity, e.Action);
  base.ForRework(action);
  _obj.ForRemake = true;
  e.CloseFormAfterAction = true;
  _obj.Complete(Result.ForRework);
}

Вынесем действие на ленту.


В обработчике выполнения задания реализован механизм отображения диалога подтверждения. Для этого используется метод Dialogs.CreateTaskDialog(action.ConfirmationMessage, MessageType.Question), где action.ConfirmationMessage – строка подтверждения действия, из которого будет вызван данный метод. Следовательно, изменим сообщение подтверждения для нового действия на переработку.

Примечание. Редактирование сообщения подтверждения возможно только при установленном признаке «Запрашивать подтверждение перед выполнением». После редактирования строк локализации необходимо убрать запрос подтверждения в параметрах, иначе сообщение будет дублироваться.

Теперь диалог подтверждения для переработки будет выглядеть следующим образом.

Изменим текст результата выполнения.

public override void BeforeComplete(Sungero.Workflow.Server.BeforeCompleteEventArgs e)
{
  base.BeforeComplete(e);

  if (_obj.ForRemake.GetValueOrDefault())
    e.Result = "На переработку";
}

Примечание. Для упрощения примера в коде используется строковая константа, в продуктивной разработке необходимо передавать строку локализации.

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

Заполнение будет производится в событии «Конец блока» этапа согласования с согласующими.

public override void EndBlock6(Sungero.Docflow.Server.ApprovalAssignmentEndBlockEventArguments e)
{
  base.EndBlock6(e);

   if (e.CreatedAssignments.Cast<DirRX.Solution.IApprovalAssignment>().Any(a => a. ForRemake.GetValueOrDefault()))
    _obj.ForRemake = true;
}

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

Теперь добавим всех исполнителей для повторного согласования, а также отобразим инициатору информацию о переработке документа. Для этого зададим соответствующую тему задания и заполним табличную часть согласующих в параметрах согласования, в событии «Старт блока» для этапа «Доработка».

public override void StartBlock5(Sungero.Docflow.Server.ApprovalReworkAssignmentArguments e)
{
  base.StartBlock5(e);

  if (_obj.ForRemake.GetValueOrDefault())
  {
    // Меняем начало темы с «На доработку» на «На переработку».
    e.Block.Subject = e.Block.Subject.Replace(DirRX.Solution.ApprovalTasks.Resources.ReworkText, DirRX.Solution.ApprovalTasks.Resources.RecycleText);

    var approvalAssignments = ApprovalAssignments.GetAll(a => Equals(a.Task, _obj) && a.Created >= _obj.Started).ToList();
    foreach (var approver in e.Block.Approvers)
    {
      // Исключаем исполнителей, которые переадресовали задание.
      var approvalAssignment = approvalAssignments
       .Where(a => Equals(a.Performer, approver.Approver))
       .OrderByDescending(i => i.Modified)
       .FirstOrDefault();

      var forwarded = approvalAssignment != null && approvalAssignment.Result == Sungero.Docflow.ApprovalAssignment.Result.Forward;
      if (forwarded)
        approver.Action = Sungero.Docflow.ApprovalReworkAssignmentApprovers.Action.DoNotSend;
      else
        approver.Action = Sungero.Docflow.ApprovalReworkAssignmentApprovers.Action.SendForApproval;
    }
  }
}

В результате по теме задания инициатор сможет определить необходимость доработки или переработки документа.


Табличная часть согласующих будет заполнена всеми участниками с учётом переадресации заданий.

Для того, чтобы инициатор не смог изменить состав участников, сделаем недоступной соответствующую табличную часть в событие «Обновление формы».

public override void Refresh(Sungero.Presentation.FormRefreshEventArgs e)
{
  base.Refresh(e);

  if (ApprovalTasks.As(_obj.Task).ForRemake.GetValueOrDefault())
    _obj.State.Properties.Approvers.Properties.Action.IsEnabled = false;
}

В событии «Конец блока» этапа доработки изменим значение признака _obj.IsRecycle = false, чтобы на следующих кругах согласования была возможность доработать документ с уменьшающимся кругом согласующих.

Заключение

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

Илья Каперский

Хорошая статься, очень пригодилась, спасибо.

Авторизуйтесь, чтобы написать комментарий