|
|
|
@ -55,6 +55,7 @@ public partial class Job
|
|
|
|
|
const string hyphen = "-";
|
|
|
|
|
const string bioRad2 = "BIORAD2";
|
|
|
|
|
const string bioRad3 = "BIORAD3";
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot;
|
|
|
|
|
const string twoAlphaPattern = "^[a-zA-z]{2,3}";
|
|
|
|
|
const string reactorNumberPattern = @"^[0-9]{2}--";
|
|
|
|
|
Input input = JsonSerializer.Deserialize<Input>(mid) ?? throw new Exception();
|
|
|
|
@ -64,11 +65,9 @@ public partial class Job
|
|
|
|
|
DateTime = new DateTime(sequence);
|
|
|
|
|
const string dep08CEPIEPSILON = "DEP08CEPIEPSILON";
|
|
|
|
|
if (input.EquipmentType == dep08CEPIEPSILON)
|
|
|
|
|
{
|
|
|
|
|
common = Get(input, httpClient);
|
|
|
|
|
}
|
|
|
|
|
common = ReactorGet(input, httpClient);
|
|
|
|
|
else if (!string.IsNullOrEmpty(input.MID) && !string.IsNullOrEmpty(input.MesEntity) && Regex.IsMatch(input.MID, reactorNumberPattern) && input.MesEntity is bioRad2 or bioRad3)
|
|
|
|
|
common = Get(input, barcodeHostFileShare);
|
|
|
|
|
common = Get(input, barcodeHostFileShare, httpClient);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reactorNumber = GetReactorNumber(input);
|
|
|
|
@ -80,11 +79,12 @@ public partial class Job
|
|
|
|
|
reactor: null,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: null,
|
|
|
|
|
workOrder: workOrder);
|
|
|
|
|
else if (!string.IsNullOrEmpty(input.MID) && input.MID.Length is 2 or 3 && Regex.IsMatch(input.MID, twoAlphaPattern))
|
|
|
|
|
common = GetTwoAlphaPattern(metrologyFileShare, input);
|
|
|
|
|
else
|
|
|
|
|
common = Get(input);
|
|
|
|
|
common = Get(input, httpClient);
|
|
|
|
|
}
|
|
|
|
|
bool isValid = IsValid(common.RDSNumber);
|
|
|
|
|
if (isValid)
|
|
|
|
@ -99,11 +99,19 @@ public partial class Job
|
|
|
|
|
psn: common.PSN,
|
|
|
|
|
reactorNumber: common.ReactorNumber,
|
|
|
|
|
zone: hyphen);
|
|
|
|
|
if (commonB.RDSNumber is null || common.RunDataSheetRoot is not null)
|
|
|
|
|
runDataSheetRoot = common.RunDataSheetRoot;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{ runDataSheetRoot = GetRunDataSheetRoot(httpClient, commonB.RDSNumber.Value); }
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{ runDataSheetRoot = null; }
|
|
|
|
|
}
|
|
|
|
|
Qty = "1";
|
|
|
|
|
Status = hyphen; // INFO
|
|
|
|
|
CreationUser = hyphen; // ?
|
|
|
|
|
LotState = hyphen; // LAYER2
|
|
|
|
|
LastUpdateUser = hyphen; // ?
|
|
|
|
|
Equipment = input.MesEntity; // ?
|
|
|
|
|
PackageName = hyphen; // WAFER_ID
|
|
|
|
|
Qty2 = input.Sequence; // SEQUENCE
|
|
|
|
@ -111,30 +119,24 @@ public partial class Job
|
|
|
|
|
IsAreaSi = input.Area == "Si"; // N/A
|
|
|
|
|
StateModel = input.EquipmentType; // ?
|
|
|
|
|
JobName = DateTime.Ticks.ToString(); // ?
|
|
|
|
|
BasicType = GetComment(hyphen, httpClient, commonB); // BASIC_TYPE
|
|
|
|
|
BasicType = GetComment(hyphen, runDataSheetRoot, commonB); // BASIC_TYPE
|
|
|
|
|
AutomationMode = string.Concat(DateTime.Ticks, ".", input.MesEntity); // ?
|
|
|
|
|
SpecName = !string.IsNullOrEmpty(commonB.Layer) ? commonB.Layer : hyphen; // LAYER
|
|
|
|
|
ProductName = !string.IsNullOrEmpty(commonB.PSN) ? commonB.PSN : hyphen; // PRODUCT
|
|
|
|
|
ProcessSpecName = !string.IsNullOrEmpty(commonB.Zone) ? commonB.Zone : hyphen; // WAFER_POS
|
|
|
|
|
LotName = commonB.RDSNumber is not null ? commonB.RDSNumber.Value.ToString() : input.MID; // MID
|
|
|
|
|
LastUpdateUser = string.IsNullOrEmpty(runDataSheetRoot?.Json) ? "{}" : runDataSheetRoot.Json; // NULL_DATA
|
|
|
|
|
ProcessType = commonB.ReactorNumber is not null ? commonB.ReactorNumber.Value.ToString() : hyphen; // PROCESS_JOBID
|
|
|
|
|
Items.Add(new Item { Name = "0", Type = "NA", Number = (0 + 1).ToString(), Qty = "1", CarrierName = hyphen });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string GetComment(string hyphen, HttpClient httpClient, CommonB commonB)
|
|
|
|
|
private static string GetComment(string hyphen, RunDataSheetRoot? runDataSheetRoot, CommonB commonB)
|
|
|
|
|
{
|
|
|
|
|
string result;
|
|
|
|
|
string? loadLockSide = commonB.LoadLockSide;
|
|
|
|
|
if (string.IsNullOrEmpty(loadLockSide) && commonB.RDSNumber is not null)
|
|
|
|
|
{
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot;
|
|
|
|
|
try
|
|
|
|
|
{ runDataSheetRoot = GetRunDataSheetRoot(httpClient, commonB.RDSNumber.Value); }
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{ runDataSheetRoot = null; }
|
|
|
|
|
loadLockSide = runDataSheetRoot?.RunDataSheet?.LoadLockSide;
|
|
|
|
|
}
|
|
|
|
|
if (string.IsNullOrEmpty(loadLockSide) || string.IsNullOrEmpty(commonB.ReactorType))
|
|
|
|
|
result = hyphen;
|
|
|
|
|
else
|
|
|
|
@ -270,8 +272,9 @@ public partial class Job
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Common Get(Input input)
|
|
|
|
|
private static Common Get(Input input, HttpClient httpClient)
|
|
|
|
|
{
|
|
|
|
|
Common result;
|
|
|
|
|
string? psn;
|
|
|
|
|
string? rds;
|
|
|
|
|
int rdsCheck;
|
|
|
|
@ -281,6 +284,7 @@ public partial class Job
|
|
|
|
|
string? reactor;
|
|
|
|
|
string? employee;
|
|
|
|
|
int? reactorNumber;
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot;
|
|
|
|
|
string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID;
|
|
|
|
|
if (mid.Length > 2 && mid[0] == '1' && (mid[1] == 'T' || mid[1] == 't'))
|
|
|
|
|
mid = mid.Substring(2);
|
|
|
|
@ -290,13 +294,14 @@ public partial class Job
|
|
|
|
|
(reactor, rds) = GetReactorAndRDS(input.MID, mid, segments);
|
|
|
|
|
rdsNumber = string.IsNullOrEmpty(rds) || !int.TryParse(rds, out rdsCheck) ? null : rdsCheck;
|
|
|
|
|
bool isInvalid = IsInvalid(rdsNumber);
|
|
|
|
|
if (isInvalid || !int.TryParse(reactor, out int reactorCheck))
|
|
|
|
|
if (rdsNumber is null || isInvalid || !int.TryParse(reactor, out int reactorCheck))
|
|
|
|
|
{
|
|
|
|
|
psn = null;
|
|
|
|
|
zone = null;
|
|
|
|
|
layer = null;
|
|
|
|
|
employee = null;
|
|
|
|
|
reactorNumber = null;
|
|
|
|
|
runDataSheetRoot = null;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -304,14 +309,17 @@ public partial class Job
|
|
|
|
|
reactorNumber = reactorCheck;
|
|
|
|
|
(layer, psn) = GetLayerAndPSN(segments);
|
|
|
|
|
employee = segments.Length <= 4 ? null : segments[4];
|
|
|
|
|
runDataSheetRoot = GetRunDataSheetRoot(httpClient, rdsNumber.Value);
|
|
|
|
|
}
|
|
|
|
|
return new(layer: layer,
|
|
|
|
|
psn: psn,
|
|
|
|
|
rdsNumber: rdsNumber,
|
|
|
|
|
reactor: reactorNumber,
|
|
|
|
|
zone: zone,
|
|
|
|
|
employee: employee,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
result = new(layer: layer,
|
|
|
|
|
psn: psn,
|
|
|
|
|
rdsNumber: rdsNumber,
|
|
|
|
|
reactor: reactorNumber,
|
|
|
|
|
zone: zone,
|
|
|
|
|
employee: employee,
|
|
|
|
|
runDataSheetRoot: runDataSheetRoot,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string[] GetDirectories(string fileShare)
|
|
|
|
@ -330,6 +338,7 @@ public partial class Job
|
|
|
|
|
|
|
|
|
|
private static Common GetTwoAlphaPattern(string metrologyFileShare, Input input)
|
|
|
|
|
{
|
|
|
|
|
Common result;
|
|
|
|
|
string lines;
|
|
|
|
|
const int zero = 0;
|
|
|
|
|
string? psn = null;
|
|
|
|
@ -369,13 +378,15 @@ public partial class Job
|
|
|
|
|
zone = workMaterialOut.Zone;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return new(layer: layer,
|
|
|
|
|
psn: psn,
|
|
|
|
|
rdsNumber: rdsNumber,
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: zone,
|
|
|
|
|
employee: null,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
result = new(layer: layer,
|
|
|
|
|
psn: psn,
|
|
|
|
|
rdsNumber: rdsNumber,
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: zone,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: null,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static List<string> GetFiles(Input input, string barcodeHostFileShare)
|
|
|
|
@ -414,27 +425,16 @@ public partial class Job
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Common Get(Input input, HttpClient httpClient)
|
|
|
|
|
private static Common ReactorGet(Input input, HttpClient httpClient)
|
|
|
|
|
{
|
|
|
|
|
int? rds;
|
|
|
|
|
string? psn;
|
|
|
|
|
Common result;
|
|
|
|
|
Task<Stream> streamTask;
|
|
|
|
|
Task<HttpResponseMessage> httpResponseMessageTask;
|
|
|
|
|
string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID;
|
|
|
|
|
JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
|
|
|
|
|
int? reactor = mid.Length < 2 || !int.TryParse(mid.Substring(0, 2), out int reactorNumber) ? null : reactorNumber;
|
|
|
|
|
httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/reactors/{reactor}");
|
|
|
|
|
httpResponseMessageTask.Wait();
|
|
|
|
|
if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK)
|
|
|
|
|
throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>");
|
|
|
|
|
streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync();
|
|
|
|
|
streamTask.Wait();
|
|
|
|
|
if (!streamTask.Result.CanRead)
|
|
|
|
|
throw new NullReferenceException(nameof(streamTask));
|
|
|
|
|
ReactorRoot? reactorRoot = JsonSerializer.Deserialize<ReactorRoot>(streamTask.Result, jsonSerializerOptions);
|
|
|
|
|
streamTask.Result.Dispose();
|
|
|
|
|
if (reactorRoot is null || reactor != reactorRoot.Reactor.ReactorNo || reactorRoot.Reactor.LoadedRDS is null || reactorRoot.Reactor.LoadedRDS.Length < 1)
|
|
|
|
|
ReactorRoot? reactorRoot = reactor is null ? null : GetReactorRoot(httpClient, jsonSerializerOptions, reactor);
|
|
|
|
|
if (reactorRoot?.Reactor is null || reactor != reactorRoot.Reactor.ReactorNo || reactorRoot.Reactor.LoadedRDS is null || reactorRoot.Reactor.LoadedRDS.Length < 1)
|
|
|
|
|
{
|
|
|
|
|
rds = null;
|
|
|
|
|
psn = null;
|
|
|
|
@ -444,13 +444,14 @@ public partial class Job
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: null,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
rds = reactorRoot.Reactor.LoadedRDS[0];
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot = GetRunDataSheetRoot(httpClient, rds.Value);
|
|
|
|
|
if (runDataSheetRoot is null || reactor != runDataSheetRoot.RunDataSheet.Reactor)
|
|
|
|
|
if (runDataSheetRoot?.RunDataSheet is null || reactor != runDataSheetRoot.RunDataSheet.Reactor)
|
|
|
|
|
{
|
|
|
|
|
psn = null;
|
|
|
|
|
result = new(layer: null,
|
|
|
|
@ -459,6 +460,7 @@ public partial class Job
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: runDataSheetRoot,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -470,30 +472,51 @@ public partial class Job
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: runDataSheetRoot,
|
|
|
|
|
workOrder: null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static RunDataSheetRoot? GetRunDataSheetRoot(HttpClient httpClient, int rds)
|
|
|
|
|
private static ReactorRoot? GetReactorRoot(HttpClient httpClient, JsonSerializerOptions jsonSerializerOptions, int? reactor)
|
|
|
|
|
{
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot;
|
|
|
|
|
JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
|
|
|
|
|
using Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}");
|
|
|
|
|
httpResponseMessageTask.Wait();
|
|
|
|
|
if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK)
|
|
|
|
|
throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>");
|
|
|
|
|
using Task<Stream> streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync();
|
|
|
|
|
streamTask.Wait();
|
|
|
|
|
if (!streamTask.Result.CanRead)
|
|
|
|
|
throw new NullReferenceException(nameof(streamTask));
|
|
|
|
|
runDataSheetRoot = JsonSerializer.Deserialize<RunDataSheetRoot>(streamTask.Result, jsonSerializerOptions);
|
|
|
|
|
streamTask.Result.Dispose();
|
|
|
|
|
return runDataSheetRoot;
|
|
|
|
|
ReactorRoot? result;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/reactors/{reactor}");
|
|
|
|
|
httpResponseMessageTask.Wait();
|
|
|
|
|
if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK)
|
|
|
|
|
throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>");
|
|
|
|
|
using Task<Stream> streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync();
|
|
|
|
|
streamTask.Wait();
|
|
|
|
|
result = !streamTask.Result.CanRead ? null : JsonSerializer.Deserialize<ReactorRoot>(streamTask.Result, jsonSerializerOptions);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception) { result = null; }
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Common Get(Input input, string barcodeHostFileShare)
|
|
|
|
|
private static RunDataSheetRoot? GetRunDataSheetRoot(HttpClient httpClient, int rds)
|
|
|
|
|
{
|
|
|
|
|
RunDataSheetRoot? result;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true };
|
|
|
|
|
using Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}");
|
|
|
|
|
httpResponseMessageTask.Wait();
|
|
|
|
|
if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK)
|
|
|
|
|
throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>");
|
|
|
|
|
Task<string> json = httpResponseMessageTask.Result.Content.ReadAsStringAsync();
|
|
|
|
|
json.Wait();
|
|
|
|
|
result = JsonSerializer.Deserialize<RunDataSheetRoot>(json.Result, jsonSerializerOptions);
|
|
|
|
|
result ??= new RunDataSheetRoot(null);
|
|
|
|
|
result.Json = json.Result;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception) { result = null; }
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Common Get(Input input, string barcodeHostFileShare, HttpClient httpClient)
|
|
|
|
|
{
|
|
|
|
|
Common result;
|
|
|
|
|
if (string.IsNullOrEmpty(barcodeHostFileShare) || !Directory.Exists(barcodeHostFileShare))
|
|
|
|
@ -501,6 +524,7 @@ public partial class Job
|
|
|
|
|
int? rds;
|
|
|
|
|
long sequence = 0;
|
|
|
|
|
WorkOrder? workOrder;
|
|
|
|
|
RunDataSheetRoot? runDataSheetRoot;
|
|
|
|
|
string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID;
|
|
|
|
|
int? reactor = mid.Length < 2 || !int.TryParse(mid.Substring(0, 2), out int reactorNumber) ? null : reactorNumber;
|
|
|
|
|
bool parsed = !string.IsNullOrEmpty(input.Sequence) && long.TryParse(input.Sequence, out sequence);
|
|
|
|
@ -514,24 +538,28 @@ public partial class Job
|
|
|
|
|
{
|
|
|
|
|
rds = null;
|
|
|
|
|
workOrder = null;
|
|
|
|
|
runDataSheetRoot = null;
|
|
|
|
|
}
|
|
|
|
|
else if (!text.Contains('.'))
|
|
|
|
|
{
|
|
|
|
|
workOrder = null;
|
|
|
|
|
rds = !int.TryParse(text.Substring(2), out int rdsNumber) ? null : rdsNumber;
|
|
|
|
|
rds = !int.TryParse(text.Substring(2), out int rdsNumber) || IsInvalid(rdsNumber) ? null : rdsNumber;
|
|
|
|
|
runDataSheetRoot = rds is null ? null : GetRunDataSheetRoot(httpClient, rds.Value);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
rds = null;
|
|
|
|
|
runDataSheetRoot = null;
|
|
|
|
|
workOrder = GetWorkOrder(new(input, text.Substring(2)));
|
|
|
|
|
}
|
|
|
|
|
result = new(layer: null,
|
|
|
|
|
psn: null,
|
|
|
|
|
rdsNumber: rds,
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
workOrder: workOrder);
|
|
|
|
|
psn: null,
|
|
|
|
|
rdsNumber: rds,
|
|
|
|
|
reactor: reactor,
|
|
|
|
|
zone: null,
|
|
|
|
|
employee: null,
|
|
|
|
|
runDataSheetRoot: runDataSheetRoot,
|
|
|
|
|
workOrder: workOrder);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|