Compare commits
	
		
			2 Commits
		
	
	
		
			823a31e48a
			...
			e3910d700f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e3910d700f | |||
| e651c2804c | 
							
								
								
									
										3
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -7,6 +7,7 @@ | ||||
|         "CASS", | ||||
|         "CEPIEPSILON", | ||||
|         "CUST", | ||||
|         "DDUPSFS", | ||||
|         "DDUPSP", | ||||
|         "EQPT", | ||||
|         "GETJOBS", | ||||
| @ -31,6 +32,8 @@ | ||||
|         "substr", | ||||
|         "SUSCEPTOR", | ||||
|         "targ", | ||||
|         "TENCOR", | ||||
|         "THFTIRQS", | ||||
|         "TIBCO", | ||||
|         "Wafr" | ||||
|     ], | ||||
|  | ||||
| @ -128,7 +128,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -153,7 +153,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             MoveArchive(reportFullPath, dateTime); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -8,6 +8,7 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.IQSSi; | ||||
| @ -109,6 +110,59 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static Tuple<string, string> GetLines(Logistics logistics, List<txt.Description> descriptions) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         char del = '\t'; | ||||
|         txt.Description x = descriptions[0]; | ||||
|         _ = result.Append(x.DcnLpdMin).Append(del).    // 001 -  | ||||
|             Append(x.DcnLpdMax).Append(del).       // 002 -  | ||||
|             Append(x.DcnLpdMean).Append(del).      // 003 - DCN LPD | ||||
|             Append(x.DcnAreaCountMin).Append(del). // 004 -  | ||||
|             Append(x.DcnAreaCountMax).Append(del). // 005 -  | ||||
|             Append(x.DcnAreaCountMean).Append(del).// 006 - DCN Area | ||||
|             Append(x.DcnAreaMin).Append(del).      // 007 -  | ||||
|             Append(x.DcnAreaMax).Append(del).      // 008 -  | ||||
|             Append(x.Date).Append(del).            // 009 -  | ||||
|             Append(x.DcnHazeAvgMean).Append(del).  // 010 - Haze Average | ||||
|             Append(string.Empty).Append(del).              // 011 -  | ||||
|             Append(string.Empty).Append(del).              // 012 -  | ||||
|             Append(string.Empty).Append(del).              // 013 -  | ||||
|             Append(string.Empty).Append(del).              // 014 -  | ||||
|             Append(string.Empty).Append(del).              // 015 -  | ||||
|             Append(string.Empty).Append(del).              // 016 -  | ||||
|             Append(string.Empty).Append(del).              // 017 -  | ||||
|             Append(string.Empty).Append(del).              // 018 -  | ||||
|             Append(string.Empty).Append(del).              // 019 -  | ||||
|             Append(string.Empty).Append(del).              // 020 -  | ||||
|             Append(string.Empty).Append(del).              // 021 -  | ||||
|             Append(string.Empty).Append(del).              // 022 -  | ||||
|             Append(string.Empty).Append(del).              // 023 -  | ||||
|             Append(string.Empty).Append(del).              // 024 -  | ||||
|             Append(string.Empty).Append(del).              // 025 -  | ||||
|             Append(string.Empty).Append(del).              // 026 -  | ||||
|             Append(string.Empty).Append(del).              // 027 -  | ||||
|             Append(x.RDS).Append(del).             // 028 - Lot | ||||
|             Append(x.Reactor).Append(del).         // 029 - Process | ||||
|             Append(x.Recipe).Append(del).          // 030 - Part | ||||
|             Append(x.DcnScrMean).Append(del).      // 031 - Scratch Count | ||||
|             Append(string.Empty).Append(del).              // 032 -  | ||||
|             Append(string.Empty).Append(del).              // 033 -  | ||||
|             Append(string.Empty).Append(del).              // 034 -  | ||||
|             Append(x.DcnMicroScrMean).Append(del). // 035 - Scratch Length | ||||
|             Append(string.Empty).Append(del).              // 036 -  | ||||
|             Append(string.Empty).Append(del).              // 037 -  | ||||
|             Append(string.Empty).Append(del).              // 038 -  | ||||
|             Append(x.DcnAllMean).Append(del).      // 039 - Average Sum of Defects | ||||
|             Append(x.DcnAllMax).Append(del).       // 040 - Max Sum of defects | ||||
|             Append(x.DcnAllMin).Append(del).       // 041 - Min Sum of Defects | ||||
|             Append(string.Empty).Append(del).              // 042 -  | ||||
|             Append(logistics.MesEntity).Append(del).                 // 043 -  | ||||
|             Append(x.DcnAreaMean).Append(del).     // 044 - DCN MM2 | ||||
|             AppendLine(); | ||||
|         return new Tuple<string, string>(result.ToString(), x.Date); | ||||
|     } | ||||
|  | ||||
|     private void SaveIQSFile(string reportFullPath, DateTime dateTime, List<txt.Description> descriptions, Test[] tests) | ||||
|     { | ||||
|         if (tests.Length == 0) | ||||
| @ -116,7 +170,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         else | ||||
|         { | ||||
|             bool isDummyRun = false; | ||||
|             Tuple<string, string> lines = OpenInsight.FileRead.GetLines(_Logistics, descriptions); | ||||
|             Tuple<string, string> lines = GetLines(_Logistics, descriptions); | ||||
|             string check = lines.Item1.Replace(lines.Item2, "$Date$"); | ||||
|             ScopeInfo scopeInfo = new(tests[0], _IQSFile); | ||||
|             List<(Shared.Properties.IScopeInfo, string)> collection = new(); | ||||
| @ -158,7 +212,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             SaveIQSFile(reportFullPath, dateTime, descriptions, tests); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -268,7 +268,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static ReadOnlyCollection<Pre> GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection<string> matchingFiles, bool _) | ||||
|     private static ReadOnlyCollection<Pre> GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection<string> matchingFiles) | ||||
|     { | ||||
|         List<Pre> results = new(); | ||||
|         Pre pre; | ||||
| @ -366,10 +366,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); | ||||
|         List<txt.Description> descriptions = txt.ProcessData.GetDescriptions(jsonElements); | ||||
|         bool mesEntityMatchesProcess = descriptions.Count > 0 && descriptions[0].MesEntity == descriptions[0].Reactor; | ||||
|         ReadOnlyCollection<Pre> preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles, mesEntityMatchesProcess); | ||||
|         ReadOnlyCollection<Pre> preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles); | ||||
|         ReadOnlyCollection<PreWith> preWithCollection = GetPreWithCollection(preCollection); | ||||
|         MoveCollection(dateTime, processDataStandardFormat, preWithCollection); | ||||
|         return results; | ||||
|  | ||||
| @ -9,7 +9,6 @@ using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.OpenInsight; | ||||
| @ -17,9 +16,7 @@ namespace Adaptation.FileHandlers.OpenInsight; | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     private string _LastLines; | ||||
|     private readonly string _IqsConnectionString; | ||||
|     private readonly string _OpenInsightFilePattern; | ||||
|     private readonly string _OpenInsightApiECDirectory; | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, Dictionary<long, List<WS.Results>> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
| @ -34,10 +31,8 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         _LastLines = string.Empty; | ||||
|         _IqsConnectionString = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.ConnectionString"); | ||||
|         _OpenInsightApiECDirectory = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "API.EC.Directory"); | ||||
|         _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
| @ -115,61 +110,9 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static Tuple<string, string> GetLines(Logistics logistics, List<txt.Description> descriptions) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         char del = '\t'; | ||||
|         txt.Description x = descriptions[0]; | ||||
|         _ = result.Append(x.DcnLpdMin).Append(del).    // 001 -  | ||||
|             Append(x.DcnLpdMax).Append(del).       // 002 -  | ||||
|             Append(x.DcnLpdMean).Append(del).      // 003 - DCN LPD | ||||
|             Append(x.DcnAreaCountMin).Append(del). // 004 -  | ||||
|             Append(x.DcnAreaCountMax).Append(del). // 005 -  | ||||
|             Append(x.DcnAreaCountMean).Append(del).// 006 - DCN Area | ||||
|             Append(x.DcnAreaMin).Append(del).      // 007 -  | ||||
|             Append(x.DcnAreaMax).Append(del).      // 008 -  | ||||
|             Append(x.Date).Append(del).            // 009 -  | ||||
|             Append(x.DcnHazeAvgMean).Append(del).  // 010 - Haze Average | ||||
|             Append(string.Empty).Append(del).              // 011 -  | ||||
|             Append(string.Empty).Append(del).              // 012 -  | ||||
|             Append(string.Empty).Append(del).              // 013 -  | ||||
|             Append(string.Empty).Append(del).              // 014 -  | ||||
|             Append(string.Empty).Append(del).              // 015 -  | ||||
|             Append(string.Empty).Append(del).              // 016 -  | ||||
|             Append(string.Empty).Append(del).              // 017 -  | ||||
|             Append(string.Empty).Append(del).              // 018 -  | ||||
|             Append(string.Empty).Append(del).              // 019 -  | ||||
|             Append(string.Empty).Append(del).              // 020 -  | ||||
|             Append(string.Empty).Append(del).              // 021 -  | ||||
|             Append(string.Empty).Append(del).              // 022 -  | ||||
|             Append(string.Empty).Append(del).              // 023 -  | ||||
|             Append(string.Empty).Append(del).              // 024 -  | ||||
|             Append(string.Empty).Append(del).              // 025 -  | ||||
|             Append(string.Empty).Append(del).              // 026 -  | ||||
|             Append(string.Empty).Append(del).              // 027 -  | ||||
|             Append(x.RDS).Append(del).             // 028 - Lot | ||||
|             Append(x.Reactor).Append(del).         // 029 - Process | ||||
|             Append(x.Recipe).Append(del).          // 030 - Part | ||||
|             Append(x.DcnScrMean).Append(del).      // 031 - Scratch Count | ||||
|             Append(string.Empty).Append(del).              // 032 -  | ||||
|             Append(string.Empty).Append(del).              // 033 -  | ||||
|             Append(string.Empty).Append(del).              // 034 -  | ||||
|             Append(x.DcnMicroScrMean).Append(del). // 035 - Scratch Length | ||||
|             Append(string.Empty).Append(del).              // 036 -  | ||||
|             Append(string.Empty).Append(del).              // 037 -  | ||||
|             Append(string.Empty).Append(del).              // 038 -  | ||||
|             Append(x.DcnAllMean).Append(del).      // 039 - Average Sum of Defects | ||||
|             Append(x.DcnAllMax).Append(del).       // 040 - Max Sum of defects | ||||
|             Append(x.DcnAllMin).Append(del).       // 041 - Min Sum of Defects | ||||
|             Append(string.Empty).Append(del).              // 042 -  | ||||
|             Append(logistics.MesEntity).Append(del).                 // 043 -  | ||||
|             Append(x.DcnAreaMean).Append(del).     // 044 - DCN MM2 | ||||
|             AppendLine(); | ||||
|         return new Tuple<string, string>(result.ToString(), x.Date); | ||||
|     } | ||||
|  | ||||
|     private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, List<txt.Description> descriptions, Test[] tests) | ||||
|     { | ||||
|         string duplicateFile; | ||||
|         bool isDummyRun = false; | ||||
|         List<(Shared.Properties.IScopeInfo, string)> collection = new(); | ||||
|         string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName); | ||||
| @ -185,35 +128,36 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|         } | ||||
|         string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); | ||||
|         if (descriptions.Count == 0 || tests.Length == 0) | ||||
|             _LastLines = string.Empty; | ||||
|             duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); | ||||
|         else | ||||
|         { | ||||
|             Tuple<string, string> lines = GetLines(_Logistics, descriptions); | ||||
|             string check = lines.Item1.Replace(lines.Item2, "$Date$"); | ||||
|             bool save = string.IsNullOrEmpty(_LastLines) || check != _LastLines; | ||||
|             if (save && !string.IsNullOrEmpty(check)) | ||||
|             long? subgroupId; | ||||
|             string fileName = Path.GetFileName(reportFullPath); | ||||
|             long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; | ||||
|             long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; | ||||
|             if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN)) | ||||
|                 subgroupId = null; | ||||
|             else | ||||
|                 (subgroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); | ||||
|             if (_StaticRuns.TryGetValue(_Logistics.Sequence, out List<WS.Results> wsResults)) | ||||
|             { | ||||
|                 long? subgroupId; | ||||
|                 _LastLines = check; | ||||
|                 long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; | ||||
|                 long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; | ||||
|                 if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN)) | ||||
|                     subgroupId = null; | ||||
|                 else | ||||
|                     (subgroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); | ||||
|                 if (subgroupId is null) | ||||
|                     collection.Add(new(new ScopeInfo(tests[0], _OpenInsightFilePattern), lines.Item1)); | ||||
|                 else | ||||
|                     collection.Add(new(new ScopeInfo(tests[0], $"{subgroupId.Value} {_OpenInsightFilePattern}"), lines.Item1)); | ||||
|                 string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                 FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, processDataStandardFormat, descriptions.First(), lines.Item1, subgroupId, weekOfYear); | ||||
|                 if (wsResults is null || wsResults.Count != 1) | ||||
|                     throw new NullReferenceException($"{nameof(wsResults)} {wsResults?.Count} != 1 {_Logistics.Sequence}!"); | ||||
|                 lock (_StaticRuns) | ||||
|                     wsResults[0] = WS.Results.Get(wsResults[0], subgroupId); | ||||
|             } | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|             if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|                 WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); | ||||
|             if (!fileName.StartsWith("Viewer")) | ||||
|                 duplicateFile = Path.Combine(duplicateDirectory, $"{subgroupId} {fileName}".TrimStart()); | ||||
|             else | ||||
|                 duplicateFile = Path.Combine(duplicateDirectory, $"{$"Viewer {subgroupId}".TrimEnd()} {fileName.Replace("Viewer", string.Empty)}"); | ||||
|             string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|             FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, processDataStandardFormat, descriptions.First(), subgroupId, weekOfYear); | ||||
|         } | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|         { | ||||
|             File.Copy(reportFullPath, duplicateFile, overwrite: true); | ||||
|             WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -228,7 +172,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             SaveOpenInsightFile(reportFullPath, dateTime, processDataStandardFormat, descriptions, tests); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -376,7 +376,7 @@ public class FromIQS | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, ProcessDataStandardFormat processDataStandardFormat, txt.Description description, string lines, long? subGroupId, string weekOfYear) | ||||
|     internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, ProcessDataStandardFormat processDataStandardFormat, txt.Description description, long? subGroupId, string weekOfYear) | ||||
|     { | ||||
|         string checkFile; | ||||
|         string fileName = Path.GetFileName(reportFullPath); | ||||
| @ -390,15 +390,9 @@ public class FromIQS | ||||
|         checkFile = Path.Combine(ecDirectory, fileName); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.Copy(reportFullPath, checkFile); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, lines); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, json); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.lbl"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, processDataStandardFormat.Body[processDataStandardFormat.Body.Count - 1]); | ||||
|     } | ||||
|  | ||||
|     private static string GetCommandText(string[] iqsCopyValues) | ||||
|  | ||||
| @ -147,7 +147,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             SendData(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -175,7 +175,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             PostOpenInsightMetrologyViewerAttachments(descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -172,7 +172,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); | ||||
|         List<txt.Description> descriptions = txt.ProcessData.GetDescriptions(jsonElements); | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             DirectoryMove(reportFullPath, dateTime, descriptions); | ||||
|         else if (!_IsEAFHosted) | ||||
|  | ||||
| @ -125,7 +125,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -11,13 +11,15 @@ public class Common | ||||
|     public int? ReactorNumber { get; } | ||||
|     public string? Zone { get; } | ||||
|     public string? Employee { get; } | ||||
|     public WorkOrder? WorkOrder { get; } | ||||
|  | ||||
|     public Common(string? layer, | ||||
|                   string? psn, | ||||
|                   int? rdsNumber, | ||||
|                   int? reactor, | ||||
|                   string? zone, | ||||
|                   string? employee) | ||||
|                   string? employee, | ||||
|                   WorkOrder? workOrder) | ||||
|     { | ||||
|         Layer = layer; | ||||
|         PSN = psn; | ||||
| @ -25,6 +27,7 @@ public class Common | ||||
|         ReactorNumber = reactor; | ||||
|         Zone = zone; | ||||
|         Employee = employee; | ||||
|         WorkOrder = workOrder; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -3,18 +3,20 @@ namespace Adaptation.FileHandlers.TIBCO.Transport; | ||||
| public class CommonB | ||||
| { | ||||
|  | ||||
|     public string Comment { get; } | ||||
|     public string Layer { get; } | ||||
|     public string LoadLockSide { get; } | ||||
|     public int? RDSNumber { get; } | ||||
|     public string ReactorType { get; } | ||||
|     public string PSN { get; } | ||||
|     public int? ReactorNumber { get; } | ||||
|     public string Zone { get; } | ||||
|  | ||||
|     public CommonB(string comment, string layer, int? rdsNumber, string psn, int? reactorNumber, string zone) | ||||
|     public CommonB(string layer, string loadLockSide, int? rdsNumber, string reactorType, string psn, int? reactorNumber, string zone) | ||||
|     { | ||||
|         Comment = comment; | ||||
|         Layer = layer; | ||||
|         LoadLockSide = loadLockSide; | ||||
|         RDSNumber = rdsNumber; | ||||
|         ReactorType = reactorType; | ||||
|         PSN = psn; | ||||
|         ReactorNumber = reactorNumber; | ||||
|         Zone = zone; | ||||
|  | ||||
| @ -41,7 +41,7 @@ public partial class Job | ||||
|     public DateTime DateTime { get; } | ||||
|     public List<Item> Items { get; } | ||||
|  | ||||
|     public Job(string lsl2SQLConnectionString, string metrologyFileShare, string barcodeHostFileShare, HttpClient httpClient, string mid) | ||||
|     public Job(string lsl2SQLConnectionString, string metrologyFileShare, string barcodeHostFileShare, HttpClient httpClient, string mid, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter) | ||||
|     { | ||||
|         const int zero = 0; | ||||
|         Items = new List<Item>(); | ||||
| @ -52,7 +52,6 @@ public partial class Job | ||||
|             Common common; | ||||
|             CommonB commonB; | ||||
|             int? reactorNumber; | ||||
|             WorkOrder workOrder; | ||||
|             const string hyphen = "-"; | ||||
|             const string bioRad2 = "BIORAD2"; | ||||
|             const string bioRad3 = "BIORAD3"; | ||||
| @ -65,20 +64,23 @@ public partial class Job | ||||
|                 DateTime = new DateTime(sequence); | ||||
|             const string dep08CEPIEPSILON = "DEP08CEPIEPSILON"; | ||||
|             if (input.EquipmentType == dep08CEPIEPSILON) | ||||
|                 (common, workOrder) = Get(input, httpClient); | ||||
|             { | ||||
|                 common = Get(input, httpClient); | ||||
|             } | ||||
|             else if (!string.IsNullOrEmpty(input.MID) && !string.IsNullOrEmpty(input.MesEntity) && Regex.IsMatch(input.MID, reactorNumberPattern) && input.MesEntity is bioRad2 or bioRad3) | ||||
|                 (common, workOrder) = Get(input, barcodeHostFileShare); | ||||
|                 common = Get(input, barcodeHostFileShare); | ||||
|             else | ||||
|             { | ||||
|                 workOrder = GetWorkOrder(input); | ||||
|                 reactorNumber = GetReactorNumber(input); | ||||
|                 WorkOrder workOrder = GetWorkOrder(input); | ||||
|                 if (workOrder.IsWorkOrder || reactorNumber.HasValue) | ||||
|                     common = new(layer: null, | ||||
|                                  psn: null, | ||||
|                                  rdsNumber: null, | ||||
|                                  reactor: null, | ||||
|                                  zone: null, | ||||
|                                  employee: null); | ||||
|                                  employee: null, | ||||
|                                  workOrder: workOrder); | ||||
|                 else if (!string.IsNullOrEmpty(input.MID) && input.MID.Length is 2 or 3 && Regex.IsMatch(input.MID, twoAlphaPattern)) | ||||
|                     common = GetTwoAlphaPattern(metrologyFileShare, input); | ||||
|                 else | ||||
| @ -86,13 +88,14 @@ public partial class Job | ||||
|             } | ||||
|             bool isValid = IsValid(common.RDSNumber); | ||||
|             if (isValid) | ||||
|                 commonB = GetWithValidRDS(lsl2SQLConnectionString, common.Layer, common.PSN, common.RDSNumber, common.ReactorNumber, common.Zone); | ||||
|             else if (workOrder.IsWorkOrder || common.RDSNumber.HasValue) | ||||
|                 commonB = Get(lsl2SQLConnectionString, common.Layer, common.PSN, common.ReactorNumber, workOrder.SlotNumber, workOrder.WorkOrderNumber, workOrder.WorkOrderCassette, common.Zone); | ||||
|                 commonB = GetWithValidRDS(lsl2SQLConnectionString, enteredDateTimeFilter, loadSignatureDateTimeFilter, common.Layer, common.PSN, common.RDSNumber, common.ReactorNumber, common.Zone); | ||||
|             else if (common.WorkOrder is null || common.WorkOrder.IsWorkOrder || common.RDSNumber.HasValue) | ||||
|                 commonB = Get(lsl2SQLConnectionString, enteredDateTimeFilter, loadSignatureDateTimeFilter, common); | ||||
|             else | ||||
|                 commonB = new(comment: hyphen, | ||||
|                               layer: hyphen, | ||||
|                 commonB = new(layer: hyphen, | ||||
|                               loadLockSide: hyphen, | ||||
|                               rdsNumber: common.RDSNumber, | ||||
|                               reactorType: hyphen, | ||||
|                               psn: common.PSN, | ||||
|                               reactorNumber: common.ReactorNumber, | ||||
|                               zone: hyphen); | ||||
| @ -108,17 +111,45 @@ public partial class Job | ||||
|             IsAreaSi = input.Area == "Si"; // N/A | ||||
|             StateModel = input.EquipmentType; // ? | ||||
|             JobName = DateTime.Ticks.ToString(); // ? | ||||
|             BasicType = GetComment(hyphen, httpClient, commonB); // BASIC_TYPE | ||||
|             AutomationMode = string.Concat(DateTime.Ticks, ".", input.MesEntity); // ? | ||||
|             SpecName = !string.IsNullOrEmpty(commonB.Layer) ? commonB.Layer : hyphen; // LAYER | ||||
|             ProductName = !string.IsNullOrEmpty(commonB.PSN) ? commonB.PSN : hyphen; // PRODUCT | ||||
|             ProcessSpecName = !string.IsNullOrEmpty(commonB.Zone) ? commonB.Zone : hyphen; // WAFER_POS | ||||
|             BasicType = !string.IsNullOrEmpty(commonB.Comment) ? commonB.Comment : hyphen; // BASIC_TYPE | ||||
|             LotName = commonB.RDSNumber is not null ? commonB.RDSNumber.Value.ToString() : input.MID; // MID | ||||
|             ProcessType = commonB.ReactorNumber is not null ? commonB.ReactorNumber.Value.ToString() : hyphen; // PROCESS_JOBID | ||||
|             Items.Add(new Item { Name = "0", Type = "NA", Number = (0 + 1).ToString(), Qty = "1", CarrierName = hyphen }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static string GetComment(string hyphen, HttpClient httpClient, CommonB commonB) | ||||
|     { | ||||
|         string result; | ||||
|         string? loadLockSide = commonB.LoadLockSide; | ||||
|         if (string.IsNullOrEmpty(loadLockSide) && commonB.RDSNumber is not null) | ||||
|         { | ||||
|             RunDataSheetRoot? runDataSheetRoot; | ||||
|             try | ||||
|             { runDataSheetRoot = GetRunDataSheetRoot(httpClient, commonB.RDSNumber.Value); } | ||||
|             catch (Exception) | ||||
|             { runDataSheetRoot = null; } | ||||
|             loadLockSide = runDataSheetRoot?.RunDataSheet?.LoadLockSide; | ||||
|         } | ||||
|         if (string.IsNullOrEmpty(loadLockSide) || string.IsNullOrEmpty(commonB.ReactorType)) | ||||
|             result = hyphen; | ||||
|         else | ||||
|         { | ||||
|             string loadLockSideFull = loadLockSide switch | ||||
|             { | ||||
|                 "L" => "Left", | ||||
|                 "R" => "Right", | ||||
|                 _ => loadLockSide, | ||||
|             }; | ||||
|             result = $"{loadLockSideFull} - {commonB.ReactorType}"; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static int? GetReactorNumber(Input input) | ||||
|     { | ||||
|         int? result; | ||||
| @ -279,7 +310,8 @@ public partial class Job | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactor: reactorNumber, | ||||
|                    zone: zone, | ||||
|                    employee: employee); | ||||
|                    employee: employee, | ||||
|                    workOrder: null); | ||||
|     } | ||||
|  | ||||
|     private static string[] GetDirectories(string fileShare) | ||||
| @ -342,7 +374,8 @@ public partial class Job | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactor: reactor, | ||||
|                    zone: zone, | ||||
|                    employee: null); | ||||
|                    employee: null, | ||||
|                    workOrder: null); | ||||
|     } | ||||
|  | ||||
|     private static List<string> GetFiles(Input input, string barcodeHostFileShare) | ||||
| @ -381,12 +414,11 @@ public partial class Job | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static (Common common, WorkOrder workOrder) Get(Input input, HttpClient httpClient) | ||||
|     private static Common Get(Input input, HttpClient httpClient) | ||||
|     { | ||||
|         int? rds; | ||||
|         string psn; | ||||
|         Common common; | ||||
|         WorkOrder workOrder; | ||||
|         string? psn; | ||||
|         Common result; | ||||
|         Task<Stream> streamTask; | ||||
|         Task<HttpResponseMessage> httpResponseMessageTask; | ||||
|         string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID; | ||||
| @ -405,60 +437,70 @@ public partial class Job | ||||
|         if (reactorRoot is null || reactor != reactorRoot.Reactor.ReactorNo || reactorRoot.Reactor.LoadedRDS is null || reactorRoot.Reactor.LoadedRDS.Length < 1) | ||||
|         { | ||||
|             rds = null; | ||||
|             psn = string.Empty; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             common = new(layer: null, | ||||
|             psn = null; | ||||
|             result = new(layer: null, | ||||
|                          psn: psn, | ||||
|                          rdsNumber: rds, | ||||
|                          reactor: reactor, | ||||
|                          zone: null, | ||||
|                          employee: null); | ||||
|                          employee: null, | ||||
|                          workOrder: null); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             rds = reactorRoot.Reactor.LoadedRDS[0]; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}"); | ||||
|             httpResponseMessageTask.Wait(); | ||||
|             if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|                 throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|             streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); | ||||
|             streamTask.Wait(); | ||||
|             if (!streamTask.Result.CanRead) | ||||
|                 throw new NullReferenceException(nameof(streamTask)); | ||||
|             RunDataSheetRoot? runDataSheetRoot = JsonSerializer.Deserialize<RunDataSheetRoot>(streamTask.Result, jsonSerializerOptions); | ||||
|             streamTask.Result.Dispose(); | ||||
|             RunDataSheetRoot? runDataSheetRoot = GetRunDataSheetRoot(httpClient, rds.Value); | ||||
|             if (runDataSheetRoot is null || reactor != runDataSheetRoot.RunDataSheet.Reactor) | ||||
|             { | ||||
|                 psn = string.Empty; | ||||
|                 common = new(layer: null, | ||||
|                 psn = null; | ||||
|                 result = new(layer: null, | ||||
|                              psn: psn, | ||||
|                              rdsNumber: rds, | ||||
|                              reactor: reactor, | ||||
|                              zone: null, | ||||
|                              employee: null); | ||||
|                              employee: null, | ||||
|                              workOrder: null); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 psn = runDataSheetRoot.RunDataSheet.PSN.ToString(); | ||||
|                 common = new(layer: null, | ||||
|                 result = new(layer: null, | ||||
|                              psn: psn, | ||||
|                              rdsNumber: rds, | ||||
|                              reactor: reactor, | ||||
|                              zone: null, | ||||
|                              employee: null); | ||||
|                              employee: null, | ||||
|                              workOrder: null); | ||||
|             } | ||||
|         } | ||||
|         return new(common, workOrder); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static (Common common, WorkOrder workOrder) Get(Input input, string barcodeHostFileShare) | ||||
|     private static RunDataSheetRoot? GetRunDataSheetRoot(HttpClient httpClient, int rds) | ||||
|     { | ||||
|         RunDataSheetRoot? runDataSheetRoot; | ||||
|         JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true }; | ||||
|         using Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}"); | ||||
|         httpResponseMessageTask.Wait(); | ||||
|         if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|             throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|         using Task<Stream> streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); | ||||
|         streamTask.Wait(); | ||||
|         if (!streamTask.Result.CanRead) | ||||
|             throw new NullReferenceException(nameof(streamTask)); | ||||
|         runDataSheetRoot = JsonSerializer.Deserialize<RunDataSheetRoot>(streamTask.Result, jsonSerializerOptions); | ||||
|         streamTask.Result.Dispose(); | ||||
|         return runDataSheetRoot; | ||||
|     } | ||||
|  | ||||
|     private static Common Get(Input input, string barcodeHostFileShare) | ||||
|     { | ||||
|         Common result; | ||||
|         if (string.IsNullOrEmpty(barcodeHostFileShare) || !Directory.Exists(barcodeHostFileShare)) | ||||
|             throw new Exception($"Unable to access file-share <{barcodeHostFileShare}>"); | ||||
|         int? rds; | ||||
|         long sequence = 0; | ||||
|         WorkOrder workOrder; | ||||
|         WorkOrder? workOrder; | ||||
|         string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID; | ||||
|         int? reactor = mid.Length < 2 || !int.TryParse(mid.Substring(0, 2), out int reactorNumber) ? null : reactorNumber; | ||||
|         bool parsed = !string.IsNullOrEmpty(input.Sequence) && long.TryParse(input.Sequence, out sequence); | ||||
| @ -471,29 +513,28 @@ public partial class Job | ||||
|         if (text is null || text.Length < 3) | ||||
|         { | ||||
|             rds = null; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             workOrder = null; | ||||
|         } | ||||
|         else if (!text.Contains('.')) | ||||
|         { | ||||
|             workOrder = null; | ||||
|             rds = !int.TryParse(text.Substring(2), out int rdsNumber) ? null : rdsNumber; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             rds = null; | ||||
|             workOrder = GetWorkOrder(new(input, text.Substring(2))); | ||||
|         } | ||||
|         Common common = new(layer: null, | ||||
|         result = new(layer: null, | ||||
|                             psn: null, | ||||
|                             rdsNumber: rds, | ||||
|                             reactor: reactor, | ||||
|                             zone: null, | ||||
|                             employee: null); | ||||
|         return new(common, workOrder); | ||||
|                             employee: null, | ||||
|                             workOrder: workOrder); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     private static string GetRunJson(string lsl2SQLConnectionString, string commandText) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
| @ -513,7 +554,7 @@ public partial class Job | ||||
|         return result.ToString(); | ||||
|     } | ||||
|  | ||||
|     private static string GetCommandText(int? rds, int? workOrderNumber, int? workOrderCassette, int? slot, int? reactor) | ||||
|     private static string GetCommandText(DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, int? rds, int? workOrderNumber, int? workOrderCassette, int? slot, int? reactor) | ||||
|     { // cSpell:disable | ||||
|         List<string> results = new(); | ||||
|         int rdsValue = rds is null ? -1 : rds.Value; | ||||
| @ -540,6 +581,7 @@ public partial class Job | ||||
|         results.Add("       ) zone "); | ||||
|         results.Add(" from lsl2sql.dbo.react_run rr "); | ||||
|         results.Add($" where rr.rds_no = {rdsValue}"); | ||||
|         results.Add($"   and rr.enter_dtm > '{enteredDateTimeFilter:yyyy-MM-dd} 00:00:00.000' "); | ||||
|         results.Add(" union all "); | ||||
|         results.Add(" select "); | ||||
|         results.Add("         rr.rds_no "); | ||||
| @ -589,80 +631,87 @@ public partial class Job | ||||
|         results.Add("   select max(qa.rds_no) "); | ||||
|         results.Add("   from lsl2sql.dbo.react_run qa "); | ||||
|         results.Add("   where qa.load_sig != '' "); | ||||
|         results.Add("       and qa.load_sig_dtm > '2023-05-01 00:00:00.000' "); | ||||
|         results.Add($"       and qa.load_sig_dtm > '{loadSignatureDateTimeFilter:yyyy-MM-dd} 00:00:00.000' "); | ||||
|         results.Add($"       and qa.reactor = {reactorValue}"); | ||||
|         results.Add(" ) "); | ||||
|         results.Add(" for json path "); | ||||
|         return string.Join(Environment.NewLine, results); | ||||
|     } // cSpell:restore | ||||
|  | ||||
|     private static CommonB Get(string lsl2SQLConnectionString, string layer, string psn, int? reactorNumber, int? slotNumber, int? workOrderNumber, int? workOrderCassette, string zone) | ||||
|     private static CommonB Get(string lsl2SQLConnectionString, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, Common common) | ||||
|     { | ||||
|         int? rdsNumber; | ||||
|         string comment; | ||||
|         string? psn; | ||||
|         string? zone; | ||||
|         string? layer; | ||||
|         const int zero = 0; | ||||
|         const string hyphen = "-"; | ||||
|         string commandText = GetCommandText(rds: null, | ||||
|                                             workOrderNumber: workOrderNumber, | ||||
|                                             workOrderCassette: workOrderCassette, | ||||
|                                             slot: slotNumber, | ||||
|                                             reactor: reactorNumber); | ||||
|         int? reactorNumber; | ||||
|         string? reactorType; | ||||
|         string? loadLockSide; | ||||
|         string commandText = GetCommandText(enteredDateTimeFilter, | ||||
|                                             loadSignatureDateTimeFilter, | ||||
|                                             rds: null, | ||||
|                                             workOrderNumber: common.WorkOrder?.WorkOrderNumber, | ||||
|                                             workOrderCassette: common.WorkOrder?.WorkOrderCassette, | ||||
|                                             slot: common.WorkOrder?.SlotNumber, | ||||
|                                             reactor: common.ReactorNumber); | ||||
|         string json = GetRunJson(lsl2SQLConnectionString, commandText); | ||||
|         if (string.IsNullOrEmpty(json)) | ||||
|         { | ||||
|             psn = common.PSN; | ||||
|             rdsNumber = null; | ||||
|             comment = hyphen; | ||||
|             psn = string.Empty; | ||||
|             zone = string.Empty; | ||||
|             reactorType = null; | ||||
|             zone = common.Zone; | ||||
|             loadLockSide = null; | ||||
|             layer = common.Layer; | ||||
|             reactorNumber = common.ReactorNumber; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Run[] runs; | ||||
|             Run[]? runs; | ||||
|             try | ||||
|             { runs = JsonSerializer.Deserialize<Run[]>(json); } | ||||
|             catch (Exception) | ||||
|             { runs = Array.Empty<Run>(); } | ||||
|             if (runs.Length == 0) | ||||
|             if (runs is null || runs.Length == 0) | ||||
|             { | ||||
|                 psn = common.PSN; | ||||
|                 rdsNumber = null; | ||||
|                 comment = hyphen; | ||||
|                 psn = string.Empty; | ||||
|                 zone = string.Empty; | ||||
|                 reactorType = null; | ||||
|                 zone = common.Zone; | ||||
|                 loadLockSide = null; | ||||
|                 layer = common.Layer; | ||||
|                 reactorNumber = common.ReactorNumber; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 rdsNumber = runs[zero].RdsNo; | ||||
|                 if (string.IsNullOrEmpty(psn)) | ||||
|                     psn = runs[zero].PSN; | ||||
|                 if (string.IsNullOrEmpty(zone)) | ||||
|                     zone = runs[zero].Zone; | ||||
|                 if (string.IsNullOrEmpty(layer)) | ||||
|                     layer = runs[zero].EpiLayer; | ||||
|                 reactorNumber = runs[zero].Reactor; | ||||
|                 string loadLockSide = runs[zero].LoadLockSide; | ||||
|                 string loadLockSideFull = loadLockSide switch | ||||
|                 { | ||||
|                     "L" => "Left", | ||||
|                     "R" => "Right", | ||||
|                     _ => loadLockSide, | ||||
|                 }; | ||||
|                 comment = $"{loadLockSideFull} - {runs[zero].ReactorType}"; | ||||
|                 reactorType = null; | ||||
|                 Run run = runs[zero]; | ||||
|                 rdsNumber = run.RdsNo; | ||||
|                 reactorNumber = run.Reactor; | ||||
|                 loadLockSide = run.LoadLockSide; | ||||
|                 psn = string.IsNullOrEmpty(common.PSN) ? run.PSN : common.PSN; | ||||
|                 zone = string.IsNullOrEmpty(common.Zone) ? run.Zone : common.Zone; | ||||
|                 layer = string.IsNullOrEmpty(common.Layer) ? run.EpiLayer : common.Layer; | ||||
|             } | ||||
|         } | ||||
|         return new(comment: comment, | ||||
|                    layer: layer, | ||||
|         return new(layer: layer, | ||||
|                    loadLockSide: loadLockSide, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    psn: psn, | ||||
|                    reactorNumber: reactorNumber, | ||||
|                    reactorType: reactorType, | ||||
|                    zone: zone); | ||||
|     } | ||||
|  | ||||
|     private static CommonB GetWithValidRDS(string lsl2SQLConnectionString, string layer, string psn, int? rdsNumber, int? reactorNumber, string zone) | ||||
|     private static CommonB GetWithValidRDS(string lsl2SQLConnectionString, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, string? layer, string? psn, int? rdsNumber, int? reactorNumber, string? zone) | ||||
|     { | ||||
|         string comment; | ||||
|         const int zero = 0; | ||||
|         const string hyphen = "-"; | ||||
|         string commandText = GetCommandText(rds: rdsNumber, | ||||
|         string? reactorType; | ||||
|         string? loadLockSide; | ||||
|         string commandText = GetCommandText(enteredDateTimeFilter, | ||||
|                                             loadSignatureDateTimeFilter, | ||||
|                                             rds: rdsNumber, | ||||
|                                             workOrderNumber: null, | ||||
|                                             workOrderCassette: null, | ||||
|                                             slot: null, | ||||
| @ -670,43 +719,41 @@ public partial class Job | ||||
|         string json = GetRunJson(lsl2SQLConnectionString, commandText); | ||||
|         if (string.IsNullOrEmpty(json)) | ||||
|         { | ||||
|             comment = hyphen; | ||||
|             zone = string.Empty; | ||||
|             zone = null; | ||||
|             reactorType = null; | ||||
|             loadLockSide = null; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Run[] runs; | ||||
|             Run[]? runs; | ||||
|             try | ||||
|             { runs = JsonSerializer.Deserialize<Run[]>(json); } | ||||
|             catch (Exception) | ||||
|             { runs = Array.Empty<Run>(); } | ||||
|             if (runs.Length == 0) | ||||
|             if (runs is null || runs.Length == 0) | ||||
|             { | ||||
|                 comment = hyphen; | ||||
|                 zone = string.Empty; | ||||
|                 zone = null; | ||||
|                 reactorType = null; | ||||
|                 loadLockSide = null; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Run run = runs[zero]; | ||||
|                 if (string.IsNullOrEmpty(psn)) | ||||
|                     psn = runs[zero].PSN; | ||||
|                     psn = run.PSN; | ||||
|                 if (string.IsNullOrEmpty(zone)) | ||||
|                     zone = runs[zero].Zone; | ||||
|                     zone = run.Zone; | ||||
|                 if (string.IsNullOrEmpty(layer)) | ||||
|                     layer = runs[zero].EpiLayer; | ||||
|                 reactorNumber = runs[zero].Reactor is null ? reactorNumber : runs[zero].Reactor.Value; | ||||
|                 string loadLockSide = runs[zero].LoadLockSide; | ||||
|                 string loadLockSideFull = loadLockSide switch | ||||
|                 { | ||||
|                     "L" => "Left", | ||||
|                     "R" => "Right", | ||||
|                     _ => loadLockSide, | ||||
|                 }; | ||||
|                 comment = $"{loadLockSideFull} - {runs[zero].ReactorType}"; | ||||
|                     layer = run.EpiLayer; | ||||
|                 reactorNumber = run.Reactor is null ? reactorNumber : run.Reactor.Value; | ||||
|                 loadLockSide = run.LoadLockSide; | ||||
|                 reactorType = run.ReactorType; | ||||
|             } | ||||
|         } | ||||
|         return new(comment: comment, | ||||
|                    layer: layer, | ||||
|         return new(layer: layer, | ||||
|                    loadLockSide: loadLockSide, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactorType: reactorType, | ||||
|                    psn: psn, | ||||
|                    reactorNumber: reactorNumber, | ||||
|                    zone: zone); | ||||
|  | ||||
| @ -167,13 +167,12 @@ internal partial class Main | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             string mid = string.Empty; | ||||
|             string[] sourceFiles = null; | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             string pdsfFileLogistics = string.Empty; | ||||
|             IfxDoc envelopeDocument = ifxEnvelope.ExtractDocument(); | ||||
|             CultureInfo cultureInfo = new("en-US"); | ||||
|             string pdsfFileLogistics = string.Empty; | ||||
|             Calendar calendar = cultureInfo.Calendar; | ||||
|             IfxDoc envelopeDocument = ifxEnvelope.ExtractDocument(); | ||||
|             string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|             string weekOfYearSegment = string.Concat(@"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", dateTime.ToString("yyyy-MM-dd")); | ||||
|             if (!string.IsNullOrEmpty(_FileConnectorConfiguration.SourceFileLocation)) | ||||
| @ -188,8 +187,10 @@ internal partial class Main | ||||
|             } | ||||
|             if (!subject.Contains(_TibcoParameterSubjectPrefix)) | ||||
|                 throw new Exception("Invalid Subject"); | ||||
|             mid = GetJobsMID(envelopeDocument); | ||||
|             Job job = new(_LSL2SQLConnectionString, _MetrologyFileShare, _BarcodeHostFileShare, _HttpClient, mid); | ||||
|             string mid = GetJobsMID(envelopeDocument); | ||||
|             DateTime enteredDateTimeFilter = dateTime.AddDays(-356); | ||||
|             DateTime loadSignatureDateTimeFilter = dateTime.AddDays(-4); | ||||
|             Job job = new(_LSL2SQLConnectionString, _MetrologyFileShare, _BarcodeHostFileShare, _HttpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|             if (job.IsAreaSi) | ||||
|             { | ||||
|                 IfxDoc sendReply = GetJobsReply(job); | ||||
|  | ||||
| @ -6,12 +6,14 @@ public class RunDataSheet | ||||
| { | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public RunDataSheet(int psn, int reactor) | ||||
|     public RunDataSheet(string loadLockSide, int psn, int reactor) | ||||
|     { | ||||
|         PSN = psn; | ||||
|         LoadLockSide = loadLockSide; | ||||
|         Reactor = reactor; | ||||
|     } | ||||
|  | ||||
|     [JsonPropertyName("loadLockSide")] public string LoadLockSide { get; } // { init; get; } | ||||
|     [JsonPropertyName("PSN")] public int PSN { get; } // { init; get; } | ||||
|     [JsonPropertyName("reactor")] public int Reactor { get; } // { init; get; } | ||||
|  | ||||
|  | ||||
| @ -87,16 +87,16 @@ | ||||
|         </None> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|     </ItemGroup> | ||||
|  | ||||
| @ -41,6 +41,24 @@ stages: | ||||
|             displayName: "Nuget Clear" | ||||
|             enabled: false | ||||
|  | ||||
|           - task: CopyFiles@2 | ||||
|             displayName: 'Copy GhostPCL Files to: D:\EAF-Mesa-Integration\copy' | ||||
|             inputs: | ||||
|               Contents: "*" | ||||
|               SourceFolder: '\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL' | ||||
|               TargetFolder: 'D:\EAF-Mesa-Integration\copy\GhostPCL' | ||||
|               OverWrite: true | ||||
|             enabled: false | ||||
|  | ||||
|           - task: CopyFiles@2 | ||||
|             displayName: 'Copy LincPDFC Files to: D:\EAF-Mesa-Integration\copy' | ||||
|             inputs: | ||||
|               Contents: "*" | ||||
|               SourceFolder: '\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\LincPDFC' | ||||
|               TargetFolder: 'D:\EAF-Mesa-Integration\copy\LincPDFC' | ||||
|               OverWrite: true | ||||
|             enabled: false | ||||
|  | ||||
|           - script: | | ||||
|               "C:\program files\dotnet\dotnet.exe" user-secrets init | ||||
|               "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)" | ||||
| @ -184,6 +202,24 @@ stages: | ||||
|             displayName: "Nuget Clear" | ||||
|             enabled: false | ||||
|  | ||||
|           - task: CopyFiles@2 | ||||
|             displayName: 'Copy GhostPCL Files to: D:\EAF-Mesa-Integration\copy' | ||||
|             inputs: | ||||
|               Contents: "*" | ||||
|               SourceFolder: '\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL' | ||||
|               TargetFolder: 'D:\EAF-Mesa-Integration\copy\GhostPCL' | ||||
|               OverWrite: true | ||||
|             enabled: false | ||||
|  | ||||
|           - task: CopyFiles@2 | ||||
|             displayName: 'Copy LincPDFC Files to: D:\EAF-Mesa-Integration\copy' | ||||
|             inputs: | ||||
|               Contents: "*" | ||||
|               SourceFolder: '\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\LincPDFC' | ||||
|               TargetFolder: 'D:\EAF-Mesa-Integration\copy\LincPDFC' | ||||
|               OverWrite: true | ||||
|             enabled: false | ||||
|  | ||||
|           - script: | | ||||
|               "C:\program files\dotnet\dotnet.exe" user-secrets init | ||||
|               "C:\program files\dotnet\dotnet.exe" user-secrets set "BuildNumber" "$(Build.BuildId)" | ||||
|  | ||||
| @ -478,27 +478,14 @@ public class FileRead : Properties.IFileRead | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements) | ||||
|     protected static void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements) | ||||
|     { | ||||
|         string directory; | ||||
|         string day = $"{_Logistics.DateTimeFromSequence:yyyy-MM-dd}"; | ||||
|         string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|         string weekDirectory = $"{_Logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}"; | ||||
|         if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType) | ||||
|             directory = Path.Combine(_TracePath, _EquipmentType, "Target", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName); | ||||
|         else | ||||
|             directory = Path.Combine(_TracePath, _EquipmentType, "Source", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName); | ||||
|         if (!Directory.Exists(directory)) | ||||
|             _ = Directory.CreateDirectory(directory); | ||||
|         string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf")); | ||||
|         string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty); | ||||
|         File.WriteAllText(file, lines); | ||||
|         if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) | ||||
|         { | ||||
|             try | ||||
|             { File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
| #pragma warning disable CA1510 | ||||
|         if (fileRead is null) | ||||
|             throw new ArgumentNullException(nameof(fileRead)); | ||||
|         if (jsonElements is null) | ||||
|             throw new ArgumentNullException(nameof(jsonElements)); | ||||
| #pragma warning restore CA1510 | ||||
|     } | ||||
|  | ||||
|     protected void WaitForThread(Thread thread, List<Exception> threadExceptions) | ||||
|  | ||||
| @ -136,6 +136,7 @@ internal class ProcessDataStandardFormat | ||||
|     internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, string[]? lines = null, int columnsLine = 6) | ||||
|     { | ||||
|         ProcessDataStandardFormat result; | ||||
|         long? sequence; | ||||
|         string segment; | ||||
|         string[] segments; | ||||
|         bool addToFooter = false; | ||||
| @ -186,13 +187,25 @@ internal class ProcessDataStandardFormat | ||||
|         } | ||||
|         string? linesOne = lines.Length > 0 && body.Count == 0 && columns.Count == 0 ? lines[1] : null; | ||||
|         logistics = GetLogistics(footer, linesOne: linesOne); | ||||
|         if (logistics.Count == 0) | ||||
|             sequence = null; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics[0].Split(new string[] { "SEQUENCE=" }, StringSplitOptions.None); | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? null : s; | ||||
|         } | ||||
|         if (sequence is null && !string.IsNullOrEmpty(reportFullPath)) | ||||
|         { | ||||
|             FileInfo fileInfo = new(reportFullPath); | ||||
|             sequence = fileInfo.LastWriteTime.Ticks; | ||||
|         } | ||||
|         result = new(body: body.AsReadOnly(), | ||||
|                      columns: columns.AsReadOnly(), | ||||
|                      footer: footer.AsReadOnly(), | ||||
|                      header: header.AsReadOnly(), | ||||
|                      inputPDSF: null, | ||||
|                      logistics: logistics, | ||||
|                      sequence: null); | ||||
|                      sequence: sequence); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -236,7 +249,7 @@ internal class ProcessDataStandardFormat | ||||
|     private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int columnsLine, string path, string[]? lines) | ||||
|     { | ||||
|         ProcessDataStandardFormat result; | ||||
|         long sequence; | ||||
|         long? sequence; | ||||
|         string[] segments; | ||||
|         bool addToFooter = false; | ||||
|         List<string> body = new(); | ||||
| @ -268,12 +281,13 @@ internal class ProcessDataStandardFormat | ||||
|         } | ||||
|         logistics = GetLogistics(footer, linesOne: null); | ||||
|         if (logistics.Count == 0) | ||||
|             sequence = lastWriteTime.Ticks; | ||||
|             sequence = null; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics[0].Split(new string[] { "SEQUENCE=" }, StringSplitOptions.None); | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? lastWriteTime.Ticks : s; | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? null : s; | ||||
|         } | ||||
|         sequence ??= lastWriteTime.Ticks; | ||||
|         result = new(body: body.AsReadOnly(), | ||||
|                      columns: new(columns), | ||||
|                      footer: footer.AsReadOnly(), | ||||
| @ -302,7 +316,7 @@ internal class ProcessDataStandardFormat | ||||
|                 segments = bodyLine.Split('\t').ToList(); | ||||
|                 for (int c = 0; c < segments.Count; c++) | ||||
|                 { | ||||
|                     value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                     value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                     _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                 } | ||||
|                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
| @ -378,12 +392,20 @@ internal class ProcessDataStandardFormat | ||||
|                 break; | ||||
|             for (int c = 0; c < segments.Length; c++) | ||||
|             { | ||||
|                 value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                 value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                 line += string.Concat('"', processDataStandardFormat.InputPDSF.Columns[c].Trim('"'), '"', ':', '"', value, '"', ','); | ||||
|             } | ||||
|             line = string.Concat(line.Substring(0, line.Length - 1), '}'); | ||||
|             lines.Add(line); | ||||
|         } | ||||
|         string? json = null; | ||||
|         if (processDataStandardFormat.Footer is not null && processDataStandardFormat.Footer.Count > 0) | ||||
|         { | ||||
|             Dictionary<string, string> footerKeyValuePairs = GetFooterKeyValuePairs(processDataStandardFormat.Footer); | ||||
|             Dictionary<string, Dictionary<string, string>> logisticKeyValuePairs = GetLogisticKeyValuePairs(processDataStandardFormat.Footer, footerKeyValuePairs); | ||||
|             json = JsonSerializer.Serialize(logisticKeyValuePairs, DictionaryStringDictionaryStringStringSourceGenerationContext.Default.DictionaryStringDictionaryStringString); | ||||
|         } | ||||
|         string footerText = string.IsNullOrEmpty(json) || json == "{}" ? string.Empty : $",{Environment.NewLine}\"PDSF\":{Environment.NewLine}{json}"; | ||||
|         result = string.Concat( | ||||
|             '{', | ||||
|             Environment.NewLine, | ||||
| @ -412,9 +434,85 @@ internal class ProcessDataStandardFormat | ||||
|             ": ", | ||||
|             processDataStandardFormat.Sequence, | ||||
|             Environment.NewLine, | ||||
|             footerText, | ||||
|             Environment.NewLine, | ||||
|             '}'); | ||||
|         return result; | ||||
| #pragma warning restore CA1845, IDE0057 | ||||
|     } | ||||
|  | ||||
|     private static Dictionary<string, string> GetFooterKeyValuePairs(ReadOnlyCollection<string> footerLines) | ||||
|     { | ||||
|         Dictionary<string, string> results = new(); | ||||
|         string[] segments; | ||||
|         foreach (string footerLine in footerLines) | ||||
|         { | ||||
|             segments = footerLine.Split('\t'); | ||||
|             if (segments.Length != 2 || string.IsNullOrEmpty(segments[1].Trim())) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             if (segments[1].Contains(';')) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (results.ContainsKey(segments[0])) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                 results.Add(segments[0], segments[1]); | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static Dictionary<string, Dictionary<string, string>> GetLogisticKeyValuePairs(ReadOnlyCollection<string> footerLines, Dictionary<string, string> footerKeyValuePairs) | ||||
|     { | ||||
|         Dictionary<string, Dictionary<string, string>> results = new(); | ||||
|         string[] segments; | ||||
|         string[] subSegments; | ||||
|         string[] subSubSegments; | ||||
|         Dictionary<string, string>? keyValue; | ||||
|         results.Add("Footer", footerKeyValuePairs); | ||||
|         foreach (string footerLine in footerLines) | ||||
|         { | ||||
|             segments = footerLine.Split('\t'); | ||||
|             if (segments.Length != 2 || string.IsNullOrEmpty(segments[1].Trim())) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             if (!segments[1].Contains(';') || !segments[1].Contains('=')) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 subSegments = segments[1].Split(';'); | ||||
|                 if (subSegments.Length < 1) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                 if (!results.TryGetValue(segments[0], out keyValue)) | ||||
|                 { | ||||
|                     results.Add(segments[0], new()); | ||||
|                     if (!results.TryGetValue(segments[0], out keyValue)) | ||||
|                     { | ||||
|                         throw new Exception(); | ||||
|                     } | ||||
|                 } | ||||
|                 foreach (string segment in subSegments) | ||||
|                 { | ||||
|                     subSubSegments = segment.Split('='); | ||||
|                     if (subSubSegments.Length != 2) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|                     keyValue.Add(subSubSegments[0], subSubSegments[1]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static void Write(string path, ProcessDataStandardFormat processDataStandardFormat, List<Metrology.WS.Results>? wsResults) | ||||
| @ -518,7 +616,7 @@ internal class ProcessDataStandardFormat | ||||
|                 { | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                         value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                         _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                     } | ||||
|                 } | ||||
| @ -526,7 +624,7 @@ internal class ProcessDataStandardFormat | ||||
|                 { | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                         value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                         if (string.IsNullOrEmpty(value)) | ||||
|                             _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append("null,"); | ||||
|                         else if (value.All(char.IsDigit)) | ||||
| @ -764,3 +862,9 @@ internal class ProcessDataStandardFormat | ||||
| internal partial class JsonElementCollectionSourceGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] | ||||
| [JsonSerializable(typeof(Dictionary<string, Dictionary<string, string>>))] | ||||
| internal partial class DictionaryStringDictionaryStringStringSourceGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -52,44 +52,57 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     { | ||||
|         string mid; | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"12-123456-1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "12-123456-1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "21"); | ||||
|         Assert.AreEqual("123456", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4609"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"12-1234567-1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "12-1234567-1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "21"); | ||||
|         Assert.AreEqual("1234567", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4609"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"-544481-\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "-544481-", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "51"); | ||||
|         Assert.AreEqual("544481", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); //  == "5158"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"00-544481-0000\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "00-544481-0000", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "51"); | ||||
|         Assert.AreEqual("544481", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); //  == "5158"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"00-o171308.1.51-0000\", \"Recipe\": \"Recipe\", \"Slot\": \"11\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "00-o171308.1.51-0000", "Recipe": "Recipe", "Slot": "11"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "54"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "547000"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4445"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE5\", \"Sequence\": \"638163023363575829\", \"MID\": \"B48\", \"Recipe\": \"lsl_6in \"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638163023363575829", "MID": "B48", "Recipe": "lsl_6in "} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "54"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "547000"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4445"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
| @ -99,16 +112,19 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     [TestMethod] | ||||
|     public void TestJobAA() | ||||
|     { | ||||
|         string mid; | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08THFTIRQS408M\", \"MesEntity\": \"BIORAD2\", \"Sequence\": \"123456789\", \"MID\": \"37--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08THFTIRQS408M", "MesEntity": "BIORAD2", "Sequence": "123456789", "MID": "37--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.AreEqual("37", job.ProcessType); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "549918"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "5101"); | ||||
| @ -123,14 +139,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobB() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"P1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "P1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -145,14 +165,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobC() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"BIORAD3\", \"Sequence\": \"638234699589174855\", \"MID\": \"33--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "BIORAD3", "Sequence": "638234699589174855", "MID": "33--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -167,15 +191,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobD() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         string metrologyFileShare = | ||||
|         FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"DEP08CEPIEPSILON\", \"MesEntity\": \"R32\", \"Sequence\": \"\", \"MID\": \"32--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "DEP08CEPIEPSILON", "MesEntity": "R32", "Sequence": "", "MID": "32--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -191,7 +218,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobE() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -200,7 +229,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638756365880000000", "MID": "38-660275-5095.1", "Recipe": "IRC6mm"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -216,7 +245,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobF() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -225,7 +256,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08THFTIRQS408M", "MesEntity": "BIORAD2", "Sequence": "638757112479659597", "MID": "173308.1.5", "Recipe": "6inTHICK"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -241,7 +272,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobG() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -250,7 +283,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08DDUPSFS6420", "MesEntity": "TENCOR1", "Sequence": "638765945581765554", "MID": "1T661282", "Recipe": "8IN_THIN ROTR"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -266,7 +299,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobH() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -275,7 +310,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08DDUPSFS6420", "MesEntity": "TENCOR1", "Sequence": "638765945581765554", "MID": "AK1PL2", "Recipe": "8INCLEAN"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -284,4 +319,28 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void TestJobI() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638163023363575829", "MID": "23-111111-5053", "Recipe": "lsl_6in "} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "23"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "111111"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "5053"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user