2025-09-15 14:16:07 +00:00
using LaaPackages.Features.Cordonel.Models ;
using Newtonsoft.Json.Linq ;
using Oracle.ManagedDataAccess.Client ;
using Service.MeterProcessState ;
using Service.MeterProcessState.Data ;
2025-03-12 09:23:28 +00:00
using System ;
using System.Collections.Generic ;
2025-09-15 14:16:07 +00:00
using System.Data ;
using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder ;
2025-09-02 13:43:39 +00:00
using System.Globalization ;
2025-03-12 09:23:28 +00:00
using System.Net ;
using System.Net.Http ;
using System.Text ;
using System.Threading.Tasks ;
2025-09-15 14:16:07 +00:00
using System.Web.Helpers ;
2025-03-12 09:23:28 +00:00
using System.Web.Http ;
using Xylem.Common.Logic.ServiceCore ;
namespace Xylem.Common.Service.MeterProcessState.Controllers
{
[RoutePrefix("api/LuController")]
public class LuController : ApiController
{
public static class GlobalConfig
{
public static Lazy < String > connectionString = new Lazy < String > ( ( )
= >
System . Configuration . ConfigurationManager . ConnectionStrings [ "default" ] . ConnectionString
) ;
}
[Route("GetNZDaten")]
public async Task < HttpResponseMessage > GetNZDaten ( string Seriennumer = "" )
{
try
{
using ( var dataAccess = new SqlDataAccess ( GlobalConfig . connectionString . Value ) )
{
StringBuilder query = new StringBuilder ( ) ;
query . AppendLine ( "SELECT TOP 1 * from Verbundzaehler where (Q1_SOLL is NULL) and (SerienNrNebenzaehler > 0 or KundeneigeneSerNrNbZ <> '') and (Herkunft is null or Herkunft <> 'M') and AnlageDatum > getdate() - 7 order by Datum desc " ) ;
var retDic = new List < Tuple < string , string > > ( ) ;
var dt = dataAccess . ExecuteQuery ( query . ToString ( ) ) ;
foreach ( var item in dt . Select ( ) )
{
string strSQLOra ;
int lngSerial ;
string strSerial ;
double Q1 ;
double Q2 ;
double F1 ;
double F2 ;
lngSerial = ( int ) item [ "SerienNrNebenzaehler" ] ;
strSerial = item [ "KundeneigeneSerNrNbZ" ] . ToString ( ) . Trim ( ) ;
if ( strSerial = = "" & & lngSerial > 0 )
{
strSQLOra = "SELECT * FROM PRIMA_RO.DT01_LAATZEN WHERE ZAEHLERNUMMER ='" + lngSerial . ToString ( "00000000" ) + "'" ;
}
else
{
if ( strSerial ! = "" )
{
//kundeneigenen NZ SerienNr ist bekannt
strSQLOra = "SELECT * FROM PRIMA_RO.DT01_LAATZEN WHERE ZAEHLERNUMMER='" + strSerial . Replace ( " " , "" ) + "' or ZAEHLERNUMMER='" + strSerial + "'" ;
}
else
{
return Request . CreateResponse ( HttpStatusCode . OK , await Task . Run ( ( ) = > { return "ERROR 1#" ; } ) ) ;
// ' weder kundeneigenen SerienNr noch numerische NZ SerienNr bekannt
}
}
// create connection
OracleConnection con = new OracleConnection ( ) ;
// create connection string using builder
OracleConnectionStringBuilder ocsb = new OracleConnectionStringBuilder ( ) ;
ocsb . Password = "senspi2012" ;
ocsb . UserID = "prima_ro" ;
ocsb . DataSource = "//SLUORADB:1521/DT01" ;
// connect
con . ConnectionString = ocsb . ConnectionString ;
con . Open ( ) ;
OracleCommand command = con . CreateCommand ( ) ;
2025-07-25 07:50:30 +00:00
2025-03-12 09:23:28 +00:00
command . CommandText = strSQLOra ;
OracleDataReader reader = command . ExecuteReader ( ) ;
while ( reader . Read ( ) )
{
2025-07-25 07:50:30 +00:00
Q1 = ( ( double ) reader [ "Q1_SOLL" ] ) / 1000 ;
Q2 = ( ( double ) reader [ "Q2_SOLL" ] ) / 1000 ;
F1 = ( double ) reader [ "FEHLER_Q1" ] ;
F2 = ( double ) reader [ "FEHLER_Q2" ] ;
2025-03-12 09:23:28 +00:00
}
}
return Request . CreateResponse ( HttpStatusCode . OK , await Task . Run ( ( ) = > { return "store" ; } ) ) ;
}
}
catch ( Exception ex )
{
return Request . CreateResponse ( HttpStatusCode . InternalServerError , ex . ToString ( ) + "<br >" + ex . InnerException . ToString ( ) ) ;
}
}
2025-09-15 14:16:07 +00:00
[Route("SyncKitronData")]
public async Task < HttpResponseMessage > SyncKitronData ( )
{
2025-12-16 12:52:29 +00:00
2025-09-15 14:16:07 +00:00
StringBuilder query = new StringBuilder ( ) ;
query . AppendLine ( "SELECT TOP (1) ID, Jobname, ActionDate, DoneDate, LastID, DataCount FROM KitronSync where DoneDate is null order by ID " ) ;
using ( var dataAccess = new SqlDataAccess ( GlobalConfig . connectionString . Value ) )
{
var dt = dataAccess . ExecuteQuery ( query . ToString ( ) ) ;
foreach ( DataRow item in dt . Rows )
{
var LastID = ( int ) item [ "LastID" ] ;
2025-12-16 12:52:29 +00:00
2025-09-15 14:16:07 +00:00
var DataCount = ( int ) item [ "DataCount" ] ;
var UpdateTillLasID = LastID + DataCount ;
2025-12-16 12:52:29 +00:00
var kitronFinals = dataAccess . ExecuteQuery ( $" sELECT * FROM OPENQUERY (MyOraDB, ' SELECT DS_ID,ID_PCB,ID_TEST,JSON FROM DELTACHEF.GENESIS_PCBFUNCTIONALTEST_PD WHERE DS_ID >= {LastID + 1} and DS_ID <= {LastID + 1 + DataCount} order by DS_ID asc ');" ) ;
2025-09-15 14:16:07 +00:00
foreach ( DataRow kitronItem in kitronFinals . Rows )
{
try
{
var DS_ID = ( double ) kitronItem [ "DS_ID" ] ;
var ID_PCB = kitronItem [ "ID_PCB" ] . ToString ( ) ;
var ID_TEST = ( double ) kitronItem [ "ID_TEST" ] ;
var JSON = kitronItem [ "JSON" ] . ToString ( ) ;
var oo = JObject . Parse ( JSON ) ;
UpdateTillLasID = ( int ) DS_ID ;
var TestResultPass = false ;
var IrDALogonSkeleton = "" ;
var FWVersion = "" ;
var MaterialNumber = "" ;
var StartDT = DateTime . MinValue ;
foreach ( var oItem in oo . Children ( ) . Values ( ) )
{
foreach ( JProperty ChildValues in oItem . Children ( ) )
{
switch ( ChildValues . Name )
{
case "TestResult" :
TestResultPass = ( ChildValues . Value . ToString ( ) . ToUpper ( ) = = "PASS" ) ;
break ;
case "IrDA Logon Skeleton" :
IrDALogonSkeleton = ChildValues . Value . ToString ( ) ;
break ;
case "FW Version" :
FWVersion = ChildValues . Value . ToString ( ) ;
break ;
case "MaterialNumber" :
MaterialNumber = ChildValues . Value . ToString ( ) ;
break ;
case "StartDT" :
DateTime . TryParseExact ( ChildValues . Value . ToString ( ) , "dd.MM.yyyy HH:mm:ss" , CultureInfo . InvariantCulture , DateTimeStyles . AssumeLocal , out StartDT ) ;
break ;
default :
break ;
}
}
}
if ( TestResultPass )
{
int matr = - 1 ;
string remark = "" ;
2025-12-16 12:52:29 +00:00
if ( ! int . TryParse ( MaterialNumber , out matr ) )
2025-09-15 14:16:07 +00:00
{
matr = - 1 ;
remark = MaterialNumber ;
}
2025-12-16 12:52:29 +00:00
2025-09-15 14:16:07 +00:00
dataAccess . ExecuteQuery ( $"" +
$" IF not EXISTS (SELECT 1 FROM dbo.[Cordonel_KitronData] WHERE KitronDSId = {DS_ID}) " +
$" Begin" +
$" INSERT INTO [dbo].[Cordonel_KitronData] ([PcbId] ,[KitronDSId] ,[Skeleton] ,[FW] ,[MaterialNumber] ,[ProdDate], [Remark]) " +
$" VALUES ( {ID_PCB},{DS_ID}, '{IrDALogonSkeleton}','{FWVersion}', {matr} , '{StartDT.ToString(" yyyyMMdd HH : mm : ss ")}', '{remark}')" +
$" end" ) ;
}
2025-03-12 09:23:28 +00:00
2025-09-15 14:16:07 +00:00
}
catch ( Exception ex )
{
throw ;
}
}
dataAccess . ExecuteQuery ( $"Update [dbo].KitronSync set LastID = {UpdateTillLasID} " ) ;
}
}
return Request . CreateResponse ( HttpStatusCode . OK , await Task . Run ( ( ) = > { return true ; } ) ) ;
}
2025-12-16 12:52:29 +00:00
[Route("SyncKitronDataByPbc")]
public async Task < HttpResponseMessage > SyncKitronDataByPbc ( int PcbId )
{
using ( var dataAccess = new SqlDataAccess ( GlobalConfig . connectionString . Value ) )
{
var kitronFinals = dataAccess . ExecuteQuery ( $" sELECT * FROM OPENQUERY (MyOraDB, ' SELECT DS_ID,ID_PCB,ID_TEST,JSON FROM DELTACHEF.GENESIS_PCBFUNCTIONALTEST_PD WHERE ID_PCB = ''{PcbId}'' order by DS_ID asc ');" ) ;
foreach ( DataRow kitronItem in kitronFinals . Rows )
{
try
{
var DS_ID = ( double ) kitronItem [ "DS_ID" ] ;
var ID_PCB = kitronItem [ "ID_PCB" ] . ToString ( ) ;
var ID_TEST = ( double ) kitronItem [ "ID_TEST" ] ;
var JSON = kitronItem [ "JSON" ] . ToString ( ) ;
var oo = JObject . Parse ( JSON ) ;
var TestResultPass = false ;
var IrDALogonSkeleton = "" ;
var FWVersion = "" ;
var MaterialNumber = "" ;
var StartDT = DateTime . MinValue ;
foreach ( var oItem in oo . Children ( ) . Values ( ) )
{
foreach ( JProperty ChildValues in oItem . Children ( ) )
{
switch ( ChildValues . Name )
{
case "TestResult" :
TestResultPass = ( ChildValues . Value . ToString ( ) . ToUpper ( ) = = "PASS" ) ;
break ;
case "IrDA Logon Skeleton" :
IrDALogonSkeleton = ChildValues . Value . ToString ( ) ;
break ;
case "FW Version" :
FWVersion = ChildValues . Value . ToString ( ) ;
break ;
case "MaterialNumber" :
MaterialNumber = ChildValues . Value . ToString ( ) ;
break ;
case "StartDT" :
DateTime . TryParseExact ( ChildValues . Value . ToString ( ) , "dd.MM.yyyy HH:mm:ss" , CultureInfo . InvariantCulture , DateTimeStyles . AssumeLocal , out StartDT ) ;
break ;
default :
break ;
}
}
}
if ( TestResultPass )
{
int matr = - 1 ;
string remark = "" ;
if ( ! int . TryParse ( MaterialNumber , out matr ) )
{
matr = - 1 ;
remark = MaterialNumber ;
}
dataAccess . ExecuteQuery ( $"" +
$" IF not EXISTS (SELECT 1 FROM dbo.[Cordonel_KitronData] WHERE KitronDSId = {DS_ID}) " +
$" Begin" +
$" INSERT INTO [dbo].[Cordonel_KitronData] ([PcbId] ,[KitronDSId] ,[Skeleton] ,[FW] ,[MaterialNumber] ,[ProdDate], [Remark]) " +
$" VALUES ( {ID_PCB},{DS_ID}, '{IrDALogonSkeleton}','{FWVersion}', {matr} , '{StartDT.ToString(" yyyyMMdd HH : mm : ss ")}', '{remark}')" +
$" end" ) ;
}
}
catch ( Exception ex )
{
throw ;
}
}
}
return Request . CreateResponse ( HttpStatusCode . OK , await Task . Run ( ( ) = > { return true ; } ) ) ;
}
2025-07-25 07:50:30 +00:00
[Route("GetProddate")]
public async Task < HttpResponseMessage > GetProddate ( string Seriennumer = "" )
{
return Request . CreateResponse ( HttpStatusCode . OK , await Task . Run ( ( ) = > { return getLastProductionDateByPcb ( Seriennumer ) ; } ) ) ;
}
public async Task < DateTime > getLastProductionDateByPcb ( string Seriennumer = "" )
{
DateTime lastProdDate = DateTime . MinValue ;
try
{
var sb = new StringBuilder ( ) ;
sb . AppendLine ( " SELECT top 1 [DS_ID] ,[ID_PCB] ,[ID_TEST] ,[JSON] FROM [DELTACHEF].[GENESIS_PCBFUNCTIONALTEST_PD] " ) ;
sb . AppendLine ( $" where [ID_PCB] = '{Seriennumer}' " ) ;
sb . AppendLine ( " order by ID_TEST desc " ) ;
2025-09-15 14:16:07 +00:00
2025-07-25 07:50:30 +00:00
// create connection
using ( OracleConnection con = new OracleConnection ( ) )
{
// create connection string using builder
OracleConnectionStringBuilder ocsb = new OracleConnectionStringBuilder ( ) ;
ocsb . Password = "senspi2012" ;
ocsb . UserID = "prima_ro" ;
ocsb . DataSource = "//SLUORADB:1521/DT01" ;
// connect
con . ConnectionString = ocsb . ConnectionString ;
con . Open ( ) ;
OracleCommand command = con . CreateCommand ( ) ;
command . CommandText = sb . ToString ( ) ;
OracleDataReader reader = command . ExecuteReader ( ) ;
while ( reader . Read ( ) )
{
var St = ( ( string ) reader [ "JSON" ] ) ;
var startInex = St . IndexOf ( "\"StartDT\":\"" ) + "\"StartDT\":\"" . Length ;
var datestring = St . Substring ( startInex , "29.07.2022 06:47:27" . Length ) ;
2025-09-15 14:16:07 +00:00
DateTime . ParseExact ( datestring , "dd.MM.yyyy HH:mm:ss" , CultureInfo . InvariantCulture ) ;
2025-07-25 07:50:30 +00:00
2025-03-12 09:23:28 +00:00
2025-07-25 07:50:30 +00:00
}
}
}
catch ( Exception ex )
{
throw ex ;
}
return lastProdDate ;
}
2025-03-12 09:23:28 +00:00
//connect
//If Not rs.EOF Then
// If lngSerial = 0 Then
// StatusBar1.SimpleText = "LU: " & lngCount & "/" & ProgressBar1.Max & " " & strSerial & " " & Q1 & "=" & F1 & ", " & Q2 & " =" & F2 & " " & rsSQL("AnlageDatum")
// Else
// StatusBar1.SimpleText = "LU: " & lngCount & "/" & ProgressBar1.Max & " " & Format(lngSerial, "00000000") & " " & Q1 & "=" & F1 & ", " & Q2 & " =" & F2 & " " & rsSQL("AnlageDatum")
// End If
// 'Debug.Print Format(lngSerial, "00000000") & " " & Q1 & "=" & F1 & ", " & Q2 & " =" & F2
// DoEvents
// If Not rsSQL Is Nothing Then
// ' Reihenfolge wieder zurückgesetzt Q1 < Q2 2018-04-19
// If Q1<Q2 Then
// ' richtig herum
// rsSQL("Q1_SOLL") = Q1
// rsSQL("FEHLER_Q1") = F1
// rsSQL("Q2_SOLL") = Q2
// rsSQL("FEHLER_Q2") = F2
// Else
// ' Q2 < Q1 => Tauschen
// rsSQL("Q1_SOLL") = Q2
// rsSQL("FEHLER_Q1") = F2
// rsSQL("Q2_SOLL") = Q1
// rsSQL("FEHLER_Q2") = F1
// End If
// Debug.Print rs("ZAEHLERNUMMER")
// If Val(rsSQL("SerienNrNebenzaehlerLU") &"") = 0 And lngSerial > 0 Then
// rsSQL("SerienNrNebenzaehlerLU") = lngSerial
// End If
// rsSQL("Herkunft") = "L"
// rsSQL("ErgaenzungDatum") = Now
// rsSQL.Update
// Debug.Print lngCount &"/" & ProgressBar1.Max & " OK " & lngSerial & " / " & strSerial
// End If
//Else
// StatusBar1.SimpleText = lngCount & "/" & ProgressBar1.Max & " unbekannte SNr: " & lngSerial & " / " & strSerial
// Debug.Print StatusBar1.SimpleText & " " & Now
// 'Debug.Print lngCount & "/" & ProgressBar1.Max & " unbekannt " & Format(lngSerial, "00000000") & " / " & strSerial
// DoEvents
// 'rsSQL("Q1_SOLL") = 0
// 'rsSQL("Herkunft") = "u"
// 'rsSQL("Info") = "unbekannt in LU"
// 'rsSQL.Update
//End If
//Exit Sub
//Errorhandler:
// Dim errnum As Long
// Dim errdesc As String
// errnum = Err.Number
// errdesc = Err.Description
// PrintStatus "Fehler " & errnum & " in Ergaenze(): " & errdesc & " SQL=" & strSQL
//End Sub
}
}