Files
imsInterface/interface/asm/dotnet/AdapterApplication3x/Itac.Oib/SetupCenterExternalControlReceiver.cs
2025-06-06 09:15:13 +02:00

248 lines
11 KiB
C#

#region Namespace
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.ServiceModel;
using www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data;
using com.itac.mes.tools;
using com.itac.mes.proxy.business;
using OibClient = Asm.As.Oib.Client;
#endregion
namespace Itac.Oib
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SetupCenterExternalControlReceiver : IDisposable, IReceiver
{
#region Fields
private readonly OibClient.OibSetupCenterExternalControlEvents _oibSetupCenterExternalControlEvents;
public OIBEventHandler _eventHandler { get; set; }
#endregion
#region Constructor
public SetupCenterExternalControlReceiver(OibClient.OibSetupCenterExternalControlEvents oibSetupCenterExternalControlEvents)
{
_oibSetupCenterExternalControlEvents = oibSetupCenterExternalControlEvents;
oibSetupCenterExternalControlEvents.Ping = Ping;
oibSetupCenterExternalControlEvents.GetNewPackagingUnitData = GetNewPackagingUnitData;
oibSetupCenterExternalControlEvents.GetPackagingUnitControlStatus = GetPackagingUnitControlStatus;
}
#endregion
#region Start/Stop
public void Start()
{
if (!_oibSetupCenterExternalControlEvents.IsStarted)
{
_oibSetupCenterExternalControlEvents.Start();
}
}
public void Stop()
{
_oibSetupCenterExternalControlEvents.Stop();
}
#endregion
#region ISiplaceSetupCenterExternalControl Members
/// <summary>
/// Check for the client if this service is available.
/// </summary>
/// <returns></returns>
public bool Ping()
{
LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, "SetupCenterExternalControl.Ping");
return _eventHandler != null;
}
public ExternalControlResult[] GetPackagingUnitControlStatus(PackagingUnitLocation[] packagingUnitLocations)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Information, "ExternalControl GetPackagingUnitControlStatus called");
com.itac.oib.siplacesetupcenter.contracts.data.PackagingUnitLocation[] report = com.itac.oib.siplacesetupcenter.contracts.data.PackagingUnitLocationMapper.getArray(packagingUnitLocations);
www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data.ExternalControlResult[] oibResult = null;
try
{
com.itac.oib.siplacesetupcenter.contracts.data.ExternalControlResult[] itacResult = _eventHandler.getPackagingUnitControlStatus(report);
oibResult = com.itac.oib.siplacesetupcenter.contracts.data.ExternalControlResultMapper.get(itacResult);
}
catch (Exception e)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Information, "failed to process GetPackagingUnitControlStatus", e);
}
asmHandler(ref packagingUnitLocations, ref oibResult);
return oibResult;
}
public void UpdateEmptyFields(List<PackagingUnitLocation> packagingUnitLocations, List<ExternalControlResult> result)
{
if (packagingUnitLocations == null || packagingUnitLocations.Count == 0)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocations empty or null");
return;
}
if (result == null || result.Count == 0)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: result empty or null");
return;
}
if (packagingUnitLocations.Count != result.Count)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocations and result different size");
return;
}
// über alle Items iterieren
for (int i = 0; i < packagingUnitLocations.Count; i++)
{
UpdateEmptyFields(packagingUnitLocations[i], result[i]);
}
}
public void UpdateEmptyFields(PackagingUnitLocation packagingUnitLocation, ExternalControlResult result)
{
if (packagingUnitLocation == null)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: packagingUnitLocation is null");
return;
}
if (result == null)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "SetupCenterExternalControl.updateEmptyFields: result is null");
return;
}
// per reflection über alle Felder iterieren, dabei per Name vorgehen
// deepCopy(packagingUnitLocation, result);
// Console.WriteLine("");
if (packagingUnitLocation.PackagingUnit.BatchPackagingUnit != null && result.PackagingUnit.BatchPackagingUnit == null)
{
result.PackagingUnit.BatchPackagingUnit = packagingUnitLocation.PackagingUnit.BatchPackagingUnit;
}
}
// muss noch weiter getestet werden...
public void DeepCopy(object sourceObject, object destObject)
{
Type sourceType = sourceObject.GetType();
Type destType = destObject.GetType();
MemberInfo[] sourceMbrInfoArray = sourceType.GetMembers();
MemberInfo[] destMbrInfoArray = destType.GetMembers();
foreach (MemberInfo sourceMbrInfo in sourceMbrInfoArray)
{
if (sourceMbrInfo.MemberType == MemberTypes.Property)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Error, "" + sourceMbrInfo + " is a " + sourceMbrInfo.MemberType);
// alle einfachen TypeNameConverter direkt prüfen (int, String, bool)
// komplexe Typen ???
PropertyInfo sourcePropInfo = sourceType.GetProperty(sourceMbrInfo.Name);
// gibt es das Property auch im Zielobjekt
foreach (MemberInfo destMbrInfo in destMbrInfoArray)
{
// identischer Name, identischerr Typ
if (destMbrInfo.MemberType == sourceMbrInfo.MemberType && destMbrInfo.Name == sourceMbrInfo.Name)
{
PropertyInfo destPropInfo = destType.GetProperty(destMbrInfo.Name);
object sourceValue = sourcePropInfo.GetValue(sourceObject, null);
object destValue = destPropInfo.GetValue(destObject, null);
if (sourcePropInfo.PropertyType == typeof(String) || sourcePropInfo.PropertyType == typeof(int)
|| sourcePropInfo.PropertyType == typeof(Int32) || sourcePropInfo.PropertyType == typeof(Int64)
|| sourcePropInfo.PropertyType == typeof(long) || sourcePropInfo.PropertyType == typeof(bool)
|| sourcePropInfo.PropertyType == typeof(Boolean))
{
if (sourceValue != destValue)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, "primitive type copy value");
destPropInfo.SetValue(destObject, sourceValue, null);
}
}
else if (!sourceType.IsArray)
{
// komplexer Typ, kein Array
LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, sourceMbrInfo.Name + " is complex type ");
if (sourceValue != null)
{
DeepCopy(sourceValue, destValue);
}
else
{
LogHandler.log(Constants.LOGGER, TraceEventType.Verbose, sourceMbrInfo.Name + " is complex type, sourceValue is null");
}
}
}
}
}
}
}
private void asmHandler(ref www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data.PackagingUnitLocation[] packagingUnitLocations,
ref www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data.ExternalControlResult[] result)
{
//
// special ASM Handling:
// simply return MSD Level and MSD Open Date as received in request
foreach (www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data.PackagingUnitLocation item in packagingUnitLocations)
{
// find this container in result and copy the values
foreach (www.siplace.com.OIB._2008._05.SetupCenter.Contracts.Data.ExternalControlResult resultItem in result)
{
if (item.PackagingUnit.UID.Equals(resultItem.PackagingUnit.UID))
{
resultItem.PackagingUnit.MsdLevel = item.PackagingUnit.MsdLevel;
resultItem.PackagingUnit.MsdOpenDate = item.PackagingUnit.MsdOpenDate;
}
}
}
}
public ExternalControlResult[] GetNewPackagingUnitData(PackagingUnitLocation[] packagingUnitLocations)
{
LogHandler.log(Constants.LOGGER, TraceEventType.Information, "SetupCenterExternalControl.GetPackagingUnitControlStatus");
try
{
// List<ExternalControlResult> result = _eventHandler.GetPackagingUnitControlStatus(packagingUnitLocations);
// hier müssen eigentliche alle Felder aus den quelldaten, die nicht in den Zieldaten enthalten sind per
// Reflection übernommen werden, damit wir nie mehr irgend welche Werte verlieren
// UpdateEmptyFields(packagingUnitLocations, result);
// return result;
}
catch (Exception)
{
_eventHandler = null;
// Fehler, keine weitere info vorhanden, da die Applikation nicht läuft
}
return new ExternalControlResult[0];
}
#endregion
#region IDisposeable
public void Dispose()
{
if (_oibSetupCenterExternalControlEvents != null)
_oibSetupCenterExternalControlEvents.Dispose();
}
#endregion
}
}