From d9f6ada5cb39321ba83b4cc487d770481fe5132e Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Tue, 7 Mar 2023 11:48:46 -0700 Subject: [PATCH] Assembly Version WS Result bug fix and Nuget bump, PSN, Reactor and Extra RDS rule OpenInsightApi and testRunTitle serializerValue --- Adaptation/.vscode/Reactor.js | 6 +- Adaptation/.vscode/psn.js | 6 +- .../FileHandlers/OpenInsight/FileRead.cs | 20 +++- .../FileHandlers/OpenInsight/FromIQS.cs | 95 ++++++++++++++++++- .../FileHandlers/Stratus/ProcessData.cs | 13 +-- Adaptation/MET08THFTIRSTRATUS-Development.yml | 1 + Adaptation/MET08THFTIRSTRATUS.Tests.csproj | 4 +- Adaptation/MET08THFTIRSTRATUS.yml | 1 + Adaptation/Shared/Metrology/WS.cs | 3 +- .../Staging/v2.47.1/MET08THFTIRSTRATUS.cs | 16 ++++ Adaptation/_Tests/Static/Stratus.cs | 8 ++ Properties/AssemblyInfo.cs | 4 +- 12 files changed, 152 insertions(+), 25 deletions(-) diff --git a/Adaptation/.vscode/Reactor.js b/Adaptation/.vscode/Reactor.js index 5aab451..2a665dd 100644 --- a/Adaptation/.vscode/Reactor.js +++ b/Adaptation/.vscode/Reactor.js @@ -19,8 +19,8 @@ function getValue(value, length, mesEntity, recipe, processJobId) { return mesEntity; else if (recipe.toUpperCase() === 'T_HIGH') return mesEntity; - else if (length !== 0 || processJobId === '-') - return value; - else + else if (length === 0) return processJobId; + else + return value; } \ No newline at end of file diff --git a/Adaptation/.vscode/psn.js b/Adaptation/.vscode/psn.js index 0305b3e..42b4720 100644 --- a/Adaptation/.vscode/psn.js +++ b/Adaptation/.vscode/psn.js @@ -19,8 +19,8 @@ function getValue(value, length, product, recipe) { return 'T-Mid'; else if (recipe.toUpperCase() === 'T_HIGH') return 'T-High'; - else if (length !== 0 || product === '-') - return value; - else + else if (length === 0) return product; + else + return value; } \ No newline at end of file diff --git a/Adaptation/FileHandlers/OpenInsight/FileRead.cs b/Adaptation/FileHandlers/OpenInsight/FileRead.cs index 4852983..949a547 100644 --- a/Adaptation/FileHandlers/OpenInsight/FileRead.cs +++ b/Adaptation/FileHandlers/OpenInsight/FileRead.cs @@ -6,6 +6,7 @@ using Adaptation.Shared.Methods; using Adaptation.Shared.Metrology; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -18,6 +19,8 @@ public class FileRead : Shared.FileRead, IFileRead private readonly string _IqsConnectionString; private readonly string _OpenInsightFilePattern; + private readonly string _OpenInsightApiECDirectory; + private readonly string _OpenInsightApiIFXDirectory; public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted) @@ -31,6 +34,8 @@ public class FileRead : Shared.FileRead, IFileRead throw new Exception(cellInstanceConnectionName); if (!_IsDuplicator) throw new Exception(cellInstanceConnectionName); + _OpenInsightApiIFXDirectory = @"\\messdv002.na.infineon.com\Candela\Archive\API"; + _OpenInsightApiECDirectory = @"\\messv02ecc1.ec.local\EC_Metrology_Si\Archive\API"; _IqsConnectionString = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.ConnectionString"); _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); } @@ -131,7 +136,7 @@ public class FileRead : Shared.FileRead, IFileRead return results.ToString(); } - private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, List descriptions, Test[] tests) + private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, string logistics, List descriptions, Test[] tests) { bool isDummyRun = false; List<(Shared.Properties.IScopeInfo, string)> collection = new(); @@ -148,17 +153,22 @@ public class FileRead : Shared.FileRead, IFileRead string lines = GetLines(descriptions); if (!string.IsNullOrEmpty(lines)) { + int? count; long? subGroupId; 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) || string.IsNullOrEmpty(descriptions[0].RDS)) - subGroupId = null; + (subGroupId, count) = (null, null); else - (subGroupId, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); + (subGroupId, count, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); if (subGroupId is null) collection.Add(new(new ScopeInfo(tests[0], _OpenInsightFilePattern), lines)); - else + else if (count is null) collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} {_OpenInsightFilePattern}"), lines)); + else + collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} E{count.Value} {_OpenInsightFilePattern}"), lines)); + string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + FromIQS.Save(_OpenInsightApiECDirectory, _OpenInsightApiIFXDirectory, _Logistics, reportFullPath, logistics, descriptions.First(), lines, subGroupId, weekOfYear); } } if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) @@ -175,7 +185,7 @@ public class FileRead : Shared.FileRead, IFileRead List descriptions = Stratus.ProcessData.GetDescriptions(jsonElements); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) - SaveOpenInsightFile(reportFullPath, dateTime, descriptions, tests); + SaveOpenInsightFile(reportFullPath, dateTime, pdsf.Item1, descriptions, tests); results = new Tuple>(pdsf.Item1, tests, jsonElements, new List()); return results; } diff --git a/Adaptation/FileHandlers/OpenInsight/FromIQS.cs b/Adaptation/FileHandlers/OpenInsight/FromIQS.cs index c82d6e1..86ced5a 100644 --- a/Adaptation/FileHandlers/OpenInsight/FromIQS.cs +++ b/Adaptation/FileHandlers/OpenInsight/FromIQS.cs @@ -3,6 +3,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Globalization; +using System.IO; using System.Linq; using System.Text; using System.Text.Json; @@ -29,7 +30,12 @@ public class FromIQS .AppendLine(" pl.f_name pl_name, ") .AppendLine(" pd.f_name pd_name, ") .AppendLine(" td.f_test td_test, ") - .AppendLine(" td.f_name td_name ") + .AppendLine(" td.f_name td_name, ") + .AppendLine(" (select count(ev.f_evnt) ") + .AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ") + .AppendLine(" where ev.f_prcs = rd.f_prcs ") + .AppendLine(" and ev.f_part = pd.f_part ") + .AppendLine(" and ev.f_sgtm = se.f_sgtm) ev_count ") .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] rd ") .AppendLine(" on se.f_prcs = rd.f_prcs ") @@ -67,9 +73,10 @@ public class FromIQS return stringBuilder; } - internal static (long?, string) GetCommandText(string connectionString, Logistics logistics, Stratus.Description description, long breakAfter, long preWait) + internal static (long?, int?, string) GetCommandText(string connectionString, Logistics logistics, Stratus.Description description, long breakAfter, long preWait) { string dateTime; + int? count = null; string commandText; long? result = null; string dateFormat = Stratus.Description.GetDateFormat(); @@ -113,10 +120,92 @@ public class FromIQS { result = subGroupId; commandText = GetCommandText(logistics, description, dateTime, subGroupId); + if (jsonProperties.Any() && jsonProperties[10].Name == "ev_count" && int.TryParse(jsonProperties[10].Value.ToString(), out int evCount)) + count = evCount; } } } - return new(result, commandText); + return new(result, count, commandText); + } + + private static string GetJson(Logistics logistics, string logisticLines, Stratus.Description description) + { + string result; + StringBuilder stringBuilder = new(); + var @object = new + { + description.MesEntity, + description.Employee, + description.Layer, + description.PSN, + description.RDS, + description.Reactor, + description.Recipe, + description.Zone, + logistics.DateTimeFromSequence.Ticks + }; + string[] pair; + string safeValue; + string[] segments; + string serializerValue; + foreach (string line in logisticLines.Split(new string[] { Environment.NewLine }, StringSplitOptions.None)) + { + segments = line.Split('\t'); + if (segments.Length < 2) + continue; + segments = segments[1].Split(';'); + _ = stringBuilder.Append('{'); + foreach (string segment in segments) + { + pair = segment.Split('='); + if (pair.Length != 2 || pair[0].Length < 3) + continue; + serializerValue = JsonSerializer.Serialize(pair[1]); + safeValue = serializerValue.Substring(1, serializerValue.Length - 2); + _ = stringBuilder.Append('"').Append(pair[0].Substring(2)).Append('"').Append(':').Append('"').Append(safeValue).Append('"').Append(','); + } + if (stringBuilder.Length > 0) + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + _ = stringBuilder.Append('}').Append(','); + } + if (stringBuilder.Length > 0) + _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); + _ = stringBuilder.Append(']').Append('}'); + _ = stringBuilder.Insert(0, ",\"Logistics\":["); + string json = JsonSerializer.Serialize(@object); + _ = stringBuilder.Insert(0, json.Substring(0, json.Length - 1)); + JsonElement? jsonElement = JsonSerializer.Deserialize(stringBuilder.ToString()); + result = jsonElement is null ? "{}" : JsonSerializer.Serialize(jsonElement, new JsonSerializerOptions { WriteIndented = true }); + return result; + } + + internal static void Save(string openInsightApiECDirectory, string openInsightApiIFXDirectory, Logistics logistics, string reportFullPath, string logisticLines, Stratus.Description description, string lines, long? subGroupId, string weekOfYear) + { + string fileName = Path.GetFileName(reportFullPath); + string json = GetJson(logistics, logisticLines, description); + string? ecPathRoot = Path.GetPathRoot(openInsightApiECDirectory); + string? ifxPathRoot = Path.GetPathRoot(openInsightApiIFXDirectory); + bool ecExists = ecPathRoot is not null && Directory.Exists(ecPathRoot); + bool ifxExists = ifxPathRoot is not null && Directory.Exists(ifxPathRoot); + string weekYear = $"{logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}"; + string ecDirectory = Path.Combine(openInsightApiECDirectory, weekYear, $"-{description.PSN}", $"-{description.Reactor}", $"-{description.RDS}", $"-{subGroupId}"); + string ifxDirectory = Path.Combine(openInsightApiIFXDirectory, weekYear, $"-{description.PSN}", $"-{description.Reactor}", $"-{description.RDS}", $"-{subGroupId}"); + if (ecExists && !Directory.Exists(ecDirectory)) + _ = Directory.CreateDirectory(ecDirectory); + if (ifxExists && !Directory.Exists(ifxDirectory)) + _ = Directory.CreateDirectory(ifxDirectory); + if (ecExists) + File.Copy(reportFullPath, Path.Combine(ecDirectory, fileName)); + if (ifxExists) + File.Copy(reportFullPath, Path.Combine(ifxDirectory, fileName)); + if (ecExists) + File.WriteAllText(Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt"), lines); + if (ifxExists) + File.WriteAllText(Path.Combine(ifxDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt"), lines); + if (ecExists) + File.WriteAllText(Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json"), json); + if (ifxExists) + File.WriteAllText(Path.Combine(ifxDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json"), json); } #nullable disable diff --git a/Adaptation/FileHandlers/Stratus/ProcessData.cs b/Adaptation/FileHandlers/Stratus/ProcessData.cs index 2a90967..de3af99 100644 --- a/Adaptation/FileHandlers/Stratus/ProcessData.cs +++ b/Adaptation/FileHandlers/Stratus/ProcessData.cs @@ -246,11 +246,11 @@ public partial class ProcessData : IProcessData return result; } - private static (string, string) GetReactorAndRDS(string defaultReactor, string defaultRDS, string text, string formattedText, string[] segments) + private static (string, string) GetReactorAndRDS(string defaultReactor, string defaultRDS, string text, string formattedText, string[] segments, bool hasRDS) { string rds; string reactor; - if (string.IsNullOrEmpty(text) || segments.Length == 0 || string.IsNullOrEmpty(formattedText)) + if (string.IsNullOrEmpty(text) || segments.Length == 0 || string.IsNullOrEmpty(formattedText) || (segments.Length > 1 && !hasRDS)) reactor = defaultReactor; else reactor = segments[0]; @@ -266,11 +266,11 @@ public partial class ProcessData : IProcessData return new(reactor, rds); } - private static (string, string) GetLayerAndPSN(string defaultLayer, string defaultPSN, string[] segments) + private static (string, string) GetLayerAndPSN(string defaultLayer, string defaultPSN, string[] segments, bool hasRDS) { string psn; string layer; - if (segments.Length <= 2) + if (segments.Length <= 2 || (segments.Length > 1 && !hasRDS)) { psn = defaultPSN; layer = defaultLayer; @@ -360,8 +360,9 @@ public partial class ProcessData : IProcessData segments = cassette.Split(new char[] { '.' }); else segments = cassette.Split(new char[] { '\u005F' }); - (reactor, rds) = GetReactorAndRDS(defaultReactor, defaultRDS, text, cassette, segments); - (layer, psn) = GetLayerAndPSN(defaultLayer, defaultPSN, segments); + bool hasRDS = Regex.IsMatch(cassette, "[-]?[0-9]{5,}[-]?"); + (reactor, rds) = GetReactorAndRDS(defaultReactor, defaultRDS, text, cassette, segments, hasRDS); + (layer, psn) = GetLayerAndPSN(defaultLayer, defaultPSN, segments, hasRDS); zone = GetZone(segments); if (segments.Length <= 3 || segments[3].Length <= 1) employee = defaultEmployee; diff --git a/Adaptation/MET08THFTIRSTRATUS-Development.yml b/Adaptation/MET08THFTIRSTRATUS-Development.yml index d5fdd67..fad4e24 100644 --- a/Adaptation/MET08THFTIRSTRATUS-Development.yml +++ b/Adaptation/MET08THFTIRSTRATUS-Development.yml @@ -119,6 +119,7 @@ steps: inputs: testResultsFormat: VSTest testResultsFiles: "**/*.trx" + testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)" searchFolder: "$(System.DefaultWorkingDirectory)" - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1 diff --git a/Adaptation/MET08THFTIRSTRATUS.Tests.csproj b/Adaptation/MET08THFTIRSTRATUS.Tests.csproj index e1a3982..5fc4267 100644 --- a/Adaptation/MET08THFTIRSTRATUS.Tests.csproj +++ b/Adaptation/MET08THFTIRSTRATUS.Tests.csproj @@ -34,7 +34,7 @@ - + NU1701 NU1701 NU1701 @@ -53,7 +53,7 @@ - + diff --git a/Adaptation/MET08THFTIRSTRATUS.yml b/Adaptation/MET08THFTIRSTRATUS.yml index d7ec4bd..5713a50 100644 --- a/Adaptation/MET08THFTIRSTRATUS.yml +++ b/Adaptation/MET08THFTIRSTRATUS.yml @@ -116,6 +116,7 @@ steps: inputs: testResultsFormat: VSTest testResultsFiles: "**/*.trx" + testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)" searchFolder: "$(System.DefaultWorkingDirectory)" - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1 diff --git a/Adaptation/Shared/Metrology/WS.cs b/Adaptation/Shared/Metrology/WS.cs index 12f261b..844efea 100644 --- a/Adaptation/Shared/Metrology/WS.cs +++ b/Adaptation/Shared/Metrology/WS.cs @@ -30,7 +30,7 @@ public partial class WS }; HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; - results = JsonSerializer.Deserialize(resultsJson); + results = JsonSerializer.Deserialize(resultsJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } if (!results.Success) results.Errors.Add(results.ToString()); @@ -45,6 +45,7 @@ public partial class WS exception = exception.InnerException; } results.Errors ??= new List(); + results.Errors.Add(resultsJson); results.Errors.Add(stringBuilder.ToString()); } return new(resultsJson, results); diff --git a/Adaptation/_Tests/Extract/Staging/v2.47.1/MET08THFTIRSTRATUS.cs b/Adaptation/_Tests/Extract/Staging/v2.47.1/MET08THFTIRSTRATUS.cs index 209a932..ac5986f 100644 --- a/Adaptation/_Tests/Extract/Staging/v2.47.1/MET08THFTIRSTRATUS.cs +++ b/Adaptation/_Tests/Extract/Staging/v2.47.1/MET08THFTIRSTRATUS.cs @@ -95,6 +95,22 @@ public class MET08THFTIRSTRATUS [TestMethod] public void Staging__v2_47_1__MET08THFTIRSTRATUS__OpenInsightMetrologyViewerAttachments() => _MET08THFTIRSTRATUS.Staging__v2_47_1__MET08THFTIRSTRATUS__OpenInsightMetrologyViewerAttachments(); +#if !(DEBUG) + [Ignore] +#endif + [TestMethod] + public void Staging__v2_47_1__MET08THFTIRSTRATUS__OpenInsightMetrologyViewerAttachments638131299562362655__Normal() + { + string check = "*.pdsf"; + bool validatePDSF = false; + MethodBase methodBase = new StackFrame().GetMethod(); + _MET08THFTIRSTRATUS.Staging__v2_47_1__MET08THFTIRSTRATUS__OpenInsightMetrologyViewerAttachments(); + string[] variables = _MET08THFTIRSTRATUS.AdaptationTesting.GetVariables(methodBase, check, validatePDSF); + IFileRead fileRead = _MET08THFTIRSTRATUS.AdaptationTesting.Get(methodBase, sourceFileLocation: variables[2], sourceFileFilter: variables[3], useCyclicalForDescription: false); + Logistics logistics = new(fileRead); + _ = AdaptationTesting.ReExtractCompareUpdatePassDirectory(variables, fileRead, logistics); + } + #if DEBUG [Ignore] #endif diff --git a/Adaptation/_Tests/Static/Stratus.cs b/Adaptation/_Tests/Static/Stratus.cs index 1149629..e305a6c 100644 --- a/Adaptation/_Tests/Static/Stratus.cs +++ b/Adaptation/_Tests/Static/Stratus.cs @@ -128,6 +128,14 @@ public class Stratus : LoggingUnitTesting, IDisposable Assert.IsTrue(descriptor.Reactor is "20"); Assert.IsTrue(descriptor.Zone is "1"); Assert.IsTrue(string.IsNullOrEmpty(descriptor.Employee)); + descriptor = FileHandlers.Stratus.ProcessData.GetDescriptor("P2-LOW-RR"); + Assert.IsTrue(!string.IsNullOrEmpty(descriptor.Cassette)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.Layer)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.PSN)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.RDS)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.Reactor)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.Zone)); + Assert.IsTrue(string.IsNullOrEmpty(descriptor.Employee)); descriptor = FileHandlers.Stratus.ProcessData.GetDescriptor("i171308.1.51"); Assert.IsTrue(string.IsNullOrEmpty(descriptor.Layer)); Assert.IsTrue(string.IsNullOrEmpty(descriptor.PSN)); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 9786eef..110eae0 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.47.1.0")] -[assembly: AssemblyFileVersion("2.47.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.47.5.0")] +[assembly: AssemblyFileVersion("2.47.5.0")] \ No newline at end of file