From a10c041f60521f0fdf4c940af79edd161f6b0b2c Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Fri, 18 Jul 2025 15:47:13 -0700 Subject: [PATCH] Now relying on pipeline to copy files from file shares for ghost-pcl and linc-pdfc Now using entered-date-time-filter and load-signature-date-time-filter for logistics query --- Adaptation/.vscode/settings.json | 3 + Adaptation/FileHandlers/APC/FileRead.cs | 2 +- Adaptation/FileHandlers/Archive/FileRead.cs | 2 +- .../OpenInsightMetrologyViewer/FileRead.cs | 2 +- .../FileRead.cs | 2 +- Adaptation/FileHandlers/Processed/FileRead.cs | 2 +- Adaptation/FileHandlers/SPaCe/FileRead.cs | 2 +- .../FileHandlers/TIBCO/Transport/Common.cs | 5 +- .../FileHandlers/TIBCO/Transport/CommonB.cs | 8 +- .../FileHandlers/TIBCO/Transport/Job.cs | 263 +++++++++++------- .../FileHandlers/TIBCO/Transport/Main.cs | 11 +- .../TIBCO/Transport/RunDataSheet.cs | 4 +- Adaptation/MET08DDUPSP1TBI.Tests.csproj | 8 +- Adaptation/MET08DDUPSP1TBI.yml | 36 +++ Adaptation/Shared/FileRead.cs | 27 +- .../Shared/ProcessDataStandardFormat.cs | 103 ++++++- Adaptation/_Tests/Static/Job.cs | 115 ++++++-- 17 files changed, 408 insertions(+), 187 deletions(-) diff --git a/Adaptation/.vscode/settings.json b/Adaptation/.vscode/settings.json index c583819..7bf26d8 100644 --- a/Adaptation/.vscode/settings.json +++ b/Adaptation/.vscode/settings.json @@ -7,6 +7,7 @@ "CASS", "CEPIEPSILON", "CUST", + "DDUPSFS", "DDUPSP", "EQPT", "GETJOBS", @@ -31,6 +32,8 @@ "substr", "SUSCEPTOR", "targ", + "TENCOR", + "THFTIRQS", "TIBCO", "Wafr" ], diff --git a/Adaptation/FileHandlers/APC/FileRead.cs b/Adaptation/FileHandlers/APC/FileRead.cs index a9ed0b0..a90c002 100644 --- a/Adaptation/FileHandlers/APC/FileRead.cs +++ b/Adaptation/FileHandlers/APC/FileRead.cs @@ -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.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/Archive/FileRead.cs b/Adaptation/FileHandlers/Archive/FileRead.cs index 80325c0..5cdb4f2 100644 --- a/Adaptation/FileHandlers/Archive/FileRead.cs +++ b/Adaptation/FileHandlers/Archive/FileRead.cs @@ -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.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs index 1fae3ee..2dade07 100644 --- a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/FileRead.cs @@ -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.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs index 57f1d98..a498308 100644 --- a/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewerAttachments/FileRead.cs @@ -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.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/Processed/FileRead.cs b/Adaptation/FileHandlers/Processed/FileRead.cs index e44e81d..0736643 100644 --- a/Adaptation/FileHandlers/Processed/FileRead.cs +++ b/Adaptation/FileHandlers/Processed/FileRead.cs @@ -172,7 +172,7 @@ public class FileRead : Shared.FileRead, IFileRead JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); List descriptions = txt.ProcessData.GetDescriptions(jsonElements); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); - results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) DirectoryMove(reportFullPath, dateTime, descriptions); else if (!_IsEAFHosted) diff --git a/Adaptation/FileHandlers/SPaCe/FileRead.cs b/Adaptation/FileHandlers/SPaCe/FileRead.cs index 2e0f55a..e258bd6 100644 --- a/Adaptation/FileHandlers/SPaCe/FileRead.cs +++ b/Adaptation/FileHandlers/SPaCe/FileRead.cs @@ -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.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List()); + results = new Tuple>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/TIBCO/Transport/Common.cs b/Adaptation/FileHandlers/TIBCO/Transport/Common.cs index fb0fbe7..199ccdc 100644 --- a/Adaptation/FileHandlers/TIBCO/Transport/Common.cs +++ b/Adaptation/FileHandlers/TIBCO/Transport/Common.cs @@ -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; } } \ No newline at end of file diff --git a/Adaptation/FileHandlers/TIBCO/Transport/CommonB.cs b/Adaptation/FileHandlers/TIBCO/Transport/CommonB.cs index 5f55d24..58ad6af 100644 --- a/Adaptation/FileHandlers/TIBCO/Transport/CommonB.cs +++ b/Adaptation/FileHandlers/TIBCO/Transport/CommonB.cs @@ -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; diff --git a/Adaptation/FileHandlers/TIBCO/Transport/Job.cs b/Adaptation/FileHandlers/TIBCO/Transport/Job.cs index 884b36c..3f27a81 100644 --- a/Adaptation/FileHandlers/TIBCO/Transport/Job.cs +++ b/Adaptation/FileHandlers/TIBCO/Transport/Job.cs @@ -41,7 +41,7 @@ public partial class Job public DateTime DateTime { get; } public List 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(); @@ -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 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 streamTask; Task 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(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 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 streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); + streamTask.Wait(); + if (!streamTask.Result.CanRead) + throw new NullReferenceException(nameof(streamTask)); + runDataSheetRoot = JsonSerializer.Deserialize(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 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(json); } catch (Exception) { runs = Array.Empty(); } - 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(json); } catch (Exception) { runs = Array.Empty(); } - 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); diff --git a/Adaptation/FileHandlers/TIBCO/Transport/Main.cs b/Adaptation/FileHandlers/TIBCO/Transport/Main.cs index 9eb9e7b..d1e5f2e 100644 --- a/Adaptation/FileHandlers/TIBCO/Transport/Main.cs +++ b/Adaptation/FileHandlers/TIBCO/Transport/Main.cs @@ -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); diff --git a/Adaptation/FileHandlers/TIBCO/Transport/RunDataSheet.cs b/Adaptation/FileHandlers/TIBCO/Transport/RunDataSheet.cs index 71df1b8..481bc17 100644 --- a/Adaptation/FileHandlers/TIBCO/Transport/RunDataSheet.cs +++ b/Adaptation/FileHandlers/TIBCO/Transport/RunDataSheet.cs @@ -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; } diff --git a/Adaptation/MET08DDUPSP1TBI.Tests.csproj b/Adaptation/MET08DDUPSP1TBI.Tests.csproj index 88f8d5a..bd3a1f1 100644 --- a/Adaptation/MET08DDUPSP1TBI.Tests.csproj +++ b/Adaptation/MET08DDUPSP1TBI.Tests.csproj @@ -87,16 +87,16 @@ - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/Adaptation/MET08DDUPSP1TBI.yml b/Adaptation/MET08DDUPSP1TBI.yml index 7b8da1f..435707e 100644 --- a/Adaptation/MET08DDUPSP1TBI.yml +++ b/Adaptation/MET08DDUPSP1TBI.yml @@ -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)" diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs index 49a4526..03b4109 100644 --- a/Adaptation/Shared/FileRead.cs +++ b/Adaptation/Shared/FileRead.cs @@ -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 threadExceptions) diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs index a86241d..1596264 100644 --- a/Adaptation/Shared/ProcessDataStandardFormat.cs +++ b/Adaptation/Shared/ProcessDataStandardFormat.cs @@ -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 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,19 +392,26 @@ 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 footerKeyValuePairs = GetFooterKeyValuePairs(processDataStandardFormat.Footer); + Dictionary> 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, '"', "Count", '"', - ": ", + ": ", processDataStandardFormat.Body.Count, ',', Environment.NewLine, @@ -409,12 +430,67 @@ internal class ProcessDataStandardFormat '"', "Sequence", '"', - ": ", + ": ", processDataStandardFormat.Sequence, Environment.NewLine, + footerText, + Environment.NewLine, '}'); return result; -#pragma warning restore CA1845, IDE0057 + } + + private static Dictionary GetFooterKeyValuePairs(ReadOnlyCollection footerLines) { + Dictionary 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 { + results.Add(segments[0], segments[1]); + } + } + return results; + } + + private static Dictionary> GetLogisticKeyValuePairs(ReadOnlyCollection footerLines, Dictionary footerKeyValuePairs) { + Dictionary> results = new(); + string[] segments; + string[] subSegments; + string[] subSubSegments; + Dictionary? 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? wsResults) @@ -518,7 +594,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 +602,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)) @@ -763,4 +839,9 @@ internal class ProcessDataStandardFormat [JsonSerializable(typeof(JsonElement[]))] internal partial class JsonElementCollectionSourceGenerationContext : JsonSerializerContext { +} + +[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] +[JsonSerializable(typeof(Dictionary>))] +internal partial class DictionaryStringDictionaryStringStringSourceGenerationContext : JsonSerializerContext { } \ No newline at end of file diff --git a/Adaptation/_Tests/Static/Job.cs b/Adaptation/_Tests/Static/Job.cs index eda0b61..ad58288 100644 --- a/Adaptation/_Tests/Static/Job.cs +++ b/Adaptation/_Tests/Static/Job.cs @@ -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(); + } + } \ No newline at end of file