internal class ELS_rqst_Info
{
public string msgId { get; set; } = string.Empty;
public string eqpId { get; set; } = string.Empty;
public string subEqpId { get; set; } = string.Empty;
public string secondSubEqpId { get; set; } = string.Empty;
public string carrierId { get; set; } = string.Empty;
public string eapUserId { get; set; } = string.Empty;
public string fabId { get; set; } = string.Empty;
public string portId { get; set; } = string.Empty;
public string clampTime { get; set; } = string.Empty;
public string carrierArriveTime { get; set; } = string.Empty;
public string loadStartTime { get; set; } = string.Empty;
public string loadCompleteTime { get; set; } = string.Empty;
public string unloadCompleteTime { get; set; } = string.Empty;
public string carrierRemoveTime { get; set; } = string.Empty;
public List<ELS_rqst_Slot_info> slotListInfo { get; set; }
public List<ELS_rqst_APCParm_info> apcParmListInfo { get; set; }
private Dictionary<string, Func<object, object>> dicxmlnodes { get; set; }
public ELS_rqst_Info()
{
slotListInfo = new List<ELS_rqst_Slot_info>();
apcParmListInfo = new List<ELS_rqst_APCParm_info>();
dicxmlnodes = new Dictionary<string, Func<object, object>>();
InitXmlNodeList();
}
private void InitXmlNodeList()
{
dicxmlnodes.Add("msgId", (val) => { msgId = (val as string ?? ""); return msgId; });
dicxmlnodes.Add("eqpId", (val) => { eqpId = (val as string ?? ""); return eqpId; });
dicxmlnodes.Add("subEqpId", (val) => { subEqpId = (val as string ?? ""); return subEqpId; });
dicxmlnodes.Add("secondSubEqpId", (val) => { secondSubEqpId = (val as string ?? ""); return secondSubEqpId; });
dicxmlnodes.Add("carrierId", (val) => { carrierId = (val as string ?? ""); return carrierId; });
dicxmlnodes.Add("eapUserId", (val) => { eapUserId = (val as string ?? ""); return eapUserId; });
dicxmlnodes.Add("fabId", (val) => { fabId = (val as string ?? ""); return fabId; });
dicxmlnodes.Add("portId", (val) => { portId = (val as string ?? ""); return portId; });
dicxmlnodes.Add("carrierArriveTime", (val) => { carrierArriveTime = (val as string ?? ""); return clampTime; });
dicxmlnodes.Add("clampTime", (val) => { clampTime = (val as string ?? ""); return clampTime; });
dicxmlnodes.Add("loadStartTime", (val) => { loadStartTime = (val as string ?? ""); return loadStartTime; });
dicxmlnodes.Add("loadCompleteTime", (val) => { loadCompleteTime = (val as string ?? ""); return loadCompleteTime; });
dicxmlnodes.Add("unloadCompleteTime", (val) => { unloadCompleteTime = (val as string ?? ""); return unloadCompleteTime; });
dicxmlnodes.Add("carrierRemoveTime", (val) => { carrierRemoveTime = (val as string ?? ""); return carrierRemoveTime; });
dicxmlnodes.Add("slotInfo", (val) => new ELS_rqst_Slot_info());
dicxmlnodes.Add("apcParmInfo", (val) => new ELS_rqst_APCParm_info());
}
internal object GetObjList(object elementObj)
{
if (elementObj is ELS_rqst_Slot_info)
{
return slotListInfo;
}
else if (elementObj is ELS_rqst_APCParm_info)
{
return apcParmListInfo;
}
else
{
return elementObj;
}
}
public (bool, string) ObjFromXml(XElement root)
{
bool retCode = true;
StringBuilder errSb = new StringBuilder();
try
{
var msgBodyNode = root.Element(SRVConstants.STR_XMLNODE_MSGBODY);
foreach (var currElem in dicxmlnodes.Keys)
{
var currNode = msgBodyNode!.Element(currElem);
if (currNode == null)
{
string errMissingDesc = $"sub-node msg/msgBody/{currElem} not found node! \n";
errSb.Append(errMissingDesc);
retCode = false;
}
else
{
var nodeStrValue = msgBodyNode!.Element(currElem)!.Value.ToString();
var nodeobj = dicxmlnodes[currElem](nodeStrValue);
if (nodeobj is IObjFromXml)
{
//Verify lotinfo, slotinfo, recipeinfo, apcParmInfo
var result = (nodeobj as IObjFromXml)!.ObjFromXml(root, currElem, errSb, GetObjList(nodeobj));
if (result.Item1 == false)
{
errSb.Append(result.Item2);
retCode = false;
}
}
}
}
}
catch (Exception e)
{
Log.logger.Error(e.StackTrace);
return (false, e.Message);
}
return (retCode, errSb.ToString());
}
public (bool, string) ObjFromXml(string xmlstr)
{
try
{
var root = XElement.Parse(xmlstr);
return ObjFromXml(root);
}
catch (Exception e)
{
Log.logger.Error(e.StackTrace);
return (false, e.Message);
}
}
}
internal class ELS_rqst_Slot_info : IObjFromXml
{
public string lotId { get; set; } = string.Empty;
public string waferId { get; set; } = string.Empty;
public string slotId { get; set; } = string.Empty;
public string componentId { get; set; } = string.Empty;
public string waferSelection { get; set; } = string.Empty;
private Dictionary<string, Action<string>> dicxmlnodes { get; set; }
public ELS_rqst_Slot_info()
{
dicxmlnodes = new Dictionary<string, Action<string>>();
InitXmlNodeList();
}
private void InitXmlNodeList()
{
dicxmlnodes.Add("lotId", (val) => lotId = val ?? "");
dicxmlnodes.Add("waferId", (val) => waferId = val ?? "");
dicxmlnodes.Add("slotId", (val) => slotId = val ?? "");
dicxmlnodes.Add("componentId", (val) => componentId = val ?? "");
dicxmlnodes.Add("waferSelection", (val) => waferSelection = val ?? "");
}
public (bool, string) ObjFromXml(XElement root, string NodeName, StringBuilder sb, object objlist)
{
bool retCode = true;
try
{
var slotInfoNodes = root.Element(SRVConstants.STR_XMLNODE_MSGBODY)!.Elements(NodeName);
if (slotInfoNodes == null)
return (false, "/msg/msgBody/slotinfo node is empty \n");
string errNodeName = "";
string errMissingDesc = $"sub-Node {errNodeName} not found in /msg/msgBody/slotinfo \n";
var slotinfolist = objlist as List<ELS_rqst_Slot_info>;
foreach (var slotNode in slotInfoNodes)
{
var newSlot = new ELS_rqst_Slot_info();
foreach (var currElem in newSlot.dicxmlnodes.Keys)
{
if (slotNode.Element(currElem) == null)
{
errNodeName = currElem;
sb.Append(errMissingDesc);
retCode = false;
}
else
{
var nodeStrValue = slotNode!.Element(currElem)!.Value.ToString();
newSlot.dicxmlnodes[currElem](nodeStrValue);
}
}
slotinfolist?.Add(newSlot);
}
}
catch (Exception e)
{
Log.logger.Error(e.StackTrace);
return (false, e.Message);
}
return (retCode, sb.ToString());
}
}
internal class ELS_rqst_APCParm_info : IObjFromXml
{
public string subEqpId { get; set; } = string.Empty;
public string lotId { get; set; } = string.Empty;
public List<ELS_APCParmInfo> apcParmlist;
private Dictionary<string, Func<object, object>> dicxmlnodes { get; set; }
public ELS_rqst_APCParm_info()
{
dicxmlnodes = new Dictionary<string, Func<object, object>>();
apcParmlist = new List<ELS_APCParmInfo>();
InitXmlNodeList();
}
private void InitXmlNodeList()
{
dicxmlnodes.Add("subEqpId", (val) => { subEqpId = val as string ?? ""; return subEqpId; });
dicxmlnodes.Add("lotId", (val) => { lotId = val as string ?? ""; return lotId; });
dicxmlnodes.Add("parmInfo", (val) => new ELS_APCParmInfo());
}
public (bool, string) ObjFromXml(XElement RootNode, string NodeName, StringBuilder sb, object objlist)
{
bool retCode = true;
try
{
var apcNodes = RootNode.Element(SRVConstants.STR_XMLNODE_MSGBODY)!.Elements(NodeName);
if (apcNodes == null)
return (false, "/msg/msgNody/apcParmInfo node is empty (must at least to be an empty node) \n");
var apcinfolist = objlist as List<ELS_rqst_APCParm_info>;
foreach (var parmNode in apcNodes)
{
if (parmNode.HasElements == false)
{
//allow empty node
continue;
}
ELS_rqst_APCParm_info newNode = new ELS_rqst_APCParm_info();
foreach (var currElem in dicxmlnodes.Keys)
{
if (parmNode.Element(currElem) == null)
{
string errMissingDesc = $"sub-Node {currElem} not found in /msg/msgBody/apcParmInfo when node is not empty\n";
sb.Append(errMissingDesc);
retCode = false;
}
else
{
var nodeStrValue = parmNode!.Element(currElem)!.Value.ToString();
var nodeobj = newNode.dicxmlnodes[currElem](nodeStrValue);
if (nodeobj is IObjFromXml)
{
var newobj = nodeobj as ELS_APCParmInfo;
var res = newobj!.ObjFromXml(parmNode, currElem, sb, newNode.apcParmlist);
if (res.Item1 == false)
{
retCode = false;
return (retCode, res.Item2);
}
}
}
}
apcinfolist!.Add(newNode);
}
}
catch (Exception e)
{
Log.logger.Error(e.StackTrace);
return (false, e.Message);
}
return (retCode, sb.ToString());
}
}
internal class ELS_APCParmInfo : IObjFromXml
{
public string paraName { get; set; } = string.Empty;
public string paraValue { get; set; } = string.Empty;
private Dictionary<string, Action<string>> dicxmlnodes { get; set; }
public ELS_APCParmInfo()
{
dicxmlnodes = new Dictionary<string, Action<string>>();
InitXmlNodeList();
}
private void InitXmlNodeList()
{
dicxmlnodes.Add("parmName", (val) => paraName = val ?? "");
dicxmlnodes.Add("parmValue", (val) => paraValue = val ?? "");
}
public (bool, string) ObjFromXml(XElement RootNode, string NodeName, StringBuilder sb, object objlist)
{
bool retCode = true;
try
{
var parmNodes = RootNode.Elements(NodeName);
if (parmNodes == null)
return (false, "/msg/msgNody/apcParmInfo node is empty (must at least to be an empty node) \n");
var parmInfolist = objlist as List<ELS_APCParmInfo>;
foreach (var Node in parmNodes)
{
ELS_APCParmInfo newNode = new ELS_APCParmInfo();
foreach (var currElem in dicxmlnodes.Keys)
{
if (Node.Element(currElem) == null)
{
string errMissingDesc = $"sub-Node {currElem} not found in /msg/msgBody/apcParmInfo when node is not empty\n";
sb.Append(errMissingDesc);
retCode = false;
}
else
{
var nodeStrValue = Node!.Element(currElem)!.Value.ToString();
newNode.dicxmlnodes[currElem](nodeStrValue);
}
}
parmInfolist!.Add(newNode);
}
}
catch (Exception e)
{
Log.logger.Error(e.StackTrace);
return (false, e.Message);
}
return (retCode, sb.ToString());
}
} 以上代码组成的消息是