protected override void AnimatedThreadWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { labelTitle.Text = ""; labelTitle.Status = Statuses.NotActive; var res = new List <BaseEntityObject>(); foreach (var item in _resultDirectiveArray) { if (item is Component) { var c = item as Component; var a = GlobalObjects.AircraftsCore.GetAircraftById(c.ParentBaseComponent?.ParentAircraftId ?? -1); if (a == null) { continue; } res.Add(item); var component = item as Component; var items = _resultDirectiveArray.Where(lvi => lvi is ComponentDirective && ((ComponentDirective)lvi).ComponentId == component.ItemId); res.AddRange(items); } } _directivesViewer.SetItemsArray(res.ToArray()); _directivesViewer.Focus(); }
/// <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> /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule, /// группирует по MaintenanceCheckType (A, B, C, D, etc), /// и проставляет связи между группами по приоритету MaintenanceCheckType /// </summary> public static IEnumerable <MaintenanceCheckGroupByType> GroupingCheckByType(this ICommonCollection <MaintenanceCheck> checks, int?minStep, bool schedule) { if (minStep == null) { return(null); } var groupChecks = new List <MaintenanceCheckGroupByType>(); Func <MaintenanceCheck, int?> predicate; if (schedule) { predicate = check => check.Interval.Hours; } else { predicate = check => check.Interval.Days; } var v = checks.Where(c => c.Schedule == schedule) .OrderBy(predicate) .ThenBy(c => c.CheckType.Priority) .GroupBy(c => c.CheckType.FullName); foreach (var grouping in v) { var groupCheck = new MaintenanceCheckGroupByType(schedule); foreach (MaintenanceCheck check in grouping) { groupCheck.Checks.Add(check); } groupCheck.Sort(); var last = groupChecks.LastOrDefault(); if (last != null) { last.ParentGroup = groupCheck; last.CheckCycle = groupCheck.MinInterval(); } groupCheck.ParentGroup = null; groupCheck.CheckCycle = groupCheck.MaxInterval(); groupChecks.Add(groupCheck); } return(groupChecks.ToArray()); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDirectiveArray.Clear(); _resultDirectiveArray.Clear(); AnimatedThreadWorker.ReportProgress(0, "load directives"); try { if (_currentForecast == null) { var aircrafts = GlobalObjects.AircraftsCore.GetAllAircrafts(); foreach (var aircraft in aircrafts) { _initialDirectiveArray.AddRange(GlobalObjects.DirectiveCore.GetDeferredItems(null, aircraft)); } } else { AnimatedThreadWorker.ReportProgress(20, "calculation directives"); GlobalObjects.AnalystCore.GetDirectives(_currentForecast, _currentPrimaryDirectiveType); DirectiveCollection dirC = _currentForecast.DirectiveCollections[_currentPrimaryDirectiveType]; foreach (Directive directive in dirC) { _initialDirectiveArray.Add(directive); } } } catch (Exception ex) { Program.Provider.Logger.Log("Error while loading directives", ex); } AnimatedThreadWorker.ReportProgress(40, "filter directives"); if (_adType != ADType.None) { List <Directive> forDeleting = _initialDirectiveArray.Where(primaryDirective => primaryDirective.ADType != _adType).ToList(); foreach (Directive directive in forDeleting) { _initialDirectiveArray.Remove(_initialDirectiveArray.GetItemById(directive.ItemId)); } } #region Калькуляция состояния директив AnimatedThreadWorker.ReportProgress(60, "calculation of directives"); foreach (Directive pd in _initialDirectiveArray) { //GlobalObjects.PerformanceCalculator.GetNextPerformance(pd); GlobalObjects.MTOPCalculator.CalculateDirectiveNew(pd); } AnimatedThreadWorker.ReportProgress(70, "filter directives"); FilterItems(_initialDirectiveArray, _resultDirectiveArray); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Сравнение с рабочими пакетами AnimatedThreadWorker.ReportProgress(90, "comparison with the Work Packages"); //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubWorkPackages == null) { _openPubWorkPackages = new CommonCollection <WorkPackage>(); } _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Opened)); _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Published)); //сбор всех записей рабочих пакетов для удобства фильтрации List <WorkPackageRecord> openWPRecords = new List <WorkPackageRecord>(); foreach (WorkPackage openWorkPackage in _openPubWorkPackages) { openWPRecords.AddRange(openWorkPackage.WorkPakageRecords); } foreach (Directive task in _resultDirectiveArray) { if (task == null || task.NextPerformances == null || task.NextPerformances.Count <= 0) { continue; } //Проход по всем след. выполнениям чека и записям в рабочих пакетах //для поиска перекрывающихся выполнений List <NextPerformance> performances = task.NextPerformances; foreach (NextPerformance np in performances) { //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным WorkPackageRecord wpr = openWPRecords.Where(r => r.PerformanceNumFromStart == np.PerformanceNum && r.WorkPackageItemType == task.SmartCoreObjectType.ItemId && r.DirectiveId == task.ItemId).FirstOrDefault(); if (wpr != null) { np.BlockedByPackage = _openPubWorkPackages.GetItemById(wpr.WorkPakageId); } } } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Загрузка Котировочных ордеров AnimatedThreadWorker.ReportProgress(95, "Load Quotations"); //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubQuotations == null) { _openPubQuotations = new CommonCollection <RequestForQuotation>(); } _openPubQuotations.Clear(); _openPubQuotations.AddRange(GlobalObjects.PurchaseCore.GetRequestForQuotation(CurrentAircraft, new[] { WorkPackageStatus.Opened, WorkPackageStatus.Published })); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Complete"); }
/// <summary> /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule, /// группирует по MaintenanceCheckType (A, B, C, D, etc), /// и проставляет связи между группами по приоритету MaintenanceCheckType /// </summary> public static MaintenanceCheckGroupCollection[] GroupingCheckByType(this ICommonCollection <MaintenanceCheck> maintenanceChecks, bool schedule, bool?grouping = null, LifelengthSubResource?resource = null) { //Фильтрация чеков по Schedule и упорядочивание по приоритету и группировка по названию типа IEnumerable <MaintenanceCheck> preFilteredChecks = maintenanceChecks.Where(c => c.Schedule == schedule); if (grouping != null) { preFilteredChecks = preFilteredChecks.Where(c => c.Grouping == grouping); } if (resource != null) { preFilteredChecks = preFilteredChecks.Where(c => c.Resource == resource); } IEnumerable <IGrouping <MaintenanceCheckType, MaintenanceCheck> > filteredBySchedule = preFilteredChecks.OrderBy(c => c.CheckType.Priority) .GroupBy(c => c.CheckType); //Формирование групп чеков по типам (A,B,C) с дополнительными критериями //1. Плановый чек/чек по хранению //2. Групповой/Одиночный //3. Основной ресурс (Часы/Циклы/Дни) List <MaintenanceCheckGroupCollection> checkGroupsCollections = new List <MaintenanceCheckGroupCollection>(); foreach (IGrouping <MaintenanceCheckType, MaintenanceCheck> checks in filteredBySchedule) { foreach (MaintenanceCheck check in checks) { //Поиск коллекции групп, в которую входят группы с нужными критериями //по плану, группировка и основному ресурсу MaintenanceCheckGroupCollection collection = checkGroupsCollections .FirstOrDefault(g => g.Schedule == check.Schedule && g.Grouping == check.Grouping && g.Resource == check.Resource); if (collection != null) { //Коллекция найдена //Поиск в ней группы чеков с нужным типом MaintenanceCheckGroupByType groupByType = collection.FirstOrDefault(g => g.CheckType == check.CheckType); if (groupByType != null) { groupByType.Checks.Add(check); } else { //Группы с нужным типом нет //Инициализация и добавление groupByType = new MaintenanceCheckGroupByType(check.Schedule) { Grouping = check.Grouping, Resource = check.Resource, CheckType = check.CheckType, }; groupByType.Checks.Add(check); collection.Add(groupByType); } } else { //Коллекции с нужными критериями нет //Созадние и добавление collection = new MaintenanceCheckGroupCollection { Schedule = check.Schedule, Grouping = check.Grouping, Resource = check.Resource, }; MaintenanceCheckGroupByType groupByType = new MaintenanceCheckGroupByType(check.Schedule) { Grouping = check.Grouping, Resource = check.Resource, CheckType = check.CheckType, }; groupByType.Checks.Add(check); collection.Add(groupByType); checkGroupsCollections.Add(collection); } } } //Упорядочивание каждой группы по ресурсам выполнения и проставление связей между ними foreach (MaintenanceCheckGroupCollection collection in checkGroupsCollections) { foreach (MaintenanceCheckGroupByType groupByType in collection) { groupByType.Sort(); MaintenanceCheckGroupByType last = collection.LastOrDefault(gbt => gbt.CheckType.Priority < groupByType.CheckType.Priority); if (last != null) { last.ParentGroup = groupByType; last.CheckCycle = groupByType.MinIntervalByResource(); } groupByType.ParentGroup = null; groupByType.CheckCycle = groupByType.MaxIntervalByResource(); } } return(checkGroupsCollections.ToArray()); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDirectiveArray.Clear(); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } try { if (_currentForecast == null) { AnimatedThreadWorker.ReportProgress(0, "load items"); if (DirectiveSource is Aircraft) { var aircraft = DirectiveSource as Aircraft; var aircraftModelId = aircraft.Model?.ItemId ?? -1; if (MpdIds.Count > 0) { _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetMpdKits(aircraft.ItemId, MpdIds).ToArray()); } else { _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetAllAircraftKits(aircraft.ItemId, aircraftModelId).ToArray()); } } else { _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetAllWorkPackageKits(((WorkPackage)DirectiveSource).ItemId).ToArray()); } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(20, "calculation of items"); IDirective[] directives = _initialDirectiveArray.Where(i => i.ParentObject is IDirective) .Select(i => i.ParentObject as IDirective) .Distinct() .ToArray(); double step = 75.0 / directives.Count(); for (int i = 0; i < directives.Length; i++) { if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(20 + (int)(step * i), "calculation of items"); GlobalObjects.PerformanceCalculator.GetNextPerformance(directives[i]); } } else { _currentForecast.Kits.Clear(); AnimatedThreadWorker.ReportProgress(0, "calc. Maint. Checks kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetMaintenanceChecksKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(9, "calc. Maint. Directives kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetMaintenanceDirectivesKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(19, "calc. Base details kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetBaseComponentsAndComponentDirectivesKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(29, "calc. Components kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetComponentsAndComponentDirectivesKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(39, "calc. AD kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.AirworthenessDirectives)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(49, "calc. Damages kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.DamagesRequiring)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(59, "calc. Deffered kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.DeferredItems)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(69, "calc. Engineering orders kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetEngineeringOrdersKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(79, "calc. Service bulletins kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetServiceBulletinsKits(_currentForecast)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(89, "calc. Out of phase kits"); _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.OutOfPhase)); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } _initialDirectiveArray.AddRange(_currentForecast.Kits.ToArray()); } } catch (Exception ex) { Program.Provider.Logger.Log("Error while loading data", ex); } AnimatedThreadWorker.ReportProgress(95, "Filter kits"); FilterItems(_initialDirectiveArray, _resultDirectiveArray); #region Загрузка Котировочных ордеров AnimatedThreadWorker.ReportProgress(95, "Load Quotations"); //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubQuotations == null) { _openPubQuotations = new CommonCollection <RequestForQuotation>(); } _openPubQuotations.Clear(); _openPubQuotations.AddRange(GlobalObjects.PurchaseCore.GetRequestForQuotation(CurrentAircraft, new[] { WorkPackageStatus.Opened, WorkPackageStatus.Published })); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "calc. kits over"); }