using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Http; using System.Web.Http.Results; namespace Xylem.Common.Service.MeterProcessState.Controllers { [RoutePrefix("api/RadioCheck")] public class RadioCheckController : ApiController { SqlConnection connection; public static class GlobalConfig { public static Lazy connectionString = new Lazy(() => System.Configuration.ConfigurationManager.ConnectionStrings["default"].ConnectionString ); } /// /// Contructor that initiates SQL Connection /// public RadioCheckController() { connection = new SqlConnection("Data Source=slasql01; Initial Catalog = Auftrag; User ID = sa; Password=sqlserver"); connection.Open(); } /// /// Function that gets all key-value pairs from Table Vako_Merkmale for this vakocode /// /// /// Dictinary with key-value pairs private Dictionary GetVakoMerkmale(String VakoCode) { String sql = string.Format("SELECT distinct * FROM Vako_Merkmale WHERE Basis = SUBSTRING('{0}',1,len(Basis)) AND (Charcode = SUBSTRING('{0}', Stelle, Laenge))", VakoCode); Dictionary VakoMerkmale = new Dictionary(); using (SqlCommand sqlcommand = new SqlCommand(sql, connection)) { using (SqlDataReader reader = sqlcommand.ExecuteReader()) { DataTable dataTable = new DataTable(); dataTable.Load(reader); foreach (DataRow row in dataTable.Rows) { try { if (row["Schluessel"].ToString().Length > 0) { VakoMerkmale.Add(row["Schluessel"].ToString(), row["Wert"].ToString()); } } //catch (Exception ex) //{ // // VakoMerkmal unter diesem Schlüssel wurde schon gesetzt, ignorieren //} finally { } } } return VakoMerkmale; } } /// /// GetLimitsFromDB /// Ermittelt aus der Tabelle [Cordonel_Radio_RSSI_Limits] die Min/Max RSSI Limits /// /// /// /// /// /// /// /// /// /// /// /// private Boolean GetLimitsFromDB(Int16 Frequenz, Int16 Nennweite, Int16 Baulaenge, Int16 BoxHead, Int32 Variant_o, Int32 Variant_p, out Byte RSSI_Pam_Min, out Byte RSSI_Pam_Max, out Byte RSSI_SEMI_Min, out Byte RSSI_SEMI_Max, out UInt32 LimitId) { String sql = $"SELECT top 1 * FROM [Cordonel_Radio_RSSI_Limits] WHERE [Box_Head]={BoxHead} and [Frequency] = {Frequenz} and [Nennweite] = {Nennweite} and ([Baulaenge] = {Baulaenge} or [Baulaenge] = 0) order by id desc "; //and [Variant_o] = {Variant_o} and [Variant_p] = {Variant_p} "; using (SqlCommand sqlcommand = new SqlCommand(sql, connection)) { using (SqlDataReader reader = sqlcommand.ExecuteReader()) { DataTable dataTable = new DataTable(); dataTable.Load(reader); if (dataTable.Rows.Count == 1) { DataRow row = dataTable.Rows[0]; RSSI_Pam_Max = Convert.ToByte(row["RSSI_Pam_Max"].ToString()); RSSI_Pam_Min = Convert.ToByte(row["RSSI_Pam_Min"].ToString()); RSSI_SEMI_Min = Convert.ToByte(row["RSSI_SEMI_Min"].ToString()); RSSI_SEMI_Max = Convert.ToByte(row["RSSI_SEMI_Max"].ToString()); LimitId = Convert.ToUInt32(row["Id"].ToString()); return true; } else { throw new Exception($"Kein passender Datensatz für SQL-Abfrage {sql}"); } } } } /// /// Erzeugt JSON mit RSSI Linits /// /// Nummer der SIRT-BOX-Kopf-Kombination /// FertigungausftragNr /// [Route("GetLimits/{BoxHead}/{OrderNr}")] public JsonResult GetLimits(Int16 BoxHead, Int32 OrderNr) { JObject jsonData = new JObject(); //try //{ String sql = $"SELECT * from AlleAuftragPositionen INNER JOIN IdentNr on AlleAuftragPositionen.IdentNr = IdentNr.IdentNr " + $"WHERE FertigungsauftragNr = {OrderNr.ToString()}"; using (SqlCommand sqlcommand = new SqlCommand(sql, connection)) { using (SqlDataReader reader = sqlcommand.ExecuteReader()) { DataTable dataTable = new DataTable(); dataTable.Load(reader); if (dataTable.Rows.Count == 0) { throw new Exception($"Es wurde kein Datensatz zur AuftragPosition {OrderNr.ToString()} gefunden!"); } // Get the first row DataRow row = dataTable.Rows[0]; String VakoCode = row["VakoCode"].ToString(); Dictionary VakoMerkmale = GetVakoMerkmale(VakoCode); String mf; mf = row["IdentNr"].ToString(); Int16 Baulaenge = Convert.ToInt16(VakoMerkmale["Baulaenge"]); Int16 Nennweite = Convert.ToInt16(VakoMerkmale["Nennweite"]); Int16 Frequenz = Convert.ToInt16(VakoMerkmale["RADIO"]); String RadiokeyArt; RadiokeyArt = VakoMerkmale["RADIO"]; jsonData.Add("Vako", JsonConvert.SerializeObject(VakoMerkmale, Formatting.None)); Byte RSSI_Pam_Min; Byte RSSI_Pam_Max; Byte RSSI_SEMI_Min; Byte RSSI_SEMI_Max; UInt32 LimitId; if (GetLimitsFromDB(Convert.ToInt16(Frequenz), Nennweite, Baulaenge, BoxHead, true ? 1 : 0, false ? 1 : 0, out RSSI_Pam_Min, out RSSI_Pam_Max, out RSSI_SEMI_Min, out RSSI_SEMI_Max, out LimitId)) { jsonData.Add("LimitId", LimitId); jsonData.Add("RSSI_PAM_Min", RSSI_Pam_Min); jsonData.Add("RSSI_PAM_Max", RSSI_Pam_Max); jsonData.Add("RSSI_SEMI_Min", RSSI_SEMI_Min); jsonData.Add("RSSI_SEMI_Max", RSSI_SEMI_Max); } return Json(JObject.FromObject(jsonData)); } } } public class SaveDataClass { public UInt32 RadioAdress { get; set; } public Byte RSSI_PAM { get; set; } public Byte RSSI_SEMI { get; set; } public Int32 LimitId { get; set; } public Byte Result { get; set; } } [Route("SaveRSSI"), HttpPost] public JsonResult SaveRSSI([FromBody] SaveDataClass SaveData) { JObject jsonData = new JObject(); saveRssiToDb(SaveData); jsonData.Add("message", "ok"); jsonData.Add("radiocheckid", saveRssiToDb(SaveData)); return Json(JObject.FromObject(jsonData)); } /// /// Speichert das SaveData Object /// /// private Int64 saveRssiToDb(SaveDataClass SaveData) { var sqlConnection = LaaPackages.SqlClient.SqlConnection.CreateSqlConnection(GlobalConfig.connectionString.Value); sqlConnection .CreateCommand($@" UPDATE Cordonel_Radio_RSSI_History SET IsLast = 0 WHERE RadioAdress = @{nameof(SaveData.RadioAdress)}") .SetParameter(nameof(SaveData.RadioAdress), (Int64)SaveData.RadioAdress) .ExecuteNonQuery(); return sqlConnection .CreateCommand($@" INSERT INTO Cordonel_Radio_RSSI_History ( RadioAdress , RSSI_PAM , RSSI_SEMI , Datum , LimitId , Result) OUTPUT inserted.id VALUES (@{nameof(SaveData.RadioAdress)} , @{nameof(SaveData.RSSI_PAM)} , @{nameof(SaveData.RSSI_SEMI)} , CURRENT_TIMESTAMP , @{nameof(SaveData.LimitId)} , @{nameof(SaveData.Result)})") .SetParameter(nameof(SaveData.RadioAdress), (Int64)SaveData.RadioAdress) .SetParameter(nameof(SaveData.RSSI_PAM), SaveData.RSSI_PAM) .SetParameter(nameof(SaveData.RSSI_SEMI), SaveData.RSSI_SEMI) .SetParameter(nameof(SaveData.LimitId), SaveData.LimitId) .SetParameter(nameof(SaveData.Result), SaveData.Result) .ExecuteScalar(x => x.GetValue(0)); } } }