/// <summary> /// Возвращает последнюю выполненную группу чеков, чеки которой имеют заданные парамерты /// </summary> /// <param name="checks"></param> /// <param name="schedule">Чеки плановые или по программе хранения</param> /// <param name="aircraftId">Родительское ВС чеков</param> /// <param name="grouping">Чеки групповые или нет</param> /// <param name="resource">По какому из ресурсов (часы, циклы или календарь) группируются чеки</param> /// <param name="checkType">Тип чека (A B C D)</param> /// <returns></returns> public static MaintenanceCheckComplianceGroup GetLastComplianceCheckGroup(this ICommonCollection <MaintenanceCheck> checks, bool schedule, int aircraftId, bool grouping = true, LifelengthSubResource resource = LifelengthSubResource.Hours, MaintenanceCheckType checkType = null) { int last = 0; var aircraftScheduleChecks = checks.Where(c => c.Schedule == schedule && c.ParentAircraftId == aircraftId && c.Grouping == grouping && c.Resource == resource).ToList(); if (checkType != null) { aircraftScheduleChecks = aircraftScheduleChecks.Where(c => c.CheckType == checkType).ToList(); } foreach (MaintenanceCheck checkItem in aircraftScheduleChecks) { if (checkItem.LastPerformance != null && last < checkItem.LastPerformance.NumGroup) { last = checkItem.LastPerformance.NumGroup; } } if (last <= 0) { return(null); } var lastComplianceGroup = new MaintenanceCheckComplianceGroup(schedule); foreach (MaintenanceCheck checkItem in aircraftScheduleChecks) { if (checkItem.LastPerformance != null && last == checkItem.LastPerformance.NumGroup) { lastComplianceGroup.Checks.Add(checkItem); } } if (lastComplianceGroup.GetMaxIntervalCheck() == null) { return(null); } lastComplianceGroup.Sort(); return(lastComplianceGroup); }
/// <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); }