/// /// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Linq; using log4net; #if MANAGED using Oracle.ManagedDataAccess.Client; #else using Oracle.DataAccess.Client; #endif using Common; namespace TBF.Rig.Output.DB.SensusOracle { public class VtWztypSd { private static readonly ILog log = LogManager.GetLogger(typeof(VtWztypSd)); public int IdWztyp; public int RevWztyp; public string Wztyp; public string Art; public string Metrolklasse; public string Zulasszeichen; public double Impulsrate; public double Kontaktwert; public bool Warmpruefen; public bool Optikaufsetzen; public string Formatausdruck; public string Formatetikett; public string Formatnetzwerk; public string Formatzaehlernr; public int IdWzgruppe; public int Anzahlpruefungen; public string Materialnr; public float Qmax; public byte Pruefart; public byte Zaehlerflag; public double Korrekturwert; public int IdBenutzer; public DateTime Aenderungsdatum; public string Bemerkung; public bool Verwendet; public IList ListOfTests; /// null = To be loaded /// /// Default constructor /// public VtWztypSd() { ListOfTests = null; } /// /// Create VtWztypSd object from a batch. /// /// /// public static VtWztypSd FromBatch(Results.Entities.Batch batch, int idBenutzer) { var sampleWM = batch.WaterMeters.FirstOrDefault(x => (x != null && !x.Disabled && x.WaterMeterData != null)); if (sampleWM == null) return null; var wmData = sampleWM.WaterMeterData; if (wmData == null) return null; int adjTestsCount = 0; /// Negative number int finalTestsCount = 0; /// Positive number foreach (var tr in batch.TestRslts) { if (tr.TestData.Publish == (sbyte)Publish.OnScreen) adjTestsCount--; if (tr.TestData.Publish == (sbyte)Publish.Always && tr.TestData.Evaluate) finalTestsCount++; } var listOfTests = new List(); foreach (var tr in batch.TestRslts) { if (tr.TestData.Publish == (sbyte)Publish.OnScreen) listOfTests.Add(VtPruefpunktSollSd.FromTestRslt(tr, adjTestsCount++, (float)wmData.Q3_Qn)); if (tr.TestData.Publish == (sbyte)Publish.Always && tr.TestData.Evaluate) listOfTests.Add(VtPruefpunktSollSd.FromTestRslt(tr, finalTestsCount--, (float)wmData.Q3_Qn)); } var rslt = new VtWztypSd() { IdWztyp = 0, RevWztyp = 0, Wztyp = batch.ProcedureName, Art = "VT", Metrolklasse = wmData.MetrologicalClass, Zulasszeichen = wmData.ApprovalInfo, Impulsrate = 0, // TODO Kontaktwert = 0, // TODO Warmpruefen = false, Optikaufsetzen = true, Formatausdruck = "Normal", // TODO Formatetikett = string.Empty, // TODO Formatnetzwerk = "Halle1-Format", // TODO Formatzaehlernr = "nur Ziffern", // TODO IdWzgruppe = batch.ProcedureName.Contains("640") ? 35 : 29, /// 640...35, 620...29 Anzahlpruefungen = listOfTests.Count, Materialnr = batch.WatermetersStr, // TODO Qmax = (float)wmData.Q3_Qn, Pruefart = 0, Zaehlerflag = 0, Korrekturwert = 0, IdBenutzer = idBenutzer, Aenderungsdatum = DateTime.Now, Bemerkung = batch.Remark, // TODO Verwendet = true, ListOfTests = listOfTests, }; log.DebugFormat("FromProcedure: [{0}] created from proc. {1}", rslt, batch.ProcedureName); return rslt; } public int Write(OracleConnection conn, bool aktiv = true) { var cmd = new OracleCommand("INSERT INTO vt_wztyp_sd(anbid, id_wztyp, rev_wztyp, wztyp, art, metrolklasse, zulasszeichen," + " impulsrate, kontaktwert, warmpruefen, optikaufsetzen, formatausdruck, formatetikett," + " formatnetzwerk, formatzaehlernr, id_wzgruppe, anzahlpruefungen, materialnr, qmax, pruefart," + " zaehlerflag, korrekturwert, id_benutzer, aenderungsdatum, bemerkung, verwendet, aktiv) " + "VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18," + " :19, :20, :21, :22, :23, :24, :25, :26, :27)", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Database.ProducerAnbid }); /// :1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = IdWztyp }); /// :2 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = RevWztyp }); /// :3 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Wztyp }); /// :4 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Art }); /// :5 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Metrolklasse }); /// :6 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Zulasszeichen }); /// :7 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Impulsrate }); /// :8 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Kontaktwert }); /// :9 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Warmpruefen ? 1 : 0 }); /// :10 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Optikaufsetzen ? 1 : 0 }); /// :11 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Formatausdruck }); /// :12 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Formatetikett }); /// :13 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Formatnetzwerk }); /// :14 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Formatzaehlernr }); /// :15 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = IdWzgruppe }); /// :16 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anzahlpruefungen }); /// :17 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Materialnr }); /// :18 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Qmax }); /// :19 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Pruefart }); /// :20 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Zaehlerflag }); /// :21 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Korrekturwert }); /// :22 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = IdBenutzer }); /// :23 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = Aenderungsdatum }); /// :24 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Bemerkung }); /// :25 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Verwendet ? 1 : 0 }); /// :26 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = aktiv ? 1 : 0 }); /// :27 /// var rowsUpdated = cmd.ExecuteNonQuery(); if (rowsUpdated == 1) { foreach (var test in ListOfTests) { test.Write(conn, test, IdWztyp, RevWztyp); } } log.DebugFormat("Successfully writen to DB: {0}", ToString()); return rowsUpdated; } /// /// Get VT_WZTYP_SD content /// /// Oracle connection /// Active flag /// List of VtWztypSd records public static IList Read(OracleConnection conn, bool aktiv = true) { var cmd = new OracleCommand("SELECT id_wztyp, rev_wztyp, wztyp, art, metrolklasse, zulasszeichen, impulsrate," + " kontaktwert, warmpruefen, optikaufsetzen, formatausdruck, formatetikett, formatnetzwerk," + " formatzaehlernr, id_wzgruppe, anzahlpruefungen, materialnr, qmax, pruefart, zaehlerflag," + " korrekturwert, id_benutzer, aenderungsdatum, bemerkung, verwendet " + "FROM vt_wztyp_sd " + "WHERE anbid=:1 AND aktiv=:2 ORDER BY rev_wztyp DESC", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Database.ProducerAnbid }); /// :1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = aktiv ? 1 : 0 }); /// :2 /// var dr = cmd.ExecuteReader(); var list = new List(); while (dr.Read()) { var proc = new VtWztypSd(); int i = 0; try { proc.IdWztyp = dr.GetInt32(i++); } catch { proc.IdWztyp = 0; } try { proc.RevWztyp = dr.GetInt32(i++); } catch { proc.RevWztyp = 0; } try { proc.Wztyp = dr.GetString(i++); } catch { proc.Wztyp = string.Empty; } try { proc.Art = dr.GetString(i++); } catch { proc.Art = string.Empty; } try { proc.Metrolklasse = dr.GetString(i++); } catch { proc.Metrolklasse = string.Empty; } try { proc.Zulasszeichen = dr.GetString(i++); } catch { proc.Zulasszeichen = string.Empty; } try { proc.Impulsrate = dr.GetDouble(i++); } catch { proc.Impulsrate = 0; } try { proc.Kontaktwert = dr.GetDouble(i++); } catch { proc.Kontaktwert = 0; } try { proc.Warmpruefen = dr.GetBoolean(i++); } catch { proc.Warmpruefen = false; } try { proc.Optikaufsetzen = dr.GetBoolean(i++); } catch { proc.Optikaufsetzen = false; } try { proc.Formatausdruck = dr.GetString(i++); } catch { proc.Formatausdruck = string.Empty; } try { proc.Formatetikett = dr.GetString(i++); } catch { proc.Formatetikett = string.Empty; } try { proc.Formatnetzwerk = dr.GetString(i++); } catch { proc.Formatnetzwerk = string.Empty; } try { proc.Formatzaehlernr = dr.GetString(i++); } catch { proc.Formatzaehlernr = string.Empty; } try { proc.IdWzgruppe = dr.GetInt32(i++); } catch { proc.IdWzgruppe = 0; } try { proc.Anzahlpruefungen = dr.GetInt32(i++); } catch { proc.Anzahlpruefungen = 0; } try { proc.Materialnr = dr.GetString(i++); } catch { proc.Materialnr = string.Empty; } try { proc.Qmax = dr.GetFloat(i++); } catch { proc.Qmax = 0; } try { proc.Pruefart = dr.GetByte(i++); } catch { proc.Pruefart = 0; } try { proc.Zaehlerflag = dr.GetByte(i++); } catch { proc.Zaehlerflag = 0; } try { proc.Korrekturwert = dr.GetDouble(i++); } catch { proc.Korrekturwert = 0; } try { proc.IdBenutzer = dr.GetInt32(i++); } catch { proc.IdBenutzer = 0; } try { proc.Aenderungsdatum = dr.GetDateTime(i++); } catch { proc.Aenderungsdatum = DateTime.Now; } try { proc.Bemerkung = dr.GetString(i++); } catch { proc.Bemerkung = string.Empty; } try { proc.Verwendet = dr.GetBoolean(i++); } catch { proc.Verwendet = false; } list.Add(proc); } dr.Close(); return list; } /// /// Compares two VtWztypSd objects except of IdWztyp, RevWztyp, /// IdBenutzer, Aenderungsdatum, Bemerkung and Verwendet members. /// Tollerance for Impulsrate and Kontaktwert is 1/100000. /// Tolleranve for Qmax and Korrekturwert is 1/1000 (0.1%). /// /// VtWztypSd object 1/param> /// VtWztypSd object 2 /// true when equal public static bool AreEqual(VtWztypSd p1, VtWztypSd p2, Database db = null, OracleConnection conn = null) { if (p1 == null && p2 == null) return true; /// Both are null --> are equal if (p1 == null || p2 == null) return false; /// One is null --> not equal bool equal = p1.Wztyp == p2.Wztyp && p1.Art == p2.Art && p1.Metrolklasse == p2.Metrolklasse && p1.Zulasszeichen == p2.Zulasszeichen && ((p1.Impulsrate == 0 && p2.Impulsrate == 0) || 2 * Math.Abs(p1.Impulsrate - p2.Impulsrate) / (p1.Impulsrate + p2.Impulsrate) < 0.00001) && ((p1.Kontaktwert == 0 && p2.Kontaktwert == 0) || 2 * Math.Abs(p1.Kontaktwert - p2.Kontaktwert) / (p1.Kontaktwert + p2.Kontaktwert) < 0.00001) && p1.Warmpruefen == p2.Warmpruefen && p1.Optikaufsetzen == p2.Optikaufsetzen && p1.Formatausdruck == p2.Formatausdruck && p1.Formatetikett == p2.Formatetikett && p1.Formatnetzwerk == p2.Formatnetzwerk && p1.Formatzaehlernr == p2.Formatzaehlernr && p1.IdWzgruppe == p2.IdWzgruppe && p1.Anzahlpruefungen == p2.Anzahlpruefungen && p1.Materialnr == p2.Materialnr && ((p1.Qmax == 0 && p2.Qmax == 0) || 2 * Math.Abs(p1.Qmax - p2.Qmax) / (p1.Qmax + p2.Qmax) < 0.001) && p1.Pruefart == p2.Pruefart && p1.Zaehlerflag == p2.Zaehlerflag && ((p1.Korrekturwert == 0 && p2.Korrekturwert == 0) || 2 * Math.Abs(p1.Korrekturwert - p2.Korrekturwert) / (p1.Korrekturwert + p2.Korrekturwert) < 0.001); if (!equal) { return false; /// Two procedures are different regardless of their tests } /// Load information about test form Oracle if it is missing if (((p1.ListOfTests == null && p1.IdWztyp > 0 && p1.RevWztyp > 0) || (p2.ListOfTests == null && p2.IdWztyp > 0 && p2.RevWztyp > 0)) && db != null && conn != null) { try { conn.Open(); if (p1.ListOfTests == null && p1.IdWztyp > 0 && p1.RevWztyp > 0) { p1.ListOfTests = VtPruefpunktSollSd.Read(conn, p1.IdWztyp, p1.RevWztyp); } if (p2.ListOfTests == null && p2.IdWztyp > 0 && p2.RevWztyp > 0) { p2.ListOfTests = VtPruefpunktSollSd.Read(conn, p2.IdWztyp, p2.RevWztyp); } conn.Close(); } catch (Exception exc) { log.ErrorFormat("Failed to read from VT_PRUEFPUNKT_SOLL_SD: {0}", exc.Message); return false; } } if (p1.ListOfTests == null || p2.ListOfTests == null) { log.ErrorFormat("Information about tests is missing"); return false; } if (p1.ListOfTests.Count != p2.ListOfTests.Count) { return false; /// Tests counts of two procedures are different } for (int i = 0; i < p1.ListOfTests.Count; i++) { if (!VtPruefpunktSollSd.AreEqual(p1.ListOfTests[i], p2.ListOfTests[i])) { return false; /// One pair of tests is different, tests are not equal } } log.InfoFormat("Procedures are equal: {0}/{1}({2}) and {3}/{4}({5})", p1.IdWztyp, p1.RevWztyp, p1.Wztyp, p2.IdWztyp, p2.RevWztyp, p2.Wztyp); return true; /// Two procedures are equal } public override string ToString() { return string.Format("Id={0} Rev={1} Q3={2} metro={3}", IdWztyp, RevWztyp, Qmax, Metrolklasse); } } }