331 lines
18 KiB
C#
331 lines
18 KiB
C#
///
|
|
/// 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<VtPruefpunktSollSd> ListOfTests; /// null = To be loaded
|
|
|
|
/// <summary>
|
|
/// Default constructor
|
|
/// </summary>
|
|
public VtWztypSd()
|
|
{
|
|
ListOfTests = null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create VtWztypSd object from a batch.
|
|
/// </summary>
|
|
/// <param name="batch"></param>
|
|
/// <returns></returns>
|
|
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<VtPruefpunktSollSd>();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get VT_WZTYP_SD content
|
|
/// </summary>
|
|
/// <param name="conn">Oracle connection</param>
|
|
/// <param name="aktiv">Active flag</param>
|
|
/// <returns>List of VtWztypSd records</returns>
|
|
public static IList<VtWztypSd> 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<VtWztypSd>();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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%).
|
|
/// </summary>
|
|
/// <param name="p1">VtWztypSd object 1/param>
|
|
/// <param name="p2">VtWztypSd object 2</param>
|
|
/// <returns>true when equal</returns>
|
|
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);
|
|
}
|
|
}
|
|
}
|