<< Click to Display Table of Contents >> Разработка > Примеры разработки > Согласование по регламенту Как добавить результат выполнения в задание на согласование |
Ситуация
В компании настроено правило согласования документов с уменьшающимся кругом согласующих. При согласовании документа по данному правилу сотрудник может выполнить задание с одним из результатов:
•Согласовать, если содержимое документа и его приложений полностью устраивает;
•На доработку, если есть незначительные замечания к содержимому документа или приложений. После доработки документа задание на повторное согласование придет только тем, кто выбрал этот результат выполнения;
•Переадресовать, если согласование документа необходимо передать другому сотруднику.
Нужно добавить результат выполнения На переработку. Согласующий будет использовать его вместо результата На доработку, если в документ нужно внести большие изменения. При выполнении задания с этим результатом после исправления документ должен прийти на следующий круг согласование всем согласующим, даже если ранее они согласовали документ.
Решение
1.Перекройте тип задания «Согласование» (ApprovalAssignment) из базового решения Directum RX.
2.В редакторе решения, в котором перекрыт тип задания, добавьте зависимость от модуля «Документооборот» (Docflow). Если зависимости не указаны, при публикации могут возникнуть ошибки.
3.В редакторе перекрытого типа задания добавьте свойство На переработку (ForMajorRework). Тип свойства: Логическое. Свойство будет принимать значение true при выполнении задания с результатом На переработку.
4.В перекрытый тип задания нельзя добавить результат выполнения На переработку. Кнопка Добавить недоступна, так как:
•тип задания «Согласование» используется в схеме задачи на согласование по регламенту (ApprovalTask);
•в редакторе типа «Задача на согласование по регламенту» установлен флажок Запрет создания версий схемы в перекрытиях задачи.
Поэтому вместо результата выполнения добавьте действие На переработку (ForMajorRework). Заполните поля в группах «Именование» и «Параметры», как показано на рисунке:
Чтобы заполнить поле *Сообщение подтверждения, установите флажок Запрашивать подтверждение перед выполнением. После заполнения поля снимите флажок.
Примечание. Локализуйте введенные значения. Для этого используйте ссылки Локализовать.
5.Для нового действия добавьте обработчик Выполнение:
public virtual void RejectApprovalDEV(Sungero.Domain.Client.ExecuteActionArgs e)
{
/*При выполнении задания система пытается получить доступ на редактирование карточки вложенного документа, поэтому проверяем вложение на блокировку.*/
var accessInfo = Locks.GetLockInfo(_obj.DocumentGroup.OfficialDocuments.FirstOrDefault());
if (accessInfo.IsLocked)
{
e.AddError(accessInfo.LockedMessage);
return;
}
/*Создаем объект action с типом ExecuteResultActionArgs, который нужен для вызова базового обработчика события "Выполнение".*/
var action = new Sungero.Workflow.Client.ExecuteResultActionArgs(e.FormType, e.Entity, e.Action);
/*Вызываем базовый обработчик события "Выполнение" с результатом "На доработку".*/
base.ForRevision(action);
_obj.ForMajorReworkDEV = true;
// Закрываем карточку задания после выполнения.
e.CloseFormAfterAction = true;
// Выполняем задание.
_obj.Complete(Result.ForRevision);
}
6.Добавьте на ленту кнопку и свяжите с действием На переработку.
7.В переписке по задаче при выполнении задания с результатом На переработку должен отображаться соответствующий текст.
Для этого в перекрытом типе задания переопределите обработчик серверного события До выполнения:
public override void BeforeComplete(Sungero.Workflow.Server.BeforeCompleteEventArgs e)
{
base.BeforeComplete(e);
if (_obj.ForMajorReworkDEV.GetValueOrDefault())
e.Result = DEV.PerekrytiiaExample.ApprovalAssignments.Resources.RejectApproval;
}
8.Чтобы отследить результат выполнения на следующих этапах согласования, перекройте тип «Задача на согласование по регламенту» (ApprovalTask) и также добавьте свойство На переработку (ForMajorRework). Тип свойства: Логическое.
9.Перейдите в узел «Схема», выделите блок Согласование с согласующими и добавьте обработчик события Конец блока:
public override void EndBlock6(Sungero.Docflow.Server.ApprovalAssignmentEndBlockEventArguments e)
{
base.EndBlock6(e);
if (e.CreatedAssignments.Cast< DEV.SolutionResult.IApprovalAssignment>().Any(a => a.ForRemakeDEV.GetValueOrDefault()))
_obj.ForMajorReworkDEV = true;
}
Примечание. Нельзя заполнять свойство На переработку (ForMajorRework) прямо из задания при выполнении, т.к. при замещении у пользователя могут отсутствовать права на основную задачу.
10.Для блока Доработка добавьте обработчик события Старт блока, чтобы:
•инициатор согласования получил задание с темой «Переработайте:<Имя документа>»:
•после выполнения задания на доработку документ пришел на повторное согласование всем согласующим.
public override void StartBlock5(Sungero.Docflow.Server.ApprovalReworkAssignmentArguments e)
{
base.StartBlock5(e);
if (_obj.ForMajorReworkDEV.GetValueOrDefault())
{
// Меняем начало темы с «Доработайте» на «Переработайте».
e.Block.Subject = e.Block.Subject.Replace("Доработайте", "Переработайте");
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;
}
}
}
11.Также для блока Доработка добавьте обработчик события Конец блока. В обработчике измените значение свойства На переработку (ForMajorRework) на false, чтобы на следующих кругах согласования была возможность доработать документ с уменьшающимся кругом согласующих.
public override void EndBlock5(Sungero.Docflow.Server.ApprovalReworkAssignmentEndBlockEventArguments e)
{
base.EndBlock5(e);
_obj.ForMajorReworkDEV = false;
}
12.Чтобы инициатор не смог изменить состав согласующих после переработки документа, сделайте недоступной табличную часть в группе «Параметры согласования».
Для этого перекройте тип задания «Доработка» (ApprovalReworkAssignment) и добавьте обработчик клиентского события Обновление формы:
public override void Refresh(Sungero.Presentation.FormRefreshEventArgs e)
{
base.Refresh(e);
if (ApprovalTasks.As(_obj.Task).ForMajorReworkDEV.GetValueOrDefault())
_obj.State.Properties.Approvers.IsEnabled = false;
}
В результате документ можно будет отправить на доработку и на переработку.
© Компания Directum, 2024 |