/// <summary> /// Прибавляет заданную наработку к уже существующей /// </summary> /// <param name="lifelength"></param> public void Add(Lifelength lifelength) { // прибавляем к this // null + cycles = cycles // cycles + null = cycles // null + null = null // cycles + cycles = cycles + cycles if (Cycles == null && lifelength.Cycles != null) { Cycles = lifelength.Cycles; } else if (Cycles != null && lifelength.Cycles != null) { Cycles += lifelength.Cycles; } if (Days == null && lifelength.Days != null) { Days = lifelength.Days; } else if (Days != null && lifelength.Days != null) { Days += lifelength.Days; } if (TotalMinutes == null && lifelength.TotalMinutes != null) { TotalMinutes = lifelength.TotalMinutes; } else if (TotalMinutes != null && lifelength.TotalMinutes != null) { TotalMinutes += lifelength.TotalMinutes; } }
/// <summary> /// Метод проверяет, является ли данная наработка строго меньшей заданной по всем трем параметрам /// </summary> /// <param name="lifelength"></param> /// <param name="strictCompare"></param> /// <returns></returns> public bool IsLess(Lifelength lifelength, bool strictCompare = true) { if (Cycles != null && lifelength.Cycles != null && Cycles < lifelength.Cycles && TotalMinutes != null && lifelength.TotalMinutes != null && TotalMinutes < lifelength.TotalMinutes && Days != null && lifelength.Days != null && Days < lifelength.Days) { return(true); } return(false); }
/// <summary> /// Копирует наработку (Создает новую наработку с такими же параметрами) /// </summary> /// <param name="source"></param> public Lifelength(Lifelength source) { if (source == null) { return; } // Cycles = source.Cycles; CalendarSpan = new CalendarSpan(source.CalendarSpan); TotalMinutes = source.TotalMinutes; }
/* * Методы */ #region public void Resemble(Lifelength sample) /// <summary> /// Сделать похожим на заданный ресурс. Т.е. если не заданы часы - сделать часы n/a и т.д. /// </summary> /// <param name="sample"></param> public void Resemble(Lifelength sample) { if (sample.TotalMinutes == null) { TotalMinutes = null; } if (sample.Cycles == null) { Cycles = null; } if (sample.Days == null) { Days = null; } }
/// <summary> /// Дополняет пустые параметры текущего объекта параметрами из источника /// </summary> /// <param name="source"></param> public void CompleteNullParameters(Lifelength source) { if (Cycles == null) { Cycles = source.Cycles; } if (TotalMinutes == null) { TotalMinutes = source.TotalMinutes; } if (Days == null) { Days = source.Days; } }
/// <summary> /// Конвертирует данные из БД в Lifelength /// </summary> /// <param name="data"></param> public static Lifelength ConvertFromByteArray(byte[] data) { Lifelength item = new Lifelength(); byte[] binaryData = data; if (null == binaryData) { return(null); } if (binaryData == null || binaryData.Length != SerializedDataLength) { return(null); //на случай если -1 пришел } //throw new ArgumentException("Data cannot be converted to Lifelength"); item.Cycles = DbTypes.Int32FromByteArray(binaryData, 1); var calendar = DbTypes.Int64FromByteArray(binaryData, 5); var cal = new TimeSpan(calendar); item.CalendarSpan = new CalendarSpan(cal.Days, (CalendarTypes)cal.Milliseconds); var ticks = DbTypes.Int64FromByteArray(binaryData, 13); var ts = new TimeSpan(ticks); item.TotalMinutes = ts.Minutes + ((int)ts.TotalHours) * 60; if ((binaryData[0] & 1) == 0) { item.Days = null; } if ((binaryData[0] >> 1 & 1) == 0) { item.Cycles = null; } if ((binaryData[0] >> 2 & 1) == 0) { item.Hours = null; } return(item); }
/// <summary> /// Метод проверяет, является ли данная наработка меньше заданной по любому из трех параметров /// </summary> /// <param name="lifelength"></param> /// <returns></returns> public bool IsLessByAnyParameter(Lifelength lifelength) { //Cycles if (Cycles != null && lifelength.Cycles != null && Cycles < lifelength.Cycles) { return(true); } // TotalMinutes if (TotalMinutes != null && lifelength.TotalMinutes != null && TotalMinutes < lifelength.TotalMinutes) { return(true); } // Days if (Days != null && lifelength.Days != null && Days < lifelength.Days) { return(true); } return(false); }
/// <summary> /// По выходу объект будет представлять содержитать минимальных ресурсов от обоих объектов (whichever first) /// </summary> /// <param name="candidate"></param> public void SetMin(Lifelength candidate) { // Если у кандидата циклы меньше чем у текущего объекта - присваиваем минимальные циклы if (candidate.Cycles != null && (Cycles == null || Cycles > candidate.Cycles)) { Cycles = candidate.Cycles; } // то же по часам if (candidate.TotalMinutes != null && (TotalMinutes == null || TotalMinutes > candidate.TotalMinutes)) { TotalMinutes = candidate.TotalMinutes; } // то же по календарю if (candidate.Days != null && (Days == null || Days > candidate.Days)) { Days = candidate.Days; } }
/* * Арифметика */ #region public bool IsGreaterByAnyParameter(Lifelength lifelength) /// <summary> /// Метод проверяет, является ли данная наработка больше заданной по любому из трех параметров /// </summary> /// <param name="lifelength"></param> /// <returns></returns> public bool IsGreaterByAnyParameter(Lifelength lifelength) { // 10, 10, 10 > 5, 5, 5 // 10, 10, 10 > 5, 20, 5 //Cycles if (Cycles != null && lifelength.Cycles != null && Cycles > lifelength.Cycles) { return(true); } // TotalMinutes if (TotalMinutes != null && lifelength.TotalMinutes != null && TotalMinutes > lifelength.TotalMinutes) { return(true); } // Days if (Days != null && lifelength.Days != null && Days > lifelength.Days) { return(true); } return(false); }
/// <summary> /// Прибавляет заданную наработку к уже существующей /// </summary> /// <param name="from"></param> /// <param name="lifelength"></param> public void Add(DateTime from, Lifelength lifelength) { // прибавляем к this // null + cycles = cycles // cycles + null = cycles // null + null = null // cycles + cycles = cycles + cycles if (Cycles == null && lifelength.Cycles != null) { Cycles = lifelength.Cycles; } else if (Cycles != null && lifelength.Cycles != null) { Cycles += lifelength.Cycles; } if (TotalMinutes == null && lifelength.TotalMinutes != null) { TotalMinutes = lifelength.TotalMinutes; } else if (TotalMinutes != null && lifelength.TotalMinutes != null) { TotalMinutes += lifelength.TotalMinutes; } if (CalendarValue == null && lifelength.CalendarValue != null) { DateTime to = from.AddCalendarSpan(lifelength.CalendarSpan); Days = (to - from).Days; } else if (Days != null && lifelength.Days != null) { DateTime to = from.AddCalendarSpan(lifelength.CalendarSpan); Days += (to - from).Days; } }
/// <summary> /// Возвращает (задает) наработку на заданное число и по заданному режиму /// </summary> /// <param name="flightRegime"></param> /// <param name="date"></param> /// <returns></returns> private Lifelength this[DateTime date, FlightRegime flightRegime] { get { if (flightRegime == null) { flightRegime = FlightRegime.UNK; } if (_Array.ContainsKey(flightRegime)) { if (_Array[flightRegime] == null) { _Array[flightRegime] = new SortedDictionary <DateTime, Lifelength>(); } } else { _Array.Add(flightRegime, new SortedDictionary <DateTime, Lifelength>()); } SortedDictionary <DateTime, Lifelength> array = _Array[flightRegime]; if (date.Date > DateTime.Today) { Lifelength res = _Array.Count > 0 ? new Lifelength(array.Last().Value) : Lifelength.Zero; res.Add(LifelengthSubResource.Calendar, (date.Date - DateTime.Today).Days); return(res); } if (date.Date < _startDate.Date) { return(new Lifelength((_startDate.Date - date.Date).Days, 0, 0)); } return(array.ContainsKey(date.Date) ? array[date.Date] : null); } set { if (flightRegime == null) { flightRegime = FlightRegime.UNK; } if (_Array.ContainsKey(flightRegime)) { if (_Array[flightRegime] == null) { _Array[flightRegime] = new SortedDictionary <DateTime, Lifelength>(); } } else { _Array.Add(flightRegime, new SortedDictionary <DateTime, Lifelength>()); } SortedDictionary <DateTime, Lifelength> array = _Array[flightRegime]; if (array.ContainsKey(date.Date)) { array[date.Date] = value; } else { if (date.Date >= _startDate.Date && date.Date <= DateTime.Today) { array.Add(date.Date, value); } } } }
/// <summary> /// Устанавливает подсчитанную наработку на конец дня /// </summary> /// <param name="date">День на который необходимо вернуть наработку</param> /// <param name="value">значение подсчитанной наработки</param> /// <returns></returns> public void SetLifelengthOnEndOfDay(DateTime date, Lifelength value) { SetClosingLifelength(date, FlightRegime.UNK, value); }
/// <summary> /// Устанавливает подсчитанную наработку на начало дня /// </summary> /// <param name="date">День на который необходимо вернуть наработку</param> /// <param name="value">значение подсчитанной наработки</param> /// <returns></returns> public void SetLifelengthOnStartOfDay(DateTime date, Lifelength value) { SetLifelengthOnStartOfDay(date, FlightRegime.UNK, value); }
/// <summary> /// Устанавливает подсчитанную наработку на конец дня на заданном режиме /// </summary> /// <param name="date">День на который необходимо вернуть наработку</param> /// <param name="flightRegime">режим работы</param> /// <param name="value">значение подсчитанной наработки</param> /// <returns></returns> public void SetClosingLifelength(DateTime date, FlightRegime flightRegime, Lifelength value) { this[date, flightRegime ?? FlightRegime.UNK] = value; }
/// <summary> /// Устанавливает подсчитанную наработку на начало дня на заданном режиме /// </summary> /// <param name="date">День на который необходимо вернуть наработку</param> /// <param name="flightRegime">режим работы</param> /// <param name="value">значение подсчитанной наработки</param> /// <returns></returns> public void SetLifelengthOnStartOfDay(DateTime date, FlightRegime flightRegime, Lifelength value) { this[date.AddDays(-1), flightRegime ?? FlightRegime.UNK] = value; }
/// <summary> /// Отнимает заданную наработку от уже существующей /// </summary> /// <param name="lifelength"></param> public void Substract(Lifelength lifelength) { Lifelength lifelength2 = new Lifelength(-lifelength.Days, -lifelength.Cycles, -lifelength.TotalMinutes); Add(lifelength2); }