ApprovalRuleServerFunctions.cs
4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Docflow.ApprovalRule;
namespace Sungero.Docflow.Server
{
partial class ApprovalRuleFunctions
{
#region Проверка возможности существования маршрутов правила
/// <summary>
/// Проверка возможности существования маршрута правила.
/// </summary>
/// <param name="route">Маршрут.</param>
/// <param name="ruleConditions">Условия.</param>
/// <param name="conditionStep">Этап.</param>
/// <returns>Возможность существования.</returns>
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 == Docflow.Condition.ConditionType.Addressee)
{
var addresseeConditions = this.GetConditionsInRoute(route, Docflow.Condition.ConditionType.Addressee).Where(c => c.StepNumber != conditionStep.StepNumber).ToList();
possibleStage = this.CheckAddresseeConditions(addresseeConditions, conditionStep);
}
// Проверка условия "Несколько адресатов".
if (conditionType == Docflow.Condition.ConditionType.ManyAddressees)
{
var manyAddresseesConditions = this.GetConditionsInRoute(route, Docflow.Condition.ConditionType.ManyAddressees).Where(c => c.StepNumber != conditionStep.StepNumber).ToList();
possibleStage = this.CheckManyAddresseesConditions(manyAddresseesConditions, conditionStep);
}
return possibleStage;
}
/// <summary>
/// Проверить возможность существования данного маршрута с условиями по адресату.
/// </summary>
/// <param name="allConditions">Все условия в данном маршруте.</param>
/// <param name="condition">Текущее условие.</param>
/// <returns>Возможность существования данного маршрута.</returns>
public bool CheckAddresseeConditions(List<Structures.ApprovalRuleBase.RouteStep> allConditions, Structures.ApprovalRuleBase.RouteStep condition)
{
var conditionItem = _obj.Conditions.Where(x => x.Number == condition.StepNumber).FirstOrDefault();
var addressees = Conditions.As(conditionItem.Condition).Addressees.Select(x => x.Addressee).ToList();
foreach (var previousCondition in allConditions.TakeWhile(x => !Equals(x, condition)))
{
var previousConditionItem = _obj.Conditions.Where(x => x.Number == previousCondition.StepNumber).FirstOrDefault();
var previousAddressees = Conditions.As(previousConditionItem.Condition).Addressees.Select(x => x.Addressee).ToList();
var result = CheckConsistencyConditions(addressees, previousAddressees, condition, previousCondition);
if (result != null)
return result.Value;
}
return true;
}
/// <summary>
/// Проверить возможность существования данного маршрута с условиями по нескольким адресатам.
/// </summary>
/// <param name="allConditions">Все условия в данном маршруте.</param>
/// <param name="condition">Текущее условие.</param>
/// <returns>Возможность существования данного маршрута.</returns>
public bool CheckManyAddresseesConditions(List<Structures.ApprovalRuleBase.RouteStep> allConditions, Structures.ApprovalRuleBase.RouteStep condition)
{
foreach (var previousCondition in allConditions.TakeWhile(x => !Equals(x, condition)))
return previousCondition.Branch == condition.Branch;
return true;
}
#endregion
}
}