private void AnimatedThreadWorkerDoLoad(object sender, DoWorkEventArgs e) { _initialTrackArray.Clear(); try { _initialTrackArray.AddRange(GlobalObjects.FlightTrackCore.GetAllFlightTracks(true)); _initialTrackRecordArray.AddRange(_initialTrackArray.SelectMany(t => t.FlightTripRecord)); } catch (Exception exception) { Program.Provider.Logger.Log("Error while load records", exception); } }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { #region Загрузка элементов _initialTrackArray.Clear(); _initialTrackRecordArray.Clear(); AnimatedThreadWorker.ReportProgress(0, "load records"); try { _initialTrackArray.AddRange(GlobalObjects.FlightTrackCore.GetAllFlightTracks(true)); _initialTrackRecordArray.AddRange(_initialTrackArray.SelectMany(i => i.FlightTripRecord)); } catch (Exception exception) { Program.Provider.Logger.Log("Error while load records", exception); } AnimatedThreadWorker.ReportProgress(40, "Calculate records"); #region Фильтрация директив AnimatedThreadWorker.ReportProgress(70, "filter records"); FilterItems(_initialTrackRecordArray, _resultTrackRecordArray); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Complete"); #endregion }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { var initialZeroMaintenanceDirectives = new CommonCollection <MaintenanceDirective>(); var initialMaintenanceDirectives = new CommonCollection <MaintenanceDirective>(); _result.Clear(); _initial.Clear(); _groupLifelengths.Clear(); _groupLifelengthsForZeroCheck.Clear(); if (!_isFirstLoad) { AnimatedThreadWorker.ReportProgress(0, "load checks"); var checks = GlobalObjects.CasEnvironment.NewLoader.GetObjectListAll <MTOPCheckDTO, MTOPCheck>(new Filter("ParentAircraftId", CurrentAircraft.ItemId), true).ToList(); foreach (var check in checks) { foreach (var record in check.PerformanceRecords) { record.Parent = check; } } if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(10, "load MPDs"); initialMaintenanceDirectives.AddRange(GlobalObjects.MaintenanceCore.GetMaintenanceDirectives(CurrentAircraft)); var bindedItemsDict = GlobalObjects.BindedItemsCore.GetBindedItemsFor(CurrentAircraft.ItemId, initialMaintenanceDirectives.Where(m => m.WorkItemsRelationType == WorkItemsRelationType.CalculationDepend)); CalculateMaintenanceDirectives(initialMaintenanceDirectives.ToList(), bindedItemsDict); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } AnimatedThreadWorker.ReportProgress(50, "calculation"); if (checks.Count > 0) { //Берем утилизацию с Frame var frame = GlobalObjects.CasEnvironment.BaseComponents.FirstOrDefault(i => i.ParentAircraftId == CurrentAircraft.ItemId && Equals(i.BaseComponentType, BaseComponentType.Frame)); var avg = _currentForecast.ForecastDatas[0].AverageUtilization; var lastCompliance = checks.SelectMany(i => i.PerformanceRecords).OrderByDescending(i => i.RecordDate) .FirstOrDefault(); GlobalObjects.MTOPCalculator.CalculateMtopChecks(checks, avg); _groupLifelengths = GlobalObjects.MTOPCalculator.CalculateGroupNew(checks.Where(i => !i.Thresh.IsNullOrZero() && !i.IsZeroPhase).ToList()); GlobalObjects.MTOPCalculator.CalculateNextPerformance(checks.Where(i => !i.IsZeroPhase).ToList(), frame.StartDate, _groupLifelengths, CurrentAircraft, avg, lastCompliance); GlobalObjects.MTOPCalculator.CalculatePhaseWithPerformance(initialMaintenanceDirectives, checks.Where(i => !i.Thresh.IsNullOrZero() && !i.IsZeroPhase).ToList(), avg, _currentForecast.ForecastDatas[0].LowerLimit, _currentForecast.ForecastDatas[0].ForecastDate); var maintenanceZeroChecks = checks.Where(i => i.IsZeroPhase).ToList(); var lowerZeroCheck = maintenanceZeroChecks.Where(i => !i.Thresh.IsNullOrZero()).OrderBy(i => i.Thresh) .FirstOrDefault(); if (lowerZeroCheck != null) { GlobalObjects.MTOPCalculator.CalculateMtopChecks(maintenanceZeroChecks, avg); _groupLifelengthsForZeroCheck = GlobalObjects.MTOPCalculator.CalculateGroupNew(checks.Where(i => !i.Thresh.IsNullOrZero() && i.IsZeroPhase).ToList()); GlobalObjects.MTOPCalculator.CalculateNextPerformance(maintenanceZeroChecks, frame.StartDate, _groupLifelengthsForZeroCheck, CurrentAircraft, avg, lastCompliance); initialZeroMaintenanceDirectives.AddRange(initialMaintenanceDirectives .Where(i => i.MTOPPhase?.FirstPhase == 0).ToArray()); GlobalObjects.MTOPCalculator.CalculatePhaseWithPerformance(initialZeroMaintenanceDirectives, maintenanceZeroChecks, avg, _currentForecast.ForecastDatas[0].LowerLimit, _currentForecast.ForecastDatas[0].ForecastDate, true); } foreach (var d in initialZeroMaintenanceDirectives) { initialMaintenanceDirectives.Remove(d); } _initial.AddRange(initialMaintenanceDirectives.SelectMany(i => i.MtopNextPerformances)); _initial.AddRange(initialZeroMaintenanceDirectives.SelectMany(i => i.MtopNextPerformances)); } #region Фильтрация директив AnimatedThreadWorker.ReportProgress(75, "filter directives"); FilterItems(_initial, _result); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion #region Load WP AnimatedThreadWorker.ReportProgress(75, "filter Work Packages"); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } if (_openPubWorkPackages == null) { _openPubWorkPackages = new CommonCollection <WorkPackage>(); } _openPubWorkPackages.Clear(); _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); } #endregion #region Загрузка Котировочных ордеров AnimatedThreadWorker.ReportProgress(95, "Load Quotations"); //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubQuotations == null) { _openPubQuotations = new CommonCollection <RequestForQuotation>(); } BaseEntityObject parent = CurrentAircraft ?? (BaseEntityObject)CurrentOperator; _openPubQuotations.Clear(); _openPubQuotations.AddRange(GlobalObjects.PurchaseCore.GetRequestForQuotation(parent, new[] { WorkPackageStatus.Opened, WorkPackageStatus.Published })); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Completed"); } }
protected override void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) { backgroundWorker.ReportProgress(50); try { Invoke(new Action(() => listViewCompliance.Items.Clear())); } catch (Exception) { } if (_currentComponent == null) { e.Cancel = true; return; } var parentAircraft = GlobalObjects.AircraftsCore.GetParentAircraft(_currentComponent); var lastRecords = new List <AbstractRecord>(); var nextPerformances = new List <NextPerformance>(); var allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); var openPubWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); var closedWorkPackages = new CommonCollection <WorkPackage>(); var taskThatIncludeInWorkPackage = new List <IDirective>(); lastRecords.AddRange(_currentComponent.TransferRecords.ToArray()); lastRecords.AddRange(_currentComponent.ChangeLLPCategoryRecords.ToArray()); lastRecords.AddRange(_currentComponent.ActualStateRecords.ToArray()); //Объекты для в котороые будет извлекаться информация //из записеи о перемещении var lastDestination = ""; //прогнозируемый ресурс //если известна родительская деталь данной директивы, //то ее текущая наработка и средняя утилизация //используются в качестве ресурсов прогноза //для расчета всех просроченных выполнений var forecastData = new ForecastData(DateTime.Now, GlobalObjects.AverageUtilizationCore.GetAverageUtillization(_currentComponent), GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentComponent)); foreach (var directive in _currentComponent.ComponentDirectives) { if (directive.IsAffect().GetValueOrDefault(true)) { //расчет след. выполнений директивы. //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения //если неизвестне, то только первое //GlobalObjects.PerformanceCalculator.GetNextPerformance(directive, forecastData); nextPerformances.AddRange(directive.NextPerformances); lastRecords.AddRange(directive.PerformanceRecords.ToArray()); if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } taskThatIncludeInWorkPackage.Add(directive); } else { var bindedItems = GlobalObjects.BindedItemsCore.GetBindedItemsFor(parentAircraft.ItemId, directive); foreach (var bindedItem in bindedItems) { if (bindedItem is MaintenanceDirective) { var mpd = (MaintenanceDirective)bindedItem; //прогнозируемый ресурс //если известна родительская деталь данной директивы, //то ее текущая наработка и средняя утилизация //используются в качестве ресурсов прогноза //для расчета всех просроченных выполнений //расчет след. выполнений директивы. //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения //если неизвестне, то только первое GlobalObjects.PerformanceCalculator.GetNextPerformance(mpd, forecastData); nextPerformances.AddRange(mpd.NextPerformances); lastRecords.AddRange(mpd.PerformanceRecords.ToArray()); taskThatIncludeInWorkPackage.Add(mpd); } } } } //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubWorkPackages == null) { _openPubWorkPackages = new CommonCollection <WorkPackage>(); } _openPubWorkPackages.Clear(); //загрузка рабочих пакетов для определения _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened)); _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published)); allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.All, taskThatIncludeInWorkPackage)); #region Добавление в список просроченных выполнений //и сравнение их с открытыми и опубликованными рабочими пакетами openPubWorkPackagesIncludedTask.AddRange( allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened || wp.Status == WorkPackageStatus.Published)); //сбор всех записей рабочих пакетов для удобства фильтрации var openPubWpRecords = openPubWorkPackagesIncludedTask.SelectMany(wp => wp.WorkPakageRecords).ToList(); //LINQ запрос для сортировки записей по дате var sortNextRecords = (from record in nextPerformances orderby GetDate(record) descending select record).ToList(); for (int i = 0; i < sortNextRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным var parentDirective = sortNextRecords[i].Parent; //номер выполнения int parentCountPerf; if (parentDirective.LastPerformance != null) { parentCountPerf = parentDirective.LastPerformance.PerformanceNum <= 0 ? 1 : parentDirective.LastPerformance.PerformanceNum; } else { parentCountPerf = 0; } parentCountPerf += parentDirective.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; var wpr = openPubWpRecords.FirstOrDefault(r => r.PerformanceNumFromStart == parentCountPerf && r.WorkPackageItemType == parentDirective.SmartCoreObjectType.ItemId && r.DirectiveId == parentDirective.ItemId); if (wpr != null) { var wp = openPubWorkPackagesIncludedTask.GetItemById(wpr.WorkPakageId); //запись о выполнении блокируется найденым пакетом sortNextRecords[i].BlockedByPackage = wp; //последующие записи о выполнении так же должны быть заблокированы for (int j = i - 1; j >= 0; j--) { //блокировать нужно все рабочие записи, или до первой записи, //заблокированной другим рабочим пакетом if (sortNextRecords[j].BlockedByPackage != null || sortNextRecords[j].Condition != ConditionState.Overdue) { break; } if (sortNextRecords[j].Parent == parentDirective) { sortNextRecords[j].BlockedByPackage = wp; Invoke(new Action <int, Color>(SetItemColor), j, Color.FromArgb(Highlight.GrayLight.Color)); } } } Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]); } #endregion #region Добавление в список записей о произведенных выполнениях //и сравнение их с закрытыми рабочими пакетами closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed)); //LINQ запрос для сортировки записей по дате var sortLastRecords = (from record in lastRecords orderby record.RecordDate ascending select record).ToList(); var items = new List <KeyValuePair <AbstractRecord, string[]> >(); for (int i = 0; i < sortLastRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } string[] subs; if (sortLastRecords[i] is DirectiveRecord) { var directiveRecord = (DirectiveRecord)sortLastRecords[i]; subs = new[] { directiveRecord.WorkType, UsefulMethods.NormalizeDate(directiveRecord.RecordDate), directiveRecord.OnLifelength != null ? directiveRecord.OnLifelength.ToString() : "", "", "", directiveRecord.Remarks }; } else if (sortLastRecords[i] is TransferRecord) { TransferRecord transferRecord = (TransferRecord)sortLastRecords[i]; string currentDestination, destinationObject; DestinationHelper.GetDestination(transferRecord, out currentDestination, out destinationObject); subs = new[] { lastDestination != "" ? "Transfered " + destinationObject + " from " + lastDestination + " to " + currentDestination : "Transfered " + destinationObject + " to " + currentDestination, UsefulMethods.NormalizeDate(transferRecord.TransferDate), transferRecord.OnLifelength.ToString(), "", "", transferRecord.Remarks, }; lastDestination = currentDestination; } else if (sortLastRecords[i] is ComponentLLPCategoryChangeRecord) { ComponentLLPCategoryChangeRecord llpRecord = (ComponentLLPCategoryChangeRecord)sortLastRecords[i]; LLPLifeLimitCategory toCategory = llpRecord.ToCategory; subs = new[] { "Changed to " + toCategory, UsefulMethods.NormalizeDate(llpRecord.RecordDate), llpRecord.OnLifelength.ToString(), "", "", llpRecord.Remarks, }; } else if (sortLastRecords[i] is ActualStateRecord) { ActualStateRecord actualStateRecord = (ActualStateRecord)sortLastRecords[i]; subs = new[] { "Actual state:", UsefulMethods.NormalizeDate(actualStateRecord.RecordDate.Date), actualStateRecord.OnLifelength != null ? actualStateRecord.OnLifelength.ToString() : "", "", "", actualStateRecord.Remarks, }; } else { subs = new[] { "Unknown record ", UsefulMethods.NormalizeDate(sortLastRecords[i].RecordDate), sortLastRecords[i].OnLifelength.ToString(), "", "", sortLastRecords[i].Remarks, }; } items.Add(new KeyValuePair <AbstractRecord, string[]>(sortLastRecords[i], subs)); } #endregion for (int i = items.Count - 1; i >= 0; i--) { WorkPackage workPackage = null; if (items[i].Key is AbstractPerformanceRecord) { var apr = items[i].Key as AbstractPerformanceRecord; workPackage = closedWorkPackages.FirstOrDefault(wp => wp.ItemId == apr.DirectivePackageId); } Invoke(new Action <AbstractRecord, string[], WorkPackage>(AddListViewItem), items[i].Key, items[i].Value, workPackage); } allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); backgroundWorker.ReportProgress(100); }
protected override void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) { //TODO:(Evgenii Babak) много повторяющегося кода, требуется оптимизация backgroundWorker.ReportProgress(50); Invoke(new Action(() => listViewCompliance.Items.Clear())); if (_currentDirective == null) { e.Cancel = true; return; } var lastRecords = new List <AbstractPerformanceRecord>(); var nextPerformances = new List <NextPerformance>(); if (_openPubWorkPackages == null) { _openPubWorkPackages = new CommonCollection <WorkPackage>(); } _openPubWorkPackages.Clear(); var parentAircraft = GlobalObjects.AircraftsCore.GetAircraftById(_currentDirective.ParentBaseComponent.ParentAircraftId); //TODO:(Evgenii Babak) пересмотреть использование ParentAircrafId здесь _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened)); _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published)); var allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); var openPubWorkPackages = new CommonCollection <WorkPackage>(); var closedWorkPackages = new CommonCollection <WorkPackage>(); if (_currentDirective.IsAffect().GetValueOrDefault(true)) { //Поиск и заполнение просроченных директив и записей о перемещении //Объекты для в которые будет извлекаться информация //из записеи о перемещении //прогнозируемый ресурс var forecastData = new ForecastData(DateTime.Now, _currentDirective.ParentBaseComponent.AverageUtilization, GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentDirective.ParentBaseComponent)); //расчет след. выполнений директивы. //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения //если неизвестне, то только первое //GlobalObjects.PerformanceCalculator.GetNextPerformance(_currentDirective, forecastData); nextPerformances.AddRange(_currentDirective.NextPerformances); lastRecords.AddRange(_currentDirective.PerformanceRecords.ToArray()); //////////////////////////////////////////// //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackages(parentAircraft, WorkPackageStatus.Opened, true)); _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackages(parentAircraft, WorkPackageStatus.Published, true)); allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.All, new IDirective[] { _currentDirective })); #region Добавление в список просроченных выполнений //и сравнение их с открытыми и опубликованными рабочими пакетами openPubWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened || wp.Status == WorkPackageStatus.Published)); //сбор всех записей рабочих пакетов для удобства фильтрации List <WorkPackageRecord> openPubWpRecords = openPubWorkPackages.SelectMany(wp => wp.WorkPakageRecords).ToList(); //LINQ запрос для сортировки записей по дате List <NextPerformance> sortNextRecords = (from record in nextPerformances orderby GetDate(record) descending select record).ToList(); for (int i = 0; i < sortNextRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackages.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным MaintenanceDirective directive = (MaintenanceDirective)sortNextRecords[i].Parent; //номер выполнения int parentCountPerf; if (directive.LastPerformance != null) { parentCountPerf = directive.LastPerformance.PerformanceNum <= 0 ? 1 : directive.LastPerformance.PerformanceNum; } else { parentCountPerf = 0; } parentCountPerf += directive.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; WorkPackageRecord wpr = openPubWpRecords.FirstOrDefault(r => r.PerformanceNumFromStart == parentCountPerf && r.WorkPackageItemType == directive.SmartCoreObjectType.ItemId && r.DirectiveId == directive.ItemId); if (wpr != null) { WorkPackage wp = openPubWorkPackages.GetItemById(wpr.WorkPakageId); //запись о выполнении блокируется найденым пакетом sortNextRecords[i].BlockedByPackage = wp; //последующие записи о выполнении так же должны быть заблокированы for (int j = i - 1; j >= 0; j--) { //блокировать нужно все рабочие записи, или до первой записи, //заблокированной другим рабочим пакетом if (sortNextRecords[j].BlockedByPackage != null || sortNextRecords[j].Condition != ConditionState.Overdue) { break; } if (sortNextRecords[j].Parent == directive) { sortNextRecords[j].BlockedByPackage = wp; Invoke(new Action <int, Color>(SetItemColor), new object[] { j, Color.FromArgb(Highlight.GrayLight.Color) }); } } } Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]); } #endregion #region Добавление в список записей о произведенных выполнениях //и сравнение их с закрытыми рабочими пакетами closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed)); //LINQ запрос для сортировки записей по дате List <AbstractPerformanceRecord> sortLastRecords = (from record in lastRecords orderby record.RecordDate descending select record).ToList(); //////////////////////////////////////////// for (int i = 0; i < sortLastRecords.Count(); i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackages.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } DirectiveRecord directiveRecord = (DirectiveRecord)sortLastRecords[i]; WorkPackage workPackage = closedWorkPackages.Where(wp => wp.ItemId == directiveRecord.DirectivePackageId).FirstOrDefault(); if (workPackage != null) { Invoke(new Action <AbstractPerformanceRecord, WorkPackage, MaintenanceCheckRecord>(AddListViewItem), new object[] { sortLastRecords[i], workPackage, null }); } else if (directiveRecord.MaintenanceCheckRecordId > 0) { var mcr = GlobalObjects.CasEnvironment.NewLoader.GetObject <DirectiveRecordDTO, MaintenanceCheckRecord>(new Filter("ItemId", directiveRecord.MaintenanceCheckRecordId)); if (mcr != null) { mcr.ParentCheck = GlobalObjects.CasEnvironment.NewLoader.GetObjectById <MaintenanceCheckDTO, MaintenanceCheck>(mcr.ParentId); } Invoke(new Action <AbstractPerformanceRecord, WorkPackage, MaintenanceCheckRecord>(AddListViewItem), new object[] { sortLastRecords[i], workPackage, mcr }); } else { Invoke(new Action <AbstractPerformanceRecord, WorkPackage>(AddListViewItem), new object[] { sortLastRecords[i], workPackage }); } } #endregion } else { //Поиск и заполнение просроченных директив и записей о перемещении //Объекты для в которые будет извлекаться информация //из записеи о перемещении //прогнозируемый ресурс foreach (var directive in _bindedItems) { if (directive is ComponentDirective) { var componentDirective = (ComponentDirective)directive; var detail = componentDirective.ParentComponent ?? _currentDirective.ParentBaseComponent; //прогнозируемый ресурс //если известна родительская деталь данной директивы, //то ее текущая наработка и средняя утилизация //используются в качестве ресурсов прогноза //для расчета всех просроченных выполнений var forecastData = new ForecastData(DateTime.Now, GlobalObjects.AverageUtilizationCore.GetAverageUtillization(detail), GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(detail)); //расчет след. выполнений директивы. //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения //если неизвестне, то только первое GlobalObjects.PerformanceCalculator.GetNextPerformance(componentDirective, forecastData); nextPerformances.AddRange(componentDirective.NextPerformances); lastRecords.AddRange(componentDirective.PerformanceRecords.ToArray()); } } var directiveRecords = _bindedItems.SelectMany(dd => dd.PerformanceRecords.Cast <DirectiveRecord>()); lastRecords.AddRange(_currentDirective.PerformanceRecords .Where(performanceRecord => directiveRecords.Count(d => d.MaintenanceDirectiveRecordId == performanceRecord.ItemId) == 0) .Cast <AbstractPerformanceRecord>()); //////////////////////////////////////////// //загрузка рабочих пакетов для определения _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened)); _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published)); allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.All, _bindedItems)); #region Добавление в список просроченных выполнений //и сравнение их с открытыми и опубликованными рабочими пакетами openPubWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened || wp.Status == WorkPackageStatus.Published)); //сбор всех записей рабочих пакетов для удобства фильтрации List <WorkPackageRecord> openPubWpRecords = new List <WorkPackageRecord>(); foreach (WorkPackage openWorkPackage in openPubWorkPackages) { openPubWpRecords.AddRange(openWorkPackage.WorkPakageRecords); } //LINQ запрос для сортировки записей по дате List <NextPerformance> sortNextRecords = (from record in nextPerformances orderby GetDate(record) descending select record).ToList(); for (int i = 0; i < sortNextRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackages.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным ComponentDirective directive = (ComponentDirective)sortNextRecords[i].Parent; //номер выполнения int parentCountPerf; if (directive.LastPerformance != null) { parentCountPerf = directive.LastPerformance.PerformanceNum <= 0 ? 1 : directive.LastPerformance.PerformanceNum; } else { parentCountPerf = 0; } parentCountPerf += directive.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; WorkPackageRecord wpr = openPubWpRecords.Where(r => r.PerformanceNumFromStart == parentCountPerf && r.WorkPackageItemType == directive.SmartCoreObjectType.ItemId && r.DirectiveId == directive.ItemId).FirstOrDefault(); if (wpr != null) { WorkPackage wp = openPubWorkPackages.GetItemById(wpr.WorkPakageId); //запись о выполнении блокируется найденым пакетом sortNextRecords[i].BlockedByPackage = wp; //последующие записи о выполнении так же должны быть заблокированы for (int j = i - 1; j >= 0; j--) { //блокировать нужно все рабочие записи, или до первой записи, //заблокированной другим рабочим пакетом if (sortNextRecords[j].BlockedByPackage != null || sortNextRecords[j].Condition != ConditionState.Overdue) { break; } if (sortNextRecords[j].Parent == directive) { sortNextRecords[j].BlockedByPackage = wp; Invoke(new Action <int, Color>(SetItemColor), new object[] { j, Color.FromArgb(Highlight.GrayLight.Color) }); } } } Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]); } #endregion #region Добавление в список записей о произведенных выполнениях //и сравнение их с закрытыми рабочими пакетами closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed)); //LINQ запрос для сортировки записей по дате List <AbstractPerformanceRecord> sortLastRecords = (from record in lastRecords orderby record.RecordDate descending select record).ToList(); //////////////////////////////////////////// for (int i = 0; i < sortLastRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackages.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } WorkPackage workPackage = closedWorkPackages.FirstOrDefault(wp => wp.ItemId == sortLastRecords[i].DirectivePackageId); Invoke(new Action <AbstractPerformanceRecord, WorkPackage>(AddListViewItem), new object[] { sortLastRecords[i], workPackage }); } #endregion } allWorkPackagesIncludedTask.Clear(); openPubWorkPackages.Clear(); closedWorkPackages.Clear(); backgroundWorker.ReportProgress(100); }
protected override void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e) { backgroundWorker.ReportProgress(50); Invoke(new Action(() => listViewCompliance.Items.Clear())); if (_currentDirective == null) { e.Cancel = true; return; } List <AbstractRecord> lastRecords = new List <AbstractRecord>(); List <NextPerformance> nextPerformances = new List <NextPerformance>(); //прогнозируемый ресурс //если известна родительская деталь данной директивы, //то ее текущая наработка и средняя утилизация //используются в качестве ресурсов прогноза //для расчета всех просроченных выполнений ForecastData forecastData = null; Aircraft parentAircraft = null; if (_currentDirective.ParentBaseComponent != null) { //если известна родительская деталь данной директивы, //то ее текущая наработка и средняя утилизация //используются в качестве ресурсов прогноза //для расчета всех просроченных выполнений forecastData = new ForecastData(DateTime.Now, _currentDirective.ParentBaseComponent.AverageUtilization, GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentDirective.ParentBaseComponent)); parentAircraft = GlobalObjects.AircraftsCore.GetAircraftById(_currentDirective.ParentBaseComponent.ParentAircraftId);//TODO:(Evgenii Babak) пересмотреть использование ParentAircrafId здесь } //расчет след. выполнений директивы. //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения //если неизвестне, то только первое //GlobalObjects.PerformanceCalculator.GetNextPerformance(_currentDirective, forecastData); nextPerformances.AddRange(_currentDirective.NextPerformances); lastRecords.AddRange(_currentDirective.PerformanceRecords.ToArray()); //////////////////////////////////////////// //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач if (_openPubWorkPackages == null) { _openPubWorkPackages = new CommonCollection <WorkPackage>(); } _openPubWorkPackages.Clear(); if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened)); if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published)); CommonCollection <WorkPackage> allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); CommonCollection <WorkPackage> openPubWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); CommonCollection <WorkPackage> closedWorkPackages = new CommonCollection <WorkPackage>(); if (backgroundWorker.CancellationPending) { e.Cancel = true; return; } allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.All, new IDirective[] { _currentDirective })); #region Добавление в список просроченных выполнений //и сравнение их с открытыми и опубликованными рабочими пакетами openPubWorkPackagesIncludedTask.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened || wp.Status == WorkPackageStatus.Published)); //сбор всех записей рабочих пакетов для удобства фильтрации List <WorkPackageRecord> openPubWpRecords = openPubWorkPackagesIncludedTask.SelectMany(wp => wp.WorkPakageRecords).ToList(); //LINQ запрос для сортировки записей по дате List <NextPerformance> sortNextRecords = (from record in nextPerformances orderby GetDate(record) descending select record).ToList(); for (int i = 0; i < sortNextRecords.Count; i++) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным Directive directive = (Directive)sortNextRecords[i].Parent; //номер выполнения int parentCountPerf; if (directive.LastPerformance != null) { parentCountPerf = directive.LastPerformance.PerformanceNum <= 0 ? 1 : directive.LastPerformance.PerformanceNum; } else { parentCountPerf = 0; } parentCountPerf += directive.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; WorkPackageRecord wpr = openPubWpRecords.Where(r => r.PerformanceNumFromStart == parentCountPerf && r.WorkPackageItemType == directive.SmartCoreObjectType.ItemId && r.DirectiveId == directive.ItemId).FirstOrDefault(); if (wpr != null) { WorkPackage wp = openPubWorkPackagesIncludedTask.GetItemById(wpr.WorkPakageId); //запись о выполнении блокируется найденым пакетом sortNextRecords[i].BlockedByPackage = wp; //последующие записи о выполнении так же должны быть заблокированы for (int j = i - 1; j >= 0; j--) { //блокировать нужно все рабочие записи, или до первой записи, //заблокированной другим рабочим пакетом if (sortNextRecords[j].BlockedByPackage != null || sortNextRecords[j].Condition != ConditionState.Overdue) { break; } if (sortNextRecords[j].Parent == directive) { sortNextRecords[j].BlockedByPackage = wp; Invoke(new Action <int, Color>(SetItemColor), new object[] { j, Color.FromArgb(Highlight.GrayLight.Color) }); } } } Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]); } #endregion #region Добавление в список записей о произведенных выполнениях //и сравнение их с закрытыми рабочими пакетами closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed)); //LINQ запрос для сортировки записей по дате List <AbstractRecord> sortLastRecords = (from record in lastRecords orderby record.RecordDate descending select record).ToList(); //////////////////////////////////////////// foreach (AbstractRecord t in sortLastRecords) { if (backgroundWorker.CancellationPending) { allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); e.Cancel = true; return; } DirectiveRecord directiveRecord = (DirectiveRecord)t; WorkPackage workPackage = closedWorkPackages.Where(wp => wp.ItemId == directiveRecord.DirectivePackageId).FirstOrDefault(); Invoke(new Action <AbstractPerformanceRecord, WorkPackage>(AddListViewItem), new object[] { t, workPackage }); } #endregion allWorkPackagesIncludedTask.Clear(); openPubWorkPackagesIncludedTask.Clear(); closedWorkPackages.Clear(); backgroundWorker.ReportProgress(100); }