using ReportingServices.ReportingObjects; using System.Text.Json; namespace ReportingServices.HelperClasses { public class APICaller { public List OutsByDay { get; set; } public List ScrapByDay { get; set; } public Dictionary ToolAvailibilityByTypes { get; set; } public Dictionary ToolStateByTypes { get; set; } private readonly string fabTimeServer = "http://messa004.infineon.com/fabtime717service/GetChartData.aspx?"; private Dictionary Parameters = new(); private readonly string toolFilter = "~R76%2C%20~R78%2C%20~R25%2C%20~R67%2C%20~R69%2C%20~R71%2C%20~R47%2C%20~R51%2C%20~R28"; public APICaller() { Parameters.Add("chart", ""); Parameters.Add("starttime", DetermineStartDate()); Parameters.Add("endtime", DetermineEndDate()); Parameters.Add("periodlen", ""); Parameters.Add("areaslike", ""); Parameters.Add("toolsslike", ""); Parameters.Add("operationslike", ""); Parameters.Add("capacitytypeslike", ""); Parameters.Add("login", "administrator"); Parameters.Add("password", "admin"); Parameters.Add("fabtimeauthentication", "1"); ToolAvailibilityByTypes = new(); ToolStateByTypes = new(); } public void CallAllAPIs() { Task[] tasks = new Task[7]; tasks[0] = MovesTrendCaller(); tasks[1] = ToolStateTrendCaller("ASM"); tasks[2] = ToolStateTrendCaller("EPP"); tasks[3] = ToolStateTrendCaller("HTR"); tasks[4] = ToolStatesCaller("ASM"); tasks[5] = ToolStatesCaller("EPP"); tasks[6] = ToolStatesCaller("HTR"); Task.WaitAll(tasks); ReverseLists(); } public async Task MovesTrendCaller() { Dictionary parameters = Parameters; parameters["chart"] = "MOVESLOTLIST"; parameters["areaslike"] = "CLEANROOM"; parameters["operationslike"] = "1UNLOAD"; List outsByDay = await GetJsonData(GetAPIURL(parameters)); GetReactorOutsByDay(outsByDay); DBCaller db = new(); ScrapByDay = db.GetScrap(outsByDay); } public async Task ToolStateTrendCaller(string toolType) { Dictionary parameters = Parameters; parameters["chart"] = "TOOLSTATE"; parameters["periodlen"] = "24"; parameters["capacitytypeslike"] = toolType; parameters["toolslike"] = toolFilter; List toolAvailability = await GetJsonData(GetAPIURL(parameters)); ToolAvailibilityByTypes.Add(toolType, new ToolAvailibilityByType(toolAvailability)); } public async Task ToolStatesCaller(string toolType) { Dictionary parameters = Parameters; parameters["starttime"] = DetermineStartDate(DateTime.Now.ToString(), 12.5f); parameters["chart"] = "ToolStateGantt"; parameters["periodlen"] = "24"; parameters["capacitytypeslike"] = toolType == "ASM" ? toolType + "%2CASM%2B" : toolType; parameters["toolslike"] = toolFilter; List toolStates = await GetJsonData(GetAPIURL(parameters)); ToolStateByTypes.Add(toolType, new ToolStateByType(toolStates)); } private async Task> GetJsonData(string url) { List deserializedJson; using (var httpClient = new HttpClient()) { using (var response = await httpClient.GetAsync(url)) { string apiResponse = await response.Content.ReadAsStringAsync(); deserializedJson = JsonSerializer.Deserialize>(apiResponse); } } return deserializedJson; } public string DetermineStartDate(string date = null) { if (!DateTime.TryParse(date, out DateTime startDate)) startDate = DateTime.Now.Date; int dayOfWeek = (int)startDate.DayOfWeek; switch (dayOfWeek) { case 0: startDate = startDate.AddDays(-6); break; case 1: startDate = startDate.AddDays(-7); break; case 2: startDate = startDate.AddDays(-1); break; case 3: startDate = startDate.AddDays(-2); break; case 4: startDate = startDate.AddDays(-3); break; case 5: startDate = startDate.AddDays(-4); break; case 6: startDate = startDate.AddDays(-5); break; default: break; } return startDate.Year + "-" + startDate.Month + "-" + startDate.Day + "%200%3A0%3A0"; } public string DetermineStartDate(string date, float numberOfHours) { DateTime startDate = DateTime.Parse(date); startDate = startDate.AddHours(-numberOfHours); return startDate.Year + "-" + startDate.Month + "-" + startDate.Day + "%20" + startDate.Hour + "%3A" + startDate.Minute + "%3A" + startDate.Second; } public string DetermineEndDate(string date = null) { if (!DateTime.TryParse(date, out DateTime endDate)) endDate = DateTime.Now; return endDate.Year + "-" + endDate.Month + "-" + endDate.Day + "%20" + endDate.Hour + "%3A" + endDate.Minute + "%3A" + endDate.Second; } public string GetAPIURL(Dictionary parameters) { int count = 0; string url = fabTimeServer; foreach (KeyValuePair pair in parameters) { if (pair.Value != "") url = url + pair.Key + "=" + pair.Value; if (count != parameters.Count - 1 && !string.IsNullOrEmpty(pair.Value)) url = url + "&"; count++; } return url; } public void GetReactorOutsByDay(List outs) { List outsByDay = new(); List dates = GetDistinctDates(outs); foreach (string date in dates) { int waferCount = 0; foreach (ReactorOutsByRDS rout in outs) { if (DateTime.Parse(rout.EndProcessTime).Date.ToString() == date) waferCount += (int)float.Parse(rout.Units); } outsByDay.Add(new ReactorOutsByDay(date, waferCount)); } OutsByDay = outsByDay; } public List GetDistinctDates(List outs) { List dates = new(); foreach (ReactorOutsByRDS rout in outs) { if (!dates.Contains(DateTime.Parse(rout.EndProcessTime).Date.ToString())) dates.Add(DateTime.Parse(rout.EndProcessTime).Date.ToString()); } return dates; } public void ReverseLists() { List temp2 = new(); for (int i = ScrapByDay.Count - 1; i >= 0; i--) { temp2.Add(ScrapByDay[i]); } ScrapByDay = temp2; foreach (KeyValuePair keyValuePair in ToolAvailibilityByTypes) { List temp3 = new(); for (int i = keyValuePair.Value.EquipmentStates.Count - 1; i >= 0; i--) { temp3.Add(keyValuePair.Value.EquipmentStates[i]); } } } } }