245 lines
11 KiB
C#
245 lines
11 KiB
C#
#region Namespace
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
using Asm.As.Oib.SiplaceSetupCenter.Contracts.Data;
|
|
using Asm.As.Oib.SiplaceSetupCenter.Contracts.Service;
|
|
using com.itac.mes.proxy;
|
|
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()
|
|
{
|
|
_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.Information, "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);
|
|
Asm.As.Oib.SiplaceSetupCenter.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 Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.PackagingUnitLocation[] packagingUnitLocations,
|
|
ref Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.ExternalControlResult[] result)
|
|
{
|
|
//
|
|
// special ASM Handling:
|
|
// simply return MSD Level and MSD Open Date as received in request
|
|
|
|
foreach (Asm.As.Oib.SiplaceSetupCenter.Contracts.Data.PackagingUnitLocation item in packagingUnitLocations)
|
|
{
|
|
// find this container in result and copy the values
|
|
foreach (Asm.As.Oib.SiplaceSetupCenter.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
|
|
|
|
}
|
|
} |