Builds but needs tested
This commit is contained in:
@ -10,183 +10,168 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public class Description
|
||||
{
|
||||
|
||||
public class Description
|
||||
public enum RowColumn
|
||||
{
|
||||
|
||||
public enum RowColumn
|
||||
{
|
||||
Test = 1000,
|
||||
Count,
|
||||
Index
|
||||
}
|
||||
|
||||
public enum LogisticsColumn
|
||||
{
|
||||
EventName = 2000,
|
||||
NullData,
|
||||
JobID,
|
||||
Sequence,
|
||||
MesEntity,
|
||||
ReportFullPath,
|
||||
ProcessJobID,
|
||||
MID
|
||||
}
|
||||
|
||||
public enum Param
|
||||
{
|
||||
String = 0,
|
||||
Integer = 2,
|
||||
Double = 3,
|
||||
Boolean = 4,
|
||||
StructuredType = 5
|
||||
}
|
||||
|
||||
internal const string FileFound = "FileFound";
|
||||
|
||||
|
||||
public List<EquipmentParameter> EquipmentParameters { get; private set; }
|
||||
public List<ParameterTypeDefinition> ParameterTypeDefinitions { get; private set; }
|
||||
|
||||
private readonly bool _UseCyclical;
|
||||
private readonly List<string> _HeaderNames;
|
||||
private readonly Dictionary<string, int> _KeyIndexPairs;
|
||||
private readonly ParameterTypeDefinition _StructuredType;
|
||||
private readonly FileConnectorParameterTypeDefinitionProvider _FileConnectorParameterTypeDefinitionProvider;
|
||||
|
||||
public Description(ILogic logic, ConfigDataBase configDataBase, IEquipmentControl equipmentControl)
|
||||
{
|
||||
_KeyIndexPairs = new Dictionary<string, int>();
|
||||
_HeaderNames = configDataBase.GetHeaderNames(logic);
|
||||
_UseCyclical = configDataBase.UseCyclicalForDescription;
|
||||
_StructuredType = new StructuredType(nameof(StructuredType), string.Empty, new List<Field>());
|
||||
_FileConnectorParameterTypeDefinitionProvider = new FileConnectorParameterTypeDefinitionProvider();
|
||||
EquipmentParameters = new List<EquipmentParameter>();
|
||||
ParameterTypeDefinitions = new List<ParameterTypeDefinition> { _StructuredType };
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = configDataBase.GetParameterInfo(logic, allowNull: false);
|
||||
List<ParameterValue> results = GetParameterValues(equipmentControl, keyValuePairsCollection);
|
||||
}
|
||||
|
||||
private List<ParameterValue> GetParameterValues(IEquipmentControl equipmentControl, Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection)
|
||||
{
|
||||
List<ParameterValue> results = new List<ParameterValue>();
|
||||
Enum param;
|
||||
object value;
|
||||
Enum[] @params;
|
||||
string description;
|
||||
List<object[]> list;
|
||||
EquipmentParameter equipmentParameter;
|
||||
ParameterTypeDefinition parameterTypeDefinition;
|
||||
bool addToEquipmentParameters = !EquipmentParameters.Any();
|
||||
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairsCollection)
|
||||
{
|
||||
if (!addToEquipmentParameters && !_KeyIndexPairs.ContainsKey(keyValuePair.Key))
|
||||
continue;
|
||||
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
|
||||
if (@params.Length != 1)
|
||||
throw new Exception();
|
||||
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
|
||||
throw new Exception();
|
||||
param = @params[0];
|
||||
if (!addToEquipmentParameters)
|
||||
equipmentParameter = EquipmentParameters[_KeyIndexPairs[keyValuePair.Key]];
|
||||
else
|
||||
{
|
||||
description = keyValuePair.Value[0].Item3;
|
||||
_KeyIndexPairs.Add(keyValuePair.Key, EquipmentParameters.Count());
|
||||
if (param is Param.StructuredType || (_UseCyclical && !_HeaderNames.Contains(keyValuePair.Key)))
|
||||
parameterTypeDefinition = _StructuredType;
|
||||
else
|
||||
parameterTypeDefinition = _FileConnectorParameterTypeDefinitionProvider.GetParameterTypeDefinition(param.ToString());
|
||||
equipmentParameter = new EquipmentParameter(keyValuePair.Key, parameterTypeDefinition, description);
|
||||
EquipmentParameters.Add(equipmentParameter);
|
||||
}
|
||||
if (!_UseCyclical || _HeaderNames.Contains(keyValuePair.Key))
|
||||
value = keyValuePair.Value[0].Item4;
|
||||
else
|
||||
{
|
||||
list = new List<object[]>();
|
||||
for (int i = 0; i < keyValuePair.Value.Count; i++)
|
||||
list.Add(new object[] { i, keyValuePair.Value[i].Item4 });
|
||||
value = list;
|
||||
}
|
||||
if (equipmentControl is null || !(param is Param.StructuredType))
|
||||
results.Add(new ParameterValue(equipmentParameter, value, DateTime.Now));
|
||||
else
|
||||
results.Add(equipmentControl.DataCollection.CreateParameterValue(equipmentParameter, value));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<ParameterValue> GetParameterValues(ILogic logic, IEquipmentControl equipmentControl, JsonElement jsonElement, int? i = null, Dictionary<string, object> keyValuePairs = null)
|
||||
{
|
||||
List<ParameterValue> results = new List<ParameterValue>();
|
||||
if (_UseCyclical && (i is null || i.Value > 0))
|
||||
throw new Exception();
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
Enum param;
|
||||
Tuple<Enum, string, string, object> tuple;
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
|
||||
for (int r = i.Value; r < jsonElements.Length; r++)
|
||||
{
|
||||
foreach (JsonProperty jsonProperty in jsonElement[r].EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
param = Param.StructuredType;
|
||||
//jValue = jObject.Value<JValue>("Item1");
|
||||
throw new NotImplementedException("Item1");
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (jsonProperty.Value.ValueKind)
|
||||
{
|
||||
case JsonValueKind.String:
|
||||
param = Param.String;
|
||||
break;
|
||||
case JsonValueKind.Number:
|
||||
param = Param.Double;
|
||||
break;
|
||||
case JsonValueKind.True:
|
||||
case JsonValueKind.False:
|
||||
param = Param.Boolean;
|
||||
break;
|
||||
case JsonValueKind.Null:
|
||||
param = Param.String;
|
||||
break;
|
||||
default:
|
||||
param = Param.StructuredType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, string.Empty, jsonProperty.Value.ToString());
|
||||
if (!keyValuePairsCollection.ContainsKey(jsonProperty.Name))
|
||||
keyValuePairsCollection.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
|
||||
keyValuePairsCollection[jsonProperty.Name].Add(tuple);
|
||||
}
|
||||
if (!_UseCyclical)
|
||||
break;
|
||||
}
|
||||
results = GetParameterValues(equipmentControl, keyValuePairsCollection);
|
||||
return results;
|
||||
}
|
||||
|
||||
public static string GetCellName()
|
||||
{
|
||||
string result;
|
||||
if (Backbone.Instance?.CellName is null)
|
||||
result = string.Empty;
|
||||
else
|
||||
result = Backbone.Instance.CellName;
|
||||
if (result.Contains("-IO"))
|
||||
result = result.Replace("-IO", string.Empty);
|
||||
return result;
|
||||
}
|
||||
|
||||
Test = 1000,
|
||||
Count,
|
||||
Index
|
||||
}
|
||||
|
||||
}
|
||||
public enum LogisticsColumn
|
||||
{
|
||||
EventName = 2000,
|
||||
NullData,
|
||||
JobID,
|
||||
Sequence,
|
||||
MesEntity,
|
||||
ReportFullPath,
|
||||
ProcessJobID,
|
||||
MID
|
||||
}
|
||||
|
||||
public enum Param
|
||||
{
|
||||
String = 0,
|
||||
Integer = 2,
|
||||
Double = 3,
|
||||
Boolean = 4,
|
||||
StructuredType = 5
|
||||
}
|
||||
|
||||
internal const string FileFound = "FileFound";
|
||||
|
||||
public List<EquipmentParameter> EquipmentParameters { get; private set; }
|
||||
public List<ParameterTypeDefinition> ParameterTypeDefinitions { get; private set; }
|
||||
|
||||
private readonly bool _UseCyclical;
|
||||
private readonly List<string> _HeaderNames;
|
||||
private readonly Dictionary<string, int> _KeyIndexPairs;
|
||||
private readonly ParameterTypeDefinition _StructuredType;
|
||||
private readonly FileConnectorParameterTypeDefinitionProvider _FileConnectorParameterTypeDefinitionProvider;
|
||||
|
||||
public Description(ILogic logic, ConfigDataBase configDataBase, IEquipmentControl equipmentControl)
|
||||
{
|
||||
_KeyIndexPairs = new Dictionary<string, int>();
|
||||
_HeaderNames = configDataBase.GetHeaderNames(logic);
|
||||
_UseCyclical = configDataBase.UseCyclicalForDescription;
|
||||
_StructuredType = new StructuredType(nameof(StructuredType), string.Empty, new List<Field>());
|
||||
_FileConnectorParameterTypeDefinitionProvider = new FileConnectorParameterTypeDefinitionProvider();
|
||||
EquipmentParameters = new List<EquipmentParameter>();
|
||||
ParameterTypeDefinitions = new List<ParameterTypeDefinition> { _StructuredType };
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = configDataBase.GetParameterInfo(logic, allowNull: false);
|
||||
List<ParameterValue> results = GetParameterValues(equipmentControl, keyValuePairsCollection);
|
||||
}
|
||||
|
||||
private List<ParameterValue> GetParameterValues(IEquipmentControl equipmentControl, Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection)
|
||||
{
|
||||
List<ParameterValue> results = new();
|
||||
Enum param;
|
||||
object value;
|
||||
Enum[] @params;
|
||||
string description;
|
||||
List<object[]> list;
|
||||
EquipmentParameter equipmentParameter;
|
||||
ParameterTypeDefinition parameterTypeDefinition;
|
||||
bool addToEquipmentParameters = !EquipmentParameters.Any();
|
||||
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairsCollection)
|
||||
{
|
||||
if (!addToEquipmentParameters && !_KeyIndexPairs.ContainsKey(keyValuePair.Key))
|
||||
continue;
|
||||
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
|
||||
if (@params.Length != 1)
|
||||
throw new Exception();
|
||||
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
|
||||
throw new Exception();
|
||||
param = @params[0];
|
||||
if (!addToEquipmentParameters)
|
||||
equipmentParameter = EquipmentParameters[_KeyIndexPairs[keyValuePair.Key]];
|
||||
else
|
||||
{
|
||||
description = keyValuePair.Value[0].Item3;
|
||||
_KeyIndexPairs.Add(keyValuePair.Key, EquipmentParameters.Count());
|
||||
if (param is Param.StructuredType || (_UseCyclical && !_HeaderNames.Contains(keyValuePair.Key)))
|
||||
parameterTypeDefinition = _StructuredType;
|
||||
else
|
||||
parameterTypeDefinition = _FileConnectorParameterTypeDefinitionProvider.GetParameterTypeDefinition(param.ToString());
|
||||
equipmentParameter = new EquipmentParameter(keyValuePair.Key, parameterTypeDefinition, description);
|
||||
EquipmentParameters.Add(equipmentParameter);
|
||||
}
|
||||
if (!_UseCyclical || _HeaderNames.Contains(keyValuePair.Key))
|
||||
value = keyValuePair.Value[0].Item4;
|
||||
else
|
||||
{
|
||||
list = new List<object[]>();
|
||||
for (int i = 0; i < keyValuePair.Value.Count; i++)
|
||||
list.Add(new object[] { i, keyValuePair.Value[i].Item4 });
|
||||
value = list;
|
||||
}
|
||||
if (equipmentControl is null || param is not Param.StructuredType)
|
||||
results.Add(new ParameterValue(equipmentParameter, value, DateTime.Now));
|
||||
else
|
||||
results.Add(equipmentControl.DataCollection.CreateParameterValue(equipmentParameter, value));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<ParameterValue> GetParameterValues(ILogic logic, IEquipmentControl equipmentControl, JsonElement jsonElement, int? i = null, Dictionary<string, object>? keyValuePairs = null)
|
||||
{
|
||||
_ = new List<ParameterValue>();
|
||||
if (_UseCyclical && (i is null || i.Value > 0))
|
||||
throw new Exception();
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
Enum param;
|
||||
Tuple<Enum, string, string, object> tuple;
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = new();
|
||||
for (int r = i.Value; r < jsonElements.Length; r++)
|
||||
{
|
||||
foreach (JsonProperty jsonProperty in jsonElement[r].EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind is JsonValueKind.Object or JsonValueKind.Array)
|
||||
{
|
||||
param = Param.StructuredType;
|
||||
//jValue = jObject.Value<JValue>("Item1");
|
||||
throw new NotImplementedException("Item1");
|
||||
}
|
||||
else
|
||||
{
|
||||
param = jsonProperty.Value.ValueKind switch
|
||||
{
|
||||
JsonValueKind.String => Param.String,
|
||||
JsonValueKind.Number => Param.Double,
|
||||
JsonValueKind.True or JsonValueKind.False => Param.Boolean,
|
||||
JsonValueKind.Null => Param.String,
|
||||
_ => Param.StructuredType,
|
||||
};
|
||||
}
|
||||
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, string.Empty, jsonProperty.Value.ToString());
|
||||
if (!keyValuePairsCollection.ContainsKey(jsonProperty.Name))
|
||||
keyValuePairsCollection.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
|
||||
keyValuePairsCollection[jsonProperty.Name].Add(tuple);
|
||||
}
|
||||
if (!_UseCyclical)
|
||||
break;
|
||||
}
|
||||
List<ParameterValue> results = GetParameterValues(equipmentControl, keyValuePairsCollection);
|
||||
return results;
|
||||
}
|
||||
|
||||
public static string GetCellName()
|
||||
{
|
||||
string result;
|
||||
if (Backbone.Instance?.CellName is null)
|
||||
result = string.Empty;
|
||||
else
|
||||
result = Backbone.Instance.CellName;
|
||||
if (result.Contains("-IO"))
|
||||
result = result.Replace("-IO", string.Empty);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,53 +1,50 @@
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public enum EquipmentType
|
||||
{
|
||||
|
||||
public enum EquipmentType
|
||||
{
|
||||
FileEquipment,
|
||||
SemiEquipment,
|
||||
//
|
||||
DEP08EGANAIXG5,
|
||||
//
|
||||
MET08ANLYSDIFAAST230_Semi,
|
||||
MET08DDUPSFS6420,
|
||||
MET08DDUPSP1TBI,
|
||||
MET08RESIHGCV,
|
||||
MET08RESIMAPCDE,
|
||||
MET08THFTIRQS408M,
|
||||
MET08THFTIRSTRATUS,
|
||||
//
|
||||
MET08AFMD3100,
|
||||
MET08BVHGPROBE,
|
||||
MET08CVHGPROBE802B150,
|
||||
MET08CVHGPROBE802B150_Monthly,
|
||||
MET08CVHGPROBE802B150_Weekly,
|
||||
MET08DDINCAN8620,
|
||||
MET08DDINCAN8620_Daily,
|
||||
MET08EBEAMINTEGRITY26,
|
||||
MET08HALLHL5580,
|
||||
MET08HALLHL5580_Monthly,
|
||||
MET08HALLHL5580_Weekly,
|
||||
MET08MESMICROSCOPE,
|
||||
MET08NDFRESIMAP151C,
|
||||
MET08NDFRESIMAP151C_Verification,
|
||||
MET08PLMAPRPM,
|
||||
MET08PLMAPRPM_Daily,
|
||||
MET08PLMAPRPM_Verification,
|
||||
MET08PLMPPLATO,
|
||||
MET08PRFUSB4000,
|
||||
MET08PRFUSB4000_Daily,
|
||||
MET08PRFUSB4000_Monthly,
|
||||
MET08PRFUSB4000_Weekly,
|
||||
MET08PRFUSB4000_Verification,
|
||||
MET08PRFUSB4000_Villach,
|
||||
MET08UVH44GS100M,
|
||||
MET08VPDSUBCON,
|
||||
MET08WGEOMX203641Q,
|
||||
MET08WGEOMX203641Q_Verification,
|
||||
MET08XRDXPERTPROMRDXL,
|
||||
MET08XRDXPERTPROMRDXL_Monthly,
|
||||
MET08XRDXPERTPROMRDXL_Weekly,
|
||||
METBRXRAYJV7300L
|
||||
}
|
||||
|
||||
}
|
||||
FileEquipment,
|
||||
SemiEquipment,
|
||||
//
|
||||
DEP08EGANAIXG5,
|
||||
//
|
||||
MET08ANLYSDIFAAST230_Semi,
|
||||
MET08DDUPSFS6420,
|
||||
MET08DDUPSP1TBI,
|
||||
MET08RESIHGCV,
|
||||
MET08RESIMAPCDE,
|
||||
MET08THFTIRQS408M,
|
||||
MET08THFTIRSTRATUS,
|
||||
//
|
||||
MET08AFMD3100,
|
||||
MET08BVHGPROBE,
|
||||
MET08CVHGPROBE802B150,
|
||||
MET08CVHGPROBE802B150_Monthly,
|
||||
MET08CVHGPROBE802B150_Weekly,
|
||||
MET08DDINCAN8620,
|
||||
MET08DDINCAN8620_Daily,
|
||||
MET08EBEAMINTEGRITY26,
|
||||
MET08HALLHL5580,
|
||||
MET08HALLHL5580_Monthly,
|
||||
MET08HALLHL5580_Weekly,
|
||||
MET08MESMICROSCOPE,
|
||||
MET08NDFRESIMAP151C,
|
||||
MET08NDFRESIMAP151C_Verification,
|
||||
MET08PLMAPRPM,
|
||||
MET08PLMAPRPM_Daily,
|
||||
MET08PLMAPRPM_Verification,
|
||||
MET08PLMPPLATO,
|
||||
MET08PRFUSB4000,
|
||||
MET08PRFUSB4000_Daily,
|
||||
MET08PRFUSB4000_Monthly,
|
||||
MET08PRFUSB4000_Weekly,
|
||||
MET08PRFUSB4000_Verification,
|
||||
MET08PRFUSB4000_Villach,
|
||||
MET08UVH44GS100M,
|
||||
MET08VPDSUBCON,
|
||||
MET08WGEOMX203641Q,
|
||||
MET08WGEOMX203641Q_Verification,
|
||||
MET08XRDXPERTPROMRDXL,
|
||||
MET08XRDXPERTPROMRDXL_Monthly,
|
||||
MET08XRDXPERTPROMRDXL_Weekly,
|
||||
METBRXRAYJV7300L
|
||||
}
|
||||
|
@ -4,13 +4,11 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public interface IProcessData
|
||||
{
|
||||
public interface IProcessData
|
||||
{
|
||||
|
||||
Tuple<string, JsonElement?, List<FileInfo>> GetResults(ILogic logic, ConfigDataBase configData, List<FileInfo> fileInfoCollection);
|
||||
Tuple<string, JsonElement?, List<FileInfo>> GetResults(ILogic logic, ConfigDataBase configData, List<FileInfo> fileInfoCollection);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,23 @@
|
||||
using Shared.Metrology;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public interface IProcessDataDescription
|
||||
{
|
||||
|
||||
public interface IProcessDataDescription
|
||||
{
|
||||
int Test { get; set; }
|
||||
int Count { get; set; }
|
||||
int Index { get; set; }
|
||||
IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase);
|
||||
IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData);
|
||||
List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test);
|
||||
List<string> GetNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
string GetEventDescription();
|
||||
|
||||
int Test { get; set; }
|
||||
int Count { get; set; }
|
||||
int Index { get; set; }
|
||||
IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase);
|
||||
IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData);
|
||||
List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test);
|
||||
List<string> GetNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase);
|
||||
string GetEventDescription();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,18 @@
|
||||
using System;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public interface IScopeInfo
|
||||
{
|
||||
|
||||
public interface IScopeInfo
|
||||
{
|
||||
Enum Enum { get; }
|
||||
string HTML { get; }
|
||||
string Title { get; }
|
||||
string FileName { get; }
|
||||
int TestValue { get; }
|
||||
string Header { get; }
|
||||
string QueryFilter { get; }
|
||||
string FileNameWithoutExtension { get; }
|
||||
EquipmentType EquipmentType { get; }
|
||||
|
||||
Enum Enum { get; }
|
||||
string HTML { get; }
|
||||
string Title { get; }
|
||||
string FileName { get; }
|
||||
int TestValue { get; }
|
||||
string Header { get; }
|
||||
string QueryFilter { get; }
|
||||
string FileNameWithoutExtension { get; }
|
||||
EquipmentType EquipmentType { get; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,170 +2,167 @@ using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public class IsEnvironment
|
||||
{
|
||||
|
||||
public class IsEnvironment
|
||||
public enum Name
|
||||
{
|
||||
|
||||
public enum Name
|
||||
{
|
||||
LinuxDevelopment,
|
||||
LinuxProduction,
|
||||
LinuxStaging,
|
||||
OSXDevelopment,
|
||||
OSXProduction,
|
||||
OSXStaging,
|
||||
WindowsDevelopment,
|
||||
WindowsProduction,
|
||||
WindowsStaging
|
||||
}
|
||||
|
||||
public bool DebuggerWasAttachedDuringConstructor { get; private set; }
|
||||
public bool Development { get; private set; }
|
||||
public bool Linux { get; private set; }
|
||||
public bool OSX { get; private set; }
|
||||
public bool Production { get; private set; }
|
||||
public bool Staging { get; private set; }
|
||||
public bool Windows { get; private set; }
|
||||
public string Profile { get; private set; }
|
||||
public string AppSettingsFileName { get; private set; }
|
||||
public string ASPNetCoreEnvironment { get; private set; }
|
||||
|
||||
public IsEnvironment(string testCategory)
|
||||
{
|
||||
if (testCategory.EndsWith(".json"))
|
||||
{
|
||||
Production = testCategory == "appsettings.json";
|
||||
Staging = testCategory.EndsWith(nameof(Staging));
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Development = testCategory.EndsWith(nameof(Development));
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
}
|
||||
else
|
||||
{
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX));
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux));
|
||||
Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging));
|
||||
Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows));
|
||||
Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production));
|
||||
Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development));
|
||||
}
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
|
||||
}
|
||||
|
||||
public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction)
|
||||
{
|
||||
Staging = isStaging;
|
||||
Production = isProduction;
|
||||
Development = isDevelopment;
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
|
||||
}
|
||||
|
||||
public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction)
|
||||
{
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction)
|
||||
throw new Exception();
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction)
|
||||
Production = true;
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment)
|
||||
Development = true;
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction)
|
||||
throw new Exception();
|
||||
else
|
||||
{
|
||||
Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging));
|
||||
Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production));
|
||||
Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development));
|
||||
}
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount);
|
||||
}
|
||||
|
||||
private string GetProfile()
|
||||
{
|
||||
string result;
|
||||
if (Windows && Production)
|
||||
result = nameof(Production);
|
||||
else if (Windows && Staging)
|
||||
result = nameof(Staging);
|
||||
else if (Windows && Development)
|
||||
result = nameof(Development);
|
||||
else if (Linux && Production)
|
||||
result = nameof(Name.LinuxProduction);
|
||||
else if (Linux && Staging)
|
||||
result = nameof(Name.LinuxStaging);
|
||||
else if (Linux && Development)
|
||||
result = nameof(Name.LinuxDevelopment);
|
||||
else if (OSX && Production)
|
||||
result = nameof(Name.OSXProduction);
|
||||
else if (OSX && Staging)
|
||||
result = nameof(Name.OSXStaging);
|
||||
else if (OSX && Development)
|
||||
result = nameof(Name.OSXDevelopment);
|
||||
else
|
||||
throw new Exception();
|
||||
return result;
|
||||
}
|
||||
|
||||
private string GetAppSettingsFileName(int? processesCount)
|
||||
{
|
||||
string result;
|
||||
if (Production)
|
||||
{
|
||||
if (processesCount is null)
|
||||
result = "appsettings.json";
|
||||
else
|
||||
result = $"appsettings.{processesCount}.json";
|
||||
}
|
||||
else
|
||||
{
|
||||
string environment;
|
||||
if (Staging)
|
||||
environment = nameof(Staging);
|
||||
else if (Development)
|
||||
environment = nameof(Development);
|
||||
else
|
||||
throw new Exception();
|
||||
if (processesCount is null)
|
||||
result = $"appsettings.{environment}.json";
|
||||
else
|
||||
result = $"appsettings.{environment}.{processesCount}.json";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static string GetEnvironmentName(IsEnvironment isEnvironment)
|
||||
{
|
||||
string result;
|
||||
if (isEnvironment.Windows)
|
||||
result = nameof(IsEnvironment.Windows);
|
||||
else if (isEnvironment.Linux)
|
||||
result = nameof(IsEnvironment.Linux);
|
||||
else if (isEnvironment.OSX)
|
||||
result = nameof(IsEnvironment.OSX);
|
||||
else
|
||||
throw new Exception();
|
||||
return result;
|
||||
}
|
||||
|
||||
LinuxDevelopment,
|
||||
LinuxProduction,
|
||||
LinuxStaging,
|
||||
OSXDevelopment,
|
||||
OSXProduction,
|
||||
OSXStaging,
|
||||
WindowsDevelopment,
|
||||
WindowsProduction,
|
||||
WindowsStaging
|
||||
}
|
||||
|
||||
}
|
||||
public bool DebuggerWasAttachedDuringConstructor { get; private set; }
|
||||
public bool Development { get; private set; }
|
||||
public bool Linux { get; private set; }
|
||||
public bool OSX { get; private set; }
|
||||
public bool Production { get; private set; }
|
||||
public bool Staging { get; private set; }
|
||||
public bool Windows { get; private set; }
|
||||
public string Profile { get; private set; }
|
||||
public string AppSettingsFileName { get; private set; }
|
||||
public string ASPNetCoreEnvironment { get; private set; }
|
||||
|
||||
public IsEnvironment(string testCategory)
|
||||
{
|
||||
if (testCategory.EndsWith(".json"))
|
||||
{
|
||||
Production = testCategory == "appsettings.json";
|
||||
Staging = testCategory.EndsWith(nameof(Staging));
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Development = testCategory.EndsWith(nameof(Development));
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
}
|
||||
else
|
||||
{
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX));
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux));
|
||||
Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging));
|
||||
Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows));
|
||||
Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production));
|
||||
Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development));
|
||||
}
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
|
||||
}
|
||||
|
||||
public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction)
|
||||
{
|
||||
Staging = isStaging;
|
||||
Production = isProduction;
|
||||
Development = isDevelopment;
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
|
||||
}
|
||||
|
||||
public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction)
|
||||
{
|
||||
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
|
||||
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
|
||||
if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction)
|
||||
throw new Exception();
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction)
|
||||
Production = true;
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment)
|
||||
Development = true;
|
||||
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction)
|
||||
throw new Exception();
|
||||
else
|
||||
{
|
||||
Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging));
|
||||
Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production));
|
||||
Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development));
|
||||
}
|
||||
Profile = GetProfile();
|
||||
AppSettingsFileName = GetAppSettingsFileName(processesCount);
|
||||
}
|
||||
|
||||
private string GetProfile()
|
||||
{
|
||||
string result;
|
||||
if (Windows && Production)
|
||||
result = nameof(Production);
|
||||
else if (Windows && Staging)
|
||||
result = nameof(Staging);
|
||||
else if (Windows && Development)
|
||||
result = nameof(Development);
|
||||
else if (Linux && Production)
|
||||
result = nameof(Name.LinuxProduction);
|
||||
else if (Linux && Staging)
|
||||
result = nameof(Name.LinuxStaging);
|
||||
else if (Linux && Development)
|
||||
result = nameof(Name.LinuxDevelopment);
|
||||
else if (OSX && Production)
|
||||
result = nameof(Name.OSXProduction);
|
||||
else if (OSX && Staging)
|
||||
result = nameof(Name.OSXStaging);
|
||||
else if (OSX && Development)
|
||||
result = nameof(Name.OSXDevelopment);
|
||||
else
|
||||
throw new Exception();
|
||||
return result;
|
||||
}
|
||||
|
||||
private string GetAppSettingsFileName(int? processesCount)
|
||||
{
|
||||
string result;
|
||||
if (Production)
|
||||
{
|
||||
if (processesCount is null)
|
||||
result = "appsettings.json";
|
||||
else
|
||||
result = $"appsettings.{processesCount}.json";
|
||||
}
|
||||
else
|
||||
{
|
||||
string environment;
|
||||
if (Staging)
|
||||
environment = nameof(Staging);
|
||||
else if (Development)
|
||||
environment = nameof(Development);
|
||||
else
|
||||
throw new Exception();
|
||||
if (processesCount is null)
|
||||
result = $"appsettings.{environment}.json";
|
||||
else
|
||||
result = $"appsettings.{environment}.{processesCount}.json";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static string GetEnvironmentName(IsEnvironment isEnvironment)
|
||||
{
|
||||
string result;
|
||||
if (isEnvironment.Windows)
|
||||
result = nameof(IsEnvironment.Windows);
|
||||
else if (isEnvironment.Linux)
|
||||
result = nameof(IsEnvironment.Linux);
|
||||
else if (isEnvironment.OSX)
|
||||
result = nameof(IsEnvironment.OSX);
|
||||
else
|
||||
throw new Exception();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,243 +3,228 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public class Logistics
|
||||
{
|
||||
|
||||
public class Logistics
|
||||
public object NullData { get; private set; }
|
||||
public string JobID { get; private set; } //CellName
|
||||
public long Sequence { get; private set; } //Ticks
|
||||
public DateTime DateTimeFromSequence { get; private set; }
|
||||
public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; }
|
||||
public string MesEntity { get; private set; } //SPC
|
||||
public string ReportFullPath { get; private set; } //Extract file
|
||||
public string ProcessJobID { get; internal set; } //Reactor (duplicate but I want it in the logistics)
|
||||
public string MID { get; internal set; } //Lot & Pocket || Lot
|
||||
public List<string> Tags { get; internal set; }
|
||||
public List<string> Logistics1 { get; internal set; }
|
||||
public List<Logistics2> Logistics2 { get; internal set; }
|
||||
|
||||
public Logistics()
|
||||
{
|
||||
DateTime dateTime = DateTime.Now;
|
||||
NullData = null;
|
||||
JobID = Description.GetCellName();
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
MesEntity = DefaultMesEntity(dateTime);
|
||||
ReportFullPath = string.Empty;
|
||||
ProcessJobID = nameof(ProcessJobID);
|
||||
MID = nameof(MID);
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
|
||||
public object NullData { get; private set; }
|
||||
public string JobID { get; private set; } //CellName
|
||||
public long Sequence { get; private set; } //Ticks
|
||||
public DateTime DateTimeFromSequence { get; private set; }
|
||||
public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; }
|
||||
public string MesEntity { get; private set; } //SPC
|
||||
public string ReportFullPath { get; private set; } //Extract file
|
||||
public string ProcessJobID { get; internal set; } //Reactor (duplicate but I want it in the logistics)
|
||||
public string MID { get; internal set; } //Lot & Pocket || Lot
|
||||
public List<string> Tags { get; internal set; }
|
||||
public List<string> Logistics1 { get; internal set; }
|
||||
public List<Logistics2> Logistics2 { get; internal set; }
|
||||
|
||||
public Logistics()
|
||||
public Logistics(object nullData, Dictionary<string, string> cellNames, Dictionary<string, string> mesEntities, FileInfo fileInfo, bool useSplitForMID, int? fileInfoLength = null)
|
||||
{
|
||||
NullData = nullData;
|
||||
string mesEntity = string.Empty;
|
||||
string jobID = Description.GetCellName();
|
||||
DateTime dateTime = fileInfo.LastWriteTime;
|
||||
if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value)
|
||||
dateTime = dateTime.AddTicks(-1);
|
||||
if (string.IsNullOrEmpty(jobID))
|
||||
{
|
||||
if (cellNames.Count == 1)
|
||||
jobID = cellNames.ElementAt(0).Key;
|
||||
else
|
||||
{
|
||||
string reportFullPathLower = fileInfo.FullName.ToLower();
|
||||
foreach (KeyValuePair<string, string> element in cellNames)
|
||||
{
|
||||
if (reportFullPathLower.Contains(element.Key) || reportFullPathLower.Contains(element.Value))
|
||||
{
|
||||
jobID = element.Key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(jobID))
|
||||
throw new Exception();
|
||||
if (mesEntities.ContainsKey(jobID))
|
||||
mesEntity = mesEntities[jobID];
|
||||
else if (mesEntities.Count == 1)
|
||||
mesEntity = mesEntities.ElementAt(0).Value;
|
||||
//
|
||||
if (string.IsNullOrEmpty(mesEntity))
|
||||
throw new Exception();
|
||||
JobID = jobID;
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
MesEntity = mesEntity;
|
||||
ReportFullPath = fileInfo.FullName;
|
||||
ProcessJobID = nameof(ProcessJobID);
|
||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
|
||||
if (useSplitForMID)
|
||||
{
|
||||
if (fileNameWithoutExtension.IndexOf(".") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim();
|
||||
if (fileNameWithoutExtension.IndexOf("_") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim();
|
||||
if (fileNameWithoutExtension.IndexOf("-") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim();
|
||||
}
|
||||
MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower());
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
|
||||
public Logistics(string reportFullPath, string logistics)
|
||||
{
|
||||
string key;
|
||||
DateTime dateTime;
|
||||
string[] segments;
|
||||
Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||
if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1"))
|
||||
{
|
||||
DateTime dateTime = DateTime.Now;
|
||||
NullData = null;
|
||||
JobID = Description.GetCellName();
|
||||
JobID = "null";
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
MesEntity = DefaultMesEntity(dateTime);
|
||||
ReportFullPath = string.Empty;
|
||||
ProcessJobID = nameof(ProcessJobID);
|
||||
MID = nameof(MID);
|
||||
ReportFullPath = reportFullPath;
|
||||
ProcessJobID = "R##";
|
||||
MID = "null";
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
|
||||
public Logistics(object nullData, Dictionary<string, string> cellNames, Dictionary<string, string> mesEntities, FileInfo fileInfo, bool useSplitForMID, int? fileInfoLength = null)
|
||||
else
|
||||
{
|
||||
NullData = nullData;
|
||||
string mesEntity = string.Empty;
|
||||
string jobID = Description.GetCellName();
|
||||
DateTime dateTime = fileInfo.LastWriteTime;
|
||||
if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value)
|
||||
dateTime = dateTime.AddTicks(-1);
|
||||
if (string.IsNullOrEmpty(jobID))
|
||||
string logistics1Line1 = Logistics1[0];
|
||||
key = "NULL_DATA=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
NullData = null;
|
||||
else
|
||||
{
|
||||
if (cellNames.Count == 1)
|
||||
jobID = cellNames.ElementAt(0).Key;
|
||||
else
|
||||
{
|
||||
string reportFullPathLower = fileInfo.FullName.ToLower();
|
||||
foreach (var element in cellNames)
|
||||
{
|
||||
if (reportFullPathLower.Contains(element.Key) || reportFullPathLower.Contains(element.Value))
|
||||
{
|
||||
jobID = element.Key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
NullData = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "JOBID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
JobID = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
JobID = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "SEQUENCE=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks)
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
else
|
||||
dateTime = new DateTime(sequence);
|
||||
}
|
||||
if (string.IsNullOrEmpty(jobID))
|
||||
throw new Exception();
|
||||
if (mesEntities.ContainsKey(jobID))
|
||||
mesEntity = mesEntities[jobID];
|
||||
else if (mesEntities.Count == 1)
|
||||
mesEntity = mesEntities.ElementAt(0).Value;
|
||||
//
|
||||
if (string.IsNullOrEmpty(mesEntity))
|
||||
throw new Exception();
|
||||
JobID = jobID;
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
MesEntity = mesEntity;
|
||||
ReportFullPath = fileInfo.FullName;
|
||||
ProcessJobID = nameof(ProcessJobID);
|
||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
|
||||
if (useSplitForMID)
|
||||
DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
if (TotalSecondsSinceLastWriteTimeFromSequence > 600)
|
||||
{
|
||||
if (fileNameWithoutExtension.IndexOf(".") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim();
|
||||
if (fileNameWithoutExtension.IndexOf("_") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim();
|
||||
if (fileNameWithoutExtension.IndexOf("-") > -1)
|
||||
fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim();
|
||||
if (lastWriteTime != dateTime)
|
||||
try
|
||||
{ File.SetLastWriteTime(reportFullPath, dateTime); }
|
||||
catch (Exception) { }
|
||||
}
|
||||
MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower());
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
|
||||
public Logistics(string reportFullPath, string logistics)
|
||||
{
|
||||
string key;
|
||||
DateTime dateTime;
|
||||
string[] segments;
|
||||
Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||
if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1"))
|
||||
{
|
||||
NullData = null;
|
||||
JobID = "null";
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
key = "MES_ENTITY=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
MesEntity = DefaultMesEntity(dateTime);
|
||||
ReportFullPath = reportFullPath;
|
||||
ProcessJobID = "R##";
|
||||
MID = "null";
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
else
|
||||
{
|
||||
string logistics1Line1 = Logistics1[0];
|
||||
key = "NULL_DATA=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
NullData = null;
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
NullData = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "JOBID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
JobID = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
JobID = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "SEQUENCE=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks)
|
||||
dateTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
else
|
||||
dateTime = new DateTime(sequence);
|
||||
}
|
||||
Sequence = dateTime.Ticks;
|
||||
DateTimeFromSequence = dateTime;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
|
||||
DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime;
|
||||
if (TotalSecondsSinceLastWriteTimeFromSequence > 600)
|
||||
{
|
||||
if (lastWriteTime != dateTime)
|
||||
try
|
||||
{ File.SetLastWriteTime(reportFullPath, dateTime); }
|
||||
catch (Exception) { }
|
||||
}
|
||||
key = "MES_ENTITY=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
MesEntity = DefaultMesEntity(dateTime);
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MesEntity = segments[1].Split(';')[0];
|
||||
}
|
||||
ReportFullPath = reportFullPath;
|
||||
key = "PROCESS_JOBID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
ProcessJobID = "R##";
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
ProcessJobID = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "MID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
MID = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MID = segments[1].Split(';')[0];
|
||||
}
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MesEntity = segments[1].Split(';')[0];
|
||||
}
|
||||
Logistics2 logistics2;
|
||||
Tags = new List<string>();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
for (int i = 1; i < Logistics1.Count(); i++)
|
||||
ReportFullPath = reportFullPath;
|
||||
key = "PROCESS_JOBID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
ProcessJobID = "R##";
|
||||
else
|
||||
{
|
||||
if (Logistics1[i].StartsWith("LOGISTICS_2"))
|
||||
{
|
||||
logistics2 = new Logistics2(Logistics1[i]);
|
||||
Logistics2.Add(logistics2);
|
||||
}
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
ProcessJobID = segments[1].Split(';')[0];
|
||||
}
|
||||
for (int i = Logistics1.Count() - 1; i > -1; i--)
|
||||
key = "MID=";
|
||||
if (!logistics1Line1.Contains(key))
|
||||
MID = "null";
|
||||
else
|
||||
{
|
||||
if (Logistics1[i].StartsWith("LOGISTICS_2"))
|
||||
Logistics1.RemoveAt(i);
|
||||
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MID = segments[1].Split(';')[0];
|
||||
}
|
||||
}
|
||||
|
||||
public Logistics ShallowCopy()
|
||||
Logistics2 logistics2;
|
||||
Tags = new List<string>();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
for (int i = 1; i < Logistics1.Count(); i++)
|
||||
{
|
||||
return (Logistics)MemberwiseClone();
|
||||
if (Logistics1[i].StartsWith("LOGISTICS_2"))
|
||||
{
|
||||
logistics2 = new Logistics2(Logistics1[i]);
|
||||
Logistics2.Add(logistics2);
|
||||
}
|
||||
}
|
||||
|
||||
private string DefaultMesEntity(DateTime dateTime)
|
||||
for (int i = Logistics1.Count() - 1; i > -1; i--)
|
||||
{
|
||||
return string.Concat(dateTime.Ticks, "_MES_ENTITY");
|
||||
}
|
||||
|
||||
internal string GetLotViaMostCommonMethod()
|
||||
{
|
||||
return MID.Substring(0, MID.Length - 2);
|
||||
}
|
||||
|
||||
internal string GetPocketNumberViaMostCommonMethod()
|
||||
{
|
||||
return MID.Substring(MID.Length - 2);
|
||||
}
|
||||
|
||||
internal void Update(string dateTime, string processJobID, string mid)
|
||||
{
|
||||
if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted))
|
||||
dateTimeCasted = DateTime.Now;
|
||||
NullData = null;
|
||||
//JobID = Description.GetCellName();
|
||||
Sequence = dateTimeCasted.Ticks;
|
||||
DateTimeFromSequence = dateTimeCasted;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds;
|
||||
//MesEntity = DefaultMesEntity(dateTime);
|
||||
//ReportFullPath = string.Empty;
|
||||
ProcessJobID = processJobID;
|
||||
MID = mid;
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
if (Logistics1[i].StartsWith("LOGISTICS_2"))
|
||||
Logistics1.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public Logistics ShallowCopy() => (Logistics)MemberwiseClone();
|
||||
|
||||
private string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY");
|
||||
|
||||
internal string GetLotViaMostCommonMethod() => MID.Substring(0, MID.Length - 2);
|
||||
|
||||
internal string GetPocketNumberViaMostCommonMethod() => MID.Substring(MID.Length - 2);
|
||||
|
||||
internal void Update(string dateTime, string processJobID, string mid)
|
||||
{
|
||||
if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted))
|
||||
dateTimeCasted = DateTime.Now;
|
||||
NullData = null;
|
||||
//JobID = Description.GetCellName();
|
||||
Sequence = dateTimeCasted.Ticks;
|
||||
DateTimeFromSequence = dateTimeCasted;
|
||||
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds;
|
||||
//MesEntity = DefaultMesEntity(dateTime);
|
||||
//ReportFullPath = string.Empty;
|
||||
ProcessJobID = processJobID;
|
||||
MID = mid;
|
||||
Tags = new List<string>();
|
||||
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
|
||||
Logistics2 = new List<Logistics2>();
|
||||
}
|
||||
}
|
||||
|
@ -1,80 +1,78 @@
|
||||
using System;
|
||||
|
||||
namespace Shared
|
||||
namespace Shared;
|
||||
|
||||
public class Logistics2
|
||||
{
|
||||
public class Logistics2
|
||||
|
||||
public string MID { get; private set; }
|
||||
public string RunNumber { get; private set; }
|
||||
public string SatelliteGroup { get; private set; }
|
||||
public string PartNumber { get; private set; }
|
||||
public string PocketNumber { get; private set; }
|
||||
public string WaferLot { get; private set; }
|
||||
public string Recipe { get; private set; }
|
||||
|
||||
public Logistics2(string logistics2)
|
||||
{
|
||||
|
||||
public string MID { get; private set; }
|
||||
public string RunNumber { get; private set; }
|
||||
public string SatelliteGroup { get; private set; }
|
||||
public string PartNumber { get; private set; }
|
||||
public string PocketNumber { get; private set; }
|
||||
public string WaferLot { get; private set; }
|
||||
public string Recipe { get; private set; }
|
||||
|
||||
public Logistics2(string logistics2)
|
||||
string key;
|
||||
string[] segments;
|
||||
key = "JOBID=";
|
||||
if (!logistics2.Contains(key))
|
||||
MID = "null";
|
||||
else
|
||||
{
|
||||
string key;
|
||||
string[] segments;
|
||||
key = "JOBID=";
|
||||
if (!logistics2.Contains(key))
|
||||
MID = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MID = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "MID=";
|
||||
if (!logistics2.Contains(key))
|
||||
RunNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
RunNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "INFO=";
|
||||
if (!logistics2.Contains(key))
|
||||
SatelliteGroup = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
SatelliteGroup = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "PRODUCT=";
|
||||
if (!logistics2.Contains(key))
|
||||
PartNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
PartNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "CHAMBER=";
|
||||
if (!logistics2.Contains(key))
|
||||
PocketNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
PocketNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "WAFER_ID=";
|
||||
if (!logistics2.Contains(key))
|
||||
WaferLot = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
WaferLot = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "PPID=";
|
||||
if (!logistics2.Contains(key))
|
||||
Recipe = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
Recipe = segments[1].Split(';')[0];
|
||||
}
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
MID = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "MID=";
|
||||
if (!logistics2.Contains(key))
|
||||
RunNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
RunNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "INFO=";
|
||||
if (!logistics2.Contains(key))
|
||||
SatelliteGroup = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
SatelliteGroup = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "PRODUCT=";
|
||||
if (!logistics2.Contains(key))
|
||||
PartNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
PartNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "CHAMBER=";
|
||||
if (!logistics2.Contains(key))
|
||||
PocketNumber = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
PocketNumber = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "WAFER_ID=";
|
||||
if (!logistics2.Contains(key))
|
||||
WaferLot = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
WaferLot = segments[1].Split(';')[0];
|
||||
}
|
||||
key = "PPID=";
|
||||
if (!logistics2.Contains(key))
|
||||
Recipe = "null";
|
||||
else
|
||||
{
|
||||
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
|
||||
Recipe = segments[1].Split(';')[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -7,404 +7,380 @@ using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class ConfigDataBase
|
||||
{
|
||||
|
||||
public class ConfigDataBase
|
||||
public bool UseCyclicalForDescription { get; protected set; }
|
||||
public Dictionary<string, string> CellNames { get; protected set; }
|
||||
public Dictionary<string, string> MesEntities { get; protected set; }
|
||||
public IProcessDataDescription ProcessDataDescription { get; protected set; }
|
||||
|
||||
public bool IsEvent { get; private set; }
|
||||
public EventName EventName => _EventName;
|
||||
public bool EafHosted { get; private set; }
|
||||
public string CellName { get; private set; }
|
||||
public bool IsSourceTimer { get; private set; }
|
||||
public EquipmentType EquipmentType => _EquipmentType;
|
||||
public string EquipmentElementName { get; private set; }
|
||||
public bool IsDatabaseExportToIPDSF { get; private set; }
|
||||
public EquipmentType? EquipmentConnection => _EquipmentConnection;
|
||||
public FileConnectorConfiguration FileConnectorConfiguration { get; private set; }
|
||||
|
||||
protected readonly EventName _EventName;
|
||||
protected readonly EquipmentType _EquipmentType;
|
||||
protected readonly EquipmentType? _EquipmentConnection;
|
||||
protected readonly Dictionary<string, string> _Reactors;
|
||||
|
||||
public ConfigDataBase(string cellName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, bool isEAFHosted)
|
||||
{
|
||||
|
||||
public bool UseCyclicalForDescription { get; protected set; }
|
||||
public Dictionary<string, string> CellNames { get; protected set; }
|
||||
public Dictionary<string, string> MesEntities { get; protected set; }
|
||||
public IProcessDataDescription ProcessDataDescription { get; protected set; }
|
||||
|
||||
public bool IsEvent { get; private set; }
|
||||
public EventName EventName => _EventName;
|
||||
public bool EafHosted { get; private set; }
|
||||
public string CellName { get; private set; }
|
||||
public bool IsSourceTimer { get; private set; }
|
||||
public EquipmentType EquipmentType => _EquipmentType;
|
||||
public string EquipmentElementName { get; private set; }
|
||||
public bool IsDatabaseExportToIPDSF { get; private set; }
|
||||
public EquipmentType? EquipmentConnection => _EquipmentConnection;
|
||||
public FileConnectorConfiguration FileConnectorConfiguration { get; private set; }
|
||||
|
||||
protected readonly EventName _EventName;
|
||||
protected readonly EquipmentType _EquipmentType;
|
||||
protected readonly EquipmentType? _EquipmentConnection;
|
||||
protected readonly Dictionary<string, string> _Reactors;
|
||||
|
||||
public ConfigDataBase(string cellName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, bool isEAFHosted)
|
||||
CellName = cellName;
|
||||
EafHosted = isEAFHosted;
|
||||
EquipmentType equipmentTypeValue;
|
||||
_Reactors = new Dictionary<string, string>();
|
||||
CellNames = new Dictionary<string, string>();
|
||||
MesEntities = new Dictionary<string, string>();
|
||||
EquipmentElementName = cellInstanceConnectionName;
|
||||
FileConnectorConfiguration = fileConnectorConfiguration;
|
||||
string[] segments = parameterizedModelObjectDefinitionType.Split('.');
|
||||
IsSourceTimer = (fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt"));
|
||||
string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty);
|
||||
IsDatabaseExportToIPDSF = (fileConnectorConfiguration.SourceFileLocation.Contains("DatabaseExport"));
|
||||
if (!Enum.TryParse(segments[segments.Length - 1], out EventName eventNameValue))
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
if (!Enum.TryParse(cellInstanceConnectionNameBase, out equipmentTypeValue))
|
||||
_EquipmentConnection = null;
|
||||
else
|
||||
_EquipmentConnection = equipmentTypeValue;
|
||||
string suffix = eventNameValue switch
|
||||
{
|
||||
CellName = cellName;
|
||||
EafHosted = isEAFHosted;
|
||||
EquipmentType equipmentTypeValue;
|
||||
_Reactors = new Dictionary<string, string>();
|
||||
CellNames = new Dictionary<string, string>();
|
||||
MesEntities = new Dictionary<string, string>();
|
||||
EquipmentElementName = cellInstanceConnectionName;
|
||||
FileConnectorConfiguration = fileConnectorConfiguration;
|
||||
string[] segments = parameterizedModelObjectDefinitionType.Split('.');
|
||||
IsSourceTimer = (fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt"));
|
||||
string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty);
|
||||
IsDatabaseExportToIPDSF = (fileConnectorConfiguration.SourceFileLocation.Contains("DatabaseExport"));
|
||||
if (!Enum.TryParse(segments[segments.Length - 1], out EventName eventNameValue))
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
if (!Enum.TryParse(cellInstanceConnectionNameBase, out equipmentTypeValue))
|
||||
_EquipmentConnection = null;
|
||||
else
|
||||
_EquipmentConnection = equipmentTypeValue;
|
||||
string suffix;
|
||||
switch (eventNameValue)
|
||||
{
|
||||
case EventName.FileRead:
|
||||
suffix = string.Empty;
|
||||
break;
|
||||
case EventName.FileReadDaily:
|
||||
suffix = "_Daily";
|
||||
break;
|
||||
case EventName.FileReadWeekly:
|
||||
suffix = "_Weekly";
|
||||
break;
|
||||
case EventName.FileReadMonthly:
|
||||
suffix = "_Monthly";
|
||||
break;
|
||||
case EventName.FileReadVerification:
|
||||
suffix = "_Verification";
|
||||
break;
|
||||
default:
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
}
|
||||
string parameterizedModelObjectDefinitionTypeAppended = string.Concat(segments[0], suffix);
|
||||
IsEvent = cellInstanceConnectionNameBase != parameterizedModelObjectDefinitionTypeAppended;
|
||||
_EventName = eventNameValue;
|
||||
if (!Enum.TryParse(parameterizedModelObjectDefinitionTypeAppended, out equipmentTypeValue))
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
_EquipmentType = equipmentTypeValue;
|
||||
if (!isEAFHosted && equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended)
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
}
|
||||
|
||||
public string GetEventName()
|
||||
{
|
||||
string result = EventName.ToString();
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetEquipmentType()
|
||||
{
|
||||
string result = EquipmentConnection.ToString();
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetEventDescription()
|
||||
{
|
||||
string result = ProcessDataDescription.GetEventDescription();
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDefault(ILogic logic)
|
||||
{
|
||||
IProcessDataDescription result = ProcessDataDescription.GetDefault(logic, this);
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDisplayNames(ILogic logic)
|
||||
{
|
||||
IProcessDataDescription result = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<string> GetDetailNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetDetailNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetHeaderNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetHeaderNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetPairedParameterNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetPairedParameterNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetParameterNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetParameterNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetDescription(ILogic logic, List<Test> tests, IProcessData iProcessData)
|
||||
{
|
||||
List<IProcessDataDescription> results = ProcessDataDescription.GetDescription(logic, this, tests, iProcessData);
|
||||
return results;
|
||||
}
|
||||
|
||||
public string GetCurrentReactor(ILogic logic)
|
||||
{
|
||||
string result = string.Empty;
|
||||
foreach (KeyValuePair<string, string> keyValuePair in _Reactors)
|
||||
{
|
||||
foreach (string filePrefix in keyValuePair.Value.Split('|'))
|
||||
{
|
||||
if (logic.Logistics.MID.StartsWith(filePrefix) || (EventName != EventName.FileRead && MesEntities.ContainsKey(logic.Logistics.JobID) && keyValuePair.Value == MesEntities[logic.Logistics.JobID]))
|
||||
{
|
||||
result = keyValuePair.Key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(result) && _Reactors.Count == 1)
|
||||
result = _Reactors.ElementAt(0).Key;
|
||||
return result;
|
||||
}
|
||||
|
||||
protected JsonElement GetDefaultJsonElement(ILogic logic)
|
||||
{
|
||||
JsonElement result;
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDefault(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
result = (JsonElement)@object;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Dictionary<string, List<Tuple<Enum, string, string, object>>> GetParameterInfo(ILogic logic, bool allowNull)
|
||||
{
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> results = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
|
||||
string description;
|
||||
Enum param;
|
||||
Tuple<Enum, string, string, object> tuple;
|
||||
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
|
||||
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
|
||||
foreach (JsonProperty jsonProperty in defaultJsonElement.EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
|
||||
throw new Exception();
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
description = string.Empty;
|
||||
param = Description.Param.StructuredType;
|
||||
//jValue = jObject.Value<JValue>("Item1");
|
||||
throw new NotImplementedException("Item1");
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (jsonProperty.Value.ValueKind)
|
||||
{
|
||||
case JsonValueKind.String:
|
||||
param = Description.Param.String;
|
||||
break;
|
||||
case JsonValueKind.Number:
|
||||
param = Description.Param.Double;
|
||||
break;
|
||||
case JsonValueKind.True:
|
||||
case JsonValueKind.False:
|
||||
param = Description.Param.Boolean;
|
||||
break;
|
||||
case JsonValueKind.Null:
|
||||
param = Description.Param.String;
|
||||
break;
|
||||
default:
|
||||
param = Description.Param.StructuredType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!keyValuePairs.ContainsKey(jsonProperty.Name))
|
||||
description = string.Empty;
|
||||
else
|
||||
description = keyValuePairs[jsonProperty.Name];
|
||||
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, description, jsonProperty.Value.ToString());
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
|
||||
results[jsonProperty.Name].Add(tuple);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
protected void WriteExportAliases(ILogic logic, string cellName, string equipmentElementName)
|
||||
{
|
||||
int i = 0;
|
||||
Enum param;
|
||||
object value;
|
||||
Enum[] @params;
|
||||
string description;
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
string shareRoot = @"\\messv02ecc1.ec.local\EC_EDA";
|
||||
string shareDirectory = string.Concat(shareRoot, @"\Staging\Pdsf\", cellName, @"\ExportAliases\", equipmentElementName);
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairs;
|
||||
if (!(logic is null))
|
||||
keyValuePairs = GetParameterInfo(logic, allowNull: false);
|
||||
else
|
||||
keyValuePairs = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
|
||||
stringBuilder.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\"");
|
||||
if (!Directory.Exists(shareRoot))
|
||||
return;
|
||||
if (!Directory.Exists(shareDirectory))
|
||||
Directory.CreateDirectory(shareDirectory);
|
||||
string shareFile = string.Concat(shareDirectory, @"\", DateTime.Now.Ticks, ".csv");
|
||||
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairs)
|
||||
{
|
||||
i += 1;
|
||||
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
|
||||
if (@params.Length != 1)
|
||||
throw new Exception();
|
||||
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
|
||||
throw new Exception();
|
||||
param = @params[0];
|
||||
if (!(param is Description.Param.String))
|
||||
stringBuilder.AppendLine($"\"{keyValuePair.Key}\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{keyValuePair.Key}\";\"\";\"{cellName}/{EquipmentElementName}/{EventName}\";\"\";\"True\"");
|
||||
else
|
||||
{
|
||||
description = keyValuePair.Value[0].Item3.Split('|')[0];
|
||||
if (string.IsNullOrEmpty(description))
|
||||
continue;
|
||||
value = keyValuePair.Value[0].Item4;
|
||||
stringBuilder.AppendLine($"\"'{description}'\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{value}\";\"\";\"{cellName}/{EquipmentElementName}/{EventName}\";\"\";\"True\"");
|
||||
}
|
||||
}
|
||||
if (keyValuePairs.Any())
|
||||
File.WriteAllText(shareFile, stringBuilder.ToString());
|
||||
}
|
||||
|
||||
public Dictionary<string, string> GetDisplayNamesJsonElement(ILogic logic)
|
||||
{
|
||||
Dictionary<string, string> results = new Dictionary<string, string>();
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
{
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, string.Empty);
|
||||
if (jsonProperty.Value is JsonElement jsonPropertyValue)
|
||||
results[jsonProperty.Name] = jsonPropertyValue.ToString();
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetIgnoreParameterNames(ILogic logic, Test test, bool includePairedParameterNames)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetIgnoreParameterNames(logic, this, test);
|
||||
if (includePairedParameterNames)
|
||||
{
|
||||
string value;
|
||||
List<string> pairedParameterNames = ProcessDataDescription.GetPairedParameterNames(logic, this);
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
if (!(@object is JsonElement jsonElement))
|
||||
throw new Exception();
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
value = jsonProperty.Value.ToString();
|
||||
if (!results.Contains(jsonProperty.Name) && pairedParameterNames.Contains(jsonProperty.Name) && (string.IsNullOrEmpty(value) || value[0] == '|'))
|
||||
results.Add(jsonProperty.Name);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<Duplicator.Description> GetProcessDataDescriptions(JsonElement jsonElement)
|
||||
{
|
||||
List<Duplicator.Description> results;
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
|
||||
results = JsonSerializer.Deserialize<List<Duplicator.Description>>(jsonElement.ToString(), jsonSerializerOptions);
|
||||
return results;
|
||||
}
|
||||
|
||||
public Dictionary<Test, List<Duplicator.Description>> GetKeyValuePairs(List<Duplicator.Description> processDataDescriptions)
|
||||
{
|
||||
Dictionary<Test, List<Duplicator.Description>> results = new Dictionary<Test, List<Duplicator.Description>>();
|
||||
Test testKey;
|
||||
for (int i = 0; i < processDataDescriptions.Count; i++)
|
||||
{
|
||||
testKey = (Test)processDataDescriptions[i].Test;
|
||||
if (!results.ContainsKey(testKey))
|
||||
results.Add(testKey, new List<Duplicator.Description>());
|
||||
results[testKey].Add(processDataDescriptions[i]);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public Dictionary<string, List<string>> GetKeyValuePairs(JsonElement jsonElement, List<Duplicator.Description> processDataDescriptions, Test test)
|
||||
{
|
||||
Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
|
||||
Test testKey;
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
if (processDataDescriptions.Count != jsonElements.Length)
|
||||
throw new Exception();
|
||||
for (int i = 0; i < processDataDescriptions.Count; i++)
|
||||
{
|
||||
testKey = (Test)processDataDescriptions[i].Test;
|
||||
if (testKey != test)
|
||||
continue;
|
||||
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, new List<string>());
|
||||
results[jsonProperty.Name].Add(jsonProperty.Value.ToString());
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
protected void VerifyProcessDataDescription(ILogic logic)
|
||||
{
|
||||
string description;
|
||||
bool allowNull = false;
|
||||
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
|
||||
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
|
||||
JsonProperty[] jsonProperties = defaultJsonElement.EnumerateObject().ToArray();
|
||||
foreach (JsonProperty jsonProperty in jsonProperties)
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
|
||||
throw new Exception();
|
||||
if (!(jsonProperty.Value.ValueKind is JsonValueKind.String) || !keyValuePairs.ContainsKey(jsonProperty.Name))
|
||||
description = string.Empty;
|
||||
else
|
||||
description = keyValuePairs[jsonProperty.Name].Split('|')[0];
|
||||
}
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetIProcessDataDescriptions(JsonElement jsonElement)
|
||||
{
|
||||
List<IProcessDataDescription> results = new List<IProcessDataDescription>();
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
object @object;
|
||||
Type type = ProcessDataDescription.GetType();
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
|
||||
for (int i = 0; i < jsonElements.Length; i++)
|
||||
{
|
||||
@object = JsonSerializer.Deserialize(jsonElements[i].ToString(), type, jsonSerializerOptions);
|
||||
if (!(@object is IProcessDataDescription processDataDescription))
|
||||
continue;
|
||||
results.Add(processDataDescription);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
EventName.FileRead => string.Empty,
|
||||
EventName.FileReadDaily => "_Daily",
|
||||
EventName.FileReadWeekly => "_Weekly",
|
||||
EventName.FileReadMonthly => "_Monthly",
|
||||
EventName.FileReadVerification => "_Verification",
|
||||
_ => throw new Exception(cellInstanceConnectionName),
|
||||
};
|
||||
string parameterizedModelObjectDefinitionTypeAppended = string.Concat(segments[0], suffix);
|
||||
IsEvent = cellInstanceConnectionNameBase != parameterizedModelObjectDefinitionTypeAppended;
|
||||
_EventName = eventNameValue;
|
||||
if (!Enum.TryParse(parameterizedModelObjectDefinitionTypeAppended, out equipmentTypeValue))
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
_EquipmentType = equipmentTypeValue;
|
||||
if (!isEAFHosted && equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended)
|
||||
throw new Exception(cellInstanceConnectionName);
|
||||
}
|
||||
|
||||
}
|
||||
public string GetEventName()
|
||||
{
|
||||
string result = EventName.ToString();
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetEquipmentType()
|
||||
{
|
||||
string result = EquipmentConnection.ToString();
|
||||
return result;
|
||||
}
|
||||
|
||||
public string GetEventDescription()
|
||||
{
|
||||
string result = ProcessDataDescription.GetEventDescription();
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDefault(ILogic logic)
|
||||
{
|
||||
IProcessDataDescription result = ProcessDataDescription.GetDefault(logic, this);
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDisplayNames(ILogic logic)
|
||||
{
|
||||
IProcessDataDescription result = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<string> GetDetailNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetDetailNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetHeaderNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetHeaderNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetPairedParameterNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetPairedParameterNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetParameterNames(ILogic logic)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetParameterNames(logic, this);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetDescription(ILogic logic, List<Test> tests, IProcessData iProcessData)
|
||||
{
|
||||
List<IProcessDataDescription> results = ProcessDataDescription.GetDescription(logic, this, tests, iProcessData);
|
||||
return results;
|
||||
}
|
||||
|
||||
public string GetCurrentReactor(ILogic logic)
|
||||
{
|
||||
string result = string.Empty;
|
||||
foreach (KeyValuePair<string, string> keyValuePair in _Reactors)
|
||||
{
|
||||
foreach (string filePrefix in keyValuePair.Value.Split('|'))
|
||||
{
|
||||
if (logic.Logistics.MID.StartsWith(filePrefix) || (EventName != EventName.FileRead && MesEntities.ContainsKey(logic.Logistics.JobID) && keyValuePair.Value == MesEntities[logic.Logistics.JobID]))
|
||||
{
|
||||
result = keyValuePair.Key;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (string.IsNullOrEmpty(result) && _Reactors.Count == 1)
|
||||
result = _Reactors.ElementAt(0).Key;
|
||||
return result;
|
||||
}
|
||||
|
||||
protected JsonElement GetDefaultJsonElement(ILogic logic)
|
||||
{
|
||||
JsonElement result;
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDefault(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
result = (JsonElement)@object;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Dictionary<string, List<Tuple<Enum, string, string, object>>> GetParameterInfo(ILogic logic, bool allowNull)
|
||||
{
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> results = new();
|
||||
string description;
|
||||
Enum param;
|
||||
Tuple<Enum, string, string, object> tuple;
|
||||
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
|
||||
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
|
||||
foreach (JsonProperty jsonProperty in defaultJsonElement.EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
|
||||
throw new Exception();
|
||||
if (jsonProperty.Value.ValueKind is JsonValueKind.Object or JsonValueKind.Array)
|
||||
{
|
||||
description = string.Empty;
|
||||
param = Description.Param.StructuredType;
|
||||
//jValue = jObject.Value<JValue>("Item1");
|
||||
throw new NotImplementedException("Item1");
|
||||
}
|
||||
else
|
||||
{
|
||||
param = jsonProperty.Value.ValueKind switch
|
||||
{
|
||||
JsonValueKind.String => Description.Param.String,
|
||||
JsonValueKind.Number => Description.Param.Double,
|
||||
JsonValueKind.True or JsonValueKind.False => Description.Param.Boolean,
|
||||
JsonValueKind.Null => Description.Param.String,
|
||||
_ => Description.Param.StructuredType,
|
||||
};
|
||||
}
|
||||
if (!keyValuePairs.ContainsKey(jsonProperty.Name))
|
||||
description = string.Empty;
|
||||
else
|
||||
description = keyValuePairs[jsonProperty.Name];
|
||||
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, description, jsonProperty.Value.ToString());
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
|
||||
results[jsonProperty.Name].Add(tuple);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
protected void WriteExportAliases(ILogic logic, string cellName, string equipmentElementName)
|
||||
{
|
||||
int i = 0;
|
||||
Enum param;
|
||||
object value;
|
||||
Enum[] @params;
|
||||
string description;
|
||||
StringBuilder stringBuilder = new();
|
||||
string shareRoot = @"\\messv02ecc1.ec.local\EC_EDA";
|
||||
string shareDirectory = string.Concat(shareRoot, @"\Staging\Pdsf\", cellName, @"\ExportAliases\", equipmentElementName);
|
||||
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairs;
|
||||
if (logic is not null)
|
||||
keyValuePairs = GetParameterInfo(logic, allowNull: false);
|
||||
else
|
||||
keyValuePairs = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
|
||||
_ = stringBuilder.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\"");
|
||||
if (!Directory.Exists(shareRoot))
|
||||
return;
|
||||
if (!Directory.Exists(shareDirectory))
|
||||
_ = Directory.CreateDirectory(shareDirectory);
|
||||
string shareFile = string.Concat(shareDirectory, @"\", DateTime.Now.Ticks, ".csv");
|
||||
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairs)
|
||||
{
|
||||
i += 1;
|
||||
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
|
||||
if (@params.Length != 1)
|
||||
throw new Exception();
|
||||
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
|
||||
throw new Exception();
|
||||
param = @params[0];
|
||||
if (param is not Description.Param.String)
|
||||
_ = stringBuilder.AppendLine($"\"{keyValuePair.Key}\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{keyValuePair.Key}\";\"\";\"{cellName}/{EquipmentElementName}/{EventName}\";\"\";\"True\"");
|
||||
else
|
||||
{
|
||||
description = keyValuePair.Value[0].Item3.Split('|')[0];
|
||||
if (string.IsNullOrEmpty(description))
|
||||
continue;
|
||||
value = keyValuePair.Value[0].Item4;
|
||||
_ = stringBuilder.AppendLine($"\"'{description}'\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{value}\";\"\";\"{cellName}/{EquipmentElementName}/{EventName}\";\"\";\"True\"");
|
||||
}
|
||||
}
|
||||
if (keyValuePairs.Any())
|
||||
File.WriteAllText(shareFile, stringBuilder.ToString());
|
||||
}
|
||||
|
||||
public Dictionary<string, string> GetDisplayNamesJsonElement(ILogic logic)
|
||||
{
|
||||
Dictionary<string, string> results = new();
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
{
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, string.Empty);
|
||||
if (jsonProperty.Value is JsonElement jsonPropertyValue)
|
||||
results[jsonProperty.Name] = jsonPropertyValue.ToString();
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetIgnoreParameterNames(ILogic logic, Test test, bool includePairedParameterNames)
|
||||
{
|
||||
List<string> results = ProcessDataDescription.GetIgnoreParameterNames(logic, this, test);
|
||||
if (includePairedParameterNames)
|
||||
{
|
||||
string value;
|
||||
List<string> pairedParameterNames = ProcessDataDescription.GetPairedParameterNames(logic, this);
|
||||
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
if (@object is not JsonElement jsonElement)
|
||||
throw new Exception();
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind is JsonValueKind.Object or JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
value = jsonProperty.Value.ToString();
|
||||
if (!results.Contains(jsonProperty.Name) && pairedParameterNames.Contains(jsonProperty.Name) && (string.IsNullOrEmpty(value) || value[0] == '|'))
|
||||
results.Add(jsonProperty.Name);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<Duplicator.Description> GetProcessDataDescriptions(JsonElement jsonElement)
|
||||
{
|
||||
List<Duplicator.Description> results;
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
JsonSerializerOptions jsonSerializerOptions = new()
|
||||
{ NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
|
||||
results = JsonSerializer.Deserialize<List<Duplicator.Description>>(jsonElement.ToString(), jsonSerializerOptions);
|
||||
return results;
|
||||
}
|
||||
|
||||
public Dictionary<Test, List<Duplicator.Description>> GetKeyValuePairs(List<Duplicator.Description> processDataDescriptions)
|
||||
{
|
||||
Dictionary<Test, List<Duplicator.Description>> results = new();
|
||||
Test testKey;
|
||||
for (int i = 0; i < processDataDescriptions.Count; i++)
|
||||
{
|
||||
testKey = (Test)processDataDescriptions[i].Test;
|
||||
if (!results.ContainsKey(testKey))
|
||||
results.Add(testKey, new List<Duplicator.Description>());
|
||||
results[testKey].Add(processDataDescriptions[i]);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public Dictionary<string, List<string>> GetKeyValuePairs(JsonElement jsonElement, List<Duplicator.Description> processDataDescriptions, Test test)
|
||||
{
|
||||
Dictionary<string, List<string>> results = new();
|
||||
Test testKey;
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
if (processDataDescriptions.Count != jsonElements.Length)
|
||||
throw new Exception();
|
||||
for (int i = 0; i < processDataDescriptions.Count; i++)
|
||||
{
|
||||
testKey = (Test)processDataDescriptions[i].Test;
|
||||
if (testKey != test)
|
||||
continue;
|
||||
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind is JsonValueKind.Object or JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
if (!results.ContainsKey(jsonProperty.Name))
|
||||
results.Add(jsonProperty.Name, new List<string>());
|
||||
results[jsonProperty.Name].Add(jsonProperty.Value.ToString());
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
protected void VerifyProcessDataDescription(ILogic logic)
|
||||
{
|
||||
string description;
|
||||
bool allowNull = false;
|
||||
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
|
||||
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
|
||||
JsonProperty[] jsonProperties = defaultJsonElement.EnumerateObject().ToArray();
|
||||
foreach (JsonProperty jsonProperty in jsonProperties)
|
||||
{
|
||||
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
|
||||
throw new Exception();
|
||||
if (jsonProperty.Value.ValueKind is not JsonValueKind.String || !keyValuePairs.ContainsKey(jsonProperty.Name))
|
||||
description = string.Empty;
|
||||
else
|
||||
description = keyValuePairs[jsonProperty.Name].Split('|')[0];
|
||||
}
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetIProcessDataDescriptions(JsonElement jsonElement)
|
||||
{
|
||||
List<IProcessDataDescription> results = new();
|
||||
if (jsonElement.ValueKind != JsonValueKind.Array)
|
||||
throw new Exception();
|
||||
object @object;
|
||||
Type type = ProcessDataDescription.GetType();
|
||||
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
|
||||
JsonSerializerOptions jsonSerializerOptions = new()
|
||||
{ NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
|
||||
for (int i = 0; i < jsonElements.Length; i++)
|
||||
{
|
||||
@object = JsonSerializer.Deserialize(jsonElements[i].ToString(), type, jsonSerializerOptions);
|
||||
if (@object is not IProcessDataDescription processDataDescription)
|
||||
continue;
|
||||
results.Add(processDataDescription);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,13 +1,10 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public enum EventName
|
||||
{
|
||||
|
||||
public enum EventName
|
||||
{
|
||||
FileRead,
|
||||
FileReadDaily,
|
||||
FileReadMonthly,
|
||||
FileReadVerification,
|
||||
FileReadWeekly
|
||||
}
|
||||
|
||||
}
|
||||
FileRead,
|
||||
FileReadDaily,
|
||||
FileReadMonthly,
|
||||
FileReadVerification,
|
||||
FileReadWeekly
|
||||
}
|
||||
|
@ -6,43 +6,40 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public interface ILogic
|
||||
{
|
||||
|
||||
public interface ILogic
|
||||
{
|
||||
ILogic ShallowCopy();
|
||||
Logistics Logistics { get; }
|
||||
|
||||
ILogic ShallowCopy();
|
||||
Logistics Logistics { get; }
|
||||
void ConfigurationRestore();
|
||||
void CreateSelfDescription();
|
||||
void CreateSelfDescription(IEquipmentControl equipment, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration configuration, IList<ModelObjectParameterDefinition> modelObjectParameterDefinitions, EquipmentType? equipmentType, EventName? eventName);
|
||||
bool Extract(string reportFullPath, string eventName);
|
||||
string GetConfigurationErrorTargetFileLocation();
|
||||
string GetConfigurationSourceFileLocation();
|
||||
string GetConfigurationTarget2FileLocation();
|
||||
string GetConfigurationTargetFileLocation();
|
||||
string GetConfigurationTargetFileName();
|
||||
Tuple<string, JsonElement?, List<FileInfo>> GetExtractResult(string reportFullPath, string eventName);
|
||||
object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile);
|
||||
string GetReportFullPath(Dictionary<string, object> keyValuePairs);
|
||||
string GetTarget2FileLocation();
|
||||
void Move(string reportFullPath, Tuple<string, JsonElement?, List<FileInfo>> extractResults, Exception? exception = null);
|
||||
string ReExtract(string searchDirectory, string sourceFileFilter);
|
||||
void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums);
|
||||
ConfigDataBase ReflectionCreateSelfDescriptionV2(string json);
|
||||
string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true);
|
||||
string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
void SetFileParameter(string key, string value);
|
||||
void SetFileParameterLotID(string value, bool includeLogisticsSequence = false);
|
||||
void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true);
|
||||
void SetFileParameterSystemDateTimeToLogisticsSequence();
|
||||
void SetPlaceHolder(string reportFullPath, string key, string value);
|
||||
void SetTarget2FileLocation(string value);
|
||||
|
||||
void ConfigurationRestore();
|
||||
void CreateSelfDescription();
|
||||
void CreateSelfDescription(IEquipmentControl equipment, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration configuration, IList<ModelObjectParameterDefinition> modelObjectParameterDefinitions, EquipmentType? equipmentType, EventName? eventName);
|
||||
bool Extract(string reportFullPath, string eventName);
|
||||
string GetConfigurationErrorTargetFileLocation();
|
||||
string GetConfigurationSourceFileLocation();
|
||||
string GetConfigurationTarget2FileLocation();
|
||||
string GetConfigurationTargetFileLocation();
|
||||
string GetConfigurationTargetFileName();
|
||||
Tuple<string, JsonElement?, List<FileInfo>> GetExtractResult(string reportFullPath, string eventName);
|
||||
object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile);
|
||||
string GetReportFullPath(Dictionary<string, object> keyValuePairs);
|
||||
string GetTarget2FileLocation();
|
||||
void Move(string reportFullPath, Tuple<string, JsonElement?, List<FileInfo>> extractResults, Exception exception = null);
|
||||
string ReExtract(string searchDirectory, string sourceFileFilter);
|
||||
void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums);
|
||||
ConfigDataBase ReflectionCreateSelfDescriptionV2(string json);
|
||||
string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true);
|
||||
string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
|
||||
void SetFileParameter(string key, string value);
|
||||
void SetFileParameterLotID(string value, bool includeLogisticsSequence = false);
|
||||
void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true);
|
||||
void SetFileParameterSystemDateTimeToLogisticsSequence();
|
||||
void SetPlaceHolder(string reportFullPath, string key, string value);
|
||||
void SetTarget2FileLocation(string value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08AFMD3100
|
||||
{
|
||||
|
||||
public class MET08AFMD3100
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
AFMRoughness = Metrology.Test.AFMRoughness
|
||||
}
|
||||
|
||||
AFMRoughness = Metrology.Test.AFMRoughness
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,13 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08BVHGPROBE
|
||||
{
|
||||
|
||||
public class MET08BVHGPROBE
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
BreakdownVoltageCenter = Metrology.Test.BreakdownVoltageCenter,
|
||||
BreakdownVoltageEdge = Metrology.Test.BreakdownVoltageEdge,
|
||||
BreakdownVoltageMiddle8in = Metrology.Test.BreakdownVoltageMiddle8in
|
||||
}
|
||||
|
||||
BreakdownVoltageCenter = Metrology.Test.BreakdownVoltageCenter,
|
||||
BreakdownVoltageEdge = Metrology.Test.BreakdownVoltageEdge,
|
||||
BreakdownVoltageMiddle8in = Metrology.Test.BreakdownVoltageMiddle8in
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,13 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08CVHGPROBE802B150
|
||||
{
|
||||
|
||||
public class MET08CVHGPROBE802B150
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
CV = Metrology.Test.CV,
|
||||
MonthlyCV = Metrology.Test.MonthlyCV,
|
||||
WeeklyCV = Metrology.Test.WeeklyCV
|
||||
}
|
||||
|
||||
CV = Metrology.Test.CV,
|
||||
MonthlyCV = Metrology.Test.MonthlyCV,
|
||||
WeeklyCV = Metrology.Test.WeeklyCV
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +1,15 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08DDINCAN8620
|
||||
{
|
||||
|
||||
public class MET08DDINCAN8620
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
CandelaKlarfDC = Metrology.Test.CandelaKlarfDC,
|
||||
CandelaLaser = Metrology.Test.CandelaLaser,
|
||||
CandelaVerify = Metrology.Test.CandelaVerify,
|
||||
CandelaPSL = Metrology.Test.CandelaPSL,
|
||||
CandelaProdU = Metrology.Test.CandelaProdU
|
||||
}
|
||||
|
||||
CandelaKlarfDC = Metrology.Test.CandelaKlarfDC,
|
||||
CandelaLaser = Metrology.Test.CandelaLaser,
|
||||
CandelaVerify = Metrology.Test.CandelaVerify,
|
||||
CandelaPSL = Metrology.Test.CandelaPSL,
|
||||
CandelaProdU = Metrology.Test.CandelaProdU
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08DDUPSFS6420
|
||||
{
|
||||
|
||||
public class MET08DDUPSFS6420
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Tencor = Metrology.Test.Tencor
|
||||
}
|
||||
|
||||
Tencor = Metrology.Test.Tencor
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08DDUPSP1TBI
|
||||
{
|
||||
|
||||
public class MET08DDUPSP1TBI
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
SP1 = Metrology.Test.SP1
|
||||
}
|
||||
|
||||
SP1 = Metrology.Test.SP1
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08EBEAMINTEGRITY26
|
||||
{
|
||||
|
||||
public class MET08EBEAMINTEGRITY26
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Denton = Metrology.Test.Denton
|
||||
}
|
||||
|
||||
Denton = Metrology.Test.Denton
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,13 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08HALLHL5580
|
||||
{
|
||||
|
||||
public class MET08HALLHL5580
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Hall = Metrology.Test.Hall,
|
||||
MonthlyHall = Metrology.Test.MonthlyHall,
|
||||
WeeklyHall = Metrology.Test.WeeklyHall
|
||||
}
|
||||
|
||||
Hall = Metrology.Test.Hall,
|
||||
MonthlyHall = Metrology.Test.MonthlyHall,
|
||||
WeeklyHall = Metrology.Test.WeeklyHall
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08MESMICROSCOPE
|
||||
{
|
||||
|
||||
public class MET08MESMICROSCOPE
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Microscope = Metrology.Test.Microscope
|
||||
}
|
||||
|
||||
Microscope = Metrology.Test.Microscope
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,12 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08NDFRESIMAP151C
|
||||
{
|
||||
|
||||
public class MET08NDFRESIMAP151C
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Lehighton = Metrology.Test.Lehighton,
|
||||
VerificationLehighton = Metrology.Test.VerificationLehighton
|
||||
}
|
||||
|
||||
Lehighton = Metrology.Test.Lehighton,
|
||||
VerificationLehighton = Metrology.Test.VerificationLehighton
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,20 +1,17 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08PLMAPRPM
|
||||
{
|
||||
|
||||
public class MET08PLMAPRPM
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
RPMXY = Metrology.Test.RPMXY,
|
||||
RPMAverage = Metrology.Test.RPMAverage,
|
||||
RPMPLRatio = Metrology.Test.RPMPLRatio,
|
||||
DailyRPMXY = Metrology.Test.DailyRPMXY,
|
||||
DailyRPMAverage = Metrology.Test.DailyRPMAverage,
|
||||
DailyRPMPLRatio = Metrology.Test.DailyRPMPLRatio,
|
||||
VerificationRPM = Metrology.Test.VerificationRPM
|
||||
}
|
||||
|
||||
RPMXY = Metrology.Test.RPMXY,
|
||||
RPMAverage = Metrology.Test.RPMAverage,
|
||||
RPMPLRatio = Metrology.Test.RPMPLRatio,
|
||||
DailyRPMXY = Metrology.Test.DailyRPMXY,
|
||||
DailyRPMAverage = Metrology.Test.DailyRPMAverage,
|
||||
DailyRPMPLRatio = Metrology.Test.DailyRPMPLRatio,
|
||||
VerificationRPM = Metrology.Test.VerificationRPM
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08PRFUSB4000
|
||||
{
|
||||
|
||||
public class MET08PRFUSB4000
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
Photoreflectance = Metrology.Test.Photoreflectance
|
||||
}
|
||||
|
||||
Photoreflectance = Metrology.Test.Photoreflectance
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08RESIHGCV
|
||||
{
|
||||
|
||||
public class MET08RESIHGCV
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
HgCV = Metrology.Test.HgCV
|
||||
}
|
||||
|
||||
HgCV = Metrology.Test.HgCV
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08RESIMAPCDE
|
||||
{
|
||||
|
||||
public class MET08RESIMAPCDE
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
CDE = Metrology.Test.CDE
|
||||
}
|
||||
|
||||
CDE = Metrology.Test.CDE
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08THFTIRQS408M
|
||||
{
|
||||
|
||||
public class MET08THFTIRQS408M
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
BioRadQS408M = Metrology.Test.BioRadQS408M
|
||||
}
|
||||
|
||||
BioRadQS408M = Metrology.Test.BioRadQS408M
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08THFTIRSTRATUS
|
||||
{
|
||||
|
||||
public class MET08THFTIRSTRATUS
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
BioRadStratus = Metrology.Test.BioRadStratus
|
||||
}
|
||||
|
||||
BioRadStratus = Metrology.Test.BioRadStratus
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08UVH44GS100M
|
||||
{
|
||||
|
||||
public class MET08UVH44GS100M
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
UV = Metrology.Test.UV
|
||||
}
|
||||
|
||||
UV = Metrology.Test.UV
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08VPDSUBCON
|
||||
{
|
||||
|
||||
public class MET08VPDSUBCON
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
VpdIcpmsAnalyte = Metrology.Test.VpdIcpmsAnalyte
|
||||
}
|
||||
|
||||
VpdIcpmsAnalyte = Metrology.Test.VpdIcpmsAnalyte
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,12 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08WGEOMX203641Q
|
||||
{
|
||||
|
||||
public class MET08WGEOMX203641Q
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
WarpAndBow = Metrology.Test.WarpAndBow,
|
||||
VerificationWarpAndBow = Metrology.Test.VerificationWarpAndBow
|
||||
}
|
||||
|
||||
WarpAndBow = Metrology.Test.WarpAndBow,
|
||||
VerificationWarpAndBow = Metrology.Test.VerificationWarpAndBow
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,23 +1,20 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class MET08XRDXPERTPROMRDXL
|
||||
{
|
||||
|
||||
public class MET08XRDXPERTPROMRDXL
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
XRDXY = Metrology.Test.XRDXY,
|
||||
XRDWeightedAverage = Metrology.Test.XRDWeightedAverage,
|
||||
MonthlyXRD = Metrology.Test.MonthlyXRD,
|
||||
WeeklyXRD = Metrology.Test.WeeklyXRD,
|
||||
WeeklyXRDAIcomp = Metrology.Test.WeeklyXRDAIcomp,
|
||||
WeeklyXRDFWHM002 = Metrology.Test.WeeklyXRDFWHM002,
|
||||
WeeklyXRDFWHM105 = Metrology.Test.WeeklyXRDFWHM105,
|
||||
WeeklyXRDSLStks = Metrology.Test.WeeklyXRDSLStks,
|
||||
WeeklyXRDXRR = Metrology.Test.WeeklyXRDXRR,
|
||||
JVXRD = Metrology.Test.JVXRD
|
||||
}
|
||||
|
||||
XRDXY = Metrology.Test.XRDXY,
|
||||
XRDWeightedAverage = Metrology.Test.XRDWeightedAverage,
|
||||
MonthlyXRD = Metrology.Test.MonthlyXRD,
|
||||
WeeklyXRD = Metrology.Test.WeeklyXRD,
|
||||
WeeklyXRDAIcomp = Metrology.Test.WeeklyXRDAIcomp,
|
||||
WeeklyXRDFWHM002 = Metrology.Test.WeeklyXRDFWHM002,
|
||||
WeeklyXRDFWHM105 = Metrology.Test.WeeklyXRDFWHM105,
|
||||
WeeklyXRDSLStks = Metrology.Test.WeeklyXRDSLStks,
|
||||
WeeklyXRDXRR = Metrology.Test.WeeklyXRDXRR,
|
||||
JVXRD = Metrology.Test.JVXRD
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,109 +2,106 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public class Duplicator
|
||||
{
|
||||
|
||||
public class Duplicator
|
||||
public class Description : IProcessDataDescription
|
||||
{
|
||||
|
||||
public class Description : IProcessDataDescription
|
||||
public int Test { get; set; }
|
||||
public int Count { get; set; }
|
||||
public int Index { get; set; }
|
||||
//
|
||||
public string EventName { get; set; }
|
||||
public string NullData { get; set; }
|
||||
public string JobID { get; set; }
|
||||
public string Sequence { get; set; }
|
||||
public string MesEntity { get; set; }
|
||||
public string ReportFullPath { get; set; }
|
||||
public string ProcessJobID { get; set; }
|
||||
public string MID { get; set; }
|
||||
public string Date { get; set; } //2021-02-22
|
||||
|
||||
public string GetEventDescription() => "File Has been read and parsed";
|
||||
|
||||
public List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
public int Test { get; set; }
|
||||
public int Count { get; set; }
|
||||
public int Index { get; set; }
|
||||
//
|
||||
public string EventName { get; set; }
|
||||
public string NullData { get; set; }
|
||||
public string JobID { get; set; }
|
||||
public string Sequence { get; set; }
|
||||
public string MesEntity { get; set; }
|
||||
public string ReportFullPath { get; set; }
|
||||
public string ProcessJobID { get; set; }
|
||||
public string MID { get; set; }
|
||||
public string Date { get; set; } //2021-02-22
|
||||
public List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
public string GetEventDescription() { return "File Has been read and parsed"; }
|
||||
public List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
public List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test)
|
||||
{
|
||||
List<string> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new();
|
||||
IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
if (@object is not JsonElement jsonElement)
|
||||
throw new Exception();
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
results.Add(jsonProperty.Name);
|
||||
return results;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
Description result = new();
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
Description result = new()
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test)
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string> GetNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
List<string> results = new List<string>();
|
||||
IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase);
|
||||
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
|
||||
object @object = JsonSerializer.Deserialize<object>(json);
|
||||
if (!(@object is JsonElement jsonElement))
|
||||
throw new Exception();
|
||||
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
|
||||
results.Add(jsonProperty.Name);
|
||||
return results;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
Description result = new Description();
|
||||
return result;
|
||||
}
|
||||
|
||||
public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase)
|
||||
{
|
||||
Description result = new Description
|
||||
{
|
||||
Test = -1,
|
||||
Count = 0,
|
||||
Index = -1,
|
||||
//
|
||||
EventName = configDataBase.GetEventName(),
|
||||
NullData = string.Empty,
|
||||
JobID = logic.Logistics.JobID,
|
||||
Sequence = logic.Logistics.Sequence.ToString(),
|
||||
MesEntity = logic.Logistics.MesEntity,
|
||||
ReportFullPath = logic.Logistics.ReportFullPath,
|
||||
ProcessJobID = logic.Logistics.ProcessJobID,
|
||||
MID = logic.Logistics.MID,
|
||||
Date = logic.Logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss"),
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData)
|
||||
{
|
||||
List<IProcessDataDescription> results = new List<IProcessDataDescription>();
|
||||
return results;
|
||||
}
|
||||
Test = -1,
|
||||
Count = 0,
|
||||
Index = -1,
|
||||
//
|
||||
EventName = configDataBase.GetEventName(),
|
||||
NullData = string.Empty,
|
||||
JobID = logic.Logistics.JobID,
|
||||
Sequence = logic.Logistics.Sequence.ToString(),
|
||||
MesEntity = logic.Logistics.MesEntity,
|
||||
ReportFullPath = logic.Logistics.ReportFullPath,
|
||||
ProcessJobID = logic.Logistics.ProcessJobID,
|
||||
MID = logic.Logistics.MID,
|
||||
Date = logic.Logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss"),
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData)
|
||||
{
|
||||
List<IProcessDataDescription> results = new();
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,57 +1,54 @@
|
||||
namespace Shared.Metrology
|
||||
namespace Shared.Metrology;
|
||||
|
||||
public enum Test
|
||||
{
|
||||
|
||||
public enum Test
|
||||
{
|
||||
AFMRoughness = 34,
|
||||
BioRadQS408M = 25,
|
||||
BioRadStratus = 26,
|
||||
BreakdownVoltageCenter = 0,
|
||||
BreakdownVoltageEdge = 1,
|
||||
BreakdownVoltageMiddle8in = 2,
|
||||
CandelaKlarfDC = 6,
|
||||
CandelaLaser = 36,
|
||||
CandelaProdU = 39,
|
||||
CandelaPSL = 38,
|
||||
CandelaVerify = 37,
|
||||
CDE = 24,
|
||||
CV = 3,
|
||||
DailyRPMAverage = 19,
|
||||
DailyRPMPLRatio = 20,
|
||||
DailyRPMXY = 18,
|
||||
Denton = 9,
|
||||
DiffusionLength = 45,
|
||||
Hall = 10,
|
||||
HgCV = 23,
|
||||
Lehighton = 13,
|
||||
Microscope = 46,
|
||||
MonthlyCV = 4,
|
||||
MonthlyHall = 11,
|
||||
MonthlyXRD = 32,
|
||||
Photoreflectance = 22,
|
||||
PlatoA = 48, //Largest
|
||||
RPMAverage = 16,
|
||||
RPMPLRatio = 17,
|
||||
RPMXY = 15,
|
||||
SP1 = 8,
|
||||
Tencor = 7,
|
||||
UV = 35,
|
||||
VerificationLehighton = 14,
|
||||
VerificationRPM = 21,
|
||||
VerificationWarpAndBow = 29,
|
||||
VpdIcpmsAnalyte = 27,
|
||||
WarpAndBow = 28,
|
||||
WeeklyCV = 5,
|
||||
WeeklyHall = 12,
|
||||
WeeklyXRD = 33,
|
||||
WeeklyXRDAIcomp = 40,
|
||||
WeeklyXRDFWHM002 = 41,
|
||||
WeeklyXRDFWHM105 = 42,
|
||||
WeeklyXRDSLStks = 43,
|
||||
WeeklyXRDXRR = 44,
|
||||
XRDWeightedAverage = 31,
|
||||
JVXRD = 47,
|
||||
XRDXY = 30
|
||||
}
|
||||
|
||||
}
|
||||
AFMRoughness = 34,
|
||||
BioRadQS408M = 25,
|
||||
BioRadStratus = 26,
|
||||
BreakdownVoltageCenter = 0,
|
||||
BreakdownVoltageEdge = 1,
|
||||
BreakdownVoltageMiddle8in = 2,
|
||||
CandelaKlarfDC = 6,
|
||||
CandelaLaser = 36,
|
||||
CandelaProdU = 39,
|
||||
CandelaPSL = 38,
|
||||
CandelaVerify = 37,
|
||||
CDE = 24,
|
||||
CV = 3,
|
||||
DailyRPMAverage = 19,
|
||||
DailyRPMPLRatio = 20,
|
||||
DailyRPMXY = 18,
|
||||
Denton = 9,
|
||||
DiffusionLength = 45,
|
||||
Hall = 10,
|
||||
HgCV = 23,
|
||||
Lehighton = 13,
|
||||
Microscope = 46,
|
||||
MonthlyCV = 4,
|
||||
MonthlyHall = 11,
|
||||
MonthlyXRD = 32,
|
||||
Photoreflectance = 22,
|
||||
PlatoA = 48, //Largest
|
||||
RPMAverage = 16,
|
||||
RPMPLRatio = 17,
|
||||
RPMXY = 15,
|
||||
SP1 = 8,
|
||||
Tencor = 7,
|
||||
UV = 35,
|
||||
VerificationLehighton = 14,
|
||||
VerificationRPM = 21,
|
||||
VerificationWarpAndBow = 29,
|
||||
VpdIcpmsAnalyte = 27,
|
||||
WarpAndBow = 28,
|
||||
WeeklyCV = 5,
|
||||
WeeklyHall = 12,
|
||||
WeeklyXRD = 33,
|
||||
WeeklyXRDAIcomp = 40,
|
||||
WeeklyXRDFWHM002 = 41,
|
||||
WeeklyXRDFWHM105 = 42,
|
||||
WeeklyXRDSLStks = 43,
|
||||
WeeklyXRDXRR = 44,
|
||||
XRDWeightedAverage = 31,
|
||||
JVXRD = 47,
|
||||
XRDXY = 30
|
||||
}
|
||||
|
Reference in New Issue
Block a user