示例#1
0
        protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            #region Загрузка элементов

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

            if (_preResult == null)
            {
                _preResult = new MaintenanceCheckCollection();
            }
            _preResult.Clear();
            _aircraftDocs.Clear();
            try
            {
                _preResult.AddRange(GlobalObjects.MaintenanceCore.GetMaintenanceCheck(CurrentAircraft));
            }
            catch (Exception ex)
            {
                Program.Provider.Logger.Log("Error while loading directives", ex);
            }

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

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

            List <Document> aircraftDocs = GlobalObjects.DocumentCore.GetDocuments(CurrentAircraft, DocumentType.Certificate);

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

            #endregion

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

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

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

            //прогнозируемый ресурс
            var current        = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(CurrentAircraft);
            var groupingChecks = _preResult.Where(c => c.Grouping);
            int?offsetMinutes  =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Minutes))
                .OrderBy(r => r)
                .LastOrDefault();
            int?offsetCycles =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Cycles))
                .OrderBy(r => r)
                .LastOrDefault();
            int?offsetDays =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Calendar))
                .OrderBy(r => r)
                .LastOrDefault();
            var offset        = new Lifelength(offsetDays, offsetCycles, offsetMinutes);
            var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(CurrentAircraft.AircraftFrameId);
            var approxDays    = Convert.ToDouble(AnalystHelper.GetApproximateDays(offset, aircraftFrame.AverageUtilization));
            var forecastData  = new ForecastData(DateTime.Now.AddDays(approxDays),
                                                 aircraftFrame.AverageUtilization,
                                                 current);
            GlobalObjects.MaintenanceCheckCalculator.GetNextPerformanceGroup(_preResult, CurrentAircraft.Schedule, forecastData);

            var cs = ConditionState.NotEstimated;
            foreach (MaintenanceCheck check in _preResult)
            {
                if (check.Condition == ConditionState.Satisfactory && cs == ConditionState.NotEstimated)
                {
                    cs = check.Condition;
                }
                if (check.Condition == ConditionState.Notify && cs != ConditionState.Notify)
                {
                    cs = check.Condition;
                }
                if (check.Condition == ConditionState.Overdue)
                {
                    cs = check.Condition;
                    break;
                }
            }
            e.Result = cs;

            AnimatedThreadWorker.ReportProgress(55, "calculation of documents");

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

            foreach (Document aircraftDoc in aircraftDocs)
            {
                GlobalObjects.PerformanceCalculator.GetNextPerformance(aircraftDoc);

                if (!aircraftDoc.IsClosed &&
                    aircraftDoc.IssueValidTo &&
                    aircraftDoc.Condition != ConditionState.NotEstimated)
                {
                    _aircraftDocs.Add(aircraftDoc);
                }
            }

            #endregion

            #region Фильтрация директив
            AnimatedThreadWorker.ReportProgress(70, "filter directives");

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

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

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

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

            AnimatedThreadWorker.ReportProgress(100, "Complete");
        }
示例#2
0
        /*
         * Перегружаемые методы
         */

        #region public override void ApplyChanges()
        /// <summary>
        /// Применить к объекту сделанные изменения на контроле.
        /// Если не все данные удовлетворяют формату ввода (например при вводе чисел), свойства объекта не изменяются, возвращается false
        /// Вызов base.ApplyChanges() обязателен
        /// </summary>
        /// <returns></returns>
        public override void ApplyChanges()
        {
            if (MaintenanceDirective != null)
            {
                if (_maintenanceDirectiveRecord != null && checkBoxClose.Checked == false)
                {
                    _maintenanceDirectiveRecord.IsDeleted = true;
                }
                if (_maintenanceDirectiveRecord != null && checkBoxClose.Checked)
                {
                    _maintenanceDirectiveRecord.RecordDate = dateTimePicker1.Value;
                }
                if (!MaintenanceDirective.IsClosed && _maintenanceDirectiveRecord == null && checkBoxClose.Checked)
                {
                    DirectiveRecord apr = null;
                    if (MaintenanceDirective.PerformanceRecords.Count > 0)
                    {
                        //Поиск записи о выполнении задачи программы обслуживания
                        //которая могла бы подойти под создаваемую запись
                        //о выполнении чека программы обслуживания
                        double?days;
                        if (MaintenanceDirective.MaintenanceCheck != null &&
                            MaintenanceDirective.MaintenanceCheck.ParentAircraft != null)
                        {
                            var a                  = MaintenanceDirective.MaintenanceCheck.ParentAircraft;
                            var partInterval       = MaintenanceDirective.MaintenanceCheck.Interval * 0.2;
                            var aircraftFrame      = GlobalObjects.ComponentCore.GetBaseComponentById(a.AircraftFrameId);
                            var averageUtilization = GlobalObjects.AverageUtilizationCore.GetAverageUtillization(aircraftFrame);
                            days = AnalystHelper.GetApproximateDays(partInterval, averageUtilization);
                        }
                        else
                        {
                            var partInterval = MaintenanceDirective.RepeatInterval * 0.2;
                            days = AnalystHelper.GetApproximateDays(partInterval, MaintenanceDirective.ParentBaseComponent.AverageUtilization);
                        }

                        IEnumerable <DirectiveRecord> aprs = null;
                        if (days != null && days > 0)
                        {
                            double daysValue = Convert.ToDouble(days);
                            //Производится поиск записей о выполнении дата выполнения которых лежит
                            //в заданном диапозоне
                            aprs = MaintenanceDirective.PerformanceRecords.Where(
                                pr => pr.RecordDate >= dateTimePicker1.Value.AddDays(-daysValue) &&
                                pr.RecordDate <= dateTimePicker1.Value.AddDays(daysValue));
                        }
                        if (aprs != null && aprs.Count() > 0)
                        {
                            if (aprs.Count() == 1)
                            {
                                apr = aprs.First();
                            }
                            else
                            {
                                DirectiveRecord min     = null;
                                double          minDays = int.MaxValue;
                                foreach (DirectiveRecord record in aprs)
                                {
                                    if (min == null)
                                    {
                                        min     = record;
                                        minDays = Math.Abs((min.RecordDate - dateTimePicker1.Value).TotalDays);
                                        continue;
                                    }
                                    double candidateMin = Math.Abs((record.RecordDate - dateTimePicker1.Value).TotalDays);
                                    if (candidateMin < minDays)
                                    {
                                        min     = record;
                                        minDays = candidateMin;
                                    }
                                }
                                apr = min;
                            }
                        }
                    }

                    if (apr != null)
                    {
                        _maintenanceDirectiveRecord = apr;
                    }
                    else
                    {
                        NextPerformance performance =
                            MaintenanceDirective.NextPerformances.FirstOrDefault(p => p.PerformanceDate != null &&
                                                                                 p.PerformanceDate.Value.Date == dateTimePicker1.Value) ??
                            MaintenanceDirective.NextPerformances.LastOrDefault(p => p.PerformanceDate != null &&
                                                                                p.PerformanceDate < dateTimePicker1.Value) ??
                            MaintenanceDirective.NextPerformances.FirstOrDefault(p => p.PerformanceDate != null &&
                                                                                 p.PerformanceDate > dateTimePicker1.Value);
                        _maintenanceDirectiveRecord = new DirectiveRecord
                        {
                            PerformanceNum = performance != null ? performance.PerformanceNum : 0,
                            Parent         = MaintenanceDirective,
                            ParentId       = MaintenanceDirective.ItemId,
                            RecordDate     = dateTimePicker1.Value
                        };
                    }
                }
            }

            base.ApplyChanges();
        }
示例#3
0
        protected override void AnimatedThreadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            #region Загрузка элементов

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

            if (_preResult == null)
            {
                _preResult = new MaintenanceCheckCollection();
            }
            _preResult.Clear();
            try
            {
                _preResult.AddRange(GlobalObjects.MaintenanceCore.GetMaintenanceCheck(CurrentAircraft));
            }
            catch (Exception ex)
            {
                Program.Provider.Logger.Log("Error while loading directives", ex);
            }

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

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

            if (_maintenanceDirectives != null)
            {
                _maintenanceDirectives.Clear();
            }
            try
            {
                _maintenanceDirectives = GlobalObjects.MaintenanceCore.GetMaintenanceDirectives(CurrentAircraft);
                var bindedItems = GlobalObjects.BindedItemsCore.GetBindedItemsFor(CurrentAircraft.ItemId,
                                                                                  _maintenanceDirectives.Where(m => m.WorkItemsRelationType == WorkItemsRelationType.CalculationDepend).Cast <IBindedItem>());

                foreach (var mpd in _maintenanceDirectives)
                {
                    GlobalObjects.PerformanceCalculator.GetNextPerformance(mpd);

                    if (bindedItems.ContainsKey(mpd))
                    {
                        var directives = bindedItems[mpd];
                        foreach (var componentDirective in directives)
                        {
                            if (componentDirective is ComponentDirective)
                            {
                                GlobalObjects.PerformanceCalculator.GetNextPerformance(componentDirective);

                                var firstNextPerformance =
                                    bindedItems[mpd].SelectMany(t => t.NextPerformances).OrderBy(n => n.NextPerformanceDate).FirstOrDefault();

                                if (firstNextPerformance == null)
                                {
                                    continue;
                                }
                                mpd.BindedItemNextPerformance       = firstNextPerformance;
                                mpd.BindedItemNextPerformanceSource = firstNextPerformance.NextPerformanceSource ?? Lifelength.Null;
                                mpd.BindedItemRemains             = firstNextPerformance.Remains ?? Lifelength.Null;
                                mpd.BindedItemNextPerformanceDate = firstNextPerformance.NextPerformanceDate;
                                mpd.BindedItemCondition           = firstNextPerformance.Condition ?? ConditionState.NotEstimated;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Program.Provider.Logger.Log("Error while loading directives", ex);
            }

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

            #endregion

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

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

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

            //прогнозируемый ресурс
            var current        = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(CurrentAircraft);
            var groupingChecks = _preResult.Where(c => c.Grouping);
            int?offsetMinutes  =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Minutes))
                .OrderBy(r => r)
                .LastOrDefault();
            int?offsetCycles =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Cycles))
                .OrderBy(r => r)
                .LastOrDefault();
            int?offsetDays =
                groupingChecks.Select(c => c.Interval.GetSubresource(LifelengthSubResource.Calendar))
                .OrderBy(r => r)
                .LastOrDefault();
            var offset        = new Lifelength(offsetDays, offsetCycles, offsetMinutes);
            var aircraftFrame = GlobalObjects.ComponentCore.GetBaseComponentById(CurrentAircraft.AircraftFrameId);
            var approxDays    = Convert.ToDouble(AnalystHelper.GetApproximateDays(offset, aircraftFrame.AverageUtilization));
            var forecastData  = new ForecastData(DateTime.Now.AddDays(approxDays),
                                                 aircraftFrame.AverageUtilization,
                                                 current);
            GlobalObjects.MaintenanceCheckCalculator.GetNextPerformanceGroup(_preResult, CurrentAircraft.Schedule, forecastData);

            var cs = ConditionState.NotEstimated;
            foreach (MaintenanceCheck check in _preResult)
            {
                if (check.Condition == ConditionState.Satisfactory && cs == ConditionState.NotEstimated)
                {
                    cs = check.Condition;
                }
                if (check.Condition == ConditionState.Notify && cs != ConditionState.Notify)
                {
                    cs = check.Condition;
                }
                if (check.Condition == ConditionState.Overdue)
                {
                    cs = check.Condition;
                    break;
                }
            }
            e.Result = cs;
            #endregion

            #region Фильтрация директив
            AnimatedThreadWorker.ReportProgress(70, "filter directives");

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

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

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

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

            AnimatedThreadWorker.ReportProgress(100, "Complete");
        }