diff --git a/Archive/Views/Shared/_Layout.cshtml b/Archive/Views/Shared/_Layout.cshtml index a51a4d8..d592c48 100644 --- a/Archive/Views/Shared/_Layout.cshtml +++ b/Archive/Views/Shared/_Layout.cshtml @@ -71,7 +71,7 @@
  • @Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)
  • diff --git a/Server/ApiControllers/InfinityQSV3Controller.cs b/Server/ApiControllers/InfinityQSV3Controller.cs index db7f256..24d6856 100644 --- a/Server/ApiControllers/InfinityQSV3Controller.cs +++ b/Server/ApiControllers/InfinityQSV3Controller.cs @@ -52,4 +52,11 @@ public class InfinityQSV3Controller : Controller, IInfinityQSV3Controller -{ - - private readonly IWorkMaterialRepository _WorkMaterialRepository; - - public WorkMaterialController(IWorkMaterialRepository WorkMaterialRepository) => - _WorkMaterialRepository = WorkMaterialRepository; - - [HttpGet("{mid}")] - public IActionResult GetCassette(string mid) => - Json(_WorkMaterialRepository.GetCassette(mid), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); - -} \ No newline at end of file diff --git a/Server/Data/Tests/InfinityQSV3-GetEpiProTempVerification.html b/Server/Data/Tests/InfinityQSV3-GetEpiProTempVerification.html new file mode 100644 index 0000000..d43283f --- /dev/null +++ b/Server/Data/Tests/InfinityQSV3-GetEpiProTempVerification.html @@ -0,0 +1 @@ +44Productive616747001/1/0001 12:00:00 AM50Productive001/1/0001 12:00:00 AM48Unscheduled Down001/1/0001 12:00:00 AM42Scheduled Down616741001/1/0001 12:00:00 AM40Unscheduled Down616740001/1/0001 12:00:00 AM46Productive001/1/0001 12:00:00 AM54Non-Scheduled001/1/0001 12:00:00 AM \ No newline at end of file diff --git a/Server/Data/Tests/WorkMaterial-GetCassette.json b/Server/Data/Tests/WorkMaterial-GetCassette.json deleted file mode 100644 index bdd8c34..0000000 --- a/Server/Data/Tests/WorkMaterial-GetCassette.json +++ /dev/null @@ -1,357 +0,0 @@ -{ - "Results": [ - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "1", - "Zone": "1", - "InCassetteNumber": 40, - "InSlotNumber": 24, - "OutCassetteNumber": 36, - "OutSlotNumber": 21, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "2", - "Zone": "1", - "InCassetteNumber": 40, - "InSlotNumber": 25, - "OutCassetteNumber": 36, - "OutSlotNumber": 22, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "3", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 1, - "OutCassetteNumber": 36, - "OutSlotNumber": 23, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "4", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 2, - "OutCassetteNumber": 36, - "OutSlotNumber": 24, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "5", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 3, - "OutCassetteNumber": 36, - "OutSlotNumber": 25, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "6", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 4, - "OutCassetteNumber": 37, - "OutSlotNumber": 1, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "7", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 5, - "OutCassetteNumber": 37, - "OutSlotNumber": 2, - "PSN": "4445" - }, - { - "RunDataSheet": "586820", - "Reactor": 52, - "Pocket": "8", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 6, - "OutCassetteNumber": 37, - "OutSlotNumber": 3, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "1", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 7, - "OutCassetteNumber": -1, - "OutSlotNumber": -1, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "2", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 8, - "OutCassetteNumber": 37, - "OutSlotNumber": 4, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "3", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 9, - "OutCassetteNumber": 37, - "OutSlotNumber": 5, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "4", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 10, - "OutCassetteNumber": 37, - "OutSlotNumber": 6, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "5", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 11, - "OutCassetteNumber": 37, - "OutSlotNumber": 7, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "6", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 12, - "OutCassetteNumber": 37, - "OutSlotNumber": 8, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "7", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 13, - "OutCassetteNumber": 37, - "OutSlotNumber": 9, - "PSN": "4445" - }, - { - "RunDataSheet": "586821", - "Reactor": 52, - "Pocket": "8", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 14, - "OutCassetteNumber": 37, - "OutSlotNumber": 10, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "1", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 15, - "OutCassetteNumber": 37, - "OutSlotNumber": 11, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "2", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 16, - "OutCassetteNumber": 37, - "OutSlotNumber": 12, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "3", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 17, - "OutCassetteNumber": 37, - "OutSlotNumber": 13, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "4", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 18, - "OutCassetteNumber": 37, - "OutSlotNumber": 14, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "5", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 19, - "OutCassetteNumber": 37, - "OutSlotNumber": 15, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "6", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 20, - "OutCassetteNumber": 37, - "OutSlotNumber": 16, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "7", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 21, - "OutCassetteNumber": 37, - "OutSlotNumber": 17, - "PSN": "4445" - }, - { - "RunDataSheet": "586822", - "Reactor": 52, - "Pocket": "8", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 22, - "OutCassetteNumber": 37, - "OutSlotNumber": 18, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "1", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 23, - "OutCassetteNumber": -1, - "OutSlotNumber": -1, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "2", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 24, - "OutCassetteNumber": 37, - "OutSlotNumber": 19, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "3", - "Zone": "1", - "InCassetteNumber": 41, - "InSlotNumber": 25, - "OutCassetteNumber": 37, - "OutSlotNumber": 20, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "4", - "Zone": "1", - "InCassetteNumber": 42, - "InSlotNumber": 1, - "OutCassetteNumber": 37, - "OutSlotNumber": 21, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "5", - "Zone": "1", - "InCassetteNumber": 42, - "InSlotNumber": 2, - "OutCassetteNumber": 37, - "OutSlotNumber": 22, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "6", - "Zone": "1", - "InCassetteNumber": 42, - "InSlotNumber": 3, - "OutCassetteNumber": -1, - "OutSlotNumber": -1, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "7", - "Zone": "1", - "InCassetteNumber": 42, - "InSlotNumber": 4, - "OutCassetteNumber": 37, - "OutSlotNumber": 24, - "PSN": "4445" - }, - { - "RunDataSheet": "586827", - "Reactor": 52, - "Pocket": "8", - "Zone": "1", - "InCassetteNumber": 42, - "InSlotNumber": 5, - "OutCassetteNumber": 37, - "OutSlotNumber": 25, - "PSN": "4445" - } - ], - "TotalRows": 32 -} \ No newline at end of file diff --git a/Server/Models/AppSettings.cs b/Server/Models/AppSettings.cs index 66c56f2..b2de313 100644 --- a/Server/Models/AppSettings.cs +++ b/Server/Models/AppSettings.cs @@ -19,6 +19,7 @@ public record AppSettings(string ApiExportPath, string MonAResource, string MonASite, string OI2SqlConnectionString, + string OpenInsightApplicationProgrammingInterface, Dictionary TableToPath, string URLs, string WorkingDirectoryName) diff --git a/Server/Models/Binder/AppSettings.cs b/Server/Models/Binder/AppSettings.cs index 8dfd42f..4a4759c 100644 --- a/Server/Models/Binder/AppSettings.cs +++ b/Server/Models/Binder/AppSettings.cs @@ -23,6 +23,7 @@ public class AppSettings public string? MonAResource { get; set; } public string? MonASite { get; set; } public string? Oi2SqlConnectionString { get; set; } + public string? OpenInsightApplicationProgrammingInterface { get; set; } public Dictionary? TableToPath { get; set; } public string? URLs { get; set; } public string? WorkingDirectoryName { get; set; } @@ -54,6 +55,7 @@ public class AppSettings if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource)); if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite)); if (appSettings.Oi2SqlConnectionString is null) throw new NullReferenceException(nameof(Oi2SqlConnectionString)); + if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface)); if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs)); if (appSettings.TableToPath is null) throw new NullReferenceException(nameof(TableToPath)); if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName)); @@ -75,6 +77,7 @@ public class AppSettings appSettings.MonAResource, appSettings.MonASite, appSettings.Oi2SqlConnectionString, + appSettings.OpenInsightApplicationProgrammingInterface, appSettings.TableToPath, appSettings.URLs, appSettings.WorkingDirectoryName); diff --git a/Server/OI.Metrology.Server.csproj b/Server/OI.Metrology.Server.csproj index c9cf0f6..7b2034b 100644 --- a/Server/OI.Metrology.Server.csproj +++ b/Server/OI.Metrology.Server.csproj @@ -104,6 +104,9 @@ Always + + Always + Always @@ -140,8 +143,5 @@ Always - - Always - \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs index da73757..c8779fc 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -62,26 +62,25 @@ public class Program SQLDbConnectionFactory sqlDbConnectionFactory = new(appSettings); ClientSettingsRepository clientSettingsRepository = new(appSettings); + _ = webApplicationBuilder.Services.AddHttpClient(); _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); - _ = webApplicationBuilder.Services.AddSingleton(); - _ = webApplicationBuilder.Services.AddSingleton(); - _ = webApplicationBuilder.Services.AddSingleton(_ => clientSettingsRepository); - _ = webApplicationBuilder.Services.AddSingleton(); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot)); - _ = webApplicationBuilder.Services.AddSingleton(_ => sqlDbConnectionFactory); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot)); - _ = webApplicationBuilder.Services.AddSingleton(); - _ = webApplicationBuilder.Services.AddSingleton>(_ => appSettingsRepository); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot, sqlDbConnectionFactory)); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot, sqlDbConnectionFactory)); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot, sqlDbConnectionFactory)); - _ = webApplicationBuilder.Services.AddSingleton(_ => new(appSettings.MockRoot, sqlDbConnectionFactory)); - + _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddScoped(); + _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Services.AddScoped(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Services.AddScoped(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(_ => clientSettingsRepository); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(_ => sqlDbConnectionFactory); + _ = webApplicationBuilder.Services.AddSingleton>(_ => appSettingsRepository); _ = webApplicationBuilder.Services.AddSwaggerGen(); _ = webApplicationBuilder.Services.AddSession(sessionOptions => diff --git a/Server/Repositories/InfinityQSRepository.cs b/Server/Repositories/InfinityQSRepository.cs index 783fca5..8c3bdd9 100644 --- a/Server/Repositories/InfinityQSRepository.cs +++ b/Server/Repositories/InfinityQSRepository.cs @@ -1,3 +1,4 @@ +using OI.Metrology.Server.Models; using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; @@ -15,9 +16,9 @@ public class InfinityQSRepository : IInfinityQSRepository private readonly string _RepositoryName; private readonly IDbConnectionFactory _DBConnectionFactory; - public InfinityQSRepository(string mockRoot, IDbConnectionFactory dbConnectionFactory) + public InfinityQSRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory) { - _MockRoot = mockRoot; + _MockRoot = appSettings.MockRoot; _DBConnectionFactory = dbConnectionFactory; _RepositoryName = nameof(InfinityQSRepository)[..^10]; } diff --git a/Server/Repositories/InfinityQSV2Repository.cs b/Server/Repositories/InfinityQSV2Repository.cs index 6366cb1..6328a86 100644 --- a/Server/Repositories/InfinityQSV2Repository.cs +++ b/Server/Repositories/InfinityQSV2Repository.cs @@ -1,3 +1,4 @@ +using OI.Metrology.Server.Models; using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; @@ -15,9 +16,9 @@ public class InfinityQSV2Repository : IInfinityQSV2Repository private readonly string _RepositoryName; private readonly IDbConnectionFactory _DBConnectionFactory; - public InfinityQSV2Repository(string mockRoot, IDbConnectionFactory dbConnectionFactory) + public InfinityQSV2Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory) { - _MockRoot = mockRoot; + _MockRoot = appSettings.MockRoot; _DBConnectionFactory = dbConnectionFactory; _RepositoryName = nameof(InfinityQSV2Repository)[..^10]; } diff --git a/Server/Repositories/InfinityQSV3Repository.cs b/Server/Repositories/InfinityQSV3Repository.cs index 0d60f88..529d049 100644 --- a/Server/Repositories/InfinityQSV3Repository.cs +++ b/Server/Repositories/InfinityQSV3Repository.cs @@ -1,6 +1,9 @@ +using OI.Metrology.Server.Models; using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models; using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; +using System.Collections.ObjectModel; using System.Data; using System.Data.Common; using System.Text; @@ -13,13 +16,17 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository private readonly string _MockRoot; private readonly string _RepositoryName; + private readonly IHttpClientFactory _HttpClientFactory; private readonly IDbConnectionFactory _DBConnectionFactory; + private readonly string _OpenInsightApplicationProgrammingInterface; - public InfinityQSV3Repository(string mockRoot, IDbConnectionFactory dbConnectionFactory) + public InfinityQSV3Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory) { - _MockRoot = mockRoot; + _MockRoot = appSettings.MockRoot; + _HttpClientFactory = httpClientFactory; _DBConnectionFactory = dbConnectionFactory; _RepositoryName = nameof(InfinityQSV3Repository)[..^10]; + _OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface; } string IInfinityQSV3Repository.GetCommandText(string subGroupId) @@ -318,4 +325,218 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository return result.ToString(); } + private JsonElement[] GetAllReactorsAsJsonElementElement() + { + JsonElement[]? results; + HttpClient httpClient = _HttpClientFactory.CreateClient(); + Task task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/reactors"); + task.Wait(); + JsonElement? jsonElement = JsonSerializer.Deserialize(task.Result); + if (jsonElement is null) + throw new NullReferenceException(nameof(jsonElement)); + string json = jsonElement.Value.EnumerateObject().First().Value.ToString(); + results = JsonSerializer.Deserialize(json); + if (results is null) + throw new NullReferenceException(nameof(results)); + return results; + } + + private ReadOnlyDictionary GetReactorsMatchingType(string? reactTypeFilter) + { + Dictionary results = new(); + string json; + Reactor? reactor; + JsonElement[]? jsonElements = GetAllReactorsAsJsonElementElement(); + foreach (JsonElement jsonElement in jsonElements) + { + json = jsonElement.EnumerateObject().First().Value.ToString(); + if (reactTypeFilter is not null && !json.Contains(reactTypeFilter)) + continue; + try + { reactor = JsonSerializer.Deserialize(json, ReactorSourceGenerationContext.Default.Reactor); } + catch (Exception) { reactor = null; } + if (reactor is null || reactor.ReactType != reactTypeFilter) + continue; + results.Add(reactor.ReactorNo, reactor); + } + return new(results); + } + + string IInfinityQSV3Repository.GetCommandText(List eppReactorNumbers) + { + StringBuilder result = new(); + _ = result + .AppendLine(" select se.f_sgrp, ") + .AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ") + .AppendLine(" iq.pr_name, ") + .AppendLine(" iq.pd_name, ") + .AppendLine(" max(case ") + .AppendLine(" when td.f_test = 1104769646 ") + .AppendLine(" then se.f_val ") + .AppendLine(" else null ") + .AppendLine(" end) as iq_value, ") + .AppendLine(" max(case ") + .AppendLine(" when td.f_test = 1312288843 ") + .AppendLine(" then se.f_val else null ") + .AppendLine(" end) as iq_temp_offset_percent ") + .AppendLine(" from ( ") + .AppendLine(" select ") + .AppendLine(" max(se.f_sgrp) se_max_sgrp, ") + .AppendLine(" se.f_test se_test, ") + .AppendLine(" pr.f_name pr_name, ") + .AppendLine(" pd.f_name pd_name ") + .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") + .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") + .AppendLine(" on se.f_prcs = pr.f_prcs ") + .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") + .AppendLine(" on se.f_part = pd.f_part ") + .AppendLine(" where se.f_flag = 0 ") + .Append(" and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ") + .AppendLine(" and pd.f_name = '1090 - Full Load' ") + .AppendLine(" and se.f_test in (1104769646, 1312288843) ") + .AppendLine(" group by se.f_test, ") + .AppendLine(" pr.f_name, ") + .AppendLine(" pd.f_name ") + .AppendLine(" ) as iq ") + .AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ") + .AppendLine(" on iq.se_max_sgrp = se.f_sgrp ") + .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") + .AppendLine(" on iq.se_test = td.f_test ") + .AppendLine(" and se.f_test = td.f_test ") + .AppendLine(" where se.f_flag = 0 ") + .AppendLine(" and td.f_test in (1104769646, 1312288843) ") + .AppendLine(" group by se.f_sgrp, ") + .AppendLine(" iq.pr_name, ") + .AppendLine(" iq.pd_name ") + .AppendLine(" order by iq.pr_name ") + .AppendLine(" for json path; "); + return result.ToString(); + } + + private List Convert(int[] night) + { + List results = new(); + foreach (int reactor in night) + results.Add(reactor.ToString()); + return results; + } + + private static void Append(StringBuilder result, int loadedCount, Reactor reactor, string loadedRDS, TimeSpan timeSpan, InfinityQS1090FullLoad infinityQS1090FullLoad) + { + _ = result. + Append("").Append(reactor.ReactorNo).Append(""). + Append("").Append(reactor.E10State).Append(""). + Append("").Append(loadedRDS).Append(""). + Append("").Append(infinityQS1090FullLoad.Value).Append(""). + Append("").Append(infinityQS1090FullLoad.TemperatureOffsetPercentage).Append(""). + Append("").Append(infinityQS1090FullLoad.SubGroupIdFormated).Append(""). + Append("").Append(Math.Floor(timeSpan.TotalHours)).Append(""); + } + + private static void Append(StringBuilder result) + { + _ = result. + Append(" "). + Append(" "). + Append(" "). + Append(" "). + Append(" "). + Append(" "). + Append(" "). + Append(" "); + } + + string IInfinityQSV3Repository.GetEpiProTempVerification(int[] night) + { + StringBuilder result; + List eppReactorNumbers = new(); + List nightSiftReactors = Convert(night); + ReadOnlyDictionary eppReactors = GetReactorsMatchingType("EPP"); + foreach (KeyValuePair keyValuePair in eppReactors) + eppReactorNumbers.Add($"'{keyValuePair.Key}'"); + if (!string.IsNullOrEmpty(_MockRoot)) + { + string html = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV3Repository.GetEpiProTempVerification)}.html")); + result = new(html); + } + else + { + bool found; + result = new(); + int loadedCount; + Reactor? reactor; + string loadedRDS; + int reactorNumber; + TimeSpan timeSpan; + List used = new(); + List dayShiftOrder = new(); + long ticks = DateTime.Now.Ticks; + List nightShiftOrder = new(); + InfinityQS1090FullLoad infinityQS1090FullLoad; + IInfinityQSV3Repository infinityQSV3Repository = this; + string commandText = infinityQSV3Repository.GetCommandText(eppReactorNumbers); + StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText); + InfinityQS1090FullLoad[]? results = stringBuilder.Length == 0 ? Array.Empty() : JsonSerializer.Deserialize(stringBuilder.ToString(), InfinityQS1090FullLoadArraySourceGenerationContext.Default.InfinityQS1090FullLoadArray); + if (results is null) + throw new NullReferenceException(nameof(results)); + for (int i = 0; i < results.Length; i++) + { + infinityQS1090FullLoad = results[i]; + if (infinityQS1090FullLoad.Reactor is null) + continue; + if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber)) + continue; + if (!eppReactors.TryGetValue(reactorNumber, out reactor)) + continue; + if (!nightSiftReactors.Contains(infinityQS1090FullLoad.Reactor)) + dayShiftOrder.Add(i); + else + nightShiftOrder.Add(i); + } + for (int i = 0; i < results.Length; i++) + { + if (used.Contains(i) || !dayShiftOrder.Contains(i)) + continue; + infinityQS1090FullLoad = results[i]; + if (infinityQS1090FullLoad.Reactor is null) + continue; + if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber)) + continue; + if (!eppReactors.TryGetValue(reactorNumber, out reactor)) + continue; + used.Add(i); + found = false; + timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormated.Ticks); + loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count; + loadedRDS = reactor.LoadedRDS is null ? "" : reactor.LoadedRDS[0].ToString(); + _ = result.Append(""); + Append(result, loadedCount, reactor, loadedRDS, timeSpan, infinityQS1090FullLoad); + for (int j = i + 1; j < results.Length; j++) + { + if (used.Contains(j) || !nightShiftOrder.Contains(j)) + continue; + infinityQS1090FullLoad = results[j]; + if (infinityQS1090FullLoad.Reactor is null) + continue; + if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber)) + continue; + if (!eppReactors.TryGetValue(reactorNumber, out reactor)) + continue; + used.Add(j); + found = true; + _ = result.Append(" "); + timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormated.Ticks); + loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count; + loadedRDS = reactor.LoadedRDS is null ? "" : reactor.LoadedRDS[0].ToString(); + Append(result, loadedCount, reactor, loadedRDS, timeSpan, infinityQS1090FullLoad); + break; + } + if (!found) + Append(result); + _ = result.Append(""); + } + } + return result.ToString(); + } + } \ No newline at end of file diff --git a/Server/Repositories/PinRepository.cs b/Server/Repositories/PinRepository.cs index 2478d4d..a3892f2 100644 --- a/Server/Repositories/PinRepository.cs +++ b/Server/Repositories/PinRepository.cs @@ -1,3 +1,4 @@ +using OI.Metrology.Server.Models; using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.Models.Stateless; using System.Text.Json; @@ -11,9 +12,9 @@ public class PinRepository : IPinRepository private readonly string _RepositoryName; private readonly Dictionary> _RdsToHeaderCommonCollection; - public PinRepository(string mockRoot) + public PinRepository(AppSettings appSettings) { - _MockRoot = mockRoot; + _MockRoot = appSettings.MockRoot; _RdsToHeaderCommonCollection = new(); _RepositoryName = nameof(PinRepository)[..^10]; } diff --git a/Server/Repositories/ServiceShopOrderRepository.cs b/Server/Repositories/ServiceShopOrderRepository.cs index e2e3ce2..928b669 100644 --- a/Server/Repositories/ServiceShopOrderRepository.cs +++ b/Server/Repositories/ServiceShopOrderRepository.cs @@ -7,11 +7,6 @@ namespace OI.Metrology.Server.Repository; public class ServiceShopOrderRepository : IServiceShopOrderRepository { - private readonly ILogger _Logger; - - public ServiceShopOrderRepository(ILogger logger) => - _Logger = logger; - private static ServiceShopOrder[] GetServiceShopOrders(Shared.Models.ServiceShop? serviceShop) { ServiceShopOrder[] result = IServiceShopOrder.GetServiceShopOrders(serviceShop); diff --git a/Server/Repositories/ToolTypesRepository.cs b/Server/Repositories/ToolTypesRepository.cs index 52d00bb..f8dbc09 100644 --- a/Server/Repositories/ToolTypesRepository.cs +++ b/Server/Repositories/ToolTypesRepository.cs @@ -1,3 +1,4 @@ +using OI.Metrology.Server.Models; using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; @@ -13,9 +14,9 @@ public class ToolTypesRepository : IToolTypesRepository private readonly string _MockRoot; private readonly string _RepositoryName; - public ToolTypesRepository(string mockRoot) + public ToolTypesRepository(AppSettings appSettings) { - _MockRoot = mockRoot; + _MockRoot = appSettings.MockRoot; _RepositoryName = nameof(ToolTypesRepository)[..^10]; } diff --git a/Server/Repositories/WorkMaterialRepository.cs b/Server/Repositories/WorkMaterialRepository.cs deleted file mode 100644 index abaa6ce..0000000 --- a/Server/Repositories/WorkMaterialRepository.cs +++ /dev/null @@ -1,164 +0,0 @@ -using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Models.Stateless; -using OI.Metrology.Shared.Repositories; -using System.Data; -using System.Data.Common; -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; - -namespace OI.Metrology.Server.Repository; - -public class WorkMaterialRepository : IWorkMaterialRepository -{ - - private readonly string _MockRoot; - private readonly string _RepositoryName; - private readonly IDbConnectionFactory _DBConnectionFactory; - - public WorkMaterialRepository(string mockRoot, IDbConnectionFactory dbConnectionFactory) - { - _MockRoot = mockRoot; - _DBConnectionFactory = dbConnectionFactory; - _RepositoryName = nameof(WorkMaterialRepository)[..^10]; - } - - string IWorkMaterialRepository.GetCommandText(int? workOrderNumber, int? workOrderStep, int? workOrderCassette) - { - StringBuilder result = new(); - _ = result.Append("select ( "). - Append(" select wi.rds_no, "). - Append(" rr.reactor, "). - Append(" wi.pocket_no, "). - Append(" wi.zone, "). - Append(" wi.in_cass_no, "). - Append(" wi.slot_no [in_slot_no], "). - Append(" isnull(wo.out_cass_no, -1) [out_cass_no], "). - Append(" isnull(wo.slot_no, -1) [out_slot_no], "). - Append(" rr.ps_no, "). - Append(" rr.recipe_name, "). - Append(" rr.recipe_no, "). - Append(" rr.spec_type "). - Append(" from lsl2sql.dbo.wm_in_slot_no wi "). - Append(" inner join lsl2sql.dbo.react_run rr "). - Append(" on wi.wo_no = rr.wo_no "). - Append(" and wi.rds_no = rr.rds_no "). - Append(" left join lsl2sql.dbo.wm_out_slot wo "). - Append(" on wo.wo_no = wi.wo_no "). - Append(" and wo.rds = wi.rds_no "). - Append(" and wo.in_cass_no = wi.in_cass_no "). - Append(" and wo.in_slot_no = wi.slot_no "). - Append(" where wi.wo_no = ").Append(workOrderNumber is null ? -1 : workOrderNumber.Value).Append(' '). - Append(" and wi.rds_no = wm.rds "). - Append(" order by wi.in_cass_no, wi.slot_no "). - Append(" for json path "). - Append(" ) [group] "). - Append("from lsl2sql.dbo.wm_out_slot wm "). - Append("where wm.wo_no = ").Append(workOrderNumber is null ? -1 : workOrderNumber.Value).Append(' '). - Append(" and wm.proc_step_no = ").Append(workOrderStep is null ? -1 : workOrderStep.Value).Append(' '). - Append(" and wm.out_cass_no = ").Append(workOrderCassette is null ? -1 : workOrderCassette.Value).Append(' '). - Append("group by wm.rds "). - Append("order by wm.rds "). - Append("for json path "); - return result.ToString(); - } - - private static (int?, int?, int?, bool) GetWorkOrder(string mid) - { - int? workOrderStep = null; - int? workOrderNumber = null; - MatchCollection[] collection; - int? workOrderCassette = null; - if (string.IsNullOrEmpty(mid)) - collection = Array.Empty(); - else - { - string pattern = @"^([oiOI])?([0-9]{6,7})\.([0-5]{1})\.([0-9]{1,2})$"; // o171308.1.51 - collection = (from l in mid.Split('-') select Regex.Matches(l, pattern)).ToArray(); - } - foreach (MatchCollection matchCollection in collection) - { - if (matchCollection.Count == 0) - continue; - if (!matchCollection[0].Success || matchCollection[0].Groups.Count != 5) - continue; - if (!int.TryParse(matchCollection[0].Groups[3].Value, out int workOrderStepValue)) - continue; - if (!int.TryParse(matchCollection[0].Groups[2].Value, out int workOrderNumberValue)) - continue; - if (!int.TryParse(matchCollection[0].Groups[4].Value, out int workOrderCassetteValue)) - continue; - workOrderStep = workOrderStepValue; - workOrderNumber = workOrderNumberValue; - workOrderCassette = workOrderCassetteValue; - break; - } - return new(workOrderNumber, workOrderStep, workOrderCassette, workOrderStep is not null || workOrderNumber is not null || workOrderCassette is not null); - } - - private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText) - { - StringBuilder stringBuilder = new(); - using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useOI2Sql: true); - DbCommand dbCommand = dbConnection.CreateCommand(); - dbCommand.CommandText = commandText; - DbDataReader dbDataReader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess); - while (dbDataReader.Read()) - _ = stringBuilder.Append(dbDataReader.GetString(0)); - return stringBuilder; - } - - Result IWorkMaterialRepository.GetCassette(string mid) - { - Result? result; - if (!string.IsNullOrEmpty(_MockRoot)) - { - string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IWorkMaterialRepository.GetCassette)}.json")); - result = JsonSerializer.Deserialize>(json); - if (result is null) - throw new NullReferenceException(nameof(result)); - } - else - { - WorkMaterialV2[] results; - (int? workOrderNumber, int? workOrderStep, int? workOrderCassette, bool isWorkOrder) = GetWorkOrder(mid); - if (!isWorkOrder) - results = Array.Empty(); - else - { - WorkMaterial[]? group; - JsonProperty[] jsonProperties; - List collection = new(); - IWorkMaterialRepository workMaterialRepository = this; - string commandText = workMaterialRepository.GetCommandText(workOrderNumber, workOrderStep, workOrderCassette); - StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText); - JsonElement[]? jsonElements = stringBuilder.Length == 0 ? Array.Empty() : JsonSerializer.Deserialize(stringBuilder.ToString()); - if (jsonElements is null) - throw new NullReferenceException(nameof(jsonElements)); - foreach (JsonElement jsonElement in jsonElements) - { - if (jsonElement.ValueKind != JsonValueKind.Object) - continue; - jsonProperties = jsonElement.EnumerateObject().ToArray(); - if (jsonProperties.Length == 0) - continue; - group = JsonSerializer.Deserialize(jsonProperties.First().Value.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); - if (group is null) - continue; - foreach (WorkMaterial workMaterial in group) - collection.Add(workMaterial); - } - if (collection is null) - throw new NullReferenceException(nameof(collection)); - results = WorkMaterial.Convert(collection); - } - result = new() - { - Results = results, - TotalRows = results.Length, - }; - } - return result; - } - -} \ No newline at end of file diff --git a/Server/Views/Shared/_Layout.cshtml b/Server/Views/Shared/_Layout.cshtml index 8d598cf..9580bc4 100644 --- a/Server/Views/Shared/_Layout.cshtml +++ b/Server/Views/Shared/_Layout.cshtml @@ -73,7 +73,6 @@
  • @Html.ActionLink("Run Information", "RunInfo", "Pages", new { area = "" }, null)
  • @Html.ActionLink("Run Headers", "RunHeaders", "Pages", new { area = "" }, null)
  • @Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)
  • -
  • @Html.ActionLink("Work Material", "WorkMaterial", "Reactors", new { area = "" }, null)
  • Archive