Example #1
0
 ///<summary>
 ///</summary>
 public NonRoutineJobForm(WorkPackageRecord wpr, WorkPackage wp) : this()
 {
     _currentWorkPackage       = wp;
     _currentWorkPackageRecord = wpr;
     ataChapterComboBox.UpdateInformation();
     UpdateControl();
 }
Example #2
0
        protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            _initialDirectiveArray.Clear();
            _resultDirectiveArray.Clear();
            _preResultDirectiveArray.Clear();

            var transfer = new List <TransferRecord>();

            transfer.AddRange(GlobalObjects.TransferRecordCore.GetPreTransferRecordsFrom(_currentBaseComponent));

            var preResult = new List <Component>();

            preResult.AddRange(transfer.Select(i => i.ParentComponent).ToList());

            AnimatedThreadWorker.ReportProgress(50, "filter components");

            InitialFilterItems(preResult, _initialDirectiveArray);

            preResult.Clear();

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            #region Калькуляция состояния компонентов

            AnimatedThreadWorker.ReportProgress(70, "calculation of components");

            foreach (Component detail in _initialDirectiveArray)
            {
                GlobalObjects.PerformanceCalculator.GetNextPerformance(detail);
                _preResultDirectiveArray.Add(detail);

                foreach (ComponentDirective detailDirective in detail.ComponentDirectives)
                {
                    GlobalObjects.PerformanceCalculator.GetNextPerformance(detailDirective);
                    _preResultDirectiveArray.Add(detailDirective);
                }
            }

            AdditionalFilterItems(_preResultDirectiveArray, _resultDirectiveArray);

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            #region Сравнение с рабочими пакетами

            AnimatedThreadWorker.ReportProgress(90, "comparison with the Work Packages");

            //загрузка рабочих пакетов для определения
            //перекрытых ими выполнений задач
            if (_openPubWorkPackages == null)
            {
                _openPubWorkPackages = new CommonCollection <WorkPackage>();
            }

            _openPubWorkPackages.Clear();
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Opened));
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Published));
            //сбор всех записей рабочих пакетов для удобства фильтрации
            List <WorkPackageRecord> openWPRecords = new List <WorkPackageRecord>();
            foreach (WorkPackage openWorkPackage in _openPubWorkPackages)
            {
                openWPRecords.AddRange(openWorkPackage.WorkPakageRecords);
            }

            foreach (IDirective dir in _resultDirectiveArray)
            {
                if (dir.NextPerformances == null || dir.NextPerformances.Count <= 0)
                {
                    continue;
                }
                BaseEntityObject baseObject = (BaseEntityObject)dir;
                //Проход по всем след. выполнениям чека и записям в рабочих пакетах
                //для поиска перекрывающихся выполнений
                List <NextPerformance> performances = dir.NextPerformances;
                foreach (NextPerformance np in performances)
                {
                    //поиск записи в рабочих пакетах по данному чеку
                    //чей номер группы выполнения (по записи) совпадает с расчитанным
                    WorkPackageRecord wpr =
                        openWPRecords.FirstOrDefault(r => r.PerformanceNumFromStart == np.PerformanceNum &&
                                                     r.WorkPackageItemType == baseObject.SmartCoreObjectType.ItemId &&
                                                     r.DirectiveId == baseObject.ItemId);
                    if (wpr != null)
                    {
                        np.BlockedByPackage = _openPubWorkPackages.GetItemById(wpr.WorkPakageId);
                    }
                }
            }

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            #region Загрузка Котировочных ордеров

            AnimatedThreadWorker.ReportProgress(95, "Load Quotations");

            //загрузка рабочих пакетов для определения
            //перекрытых ими выполнений задач
            if (_openPubQuotations == null)
            {
                _openPubQuotations = new CommonCollection <RequestForQuotation>();
            }

            _openPubQuotations.Clear();
            _openPubQuotations.AddRange(GlobalObjects.PurchaseCore.GetRequestForQuotation(CurrentAircraft, new[] { WorkPackageStatus.Opened, WorkPackageStatus.Published }));

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            AnimatedThreadWorker.ReportProgress(100, "Complete");
        }
        protected override void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            //TODO:(Evgenii Babak) много повторяющегося кода, требуется оптимизация
            backgroundWorker.ReportProgress(50);

            Invoke(new Action(() => listViewCompliance.Items.Clear()));

            if (_currentDirective == null)
            {
                e.Cancel = true;
                return;
            }

            var lastRecords      = new List <AbstractPerformanceRecord>();
            var nextPerformances = new List <NextPerformance>();

            if (_openPubWorkPackages == null)
            {
                _openPubWorkPackages = new CommonCollection <WorkPackage>();
            }
            _openPubWorkPackages.Clear();

            var parentAircraft = GlobalObjects.AircraftsCore.GetAircraftById(_currentDirective.ParentBaseComponent.ParentAircraftId);    //TODO:(Evgenii Babak) пересмотреть использование ParentAircrafId здесь

            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened));
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published));

            var allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>();
            var openPubWorkPackages         = new CommonCollection <WorkPackage>();
            var closedWorkPackages          = new CommonCollection <WorkPackage>();

            if (_currentDirective.IsAffect().GetValueOrDefault(true))
            {
                //Поиск и заполнение просроченных директив и записей о перемещении
                //Объекты для в которые будет извлекаться информация
                //из записеи о перемещении

                //прогнозируемый ресурс
                var forecastData = new ForecastData(DateTime.Now,
                                                    _currentDirective.ParentBaseComponent.AverageUtilization,
                                                    GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentDirective.ParentBaseComponent));

                //расчет след. выполнений директивы.
                //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения
                //если неизвестне, то только первое
                //GlobalObjects.PerformanceCalculator.GetNextPerformance(_currentDirective, forecastData);
                nextPerformances.AddRange(_currentDirective.NextPerformances);
                lastRecords.AddRange(_currentDirective.PerformanceRecords.ToArray());
                ////////////////////////////////////////////
                //загрузка рабочих пакетов для определения
                //перекрытых ими выполнений задач
                _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackages(parentAircraft, WorkPackageStatus.Opened, true));
                _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackages(parentAircraft, WorkPackageStatus.Published, true));

                allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft,
                                                                                                       WorkPackageStatus.All,
                                                                                                       new IDirective[] { _currentDirective }));


                #region Добавление в список просроченных выполнений
                //и сравнение их с открытыми и опубликованными рабочими пакетами
                openPubWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened ||
                                                                               wp.Status == WorkPackageStatus.Published));
                //сбор всех записей рабочих пакетов для удобства фильтрации
                List <WorkPackageRecord> openPubWpRecords = openPubWorkPackages.SelectMany(wp => wp.WorkPakageRecords).ToList();
                //LINQ запрос для сортировки записей по дате
                List <NextPerformance> sortNextRecords = (from record in nextPerformances
                                                          orderby GetDate(record) descending
                                                          select record).ToList();

                for (int i = 0; i < sortNextRecords.Count; i++)
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        allWorkPackagesIncludedTask.Clear();
                        openPubWorkPackages.Clear();
                        closedWorkPackages.Clear();

                        e.Cancel = true;
                        return;
                    }

                    //поиск записи в рабочих пакетах по данному чеку
                    //чей номер группы выполнения (по записи) совпадает с расчитанным
                    MaintenanceDirective directive = (MaintenanceDirective)sortNextRecords[i].Parent;
                    //номер выполнения
                    int parentCountPerf;
                    if (directive.LastPerformance != null)
                    {
                        parentCountPerf = directive.LastPerformance.PerformanceNum <= 0
                            ? 1
                            : directive.LastPerformance.PerformanceNum;
                    }
                    else
                    {
                        parentCountPerf = 0;
                    }
                    parentCountPerf += directive.NextPerformances.IndexOf(sortNextRecords[i]);
                    parentCountPerf += 1;

                    WorkPackageRecord wpr =
                        openPubWpRecords.FirstOrDefault(r => r.PerformanceNumFromStart == parentCountPerf &&
                                                        r.WorkPackageItemType == directive.SmartCoreObjectType.ItemId &&
                                                        r.DirectiveId == directive.ItemId);
                    if (wpr != null)
                    {
                        WorkPackage wp = openPubWorkPackages.GetItemById(wpr.WorkPakageId);
                        //запись о выполнении блокируется найденым пакетом
                        sortNextRecords[i].BlockedByPackage = wp;
                        //последующие записи о выполнении так же должны быть заблокированы
                        for (int j = i - 1; j >= 0; j--)
                        {
                            //блокировать нужно все рабочие записи, или до первой записи,
                            //заблокированной другим рабочим пакетом
                            if (sortNextRecords[j].BlockedByPackage != null ||
                                sortNextRecords[j].Condition != ConditionState.Overdue)
                            {
                                break;
                            }
                            if (sortNextRecords[j].Parent == directive)
                            {
                                sortNextRecords[j].BlockedByPackage = wp;
                                Invoke(new Action <int, Color>(SetItemColor), new object[] { j, Color.FromArgb(Highlight.GrayLight.Color) });
                            }
                        }
                    }
                    Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]);
                }
                #endregion

                #region Добавление в список записей о произведенных выполнениях
                //и сравнение их с закрытыми рабочими пакетами
                closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed));

                //LINQ запрос для сортировки записей по дате
                List <AbstractPerformanceRecord> sortLastRecords = (from record in lastRecords
                                                                    orderby record.RecordDate descending
                                                                    select record).ToList();
                ////////////////////////////////////////////

                for (int i = 0; i < sortLastRecords.Count(); i++)
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        allWorkPackagesIncludedTask.Clear();
                        openPubWorkPackages.Clear();
                        closedWorkPackages.Clear();

                        e.Cancel = true;
                        return;
                    }

                    DirectiveRecord directiveRecord = (DirectiveRecord)sortLastRecords[i];
                    WorkPackage     workPackage     =
                        closedWorkPackages.Where(wp => wp.ItemId == directiveRecord.DirectivePackageId).FirstOrDefault();
                    if (workPackage != null)
                    {
                        Invoke(new Action <AbstractPerformanceRecord, WorkPackage, MaintenanceCheckRecord>(AddListViewItem),
                               new object[] { sortLastRecords[i], workPackage, null });
                    }
                    else if (directiveRecord.MaintenanceCheckRecordId > 0)
                    {
                        var mcr = GlobalObjects.CasEnvironment.NewLoader.GetObject <DirectiveRecordDTO, MaintenanceCheckRecord>(new Filter("ItemId", directiveRecord.MaintenanceCheckRecordId));

                        if (mcr != null)
                        {
                            mcr.ParentCheck = GlobalObjects.CasEnvironment.NewLoader.GetObjectById <MaintenanceCheckDTO, MaintenanceCheck>(mcr.ParentId);
                        }

                        Invoke(new Action <AbstractPerformanceRecord, WorkPackage, MaintenanceCheckRecord>(AddListViewItem),
                               new object[] { sortLastRecords[i], workPackage, mcr });
                    }
                    else
                    {
                        Invoke(new Action <AbstractPerformanceRecord, WorkPackage>(AddListViewItem),
                               new object[] { sortLastRecords[i], workPackage });
                    }
                }
                #endregion
            }
            else
            {
                //Поиск и заполнение просроченных директив и записей о перемещении
                //Объекты для в которые будет извлекаться информация
                //из записеи о перемещении

                //прогнозируемый ресурс
                foreach (var directive in _bindedItems)
                {
                    if (directive is ComponentDirective)
                    {
                        var componentDirective = (ComponentDirective)directive;
                        var detail             = componentDirective.ParentComponent ?? _currentDirective.ParentBaseComponent;
                        //прогнозируемый ресурс
                        //если известна родительская деталь данной директивы,
                        //то ее текущая наработка и средняя утилизация
                        //используются в качестве ресурсов прогноза
                        //для расчета всех просроченных выполнений
                        var forecastData = new ForecastData(DateTime.Now,
                                                            GlobalObjects.AverageUtilizationCore.GetAverageUtillization(detail),
                                                            GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(detail));
                        //расчет след. выполнений директивы.
                        //если известен ресурс прогноза, то будут расчитаны все просрочнные выполнения
                        //если неизвестне, то только первое
                        GlobalObjects.PerformanceCalculator.GetNextPerformance(componentDirective, forecastData);
                        nextPerformances.AddRange(componentDirective.NextPerformances);
                        lastRecords.AddRange(componentDirective.PerformanceRecords.ToArray());
                    }
                }
                var directiveRecords = _bindedItems.SelectMany(dd => dd.PerformanceRecords.Cast <DirectiveRecord>());
                lastRecords.AddRange(_currentDirective.PerformanceRecords
                                     .Where(performanceRecord => directiveRecords.Count(d => d.MaintenanceDirectiveRecordId == performanceRecord.ItemId) == 0)
                                     .Cast <AbstractPerformanceRecord>());
                ////////////////////////////////////////////
                //загрузка рабочих пакетов для определения
                _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Opened));
                _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft, WorkPackageStatus.Published));

                allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(parentAircraft,
                                                                                                       WorkPackageStatus.All,
                                                                                                       _bindedItems));

                #region Добавление в список просроченных выполнений
                //и сравнение их с открытыми и опубликованными рабочими пакетами
                openPubWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened ||
                                                                               wp.Status == WorkPackageStatus.Published));
                //сбор всех записей рабочих пакетов для удобства фильтрации
                List <WorkPackageRecord> openPubWpRecords = new List <WorkPackageRecord>();
                foreach (WorkPackage openWorkPackage in openPubWorkPackages)
                {
                    openPubWpRecords.AddRange(openWorkPackage.WorkPakageRecords);
                }

                //LINQ запрос для сортировки записей по дате
                List <NextPerformance> sortNextRecords = (from record in nextPerformances
                                                          orderby GetDate(record) descending
                                                          select record).ToList();

                for (int i = 0; i < sortNextRecords.Count; i++)
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        allWorkPackagesIncludedTask.Clear();
                        openPubWorkPackages.Clear();
                        closedWorkPackages.Clear();

                        e.Cancel = true;
                        return;
                    }

                    //поиск записи в рабочих пакетах по данному чеку
                    //чей номер группы выполнения (по записи) совпадает с расчитанным
                    ComponentDirective directive = (ComponentDirective)sortNextRecords[i].Parent;
                    //номер выполнения
                    int parentCountPerf;
                    if (directive.LastPerformance != null)
                    {
                        parentCountPerf = directive.LastPerformance.PerformanceNum <= 0
                            ? 1
                            : directive.LastPerformance.PerformanceNum;
                    }
                    else
                    {
                        parentCountPerf = 0;
                    }
                    parentCountPerf += directive.NextPerformances.IndexOf(sortNextRecords[i]);
                    parentCountPerf += 1;

                    WorkPackageRecord wpr =
                        openPubWpRecords.Where(r => r.PerformanceNumFromStart == parentCountPerf &&
                                               r.WorkPackageItemType == directive.SmartCoreObjectType.ItemId &&
                                               r.DirectiveId == directive.ItemId).FirstOrDefault();
                    if (wpr != null)
                    {
                        WorkPackage wp = openPubWorkPackages.GetItemById(wpr.WorkPakageId);
                        //запись о выполнении блокируется найденым пакетом
                        sortNextRecords[i].BlockedByPackage = wp;
                        //последующие записи о выполнении так же должны быть заблокированы
                        for (int j = i - 1; j >= 0; j--)
                        {
                            //блокировать нужно все рабочие записи, или до первой записи,
                            //заблокированной другим рабочим пакетом
                            if (sortNextRecords[j].BlockedByPackage != null ||
                                sortNextRecords[j].Condition != ConditionState.Overdue)
                            {
                                break;
                            }
                            if (sortNextRecords[j].Parent == directive)
                            {
                                sortNextRecords[j].BlockedByPackage = wp;
                                Invoke(new Action <int, Color>(SetItemColor), new object[] { j, Color.FromArgb(Highlight.GrayLight.Color) });
                            }
                        }
                    }
                    Invoke(new Action <NextPerformance>(AddListViewItem), sortNextRecords[i]);
                }
                #endregion

                #region Добавление в список записей о произведенных выполнениях
                //и сравнение их с закрытыми рабочими пакетами
                closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed));

                //LINQ запрос для сортировки записей по дате
                List <AbstractPerformanceRecord> sortLastRecords = (from record in lastRecords
                                                                    orderby record.RecordDate descending
                                                                    select record).ToList();
                ////////////////////////////////////////////

                for (int i = 0; i < sortLastRecords.Count; i++)
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        allWorkPackagesIncludedTask.Clear();
                        openPubWorkPackages.Clear();
                        closedWorkPackages.Clear();

                        e.Cancel = true;
                        return;
                    }
                    WorkPackage workPackage =
                        closedWorkPackages.FirstOrDefault(wp => wp.ItemId == sortLastRecords[i].DirectivePackageId);
                    Invoke(new Action <AbstractPerformanceRecord, WorkPackage>(AddListViewItem),
                           new object[] { sortLastRecords[i], workPackage });
                }
                #endregion
            }

            allWorkPackagesIncludedTask.Clear();
            openPubWorkPackages.Clear();
            closedWorkPackages.Clear();

            backgroundWorker.ReportProgress(100);
        }
        private void UpdateInformation()
        {
            if (_contextMenuStrip == null)
            {
                InitToolStripMenuItems();
            }

            listViewCompliance.Items.Clear();

            if (CheckItems == null)
            {
                return;
            }

            var lastRecords      = new List <MaintenanceCheckRecord>();
            var nextPerformances = new List <NextPerformance>();

            //Поиск и заполнение просроченных директив и записей о перемещении
            //Объекты для в которые будет извлекаться информация
            //из записеи о перемещении

            string[]     subs;
            ListViewItem newItem;

            var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(_currentAircraft.AircraftFrameId);
            //прогнозируемый ресурс
            var forecastData = new ForecastData(DateTime.Now, aircraftFrame.AverageUtilization,
                                                GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentAircraft));

            //GlobalObjects.CasEnvironment.Calculator.GetNextPerformanceGroup(CheckItems, _currentAircraft.Schedule, forecastData);

            foreach (MaintenanceCheck check in CheckItems)
            {
                if (check.Grouping)
                {
                    foreach (MaintenanceNextPerformance mnp in check.GetPergormanceGroupWhereCheckIsSenior())
                    {
                        //Добавляются все выполнения, дата которых меньше нынешней
                        //плюс еще одно выполнение дата которого выше нынешней
                        nextPerformances.Add(mnp);

                        if (mnp.PerformanceDate != null && mnp.PerformanceDate > DateTime.Now)
                        {
                            break;
                        }
                    }
                }
                else
                {
                    foreach (NextPerformance mnp in check.NextPerformances)
                    {
                        //Добавляются все выполнения, дата которых меньше нынешней
                        //плюс еще одно выполнение дата которого выше нынешней
                        nextPerformances.Add(mnp);

                        if (mnp.PerformanceDate != null && mnp.PerformanceDate > DateTime.Now)
                        {
                            break;
                        }
                    }
                }

                lastRecords.AddRange(check.PerformanceRecords.ToArray());

                foreach (MaintenanceDirective mpd in check.BindMpds)
                {
                    GlobalObjects.PerformanceCalculator.GetNextPerformance(mpd, forecastData);
                }
            }
            ////////////////////////////////////////////
            //загрузка рабочих пакетов для определения
            //перекрытых ими выполнений задач
            if (_openPubWorkPackages == null)
            {
                _openPubWorkPackages = new CommonCollection <WorkPackage>();
            }
            _openPubWorkPackages.Clear();
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(_currentAircraft, WorkPackageStatus.Opened));
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(_currentAircraft, WorkPackageStatus.Published));

            var allWorkPackagesIncludedTask = new CommonCollection <WorkPackage>();
            var openPubWorkPackages         = new CommonCollection <WorkPackage>();
            var closedWorkPackages          = new CommonCollection <WorkPackage>();

            allWorkPackagesIncludedTask.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(_currentAircraft,
                                                                                                   WorkPackageStatus.All,
                                                                                                   CheckItems.Select(m => (IDirective)m).ToList()));

            #region Добавление в список просроченных выполнений
            //и сравнение их с открытыми и опубликованными рабочими пакетами
            openPubWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Opened ||
                                                                           wp.Status == WorkPackageStatus.Published));
            //сбор всех записей рабочих пакетов для удобства фильтрации
            List <WorkPackageRecord> openPubWPRecords = new List <WorkPackageRecord>();
            foreach (WorkPackage openWorkPackage in openPubWorkPackages)
            {
                openPubWPRecords.AddRange(openWorkPackage.WorkPakageRecords);
            }

            //LINQ запрос для сортировки записей по дате
            List <NextPerformance> sortNextRecords = (from record in nextPerformances
                                                      orderby record.GetPerformanceDateOrDefault() descending
                                                      select record).ToList();

            for (int i = 0; i < sortNextRecords.Count; i++)
            {
                //поиск записи в рабочих пакетах по данному чеку
                //чей номер группы выполнения (по записи) совпадает с расчитанным
                MaintenanceCheck check = (MaintenanceCheck)sortNextRecords[i].Parent;

                //if (check.Name == "5C")
                //{

                //}
                //номер выполнения
                int parentCountPerf;
                if (check.LastPerformance != null)
                {
                    parentCountPerf = check.LastPerformance.NumGroup <= 0
                        ? 1
                        : check.LastPerformance.NumGroup;
                }
                else
                {
                    parentCountPerf = 0;
                }

                if (check.Grouping)
                {
                    MaintenanceNextPerformance mnp = sortNextRecords[i] as MaintenanceNextPerformance;
                    if (mnp != null)
                    {
                        parentCountPerf = mnp.PerformanceGroupNum;
                    }
                    else
                    {
                        parentCountPerf += check.NextPerformances.IndexOf(sortNextRecords[i]);
                        parentCountPerf += 1;
                    }
                }
                else
                {
                    parentCountPerf += check.NextPerformances.IndexOf(sortNextRecords[i]);
                    parentCountPerf += 1;
                }

                WorkPackageRecord wpr =
                    openPubWPRecords.Where(r => r.PerformanceNumFromStart == parentCountPerf &&
                                           r.WorkPackageItemType == check.SmartCoreObjectType.ItemId &&
                                           r.DirectiveId == check.ItemId).FirstOrDefault();
                if (wpr != null)
                {
                    WorkPackage wp = openPubWorkPackages.GetItemById(wpr.WorkPakageId);
                    //запись о выполнении блокируется найденым пакетом
                    sortNextRecords[i].BlockedByPackage = wp;
                    //последующие записи о выполнении так же должны быть заблокированы
                    for (int j = i - 1; j >= 0; j--)
                    {
                        //блокировать нужно все рабочие записи, или до первой записи,
                        //заблокированной другим рабочим пакетом
                        if (sortNextRecords[j].BlockedByPackage != null &&
                            sortNextRecords[j].Parent == check ||
                            sortNextRecords[j].Condition != ConditionState.Overdue)
                        {
                            break;
                        }
                        if (sortNextRecords[j].Parent == check)
                        {
                            sortNextRecords[j].BlockedByPackage   = wp;
                            listViewCompliance.Items[j].BackColor = Color.FromArgb(Highlight.GrayLight.Color);
                        }
                    }
                }

                string type        = check.Schedule ? " (Schedule) " : " (Store) ";
                string resource    = check.Resource.ToString();
                string grouping    = check.Grouping ? " (Group)" : "";
                string stringNumGr = (sortNextRecords[i] is MaintenanceNextPerformance
                    ? ((MaintenanceNextPerformance)sortNextRecords[i]).PerformanceGroupNum.ToString()
                    : "N/A") + type + resource + grouping;

                subs = new[]  {
                    stringNumGr,
                    sortNextRecords[i].Title,
                    sortNextRecords[i].PerformanceDate != null
                                       ? UsefulMethods.NormalizeDate((DateTime)sortNextRecords[i].PerformanceDate)
                                       : "N/A",
                    sortNextRecords[i].PerformanceSource.ToString(),
                    "",
                };
                newItem = new ListViewItem(subs)
                {
                    Group     = listViewCompliance.Groups["next"],
                    Tag       = sortNextRecords[i],
                    BackColor = UsefulMethods.GetColor(sortNextRecords[i])
                };

                listViewCompliance.Items.Add(newItem);
            }
            #endregion

            #region Добавление в список записей о произведенных выполнениях
            //и сравнение их с закрытыми рабочими пакетами
            closedWorkPackages.AddRange(allWorkPackagesIncludedTask.Where(wp => wp.Status == WorkPackageStatus.Closed));
            //сбор всех записей рабочих пакетов для удобства фильтрации
            List <WorkPackageRecord> closedWPRecords = new List <WorkPackageRecord>();
            foreach (WorkPackage closedWorkPackage in closedWorkPackages)
            {
                closedWPRecords.AddRange(closedWorkPackage.WorkPakageRecords);
            }

            List <MaintenanceCheckRecordGroup> maintenanceCheckRecordGroups = new List <MaintenanceCheckRecordGroup>();

            foreach (MaintenanceCheckRecord record in lastRecords)
            {
                //Поиск коллекции групп, в которую входят группы с нужными критериями
                //по плану, группировка и основному ресурсу
                if (record.ParentCheck.Grouping)
                {
                    MaintenanceCheckRecordGroup recordGroup = maintenanceCheckRecordGroups
                                                              .FirstOrDefault(g => g.Schedule == record.ParentCheck.Schedule &&
                                                                              g.Grouping == record.ParentCheck.Grouping &&
                                                                              g.Resource == record.ParentCheck.Resource &&
                                                                              g.GroupComplianceNum == record.NumGroup);
                    if (recordGroup != null)
                    {
                        //Коллекция найдена
                        //Поиск в ней группы чеков с нужным типом
                        recordGroup.Records.Add(record);
                    }
                    else
                    {
                        //Коллекции с нужными критериями нет
                        //Созадние и добавление
                        recordGroup =
                            new MaintenanceCheckRecordGroup(record.ParentCheck.Schedule, record.ParentCheck.Grouping,
                                                            record.ParentCheck.Resource, record.NumGroup);
                        recordGroup.Records.Add(record);
                        maintenanceCheckRecordGroups.Add(recordGroup);
                    }
                }
                else
                {
                    MaintenanceCheckRecordGroup recordGroup =
                        new MaintenanceCheckRecordGroup(record.ParentCheck.Schedule, record.ParentCheck.Grouping,
                                                        record.ParentCheck.Resource);
                    recordGroup.Records.Add(record);
                    maintenanceCheckRecordGroups.Add(recordGroup);
                }
            }

            List <object> tempRecords = new List <object>();
            tempRecords.AddRange(maintenanceCheckRecordGroups.ToArray());
            tempRecords.AddRange(_currentAircraft.MaintenanceProgramChangeRecords.ToArray());

            List <object> sortLastRecords =
                tempRecords.OrderByDescending(tr => (tr is MaintenanceCheckRecordGroup
                                                        ? ((MaintenanceCheckRecordGroup)tr).LastGroupComplianceDate
                                                        : tr is AbstractRecord
                                                            ? ((AbstractRecord)tr).RecordDate
                                                            : DateTimeExtend.GetCASMinDateTime()))
                .ToList();
            foreach (object t in sortLastRecords)
            {
                if (t is MaintenanceCheckRecordGroup)
                {
                    MaintenanceCheckRecordGroup mcrg            = (MaintenanceCheckRecordGroup)t;
                    MaintenanceCheckRecord      directiveRecord = mcrg.Records.First();
                    MaintenanceCheck            parentDirective = (MaintenanceCheck)directiveRecord.Parent;
                    newItem = GetListViewItem(mcrg);

                    WorkPackage workPackage =
                        closedWorkPackages.Where(wp => wp.ItemId == directiveRecord.DirectivePackageId).FirstOrDefault();
                    if (workPackage != null)
                    {
                        //запись о выполнении блокируется найденым пакетом
                        directiveRecord.DirectivePackage = workPackage;
                        newItem.BackColor   = Color.FromArgb(Highlight.Grey.Color);
                        newItem.ToolTipText =
                            "Perform of the task:" + parentDirective.Name +
                            "\nadded by Work Package:" +
                            "\n" + directiveRecord.DirectivePackage.Title +
                            "\nTo remove a performance of task, you need to exclude task from this work package," +
                            "\nor delete the work package ";
                    }
                    listViewCompliance.Items.Add(newItem);
                }
                else if (t is MaintenanceProgramChangeRecord)
                {
                    MaintenanceProgramChangeRecord mpcr = (MaintenanceProgramChangeRecord)t;
                    subs = new[]
                    {
                        "N/A",
                        "Changet to " + mpcr.MSG,
                        UsefulMethods.NormalizeDate(mpcr.RecordDate),
                        mpcr.OnLifelength.ToString(),
                        "",
                    };
                    newItem = new ListViewItem(subs)
                    {
                        Group     = listViewCompliance.Groups["last"],
                        Tag       = mpcr,
                        BackColor = Color.FromArgb(Highlight.GrayLight.Color)
                    };

                    listViewCompliance.Items.Add(newItem);
                }
            }
            #endregion

            if (_toolStripMenuItemsWorkPackages != null)
            {
                foreach (ToolStripMenuItem item in _toolStripMenuItemsWorkPackages.DropDownItems)
                {
                    item.Click -= AddToWorkPackageItemClick;
                }

                _toolStripMenuItemsWorkPackages.DropDownItems.Clear();

                foreach (WorkPackage workPackage in _openPubWorkPackages)
                {
                    ToolStripMenuItem item = new ToolStripMenuItem(workPackage.Title);
                    item.Click += AddToWorkPackageItemClick;
                    item.Tag    = workPackage;
                    _toolStripMenuItemsWorkPackages.DropDownItems.Add(item);
                }
            }

            ButtonAdd.Enabled = false;
        }
Example #5
0
        protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            _initialDirectiveArray.Clear();
            _resultDirectiveArray.Clear();

            AnimatedThreadWorker.ReportProgress(0, "load directives");

            try
            {
                if (_currentForecast == null)
                {
                    var aircrafts = GlobalObjects.AircraftsCore.GetAllAircrafts();
                    foreach (var aircraft in aircrafts)
                    {
                        _initialDirectiveArray.AddRange(GlobalObjects.DirectiveCore.GetDeferredItems(null, aircraft));
                    }
                }
                else
                {
                    AnimatedThreadWorker.ReportProgress(20, "calculation directives");

                    GlobalObjects.AnalystCore.GetDirectives(_currentForecast, _currentPrimaryDirectiveType);
                    DirectiveCollection dirC = _currentForecast.DirectiveCollections[_currentPrimaryDirectiveType];
                    foreach (Directive directive in dirC)
                    {
                        _initialDirectiveArray.Add(directive);
                    }
                }
            }
            catch (Exception ex)
            {
                Program.Provider.Logger.Log("Error while loading directives", ex);
            }
            AnimatedThreadWorker.ReportProgress(40, "filter directives");
            if (_adType != ADType.None)
            {
                List <Directive> forDeleting =
                    _initialDirectiveArray.Where(primaryDirective => primaryDirective.ADType != _adType).ToList();

                foreach (Directive directive in forDeleting)
                {
                    _initialDirectiveArray.Remove(_initialDirectiveArray.GetItemById(directive.ItemId));
                }
            }

            #region Калькуляция состояния директив

            AnimatedThreadWorker.ReportProgress(60, "calculation of directives");

            foreach (Directive pd in _initialDirectiveArray)
            {
                //GlobalObjects.PerformanceCalculator.GetNextPerformance(pd);
                GlobalObjects.MTOPCalculator.CalculateDirectiveNew(pd);
            }

            AnimatedThreadWorker.ReportProgress(70, "filter directives");

            FilterItems(_initialDirectiveArray, _resultDirectiveArray);

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }


            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            #region Сравнение с рабочими пакетами

            AnimatedThreadWorker.ReportProgress(90, "comparison with the Work Packages");

            //загрузка рабочих пакетов для определения
            //перекрытых ими выполнений задач
            if (_openPubWorkPackages == null)
            {
                _openPubWorkPackages = new CommonCollection <WorkPackage>();
            }

            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Opened));
            _openPubWorkPackages.AddRange(GlobalObjects.WorkPackageCore.GetWorkPackagesLite(CurrentAircraft, WorkPackageStatus.Published));

            //сбор всех записей рабочих пакетов для удобства фильтрации
            List <WorkPackageRecord> openWPRecords = new List <WorkPackageRecord>();
            foreach (WorkPackage openWorkPackage in _openPubWorkPackages)
            {
                openWPRecords.AddRange(openWorkPackage.WorkPakageRecords);
            }

            foreach (Directive task in _resultDirectiveArray)
            {
                if (task == null || task.NextPerformances == null || task.NextPerformances.Count <= 0)
                {
                    continue;
                }
                //Проход по всем след. выполнениям чека и записям в рабочих пакетах
                //для поиска перекрывающихся выполнений
                List <NextPerformance> performances = task.NextPerformances;
                foreach (NextPerformance np in performances)
                {
                    //поиск записи в рабочих пакетах по данному чеку
                    //чей номер группы выполнения (по записи) совпадает с расчитанным
                    WorkPackageRecord wpr =
                        openWPRecords.Where(r => r.PerformanceNumFromStart == np.PerformanceNum &&
                                            r.WorkPackageItemType == task.SmartCoreObjectType.ItemId &&
                                            r.DirectiveId == task.ItemId).FirstOrDefault();
                    if (wpr != null)
                    {
                        np.BlockedByPackage = _openPubWorkPackages.GetItemById(wpr.WorkPakageId);
                    }
                }
            }

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            #region Загрузка Котировочных ордеров

            AnimatedThreadWorker.ReportProgress(95, "Load Quotations");

            //загрузка рабочих пакетов для определения
            //перекрытых ими выполнений задач
            if (_openPubQuotations == null)
            {
                _openPubQuotations = new CommonCollection <RequestForQuotation>();
            }

            _openPubQuotations.Clear();
            _openPubQuotations.AddRange(GlobalObjects.PurchaseCore.GetRequestForQuotation(CurrentAircraft, new[] { WorkPackageStatus.Opened, WorkPackageStatus.Published }));

            if (AnimatedThreadWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            #endregion

            AnimatedThreadWorker.ReportProgress(100, "Complete");
        }
Example #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);
        }