laatzen/Common/Service/MeterProcessState/Controllers/RadioCheckController.cs

257 lines
10 KiB
C#

using Common.Logic.Extensions.SQL;
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<String> connectionString = new Lazy<String>(()
=>
System.Configuration.ConfigurationManager.ConnectionStrings["default"].ConnectionString
);
}
/// <summary>
/// Contructor that initiates SQL Connection
/// </summary>
public RadioCheckController()
{
connection = new SqlConnection("Data Source=slasql01; Initial Catalog = Auftrag; User ID = sa; Password=sqlserver");
connection.Open();
}
/// <summary>
/// Function that gets all key-value pairs from Table Vako_Merkmale for this vakocode
/// </summary>
/// <param name="VakoCode"></param>
/// <returns>Dictinary with key-value pairs</returns>
private Dictionary<String, String> 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<String, String> VakoMerkmale = new Dictionary<String, String>();
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;
}
}
/// <summary>
/// GetLimitsFromDB
/// Ermittelt aus der Tabelle [Cordonel_Radio_RSSI_Limits] die Min/Max RSSI Limits
/// </summary>
/// <param name="Frequenz"></param>
/// <param name="Nennweite"></param>
/// <param name="Baulaenge"></param>
/// <param name="BoxHead"></param>
/// <param name="Variant_o"></param>
/// <param name="Variant_p"></param>
/// <param name="RSSI_Pam_Min"></param>
/// <param name="RSSI_Pam_Max"></param>
/// <param name="RSSI_SEMI_Min"></param>
/// <param name="RSSI_SEMI_Max"></param>
/// <returns></returns>
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}");
}
}
}
}
/// <summary>
/// Erzeugt JSON mit RSSI Linits
/// </summary>
/// <param name="BoxHead">Nummer der SIRT-BOX-Kopf-Kombination </param>
/// <param name="OrderNr">FertigungausftragNr</param>
/// <returns></returns>
[Route("GetLimits/{BoxHead}/{OrderNr}")]
public JsonResult<JObject> 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<String, String> 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<JObject> SaveRSSI([FromBody] SaveDataClass SaveData)
{
JObject jsonData = new JObject();
saveRssiToDb(SaveData);
jsonData.Add("message", "ok");
jsonData.Add("radiocheckid", saveRssiToDb(SaveData));
return Json(JObject.FromObject(jsonData));
}
/// <summary>
/// Speichert das SaveData Object
/// </summary>
/// <param name="SaveData"></param>
private Int64 saveRssiToDb(SaveDataClass SaveData)
{
var sqlConnection = 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<Int64>(0));
}
}
}