///<summary> ///</summary> public NonRoutineJobForm(WorkPackageRecord wpr, WorkPackage wp) : this() { _currentWorkPackage = wp; _currentWorkPackageRecord = wpr; ataChapterComboBox.UpdateInformation(); UpdateControl(); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDirectiveArray.Clear(); _resultDirectiveArray.Clear(); _preResultDirectiveArray.Clear(); var transfer = new List <TransferRecord>(); transfer.AddRange(GlobalObjects.TransferRecordCore.GetPreTransferRecordsFrom(_currentBaseComponent)); var preResult = new List <Component>(); preResult.AddRange(transfer.Select(i => i.ParentComponent).ToList()); AnimatedThreadWorker.ReportProgress(50, "filter components"); InitialFilterItems(preResult, _initialDirectiveArray); preResult.Clear(); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #region Калькуляция состояния компонентов AnimatedThreadWorker.ReportProgress(70, "calculation of components"); foreach (Component detail in _initialDirectiveArray) { GlobalObjects.PerformanceCalculator.GetNextPerformance(detail); _preResultDirectiveArray.Add(detail); foreach (ComponentDirective detailDirective in detail.ComponentDirectives) { GlobalObjects.PerformanceCalculator.GetNextPerformance(detailDirective); _preResultDirectiveArray.Add(detailDirective); } } AdditionalFilterItems(_preResultDirectiveArray, _resultDirectiveArray); 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.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); } foreach (IDirective dir in _resultDirectiveArray) { if (dir.NextPerformances == null || dir.NextPerformances.Count <= 0) { continue; } BaseEntityObject baseObject = (BaseEntityObject)dir; //Проход по всем след. выполнениям чека и записям в рабочих пакетах //для поиска перекрывающихся выполнений List <NextPerformance> performances = dir.NextPerformances; foreach (NextPerformance np in performances) { //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным WorkPackageRecord wpr = openWPRecords.FirstOrDefault(r => r.PerformanceNumFromStart == np.PerformanceNum && r.WorkPackageItemType == baseObject.SmartCoreObjectType.ItemId && r.DirectiveId == baseObject.ItemId); 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"); }
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); }
private void UpdateInformation() { if (_contextMenuStrip == null) { InitToolStripMenuItems(); } listViewCompliance.Items.Clear(); if (CheckItems == null) { return; } var lastRecords = new List <MaintenanceCheckRecord>(); var nextPerformances = new List <NextPerformance>(); //Поиск и заполнение просроченных директив и записей о перемещении //Объекты для в которые будет извлекаться информация //из записеи о перемещении string[] subs; ListViewItem newItem; var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(_currentAircraft.AircraftFrameId); //прогнозируемый ресурс var forecastData = new ForecastData(DateTime.Now, aircraftFrame.AverageUtilization, GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentAircraft)); //GlobalObjects.CasEnvironment.Calculator.GetNextPerformanceGroup(CheckItems, _currentAircraft.Schedule, forecastData); foreach (MaintenanceCheck check in CheckItems) { if (check.Grouping) { foreach (MaintenanceNextPerformance mnp in check.GetPergormanceGroupWhereCheckIsSenior()) { //Добавляются все выполнения, дата которых меньше нынешней //плюс еще одно выполнение дата которого выше нынешней nextPerformances.Add(mnp); if (mnp.PerformanceDate != null && mnp.PerformanceDate > DateTime.Now) { break; } } } else { foreach (NextPerformance mnp in check.NextPerformances) { //Добавляются все выполнения, дата которых меньше нынешней //плюс еще одно выполнение дата которого выше нынешней nextPerformances.Add(mnp); if (mnp.PerformanceDate != null && mnp.PerformanceDate > DateTime.Now) { break; } } } lastRecords.AddRange(check.PerformanceRecords.ToArray()); foreach (MaintenanceDirective mpd in check.BindMpds) { GlobalObjects.PerformanceCalculator.GetNextPerformance(mpd, forecastData); } } //////////////////////////////////////////// //загрузка рабочих пакетов для определения //перекрытых ими выполнений задач 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)); var allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>(); var openPubWorkPackages = new CommonCollection <WorkPackage>(); var closedWorkPackages = new CommonCollection <WorkPackage>(); allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(_currentAircraft, WorkPackageStatus.All, CheckItems.Select(m => (IDirective)m).ToList())); #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 record.GetPerformanceDateOrDefault() descending select record).ToList(); for (int i = 0; i < sortNextRecords.Count; i++) { //поиск записи в рабочих пакетах по данному чеку //чей номер группы выполнения (по записи) совпадает с расчитанным MaintenanceCheck check = (MaintenanceCheck)sortNextRecords[i].Parent; //if (check.Name == "5C") //{ //} //номер выполнения int parentCountPerf; if (check.LastPerformance != null) { parentCountPerf = check.LastPerformance.NumGroup <= 0 ? 1 : check.LastPerformance.NumGroup; } else { parentCountPerf = 0; } if (check.Grouping) { MaintenanceNextPerformance mnp = sortNextRecords[i] as MaintenanceNextPerformance; if (mnp != null) { parentCountPerf = mnp.PerformanceGroupNum; } else { parentCountPerf += check.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; } } else { parentCountPerf += check.NextPerformances.IndexOf(sortNextRecords[i]); parentCountPerf += 1; } WorkPackageRecord wpr = openPubWPRecords.Where(r => r.PerformanceNumFromStart == parentCountPerf && r.WorkPackageItemType == check.SmartCoreObjectType.ItemId && r.DirectiveId == check.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].Parent == check || sortNextRecords[j].Condition != ConditionState.Overdue) { break; } if (sortNextRecords[j].Parent == check) { sortNextRecords[j].BlockedByPackage = wp; listViewCompliance.Items[j].BackColor = Color.FromArgb(Highlight.GrayLight.Color); } } } string type = check.Schedule ? " (Schedule) " : " (Store) "; string resource = check.Resource.ToString(); string grouping = check.Grouping ? " (Group)" : ""; string stringNumGr = (sortNextRecords[i] is MaintenanceNextPerformance ? ((MaintenanceNextPerformance)sortNextRecords[i]).PerformanceGroupNum.ToString() : "N/A") + type + resource + grouping; subs = new[] { stringNumGr, sortNextRecords[i].Title, sortNextRecords[i].PerformanceDate != null ? UsefulMethods.NormalizeDate((DateTime)sortNextRecords[i].PerformanceDate) : "N/A", sortNextRecords[i].PerformanceSource.ToString(), "", }; newItem = new ListViewItem(subs) { Group = listViewCompliance.Groups["next"], Tag = sortNextRecords[i], BackColor = UsefulMethods.GetColor(sortNextRecords[i]) }; listViewCompliance.Items.Add(newItem); } #endregion #region Добавление в список записей о произведенных выполнениях //и сравнение их с закрытыми рабочими пакетами closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed)); //сбор всех записей рабочих пакетов для удобства фильтрации List <WorkPackageRecord> closedWPRecords = new List <WorkPackageRecord>(); foreach (WorkPackage closedWorkPackage in closedWorkPackages) { closedWPRecords.AddRange(closedWorkPackage.WorkPakageRecords); } List <MaintenanceCheckRecordGroup> maintenanceCheckRecordGroups = new List <MaintenanceCheckRecordGroup>(); foreach (MaintenanceCheckRecord record in lastRecords) { //Поиск коллекции групп, в которую входят группы с нужными критериями //по плану, группировка и основному ресурсу if (record.ParentCheck.Grouping) { MaintenanceCheckRecordGroup recordGroup = maintenanceCheckRecordGroups .FirstOrDefault(g => g.Schedule == record.ParentCheck.Schedule && g.Grouping == record.ParentCheck.Grouping && g.Resource == record.ParentCheck.Resource && g.GroupComplianceNum == record.NumGroup); if (recordGroup != null) { //Коллекция найдена //Поиск в ней группы чеков с нужным типом recordGroup.Records.Add(record); } else { //Коллекции с нужными критериями нет //Созадние и добавление recordGroup = new MaintenanceCheckRecordGroup(record.ParentCheck.Schedule, record.ParentCheck.Grouping, record.ParentCheck.Resource, record.NumGroup); recordGroup.Records.Add(record); maintenanceCheckRecordGroups.Add(recordGroup); } } else { MaintenanceCheckRecordGroup recordGroup = new MaintenanceCheckRecordGroup(record.ParentCheck.Schedule, record.ParentCheck.Grouping, record.ParentCheck.Resource); recordGroup.Records.Add(record); maintenanceCheckRecordGroups.Add(recordGroup); } } List <object> tempRecords = new List <object>(); tempRecords.AddRange(maintenanceCheckRecordGroups.ToArray()); tempRecords.AddRange(_currentAircraft.MaintenanceProgramChangeRecords.ToArray()); List <object> sortLastRecords = tempRecords.OrderByDescending(tr => (tr is MaintenanceCheckRecordGroup ? ((MaintenanceCheckRecordGroup)tr).LastGroupComplianceDate : tr is AbstractRecord ? ((AbstractRecord)tr).RecordDate : DateTimeExtend.GetCASMinDateTime())) .ToList(); foreach (object t in sortLastRecords) { if (t is MaintenanceCheckRecordGroup) { MaintenanceCheckRecordGroup mcrg = (MaintenanceCheckRecordGroup)t; MaintenanceCheckRecord directiveRecord = mcrg.Records.First(); MaintenanceCheck parentDirective = (MaintenanceCheck)directiveRecord.Parent; newItem = GetListViewItem(mcrg); WorkPackage workPackage = closedWorkPackages.Where(wp => wp.ItemId == directiveRecord.DirectivePackageId).FirstOrDefault(); if (workPackage != null) { //запись о выполнении блокируется найденым пакетом directiveRecord.DirectivePackage = workPackage; newItem.BackColor = Color.FromArgb(Highlight.Grey.Color); newItem.ToolTipText = "Perform of the task:" + parentDirective.Name + "\nadded by Work Package:" + "\n" + directiveRecord.DirectivePackage.Title + "\nTo remove a performance of task, you need to exclude task from this work package," + "\nor delete the work package "; } listViewCompliance.Items.Add(newItem); } else if (t is MaintenanceProgramChangeRecord) { MaintenanceProgramChangeRecord mpcr = (MaintenanceProgramChangeRecord)t; subs = new[] { "N/A", "Changet to " + mpcr.MSG, UsefulMethods.NormalizeDate(mpcr.RecordDate), mpcr.OnLifelength.ToString(), "", }; newItem = new ListViewItem(subs) { Group = listViewCompliance.Groups["last"], Tag = mpcr, BackColor = Color.FromArgb(Highlight.GrayLight.Color) }; listViewCompliance.Items.Add(newItem); } } #endregion if (_toolStripMenuItemsWorkPackages != null) { foreach (ToolStripMenuItem item in _toolStripMenuItemsWorkPackages.DropDownItems) { item.Click -= AddToWorkPackageItemClick; } _toolStripMenuItemsWorkPackages.DropDownItems.Clear(); foreach (WorkPackage workPackage in _openPubWorkPackages) { ToolStripMenuItem item = new ToolStripMenuItem(workPackage.Title); item.Click += AddToWorkPackageItemClick; item.Tag = workPackage; _toolStripMenuItemsWorkPackages.DropDownItems.Add(item); } } ButtonAdd.Enabled = false; }
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"); }
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); }