/// <summary> /// Controla que la dif entre real y teorico no supere el porcentaje configurado de la capacidad. /// Devuelve True en caso de que no la haya superado y False en caso de que sí. /// </summary> /// <param name="tank"></param> /// <param name="vol"></param> /// <param name="tankVolumeDifferenceAlarm"></param> /// <param name="hasBeenBelowPercentageSinceLastEvent"></param> private bool ControlsTeoricVsRealDifference(Tanque tank, VolumenHistorico vol, double tankVolumeDifferenceAlarm, bool hasBeenBelowPercentageSinceLastEvent) { if (tankVolumeDifferenceAlarm != 0 && tankVolumeDifferenceAlarm != HighValue) { return(true); } var lastRealLevel = DaoFactory.VolumenHistoricoDAO.GetLastTankRealLevel(tank, vol.Fecha); if (Math.Abs((vol.Volumen - lastRealLevel.Volumen)) > tankVolumeDifferenceAlarm) { if (hasBeenBelowPercentageSinceLastEvent) { FuelMessageSaver.CreateNewEvent(null, tank.Codigo, CodeTDifRealVsTeoricoSuperada, String.Format(MsgTDifRealVsTeoricoSuperada, lastRealLevel.Volumen, vol.Volumen), vol.Fecha); STrace.Trace(GetType().FullName, String.Format("Teorical versus real levels warning refference reached for tank: {0} (real: {1} - teorical: {2} - date: {3}).", tank.Descripcion, lastRealLevel.Volumen, vol.Volumen, vol.Fecha)); } else { STrace.Trace(GetType().FullName, String.Format( @"Teorical versus real levels warning refference reached for tank: {0} (real: {1} - teorical: {2} - date: {3}) || A previos warning already exists (no event was raised).", tank.Descripcion, lastRealLevel.Volumen, vol.Volumen, vol.Fecha)); } return(false); } return(true); }
/// <summary> /// Cheks if the tank teoric level has gone under its capacity since last genereted "TEORICO_SUPERA_CAPACIDAD" event. /// </summary> /// <param name="tank"></param> /// <param name="vol"></param> /// <returns></returns> private bool HasBeenUnderCapacitySinceLastEvent(Tanque tank, VolumenHistorico vol) { var lastMessageDate = DaoFactory.TanqueDAO.FindLastMessageByCode(tank.Id, CodeTTeoricoSuperaCapacidad); var lastUnderCapacityDate = DaoFactory.VolumenHistoricoDAO.FindLastTeoricVolumeUnderCapacity(tank.Id, vol.Fecha); return(lastMessageDate == null || lastUnderCapacityDate == null || (lastUnderCapacityDate.Fecha > lastMessageDate.Fecha)); }
/// <summary> /// Cheks if the HistoricalVolume of a tank values have changed compared with the last value inserted /// </summary> /// <param name="vol"></param> /// <returns></returns> private static bool TankVolumeHasChanged(VolumenHistorico vol) { VolumenHistorico m; LastTankNivel.TryGetValue(vol.Tanque.Codigo, out m); return(!vol.Equals(m)); }
/// <summary> /// Sets the last value changed in dictionary. /// </summary> /// <param name="vol"></param> private static void SetLastTankHistoricalVolumeChanged(VolumenHistorico vol) { if (LastTankNivel.ContainsKey(vol.Tanque.Codigo)) { LastTankNivel.Remove(vol.Tanque.Codigo); } LastTankNivel.Add(vol.Tanque.Codigo, vol); }
/// <summary> /// Controla que el volumen teorico no pase de positivo a negativo. /// </summary> /// <param name="tank"></param> /// <param name="actualVolume"></param> /// <param name="vol"></param> private void ControlsNegativeTeoricVolume(Tanque tank, double actualVolume, VolumenHistorico vol) { if (actualVolume < 0 || vol.Volumen >= 0) { return; } FuelMessageSaver.CreateNewEvent(null, tank.Codigo, CodeTTeoricoNegativo, String.Format(MsgTTeoricoNegativo, vol.Volumen), vol.Fecha); STrace.Trace(GetType().FullName, String.Format("Negative volume detected for tank: {0} (volume: {1})", tank.Descripcion, vol.Volumen)); }
/// <summary> /// Determina si el tanque estuvo debajo del porcentaje configurado desde el ultimo reporte. /// </summary> /// <param name="tank"></param> /// <param name="vol"></param> /// <param name="volDif"></param> /// <returns></returns> private bool HasBeenBelowPercentageSinceLastEvent(Tanque tank, VolumenHistorico vol, double volDif) { var lastMessage = DaoFactory.TanqueDAO.FindLastMessageByCode(tank.Id, CodeTDifRealVsTeoricoSuperada); if (lastMessage == null) { STrace.Error(GetType().FullName, "Last message date was NULL"); return(true); } var lastMovementBelowDifference = DaoFactory.VolumenHistoricoDAO.FindLastTeoricVolumeBelowRealAndTeoricDifference(tank.Id, vol.Fecha, lastMessage.Fecha, volDif); return(lastMovementBelowDifference != null); }
/// <summary> /// Controla que el volumen teorico no supere la capacidad del tanque. /// </summary> /// <param name="tank"></param> /// <param name="vol"></param> private void ControlsTeoricVolumeExceededTankCapacity(Tanque tank, VolumenHistorico vol) { if (vol.Volumen <= tank.Capacidad) { return; } if (HasBeenUnderCapacitySinceLastEvent(tank, vol)) { FuelMessageSaver.CreateNewEvent(null, tank.Codigo, CodeTTeoricoSuperaCapacidad, String.Format(MsgTTeoricoSuperaCapacidad, tank.Capacidad, vol.Volumen), vol.Fecha); STrace.Trace(GetType().FullName, String.Format("Teorical max volume exceded for tank: {0} (volume: {1} - capacity: {2}).", tank.Descripcion, vol.Volumen, tank.Capacidad)); } else { STrace.Trace(GetType().FullName, String.Format("Teorical max volume exceded for tank: {0} (volume: {1} - capacity: {2}) || A previos warning already exists (no event was raised)", tank.Descripcion, vol.Volumen, tank.Capacidad)); } }
/// <summary> /// Parses a T type Message. /// </summary> /// <param name="daoFactory"></param> /// <param name="center"></param> /// <param name="code"></param> /// <param name="alias"></param> /// <param name="volumen"></param> /// <param name="volumenAgua"></param> /// <param name="fecha"></param> /// <param name="events"></param> /// <returns></returns> public VolumenHistorico ProcessTanque(DAOFactory daoFactory, String center, String code, String alias, Double volumen, Double volumenAgua, DateTime fecha, String events) { var vol = new VolumenHistorico { Fecha = fecha, Volumen = volumen, EsTeorico = false, Tanque = daoFactory.TanqueDAO.FindByCode(code), VolumenAgua = volumenAgua }; if (vol.Tanque == null) { vol.Tanque = CreateTanque(daoFactory, center, code, alias); } if (!vol.Tanque.Descripcion.Equals(alias)) { UpdateTankDescription(daoFactory, vol.Tanque, alias); } try { EventHelper.ProcessTankEvents(center, code, events, fecha); EventHelper.EvaluateStockCriticoAndReposicion(vol.Volumen, vol.Tanque, fecha); EventHelper.EvaluteWaterLevel(vol.VolumenAgua, vol.Tanque, fecha); } catch (Exception) { STrace.Error(GetType().FullName, String.Format("Events: {0}", events)); throw; } if (TankVolumeHasChanged(vol)) { SetLastTankHistoricalVolumeChanged(vol); return(vol); } return(null); }
public void addHistoricalVolumeLog(VolumenHistorico vol) { historicalVolumesLog.Add(vol); }
public void addHistoricalVolume(VolumenHistorico vol) { historicalVolumes.Add(vol); }