/// <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); } }
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); } }
/// <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); }); }