Example #1
0
        protected override void AnimatedThreadWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            labelTitle.Text   = "";
            labelTitle.Status = Statuses.NotActive;

            var res = new List <BaseEntityObject>();

            foreach (var item in _resultDirectiveArray)
            {
                if (item is Component)
                {
                    var c = item as Component;
                    var a = GlobalObjects.AircraftsCore.GetAircraftById(c.ParentBaseComponent?.ParentAircraftId ?? -1);

                    if (a == null)
                    {
                        continue;
                    }

                    res.Add(item);

                    var component = item as Component;
                    var items     = _resultDirectiveArray.Where(lvi =>
                                                                lvi is ComponentDirective &&
                                                                ((ComponentDirective)lvi).ComponentId == component.ItemId);
                    res.AddRange(items);
                }
            }

            _directivesViewer.SetItemsArray(res.ToArray());
            _directivesViewer.Focus();
        }
Example #2
0
        /// <summary>
        /// Возвращает последнюю выполненную группу чеков, чеки которой имеют заданные парамерты
        /// </summary>
        /// <param name="checks"></param>
        /// <param name="schedule">Чеки плановые или по программе хранения</param>
        /// <param name="aircraftId">Родительское ВС чеков</param>
        /// <param name="grouping">Чеки групповые или нет</param>
        /// <param name="resource">По какому из ресурсов (часы, циклы или календарь) группируются чеки</param>
        /// <param name="checkType">Тип чека (A B C D)</param>
        /// <returns></returns>
        public static MaintenanceCheckComplianceGroup GetLastComplianceCheckGroup(this ICommonCollection <MaintenanceCheck> checks,
                                                                                  bool schedule, int aircraftId,
                                                                                  bool grouping = true,
                                                                                  LifelengthSubResource resource = LifelengthSubResource.Hours,
                                                                                  MaintenanceCheckType checkType = null)
        {
            int last = 0;
            var aircraftScheduleChecks = checks.Where(c => c.Schedule == schedule &&
                                                      c.ParentAircraftId == aircraftId &&
                                                      c.Grouping == grouping &&
                                                      c.Resource == resource).ToList();

            if (checkType != null)
            {
                aircraftScheduleChecks = aircraftScheduleChecks.Where(c => c.CheckType == checkType).ToList();
            }

            foreach (MaintenanceCheck checkItem in aircraftScheduleChecks)
            {
                if (checkItem.LastPerformance != null && last < checkItem.LastPerformance.NumGroup)
                {
                    last = checkItem.LastPerformance.NumGroup;
                }
            }

            if (last <= 0)
            {
                return(null);
            }

            var lastComplianceGroup = new MaintenanceCheckComplianceGroup(schedule);

            foreach (MaintenanceCheck checkItem in aircraftScheduleChecks)
            {
                if (checkItem.LastPerformance != null && last == checkItem.LastPerformance.NumGroup)
                {
                    lastComplianceGroup.Checks.Add(checkItem);
                }
            }

            if (lastComplianceGroup.GetMaxIntervalCheck() == null)
            {
                return(null);
            }
            lastComplianceGroup.Sort();
            return(lastComplianceGroup);
        }
Example #3
0
        /// <summary>
        /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule,
        /// группирует по MaintenanceCheckType (A, B, C, D, etc),
        /// и проставляет связи между группами по приоритету MaintenanceCheckType
        /// </summary>
        public static IEnumerable <MaintenanceCheckGroupByType> GroupingCheckByType(this ICommonCollection <MaintenanceCheck> checks, int?minStep, bool schedule)
        {
            if (minStep == null)
            {
                return(null);
            }

            var groupChecks = new List <MaintenanceCheckGroupByType>();
            Func <MaintenanceCheck, int?> predicate;

            if (schedule)
            {
                predicate = check => check.Interval.Hours;
            }
            else
            {
                predicate = check => check.Interval.Days;
            }

            var v = checks.Where(c => c.Schedule == schedule)
                    .OrderBy(predicate)
                    .ThenBy(c => c.CheckType.Priority)
                    .GroupBy(c => c.CheckType.FullName);

            foreach (var grouping in v)
            {
                var groupCheck = new MaintenanceCheckGroupByType(schedule);
                foreach (MaintenanceCheck check in grouping)
                {
                    groupCheck.Checks.Add(check);
                }
                groupCheck.Sort();

                var last = groupChecks.LastOrDefault();
                if (last != null)
                {
                    last.ParentGroup = groupCheck;
                    last.CheckCycle  = groupCheck.MinInterval();
                }

                groupCheck.ParentGroup = null;
                groupCheck.CheckCycle  = groupCheck.MaxInterval();

                groupChecks.Add(groupCheck);
            }
            return(groupChecks.ToArray());
        }
Example #4
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 #5
0
        /// <summary>
        /// Сортирует чеки по интервалу выполнения в зависимости от свойства Schedule,
        /// группирует по MaintenanceCheckType (A, B, C, D, etc),
        /// и проставляет связи между группами по приоритету MaintenanceCheckType
        /// </summary>
        public static MaintenanceCheckGroupCollection[] GroupingCheckByType(this ICommonCollection <MaintenanceCheck> maintenanceChecks, bool schedule,
                                                                            bool?grouping = null, LifelengthSubResource?resource = null)
        {
            //Фильтрация чеков по Schedule и упорядочивание по приоритету и группировка по названию типа
            IEnumerable <MaintenanceCheck> preFilteredChecks = maintenanceChecks.Where(c => c.Schedule == schedule);

            if (grouping != null)
            {
                preFilteredChecks = preFilteredChecks.Where(c => c.Grouping == grouping);
            }
            if (resource != null)
            {
                preFilteredChecks = preFilteredChecks.Where(c => c.Resource == resource);
            }
            IEnumerable <IGrouping <MaintenanceCheckType, MaintenanceCheck> > filteredBySchedule =
                preFilteredChecks.OrderBy(c => c.CheckType.Priority)
                .GroupBy(c => c.CheckType);
            //Формирование групп чеков по типам (A,B,C) с дополнительными критериями
            //1. Плановый чек/чек по хранению
            //2. Групповой/Одиночный
            //3. Основной ресурс (Часы/Циклы/Дни)
            List <MaintenanceCheckGroupCollection> checkGroupsCollections = new List <MaintenanceCheckGroupCollection>();

            foreach (IGrouping <MaintenanceCheckType, MaintenanceCheck> checks in filteredBySchedule)
            {
                foreach (MaintenanceCheck check in checks)
                {
                    //Поиск коллекции групп, в которую входят группы с нужными критериями
                    //по плану, группировка и основному ресурсу
                    MaintenanceCheckGroupCollection collection = checkGroupsCollections
                                                                 .FirstOrDefault(g => g.Schedule == check.Schedule &&
                                                                                 g.Grouping == check.Grouping &&
                                                                                 g.Resource == check.Resource);
                    if (collection != null)
                    {
                        //Коллекция найдена
                        //Поиск в ней группы чеков с нужным типом
                        MaintenanceCheckGroupByType groupByType = collection.FirstOrDefault(g => g.CheckType == check.CheckType);
                        if (groupByType != null)
                        {
                            groupByType.Checks.Add(check);
                        }
                        else
                        {
                            //Группы с нужным типом нет
                            //Инициализация и добавление
                            groupByType = new MaintenanceCheckGroupByType(check.Schedule)
                            {
                                Grouping  = check.Grouping,
                                Resource  = check.Resource,
                                CheckType = check.CheckType,
                            };
                            groupByType.Checks.Add(check);
                            collection.Add(groupByType);
                        }
                    }
                    else
                    {
                        //Коллекции с нужными критериями нет
                        //Созадние и добавление
                        collection = new MaintenanceCheckGroupCollection
                        {
                            Schedule = check.Schedule,
                            Grouping = check.Grouping,
                            Resource = check.Resource,
                        };
                        MaintenanceCheckGroupByType groupByType = new MaintenanceCheckGroupByType(check.Schedule)
                        {
                            Grouping  = check.Grouping,
                            Resource  = check.Resource,
                            CheckType = check.CheckType,
                        };
                        groupByType.Checks.Add(check);
                        collection.Add(groupByType);
                        checkGroupsCollections.Add(collection);
                    }
                }
            }
            //Упорядочивание каждой группы по ресурсам выполнения и проставление связей между ними
            foreach (MaintenanceCheckGroupCollection collection in checkGroupsCollections)
            {
                foreach (MaintenanceCheckGroupByType groupByType in collection)
                {
                    groupByType.Sort();

                    MaintenanceCheckGroupByType last =
                        collection.LastOrDefault(gbt => gbt.CheckType.Priority < groupByType.CheckType.Priority);
                    if (last != null)
                    {
                        last.ParentGroup = groupByType;
                        last.CheckCycle  = groupByType.MinIntervalByResource();
                    }

                    groupByType.ParentGroup = null;
                    groupByType.CheckCycle  = groupByType.MaxIntervalByResource();
                }
            }
            return(checkGroupsCollections.ToArray());
        }
        protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            _initialDirectiveArray.Clear();

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

            try
            {
                if (_currentForecast == null)
                {
                    AnimatedThreadWorker.ReportProgress(0, "load items");

                    if (DirectiveSource is Aircraft)
                    {
                        var aircraft        = DirectiveSource as Aircraft;
                        var aircraftModelId = aircraft.Model?.ItemId ?? -1;
                        if (MpdIds.Count > 0)
                        {
                            _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetMpdKits(aircraft.ItemId, MpdIds).ToArray());
                        }
                        else
                        {
                            _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetAllAircraftKits(aircraft.ItemId, aircraftModelId).ToArray());
                        }
                    }
                    else
                    {
                        _initialDirectiveArray.AddRange(GlobalObjects.KitsCore.GetAllWorkPackageKits(((WorkPackage)DirectiveSource).ItemId).ToArray());
                    }

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

                    AnimatedThreadWorker.ReportProgress(20, "calculation of items");


                    IDirective[] directives =
                        _initialDirectiveArray.Where(i => i.ParentObject is IDirective)
                        .Select(i => i.ParentObject as IDirective)
                        .Distinct()
                        .ToArray();
                    double step = 75.0 / directives.Count();

                    for (int i = 0; i < directives.Length; i++)
                    {
                        if (AnimatedThreadWorker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }
                        AnimatedThreadWorker.ReportProgress(20 + (int)(step * i), "calculation of items");

                        GlobalObjects.PerformanceCalculator.GetNextPerformance(directives[i]);
                    }
                }
                else
                {
                    _currentForecast.Kits.Clear();

                    AnimatedThreadWorker.ReportProgress(0, "calc. Maint. Checks kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetMaintenanceChecksKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(9, "calc. Maint. Directives kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetMaintenanceDirectivesKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(19, "calc. Base details kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetBaseComponentsAndComponentDirectivesKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(29, "calc. Components kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetComponentsAndComponentDirectivesKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(39, "calc. AD kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.AirworthenessDirectives));

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

                    AnimatedThreadWorker.ReportProgress(49, "calc. Damages kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.DamagesRequiring));

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

                    AnimatedThreadWorker.ReportProgress(59, "calc. Deffered kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.DeferredItems));

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

                    AnimatedThreadWorker.ReportProgress(69, "calc. Engineering orders kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetEngineeringOrdersKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(79, "calc. Service bulletins kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetServiceBulletinsKits(_currentForecast));

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

                    AnimatedThreadWorker.ReportProgress(89, "calc. Out of phase kits");
                    _currentForecast.Kits.AddRange(GlobalObjects.AnalystCore.GetDirectivesKits(_currentForecast, DirectiveType.OutOfPhase));

                    if (AnimatedThreadWorker.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    _initialDirectiveArray.AddRange(_currentForecast.Kits.ToArray());
                }
            }
            catch (Exception ex)
            {
                Program.Provider.Logger.Log("Error while loading data", ex);
            }

            AnimatedThreadWorker.ReportProgress(95, "Filter kits");

            FilterItems(_initialDirectiveArray, _resultDirectiveArray);

            #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, "calc. kits over");
        }