Bug in yml dotnet tool PackageReference arrangement RDS Blank Change int dotnet test nuget ^ [spcepiworld].[dbo].[evnt_inf] Assembly Version WS Result bug fix and Nuget bump, PSN, Reactor and Extra RDS rule OpenInsightApi and testRunTitle editorconfig bugs Fix Type serializerValue RDS oversight PropertyNameCaseInsensitive Save check for file already present NoWaitDirectory MoveArchive allow empty directory and continueOnError for clean files CreatePointerFile and more on NoWaitDirectory
221 lines
11 KiB
C#
221 lines
11 KiB
C#
using Adaptation.Shared;
|
|
using System;
|
|
using System.Data;
|
|
using System.Data.SqlClient;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
|
|
namespace Adaptation.FileHandlers.OpenInsight;
|
|
|
|
public class FromIQS
|
|
{
|
|
|
|
#nullable enable
|
|
|
|
private static string GetCommandText(Logistics logistics, pcl.Description description, string dateTime, long? subGroupId)
|
|
{
|
|
StringBuilder result = new();
|
|
_ = result
|
|
.AppendLine(" select ")
|
|
.AppendLine(" se.f_sgrp se_sgrp, ")
|
|
.AppendLine(" se.f_sgtm se_sgtm, ")
|
|
.AppendLine(" se.f_tsno se_tsno, ")
|
|
.AppendLine(" se.f_val se_val, ")
|
|
.AppendLine(" rd.f_name rd_name, ")
|
|
.AppendLine(" jd.f_name jd_name, ")
|
|
.AppendLine(" pl.f_name pl_name, ")
|
|
.AppendLine(" pd.f_name pd_name, ")
|
|
.AppendLine(" td.f_test td_test, ")
|
|
.AppendLine(" td.f_name td_name, ")
|
|
.AppendLine(" (select count(ev.f_evnt) ")
|
|
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ")
|
|
.AppendLine(" where ev.f_prcs = rd.f_prcs ")
|
|
.AppendLine(" and ev.f_part = pd.f_part ")
|
|
.AppendLine(" and ev.f_sgtm = se.f_sgtm) ev_count ")
|
|
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] rd ")
|
|
.AppendLine(" on se.f_prcs = rd.f_prcs ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ")
|
|
.AppendLine(" on se.f_job = jd.f_job ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ")
|
|
.AppendLine(" on se.f_lot = pl.f_lot ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
|
|
.AppendLine(" on se.f_part = pd.f_part ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
|
|
.AppendLine(" on se.f_test = td.f_test ")
|
|
.AppendLine(" where se.f_flag = 0 ");
|
|
if (subGroupId is not null)
|
|
_ = result.Append(" and se.f_sgrp = ").Append(subGroupId).AppendLine(" ");
|
|
if (!string.IsNullOrEmpty(description.RDS))
|
|
_ = result.Append(" and pl.f_name = '").Append(description.RDS).AppendLine("' ");
|
|
_ = result
|
|
.Append(" and rd.f_name = '").Append(description.Reactor).AppendLine("' ")
|
|
.Append(" and pd.f_name = '").Append(description.PSN).AppendLine("' ")
|
|
.AppendLine(" and jd.f_name in ('TENCOR1', 'TENCOR2', 'TENCOR3') ")
|
|
.Append(" and jd.f_name = '").Append(logistics.MesEntity).AppendLine("' ")
|
|
.Append(" and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '").Append(dateTime).AppendLine("' ")
|
|
.AppendLine(" for json path ");
|
|
return result.ToString();
|
|
}
|
|
|
|
private static StringBuilder GetForJsonPath(string connectionString, string commandText)
|
|
{
|
|
StringBuilder stringBuilder = new();
|
|
using SqlConnection sqlConnection = new(connectionString);
|
|
sqlConnection.Open();
|
|
using SqlCommand sqlCommand = new(commandText, sqlConnection);
|
|
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.SequentialAccess);
|
|
while (sqlDataReader.Read())
|
|
_ = stringBuilder.Append(sqlDataReader.GetString(0));
|
|
return stringBuilder;
|
|
}
|
|
|
|
internal static (long?, int?, string) GetCommandText(string connectionString, Logistics logistics, pcl.Description description, long breakAfter, long preWait)
|
|
{
|
|
string dateTime;
|
|
int? count = null;
|
|
string commandText;
|
|
long? result = null;
|
|
string dateFormat = pcl.Description.GetDateFormat();
|
|
if (DateTime.TryParseExact(description.Date, dateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTimeParsed))
|
|
dateTime = dateTimeParsed.ToString("yyyy-MM-dd HH:mm:ss");
|
|
else if (DateTime.TryParse(description.Date, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTimeParsed))
|
|
dateTime = dateTimeParsed.ToString("yyyy-MM-dd HH:mm:ss");
|
|
else
|
|
dateTime = logistics.DateTimeFromSequence.ToString("yyyy-MM-dd HH:mm:ss");
|
|
commandText = GetCommandText(logistics, description, dateTime, subGroupId: null);
|
|
for (short i = 0; i < short.MaxValue; i++)
|
|
{
|
|
if (DateTime.Now.Ticks > preWait)
|
|
break;
|
|
Thread.Sleep(100);
|
|
}
|
|
StringBuilder stringBuilder = new();
|
|
for (short z = 0; z < short.MaxValue; z++)
|
|
{
|
|
stringBuilder = GetForJsonPath(connectionString, commandText);
|
|
if (stringBuilder.Length > 0)
|
|
break;
|
|
if (DateTime.Now.Ticks > breakAfter)
|
|
// throw new Exception($"After {breakAfterSeconds} seconds, didn't find sub group id!");
|
|
break;
|
|
Thread.Sleep(250);
|
|
}
|
|
if (stringBuilder.Length == 0)
|
|
commandText = stringBuilder.ToString();
|
|
else
|
|
{
|
|
JsonElement[]? jsonElements = JsonSerializer.Deserialize<JsonElement[]>(stringBuilder.ToString());
|
|
if (jsonElements is null || !jsonElements.Any() || jsonElements[0].ValueKind != JsonValueKind.Object)
|
|
commandText = stringBuilder.ToString();
|
|
else
|
|
{
|
|
JsonProperty[] jsonProperties = jsonElements[0].EnumerateObject().ToArray();
|
|
if (!jsonProperties.Any() || jsonProperties[0].Name != "se_sgrp" || !long.TryParse(jsonProperties[0].Value.ToString(), out long subGroupId))
|
|
commandText = stringBuilder.ToString();
|
|
else
|
|
{
|
|
result = subGroupId;
|
|
commandText = GetCommandText(logistics, description, dateTime, subGroupId);
|
|
if (jsonProperties.Any() && jsonProperties[10].Name == "ev_count" && int.TryParse(jsonProperties[10].Value.ToString(), out int evCount))
|
|
count = evCount;
|
|
}
|
|
}
|
|
}
|
|
return new(result, count, commandText);
|
|
}
|
|
|
|
private static string GetJson(Logistics logistics, string logisticLines, pcl.Description description)
|
|
{
|
|
string result;
|
|
StringBuilder stringBuilder = new();
|
|
var @object = new
|
|
{
|
|
description.MesEntity,
|
|
description.Employee,
|
|
// description.Layer,
|
|
description.PSN,
|
|
description.RDS,
|
|
description.Reactor,
|
|
description.Recipe,
|
|
// description.Zone,
|
|
logistics.DateTimeFromSequence.Ticks
|
|
};
|
|
string[] pair;
|
|
string safeValue;
|
|
string[] segments;
|
|
string serializerValue;
|
|
foreach (string line in logisticLines.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
|
|
{
|
|
segments = line.Split('\t');
|
|
if (segments.Length < 2)
|
|
continue;
|
|
segments = segments[1].Split(';');
|
|
_ = stringBuilder.Append('{');
|
|
foreach (string segment in segments)
|
|
{
|
|
pair = segment.Split('=');
|
|
if (pair.Length != 2 || pair[0].Length < 3)
|
|
continue;
|
|
serializerValue = JsonSerializer.Serialize(pair[1]);
|
|
safeValue = serializerValue.Substring(1, serializerValue.Length - 2);
|
|
_ = stringBuilder.Append('"').Append(pair[0].Substring(2)).Append('"').Append(':').Append('"').Append(safeValue).Append('"').Append(',');
|
|
}
|
|
if (stringBuilder.Length > 0)
|
|
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
|
|
_ = stringBuilder.Append('}').Append(',');
|
|
}
|
|
if (stringBuilder.Length > 0)
|
|
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
|
|
_ = stringBuilder.Append(']').Append('}');
|
|
_ = stringBuilder.Insert(0, ",\"Logistics\":[");
|
|
string json = JsonSerializer.Serialize(@object);
|
|
_ = stringBuilder.Insert(0, json.Substring(0, json.Length - 1));
|
|
JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(stringBuilder.ToString());
|
|
result = jsonElement is null ? "{}" : JsonSerializer.Serialize(jsonElement, new JsonSerializerOptions { WriteIndented = true });
|
|
return result;
|
|
}
|
|
|
|
internal static void Save(string openInsightApiECDirectory, string openInsightApiIFXDirectory, Logistics logistics, string reportFullPath, string logisticLines, pcl.Description description, string lines, long? subGroupId, string weekOfYear)
|
|
{
|
|
string checkFile;
|
|
string fileName = Path.GetFileName(reportFullPath);
|
|
string json = GetJson(logistics, logisticLines, description);
|
|
string? ecPathRoot = Path.GetPathRoot(openInsightApiECDirectory);
|
|
string? ifxPathRoot = Path.GetPathRoot(openInsightApiIFXDirectory);
|
|
bool ecExists = ecPathRoot is not null && Directory.Exists(ecPathRoot);
|
|
bool ifxExists = ifxPathRoot is not null && Directory.Exists(ifxPathRoot);
|
|
string weekYear = $"{logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}";
|
|
string ecDirectory = Path.Combine(openInsightApiECDirectory, weekYear, $"-{description.PSN}", $"-{description.Reactor}", $"-{description.RDS}", $"-{subGroupId}");
|
|
string ifxDirectory = Path.Combine(openInsightApiIFXDirectory, weekYear, $"-{description.PSN}", $"-{description.Reactor}", $"-{description.RDS}", $"-{subGroupId}");
|
|
if (ecExists && !Directory.Exists(ecDirectory))
|
|
_ = Directory.CreateDirectory(ecDirectory);
|
|
if (ifxExists && !Directory.Exists(ifxDirectory))
|
|
_ = Directory.CreateDirectory(ifxDirectory);
|
|
checkFile = Path.Combine(ecDirectory, fileName);
|
|
if (ecExists && !File.Exists(checkFile))
|
|
File.Copy(reportFullPath, checkFile);
|
|
checkFile = Path.Combine(ifxDirectory, fileName);
|
|
if (ifxExists && !File.Exists(checkFile))
|
|
File.Copy(reportFullPath, checkFile);
|
|
checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt");
|
|
if (ecExists && !File.Exists(checkFile))
|
|
File.WriteAllText(checkFile, lines);
|
|
checkFile = Path.Combine(ifxDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt");
|
|
if (ifxExists && !File.Exists(checkFile))
|
|
File.WriteAllText(checkFile, lines);
|
|
checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json");
|
|
if (ecExists && !File.Exists(checkFile))
|
|
File.WriteAllText(checkFile, json);
|
|
checkFile = Path.Combine(ifxDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json");
|
|
if (ifxExists && !File.Exists(checkFile))
|
|
File.WriteAllText(checkFile, json);
|
|
}
|
|
|
|
#nullable disable
|
|
|
|
} |