<< Click to Display Table of Contents >> Разработка > Примеры разработки > Разработка модуля и типа документа > Шаг 7. Добавление условия согласования Проверка веток перед валидацией |
Предполагается, что на данный момент компания будет использовать простую схему согласования договоров закупок с двумя условиями. Однако в будущем в схеме появится больше условий, она усложнится. Поэтому нужно заранее подумать об оптимизации сохранения схемы, а именно доработать проверку веток схемы перед валидацией. Для этого:
1.Перекройте справочник Правило согласования договоров (Sungero.Contracts.ContractsApprovalRule). Проверьте, что в списке зависимостей вашего решения указан модуль Sungero.Contracts. При необходимости добавьте его. Если в решении не указаны зависимости от перекрытых модулей, то при публикации могут возникнуть ошибки.
2.Чтобы проверить, какие ветки в правиле согласования нужно валидировать перед сохранением, переопределите функцию CheckRoutePossibility(). Для этого в серверных функциях перекрытого справочника напишите код:
// Проверка возможности существования ветки при добавлении в нее нового условия.
public override bool CheckRoutePossibility(List<Structures.ApprovalRuleBase.RouteStep> route,
List<Structures.ApprovalRuleBase.ConditionRouteStep> ruleConditions,
Structures.ApprovalRuleBase.RouteStep conditionStep)
{
// Получить список допустимых веток по базовой логике.
var possibleStage = base.CheckRoutePossibility(route, ruleConditions, conditionStep);
var conditionType = _obj.Conditions.First(c => c.Number == conditionStep.StepNumber).Condition.ConditionType;
// Проверить условия по виду закупки.
if (conditionType == DEV.DevelopmentExample.ContractCondition.ConditionType.PurchaseKind)
{
// Получить все условия по виду закупки из ветки.
var purchaseKindConditions = this.GetPurchaseKindConditionsInRoute(route).Where(c => c.StepNumber != conditionStep.StepNumber).ToList();
// Определить допустимость ветки с точки зрения условий по виду закупки.
possibleStage = this.CheckPurchaseKindConditions(purchaseKindConditions, conditionStep);
}
return possibleStage;
}
3.В редакторе перекрытого справочника добавьте серверную функцию GetPurchaseKindConditionsInRoute(), чтобы найти все условия по виду закупки в ветке:
// Получить все условия по виду закупки в данной ветке.
public List<Structures.ApprovalRuleBase.RouteStep> GetPurchaseKindConditionsInRoute(List<Structures.ApprovalRuleBase.RouteStep> route)
{
return route.Where(e => _obj.Conditions.Any(c => Equals(c.Number, e.StepNumber) && c.Condition.ConditionType ==
DEV.DevelopmentExample.ContractCondition.ConditionType.PurchaseKind)).ToList();
}
4.В редакторе перекрытого справочника добавьте серверную функцию CheckPurchaseKindConditions(). Когда в схеме попадется условие, функция анализирует, были ли условия такого же типа раньше. Если были, то сравнивает переход из предыдущего условия с вариантами перехода из проверяемого условия. Переходы, которые противоречат друг другу исключаются.
// Сравнить условия в схеме и проверить,
// какие ветки правила согласования нужно валидировать.
public bool CheckPurchaseKindConditions(List<Sungero.Docflow.Structures.ApprovalRuleBase.RouteStep> allConditions, Sungero.Docflow.Structures.ApprovalRuleBase.RouteStep condition)
{
var conditionItem = _obj.Conditions.Where(x => x.Number == condition.StepNumber).FirstOrDefault();
var contractCondition = DEV.DevelopmentExample.ContractConditions.As(conditionItem.Condition);
var purchaseKind = contractCondition.PurchaseKind;
// Проверить непротиворечивость условия с предыдущими условиями этого же типа в ветке.
foreach (var previousCondition in allConditions.TakeWhile(x => !Equals(x, condition)))
{
var previousConditionItem = _obj.Conditions.Where(x => x.Number == previousCondition.StepNumber).FirstOrDefault();
var previousContractCondition = DEV.DevelopmentExample.ContractConditions.As(previousConditionItem.Condition);
var previousPurchaseKind = previousContractCondition.PurchaseKind;
// Если вид закупки в предыдущем условии такой же, а переход отличается – ветка не валидна.
if (purchaseKind == previousPurchaseKind && previousCondition.Branch != condition.Branch)
return false;
}
return true;
}
© Компания Directum, 2024 |