227 lines
12 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|