using Microsoft.Extensions.Logging; using ReportingServices.Shared.Models.PlanningReport; using ReportingServices.Shared.Models.ProductionReport; using ReportingServices.Shared.ViewModels.ProductionReport; namespace ReportingServices.Shared.HelperClasses; public static class DailyReportHelper { public static DailyReport SetUpDailyReport(ILogger logger, Dictionary filePaths, string baseUrlScrapeDb) { DailyReport report = new(); DateTime currentDateTime = DateTime.Now; try { List tools = JsonFileHandler.LoadJSONFile>(filePaths["SLL"]); ManualReportEntries manualEntries = JsonFileHandler.LoadJSONFile(filePaths["DailyReport"]); if (currentDateTime.DayOfWeek == DayOfWeek.Monday && tools[^1].Date == currentDateTime.Date.AddDays(-1)) report.SLLTools = new List(); else report.SLLTools = tools; report.ManualReportEntries = manualEntries; report.ToolStatesByOwner = JsonFileHandler.LoadJSONFile>>(filePaths["ToolStateOwners"]); } catch (Exception ex) { logger.LogError(ex, "Failed to load JsonFiles."); logger.LogInformation("SLL File Path: {path}", filePaths["SLL"]); logger.LogInformation("Manual Report Entries File Path: {path}", filePaths["DailyReport"]); } List cleanTools = new() { "AHPS", "AKRION1", "CB3", "MES", "SRD 1", "SRD 2" }; List metrologyTools = new() { "ASET", "BIORAD2", "BIORAD3", "BIORAD4", "BIORAD5", "CDE2", "CDE3", "CDE5", "FLEXUS", "HGCV1", "HGCV2", "HGCV3", "SRP", "TENCOR3" }; List reactors = new(); Dictionary> lastUpTransactions = new(); List>> toolEvents = new(); List> cleanEvents = new(); List> metrologyEvents = new(); Task task1 = null; Task task2 = null; Task targets = null; Task previousTargets = null; Task> rds = null; Task task3 = null; Task task4 = null; Task task5 = null; Task task6 = null; Task> task7 = null; Task> task8 = null; Task> task9 = null; Task> task10 = null; Task> task11 = null; Task task12 = null; Task task13 = null; try { reactors = ApiCaller.GetApi>(baseUrlScrapeDb + "Reactors").Result; foreach (Reactor reactor in reactors) { toolEvents.Add(ApiCaller.GetApi>(baseUrlScrapeDb + "ReactorEvents?startDate=" + report.StartDate.ToString() + "&endDate=" + currentDateTime.ToString() + "&reactorNumber=" + reactor.ReactorNumber + "&reactorType=" + reactor.Type)); lastUpTransactions.Add(reactor.ReactorNumber.ToString(), ApiCaller.GetApi(baseUrlScrapeDb + "GetLastUpTransaction?reactorNumber=" + reactor.ReactorNumber)); } foreach (string tool in cleanTools) { cleanEvents.Add(ApiCaller.GetApi(baseUrlScrapeDb + "ToolEvents?toolID=" + tool)); } foreach (string tool in metrologyTools) { metrologyEvents.Add(ApiCaller.GetApi(baseUrlScrapeDb + "ToolEvents?toolID=" + tool)); } task1 = ApiCaller.GetApi(baseUrlScrapeDb + "ReactorOuts?startDate=" + report.StartDate.ToString() + "&endDate=" + currentDateTime.ToString()); task2 = ApiCaller.GetApi(baseUrlScrapeDb + "ReactorOuts?startDate=" + report.StartDate.AddDays(-7).ToString() + "&endDate=" + report.StartDate.ToString()); task3 = ApiCaller.GetApi(baseUrlScrapeDb + "GetQuarterStartDate"); task12 = ApiCaller.GetApi(baseUrlScrapeDb + "GetPreviousQuarterStartDate"); targets = ApiCaller.GetApi(baseUrlScrapeDb + "Targets"); previousTargets = ApiCaller.GetApi(baseUrlScrapeDb + "Targets"); rds = ApiCaller.GetApi>(baseUrlScrapeDb + "RDS?date=" + report.StartDate.ToString()); task4 = ApiCaller.GetApi(baseUrlScrapeDb + "GetOutsAndScrapTotals?startDate=" + task3.Result + "&endDate=" + currentDateTime.ToString()); task13 = ApiCaller.GetApi(baseUrlScrapeDb + "GetOutsAndScrapTotals?startDate=" + task12.Result + "&endDate=" + report.StartDate.ToString()); task5 = ApiCaller.GetApi(baseUrlScrapeDb + "GetOutsAndScrapTotals?startDate=" + task3.Result + "&endDate=" + report.StartDate.ToString()); string newStartTime = ""; if (report.StartDate.AddDays(-7) < DateTime.Parse(task3.Result.ToString())) newStartTime = task12.Result.ToString(); else newStartTime = task3.Result.ToString(); task6 = ApiCaller.GetApi(baseUrlScrapeDb + "GetOutsAndScrapTotals?startDate=" + newStartTime + "&endDate=" + report.StartDate.AddDays(-7).ToString()); task7 = ApiCaller.GetApi>(baseUrlScrapeDb + "GetCurrentHotWORunning"); task8 = ApiCaller.GetApi>(baseUrlScrapeDb + "GetReactorPartChanges?startDate=" + currentDateTime.Date.ToString() + "&endDate=" + currentDateTime.ToString()); task9 = ApiCaller.GetApi>(baseUrlScrapeDb + "GetProjectedPartChanges?startDate=" + currentDateTime.ToString() + "&endDate=" + currentDateTime.Date.AddDays(1).ToString()); task10 = ApiCaller.GetApi>(baseUrlScrapeDb + "GetReactorPartChanges?startDate=" + report.StartDate.ToString() + "&endDate=" + currentDateTime.ToString()); task11 = ApiCaller.GetApi>(baseUrlScrapeDb + "GetProjectedPartChanges?startDate=" + currentDateTime.ToString() + "&endDate=" + report.StartDate.AddDays(7).ToString()); } catch (Exception ex) { logger.LogCritical(ex, "Failed to send get requests to scrapedb endpoints."); } try { report.QuarterlyTargets = targets.Result; report.PreviousQuarterlyTargets = previousTargets.Result; report.SetRDSInfo(rds.Result); foreach (Task> task in toolEvents) { ToolEventView toolEvent = new(task.Result, report.StartDate.ToString(), currentDateTime.ToString(), task.Result[0].REACT_NO, reactors.FirstOrDefault(x => x.ReactorNumber == int.Parse(task.Result[0].REACT_NO)).Type); toolEvent.SetDowntime(lastUpTransactions[toolEvent.Reactor].Result); report.ToolEvents.Add(toolEvent); } report.SetReactorInfo(reactors, GetUnscheduledReactors(report)); report.ToolEvents = report.ToolEvents .OrderBy(x => x.Reactor) .ToList(); foreach (Task task in cleanEvents) report.CleanEvents.Add(task.Result); foreach (Task task in metrologyEvents) report.MetrologyEvents.Add(task.Result); report.CleanEvents = report.CleanEvents.Where(x => (x.TOOL_MODE != "PROD" || x.TOOL_MODE_DESC != "Production") && x.TOOL_MODE != "OUT").ToList(); report.MetrologyEvents = report.MetrologyEvents.Where(x => (x.TOOL_MODE != "PROD" || x.TOOL_MODE_DESC != "Production") && x.TOOL_MODE != "OUT").ToList(); report.QuarterStartDate = task3.Result; report.PreviousQuarterStartDate = task12.Result; report.CurrentWeek.SetYieldInformation(task1.Result, report.QuarterlyTargets, report.QuarterStartDate, task5.Result.Outs - task5.Result.CustomerScrap - task5.Result.ManufacturingScrap - task5.Result.ProductionScrap); if (report.PreviousWeek.StartDate < report.QuarterStartDate) report.PreviousWeek.SetYieldInformation(task2.Result, report.PreviousQuarterlyTargets, report.PreviousQuarterStartDate, task6.Result.Outs - task6.Result.CustomerScrap - task6.Result.ManufacturingScrap - task6.Result.ProductionScrap); else report.PreviousWeek.SetYieldInformation(task2.Result, report.QuarterlyTargets, report.QuarterStartDate, task6.Result.Outs - task6.Result.CustomerScrap - task6.Result.ManufacturingScrap - task6.Result.ProductionScrap); report.CurrentWeek.QTDOutsAndScrap = task4.Result; if (report.PreviousWeek.StartDate < report.QuarterStartDate) report.PreviousWeek.QTDOutsAndScrap = task13.Result; else report.PreviousWeek.QTDOutsAndScrap = task4.Result; report.CurrentHotWORunning = task7.Result; if (report.CurrentHotWORunning.Contains("R40")) report.CurrentHotWORunning.Add("R42"); if (report.CurrentHotWORunning.Contains("R44")) report.CurrentHotWORunning.Add("R46"); if (report.CurrentHotWORunning.Contains("R48")) report.CurrentHotWORunning.Add("R50"); report.CurrentHotWORunning.Sort(); report.CompletedDailyPartChanges = task8.Result; report.ProjectedDailyPartChanges = task9.Result; report.CompletedWeeklyPartChanges = task10.Result; report.ProjectedWeeklyPartChanges = task11.Result; } catch (Exception ex) { logger.LogCritical(ex, "Failed to retrieve data back from Scrape DB endpoints."); } report.ReverseLists(); ManualReportEntries entries = report.ManualReportEntries; List sll = report.SLLTools; try { JsonFileHandler.SaveJSONFile(entries, filePaths["DailyReport"]); JsonFileHandler.SaveJSONFile(sll, filePaths["SLL"]); } 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 (ToolEventView tool in report.ToolEvents) { if (tool.MostRecentEvent.REACT_MODE.ToUpper() == "IDLE") { reactors.Add(int.Parse(tool.Reactor)); } } return reactors; } }