protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { #region Загрузка элементов AnimatedThreadWorker.ReportProgress(0, "load directives"); if (_preResult == null) { _preResult = new MaintenanceCheckCollection(); } _preResult.Clear(); _aircraftDocs.Clear(); try { _preResult.AddRange(GlobalObjects.MaintenanceCore.GetMaintenanceCheck(CurrentAircraft)); } catch (Exception ex) { Program.Provider.Logger.Log("Error while loading directives", ex); } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(20, "load directives"); List <Document> aircraftDocs = GlobalObjects.DocumentCore.GetDocuments(CurrentAircraft, DocumentType.Certificate); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Калькуляция состояния директив AnimatedThreadWorker.ReportProgress(40, "calculation of directives"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } //прогнозируемый ресурс var current = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(CurrentAircraft); var groupingChecks = _preResult.Where(c => c.Grouping); int?offsetMinutes = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Minutes)) .OrderBy(r => r) .LastOrDefault(); int?offsetCycles = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Cycles)) .OrderBy(r => r) .LastOrDefault(); int?offsetDays = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Calendar)) .OrderBy(r => r) .LastOrDefault(); var offset = new Lifelength(offsetDays, offsetCycles, offsetMinutes); var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(CurrentAircraft.AircraftFrameId); var approxDays = Convert.ToDouble(AnalystHelper.GetApproximateDays(offset, aircraftFrame.AverageUtilization)); var forecastData = new ForecastData(DateTime.Now.AddDays(approxDays), aircraftFrame.AverageUtilization, current); GlobalObjects.MaintenanceCheckCalculator.GetNextPerformanceGroup(_preResult, CurrentAircraft.Schedule, forecastData); var cs = ConditionState.NotEstimated; foreach (MaintenanceCheck check in _preResult) { if (check.Condition == ConditionState.Satisfactory && cs == ConditionState.NotEstimated) { cs = check.Condition; } if (check.Condition == ConditionState.Notify && cs != ConditionState.Notify) { cs = check.Condition; } if (check.Condition == ConditionState.Overdue) { cs = check.Condition; break; } } e.Result = cs; AnimatedThreadWorker.ReportProgress(55, "calculation of documents"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } foreach (Document aircraftDoc in aircraftDocs) { GlobalObjects.PerformanceCalculator.GetNextPerformance(aircraftDoc); if (!aircraftDoc.IsClosed && aircraftDoc.IssueValidTo && aircraftDoc.Condition != ConditionState.NotEstimated) { _aircraftDocs.Add(aircraftDoc); } } #endregion #region Фильтрация директив AnimatedThreadWorker.ReportProgress(70, "filter directives"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Сравнение с рабочими пакетами AnimatedThreadWorker.ReportProgress(90, "comparison with the Work Packages"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Complete"); }
/* * Перегружаемые методы */ #region public override void ApplyChanges() /// <summary> /// Применить к объекту сделанные изменения на контроле. /// Если не все данные удовлетворяют формату ввода (например при вводе чисел), свойства объекта не изменяются, возвращается false /// Вызов base.ApplyChanges() обязателен /// </summary> /// <returns></returns> public override void ApplyChanges() { if (MaintenanceDirective != null) { if (_maintenanceDirectiveRecord != null && checkBoxClose.Checked == false) { _maintenanceDirectiveRecord.IsDeleted = true; } if (_maintenanceDirectiveRecord != null && checkBoxClose.Checked) { _maintenanceDirectiveRecord.RecordDate = dateTimePicker1.Value; } if (!MaintenanceDirective.IsClosed && _maintenanceDirectiveRecord == null && checkBoxClose.Checked) { DirectiveRecord apr = null; if (MaintenanceDirective.PerformanceRecords.Count > 0) { //Поиск записи о выполнении задачи программы обслуживания //которая могла бы подойти под создаваемую запись //о выполнении чека программы обслуживания double?days; if (MaintenanceDirective.MaintenanceCheck != null && MaintenanceDirective.MaintenanceCheck.ParentAircraft != null) { var a = MaintenanceDirective.MaintenanceCheck.ParentAircraft; var partInterval = MaintenanceDirective.MaintenanceCheck.Interval * 0.2; var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(a.AircraftFrameId); var averageUtilization = GlobalObjects.AverageUtilizationCore.GetAverageUtillization(aircraftFrame); days = AnalystHelper.GetApproximateDays(partInterval, averageUtilization); } else { var partInterval = MaintenanceDirective.RepeatInterval * 0.2; days = AnalystHelper.GetApproximateDays(partInterval, MaintenanceDirective.ParentBaseComponent.AverageUtilization); } IEnumerable <DirectiveRecord> aprs = null; if (days != null && days > 0) { double daysValue = Convert.ToDouble(days); //Производится поиск записей о выполнении дата выполнения которых лежит //в заданном диапозоне aprs = MaintenanceDirective.PerformanceRecords.Where( pr => pr.RecordDate >= dateTimePicker1.Value.AddDays(-daysValue) && pr.RecordDate <= dateTimePicker1.Value.AddDays(daysValue)); } if (aprs != null && aprs.Count() > 0) { if (aprs.Count() == 1) { apr = aprs.First(); } else { DirectiveRecord min = null; double minDays = int.MaxValue; foreach (DirectiveRecord record in aprs) { if (min == null) { min = record; minDays = Math.Abs((min.RecordDate - dateTimePicker1.Value).TotalDays); continue; } double candidateMin = Math.Abs((record.RecordDate - dateTimePicker1.Value).TotalDays); if (candidateMin < minDays) { min = record; minDays = candidateMin; } } apr = min; } } } if (apr != null) { _maintenanceDirectiveRecord = apr; } else { NextPerformance performance = MaintenanceDirective.NextPerformances.FirstOrDefault(p => p.PerformanceDate != null && p.PerformanceDate.Value.Date == dateTimePicker1.Value) ?? MaintenanceDirective.NextPerformances.LastOrDefault(p => p.PerformanceDate != null && p.PerformanceDate < dateTimePicker1.Value) ?? MaintenanceDirective.NextPerformances.FirstOrDefault(p => p.PerformanceDate != null && p.PerformanceDate > dateTimePicker1.Value); _maintenanceDirectiveRecord = new DirectiveRecord { PerformanceNum = performance != null ? performance.PerformanceNum : 0, Parent = MaintenanceDirective, ParentId = MaintenanceDirective.ItemId, RecordDate = dateTimePicker1.Value }; } } } base.ApplyChanges(); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { #region Загрузка элементов AnimatedThreadWorker.ReportProgress(0, "load directives"); if (_preResult == null) { _preResult = new MaintenanceCheckCollection(); } _preResult.Clear(); try { _preResult.AddRange(GlobalObjects.MaintenanceCore.GetMaintenanceCheck(CurrentAircraft)); } catch (Exception ex) { Program.Provider.Logger.Log("Error while loading directives", ex); } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(20, "load directives"); if (_maintenanceDirectives != null) { _maintenanceDirectives.Clear(); } try { _maintenanceDirectives = GlobalObjects.MaintenanceCore.GetMaintenanceDirectives(CurrentAircraft); var bindedItems = GlobalObjects.BindedItemsCore.GetBindedItemsFor(CurrentAircraft.ItemId, _maintenanceDirectives.Where(m => m.WorkItemsRelationType == WorkItemsRelationType.CalculationDepend).Cast <IBindedItem>()); foreach (var mpd in _maintenanceDirectives) { GlobalObjects.PerformanceCalculator.GetNextPerformance(mpd); if (bindedItems.ContainsKey(mpd)) { var directives = bindedItems[mpd]; foreach (var componentDirective in directives) { if (componentDirective is ComponentDirective) { GlobalObjects.PerformanceCalculator.GetNextPerformance(componentDirective); var firstNextPerformance = bindedItems[mpd].SelectMany(t => t.NextPerformances).OrderBy(n => n.NextPerformanceDate).FirstOrDefault(); if (firstNextPerformance == null) { continue; } mpd.BindedItemNextPerformance = firstNextPerformance; mpd.BindedItemNextPerformanceSource = firstNextPerformance.NextPerformanceSource ?? Lifelength.Null; mpd.BindedItemRemains = firstNextPerformance.Remains ?? Lifelength.Null; mpd.BindedItemNextPerformanceDate = firstNextPerformance.NextPerformanceDate; mpd.BindedItemCondition = firstNextPerformance.Condition ?? ConditionState.NotEstimated; } } } } } catch (Exception ex) { Program.Provider.Logger.Log("Error while loading directives", ex); } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Калькуляция состояния директив AnimatedThreadWorker.ReportProgress(40, "calculation of directives"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } //прогнозируемый ресурс var current = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(CurrentAircraft); var groupingChecks = _preResult.Where(c => c.Grouping); int?offsetMinutes = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Minutes)) .OrderBy(r => r) .LastOrDefault(); int?offsetCycles = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Cycles)) .OrderBy(r => r) .LastOrDefault(); int?offsetDays = groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Calendar)) .OrderBy(r => r) .LastOrDefault(); var offset = new Lifelength(offsetDays, offsetCycles, offsetMinutes); var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(CurrentAircraft.AircraftFrameId); var approxDays = Convert.ToDouble(AnalystHelper.GetApproximateDays(offset, aircraftFrame.AverageUtilization)); var forecastData = new ForecastData(DateTime.Now.AddDays(approxDays), aircraftFrame.AverageUtilization, current); GlobalObjects.MaintenanceCheckCalculator.GetNextPerformanceGroup(_preResult, CurrentAircraft.Schedule, forecastData); var cs = ConditionState.NotEstimated; foreach (MaintenanceCheck check in _preResult) { if (check.Condition == ConditionState.Satisfactory && cs == ConditionState.NotEstimated) { cs = check.Condition; } if (check.Condition == ConditionState.Notify && cs != ConditionState.Notify) { cs = check.Condition; } if (check.Condition == ConditionState.Overdue) { cs = check.Condition; break; } } e.Result = cs; #endregion #region Фильтрация директив AnimatedThreadWorker.ReportProgress(70, "filter directives"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Сравнение с рабочими пакетами AnimatedThreadWorker.ReportProgress(90, "comparison with the Work Packages"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Complete"); }