/// /// 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 VtPruefpunktSollSd { private static readonly ILog log = LogManager.GetLogger(typeof(VtPruefpunktSollSd)); public int Pruefungsnr; public float Q_soll; public float Pruefzeit; public float Posfehlerkalt; public float Negfehlerkalt; public float Posfehlerwarm; public float Negfehlerwarm; public int Pruefbereichmin; public int Pruefbereichmax; public string Qbezeichnung; public float Mindruck; public float Maxdruck; public float Fkorrektur; /// /// Default constructor /// public VtPruefpunktSollSd() { } /// /// Create VtPruefpunktSollSd object from a test result. /// /// Test result /// Test ix /// Created object public static VtPruefpunktSollSd FromTestRslt(Results.Entities.TestRslt tr, int pruefungsnr = 0, float Qn = 0) { bool isQ3orQ4 = (Qn > 0 && (tr.Qfrom() + tr.Qto()) / 2 >= 0.9 * Qn) || tr.Name().ToLower().Contains("q3") || tr.Name().ToLower().Contains("q4"); var rslt = new VtPruefpunktSollSd { Pruefungsnr = pruefungsnr, Q_soll = (float)Units.ConvertTo(Unit.lph, isQ3orQ4 ? tr.Qto() : tr.Qfrom()), Pruefzeit = (float)tr.TargetTime(), Posfehlerkalt = (float)(tr.ErrLimHi() - tr.ErrLimMargin()), Negfehlerkalt = (float)(tr.ErrLimLo() + tr.ErrLimMargin()), Posfehlerwarm = 0, Negfehlerwarm = 0, Pruefbereichmin = isQ3orQ4 ? 90 : 100, Pruefbereichmax = isQ3orQ4 ? 100 : 110, Qbezeichnung = tr.Name().Substring(0, Math.Min(tr.Name().Length, 8)), Mindruck = 0, Maxdruck = 0, Fkorrektur = 0, }; log.DebugFormat("FromTest: [{0}] created from test {1}", rslt, tr.Name()); return rslt; } /// /// Create VtPruefpunktSollSd object from a test. /// /// Test /// Test ix /// Created object public static VtPruefpunktSollSd FromTest(Config.Entities.Test test, int pruefungsnr = 0) { bool isQ3orQ4 = (test.Procedure.Qn > 0 && (test.Qfrom + test.Qto) / 2 >= 0.9 * test.Procedure.Qn) || test.Name.ToLower().Contains("q3") || test.Name.ToLower().Contains("q4"); var rslt = new VtPruefpunktSollSd { Pruefungsnr = pruefungsnr, Q_soll = Convert.ToSingle(Units.ConvertTo(Unit.lph, isQ3orQ4 ? test.Qto : test.Qfrom)), Pruefzeit = Convert.ToSingle(test.TestTime), Posfehlerkalt = test.ErrLimHi, Negfehlerkalt = test.ErrLimLo, Posfehlerwarm = 0, Negfehlerwarm = 0, Pruefbereichmin = isQ3orQ4 ? 90 : 100, Pruefbereichmax = isQ3orQ4 ? 100 : 110, Qbezeichnung = test.Name.Substring(0, Math.Min(test.Name.Length, 8)), Mindruck = 0, Maxdruck = 0, Fkorrektur = 0, }; log.DebugFormat("FromTest: [{0}] created from test {1}", rslt, test.Name); return rslt; } /// /// Insert a record to VT_PRUEFPUNKT_SOLL_SD /// /// Oracle connection /// Record to be written /// WM type Id /// WM type revision /// List of VtWztypSd records public int Write(OracleConnection conn, VtPruefpunktSollSd record, int id_wztyp, int rev_wztyp) { var cmd = new OracleCommand("INSERT INTO vt_pruefpunkt_soll_sd(anbid, id_wztyp, rev_wztyp, pruefungsnr, q_soll, pruefzeit," + " posfehlerkalt, negfehlerkalt, posfehlerwarm, negfehlerwarm, pruefbereichmin, pruefbereichmax," + " qbezeichnung, mindruck, fkorrektur, maxdruck) " + "VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16)", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Database.ProducerAnbid }); /// :1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = id_wztyp }); /// :2 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = rev_wztyp }); /// :3 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Pruefungsnr }); /// :4 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Q_soll }); /// :5 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Pruefzeit }); /// :6 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Posfehlerkalt }); /// :7 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Negfehlerkalt }); /// :8 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Posfehlerwarm }); /// :9 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Negfehlerwarm }); /// :10 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Pruefbereichmin }); /// :11 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Pruefbereichmax }); /// :12 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = Qbezeichnung }); /// :13 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Mindruck }); /// :14 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Fkorrektur }); /// :15 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Single, Value = Maxdruck }); /// :16 /// var rowsUpdated = cmd.ExecuteNonQuery(); log.DebugFormat("Successfully writen to DB: {0}", ToString()); return rowsUpdated; } /// /// Get VT_PRUEFPUNKT_SOLL_SD content /// /// Oracle connection /// WM type Id /// WM type revision /// List of VtWztypSd records public static IList Read(OracleConnection conn, int id_wztyp, int rev_wztyp) { var cmd = new OracleCommand("SELECT pruefungsnr, q_soll, pruefzeit, posfehlerkalt, negfehlerkalt," + " posfehlerwarm, negfehlerwarm, pruefbereichmin, pruefbereichmax," + " qbezeichnung, mindruck, fkorrektur, maxdruck " + "FROM vt_pruefpunkt_soll_sd " + "WHERE anbid=:1 AND id_wztyp=:2 AND rev_wztyp=:3 ORDER BY pruefungsnr DESC", conn); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Database.ProducerAnbid }); /// :1 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = id_wztyp }); /// :2 cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = rev_wztyp }); /// :3 /// var dr = cmd.ExecuteReader(); var list = new List(); while (dr.Read()) { var tst = new VtPruefpunktSollSd(); int i = 0; try { tst.Pruefungsnr = dr.GetInt32(i++); } catch { tst.Pruefungsnr = 0; } try { tst.Q_soll = dr.GetFloat(i++); } catch { tst.Q_soll = 0; } try { tst.Pruefzeit = dr.GetFloat(i++); } catch { tst.Pruefzeit = 0; } try { tst.Posfehlerkalt = dr.GetFloat(i++); } catch { tst.Posfehlerkalt = 0; } try { tst.Negfehlerkalt = dr.GetFloat(i++); } catch { tst.Negfehlerkalt = 0; } try { tst.Posfehlerwarm = dr.GetFloat(i++); } catch { tst.Posfehlerwarm = 0; } try { tst.Negfehlerwarm = dr.GetFloat(i++); } catch { tst.Negfehlerwarm = 0; } try { tst.Pruefbereichmin = dr.GetInt32(i++); } catch { tst.Pruefbereichmin = 0; } try { tst.Pruefbereichmax = dr.GetInt32(i++); } catch { tst.Pruefbereichmax = 0; } try { tst.Qbezeichnung = dr.GetString(i++); } catch { tst.Qbezeichnung = string.Empty; } try { tst.Mindruck = dr.GetFloat(i++); } catch { tst.Mindruck = 0; } try { tst.Fkorrektur = dr.GetFloat(i++); } catch { tst.Fkorrektur = 0; } try { tst.Maxdruck = dr.GetFloat(i++); } catch { tst.Maxdruck = 0; } if (tst.Pruefungsnr >= 0) list.Add(tst); else list.Insert(0, tst); } return list; } /// /// Compares two VtPruefpunktSollSd objects. /// Tollerance for float values is 1/1000 (0.1%). /// /// VtPruefpunktSollSd object 1 /// VtPruefpunktSollSd object 2 /// true when equal public static bool AreEqual(VtPruefpunktSollSd t1, VtPruefpunktSollSd t2) { if (t1 == null && t2 == null) return true; /// Both are null --> are equal if (t1 == null || t2 == null) return false; /// One is null --> not equal return t1.Pruefungsnr == t2.Pruefungsnr && ((t1.Q_soll == 0 && t2.Q_soll == 0) || 2 * Math.Abs(t1.Q_soll - t2.Q_soll) / (t1.Q_soll + t2.Q_soll) < 0.001) && ((t1.Pruefzeit == 0 && t2.Pruefzeit == 0) || 2 * Math.Abs(t1.Pruefzeit - t2.Pruefzeit) / (t1.Pruefzeit + t2.Pruefzeit) < 0.001) && ((t1.Posfehlerkalt == 0 && t2.Posfehlerkalt == 0) || 2 * Math.Abs(t1.Posfehlerkalt - t2.Posfehlerkalt) / (t1.Posfehlerkalt + t2.Posfehlerkalt) < 0.001) && ((t1.Negfehlerkalt == 0 && t2.Negfehlerkalt == 0) || 2 * Math.Abs(t1.Negfehlerkalt - t2.Negfehlerkalt) / (t1.Negfehlerkalt + t2.Negfehlerkalt) < 0.001) && ((t1.Posfehlerwarm == 0 && t2.Posfehlerwarm == 0) || 2 * Math.Abs(t1.Posfehlerwarm - t2.Posfehlerwarm) / (t1.Posfehlerwarm + t2.Posfehlerwarm) < 0.001) && ((t1.Negfehlerwarm == 0 && t2.Negfehlerwarm == 0) || 2 * Math.Abs(t1.Negfehlerwarm - t2.Negfehlerwarm) / (t1.Negfehlerwarm + t2.Negfehlerwarm) < 0.001) && t1.Pruefbereichmin == t2.Pruefbereichmin && t1.Pruefbereichmax == t2.Pruefbereichmax && t1.Qbezeichnung == t2.Qbezeichnung && ((t1.Mindruck == 0 && t2.Mindruck == 0) || 2 * Math.Abs(t1.Mindruck - t2.Mindruck) / (t1.Mindruck + t2.Mindruck) < 0.001) && ((t1.Maxdruck == 0 && t2.Maxdruck == 0) || 2 * Math.Abs(t1.Maxdruck - t2.Maxdruck) / (t1.Maxdruck + t2.Maxdruck) < 0.001) && t1.Fkorrektur == t2.Fkorrektur; } public override string ToString() { return string.Format("{0} {1} {2}l/h time={3}s Elo={4}% Ehi={5}% Rlo={6} Rhi={7}", Pruefungsnr, Qbezeichnung, Q_soll, Pruefzeit, Negfehlerkalt, Posfehlerkalt, Pruefbereichmin, Pruefbereichmax); } } }