using Adaptation.Shared; using Adaptation.Shared.Metrology; using Infineon.Yoda; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Xml; namespace Adaptation.Si { internal class Transport { private static object _IfxTransport; private static ConfigData _ConfigData; private static Dictionary> _Parameters; internal static void Initialize(ConfigData configData) { _IfxTransport = null; _ConfigData = configData; _Parameters = new Dictionary>(); } internal static List Setup(bool useSleep, bool setIfxTransport, bool setParameters) { List results = new List(); if (useSleep) { for (int i = 1; i < 50; i++) Thread.Sleep(500); } if (setIfxTransport) { results.Add(string.Concat("IfxTransport Subject: ", _ConfigData.IfxSubject)); IfxDoc ifxDoc = new IfxDoc(); ifxDoc.Add(IfxConst.SUBJECT_PREFIX, _ConfigData.IfxSubjectPrefix); ifxDoc.Add(IfxConst.IFX_CHANNEL, _ConfigData.IfxChannel); ifxDoc.Add(IfxConst.IFX_CONFIGURATION_LOCATION, _ConfigData.IfxConfigurationLocation); ifxDoc.Add(IfxConst.IFX_CONFIGURATION_LOCATION_LOCAL_COPY, _ConfigData.IfxConfigurationLocationLocalCopy); results.Add(string.Concat("IfxTransport Config: ", ifxDoc)); _IfxTransport = new IfxTransport(); IfxTransport ifxTransport = (IfxTransport)_IfxTransport; ifxTransport.Create(ifxDoc); if (useSleep) { for (int i = 1; i < 10; i++) Thread.Sleep(500); } results.Add(string.Concat("IfxTransport Current Daemon: ", ifxTransport.CurrentDaemon)); results.Add(string.Concat("IfxTransport Current Network: ", ifxTransport.CurrentNetwork)); results.Add(string.Concat("IfxTransport Current Service: ", ifxTransport.CurrentService)); results.Add(string.Concat("IfxTransport Current PoolName: ", ifxTransport.CurrentPoolName)); } if (setParameters) { try { _Parameters = GetParameters(); } catch { /* Dev doesn't have this table */ } } return results; } private static Dictionary> GetParameters() { Dictionary> results = new Dictionary>(); List parameters = Parameters.GetParameters(); string iqsName; foreach (var parameter in parameters) { iqsName = string.Concat(parameter.Iqs_name); if (!results.ContainsKey(iqsName)) results.Add(iqsName, new List()); results[iqsName].Add(parameter); } return results; } internal static bool IsMappedPart(List parts) { List check = (from l in parts where _ConfigData.MappedParts.Contains(l) select l).ToList(); return check.Any(); } internal static List GetDistinctParts(List preRunInfo) { List results = new List(); foreach (var item in preRunInfo) results.Add(item.PartNumber); results = results.Distinct().ToList(); return results; } internal static Dictionary GetScopeInfoCollections(ILogic logic, ConfigData configData, Dictionary>> rawData, Dictionary> tests) { Dictionary results = new Dictionary(); int min; int max; IScopeInfo scopeInfo; foreach (var element in rawData) { min = tests[element.Key].Min(); max = tests[element.Key].Max() + 1; scopeInfo = new ScopeInfo(logic, configData, element.Key); results.Add(element.Key, scopeInfo); } return results; } internal static ExtractResult MergeAndMaybeSort(ExtractResult extractResult, List preRunInfo, Dictionary> tests) { if (!preRunInfo.Any()) throw new Exception(); if (tests.ElementAt(0).Key != Test.AFMRoughness && tests.ElementAt(0).Key != Test.UV) { int min; int max; List matchingPreRunInfo; Dictionary> keyValuePairs; foreach (var testKeyValuePair in tests) { min = testKeyValuePair.Value.Min(); max = testKeyValuePair.Value.Max() + 1; for (int i = min; i < max; i++) { switch (testKeyValuePair.Key) { default: if (preRunInfo.Count != 1) throw new Exception(); else matchingPreRunInfo = preRunInfo; break; } if (matchingPreRunInfo.Count > 1) throw new Exception(); for (int g = 1; g < 3; g++) { switch (g) { case 1: keyValuePairs = extractResult.DatabaseHeaders; break; case 2: keyValuePairs = extractResult.DatabaseDetails; break; default: throw new Exception(); } foreach (var element in keyValuePairs) { if (matchingPreRunInfo.Count == 0) element.Value[i] = string.Empty; else { switch (element.Key) { case Column.SID: break; //case "MID": element.Value[i] = matchingPreRunInfo[0].MID; break; case Column.Lot: element.Value[i] = matchingPreRunInfo[0].RunNumber; break; case Column.Recipe: element.Value[i] = matchingPreRunInfo[0].Recipe; break; case Column.Part: element.Value[i] = matchingPreRunInfo[0].PartNumber; break; case Column.Date: element.Value[i] = matchingPreRunInfo[0].Date; break; case Column.Wafer_ID: element.Value[i] = matchingPreRunInfo[0].PocketNumber; break; case Column.WaferPocket_Candela: element.Value[i] = matchingPreRunInfo[0].PocketNumber; break; case Column.Wafer_Scribe: element.Value[i] = matchingPreRunInfo[0].WaferLot; break; //case "SatelliteGroup": element.Value[i] = matchingPreRunInfo[0].SatelliteGroup; break; //case "StartStamp": element.Value[i] = matchingPreRunInfo[0].StartStamp; break; default: throw new Exception(); } } } } } } } if (tests.ElementAt(0).Key == Test.CandelaKlarfDC || tests.ElementAt(0).Key == Test.CandelaLaser || tests.ElementAt(0).Key == Test.CandelaPSL || tests.ElementAt(0).Key == Test.CandelaVerify) { int min; int max; List sortIndeices; List singleColumnSortedValues; List singleColumnBeforeSortValues; Dictionary> valuesCollection; foreach (var testKeyValuePair in tests) { if (testKeyValuePair.Key == Test.CandelaKlarfDC || testKeyValuePair.Key == Test.CandelaLaser || testKeyValuePair.Key == Test.CandelaPSL || testKeyValuePair.Key == Test.CandelaVerify) { min = testKeyValuePair.Value.Min(); max = testKeyValuePair.Value.Max() + 1; sortIndeices = new List(); singleColumnBeforeSortValues = (from l in extractResult.DatabaseDetails[Column.WaferPocket_Candela] select l).ToList(); singleColumnSortedValues = (from l in extractResult.DatabaseDetails[Column.WaferPocket_Candela] orderby !string.IsNullOrEmpty(l), l select l).ToList(); for (int i = min; i < max; i++) sortIndeices.Add(singleColumnBeforeSortValues.IndexOf(singleColumnSortedValues[i])); valuesCollection = new Dictionary>(); foreach (var element in extractResult.DatabaseDetails) { valuesCollection.Add(element.Key, new List()); for (int i = min; i < max; i++) valuesCollection[element.Key].Add(extractResult.DatabaseDetails[element.Key][i]); element.Value.Clear(); for (int i = min; i < max; i++) extractResult.DatabaseDetails[element.Key].Add(valuesCollection[element.Key][sortIndeices[i]]); } valuesCollection = new Dictionary>(); foreach (var element in extractResult.Details) { valuesCollection.Add(element.Key, new List()); for (int i = min; i < max; i++) valuesCollection[element.Key].Add(extractResult.Details[element.Key][i]); element.Value.Clear(); for (int i = min; i < max; i++) extractResult.Details[element.Key].Add(valuesCollection[element.Key][sortIndeices[i]]); } valuesCollection = new Dictionary>(); foreach (var element in extractResult.Parameters) { valuesCollection.Add(element.Key, new List()); for (int i = min; i < max; i++) valuesCollection[element.Key].Add(extractResult.Parameters[element.Key][i]); element.Value.Clear(); for (int i = min; i < max; i++) extractResult.Parameters[element.Key].Add(valuesCollection[element.Key][sortIndeices[i]]); } } } } return extractResult; } private static Dictionary> GetPartParameters(string partNumber, bool isMappedPart) { Dictionary> results = new Dictionary>(); List partParameters = PartParameters.GetPartParameters(partNumber); foreach (var partParameter in partParameters) { if (Convert.IsDBNull(partParameter.Enum) || !Enum.TryParse(partParameter.Enum.ToString(), out Column column)) { if (isMappedPart && partParameter.Crit_to_ship.ToString() == "CRIT") throw new Exception(); else continue; } else { if (!results.ContainsKey(column)) results.Add(column, new List()); results[column].Add(partParameter); } } return results; } private static List GetPartHistory(string partNumber) { List results = PartHistory.GetPartHistory(partNumber); return results; } private static DataKeys GetDataKeys(Dictionary> columns, Logistics logistics, Dictionary> ignoreIndeices, DataKeys dataKeys, int r, bool forParameter) { DataKeys result = dataKeys; Column key; if (!forParameter) { key = Column.Employee; if (!columns.ContainsKey(key)) result.Employee = "AUTO"; else result.Employee = columns[key][r]; } key = Column.WaferPosition_BV; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferPosition = columns[key][r]; key = Column.WaferPosition_CV; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferPosition = columns[key][r]; key = Column.WaferPosition_Hall; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferPosition = columns[key][r]; key = Column.WaferPosition_PR; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferPosition = columns[key][r]; // key = Column.Wafer_Region; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferRegion = columns[key][r]; // key = Column.Wafer_Scribe; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferScribe = columns[key][r]; // key = Column.X_Coord; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.X = columns[key][r]; // key = Column.Y_Coord; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.Y = columns[key][r]; return result; } private static ExtractorKeys GetExtractorKeys(Dictionary> columns, Logistics logistics, Dictionary> ignoreIndeices, ExtractorKeys extractorKeys, int r, bool forParameter) { ExtractorKeys result = extractorKeys; Column key; key = Column.Lot; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.Lot = columns[key][r]; // key = Column.Part; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.Part = columns[key][r]; // key = Column.Process; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.Process = columns[key][r]; // key = Column.Recipe; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.Recipe = columns[key][r]; // key = Column.Wafer_ID; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferID = columns[key][r]; key = Column.Denton_Gun_Pocket; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferID = columns[key][r]; key = Column.WaferPocket_Candela; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferID = columns[key][r]; key = Column.WaferPocket_Warp; if (columns.ContainsKey(key) && (!ignoreIndeices.ContainsKey(key) || !ignoreIndeices[key].Contains(r))) result.WaferID = columns[key][r]; return result; } private static string GetUnit(string columnDiplayName, string columnDatabaseName) { string result; if (_Parameters.ContainsKey(columnDiplayName) && !(_Parameters[columnDiplayName][0].Units is null) && !string.IsNullOrEmpty(_Parameters[columnDiplayName][0].Units.ToString())) result = _Parameters[columnDiplayName][0].Units.ToString(); else if (_Parameters.ContainsKey(columnDatabaseName) && !(_Parameters[columnDatabaseName][0].Units is null) && !string.IsNullOrEmpty(_Parameters[columnDatabaseName][0].Units.ToString())) result = _Parameters[columnDatabaseName][0].Units.ToString(); else result = "xx"; return result; } private static double? GetLsl(PartParameters partParameters) { if (!(partParameters.Lsl is null) && !string.IsNullOrEmpty(partParameters.Lsl.ToString())) { double.TryParse(partParameters.Lsl.ToString(), out double lsl); return lsl; } return null; } private static double? GetUsl(PartParameters partParameters) { if (!(partParameters.Usl is null) && !string.IsNullOrEmpty(partParameters.Usl.ToString())) { double.TryParse(partParameters.Usl.ToString(), out double usl); return usl; } return null; } private static double? GetTsl(PartParameters partParameters) { if (!(partParameters.Target is null) && !string.IsNullOrEmpty(partParameters.Target.ToString())) { double.TryParse(partParameters.Target.ToString(), out double tsl); return tsl; } return null; } private static Dictionary> GetKeyValuePairs(Logistics logistics, ExtractResult extractResult, string xml2Text) { Dictionary> results = new Dictionary>(); bool documentKeys = false; bool fieldParameter = false; bool isFirstParmeter = true; bool documnetParameter = false; string elementName = string.Empty; const string elementField = "Field"; bool fieldParameterNameKeys = false; bool fieldParameterNameValue = false; string attributeNameValue = string.Empty; const string elementDocument = "Document"; string parameterAttributeNameValue = string.Empty; string keyOrSettingAttributeNameValue = string.Empty; string parameterKeyAttributeNameValue = string.Empty; const string attributeNameValueParameter = "PARAMETER"; const string attributeNameValueParameterName = "PARAMETERNAME"; StringReader stringReader = new StringReader(xml2Text); XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { IgnoreWhitespace = true }; XmlReader xmlReader = XmlReader.Create(stringReader, xmlReaderSettings); while (xmlReader.Read()) { switch (xmlReader.NodeType) { case XmlNodeType.Element: elementName = xmlReader.Name; if (elementName == elementDocument || elementName == elementField) { while (xmlReader.HasAttributes && xmlReader.MoveToNextAttribute()) { if (xmlReader.Name == "name") { attributeNameValue = xmlReader.Value; if (!documentKeys && attributeNameValue == "KEYS") documentKeys = true; else if (documentKeys && !fieldParameter && elementName == elementField && attributeNameValue != attributeNameValueParameter) keyOrSettingAttributeNameValue = attributeNameValue; else if (documentKeys && !fieldParameter && elementName == elementField && attributeNameValue == attributeNameValueParameter) fieldParameter = true; else if (documentKeys && fieldParameter && elementName == elementDocument && attributeNameValue == attributeNameValueParameter && !documnetParameter) documnetParameter = true; else if (documentKeys && fieldParameter && documnetParameter && elementName == elementField && attributeNameValue == attributeNameValueParameterName && string.IsNullOrEmpty(parameterAttributeNameValue)) { xmlReader.Read(); xmlReader.Read(); parameterAttributeNameValue = xmlReader.Value; } else if (documentKeys && fieldParameter && documnetParameter && !string.IsNullOrEmpty(parameterAttributeNameValue)) { if (elementName == elementDocument && attributeNameValue == attributeNameValueParameter) { parameterAttributeNameValue = string.Empty; if (isFirstParmeter) isFirstParmeter = false; if (fieldParameterNameValue) fieldParameterNameValue = false; if (fieldParameterNameKeys) fieldParameterNameKeys = false; if (!string.IsNullOrEmpty(parameterKeyAttributeNameValue)) parameterKeyAttributeNameValue = string.Empty; } else if (attributeNameValue == "VALUE") { if (!fieldParameterNameValue) fieldParameterNameValue = true; if (fieldParameterNameKeys) fieldParameterNameKeys = false; } else if (!fieldParameterNameKeys && attributeNameValue == "KEYS") fieldParameterNameKeys = true; else if (fieldParameterNameValue && fieldParameterNameKeys) parameterKeyAttributeNameValue = attributeNameValue; } } } } break; case XmlNodeType.Text: if (documentKeys && !documnetParameter) { if (!results.ContainsKey(keyOrSettingAttributeNameValue)) results.Add(keyOrSettingAttributeNameValue, new List()); results[keyOrSettingAttributeNameValue].Add(xmlReader.Value); } else if (fieldParameter && documnetParameter && !string.IsNullOrEmpty(parameterAttributeNameValue) && fieldParameterNameValue && !fieldParameterNameKeys) { if (!results.ContainsKey(parameterAttributeNameValue)) results.Add(parameterAttributeNameValue, new List()); results[parameterAttributeNameValue].Add(xmlReader.Value); } else if (fieldParameter && documnetParameter && !string.IsNullOrEmpty(parameterAttributeNameValue) && fieldParameterNameValue && fieldParameterNameKeys && isFirstParmeter) { if (!results.ContainsKey(parameterKeyAttributeNameValue)) results.Add(parameterKeyAttributeNameValue, new List()); results[parameterKeyAttributeNameValue].Add(xmlReader.Value); } break; } } return results; } internal static void SaveXmlAsHtml(Logistics logistics, ExtractResult extractResult, ConfigData configData, string xml2Text, string htmlDirectory, string file) { StringBuilder html = new StringBuilder(); html.Clear(); html.AppendLine(""); html.AppendLine(""); html.Append("").Append(configData.GetEquipmentType()).AppendLine(""); html.AppendLine(""); html.AppendLine(""); int count; string htmlFile; List counts = new List(); Array array = Enum.GetValues(typeof(Column)); List allDataKeyNames = new List(); List allSettingNames = new List(); List logisticsColumns = new List(); List presentSettingNames = new List(); List allLDSParameterNames = new List(); List allExtractorKeyNames = new List(); List parameterOrRowColumns = new List(); Dictionary> keyValuePairs = GetKeyValuePairs(logistics, extractResult, xml2Text); foreach (var item in typeof(Settings).GetProperties()) allSettingNames.Add(item.Name); foreach (var item in typeof(ExtractorKeys).GetProperties()) allExtractorKeyNames.Add(item.Name); foreach (var item in typeof(DataKeys).GetProperties()) allDataKeyNames.Add(item.Name); foreach (var item in typeof(Parameter).GetProperties()) allLDSParameterNames.Add(item.Name); Dictionary columnNames = new Dictionary(); foreach (Column column in array) columnNames.Add(column.GetDiplayName(), column); foreach (KeyValuePair> element in keyValuePairs) { counts.Add(element.Value.Count()); if (columnNames.ContainsKey(element.Key)) parameterOrRowColumns.Add(element.Key); else { if (Enum.TryParse(element.Key, out Description.RowColumn rowColumnTry)) parameterOrRowColumns.Add(rowColumnTry.ToString()); else { if (Enum.TryParse(element.Key, out Description.LogisticsColumn logisticsColumnTry)) logisticsColumns.Add(logisticsColumnTry.ToString()); else { if (allSettingNames.Contains(element.Key)) presentSettingNames.Add(element.Key); else { if (allExtractorKeyNames.Contains(element.Key)) parameterOrRowColumns.Add(element.Key); else { if (allDataKeyNames.Contains(element.Key)) parameterOrRowColumns.Add(element.Key); else { if (allLDSParameterNames.Contains(element.Key)) parameterOrRowColumns.Add(element.Key); else throw new Exception(); } } } } } } } count = counts.Max(); html.AppendLine(""); html.AppendLine(""); foreach (var element in keyValuePairs) { if (element.Value.Count() == 0 && parameterOrRowColumns.Contains(element.Key)) html.Append(""); } html.AppendLine(""); html.AppendLine("
").Append(element.Key).AppendLine("
"); // html.AppendLine("
"); // html.AppendLine(""); html.AppendLine(""); foreach (var item in presentSettingNames) html.Append(""); html.AppendLine(""); html.AppendLine(""); foreach (var element in keyValuePairs) { if (presentSettingNames.Contains(element.Key)) { if (string.IsNullOrEmpty(element.Value[0])) html.AppendLine(""); else html.Append(""); } } html.AppendLine(""); html.AppendLine("
").Append(item).AppendLine("
 ").Append(element.Value[0]).AppendLine("
"); // html.AppendLine("
"); // html.AppendLine(""); html.AppendLine(""); foreach (var item in logisticsColumns) html.Append(""); html.AppendLine(""); for (int i = 0; i < 1; i++) { html.AppendLine(""); foreach (var element in keyValuePairs) { if (logisticsColumns.Contains(element.Key)) { if (string.IsNullOrEmpty(element.Value[i])) html.AppendLine(""); else html.Append(""); } } } html.AppendLine(""); html.AppendLine("
").Append(item).AppendLine("
 ").Append(element.Value[i]).AppendLine("
"); // html.AppendLine("
"); // html.AppendLine(""); html.AppendLine(""); foreach (var item in parameterOrRowColumns) html.Append(""); html.AppendLine(""); for (int i = 0; i < 1; i++) { html.AppendLine(""); foreach (var element in keyValuePairs) { if (parameterOrRowColumns.Contains(element.Key)) { if (element.Value.Count() > 1 || element.Value.Count() <= i || string.IsNullOrEmpty(element.Value[i])) html.Append(""); else { if (!allExtractorKeyNames.Contains(element.Key) && element.Key != "SID") html.Append(""); else html.Append(""); } } } html.AppendLine(""); } html.AppendLine("
").Append(item).AppendLine("
 ").Append(element.Value[i]).AppendLine("").Append(element.Value[i]).AppendLine("
"); // html.AppendLine("
"); // html.AppendLine(""); html.AppendLine(""); foreach (var item in parameterOrRowColumns) html.Append(""); html.AppendLine(""); for (int i = 0; i < count; i++) { html.AppendLine(""); foreach (var element in keyValuePairs) { if (parameterOrRowColumns.Contains(element.Key)) { if (element.Value.Count() == 1 || element.Value.Count() <= i || string.IsNullOrEmpty(element.Value[i])) html.Append(""); else { if (!allExtractorKeyNames.Contains(element.Key)) html.Append(""); else html.Append(""); } } } html.AppendLine(""); } html.AppendLine("
").Append(item).AppendLine("
 ").Append(element.Value[i]).AppendLine("").Append(element.Value[i]).AppendLine("
"); // html.AppendLine(""); html.AppendLine(""); htmlFile = string.Concat(htmlDirectory, @"\", Path.GetFileNameWithoutExtension(file), ".html"); File.WriteAllText(htmlFile, html.ToString()); File.SetLastWriteTime(htmlFile, logistics.DateTimeFromSequence); try { File.SetLastWriteTime(htmlFile, logistics.DateTimeFromSequence); } catch (Exception) { } } internal static Dictionary GetIfxDocs(Logistics logistics, ExtractResult extractResult, ConfigData configData, string writePath, Dictionary> tests, List distinctParts, Dictionary scopeInfoCollections, bool isMappedPart) { Dictionary results = new Dictionary(); int c; int min; int max; DATA data; string sid; string file; IfxDoc ifxDoc; string nullData; string xml2Text; IScopeInfo scopeInfo; Parameter parameter; string testAppendage; string htmlDirectory; List partHistory; List rowCheck = new List(); if (scopeInfoCollections.Any()) { string xmlDirectory = string.Empty; ExtendedParameter extendedParameter; List extendedParameters; Dictionary> ignoreIndeices; List parameters = new List(); List parameterCollections = new List(); string directory = string.Concat(writePath, @"\", configData.GetEquipmentType(), @"\Target"); Dictionary> toolHeadersAndDatabaseHeadersCollection = extractResult.GetToolHeadersAndDatabaseHeadersCollection(); Dictionary> toolDetailsAndDatabaseDetailsCollection = extractResult.GetToolDetailsAndDatabaseDetailsCollection(); if (logistics.NullData is null) nullData = string.Empty; else nullData = logistics.NullData.ToString(); if (!distinctParts.Any()) partHistory = new List(); else { if (distinctParts.Count != 1) throw new Exception(); partHistory = GetPartHistory(distinctParts[0]); } if (!string.IsNullOrEmpty(writePath)) { xmlDirectory = string.Concat(directory, @"\xml"); if (!Directory.Exists(xmlDirectory)) Directory.CreateDirectory(xmlDirectory); } foreach (var testKeyValuePair in tests) { if (isMappedPart && !partHistory.Any()) throw new Exception(); min = testKeyValuePair.Value.Min(); max = testKeyValuePair.Value.Max() + 1; scopeInfo = scopeInfoCollections[testKeyValuePair.Key]; ignoreIndeices = extractResult.IgnoreIndeices[testKeyValuePair.Key]; data = new DATA(_ConfigData.IfxSubjectPrefix, logistics, scopeInfo, extractResult.DatabaseHeaders[Column.SID][min]); if (toolHeadersAndDatabaseHeadersCollection.Any()) { data.DataKeys = GetDataKeys(toolHeadersAndDatabaseHeadersCollection, logistics, ignoreIndeices, data.DataKeys, r: min, forParameter: false); data.ExtractorKeys = GetExtractorKeys(toolHeadersAndDatabaseHeadersCollection, logistics, ignoreIndeices, data.ExtractorKeys, r: min, forParameter: false); } if (partHistory.Any()) { if (!(partHistory[0].Process_flow is null) && !string.IsNullOrEmpty(partHistory[0].Process_flow.ToString())) data.ExtractorKeys.ProcessFlow = partHistory[0].Process_flow.ToString(); } c = 0; parameterCollections.Clear(); foreach (KeyValuePair> element in extractResult.Parameters) { rowCheck.Clear(); for (int r = min; r < max; r++) { if (ignoreIndeices[element.Key].Contains(r)) rowCheck.Add(r); } if (rowCheck.Count != (max - min)) { extendedParameters = extractResult.ExtendedParameters[element.Key]; parameterCollections.Add(new ParameterCollection()); for (int r = min; r < max; r++) { if (!ignoreIndeices[element.Key].Contains(r)) { extendedParameter = extendedParameters[r]; if (!extendedParameter.Ignore.Value && extendedParameter.CriticalToShip.HasValue && extendedParameter.CriticalToShip.Value) { parameter = new Parameter(logistics, extendedParameter); if (toolDetailsAndDatabaseDetailsCollection.Any()) { parameter.DataKeys = GetDataKeys(toolDetailsAndDatabaseDetailsCollection, logistics, ignoreIndeices, parameter.DataKeys, r, forParameter: true); parameter.ExtractorKeys = GetExtractorKeys(toolDetailsAndDatabaseDetailsCollection, logistics, ignoreIndeices, parameter.ExtractorKeys, r, forParameter: true); } parameterCollections[c].Collection.Add(parameter); } } } c += 1; } } if (parameterCollections.Any()) parameterCollections = (from l in parameterCollections where l.Collection.Any() select l).ToList(); if (parameterCollections.Any()) { parameters.Clear(); foreach (var item in parameterCollections) parameters.Add(item.GetIfxDoc()); ifxDoc = data.GetIfxDoc(parameters); if (ifxDoc.GetFieldCount() == 0) throw new Exception(); else { xml2Text = ifxDoc.GetAsXml2(); if (!(logistics.NullData is null) && !string.IsNullOrEmpty(nullData) && xml2Text.Contains(nullData)) throw new Exception(); if (xml2Text.Contains("-") && !(rowCheck is null)) throw new Exception(); if (!string.IsNullOrEmpty(writePath)) { //testAppendage = string.Concat(" - ", (int)element.Key); testAppendage = string.Concat(" - ", scopeInfo.FileNameWithoutExtension); file = string.Concat(xmlDirectory, @"\", logistics.JobID, "_", logistics.Sequence, testAppendage, ".xml"); ifxDoc.Save(file, IfxConst.IfxDocFileType.Xml2, Overwrite: true); if (logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) { try { File.SetLastWriteTime(file, logistics.DateTimeFromSequence); } catch (Exception) { } } htmlDirectory = string.Concat(directory, @"\html"); if (!Directory.Exists(htmlDirectory)) Directory.CreateDirectory(htmlDirectory); SaveXmlAsHtml(logistics, extractResult, configData, xml2Text, htmlDirectory, file); } sid = extractResult.DatabaseHeaders[Column.SID][min]; if (!isMappedPart && results.ContainsKey(sid)) { sid = string.Concat(sid, " ", DateTime.Now.Ticks.ToString()); Thread.Sleep(100); } results.Add(sid, ifxDoc); } } } } return results; } internal static List SendIfxDocs(ILogic logic, ConfigData configData, bool isMappedPart, Dictionary ifxDocs) { List results = new List(); IfxDoc reply; string replyString; LDS2559Reply.DATA lds2559Data; if (_IfxTransport is null) { bool setParameters = !_Parameters.Any(); List messages = Setup(useSleep: false, setIfxTransport: true, setParameters: setParameters); foreach (string message in messages) { System.Diagnostics.Debug.Print(message); } } if (_IfxTransport is null) throw new Exception(); else { IfxTransport ifxTransport = (IfxTransport)_IfxTransport; if (isMappedPart && !(configData.EquipmentConnection is null)) { DateTime dateTime = new DateTime(2019, 08, 25); if (!(logic.Logistics is null) && logic.Logistics.DateTimeFromSequence >= dateTime) { foreach (var element in ifxDocs) { if (element.Value.GetFieldCount() == 0) throw new Exception(); else element.Value.Save(string.Concat(@"\\MESSV02ECC1.EC.LOCAL\EC_EAFLog\Production\IFXDocs\", configData.GetEquipmentType(), @"\", element.Key.Replace("*", string.Empty), ".xml"), IfxConst.IfxDocFileType.Xml2, Overwrite: true); } } } foreach (var element in ifxDocs) { if (element.Value.GetFieldCount() == 0) throw new Exception(); else { element.Value.SendSubject = string.Concat(ifxTransport.SubjectPrefix, ".", _ConfigData.IfxSubject); if (ifxTransport.SubjectPrefix.StartsWith("MES_")) { ifxTransport.Publish(element.Value, false, 60); lds2559Data = null; } else { if (!isMappedPart) lds2559Data = null; else { IfxEnvelope ifxEnvelope = ifxTransport.SendRequest(element.Value, false, 60, IfxConst.IfxMessageType.Yoda); if (ifxEnvelope is null) throw new Exception("SendRequest timeout occurred"); else { reply = ifxEnvelope.ExtractDocument(); replyString = reply.ToString(); try { lds2559Data = new LDS2559Reply.DATA(reply); } catch (Exception) { lds2559Data = null; } } } } } results.Add(lds2559Data); } } return results; } internal static string EvaluateSendResults(ILogic logic, ConfigData configData, List distinctParts, bool isMappedPart, List transportSendResults) { StringBuilder result = new StringBuilder(); string mID; if (logic is null || logic.Logistics is null || logic.Logistics.MID is null) mID = string.Empty; else mID = logic.Logistics.MID; string part; if (!distinctParts.Any()) part = string.Empty; else { if (!isMappedPart) part = distinctParts[0]; else part = string.Concat(distinctParts[0], " (Mapped) "); } if (!transportSendResults.Any()) throw new Exception(string.Concat(configData.GetEquipmentType(), " - ", mID, " - ", part, " Nothing was sent!")); foreach (var item in transportSendResults) { if (item is null) result.AppendLine(string.Concat(configData.GetEquipmentType(), " - ", mID, " - ", part, " null")); else { if (item.UNACCEPTED is null || (!(item.ETC is null) && item.ETC.ToString() == "-1")) throw new Exception(string.Concat(configData.GetEquipmentType(), " - ", mID, " - ", part, " Invalid data")); else { double.TryParse(item.UNACCEPTED.ToString(), out double unaccepted); if (unaccepted > 0) throw new Exception("Unaccepted record present"); else result.AppendLine(string.Concat("Reply: ", item, Environment.NewLine, Environment.NewLine)); } } } return result.ToString(); } } }