using Microsoft.Extensions.Logging; using ReportingServices.Shared.Models.ProductionReport; using ReportingServices.Shared.ViewModels.ProductionReport; namespace ReportingServices.Shared.HelperClasses { public static class DailyReportHelper { private static readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json"; private static readonly string _SLLFilePath = "wwwroot/Assets/SLLTools.json"; public static DailyReport SetUpDailyReport(ILogger logger, string baseUrlFabtime, string baseUrlScrapeDb) { List>> tasksEQState = new(); List>> tasksState = new(); DailyReport report = new(); try { report.SLLTools = JsonFileHandler.LoadJSONFile>(_SLLFilePath); report.ManualReportEntries = JsonFileHandler.LoadJSONFile(_dailyRptFilePath); } catch (Exception ex) { logger.LogError(ex, "Failed to load JsonFiles."); logger.LogInformation("SLL File Path: {path}", _SLLFilePath); logger.LogInformation("Manual Report Entries File Path: {path}", _dailyRptFilePath); } Task task1 = null; Task task2 = null; try { task1 = ApiCaller.GetApi(baseUrlFabtime + "ReactorOuts?startDate=" + report.StartDate.ToString() + "&endDate=" + DateTime.Now.ToString()); task2 = ApiCaller.GetApi(baseUrlFabtime + "ReactorOuts?startDate=" + report.StartDate.AddDays(-7).ToString() + "&endDate=" + report.StartDate.ToString()); tasksEQState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolStateTrend?toolType=ASM")); tasksEQState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolStateTrend?toolType=EPP")); tasksEQState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolStateTrend?toolType=HTR")); tasksState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolState?toolType=ASM")); tasksState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolState?toolType=EPP")); tasksState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolState?toolType=HTR")); tasksState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolState?toolType=Metrology")); tasksState.Add(ApiCaller.GetApi>(baseUrlFabtime + "ToolState?toolType=Cleans")); } catch (Exception ex) { logger.LogCritical(ex, "Failed to send get requests to fabtime endpoints."); } Task targets = null; Task> rds = null; Task> reactors = null; try { targets = ApiCaller.GetApi(baseUrlScrapeDb + "Targets"); rds = ApiCaller.GetApi>(baseUrlScrapeDb + "RDS?date=" + report.StartDate.ToString()); reactors = ApiCaller.GetApi>(baseUrlScrapeDb + "Reactors"); } catch (Exception ex) { logger.LogCritical(ex, "Failed to send get requests to scrapedb endpoints."); } try { report.AddToolAvailibilityByType("ASM", tasksEQState[0].Result); report.AddToolAvailibilityByType("EPP", tasksEQState[1].Result); report.AddToolAvailibilityByType("HTR", tasksEQState[2].Result); report.AddToolStateByType("ASM", tasksState[0].Result); report.AddToolStateByType("EPP", tasksState[1].Result); report.AddToolStateByType("HTR", tasksState[2].Result); report.AddToolStateByType("Metrology", tasksState[3].Result); report.AddToolStateByType("Cleans", tasksState[4].Result); } catch (Exception ex) { logger.LogCritical(ex, "Failed to retrieve data back from Tool State and Tool State Trend FabTime endpoints."); } try { report.QuarterlyTargets = targets.Result; report.SetRDSInfo(rds.Result); report.SetReactorInfo(reactors.Result, GetUnscheduledReactors(report)); } catch (Exception ex) { logger.LogCritical(ex, "Failed to retrieve data back from Scrape DB endpoints."); } try { report.CurrentWeek.SetYieldInformation(task1.Result, report.QuarterlyTargets); report.PreviousWeek.SetYieldInformation(task2.Result, report.QuarterlyTargets); } catch (Exception ex) { logger.LogCritical(ex, "Failed to retreive data back from ReactorOuts and Scrap endpoints."); } report.ReverseLists(); ManualReportEntries entries = report.ManualReportEntries; List sll = report.SLLTools; try { JsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath); JsonFileHandler.SaveJSONFile(sll, _SLLFilePath); } catch (Exception ex) { logger.LogCritical(ex, "Failed to save data back to JSON files."); } return report; } public static List GetUnscheduledReactors(DailyReport report) { List reactors = new(); foreach (KeyValuePair keyValuePairs in report.ToolStateByType) { if (keyValuePairs.Key != "Metrology" && keyValuePairs.Key != "Cleans") { foreach (ToolStateCurrent tool in keyValuePairs.Value.ToolStateCurrents) { if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service") { reactors.Add(int.Parse(tool.Tool.Substring(1))); } } } } return reactors; } } }