399 lines · 13.9 KB · C#
RawDownload
using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.ComponentModel.DataAnnotations;using System.Data;using System.Linq;using GSF;using GSF.Data;using GSF.TimeSeries.UI;using GSF.TimeSeries.UI.DataModels; namespace PowerCalculations.UI.DataModels{	public class PowerCalculation : DataModelBase	{ 		#region [ Members ] 		private int m_id;		private string m_circuitDescription;        private Measurement m_activePowerOutputMeasurement;        private Measurement m_reactivePowerOutputMeasurement;        private Measurement m_apparentPowerOutputMeasurement;		private bool m_enabled;		private Guid m_nodeID;		private Phasor m_voltagePhasor;		private Phasor m_currentPhasor; 		#endregion 		#region [ Properties ] 		public int ID		{			get { return m_id; }			set			{				if (m_id == value) return;				m_id = value;				OnPropertyChanged(nameof(ID));			}		} 		[Required(ErrorMessage = "Power calculation description is a required field. Please provide a value.")]		[StringLength(4000, ErrorMessage = "Power calculation description cannot exceed 4000 characters")]		public string CircuitDescription		{			get { return m_circuitDescription; }			set			{				if (m_circuitDescription == value) return;				m_circuitDescription = value;				OnPropertyChanged(nameof(CircuitDescription));			}		} 		public Measurement ActivePowerOutputMeasurement		{			get { return m_activePowerOutputMeasurement; }			set			{				if (m_activePowerOutputMeasurement == value) return;				m_activePowerOutputMeasurement = value;				OnPropertyChanged(nameof(ActivePowerOutputMeasurement));			}		} 		public Measurement ReactivePowerOutputMeasurement		{			get { return m_reactivePowerOutputMeasurement; }			set			{				if (m_reactivePowerOutputMeasurement == value) return;				m_reactivePowerOutputMeasurement = value;				OnPropertyChanged(nameof(ReactivePowerOutputMeasurement));			}		} 		public Measurement ApparentPowerOutputMeasurement		{			get { return m_apparentPowerOutputMeasurement; }			set			{				if (m_apparentPowerOutputMeasurement == value) return;				m_apparentPowerOutputMeasurement = value;				OnPropertyChanged(nameof(ApparentPowerOutputMeasurement));			}		} 		[Required(ErrorMessage = "Enabled is a required field. Please enter a value for the enabled flag.")]		public bool Enabled		{			get { return m_enabled; }			set			{				if (m_enabled == value) return;				m_enabled = value;				OnPropertyChanged(nameof(Enabled));			}		} 		[Required(ErrorMessage = "Node ID is a required field. Please enter a value for the Node ID.")]		public Guid NodeID		{			get { return m_nodeID; }			set			{				if (m_nodeID == value) return;				m_nodeID = value;				OnPropertyChanged(nameof(NodeID));			}		} 		public Phasor VoltagePhasor		{			get { return m_voltagePhasor; }			set			{				if (m_voltagePhasor == value) return;				m_voltagePhasor = value;				OnPropertyChanged(nameof(VoltagePhasor));                UpdateCircuitDescription();            }		} 		public Phasor CurrentPhasor		{			get { return m_currentPhasor; }			set			{				if (m_currentPhasor == value) return;				m_currentPhasor = value;				OnPropertyChanged(nameof(CurrentPhasor));                UpdateCircuitDescription();            }        }         private void UpdateCircuitDescription()        {            if ((object)m_voltagePhasor != null && (object)m_currentPhasor != null)                CircuitDescription = $"{LookupDeviceName(m_voltagePhasor.DeviceID)}-{(m_currentPhasor.Label ?? "").ToUpperInvariant().RemoveWhiteSpace()}";        }          #endregion          #region [ Statics ]         /// <summary>        /// LoadKeys <see cref="PowerCalculation"/> information as an <see cref="ObservableCollection{T}"/> style list.        /// </summary>        /// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param>        /// <returns>Collection of <see cref="int"/>.</returns>        public static IList<int> LoadKeys(AdoDataConnection database)		{			var createdConnection = false; 			try			{				createdConnection = CreateConnection(ref database); 				var calculationList = new List<int>();				var queryFormat = "SELECT ID FROM PowerCalculation WHERE NodeID = {0}";				var calculationTable = database.RetrieveData(queryFormat, database.CurrentNodeID()); 				foreach (DataRow row in calculationTable.Rows)				{					calculationList.Add(row.ConvertField<int>("ID"));				} 				return calculationList;			}			finally			{				if (createdConnection && database != null)					database.Dispose();			}		}         private static string LookupDeviceName(int deviceID)        {            AdoDataConnection database = null;            string deviceName = "";             if (CreateConnection(ref database))            {                deviceName = database.ExecuteScalar<string>("SELECT Acronym FROM Device WHERE ID={0}", deviceID) ?? "";                database.Dispose();            }             return deviceName;        } 		/// <summary>		/// Loads <see cref="PowerCalculation"/> information as an <see cref="ObservableCollection{T}"/> style list.		/// </summary>		/// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param>		/// <param name="keys">Keys of the measurement to be loaded from the database</param>		/// <returns>Collection of <see cref="PowerCalculation"/>.</returns>		public static ObservableCollection<PowerCalculation> Load(AdoDataConnection database, IList<int> keys)		{			var createdConnection = false; 			try			{				createdConnection = CreateConnection(ref database); 				PowerCalculation[] calculationList = null; 				if (keys != null && keys.Count > 0)				{					var commaSeparatedKeys = keys.Select(key => key.ToString()).Aggregate((str1, str2) => str1 + "," + str2);					var query = string.Format("select pc.ID, pc.CircuitDescription, pc.VoltageAngleSignalID, pc.VoltageMagSignalID, pc.CurrentAngleSignalID, " +		 									  "       pc.CurrentMagSignalID, pc.ActivePowerOutputSignalID, pc.ReactivePowerOutputSignalID, pc.ApparentPowerOutputSignalID, pc.Enabled, " +											  "	   pc.nodeid, vp.id voltagePhasorID, cp.id as currentPhasorID " +											  "from powercalculation pc " +											  "     left join measurement vm " +											  "	 on pc.voltagemagsignalid=vm.signalid " +											  "	 left join measurement cm " +											  "	 on pc.currentmagsignalid=cm.signalid " +											  "	 left join phasor vp " +											  "	 on vm.deviceid=vp.deviceid and vm.phasorsourceindex=vp.sourceindex " +											  "	 left join phasor cp " +											  " on cm.deviceid=cp.deviceid and cm.phasorsourceindex=cp.sourceindex WHERE pc.ID IN ({0})", commaSeparatedKeys);					var calculationTable = database.Connection.RetrieveData(database.AdapterType, query, DefaultTimeout);					calculationList = new PowerCalculation[calculationTable.Rows.Count]; 					foreach (DataRow row in calculationTable.Rows)					{						var id = row.ConvertField<int>("ID"); 						var voltageAngle = database.Guid(row, "VoltageAngleSignalID");						var voltageMagnitude = database.Guid(row, "VoltageMagSignalID");						var currentAngle = database.Guid(row, "CurrentAngleSignalID");						var currentMagnitude = database.Guid(row, "CurrentMagSignalID"); 						Guid? activePower = null;						if (!row.IsNull("ActivePowerOutputSignalID"))							activePower = database.Guid(row, "ActivePowerOutputSignalID"); 						Guid? reactivePower = null;						if (!row.IsNull("ReactivePowerOutputSignalID"))							reactivePower = database.Guid(row, "ReactivePowerOutputSignalID"); 						Guid? apparentPower = null;						if (!row.IsNull("ApparentPowerOutputSignalID"))							apparentPower = database.Guid(row, "ApparentPowerOutputSignalID"); 						var currentPhasorID = row.ConvertField<int>("currentPhasorID");						var voltagePhasorID = row.ConvertField<int>("voltagePhasorID");						var phasors = Phasor.Load(database, new List<int> {currentPhasorID, voltagePhasorID}); 						calculationList[keys.IndexOf(id)] = new PowerCalculation						{							ID = row.ConvertField<int>("ID"),							CircuitDescription = row.Field<string>("CircuitDescription"),							Enabled = row.ConvertField<bool>("Enabled"),							NodeID = database.Guid(row, "NodeID")						}; 						foreach (var phasor in phasors)						{							if (phasor.ID == currentPhasorID)							{								calculationList[keys.IndexOf(id)].CurrentPhasor = phasor;							}							else if (phasor.ID == voltagePhasorID)							{								calculationList[keys.IndexOf(id)].VoltagePhasor = phasor;							}						} 						var mkeys = new List<Guid> { voltageAngle, voltageMagnitude, currentAngle, currentMagnitude };						if (activePower != null) { mkeys.Add(activePower.Value); }						if (reactivePower != null) { mkeys.Add(reactivePower.Value); }						if (apparentPower != null) { mkeys.Add(apparentPower.Value); }						var measurements = Measurement.LoadFromKeys(database, mkeys);						foreach (var measurement in measurements)						{							if (measurement.SignalID == voltageAngle)							{								calculationList[keys.IndexOf(id)].VoltagePhasor.AngleMeasurement = measurement;							}							else if (measurement.SignalID == voltageMagnitude)							{								calculationList[keys.IndexOf(id)].VoltagePhasor.MagnitudeMeasurement = measurement;							}							else if (measurement.SignalID == currentAngle)							{								calculationList[keys.IndexOf(id)].CurrentPhasor.AngleMeasurement = measurement;							}							else if (measurement.SignalID == currentMagnitude)							{								calculationList[keys.IndexOf(id)].CurrentPhasor.MagnitudeMeasurement = measurement;							}							else if (measurement.SignalID == activePower)							{								calculationList[keys.IndexOf(id)].ActivePowerOutputMeasurement = measurement;							}							else if (measurement.SignalID == reactivePower)							{								calculationList[keys.IndexOf(id)].ReactivePowerOutputMeasurement = measurement;							}							else if (measurement.SignalID == apparentPower)							{								calculationList[keys.IndexOf(id)].ApparentPowerOutputMeasurement = measurement;							}						}					}  				} 				return new ObservableCollection<PowerCalculation>(calculationList ?? new PowerCalculation[0]);			}			finally			{				if (createdConnection && database != null)					database.Dispose();			}		} 		/// <summary>		/// Deletes specified <see cref="PowerCalculation"/> record from database.		/// </summary>		/// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param>		/// <param name="id">ID of the record to be deleted.</param>		/// <returns>String, for display use, indicating success.</returns>		public static string Delete(AdoDataConnection database, int id)		{			bool createdConnection = false; 			try			{				createdConnection = CreateConnection(ref database); 				// Setup current user context for any delete triggers				CommonFunctions.SetCurrentUserContext(database); 				database.Connection.ExecuteNonQuery(database.ParameterizedQueryString("DELETE FROM PowerCalculation WHERE ID = {0}", "companyID"), DefaultTimeout, id); 				return "Power Calculation deleted successfully";			}			finally			{				if (createdConnection && database != null)					database.Dispose();			}		} 		/// <summary>		/// Saves <see cref="Company"/> information to database.		/// </summary>		/// <param name="database"><see cref="AdoDataConnection"/> to connection to database.</param>		/// <param name="powerCalculation">Information about <see cref="PowerCalculation"/>.</param>        		/// <returns>String, for display use, indicating success.</returns>		public static string Save(AdoDataConnection database, PowerCalculation powerCalculation)		{			bool createdConnection = false;			string query; 			try			{				createdConnection = CreateConnection(ref database); 				if (powerCalculation.ID == 0)				{					query = "INSERT INTO PowerCalculation (CircuitDescription, VoltageAngleSignalID, VoltageMagSignalID, CurrentAngleSignalID, CurrentMagSignalID, ActivePowerOutputSignalID, ReactivePowerOutputSignalID, ApparentPowerOutputSignalID, Enabled, NodeID) " +						"VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9})"; 					database.ExecuteNonQuery(DefaultTimeout, query, powerCalculation.CircuitDescription, powerCalculation.VoltagePhasor.AngleMeasurement.SignalID,						powerCalculation.VoltagePhasor.MagnitudeMeasurement.SignalID, powerCalculation.CurrentPhasor.AngleMeasurement.SignalID, powerCalculation.CurrentPhasor.MagnitudeMeasurement.SignalID,						(object)powerCalculation.ActivePowerOutputMeasurement?.SignalID ?? DBNull.Value, (object)powerCalculation.ReactivePowerOutputMeasurement?.SignalID ?? DBNull.Value, (object)powerCalculation.ApparentPowerOutputMeasurement?.SignalID ?? DBNull.Value,						powerCalculation.Enabled, database.CurrentNodeID());				}				else				{					query = "UPDATE PowerCalculation SET CircuitDescription = {0}, VoltageAngleSignalID = {1}, VoltageMagSignalID = {2}, CurrentAngleSignalID = {3}, CurrentMagSignalID = {4}, " +						"activePowerOutputSignalID = {5}, ReactivePowerOutputSignalID = {6}, ApparentPowerOutputSignalID = {7}, Enabled = {8} WHERE ID = {9}"; 					database.ExecuteNonQuery(DefaultTimeout, query, powerCalculation.CircuitDescription,						database.Guid(powerCalculation.VoltagePhasor.AngleMeasurement.SignalID), powerCalculation.VoltagePhasor.MagnitudeMeasurement.SignalID, powerCalculation.CurrentPhasor.AngleMeasurement.SignalID, powerCalculation.CurrentPhasor.MagnitudeMeasurement.SignalID,						(object)powerCalculation.ActivePowerOutputMeasurement?.SignalID ?? DBNull.Value, (object)powerCalculation.ReactivePowerOutputMeasurement?.SignalID ?? DBNull.Value, (object)powerCalculation.ApparentPowerOutputMeasurement?.SignalID ?? DBNull.Value, powerCalculation.Enabled, powerCalculation.ID);				} 				return "Power Calculation information saved successfully";			}			finally			{				if (createdConnection && database != null)					database.Dispose();			}		} 		#endregion 	}}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t