<< Click to Display Table of Contents >> Разработка > Примеры разработки > Согласование по регламенту Как добавить критерий в правило согласования |
Ситуация
В задаче на согласование по регламенту на основании критериев вычисляется наиболее подходящее правило согласования по конкретному документу. Критерии задаются в карточке правила согласования. Чем больше критериев указано, тем меньше список документов, для которых действует правило и тем выше его приоритет. Правило с максимальным приоритетом автоматически подставляется в карточку задачи на согласование по регламенту в поле *Регламент. Остальные подходящие правила доступны сотруднику для выбора в карточке задачи. Иногда возникают ситуации, когда критериев для подбора подходящего правила недостаточно и нужно добавить свой критерий в карточку правила согласования.
Предположим, нужно добавить критерий Этап тендера в правила согласования ContractsApprovalRule для договорных документов.
Решение
1.В своем решении перекройте тип документа «Договор» (Sungero.Contracts.Contract).
2.В редакторе решения добавьте зависимость от модуля Sungero.Contracts.
3.В редакторе перекрытого типа документа в узле «Свойства» создайте свойство Этап тендера (TenderStep). На основании этого свойства в следующих шагах добавляется новый критерий согласования по этапу тендера.
4.В узле «Форма» добавьте новое свойство на карточку перекрытого типа договора.
5.Перекройте справочник «Правила согласования» (ContractsApprovalRule).
ВАЖНО. Для входящего, исходящего и внутреннего потоков документов нужно перекрывать справочник «Правило согласования» (ApprovalRule).
6.В редакторе перекрытого справочника в узле «Свойства» создайте свойство Этап тендера (TenderStep).
7.В узле «Форма» добавьте новое свойство на карточку перекрытого типа договора.
8.Чтобы переопределить присвоение приоритета, в серверном событии До сохранения (в транзакции) перекрытого справочника напишите код:
{
// Присвоить правилу приоритет 0.
_obj.Priority = 0;
// Если заполнен критерий «Наши организации», прибавить 16.
if (_obj.BusinessUnits.Any())
_obj.Priority += 16;
// Если заполнен критерий «Виды документов», прибавить 8.
if (_obj.DocumentKinds.Any())
_obj.Priority += 8;
// Если заполнен критерий «Подразделения», прибавить 4.
if (_obj.Departments.Any())
_obj.Priority += 4;
// Если заполнен критерий «Группы документов», прибавить 2.
if (_obj.DocumentGroups.Any())
_obj.Priority += 2;
// Если заполнен критерий «Этап тендера», прибавить 1.
if (_obj.TenderStep != null)
_obj.Priority += 1;
base.Saving(e);
}
Для критерия, которому присваивается больший вес, указывается большая сумма. По заполненным критериям и их весу автоматически считается значение в поле Приоритет правила согласования. Правило с максимальным приоритетом автоматически подставляется в карточку задачи в поле Регламент.
9.При сохранении карточки правила согласования должно проверяться наличие дублей среди правил. Проверка выполняется по уникальности заданных критериев. Чтобы проверить наличие дублей правила согласования и учесть новый критерий, переопределите серверную функцию GetDoubleRules() в перекрытом справочнике ContractsApprovalRule:
public override List<Sungero.Docflow.IApprovalRuleBase> GetDoubleRules()
{
var conflictedRules = base.GetDoubleRules();
return conflictedRules.Where(r => ContractsApprovalRules.Is(r) &&
ContractsApprovalRules.As(r).TenderStep == _obj.TenderStep).ToList();
}
10.Создайте серверную функцию перекрытого справочника. Вызовите в ней функцию GetAvailableRulesByDocument() из базового решения, которая используется для определения доступных правил по документу. Из полученных правил исключите те, которые не подходят под новый критерий. Для этого в перекрытом справочнике добавьте серверную функцию и напишите ее код:
[Remote(IsPure = true), Public]
public static IQueryable<Sungero.Docflow.IApprovalRuleBase>
GetAvailableRulesByDocumentCustom(Sungero.Docflow.IOfficialDocument document)
{
var rules = Sungero.Docflow.PublicFunctions.ApprovalRuleBase.Remote.GetAvailableRulesByDocument(document);
var contract = Contracts.As(document);
if (contract != null && contract.TenderStepDEV != null)
rules = rules.Where(r => ContractsApprovalRules.Is(r) &&
(ContractsApprovalRules.As(r).TenderStep == contract.TenderStep ||
ContractsApprovalRules.As(r).TenderStep == null));
return rules;
}
11.Переопределите функцию получения правил согласования GetApprovalRules() в тех типах документов, для которых применяется новый критерий. В данном примере – в типе документа «Договор». В переопределенной функции вызовите функцию GetAvailableRulesByDocumentCustom(), созданную на предыдущем шаге.
public override List<Sungero.Docflow.IApprovalRuleBase> GetApprovalRules()
{
return Functions.ContractsApprovalRule.GetAvailableRulesByDocumentCustom(_obj)
.OrderByDescending(r => r.Priority)
.ToList();
}
12.Опубликуйте разработку.
В результате новый критерий по этапу тендера добавится в карточку правила согласования для договорных документов. При отправке договорного документа, у которого в карточке заполнено поле с этапом тендера, в поле *Регламент подставится правило, которое предварительно настроил администратор в системе Directum RX, например, правило Договор. Проект Тендера. Сбыт.
© Компания Directum, 2024 |