/// <summary> /// Возвращает чеки которые нужно выполнить на следующем шаге(должен быть выполнен хотя бы один шаг) /// <br/>если вернет null то значит входные данные не верны /// </summary> public static IEnumerable <MaintenanceCheckComplianceGroup> GetNextComplianceCheckGroups(this ICommonCollection <MaintenanceCheck> checks, bool schedule) { var checksGroupsCollections = checks.GroupingCheckByType(schedule); var complianceGroupCollection = new MaintenanceCheckComplianceGroupCollection(); if (checksGroupsCollections.Length == 0) { return(complianceGroupCollection); } foreach (var groupCollection in checksGroupsCollections) { if (groupCollection.Grouping) { //поиск минимального шага int?minStep = groupCollection.FindMinStep(); if (minStep == null) { continue; } int num; if (schedule) { var nums = groupCollection.GetLastComplianceGroupNums(); num = nums.Count == 0 ? 1 : nums.First() + 1; } else { var lastCheck = (from check in checks where check.LastPerformance != null && check.Schedule == schedule orderby check.LastPerformance.RecordDate descending select check).ToList(); if (lastCheck.Count == 0 || lastCheck.First().Schedule) { //Последним выполненым чеков на ВС бал чек по плановой программе обслуживания //т.е. после пред. выполнения программа обслуживания была изменена на "Хранение" //поэтому надо расчитать 1 группу чеков по Хранению num = 1; } else { num = lastCheck.First().LastPerformance.NumGroup + 1; } } int tableInterval = num * minStep.Value; foreach (var groupCheck in groupCollection) { int localInterval = tableInterval; if (groupCheck.CheckCycle <= tableInterval) { localInterval = tableInterval % groupCheck.CheckCycle; if (localInterval == 0) { //если локальный интервал равен нулю //то программа обслуживания находится на //границе выполнения данного типа чеков (н: всех чеков А) //Поэтому в след. группу выполнения надо включить все чеки //данного типа. //На след. шаге к данной группе должен быть добавлен хотя бы один чек вышестоящего типа //(н: B или C) if (groupCheck.Checks.Count > 0 && groupCheck.Checks[0].ParentAircraft.MSG >= MSG.MSG3) { foreach (var check in groupCheck.Checks) { check.Tag = num; if (tableInterval % check.Interval.GetSubresource(groupCollection.Resource) == 0) { complianceGroupCollection.Add(check, num, groupCheck.CheckCycle); } } } else { foreach (var check in groupCheck.Checks) { check.Tag = num; complianceGroupCollection.Add(check, num, groupCheck.CheckCycle); } } } } if (localInterval == 0) { continue; } foreach (var check in groupCheck.Checks) { check.Tag = num; if (localInterval % check.Interval.GetSubresource(groupCollection.Resource) == 0) { complianceGroupCollection.Add(check, num, groupCheck.CheckCycle); } } } } else { foreach (var groupCheck in groupCollection) { foreach (var check in groupCheck.Checks) { var group = new MaintenanceCheckComplianceGroup(check.Schedule); group.Grouping = check.Grouping; group.Resource = check.Resource; group.GroupComplianceNum = check.LastPerformance != null ? check.LastPerformance.PerformanceNum : 1; group.CheckCycle = Convert.ToInt32(check.Interval.GetSubresource(check.Resource)); group.Checks.Add(check); complianceGroupCollection.Add(group); } } } } return(complianceGroupCollection); }