/// <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); } }
/// <summary> /// Удалить обслуживание /// </summary> /// <param name="entity"></param> public void RemoveMaintenance(MaintenanceActual entity) { var lastMaintenanceMap = LastMaintenance.ToDictionary(x => x.MaintenanceType.Id); //восстанавливаем данные из снимка entity.Snapshot.ToList().ForEach(x => { var last = lastMaintenanceMap[x.MaintenanceType.Id]; last.UsageFromLastMaintenance = x.UsageFromLastMaintenance; last.LastMaintenanceDate = x.LastMaintenanceDate; }); //если это текущее обслуживание, то сбрасываем его if (!entity.IsFinalized() && CurrentMaintenance == entity) { CurrentMaintenance = null; } maintenance.Remove(entity); }
public void FinalizeMaintenance(MaintenanceActual maintenance, DateTime end) { //Сохраняем дату завершения обслуживания maintenance.End = end; repository.Save(maintenance); var objectId = maintenance.Object.Id; //Найти интервалы объекта var intervals = query.FindMaintenanceIntervalsByObjectId(objectId); //Взять интересующий интервал по типу обслуживания var targetInterval = intervals.SingleOrDefault(x => x.MaintenanceType == maintenance.Type); if (targetInterval == null) { throw new Exception("Не найден интервал для данного вида обслуживания"); } /* Выбрать интервалы для сброса. Сюда попадает интересующий нас интервал и более мелкие. * Т.е. Если проводится Средний ремонт, то сбрасываются Средний, Текущий и Обслуживание. */ var intervalsForReset = intervals.Where(x => x.Quantity <= targetInterval.Quantity).ToDictionary(i => i.MaintenanceType, i => i); var last = query.FindLastMaintenanceByObjectId(objectId); last.ToList().ForEach(lm => { if (intervalsForReset.ContainsKey(lm.MaintenanceType)) { lm.Reset(end); repository.Save(lm); } }); }
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); } }