Variation, PSN, Reactor, Extra RDS rule,

OpenInsightApi and testRunTitle
This commit is contained in:
Mike Phares 2023-03-07 08:04:38 -07:00
parent e919dcc395
commit 5f07669573
11 changed files with 167 additions and 24 deletions

View File

@ -7,16 +7,18 @@
getValue(self, self.length, $('dcp.HGCV3/pcl/MesEntity', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''), getContextData('2', 'cds.PROCESS_JOBID', '')); getValue(self, self.length, $('dcp.HGCV3/pcl/MesEntity', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''), getContextData('2', 'cds.PROCESS_JOBID', ''));
function getValue(value, length, mesEntity, pattern, lot, processJobId) { function getValue(value, length, mesEntity, pattern, lot, processJobId) {
if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LOW') > -1) if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1)
return mesEntity; return mesEntity;
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MID') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1)
return mesEntity; return mesEntity;
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HIGH') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1)
return mesEntity; return mesEntity;
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('THIN') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1)
return mesEntity; return mesEntity;
else if (length !== 0 || processJobId === '-') else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1)
return value; return mesEntity;
else else if (length === 0)
return processJobId; return processJobId;
else
return value;
} }

43
Adaptation/.vscode/Variation.js vendored Normal file
View File

@ -0,0 +1,43 @@
getVariation($('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''), $('dcp.HGCV3/pcl/RhoAvgMean', ''));
function getVariation(pattern, lot, rhoAvgMean) {
var fourPP = 1;
var mid4pp = 1;
var thin4pp = 1;
var low4pp = 1787;
var thickness = 1;
var high4pp = 7767;
var epiPro4pp = 3163;
var midThickness = 1;
var thinThickness = 1;
var lowThickness = 15.46;
var highThickness = 20.01;
var epiProThickness = 20.28;
if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1) {
fourPP = epiPro4pp;
thickness = epiProThickness;
}
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1) {
fourPP = low4pp;
thickness = lowThickness;
}
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1) {
fourPP = mid4pp;
thickness = midThickness;
}
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1) {
fourPP = high4pp;
thickness = highThickness;
}
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1) {
fourPP = thin4pp;
thickness = thinThickness;
}
/* =(ABS(C9-H6)/C9)*100 */
var resistivity = thickness * fourPP * 0.0001;
var variation = (Math.abs(resistivity - rhoAvgMean) / resistivity) * 100;
if (thickness === 1 || fourPP === 1)
return null;
else
return variation;
}

View File

@ -7,16 +7,18 @@
getValue(self, self.length, getContextData('2', 'cds.PRODUCT', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', '')); getValue(self, self.length, getContextData('2', 'cds.PRODUCT', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''));
function getValue(value, length, product, pattern, lot) { function getValue(value, length, product, pattern, lot) {
if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LOW') > -1) if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1)
return 'EpiPro';
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1)
return 'Low'; return 'Low';
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MID') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1)
return 'Mid'; return 'Mid';
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HIGH') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1)
return 'High'; return 'High';
else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('THIN') > -1) else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1)
return 'Thin'; return 'Thin';
else if (length !== 0 || product === '-') else if (length === 0)
return value;
else
return product; return product;
else
return value;
} }

View File

@ -6,6 +6,7 @@ using Adaptation.Shared.Methods;
using Adaptation.Shared.Metrology; using Adaptation.Shared.Metrology;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -18,6 +19,8 @@ public class FileRead : Shared.FileRead, IFileRead
private readonly string _IqsConnectionString; private readonly string _IqsConnectionString;
private readonly string _OpenInsightFilePattern; private readonly string _OpenInsightFilePattern;
private readonly string _OpenInsightApiECDirectory;
private readonly string _OpenInsightApiIFXDirectory;
public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, Dictionary<long, List<string>> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, Dictionary<long, List<string>> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) :
base(new Description(), false, smtp, fileParameter, cellInstanceName, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, 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); throw new Exception(cellInstanceConnectionName);
if (!_IsDuplicator) if (!_IsDuplicator)
throw new Exception(cellInstanceConnectionName); 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"); _IqsConnectionString = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.ConnectionString");
_OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern");
} }
@ -182,7 +187,7 @@ public class FileRead : Shared.FileRead, IFileRead
return results.ToString(); return results.ToString();
} }
private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, List<pcl.Description> descriptions, Test[] tests) private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, string logistics, List<pcl.Description> descriptions, Test[] tests)
{ {
bool isDummyRun = false; bool isDummyRun = false;
List<(Shared.Properties.IScopeInfo, string)> collection = new(); List<(Shared.Properties.IScopeInfo, string)> collection = new();
@ -213,6 +218,8 @@ public class FileRead : Shared.FileRead, IFileRead
collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} {_OpenInsightFilePattern}"), lines)); collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} {_OpenInsightFilePattern}"), lines));
else else
collection.Add(new(new ScopeInfo(tests[0], $"{subGroupId.Value} E{count.Value} {_OpenInsightFilePattern}"), lines)); 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) if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
@ -229,7 +236,7 @@ public class FileRead : Shared.FileRead, IFileRead
List<pcl.Description> descriptions = pcl.ProcessData.GetDescriptions(jsonElements); List<pcl.Description> descriptions = pcl.ProcessData.GetDescriptions(jsonElements);
Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); Test[] tests = (from l in descriptions select (Test)l.Test).ToArray();
if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0)
SaveOpenInsightFile(reportFullPath, dateTime, descriptions, tests); SaveOpenInsightFile(reportFullPath, dateTime, pdsf.Item1, descriptions, tests);
results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(pdsf.Item1, tests, jsonElements, new List<FileInfo>()); results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(pdsf.Item1, tests, jsonElements, new List<FileInfo>());
return results; return results;
} }

View File

@ -3,6 +3,7 @@ using System;
using System.Data; using System.Data;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
@ -127,6 +128,82 @@ public class FromIQS
return new(result, count, commandText); return new(result, count, commandText);
} }
private static string GetJson(Logistics logistics, string logisticLines, pcl.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[] segments;
foreach (string line in logisticLines.Split(Environment.NewLine))
{
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;
_ = stringBuilder.Append('"').Append(pair[0][2..]).Append('"').Append(':').Append('"').Append(pair[1]).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[..^1]);
JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(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, pcl.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 #nullable disable
} }

View File

@ -218,11 +218,11 @@ public class ProcessData : IProcessData
return result; 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 rds;
string reactor; 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; reactor = defaultReactor;
else else
reactor = segments[0]; reactor = segments[0];
@ -238,11 +238,11 @@ public class ProcessData : IProcessData
return new(reactor, rds); 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 psn;
string layer; string layer;
if (segments.Length <= 2) if (segments.Length <= 2 || (segments.Length > 1 && !hasRDS))
{ {
psn = defaultPSN; psn = defaultPSN;
layer = defaultLayer; layer = defaultLayer;
@ -324,8 +324,9 @@ public class ProcessData : IProcessData
if (lot.Length > 2 && lot[0] == '1' && (lot[1] == 'T' || lot[1] == 't')) if (lot.Length > 2 && lot[0] == '1' && (lot[1] == 'T' || lot[1] == 't'))
lot = lot.Substring(2); lot = lot.Substring(2);
string[] segments = lot.Split('-'); string[] segments = lot.Split('-');
(reactor, rds) = GetReactorAndRDS(defaultReactor, defaultRDS, text, lot, segments); bool hasRDS = Regex.IsMatch(lot, "[-]?[0-9]{5,}[-]?");
(layer, psn) = GetLayerAndPSN(defaultLayer, defaultPSN, segments); (reactor, rds) = GetReactorAndRDS(defaultReactor, defaultRDS, text, lot, segments, hasRDS);
(layer, psn) = GetLayerAndPSN(defaultLayer, defaultPSN, segments, hasRDS);
zone = GetZone(segments); zone = GetZone(segments);
if (segments.Length <= 4) if (segments.Length <= 4)
employee = defaultEmployee; employee = defaultEmployee;

View File

@ -119,6 +119,7 @@ steps:
inputs: inputs:
testResultsFormat: VSTest testResultsFormat: VSTest
testResultsFiles: "**/*.trx" testResultsFiles: "**/*.trx"
testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
searchFolder: "$(System.DefaultWorkingDirectory)" searchFolder: "$(System.DefaultWorkingDirectory)"
- task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1 - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1

View File

@ -34,7 +34,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.2.0" /> <PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="FFMpegCore" Version="5.0.1" /> <PackageReference Include="FFMpegCore" Version="5.0.2" />
<PackageReference Include="IKVM.AWT.WinForms" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference> <PackageReference Include="IKVM.AWT.WinForms" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="IKVM.OpenJDK.Core" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference> <PackageReference Include="IKVM.OpenJDK.Core" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="IKVM.OpenJDK.Media" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference> <PackageReference Include="IKVM.OpenJDK.Media" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>

View File

@ -116,6 +116,7 @@ steps:
inputs: inputs:
testResultsFormat: VSTest testResultsFormat: VSTest
testResultsFiles: "**/*.trx" testResultsFiles: "**/*.trx"
testRunTitle: "$(GitCommitSeven)-$(Build.BuildId)-$(CoreVersion)-$(Configuration)-$(Build.Repository.Name)"
searchFolder: "$(System.DefaultWorkingDirectory)" searchFolder: "$(System.DefaultWorkingDirectory)"
- task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1 - task: mspremier.CreateWorkItem.CreateWorkItem-task.CreateWorkItem@1

View File

@ -30,7 +30,7 @@ public partial class WS
}; };
HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result; HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result;
resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result; resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result;
results = JsonSerializer.Deserialize<Results>(resultsJson); results = JsonSerializer.Deserialize<Results>(resultsJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
} }
if (!results.Success) if (!results.Success)
results.Errors.Add(results.ToString()); results.Errors.Add(results.ToString());
@ -45,6 +45,7 @@ public partial class WS
exception = exception.InnerException; exception = exception.InnerException;
} }
results.Errors ??= new List<string>(); results.Errors ??= new List<string>();
results.Errors.Add(resultsJson);
results.Errors.Add(stringBuilder.ToString()); results.Errors.Add(stringBuilder.ToString());
} }
return new(resultsJson, results); return new(resultsJson, results);

View File

@ -128,6 +128,14 @@ public class PCL : LoggingUnitTesting, IDisposable
Assert.IsTrue(descriptor.Reactor is "20"); Assert.IsTrue(descriptor.Reactor is "20");
Assert.IsTrue(descriptor.Zone is "1"); Assert.IsTrue(descriptor.Zone is "1");
Assert.IsTrue(string.IsNullOrEmpty(descriptor.Employee)); Assert.IsTrue(string.IsNullOrEmpty(descriptor.Employee));
descriptor = FileHandlers.pcl.ProcessData.GetDescriptor("P2-LOW-RR");
Assert.IsTrue(!string.IsNullOrEmpty(descriptor.Lot));
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));
LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit"));
} }