Ejemplo n.º 1
0
        private void RadioButtonDaylyClick(object sender, EventArgs e)
        {
            if (radioButtonDayly.Checked && numericUpDownHours.Value >= 24)
            {
                numericUpDownHours.Value = (decimal)23.9;
            }
            if (radioButtonMonthly.Checked && numericUpDownHours.Value >= 744)
            {
                numericUpDownHours.Value = (decimal)743.9;
            }
            AverageUtilization au = GetAverageUtilization();

            if (au == null || _forecastDate <= DateTime.Today)
            {
                return;
            }

            if (_forecastDate <= DateTime.Today)
            {
                return;
            }
            //если дата прогноза выше сегодняшней, то сначала вычисляется
            //наработка на сегодняшний день, а к ней добавляется среднепрогнозируемая наработка
            //между сегодняшним днем и днем прогноза
            //наработка агрегата на сегодня
            Lifelength baseDetailLifeLenght =
                GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_currentForecastData.BaseComponent);

            Lifelength average = AnalystHelper.GetUtilization(au, Calculator.GetDays(DateTime.Today, _forecastDate));

            lifelengthViewerDifferentSource.Lifelength = average;
            baseDetailLifeLenght.Add(average);
            lifelengthViewer_ForecastResource.Lifelength = baseDetailLifeLenght;
        }
Ejemplo n.º 2
0
        /*
         * Реализация
         */

        #region private void Init(DateTime date, AverageUtilization average, Lifelength current)
        /// <summary>
        /// Инициализирует все поля
        /// </summary>
        /// <param name="date"></param>
        /// <param name="average"></param>
        /// <param name="current"></param>
        private void Init(DateTime date, AverageUtilization average, Lifelength current)
        {
            CurrentLifelength  = new Lifelength(current);
            _forecastDate      = date;
            AverageUtilization = average;
            ForecastLifelength = new Lifelength(current);
            ForecastLifelength.Add(AnalystHelper.GetUtilization(average, Calculator.GetDays(DateTime.Today, date)));
            IncludeNotifyes = false;
            Percents        = 5;
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Создает прогноз на заданный ресурс агрегата (налет воздушного судна)
        /// </summary>
        /// <param name="forecastLifelength">Ресурс агрегата или налет воздушного судна, на который требуется построить отчет</param>
        /// <param name="average">Среднестатистическая наработка агрегата или налет ВС</param>
        /// <param name="current">Текущая наработка агрегата или налет ВС</param>
        public ForecastData(Lifelength forecastLifelength, AverageUtilization average, Lifelength current)
        {
            SelectedForecastType = ForecastType.ForecastByLifelength;
            Lifelength delta = new Lifelength(forecastLifelength);

            delta.Substract(current);
            DateTime?date = AnalystHelper.GetApproximateDate(delta, average);

            if (date == null)
            {
                throw new Exception("1327: Can not compose forecast report for null date");
            }
            Init(date.Value, average, current);
        }
Ejemplo n.º 4
0
        public Lifelength GetCurrentFlightLifelength(BaseEntityObject source, ForecastData forecastData = null)
        {
            if (source == null)
            {
                return(Lifelength.Null);
            }
            if (forecastData == null)
            {
                return(GetFlightLifelengthOnEndOfDay(source, DateTime.Today));
            }
            if (forecastData.ForecastDate <= DateTime.Today)
            {
                return(GetFlightLifelengthOnEndOfDay(source, forecastData.ForecastDate));
            }

            var res = GetFlightLifelengthOnEndOfDay(source, DateTime.Today);

            res += AnalystHelper.GetUtilization(forecastData.AverageUtilization, (forecastData.ForecastDate - DateTime.Today).Days);
            return(res);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Инициализирует все поля
        /// </summary>
        private void Calc()
        {
            if (CurrentLifelength == null || AverageUtilization == null)
            {
                return;
            }
            if (ForecastLifelength == null)
            {
                ForecastLifelength = new Lifelength(CurrentLifelength);
            }
            else
            {
                ForecastLifelength.Reset();
                ForecastLifelength += CurrentLifelength;
            }

            ForecastLifelength.Add(AnalystHelper.GetUtilization(AverageUtilization, Calculator.GetDays(DateTime.Today, _forecastDate)));
            IncludeNotifyes = false;
            Percents        = 5;
        }
Ejemplo n.º 6
0
        private void CalculateUtilizationByDate()
        {
            Lifelength baseDetailLifeLenght = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_frame);

            if (dateTimePickerForecastDate.Value <= DateTime.Today)
            {
                //если дата прогноза меньше сегодняшней, то выводиться зписанная наработка на эту дату
                lifelengthViewer_ForecastResource.Lifelength =
                    GlobalObjects.CasEnvironment.Calculator.GetFlightLifelengthOnEndOfDay(_frame, dateTimePickerForecastDate.Value);
                Lifelength different = new Lifelength(lifelengthViewer_ForecastResource.Lifelength);
                different.Substract(baseDetailLifeLenght);
                lifelengthViewerDifferentSource.Lifelength = different;
            }
            else
            {
                //если дата прогноза выше сегодняшней, то сначала вычисляется
                //наработка на сегодняшний день, а к ней добавляется среднепрогнозируемая наработка
                //между сегодняшним днем и днем прогноза

                //если не задана сердняя утилизация, то прогноз строить нельзя
                AverageUtilization au = GetAverageUtilization();
                if (au == null)
                {
                    return;
                }

                Lifelength average;
                if (dateTimePickerForecastDate.Value.Date == DateTime.Today.Date)
                {
                    average = AnalystHelper.GetUtilization(au, Calculator.GetDays(DateTime.Today, dateTimePickerForecastDate.Value));
                }
                else
                {
                    average = AnalystHelper.GetUtilizationNew(au, Calculator.GetDays(DateTime.Today, dateTimePickerForecastDate.Value));
                }
                lifelengthViewerDifferentSource.Lifelength = average;
                baseDetailLifeLenght.Add(average);
                lifelengthViewer_ForecastResource.Lifelength = baseDetailLifeLenght;
            }
        }
Ejemplo n.º 7
0
        public Lifelength GetFlightLifelengthOnStartOfDay(BaseEntityObject source, ForecastData forecastData = null)
        {
            if (source == null)
            {
                return new Lifelength {
                           Days = GetDays(DateTimeExtend.GetCASMinDateTime(), DateTime.Today)
                }
            }
            ;

            if (forecastData == null)
            {
                return(GetFlightLifelengthOnStartOfDay(source, DateTime.Today));
            }
            if (forecastData.ForecastDate <= DateTime.Today)
            {
                return(GetFlightLifelengthOnStartOfDay(source, forecastData.ForecastDate));
            }

            var res = GetFlightLifelengthOnStartOfDay(source, DateTime.Today);

            res += AnalystHelper.GetUtilization(forecastData.AverageUtilization, (forecastData.ForecastDate - DateTime.Today).Days);
            return(res);
        }
Ejemplo n.º 8
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();
        }
Ejemplo n.º 9
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");
        }
Ejemplo n.º 10
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");
        }