2022-11-30 13:15:01 -07:00

242 lines
8.2 KiB
C#

using ReportingServices.ReportingObjects;
using System.Text.Json;
namespace ReportingServices.HelperClasses
{
public class APICaller
{
public List<ReactorOutsByDay> OutsByDay { get; set; }
public List<ScrapByDay> ScrapByDay { get; set; }
public Dictionary<string, ToolAvailibilityByType> ToolAvailibilityByTypes { get; set; }
public Dictionary<string, ToolStateByType> ToolStateByTypes { get; set; }
private readonly string fabTimeServer = "http://messa004.infineon.com/fabtime717service/GetChartData.aspx?";
private Dictionary<string, string> 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<string, string> parameters = Parameters;
parameters["chart"] = "MOVESLOTLIST";
parameters["areaslike"] = "CLEANROOM";
parameters["operationslike"] = "1UNLOAD";
List<ReactorOutsByRDS> outsByDay = await GetJsonData<ReactorOutsByRDS>(GetAPIURL(parameters));
GetReactorOutsByDay(outsByDay);
DBCaller db = new();
ScrapByDay = db.GetScrap(outsByDay);
}
public async Task ToolStateTrendCaller(string toolType)
{
Dictionary<string, string> parameters = Parameters;
parameters["chart"] = "TOOLSTATE";
parameters["periodlen"] = "24";
parameters["capacitytypeslike"] = toolType;
parameters["toolslike"] = toolFilter;
List<EquipmentStateByDay> toolAvailability = await GetJsonData<EquipmentStateByDay>(GetAPIURL(parameters));
ToolAvailibilityByTypes.Add(toolType, new ToolAvailibilityByType(toolAvailability));
}
public async Task ToolStatesCaller(string toolType)
{
Dictionary<string, string> 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<ToolStateCurrent> toolStates = await GetJsonData<ToolStateCurrent>(GetAPIURL(parameters));
ToolStateByTypes.Add(toolType, new ToolStateByType(toolStates));
}
private async Task<List<T>> GetJsonData<T>(string url)
{
List<T> deserializedJson;
using (var httpClient = new HttpClient())
{
using (var response = await httpClient.GetAsync(url))
{
string apiResponse = await response.Content.ReadAsStringAsync();
deserializedJson = JsonSerializer.Deserialize<List<T>>(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<string, string> parameters)
{
int count = 0;
string url = fabTimeServer;
foreach (KeyValuePair<string, string> 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<ReactorOutsByRDS> outs)
{
List<ReactorOutsByDay> outsByDay = new();
List<string> 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<string> GetDistinctDates(List<ReactorOutsByRDS> outs)
{
List<string> 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<ScrapByDay> temp2 = new();
for (int i = ScrapByDay.Count - 1; i >= 0; i--)
{
temp2.Add(ScrapByDay[i]);
}
ScrapByDay = temp2;
foreach (KeyValuePair<string, ToolAvailibilityByType> keyValuePair in ToolAvailibilityByTypes)
{
List<EquipmentStateByDay> temp3 = new();
for (int i = keyValuePair.Value.EquipmentStates.Count - 1; i >= 0; i--)
{
temp3.Add(keyValuePair.Value.EquipmentStates[i]);
}
}
}
}
}