Files
tbf/TBF/Rig/Output/DB/SensusOracle/VtPruefpunktSollSd.cs

227 lines
12 KiB
C#

///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using log4net;
using Oracle.ManagedDataAccess.Client;
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;
/// <summary>
/// Default constructor
/// </summary>
public VtPruefpunktSollSd()
{
}
/// <summary>
/// Create VtPruefpunktSollSd object from a test result.
/// </summary>
/// <param name="tr">Test result</param>
/// <param name="pruefungsnr">Test ix</param>
/// <returns>Created object</returns>
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;
}
/// <summary>
/// Create VtPruefpunktSollSd object from a test.
/// </summary>
/// <param name="test">Test</param>
/// <param name="pruefungsnr">Test ix</param>
/// <returns>Created object</returns>
public static VtPruefpunktSollSd FromTest(Config.Entities.Test test, int pruefungsnr = 0)
{
bool isQ3orQ4 = (test.Procedure.Qn > 0 && (test.QfromM3ph() + test.QtoM3ph()) / 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.QtoM3ph() : test.QfromM3ph())),
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;
}
/// <summary>
/// Insert a record to VT_PRUEFPUNKT_SOLL_SD
/// </summary>
/// <param name="conn">Oracle connection</param>
/// <param name="record">Record to be written</param>
/// <param name="aktiv">WM type Id</param>
/// <param name="aktiv">WM type revision</param>
/// <returns>List of VtWztypSd records</returns>
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;
}
/// <summary>
/// Get VT_PRUEFPUNKT_SOLL_SD content
/// </summary>
/// <param name="conn">Oracle connection</param>
/// <param name="aktiv">WM type Id</param>
/// <param name="aktiv">WM type revision</param>
/// <returns>List of VtWztypSd records</returns>
public static IList<VtPruefpunktSollSd> 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<VtPruefpunktSollSd>();
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;
}
/// <summary>
/// Compares two VtPruefpunktSollSd objects.
/// Tollerance for float values is 1/1000 (0.1%).
/// </summary>
/// <param name="t1">VtPruefpunktSollSd object 1</param>
/// <param name="t2">VtPruefpunktSollSd object 2</param>
/// <returns>true when equal</returns>
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);
}
}
}