示例#1
0
        /// <summary>
        /// Добавить обслуживание
        /// </summary>
        /// <param name="maintenanceType"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="unplannedReason"></param>
        public void AddMaintenance(
            MaintenanceType maintenanceType,
            DateTime start,
            DateTime?end = null,
            MaintenanceReason unplannedReason = null
            )
        {
            var targetInterval = Intervals.SingleOrDefault(x => x.MaintenanceType == maintenanceType);

            if (targetInterval == null)
            {
                throw new Exception("Не найден интервал для данного вида обслуживания");
            }

            //Добавить запись в журнал обслуживания
            var newMaintenance = new MaintenanceActual(this)
            {
                MaintenanceType  = maintenanceType,
                StartMaintenance = start,
                UnplannedReason  = unplannedReason
            };

            maintenance.Add(newMaintenance);

            //Изменить состояние объекта ремонта
            ChangeOperatingState(OperatingState.Maintenance, start);
            CurrentMaintenance = newMaintenance;

            //Если обслуживание окончено (известна дата окончания) то производим процедуру завершения обслуживания
            if (end != null)
            {
                FinalizeMaintenance(end.Value);
            }
        }
示例#2
0
        public void AddMaintenance(
            RepairObject repairObject,
            MaintenanceType maintenanceType,
            DateTime start,
            DateTime?end,
            MaintenanceReason unplannedReason
            )
        {
            //Добавить запись в журнал обслуживания
            var maintenance = new MaintenanceActual()
            {
                Type            = maintenanceType,
                Start           = start,
                Object          = repairObject,
                UnplannedReason = unplannedReason
            };

            repository.Save(maintenance);

            if (end != null)
            {
                FinalizeMaintenance(maintenance, end.Value);
            }
        }
示例#3
0
        /// <summary>
        /// Спланировать работы по обслуживанию
        /// </summary>
        /// <param name="period">Период планирования</param>
        /// <param name="offer">Предложение обслуживания</param>
        /// <param name="offerReason">Причина предложения</param>
        public void PlanningMaintenance(Period period, MaintenanceType offer = null, MaintenanceReason offerReason = null)
        {
            //если оборудование не эксплуатируется, то ничего не планируем
            if (CurrentOperatingState != OperatingState.Operating)
            {
                return;
            }


            //проверяем предыдущий период если план невыполнен то переносим в след период
            var prevPlan = plans.FirstOrDefault(x => x.MaintenanceDate >= period.Prev().Start() && x.MaintenanceDate <= period.Prev().End());

            if (prevPlan != null && !maintenance.Any(x => x.StartMaintenance >= period.Prev().Start() && x.StartMaintenance <= period.Prev().End()))
            {
                plans.Add(new MaintenancePlan(
                              this,
                              prevPlan.MaintenanceType,
                              period.Start(),
                              true,
                              false,
                              prevPlan.OfferReason
                              ));

                return;
            }

            ///сортируем интервалы по величине ремонта (самый крупный будет первым)
            var intervals = Intervals.ToList();

            intervals.Sort();

            var intervalsMap = intervals.ToDictionary(x => x.MaintenanceType.Id);
            var lastDateMap  = LastMaintenance.ToDictionary(x => x.MaintenanceType.Id, x => x.LastMaintenanceDate);
            var lastUsageMap = LastMaintenance.ToDictionary(x => x.MaintenanceType.Id, x => x.UsageFromLastMaintenance);

            var hours = period.Hours();

            intervals.Any(interval =>
            {
                var type = interval.MaintenanceType.Id;

                if (!lastUsageMap.ContainsKey(type))
                {
                    var newLast = new LastMaintenance(interval.MaintenanceType, null, null)
                    {
                        Object = this
                    };

                    lastMaintenance.Add(newLast);
                    lastUsageMap.Add(type, 0);
                    lastDateMap.Add(type, null);
                }

                //проверка по наработке
                if (interval.MinUsage != null)
                {
                    var fork        = interval.MaxUsage - interval.MinUsage;
                    var targetUsage = fork >= 5000 ? interval.MinUsage.Value + fork / 2 : interval.MinUsage.Value;

                    if (lastUsageMap[type].Value >= targetUsage)
                    {
                        //дата проведения обслуживания
                        var date = period.Start().AddDays((interval.MinUsage.Value - lastUsageMap[type].Value) / 24);

                        //если дата ремонта выходит за пределы периода, то устонавливаем её в пределы периода
                        if (date > period.End())
                        {
                            date = period.End();
                        }
                        if (date < period.Start())
                        {
                            date = period.Start();
                        }

                        plans.Add(new MaintenancePlan(this, interval.MaintenanceType, date));

                        return(true);
                    }
                }

                //проверка по времени
                if (interval.PeriodQuantity != null)
                {
                    //todo сделать проверку интервалов по времени
                }

                //проверка по предложению
                if (offer != null && offer.Id == type)
                {
                    plans.Add(new MaintenancePlan(this, interval.MaintenanceType, period.Start(), false, true, offerReason));

                    return(true);
                }

                return(false);
            });
        }