private void AnimatedThreadWorkerDoLoad(object sender, DoWorkEventArgs e) { if (_maintenanceCheck == null || _currentAircraft == null) { e.Cancel = true; return; } if (_records == null) { _records = new CommonCollection <MaintenanceCheckBindTaskRecord>(); } _records.Clear(); if (_recordsTasks == null) { _recordsTasks = new CommonCollection <BaseEntityObject>(); } _recordsTasks.Clear(); if (_mpdForSelect == null) { _mpdForSelect = new CommonCollection <MaintenanceDirective>(); } _mpdForSelect.Clear(); _animatedThreadWorker.ReportProgress(0, "load binded tasks"); var preResult = new List <MaintenanceCheckBindTaskRecord>(); try { preResult.AddRange(GlobalObjects.WorkPackageCore.GetMaintenanceBingTasksRecords(_workPackage.ItemId)); _records.AddRange(preResult.Where(r => r.CheckId == _maintenanceCheck.ItemId)); _recordsTasks.AddRange(_records.Where(r => r.Task != null && r.Task is BaseEntityObject).Select(r => r.Task as BaseEntityObject)); if (_maintenanceCheck.Grouping) { MaintenanceNextPerformance mnp = _maintenanceCheck.GetNextPergormanceGroupWhereCheckIsSenior(); if (mnp != null && mnp.PerformanceGroup != null && mnp.PerformanceGroup.Checks.Count > 0) { _recordsTasks.AddRange(mnp.PerformanceGroup.Checks.SelectMany(mc => mc.BindMpds).ToArray()); } else { _recordsTasks.AddRange(_maintenanceCheck.BindMpds.ToArray()); } } else { _recordsTasks.AddRange(_maintenanceCheck.BindMpds.ToArray()); } } catch (Exception ex) { Program.Provider.Logger.Log("Error while load Maintenance check bing tasks records", ex); } if (_animatedThreadWorker.CancellationPending) { e.Cancel = true; return; } _animatedThreadWorker.ReportProgress(50, "calculation of Maintenance Directives"); try { _mpdForSelect.AddRange(_workPackage.MaintenanceDirectives); _mpdForSelect.AddRange(_workPackage.ComponentDirectives.Where(dd => dd.MaintenanceDirective != null) .Select(dd => dd.MaintenanceDirective).Distinct()); foreach (MaintenanceCheckBindTaskRecord record in preResult.Where(record => record.TaskType == SmartCoreType.MaintenanceDirective && _mpdForSelect.FirstOrDefault(m => m.ItemId == record.TaskId) != null)) { _mpdForSelect.RemoveById(record.TaskId); } foreach (MaintenanceDirective mpd in _allWpChecks.SelectMany(mc => mc.BindMpds)) { _mpdForSelect.RemoveById(mpd.ItemId); } } catch (Exception ex) { Program.Provider.Logger.Log("Error while load directives for select", ex); } if (_animatedThreadWorker.CancellationPending) { e.Cancel = true; return; } _animatedThreadWorker.ReportProgress(75, "calculate directives for select"); //try //{ // _mpdForSelect.AddRange(GlobalObjects.CasEnvironment.Loader.GetMaintenanceDirectives(_maintenanceCheck.ParentAircraft)); //} //catch (Exception ex) //{ // Program.Provider.Logger.Log("Error while calculate directives for select", ex); //} if (_animatedThreadWorker.CancellationPending) { e.Cancel = true; return; } _animatedThreadWorker.ReportProgress(100, "binding 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); }
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 AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDocumentArray.Clear(); _resultDocumentArray.Clear(); if (_type == CheckListAuditType.Admin) { var ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@" DECLARE @count INT DECLARE @countNotSatis INT DECLARE @countNotSatisRCA INT SELECT @count = COUNT(*), @countNotSatis = Sum(case when IsSatisfactory = 0 then 1 else 0 end), @countNotSatisRCA = Sum(case when IsSatisfactory = 0 and WorkflowStageId in (4) then 1 else 0 end) FROM [dbo].[AuditChecks] where AuditId = {_auditId} and IsDeleted = 0 select WorkflowStageId as WorkflowStageId, case when WorkflowStageId in(2,3,6) then @count else @countNotSatis end as AllTask, case when WorkflowStageId in (4) then @countNotSatisRCA else Count(*) end as TaskInProgress from dbo.AuditChecks where AuditId = {_auditId} and IsDeleted = 0 group by WorkflowStageId "); var dtC = ds.Tables[0]; foreach (DataRow dr in dtC.Rows) { _initialDocumentArray.Add(new AuditPublish() { WorkFlowStageId = int.Parse(dr[0].ToString()), AllTask = int.Parse(dr[1].ToString()), TaskInProgress = int.Parse(dr[2].ToString()), }); } } else { var ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@" DECLARE @countNotSatis INT declare @T table( WorkflowStageId int, Auditor int, Auditee int, IsSatisfactory bit); ;WITH cte AS ( SELECT rec.*, auditor.Auditor ,auditee.Auditee, ac.*, ROW_NUMBER() OVER (PARTITION BY rec.CheckListId ORDER BY rec.ItemId DESC) AS rn FROM [AuditPelRecords] rec cross apply ( select SpecialistId as Auditor from [dbo].[PelSpecialist] where ItemId = rec.AuditorId ) as auditor cross apply ( select SpecialistId as Auditee from [dbo].[PelSpecialist] where ItemId = rec.AuditeeId ) as auditee cross apply ( select WorkflowStageId, WorkflowStatusId, IsSatisfactory from [dbo].AuditChecks where AuditId = rec.AuditId and CheckListId = rec.CheckListId ) as ac where rec.AuditId in ({_auditId}) and rec.IsDeleted = 0 ) insert into @T(WorkflowStageId, Auditor, Auditee, IsSatisfactory) select WorkflowStageId, Auditor, Auditee , IsSatisfactory from cte where rn = 1; SELECT @countNotSatis = Sum(case when IsSatisfactory = 0 then 1 else 0 end) FROM @T SELECT WorkflowStageId as WorkflowStageId, case when WorkflowStageId in(2,3,6) then Count(*) else @countNotSatis end as AllTask, Sum(case when ([Auditor] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId} or [Auditee] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId} ) then 1 else 0 end) as TaskInProgress FROM @T group by WorkflowStageId "); var dtC = ds.Tables[0]; foreach (DataRow dr in dtC.Rows) { _initialDocumentArray.Add(new AuditPublish() { WorkFlowStageId = int.Parse(dr[0].ToString()), AllTask = int.Parse(dr[1].ToString()), TaskInProgress = int.Parse(dr[2].ToString()), }); } } foreach (var i in _initialDocumentArray.OrderBy(i => i.WorkFlowStageId)) { if (i.WorkFlowStageId == WorkFlowStage.Evaluation.ItemId || i.WorkFlowStageId == WorkFlowStage.RCA.ItemId || i.WorkFlowStageId == WorkFlowStage.CAP.ItemId) { var res = ((double)(i.AllTask - i.TaskInProgress) / i.AllTask) * 100; i.Persent = (int)Math.Round(res); } else if (i.WorkFlowStageId == WorkFlowStage.CAR.ItemId) { if (_type == CheckListAuditType.Admin) { var eval = _initialDocumentArray.FirstOrDefault(q => q.WorkFlowStageId == WorkFlowStage.Evaluation.ItemId); var res = ((double)(i.AllTask - (i.TaskInProgress + eval.TaskInProgress)) / i.AllTask) * 100; i.Persent = (int)Math.Round(res); } else { var res = ((double)(i.AllTask - i.TaskInProgress) / i.AllTask) * 100; i.Persent = (int)Math.Round(res); } } else if (i.WorkFlowStageId == WorkFlowStage.Closed.ItemId) { var res = (double)(i.TaskInProgress / i.AllTask) * 100; i.Persent = (int)Math.Round(res); } } _resultDocumentArray.AddRange(_initialDocumentArray.ToList()); AnimatedThreadWorker.ReportProgress(100, "Complete"); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { #region Загрузка элементов _initialFlightsArray.Clear(); _resultFlightsArray.Clear(); _result.Clear(); _resultPeriodArray.Clear(); _initialPeriodArray.Clear(); AnimatedThreadWorker.ReportProgress(0, "load records"); try { var flightTypes = new List <int>(); if (_screenType == FlightNumberScreenType.Schedule) { flightTypes.AddRange(FlightType.Items.Where(i => i.ItemId == FlightType.Schedule.ItemId).Select(i => i.ItemId)); } else { flightTypes.AddRange(FlightType.Items.Where(i => i.ItemId != FlightType.Schedule.ItemId).Select(i => i.ItemId)); } CommonFilter <int> filter; if (isAllRadioButton.Checked) { filter = new CommonFilter <int>(FlightNumberPeriod.ScheduleProperty, FilterType.In, new [] { 0, 1, -1 }); } else if (isWinterRadioButton.Checked) { filter = new CommonFilter <int>(FlightNumberPeriod.ScheduleProperty, 0); } else { filter = new CommonFilter <int>(FlightNumberPeriod.ScheduleProperty, 1); } _initialFlightsArray.AddRange(GlobalObjects.CasEnvironment.NewLoader.GetObjectListAll <FlightNumberDTO, FlightNumber>(new Filter("FlightType", flightTypes), true)); var ids = _initialFlightsArray.Select(f => f.ItemId); var periods = GlobalObjects.CasEnvironment.NewLoader.GetObjectListAll <FlightNumberPeriodDTO, FlightNumberPeriod>(new Filter("FlightNumberId", ids), true); if (filterPeriod) { _initialPeriodArray.AddRange(periods.Where(t => t.DepartureDate >= dateTimePickerDateFrom.Value && t.ArrivalDate <= dateTimePickerDateTo.Value)); } else { _initialPeriodArray.AddRange(periods); } foreach (var period in _initialPeriodArray) { period.FlightNum = _initialFlightsArray.FirstOrDefault(f => f.ItemId == period.FlightNumberId); } } catch (Exception exception) { Program.Provider.Logger.Log("Error while load records", exception); } AnimatedThreadWorker.ReportProgress(40, "Calculate records"); #region Фильтрация директив AnimatedThreadWorker.ReportProgress(70, "filter records"); FilterItems(_initialFlightsArray, _resultFlightsArray); FilterItems(_initialPeriodArray, _resultPeriodArray); if (AnimatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion AnimatedThreadWorker.ReportProgress(100, "Complete"); #endregion }
private void AnimatedThreadWorkerDoLoad(object sender, DoWorkEventArgs e) { _resultArray.Clear(); _addedItems.Clear(); _initialFlightsArray.Clear(); _resultFlightsArray.Clear(); _initialPeriodArray.Clear(); _resultPeriodArray.Clear(); try { var flightTypes = new List <int>(); if (radioButtonSchedule.Checked) { flightTypes.AddRange(FlightType.Items.Where(i => i.ItemId == FlightType.Schedule.ItemId).Select(i => i.ItemId)); } else { flightTypes.AddRange(FlightType.Items.Where(i => i.ItemId != FlightType.Schedule.ItemId).Select(i => i.ItemId)); } CommonFilter <int> filter; if (radioButtonWinter.Checked) { filter = new CommonFilter <int>(FlightNumberPeriod.ScheduleProperty, 0); } else { filter = new CommonFilter <int>(FlightNumberPeriod.ScheduleProperty, 1); } //Выбираем все полеты(ItemId) фильтруя по FlightType var query = BaseQueries.GetSelectQueryColumnOnly <FlightNumber>(BaseEntityObject.ItemIdProperty, new ICommonFilter[] { new CommonFilter <int>(FlightNumber.FlightTypeProperty, FilterType.In, flightTypes.ToArray()), }); //Загрузка всех периодов фильтруя по зимнему или летнему периоду _initialPeriodArray.AddRange(GlobalObjects.CasEnvironment.Loader.GetObjectListAll <FlightNumberPeriod>(new ICommonFilter[] { filter, new CommonFilter <string>(FlightNumberPeriod.FlightNumberIdProperty, FilterType.In, new [] { query }) }, true).ToArray()); var ids = _initialPeriodArray.Select(f => f.FlightNumberId); if (ids.Any()) { _initialFlightsArray.AddRange(GlobalObjects.CasEnvironment.Loader.GetObjectListAll <FlightNumber>(new CommonFilter <int>(BaseEntityObject.ItemIdProperty, FilterType.In, ids.ToArray()), true, true).ToArray()); } foreach (var period in _initialPeriodArray) { period.FlightNum = _initialFlightsArray.FirstOrDefault(f => f.ItemId == period.FlightNumberId); } foreach (var selectedItem in _selectedItems.GroupBy(g => g.FlightNum)) { _addedItems.Add(selectedItem.Key); foreach (var param in selectedItem) { _addedItems.Add(param); } } _supplierArray.AddRange(GlobalObjects.CasEnvironment.Loader.GetObjectListAll <Supplier>(new CommonFilter <SupplierClass>(Supplier.SupplierClassProperty, SupplierClass.Customer))); var tripRecords = GlobalObjects.FlightTrackCore.GetFlightTrackRecordsByFlightTripId(_flightTrack.ItemId, true); foreach (var record in tripRecords) { if (!_addedItems.Contains(record.FlightNumberPeriod.FlightNum)) { _addedItems.Add(record.FlightNumberPeriod.FlightNum); } _addedItems.Add(record.FlightNumberPeriod); } } catch (Exception exception) { Program.Provider.Logger.Log("Error while load records", exception); } #region Фильтрация директив _animatedThreadWorker.ReportProgress(70, "filter records"); FilterItems(_initialFlightsArray, _resultFlightsArray); FilterItems(_initialPeriodArray, _resultPeriodArray); if (_animatedThreadWorker.CancellationPending) { e.Cancel = true; return; } #endregion _animatedThreadWorker.ReportProgress(100, "Complete"); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDocumentArray.Clear(); _resultDocumentArray.Clear(); AnimatedThreadWorker.ReportProgress(0, "load directives"); _audit = GlobalObjects.CaaEnvironment.NewLoader.GetObjectById <CAAAuditDTO, CAAAudit>(_parentId); var records = GlobalObjects.CaaEnvironment.NewLoader .GetObjectListAll <CAAAuditRecordDTO, CAAAuditRecord>(new Filter("AuditId", _parentId), loadChild: true).ToList(); _currentRoutineId = records.Select(i => i.RoutineAuditId).FirstOrDefault(); _routineAudit = GlobalObjects.CaaEnvironment.NewLoader.GetObjectById <RoutineAuditDTO, SmartCore.CAA.RoutineAudits.RoutineAudit>(_currentRoutineId.Value); var manuals = GlobalObjects.CaaEnvironment.NewLoader.GetObjectList <StandartManualDTO, SmartCore.CAA.StandartManual.StandartManual>(new [] { new Filter("OperatorId", new [] { _operatorId, -1 }.Distinct()), new Filter("ProgramTypeId", _routineAudit.Settings.TypeId), }); _manual = manuals.FirstOrDefault(); var routines = GlobalObjects.CaaEnvironment.NewLoader .GetObjectListAll <RoutineAuditRecordDTO, RoutineAuditRecord>(new Filter("RoutineAuditId", _currentRoutineId), loadChild: true).ToList(); var ids = new List <int>(); if (_type == CheckListAuditType.Admin) { if (_audit.Settings.Status == RoutineStatus.Published) { var ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@"select CheckListId from dbo.AuditChecks where AuditId in ({_parentId}) and IsDeleted = 0 and WorkflowStageId = {_stage.Value}"); var dt = ds.Tables[0]; ids.AddRange(from DataRow dr in dt.Rows select(int) dr[0]); } else { ids = routines.Select(i => i.CheckListId).Distinct().ToList(); } } else { var condition = _stage.HasValue ? $" and ac.WorkflowStageId = {_stage}" : ""; var ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@"SELECT rec.CheckListId FROM [AuditPelRecords] rec cross apply ( select SpecialistId as Auditor from [dbo].[PelSpecialist] where ItemId = rec.AuditorId ) as auditor cross apply ( select SpecialistId as Auditee from [dbo].[PelSpecialist] where ItemId = rec.AuditeeId ) as auditee cross apply ( select JSON_VALUE(SettingsJSON, '$.WorkflowStageId') as WorkflowStageId from [dbo].AuditChecks where AuditId = rec.AuditId and CheckListId = rec.CheckListId ) as ac where rec.AuditId in ({_parentId}) and rec.IsDeleted = 0 {condition} and (auditor.Auditor = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId} or auditee.Auditee = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId})"); var dt = ds.Tables[0]; ids.AddRange(from DataRow dr in dt.Rows select(int) dr[0]); } if (ids.Any()) { var filter = new List <Filter>() { new Filter("CheckListId", ids), new Filter("AuditId", _audit.ItemId) }; if (_stage.HasValue) { filter.Add(new Filter("WorkflowStageId", _stage.Value)); } var auditChecks = GlobalObjects.CaaEnvironment.NewLoader .GetObjectListAll <AuditCheckDTO, AuditCheck>(filter, loadChild: true).ToList(); _initialDocumentArray.AddRange(GlobalObjects.CaaEnvironment.NewLoader.GetObjectListAll <CheckListDTO, CheckLists>(new Filter("ItemId", ids), loadChild: true, true)); var revisions = new List <CheckListRevision>(); var revedIds = _initialDocumentArray.Where(i => i.RevisionId.HasValue).Select(i => i.RevisionId.Value).Distinct().ToList(); revedIds.AddRange(_initialDocumentArray.Select(i => i.EditionId).Distinct()); if (revedIds.Any()) { revisions.AddRange(GlobalObjects.CaaEnvironment.NewLoader.GetObjectList <CheckListRevisionDTO, CheckListRevision>(new List <Filter>() { new Filter("ItemId", values: revedIds), })); } foreach (var check in _initialDocumentArray) { check.AuditCheck = auditChecks.FirstOrDefault(i => i.CheckListId == check.ItemId); check.RevisionNumber = revisions.FirstOrDefault(i => i.ItemId == check.RevisionId)?.Number.ToString() ?? ""; check.EditionNumber = revisions.FirstOrDefault(i => i.ItemId == check.RevisionId)?.Number.ToString() ?? ""; } } var pelRecords = GlobalObjects.CaaEnvironment.NewLoader .GetObjectListAll <AuditPelRecordDTO, AuditPelRecord>(new Filter("AuditId", _parentId)); if (records.Any()) { var pelSpec = GlobalObjects.CaaEnvironment.NewLoader.GetObjectList <PelSpecialistDTO, PelSpecialist>(new Filter("AuditId", _parentId)); var specIds = pelSpec.Select(i => i.SpecialistId); var specialists = GlobalObjects.CaaEnvironment.NewLoader .GetObjectListAll <CAASpecialistDTO, Specialist>(new Filter("ItemId", specIds), loadChild: true); foreach (var specialist in specialists) { specialist.Operator = GlobalObjects.CaaEnvironment.AllOperators.FirstOrDefault(i => i.ItemId == specialist.OperatorId) ?? AllOperators.Unknown; } foreach (var pel in pelSpec) { pel.Specialist = specialists.FirstOrDefault(i => i.ItemId == pel.SpecialistId); } var dsTransfer = GlobalObjects.CaaEnvironment.NewLoader.Execute($@";WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CheckListId ORDER BY Created DESC) AS rn FROM [CheckListTransfer] where AuditId = {_parentId} ) SELECT CheckListId, [From], [To] FROM cte WHERE rn = 1 and IsDeleted = 0"); var transfers = dsTransfer.Tables[0].Rows.OfType <DataRow>().Select(i => new { CheckListId = (int)i[0], From = (int)i[1], To = (int)i[2], }); foreach (var rec in pelRecords) { rec.CheckList = _initialDocumentArray.FirstOrDefault(i => i.ItemId == rec.CheckListId); rec.Auditor = pelSpec.FirstOrDefault(i => i.ItemId == rec.AuditorId)?.Specialist ?? Specialist.Unknown; rec.Auditee = pelSpec.FirstOrDefault(i => i.ItemId == rec.AuditeeId)?.Specialist ?? Specialist.Unknown; var tr = transfers.FirstOrDefault(i => i.CheckListId == rec.CheckListId); if (tr != null) { rec.CurrentAuditor = pelSpec.FirstOrDefault(i => i.SpecialistId == tr.To)?.Specialist ?? Specialist.Unknown; } } } var levels = GlobalObjects.CaaEnvironment.NewLoader.GetObjectList <FindingLevelsDTO, FindingLevels>(new [] { new Filter("OperatorId", _operatorId), new Filter("ProgramTypeId", _manual.ProgramTypeId), }); foreach (var check in _initialDocumentArray) { check.PelRecord = pelRecords.FirstOrDefault(i => i.CheckListId == check.ItemId); if (check.PelRecord?.CurrentAuditor?.ItemId == GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId) { check.IsEditable = true; } if (check.CheckUIType == CheckUIType.Iosa) { check.Level = levels.FirstOrDefault(i => i.ItemId == check.Settings.LevelId) ?? FindingLevels.Unknown; } else if (check.CheckUIType == CheckUIType.Safa) { check.Level = levels.FirstOrDefault(i => i.ItemId == check.SettingsSafa.LevelId) ?? FindingLevels.Unknown; } else if (check.CheckUIType == CheckUIType.Icao) { check.Level = levels.FirstOrDefault(i => i.ItemId == check.SettingsIcao.LevelId) ?? FindingLevels.Unknown; } check.Remains = Lifelength.Null; check.Condition = ConditionState.Satisfactory; } AnimatedThreadWorker.ReportProgress(40, "filter directives"); AnimatedThreadWorker.ReportProgress(70, "filter directives"); FilterItems(_initialDocumentArray, _resultDocumentArray); AnimatedThreadWorker.ReportProgress(100, "Complete"); }
protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e) { _initialDocumentArray.Clear(); _resultDocumentArray.Clear(); AnimatedThreadWorker.ReportProgress(0, "load directives"); DataSet ds = null; if (_type == AuditType.CAA) { _initialDocumentArray.AddRange(GlobalObjects.CaaEnvironment.NewLoader.GetObjectListAll <CAAAuditDTO, CAAAudit>(new Filter("OperatorId", _operatorId), loadChild: true)); ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@"select a.AuditId, Sum(a.MH) from dbo.AuditRecords ar cross apply ( select ar.AuditId, rar.MH from dbo.RoutineAuditRecords ra cross apply ( select cast(JSON_VALUE(SettingsJSON, '$.ManHours') as float) as MH from dbo.CheckList where ra.CheckListId = ItemId and IsDeleted = 0 and OperatorId = {_operatorId} ) rar where ar.RoutineAuditId = ra.RoutineAuditId and ra.IsDeleted = 0 ) a where ar.IsDeleted = 0 group by a.AuditId "); } else if (_type == AuditType.All) { _initialDocumentArray.AddRange(GlobalObjects.CaaEnvironment.NewLoader.GetObjectListAll <CAAAuditDTO, CAAAudit>(loadChild: true)); ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@"select a.AuditId, Sum(a.MH) from dbo.AuditRecords ar cross apply ( select ar.AuditId, rar.MH from dbo.RoutineAuditRecords ra cross apply ( select cast(JSON_VALUE(SettingsJSON, '$.ManHours') as float) as MH from dbo.CheckList where ra.CheckListId = ItemId and IsDeleted = 0 ) rar where ar.RoutineAuditId = ra.RoutineAuditId and ra.IsDeleted = 0 ) a where ar.IsDeleted = 0 group by a.AuditId "); } else if (_type == AuditType.Operator) { _initialDocumentArray.AddRange(GlobalObjects.CaaEnvironment.NewLoader.GetObjectListAll <CAAAuditDTO, CAAAudit>(new Filter("OperatorId", FilterType.Grather, 0), loadChild: true)); ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@"select a.AuditId, Sum(a.MH) from dbo.AuditRecords ar cross apply ( select ar.AuditId, rar.MH from dbo.RoutineAuditRecords ra cross apply ( select cast(JSON_VALUE(SettingsJSON, '$.ManHours') as float) as MH from dbo.CheckList where ra.CheckListId = ItemId and IsDeleted = 0 and OperatorId > 0 ) rar where ar.RoutineAuditId = ra.RoutineAuditId and ra.IsDeleted = 0 ) a where ar.IsDeleted = 0 group by a.AuditId "); } var dt = ds.Tables[0]; foreach (DataRow dr in dt.Rows) { var id = (int)dr[0]; var find = _initialDocumentArray.FirstOrDefault(i => i.ItemId == id); if (find != null && !string.IsNullOrEmpty(dr[1].ToString())) { find.MH = Convert.ToDouble(dr[1].ToString()); } } var auditIds = _initialDocumentArray.Select(i => i.ItemId); if (auditIds.Any()) { //TODO: раньше искал по перемещениям что не гуд первое перемещение только у аудитора // ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@";WITH cte AS // ( // SELECT *, // ROW_NUMBER() OVER (PARTITION BY CheckListId ORDER BY Created DESC) AS rn // FROM [CheckListTransfer] where AuditId in ({string.Join(",", auditIds)}) // ) // SELECT AuditId, Count(*), Sum(case when ([To] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId} or [From] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId}) then 1 else 0 end) // FROM cte // WHERE rn = 1 and IsDeleted = 0 // group by AuditId"); ds = GlobalObjects.CaaEnvironment.NewLoader.Execute($@";WITH cte AS ( SELECT rec.*, auditor.Auditor ,auditee.Auditee, ROW_NUMBER() OVER (PARTITION BY rec.CheckListId ORDER BY rec.ItemId DESC) AS rn FROM [AuditPelRecords] rec cross apply ( select SpecialistId as Auditor from [dbo].[PelSpecialist] where ItemId = rec.AuditorId ) as auditor cross apply ( select SpecialistId as Auditee from [dbo].[PelSpecialist] where ItemId = rec.AuditeeId ) as auditee where rec.AuditId in ({string.Join(",", auditIds)}) and rec.IsDeleted = 0 ) SELECT AuditId, Count(*), Sum(case when ([Auditor] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId} or [Auditee] = {GlobalObjects.CaaEnvironment.IdentityUser.PersonnelId}) then 1 else 0 end) FROM cte WHERE rn = 1 group by AuditId"); var dtC = ds.Tables[0]; foreach (DataRow dr in dtC.Rows) { var auditId = (int)dr[0]; var count = (int)dr[1]; var myTask = (int)dr[2]; var audit = _initialDocumentArray.FirstOrDefault(i => i.ItemId == auditId); if (audit != null) { audit.TaskCount = count; audit.MyTask = myTask; } } } foreach (var audit in _initialDocumentArray) { audit.Operator = GlobalObjects.CaaEnvironment .AllOperators .FirstOrDefault(i => i.ItemId == audit.OperatorId) ?? AllOperators.Unknown; } AnimatedThreadWorker.ReportProgress(40, "filter directives"); AnimatedThreadWorker.ReportProgress(70, "filter directives"); FilterItems(_initialDocumentArray, _resultDocumentArray); AnimatedThreadWorker.ReportProgress(100, "Complete"); }