示例#1
0
        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);
            }
        }
示例#2
0
        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");
            }
        }
示例#4
0
        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);
        }
示例#6
0
        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);
        }