Added data pull for previous week and capability for production passdown to view previous week data, added tool state mapping json file and production passdown report shows owners, removed unnecessary jQuery package.
This commit is contained in:
@ -3,8 +3,6 @@ using ReportingServices.Dependency_Injections;
|
||||
using ReportingServices.HelperClasses;
|
||||
using ReportingServices.Models.ProductionReport;
|
||||
using ReportingServices.ReportingObjects;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Web;
|
||||
|
||||
namespace ReportingServices.Controllers
|
||||
@ -15,7 +13,8 @@ namespace ReportingServices.Controllers
|
||||
private readonly IScrapeDatabaseRepository _scrapeDatabaseRepository;
|
||||
private readonly IFabTimeReportingRepository _fabTimeReportingRepository;
|
||||
private readonly int _reportIndex = (int)DateTime.Now.DayOfWeek;
|
||||
private readonly string _dailyRptFileName = "wwwroot/Assets/DailyReportInfo.json";
|
||||
private readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json";
|
||||
private readonly string _toolStateOwnerFilePath = "wwwroot/Assets/ToolStates.json";
|
||||
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 ProductionReportController(IJsonFileHandler jsonFileHandler, IScrapeDatabaseRepository scrapeDatabaseRepository, IFabTimeReportingRepository fabTimeReportingRepository)
|
||||
@ -34,15 +33,18 @@ namespace ReportingServices.Controllers
|
||||
public IActionResult DailyReport()
|
||||
{
|
||||
DailyReport dailyReport = SetUpDailyReport();
|
||||
Dictionary<string, List<string>> toolStateOwners = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<string>>>(_toolStateOwnerFilePath);
|
||||
|
||||
dailyReport.ToolStatesByOwner = toolStateOwners;
|
||||
|
||||
return View(dailyReport);
|
||||
}
|
||||
|
||||
public IActionResult EditDailyReport()
|
||||
{
|
||||
JsonNode node = _jsonFileHandler.LoadJSONFile<JsonNode>(_dailyRptFileName);
|
||||
Dictionary<string, List<ManualReportEntries>> entries = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
|
||||
|
||||
ManualReportEntries rpt = JsonSerializer.Deserialize<ManualReportEntries>(node[(int)DateTime.Now.DayOfWeek]["Entries"]);
|
||||
ManualReportEntries rpt = entries["Current Week"][_reportIndex];
|
||||
|
||||
return View(rpt);
|
||||
}
|
||||
@ -50,18 +52,21 @@ namespace ReportingServices.Controllers
|
||||
[HttpPost]
|
||||
public IActionResult EditDailyReport(ManualReportEntries rpt)
|
||||
{
|
||||
List<ManualReportEntriesByDay> report = _jsonFileHandler.LoadJSONFile<List<ManualReportEntriesByDay>>(_dailyRptFileName);
|
||||
Dictionary<string, List<ManualReportEntries>> report = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
|
||||
|
||||
report[_reportIndex].Entries = rpt;
|
||||
rpt.Date = DateTime.Parse(DateTime.Now.ToShortDateString());
|
||||
rpt.Day = DateTime.Now.DayOfWeek;
|
||||
|
||||
_jsonFileHandler.SaveJSONFile(report, _dailyRptFileName);
|
||||
report["Current Week"][_reportIndex] = rpt;
|
||||
|
||||
_jsonFileHandler.SaveJSONFile(report, _dailyRptFilePath);
|
||||
|
||||
return RedirectToAction("DailyReport");
|
||||
}
|
||||
|
||||
public async Task<List<ReactorOutsByRDS>> MovesTrendCaller()
|
||||
public async Task<List<ReactorOutsByRDS>> MovesTrendCaller(string startDate = "", string endDate = "")
|
||||
{
|
||||
string url = APIHelperFunctions.GenerateURLWithParameters(chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD");
|
||||
string url = APIHelperFunctions.GenerateURLWithParameters(startDate: startDate, endDate: endDate, chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD");
|
||||
|
||||
List<ReactorOutsByRDS> outsByRDS = await _fabTimeReportingRepository.GetMovesTrendData(url);
|
||||
|
||||
@ -80,7 +85,7 @@ namespace ReportingServices.Controllers
|
||||
public async Task<List<ToolStateCurrent>> ToolStatesCaller(string toolType)
|
||||
{
|
||||
string capacityFilter = toolType == "ASM" ? toolType + "%2CASM%2B" : toolType;
|
||||
string startDate = HttpUtility.UrlEncode(APIHelperFunctions.GetDateWithOffsetAsAPIString(DateTime.Now.ToString(), 12.5f));
|
||||
string startDate = HttpUtility.UrlEncode(APIHelperFunctions.GetDateWithOffsetAsAPIString(DateTime.Now.ToString(), -12.5f));
|
||||
|
||||
string url = APIHelperFunctions.GenerateURLWithParameters(chart: "ToolStateGantt", periodLen: "24",
|
||||
capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate);
|
||||
@ -95,44 +100,82 @@ namespace ReportingServices.Controllers
|
||||
DailyReport report = new();
|
||||
|
||||
Task<List<ReactorOutsByRDS>> task1 = MovesTrendCaller();
|
||||
Task<List<EquipmentStateByDay>> task2 = ToolStateTrendCaller("ASM");
|
||||
Task<List<EquipmentStateByDay>> task3 = ToolStateTrendCaller("EPP");
|
||||
Task<List<EquipmentStateByDay>> task4 = ToolStateTrendCaller("HTR");
|
||||
Task<List<ToolStateCurrent>> task5 = ToolStatesCaller("ASM");
|
||||
Task<List<ToolStateCurrent>> task6 = ToolStatesCaller("EPP");
|
||||
Task<List<ToolStateCurrent>> task7 = ToolStatesCaller("HTR");
|
||||
Task<List<ReactorOutsByRDS>> task2 = MovesTrendCaller(startDate: report.StartDate.AddDays(-7).ToString(), endDate: report.StartDate.ToString());
|
||||
Task<List<EquipmentStateByDay>> task3 = ToolStateTrendCaller("ASM");
|
||||
Task<List<EquipmentStateByDay>> task4 = ToolStateTrendCaller("EPP");
|
||||
Task<List<EquipmentStateByDay>> task5 = ToolStateTrendCaller("HTR");
|
||||
Task<List<ToolStateCurrent>> task6 = ToolStatesCaller("ASM");
|
||||
Task<List<ToolStateCurrent>> task7 = ToolStatesCaller("EPP");
|
||||
Task<List<ToolStateCurrent>> task8 = ToolStatesCaller("HTR");
|
||||
Task<List<ToolStateCurrent>> task9 = ToolStatesCaller("Metrology");
|
||||
Task<List<ToolStateCurrent>> task10 = ToolStatesCaller("Cleans");
|
||||
|
||||
report.SetOutsByDay(task1.Result);
|
||||
report.CurrentWeek.SetOutsByDay(task1.Result);
|
||||
report.PreviousWeek.SetOutsByDay(task2.Result);
|
||||
|
||||
List<ScrapByDay> scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result);
|
||||
List<ScrapByDay> previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result);
|
||||
|
||||
report.SetScrapByDay(scrap);
|
||||
report.AddToolAvailibilityByType("ASM", task2.Result);
|
||||
report.AddToolAvailibilityByType("EPP", task3.Result);
|
||||
report.AddToolAvailibilityByType("HTR", task4.Result);
|
||||
report.AddToolStateByType("ASM", task5.Result);
|
||||
report.AddToolStateByType("EPP", task6.Result);
|
||||
report.AddToolStateByType("HTR", task7.Result);
|
||||
report.CurrentWeek.SetScrapByDay(scrap);
|
||||
report.PreviousWeek.SetScrapByDay(previousScrap);
|
||||
report.AddToolAvailibilityByType("ASM", task3.Result);
|
||||
report.AddToolAvailibilityByType("EPP", task4.Result);
|
||||
report.AddToolAvailibilityByType("HTR", task5.Result);
|
||||
report.AddToolStateByType("ASM", task6.Result);
|
||||
report.AddToolStateByType("EPP", task7.Result);
|
||||
report.AddToolStateByType("HTR", task8.Result);
|
||||
report.AddToolStateByType("Metrology", task9.Result);
|
||||
report.AddToolStateByType("Cleans", task10.Result);
|
||||
report.ReverseLists();
|
||||
|
||||
int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize();
|
||||
report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets();
|
||||
|
||||
int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize("''");
|
||||
|
||||
report.NumberOfToolsWaferSize6IN = toolsByWaferSize[0];
|
||||
report.NumberOfToolsWaferSize8IN = toolsByWaferSize[1];
|
||||
|
||||
List<ManualReportEntriesByDay> entries = _jsonFileHandler.LoadJSONFile<List<ManualReportEntriesByDay>>(_dailyRptFileName);
|
||||
string reactors = "";
|
||||
|
||||
report.Entries = entries;
|
||||
foreach (KeyValuePair<string, ToolStateByType> 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 = reactors + "'" + tool.Tool.Substring(1) + "', ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reactors = reactors.Substring(0, reactors.Length - 2);
|
||||
|
||||
int[] toolsByWaferSizeScheduled = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize(reactors);
|
||||
|
||||
report.NumberOfToolsWaferSize6INScheduled = toolsByWaferSizeScheduled[0];
|
||||
report.NumberOfToolsWaferSize8INScheduled = toolsByWaferSizeScheduled[1];
|
||||
|
||||
Dictionary<string, List<ManualReportEntries>> entries = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
|
||||
|
||||
report.CurrentEntries = entries["Current Week"];
|
||||
report.PreviousEntries = entries["Previous Week"];
|
||||
|
||||
int[] singleLoadLocks = _scrapeDatabaseRepository.GetNumberOfSingleLoadLocks();
|
||||
|
||||
report.Entries[_reportIndex].Entries.ASMSingleLoadLock = singleLoadLocks[0];
|
||||
report.Entries[_reportIndex].Entries.HTRSingleLoadLock = singleLoadLocks[1];
|
||||
report.CurrentEntries[_reportIndex].ASMSingleLoadLock = singleLoadLocks[0];
|
||||
report.CurrentEntries[_reportIndex].HTRSingleLoadLock = singleLoadLocks[1];
|
||||
|
||||
int[] unloadTempsLessThan700 = _scrapeDatabaseRepository.GetNumberOfToolUnloadTempsLessThan700();
|
||||
|
||||
report.Entries[_reportIndex].Entries.ASMUnloadTempsLessThan700 = unloadTempsLessThan700[0];
|
||||
report.Entries[_reportIndex].Entries.HTRUnloadTempsLessThan700 = unloadTempsLessThan700[1];
|
||||
report.CurrentEntries[_reportIndex].ASMUnloadTempsLessThan700 = unloadTempsLessThan700[0];
|
||||
report.CurrentEntries[_reportIndex].HTRUnloadTempsLessThan700 = unloadTempsLessThan700[1];
|
||||
|
||||
entries["Current Week"] = report.CurrentEntries;
|
||||
|
||||
_jsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath);
|
||||
|
||||
return report;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
using ReportingServices.Models.PlanningReport;
|
||||
using ReportingServices.ReportingObjects;
|
||||
using System.Data;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ReportingServices.Dependency_Injections
|
||||
{
|
||||
@ -126,7 +125,7 @@ namespace ReportingServices.Dependency_Injections
|
||||
return weeklyPartChanges;
|
||||
}
|
||||
|
||||
public int[] GetNumberOfToolsByWaferSize()
|
||||
public int[] GetNumberOfToolsByWaferSize(string reactors)
|
||||
{
|
||||
int[] singleLoadLocks = new int[2];
|
||||
|
||||
@ -141,6 +140,7 @@ namespace ReportingServices.Dependency_Injections
|
||||
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
||||
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
||||
" AND REACT_ASSIGNMENT <> '' " +
|
||||
" AND REACT_NO NOT IN (" + reactors + ") " +
|
||||
"GROUP BY SUSC_POCKET_SIZE";
|
||||
|
||||
cmd.CommandText = query;
|
||||
@ -171,7 +171,7 @@ namespace ReportingServices.Dependency_Injections
|
||||
|
||||
SqlCommand cmd = _connection.CreateCommand();
|
||||
|
||||
string query = "SELECT REACT_TYPE, COUNT(ACTIVE_LL_DISABLED) AS SLL" +
|
||||
string query = "SELECT REACT_TYPE, SUM(CASE WHEN ACTIVE_LL_DISABLED <> '' AND ACTIVE_LL_DISABLED IS NOT NULL THEN 1 ELSE 0 END) AS SLL" +
|
||||
" FROM REACTOR " +
|
||||
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
||||
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
||||
@ -232,5 +232,52 @@ namespace ReportingServices.Dependency_Injections
|
||||
|
||||
return unloadTempTools;
|
||||
}
|
||||
|
||||
public QuarterlyTargets GetQuarterlyTargets()
|
||||
{
|
||||
Dictionary<string, float> targets = new();
|
||||
|
||||
OpenConnection();
|
||||
|
||||
SqlCommand cmd = _connection.CreateCommand();
|
||||
|
||||
string query = "SELECT THRU_TARGET, THRU_QTY, THRU_PCNT FROM FISCAL_QTR_TARGETS " +
|
||||
" WHERE THRU_GROUP = 'TOT' " +
|
||||
" AND FISCAL_YR = " +
|
||||
" (SELECT FISCAL_YR FROM FISCAL_QTR " +
|
||||
" WHERE START_DT < SYSDATETIME() " +
|
||||
" AND END_DT > SYSDATETIME()) " +
|
||||
" AND FISCAL_QTR = " +
|
||||
" (SELECT FISCAL_QTR FROM FISCAL_QTR " +
|
||||
" WHERE START_DT < SYSDATETIME() " +
|
||||
" AND END_DT > SYSDATETIME()) ";
|
||||
|
||||
cmd.CommandText = query;
|
||||
|
||||
using (SqlDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while(reader.Read())
|
||||
{
|
||||
if (reader[0].ToString().ToUpper() == "YIELD")
|
||||
targets.Add(reader[0].ToString(), float.Parse(reader[2].ToString()));
|
||||
else if (!string.IsNullOrEmpty(reader[1].ToString()))
|
||||
targets.Add(reader[0].ToString(), int.Parse(reader[1].ToString()));
|
||||
}
|
||||
}
|
||||
|
||||
cmd.Dispose();
|
||||
|
||||
CloseConnection();
|
||||
|
||||
QuarterlyTargets quarterlyTargets = new()
|
||||
{
|
||||
Reactor_Outs = (int)targets["Reactor_Outs"],
|
||||
Yield_Outs = (int)targets["Yield_Outs"],
|
||||
IFX_Scrap = (int)targets["IFX_Scrap"],
|
||||
Yield = targets["Yield"]
|
||||
};
|
||||
|
||||
return quarterlyTargets;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,8 +10,9 @@ namespace ReportingServices.Dependency_Injections
|
||||
public List<ScrapByDay> GetScrapByDay(List<ReactorOutsByRDS> outs);
|
||||
public List<ReactorPSNWORuns> GetReactorPSNWORuns(string startDate, string endDate);
|
||||
public int GetNumberOfPartChanges(string startDate, string endDate);
|
||||
public int[] GetNumberOfToolsByWaferSize();
|
||||
public int[] GetNumberOfToolsByWaferSize(string reactors);
|
||||
public int[] GetNumberOfSingleLoadLocks();
|
||||
public int[] GetNumberOfToolUnloadTempsLessThan700();
|
||||
public QuarterlyTargets GetQuarterlyTargets();
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,4 @@
|
||||
using ReportingServices.Dependency_Injections;
|
||||
using ReportingServices.ReportingObjects;
|
||||
using System.Web;
|
||||
using System.Web;
|
||||
|
||||
namespace ReportingServices.HelperClasses
|
||||
{
|
||||
@ -45,13 +43,13 @@ namespace ReportingServices.HelperClasses
|
||||
return dateString;
|
||||
}
|
||||
|
||||
public static Dictionary<string, string> SetParameters(string startDate = "", string chart = "", string periodLen = "",
|
||||
public static Dictionary<string, string> SetParameters(string startDate = "", string endDate = "", string chart = "", string periodLen = "",
|
||||
string areasLike = "", string toolsLike = "", string operationsLike = "", string capacityTypesLike = "")
|
||||
{
|
||||
Dictionary<string, string> parameters = new();
|
||||
|
||||
startDate = startDate == "" ? HttpUtility.UrlEncode(GetBeginningOfWeekAsAPIString()) : startDate;
|
||||
string endDate = HttpUtility.UrlEncode(GetDateTimeAsAPIString(DateTime.Now.ToString(), true));
|
||||
endDate = endDate == "" ? HttpUtility.UrlEncode(GetDateTimeAsAPIString(DateTime.Now.ToString(), true)) : endDate;
|
||||
|
||||
parameters.Add("chart", chart);
|
||||
parameters.Add("starttime", startDate);
|
||||
@ -87,10 +85,10 @@ namespace ReportingServices.HelperClasses
|
||||
return url;
|
||||
}
|
||||
|
||||
public static string GenerateURLWithParameters(string startDate = "", string chart = "", string periodLen = "",
|
||||
public static string GenerateURLWithParameters(string startDate = "", string endDate = "", string chart = "", string periodLen = "",
|
||||
string areasLike = "", string toolsLike = "", string operationsLike = "", string capacityTypesLike = "")
|
||||
{
|
||||
Dictionary<string, string> parameters = SetParameters(startDate, chart,
|
||||
Dictionary<string, string> parameters = SetParameters(startDate, endDate, chart,
|
||||
periodLen, areasLike, toolsLike, operationsLike, capacityTypesLike);
|
||||
|
||||
return GenerateURL(parameters);
|
||||
|
@ -5,28 +5,29 @@ namespace ReportingServices.Models.ProductionReport
|
||||
{
|
||||
public class DailyReport
|
||||
{
|
||||
public List<ReactorOutsByDay> OutsByDay { get; set; }
|
||||
public List<ScrapByDay> ScrapByDay { get; set; }
|
||||
public DateTime StartDate { get; set; }
|
||||
public YieldStatistics CurrentWeek { get; set; }
|
||||
public YieldStatistics PreviousWeek { get; set; }
|
||||
public Dictionary<string, List<EquipmentStateByDay>> ToolAvailibilityByType { get; set; }
|
||||
public Dictionary<string, ToolStateByType> ToolStateByType { get; set; }
|
||||
public List<ManualReportEntriesByDay> Entries { get; set; }
|
||||
public Dictionary<string, List<string>> ToolStatesByOwner { get; set; }
|
||||
public List<ManualReportEntries> PreviousEntries { get; set; }
|
||||
public List<ManualReportEntries> CurrentEntries { get; set; }
|
||||
public int NumberOfToolsWaferSize6IN { get; set; }
|
||||
public int NumberOfToolsWaferSize8IN { get; set; }
|
||||
public int NumberOfToolsWaferSize6INScheduled { get; set; }
|
||||
public int NumberOfToolsWaferSize8INScheduled { get; set; }
|
||||
public QuarterlyTargets QuarterlyTargets { get; set; }
|
||||
|
||||
public DailyReport()
|
||||
{
|
||||
ToolAvailibilityByType = new();
|
||||
ToolStateByType = new();
|
||||
}
|
||||
|
||||
public void SetOutsByDay(List<ReactorOutsByRDS> outs)
|
||||
{
|
||||
OutsByDay = GetReactorOutsByDay(outs);
|
||||
}
|
||||
|
||||
public void SetScrapByDay(List<ScrapByDay> scrap)
|
||||
{
|
||||
ScrapByDay = scrap;
|
||||
PreviousEntries = new();
|
||||
CurrentEntries = new();
|
||||
StartDate = DateTime.Parse(APIHelperFunctions.GetBeginningOfWeekAsAPIString());
|
||||
CurrentWeek = new(StartDate, true);
|
||||
PreviousWeek = new(StartDate.AddDays(-7), false);
|
||||
}
|
||||
|
||||
public void AddToolAvailibilityByType(string key, List<EquipmentStateByDay> states)
|
||||
@ -36,49 +37,15 @@ namespace ReportingServices.Models.ProductionReport
|
||||
|
||||
public void AddToolStateByType(string key, List<ToolStateCurrent> states)
|
||||
{
|
||||
ToolStateByType state = new ToolStateByType(states);
|
||||
ToolStateByType state = new(states);
|
||||
|
||||
ToolStateByType.Add(key, state);
|
||||
}
|
||||
|
||||
public static List<string> GetDistinctDatesFromReactorOuts(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 static List<ReactorOutsByDay> GetReactorOutsByDay(List<ReactorOutsByRDS> outs)
|
||||
{
|
||||
List<ReactorOutsByDay> outsByDay = new();
|
||||
|
||||
List<string> dates = GetDistinctDatesFromReactorOuts(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));
|
||||
}
|
||||
|
||||
return outsByDay;
|
||||
}
|
||||
|
||||
public void ReverseLists()
|
||||
{
|
||||
ScrapByDay = APIHelperFunctions.ReverseList(ScrapByDay);
|
||||
CurrentWeek.ScrapByDay = APIHelperFunctions.ReverseList(CurrentWeek.ScrapByDay);
|
||||
PreviousWeek.ScrapByDay = APIHelperFunctions.ReverseList(PreviousWeek.ScrapByDay);
|
||||
|
||||
ToolAvailibilityByType["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]);
|
||||
ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]);
|
||||
|
63
ReportingServices/Models/ProductionReport/YieldStatistics.cs
Normal file
63
ReportingServices/Models/ProductionReport/YieldStatistics.cs
Normal file
@ -0,0 +1,63 @@
|
||||
using ReportingServices.ReportingObjects;
|
||||
|
||||
namespace ReportingServices.Models.ProductionReport
|
||||
{
|
||||
public class YieldStatistics
|
||||
{
|
||||
public DateTime StartDate { get; set; }
|
||||
public List<ReactorOutsByDay> OutsByDay { get; set; }
|
||||
public List<ScrapByDay> ScrapByDay { get; set; }
|
||||
public bool IsCurrentWeek { get; set; }
|
||||
|
||||
public YieldStatistics(DateTime startDate, bool isCurrentWeek)
|
||||
{
|
||||
StartDate = startDate;
|
||||
IsCurrentWeek = isCurrentWeek;
|
||||
}
|
||||
|
||||
public void SetOutsByDay(List<ReactorOutsByRDS> outs)
|
||||
{
|
||||
OutsByDay = GetReactorOutsByDay(outs);
|
||||
}
|
||||
|
||||
public void SetScrapByDay(List<ScrapByDay> scrap)
|
||||
{
|
||||
ScrapByDay = scrap;
|
||||
}
|
||||
|
||||
public static List<string> GetDistinctDatesFromReactorOuts(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 static List<ReactorOutsByDay> GetReactorOutsByDay(List<ReactorOutsByRDS> outs)
|
||||
{
|
||||
List<ReactorOutsByDay> outsByDay = new();
|
||||
|
||||
List<string> dates = GetDistinctDatesFromReactorOuts(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));
|
||||
}
|
||||
|
||||
return outsByDay;
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,8 @@
|
||||
{
|
||||
public class ManualReportEntries
|
||||
{
|
||||
public DayOfWeek Day { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public int OperatorHeadcountDays { get; set; }
|
||||
public int OperatorHeadcountNights { get; set; }
|
||||
public int OperatorCallOutsDays { get; set; }
|
||||
|
@ -1,14 +0,0 @@
|
||||
namespace ReportingServices.ReportingObjects
|
||||
{
|
||||
public class ManualReportEntriesByDay
|
||||
{
|
||||
public DayOfWeek Day { get; set; }
|
||||
public ManualReportEntries Entries { get; set; }
|
||||
|
||||
public ManualReportEntriesByDay(DayOfWeek day, ManualReportEntries entries)
|
||||
{
|
||||
Day = day;
|
||||
Entries = entries;
|
||||
}
|
||||
}
|
||||
}
|
10
ReportingServices/ReportingObjects/QuarterlyTargets.cs
Normal file
10
ReportingServices/ReportingObjects/QuarterlyTargets.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace ReportingServices.ReportingObjects
|
||||
{
|
||||
public class QuarterlyTargets
|
||||
{
|
||||
public int Reactor_Outs { get; set; }
|
||||
public int Yield_Outs { get; set; }
|
||||
public int IFX_Scrap { get; set; }
|
||||
public float Yield { get; set; }
|
||||
}
|
||||
}
|
@ -32,14 +32,14 @@
|
||||
{
|
||||
float elapsedTime = 0f;
|
||||
|
||||
if (ToolStateCurrents[ToolStateCurrents.Count - 1].BasicStateDescription.ToUpper() != "PRODUCTIVE")
|
||||
if (ToolStateCurrents[ToolStateCurrents.Count - 1].BasicStateDescription.ToUpper() != "PRODUCTIVE" && ToolStateCurrents[ToolStateCurrents.Count - 1].BasicStateDescription.ToUpper() != "OUT OF SERVICE")
|
||||
float.Parse(ToolStateCurrents[ToolStateCurrents.Count - 1].GanttElapsedHours);
|
||||
|
||||
for (int i = ToolStateCurrents.Count - 2; i >= 0; i--)
|
||||
{
|
||||
if (ToolStateCurrents[i].Tool == ToolStateCurrents[i + 1].Tool)
|
||||
{
|
||||
if (ToolStateCurrents[i].BasicStateDescription.ToUpper() != "PRODUCTIVE")
|
||||
if (ToolStateCurrents[i].BasicStateDescription.ToUpper() != "PRODUCTIVE" && ToolStateCurrents[ToolStateCurrents.Count - 1].BasicStateDescription.ToUpper() != "OUT OF SERVICE")
|
||||
elapsedTime += float.Parse(ToolStateCurrents[i].GanttElapsedHours);
|
||||
}
|
||||
else
|
||||
@ -47,7 +47,7 @@
|
||||
if (elapsedTime >= 12)
|
||||
ToolsDownGreaterThan12Hours.Add(ToolStateCurrents[i + 1].Tool);
|
||||
|
||||
if (ToolStateCurrents[i].BasicStateDescription.ToUpper() != "PRODUCTIVE")
|
||||
if (ToolStateCurrents[i].BasicStateDescription.ToUpper() != "PRODUCTIVE" && ToolStateCurrents[ToolStateCurrents.Count - 1].BasicStateDescription.ToUpper() != "OUT OF SERVICE")
|
||||
elapsedTime = float.Parse(ToolStateCurrents[i].GanttElapsedHours);
|
||||
else
|
||||
elapsedTime = 0;
|
||||
@ -61,7 +61,7 @@
|
||||
{
|
||||
if (tools.BasicStateDescription == "Productive")
|
||||
UpTools++;
|
||||
else
|
||||
else if (tools.ReactorStatus != "Out of Service")
|
||||
DownTools++;
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,6 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="jQuery.UI" Version="1.12.1.1" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
|
@ -1,16 +1,7 @@
|
||||
@using ReportingServices.ReportingObjects
|
||||
@model ReportingServices.Models.ProductionReport.DailyReport
|
||||
@{
|
||||
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
|
||||
int dayOfWeek = (int)DateTime.Now.DayOfWeek;
|
||||
int totalWafersOut = 0;
|
||||
int totalCustomerScrap = 0;
|
||||
int totalManufacturingScrap = 0;
|
||||
int totalProdScrap = 0;
|
||||
int totalYieldedWafersOut = 0;
|
||||
int deltaToCommit = 0;
|
||||
int deltaToPlan = 0;
|
||||
float totalYield = 0f;
|
||||
|
||||
|
||||
int ASMAvailablePct = 0;
|
||||
int EPPAvailablePct = 0;
|
||||
@ -24,44 +15,20 @@
|
||||
|
||||
int reportIndex = (int)DateTime.Now.DayOfWeek;
|
||||
|
||||
ManualReportEntries rpt = Model.Entries[reportIndex].Entries;
|
||||
int numberOfDaysInWeek = Model.CurrentWeek.OutsByDay.Count;
|
||||
|
||||
ManualReportEntries rpt = Model.CurrentEntries[reportIndex];
|
||||
|
||||
string myClass;
|
||||
List<string> toolsDownGreaterThan12Hours = new();
|
||||
|
||||
foreach (KeyValuePair<string, ToolStateByType> state in Model.ToolStateByType)
|
||||
{
|
||||
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
|
||||
if (state.Key != "Metrology" && state.Key != "Cleans")
|
||||
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
|
||||
}
|
||||
|
||||
toolsDownGreaterThan12Hours.Sort();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@{
|
||||
@ -81,237 +48,19 @@
|
||||
<h2>Daily Report</h2>
|
||||
<br /><br />
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">SI Operations</th>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
<th scope="col" class="text-center">@startDate.AddDays(i).ToString("MM/dd/yyyy")</th>
|
||||
}
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">Weekly Total</th>
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">Comment</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="col" class="text-center">Monday</th>
|
||||
<th scope="col" class="text-center">Tuesday</th>
|
||||
<th scope="col" class="text-center">Wednesday</th>
|
||||
<th scope="col" class="text-center">Thursday</th>
|
||||
<th scope="col" class="text-center">Friday</th>
|
||||
<th scope="col" class="text-center">Saturday</th>
|
||||
<th scope="col" class="text-center">Sunday</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td scope="row">Commited Target to meet Shipment Requirements</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">31,500</td>
|
||||
<td>Number updated quarterly</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Actual Reactor Out</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int reactorMoves = Model.OutsByDay[i].TotalWafers;
|
||||
|
||||
<td class="text-center">@reactorMoves</td>
|
||||
<button class="btn btn-outline-dark float-start dailyReportTable" onclick="toggleWeek()">View Previous Week</button>
|
||||
<button class="btn btn-outline-dark float-end dailyReportTable hidden" onclick="toggleWeek()">View Current Week</button>
|
||||
<br /><br />
|
||||
|
||||
totalWafersOut += reactorMoves;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalWafersOut</td>
|
||||
<td>Before Scrap</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row" id="expandYield">
|
||||
Actual Yielded Wafers Out
|
||||
<button class="btn btn-default" onclick="expandYield()">
|
||||
<img src="~/Images/plusIcon.png" width="20" style="padding-bottom: 3px" id="yieldImage" />
|
||||
</button>
|
||||
</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int yieldedOuts = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - Model.ScrapByDay[i].TW_PROD;
|
||||
|
||||
<td class="text-center">@yieldedOuts</td>
|
||||
|
||||
totalYieldedWafersOut += yieldedOuts;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalYieldedWafersOut</td>
|
||||
<td>After Scrap</td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row" colspan="10" id="expandYield" class="text-center">Yielded Wafers Out Daily Average: @(totalYieldedWafersOut / Model.OutsByDay.Count)</td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Customer Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int custScrap = Model.ScrapByDay[i].TOT_REJ_CUST;
|
||||
|
||||
<td class="text-center">@custScrap</td>
|
||||
|
||||
totalCustomerScrap += custScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalCustomerScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Manufacturing Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int manuScrap = Model.ScrapByDay[i].TOT_REJ_MANU;
|
||||
|
||||
<td class="text-center">@manuScrap</td>
|
||||
|
||||
totalManufacturingScrap += manuScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalManufacturingScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Production Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int prodScrap = Model.ScrapByDay[i].TW_PROD;
|
||||
|
||||
<td class="text-center">@prodScrap</td>
|
||||
|
||||
totalProdScrap += prodScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalProdScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Yield</td>
|
||||
@{ int count = 0; }
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
float yield = ((float)Model.OutsByDay[i].TotalWafers - (float)Model.ScrapByDay[i].TOT_REJ_WFRS) / (float)Model.OutsByDay[i].TotalWafers;
|
||||
count++;
|
||||
|
||||
<td class="text-center">@(string.Format("{0:P2}", yield))</td>
|
||||
|
||||
totalYield += yield;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@(string.Format("{0:P2}", totalYield / count))</td>
|
||||
<td>After Scrap</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Delta to commit</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int dayDelta = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - 4500;
|
||||
|
||||
if (dayDelta < 0)
|
||||
myClass = "table-danger text-danger";
|
||||
else
|
||||
myClass = "";
|
||||
|
||||
<td class="text-center @myClass">@dayDelta</td>
|
||||
|
||||
deltaToCommit += dayDelta;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@deltaToCommit</td>
|
||||
<td>Difference to commitment</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Delta to the Plan</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.OutsByDay.Count)
|
||||
{
|
||||
int dayDelta = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - 4500;
|
||||
|
||||
if (dayDelta < 0)
|
||||
myClass = "table-danger text-danger";
|
||||
else
|
||||
myClass = "";
|
||||
|
||||
<td class="text-center @myClass">@dayDelta</td>
|
||||
|
||||
deltaToPlan += dayDelta;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@deltaToPlan</td>
|
||||
<td>Difference to target</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Wafers Needed to make QTR</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">25,480</td>
|
||||
<td>Number updated weekly</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="table-responsive dailyReportTable">
|
||||
<partial name="_DailyReportPartial" model="@Model.CurrentWeek"/>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive dailyReportTable hidden">
|
||||
<partial name="_DailyReportPartial" model="@Model.PreviousWeek" />
|
||||
</div>
|
||||
|
||||
<br />
|
||||
<h5>Daily Target Summary</h5>
|
||||
<ul>
|
||||
@ -346,11 +95,20 @@
|
||||
<tbody>
|
||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["ASM"].ToolStateCurrents)
|
||||
{
|
||||
if (tool.BasicStateDescription != "Productive")
|
||||
if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
|
||||
{
|
||||
string owner = "";
|
||||
|
||||
if (Model.ToolStatesByOwner["Maintenance"].Contains(tool.ReactorStatus))
|
||||
owner = "Maint";
|
||||
else if (Model.ToolStatesByOwner["Engineering"].Contains(tool.ReactorStatus))
|
||||
owner = "Eng";
|
||||
else
|
||||
owner = "Prod";
|
||||
|
||||
<tr>
|
||||
<td>@tool.Tool</td>
|
||||
<td></td>
|
||||
<td>@owner</td>
|
||||
<td>@tool.Comment</td>
|
||||
</tr>
|
||||
}
|
||||
@ -373,11 +131,20 @@
|
||||
<tbody>
|
||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["EPP"].ToolStateCurrents)
|
||||
{
|
||||
if (tool.BasicStateDescription != "Productive")
|
||||
if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
|
||||
{
|
||||
string owner = "";
|
||||
|
||||
if (Model.ToolStatesByOwner["Maintenance"].Contains(tool.ReactorStatus))
|
||||
owner = "Maint";
|
||||
else if (Model.ToolStatesByOwner["Engineering"].Contains(tool.ReactorStatus))
|
||||
owner = "Eng";
|
||||
else
|
||||
owner = "Prod";
|
||||
|
||||
<tr>
|
||||
<td>@tool.Tool</td>
|
||||
<td></td>
|
||||
<td>@owner</td>
|
||||
<td>@tool.Comment</td>
|
||||
</tr>
|
||||
}
|
||||
@ -400,11 +167,20 @@
|
||||
<tbody>
|
||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["HTR"].ToolStateCurrents)
|
||||
{
|
||||
if (tool.BasicStateDescription != "Productive")
|
||||
if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
|
||||
{
|
||||
string owner = "";
|
||||
|
||||
if (Model.ToolStatesByOwner["Maintenance"].Contains(tool.ReactorStatus))
|
||||
owner = "Maint";
|
||||
else if (Model.ToolStatesByOwner["Engineering"].Contains(tool.ReactorStatus))
|
||||
owner = "Eng";
|
||||
else
|
||||
owner = "Prod";
|
||||
|
||||
<tr>
|
||||
<td>@tool.Tool</td>
|
||||
<td></td>
|
||||
<td>@owner</td>
|
||||
<td>@tool.Comment</td>
|
||||
</tr>
|
||||
}
|
||||
@ -421,15 +197,47 @@
|
||||
<li>200mm - @Model.NumberOfToolsWaferSize8IN</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Scheduled Reactors: </li>
|
||||
<li>Scheduled Reactors (@(Model.NumberOfToolsWaferSize6INScheduled + Model.NumberOfToolsWaferSize8INScheduled)):
|
||||
<ul>
|
||||
<li>150mm - @Model.NumberOfToolsWaferSize6INScheduled</li>
|
||||
<li>200mm - @Model.NumberOfToolsWaferSize8INScheduled</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Dual Layer Reactors</li>
|
||||
<li>Engineering Focus Tools (Down > 12 hours)
|
||||
<ul>
|
||||
<li>@string.Join(",", toolsDownGreaterThan12Hours)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Metrology Down (): </li>
|
||||
<li>Cleans (): </li>
|
||||
<li>Metrology Down (@Model.ToolStateByType["Metrology"].DownTools):
|
||||
@if (Model.ToolStateByType["Metrology"].DownTools > 0)
|
||||
{
|
||||
<ul>
|
||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["Metrology"].ToolStateCurrents)
|
||||
{
|
||||
if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
|
||||
{
|
||||
<li>@tool.Tool</li>
|
||||
}
|
||||
}
|
||||
</ul>
|
||||
}
|
||||
</li>
|
||||
<li>
|
||||
Cleans (@Model.ToolStateByType["Cleans"].DownTools):
|
||||
@if (Model.ToolStateByType["Cleans"].DownTools > 0)
|
||||
{
|
||||
<ul>
|
||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["Cleans"].ToolStateCurrents)
|
||||
{
|
||||
if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
|
||||
{
|
||||
<li>@tool.Tool</li>
|
||||
}
|
||||
}
|
||||
</ul>
|
||||
}
|
||||
</li>
|
||||
</ul>
|
||||
<br /><br />
|
||||
<div class="table-responsive">
|
||||
@ -451,7 +259,7 @@
|
||||
<th scope="col"></th>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
<th scope="col">@startDate.AddDays(i).ToString("MM/dd/yyyy")</th>
|
||||
<th scope="col">@Model.StartDate.AddDays(i).ToString("MM/dd/yyyy")</th>
|
||||
}
|
||||
<th scope="col">Actual</th>
|
||||
<th scope="col">Target</th>
|
||||
@ -480,7 +288,7 @@
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td>@(ASMAvailablePct / count + "%")</td>
|
||||
<td>@(ASMAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||
<td>82%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -505,7 +313,7 @@
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td>@(EPPAvailablePct / count + "%")</td>
|
||||
<td>@(EPPAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||
<td>60%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -530,87 +338,87 @@
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td>@(HTRAvailablePct / count + "%")</td>
|
||||
<td>@(HTRAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||
<td>78%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">ASMs SLL Tool Count</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.Entries.Count)
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
if (@Model.CurrentEntries[index].ASMSingleLoadLock != 0)
|
||||
{
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
<td>@Model.Entries[index].Entries.ASMSingleLoadLock</td>
|
||||
|
||||
ASMSLL += @Model.Entries[index].Entries.ASMSingleLoadLock;
|
||||
<td>@Model.CurrentEntries[index].ASMSingleLoadLock</td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
|
||||
ASMSLL += @Model.CurrentEntries[index].ASMSingleLoadLock;
|
||||
}
|
||||
<td>@(ASMSLL / count)</td>
|
||||
<td>@(ASMSLL / numberOfDaysInWeek)</td>
|
||||
<td>0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">HTRs SLL Tool Count</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.Entries.Count)
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
if (@Model.CurrentEntries[index].HTRSingleLoadLock != 0)
|
||||
{
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
<td>@Model.Entries[index].Entries.HTRSingleLoadLock</td>
|
||||
|
||||
HTRSLL += @Model.Entries[index].Entries.HTRSingleLoadLock;
|
||||
<td>@Model.CurrentEntries[index].HTRSingleLoadLock</td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
|
||||
HTRSLL += @Model.CurrentEntries[index].HTRSingleLoadLock;
|
||||
}
|
||||
<td>@(HTRSLL / count)</td>
|
||||
<td>@(HTRSLL / numberOfDaysInWeek)</td>
|
||||
<td>0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">ASMs <700C (Unload Temps)</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.Entries.Count)
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
if (@Model.CurrentEntries[index].ASMUnloadTempsLessThan700 != 0)
|
||||
{
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
<td>@Model.Entries[index].Entries.ASMUnloadTempsLessThan700</td>
|
||||
|
||||
ASMUnloadTemps += @Model.Entries[index].Entries.ASMUnloadTempsLessThan700;
|
||||
<td>@Model.CurrentEntries[index].ASMUnloadTempsLessThan700</td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
|
||||
ASMUnloadTemps += @Model.CurrentEntries[index].ASMUnloadTempsLessThan700;
|
||||
}
|
||||
<td>@(ASMUnloadTemps / count)</td>
|
||||
<td>@(ASMUnloadTemps / numberOfDaysInWeek)</td>
|
||||
<td>0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">HTRs <700C (Unload Temps)</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < Model.Entries.Count)
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
if (@Model.CurrentEntries[index].HTRUnloadTempsLessThan700 != 0)
|
||||
{
|
||||
int index = i == 6 ? 0 : i + 1;
|
||||
|
||||
<td>@Model.Entries[index].Entries.HTRUnloadTempsLessThan700</td>
|
||||
|
||||
HTRUnloadTemps += @Model.Entries[index].Entries.HTRUnloadTempsLessThan700;
|
||||
<td>@Model.CurrentEntries[index].HTRUnloadTempsLessThan700</td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
|
||||
HTRUnloadTemps += @Model.CurrentEntries[index].HTRUnloadTempsLessThan700;
|
||||
}
|
||||
<td>@(HTRUnloadTemps / count)</td>
|
||||
<td>@(HTRUnloadTemps / numberOfDaysInWeek)</td>
|
||||
<td>0</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
254
ReportingServices/Views/Shared/_DailyReportPartial.cshtml
Normal file
254
ReportingServices/Views/Shared/_DailyReportPartial.cshtml
Normal file
@ -0,0 +1,254 @@
|
||||
@model ReportingServices.Models.ProductionReport.YieldStatistics
|
||||
|
||||
@{
|
||||
int totalWafersOut = 0;
|
||||
int totalCustomerScrap = 0;
|
||||
int totalManufacturingScrap = 0;
|
||||
int totalProdScrap = 0;
|
||||
int totalYieldedWafersOut = 0;
|
||||
int deltaToCommit = 0;
|
||||
int deltaToPlan = 0;
|
||||
float totalYield = 0f;
|
||||
|
||||
string myClass;
|
||||
|
||||
int numberOfDaysInWeek = Model.OutsByDay.Count;
|
||||
int yieldOutDays = Model.IsCurrentWeek ? Model.OutsByDay.Count - 1 : Model.OutsByDay.Count;
|
||||
}
|
||||
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">SI Operations</th>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
<th scope="col" class="text-center">@Model.StartDate.AddDays(i).ToString("MM/dd/yyyy")</th>
|
||||
}
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">Weekly Total</th>
|
||||
<th scope="col" rowspan="2" class="text-center align-middle">Comment</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="col" class="text-center">Monday</th>
|
||||
<th scope="col" class="text-center">Tuesday</th>
|
||||
<th scope="col" class="text-center">Wednesday</th>
|
||||
<th scope="col" class="text-center">Thursday</th>
|
||||
<th scope="col" class="text-center">Friday</th>
|
||||
<th scope="col" class="text-center">Saturday</th>
|
||||
<th scope="col" class="text-center">Sunday</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td scope="row">Commited Target to meet Shipment Requirements</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">4,500</td>
|
||||
<td class="text-center">31,500</td>
|
||||
<td>Number updated quarterly</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Actual Reactor Out</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int reactorMoves = Model.OutsByDay[i].TotalWafers;
|
||||
|
||||
<td class="text-center">@reactorMoves</td>
|
||||
|
||||
totalWafersOut += reactorMoves;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalWafersOut</td>
|
||||
<td>Before Scrap</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row" id="expandYield">
|
||||
Actual Yielded Wafers Out
|
||||
<button class="btn btn-default" onclick="expandYield()">
|
||||
<img src="~/Images/plusIcon.png" width="20" style="padding-bottom: 3px" id="yieldImage" />
|
||||
</button>
|
||||
</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int yieldedOuts = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - Model.ScrapByDay[i].TW_PROD;
|
||||
|
||||
<td class="text-center">@yieldedOuts</td>
|
||||
|
||||
totalYieldedWafersOut += yieldedOuts;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalYieldedWafersOut</td>
|
||||
<td>After Scrap</td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
@{
|
||||
int index = numberOfDaysInWeek - 1;
|
||||
int modifiedYieldedOuts = 0;
|
||||
if (Model.IsCurrentWeek)
|
||||
modifiedYieldedOuts = totalYieldedWafersOut - (Model.OutsByDay[index].TotalWafers - Model.ScrapByDay[index].TOT_REJ_WFRS - Model.ScrapByDay[index].TW_PROD);
|
||||
else
|
||||
modifiedYieldedOuts = totalYieldedWafersOut;
|
||||
}
|
||||
<td scope="row" colspan="10" id="expandYield" class="text-center">Yielded Wafers Out Daily Average: @(modifiedYieldedOuts / yieldOutDays)</td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Customer Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int custScrap = Model.ScrapByDay[i].TOT_REJ_CUST;
|
||||
|
||||
<td class="text-center">@custScrap</td>
|
||||
|
||||
totalCustomerScrap += custScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalCustomerScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Manufacturing Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int manuScrap = Model.ScrapByDay[i].TOT_REJ_MANU;
|
||||
|
||||
<td class="text-center">@manuScrap</td>
|
||||
|
||||
totalManufacturingScrap += manuScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalManufacturingScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Production Scrap</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int prodScrap = Model.ScrapByDay[i].TW_PROD;
|
||||
|
||||
<td class="text-center">@prodScrap</td>
|
||||
|
||||
totalProdScrap += prodScrap;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@totalProdScrap</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="yield hidden">
|
||||
<td scope="row">Yield</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
float yield = ((float)Model.OutsByDay[i].TotalWafers - (float)Model.ScrapByDay[i].TOT_REJ_WFRS) / (float)Model.OutsByDay[i].TotalWafers;
|
||||
|
||||
<td class="text-center">@(string.Format("{0:P2}", yield))</td>
|
||||
|
||||
totalYield += yield;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@(string.Format("{0:P2}", totalYield / numberOfDaysInWeek))</td>
|
||||
<td>After Scrap</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Delta to commit</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int dayDelta = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - 4500;
|
||||
|
||||
if (dayDelta < 0)
|
||||
myClass = "table-danger text-danger";
|
||||
else
|
||||
myClass = "";
|
||||
|
||||
<td class="text-center @myClass">@dayDelta</td>
|
||||
|
||||
deltaToCommit += dayDelta;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@deltaToCommit</td>
|
||||
<td>Difference to commitment</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Delta to the Plan</td>
|
||||
@for (int i = 0; i < 7; i++)
|
||||
{
|
||||
if (i < numberOfDaysInWeek)
|
||||
{
|
||||
int dayDelta = Model.OutsByDay[i].TotalWafers - Model.ScrapByDay[i].TOT_REJ_WFRS - 4500;
|
||||
|
||||
if (dayDelta < 0)
|
||||
myClass = "table-danger text-danger";
|
||||
else
|
||||
myClass = "";
|
||||
|
||||
<td class="text-center @myClass">@dayDelta</td>
|
||||
|
||||
deltaToPlan += dayDelta;
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
<td class="text-center">@deltaToPlan</td>
|
||||
<td>Difference to target</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td scope="row">Wafers Needed to make QTR</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">3,640</td>
|
||||
<td class="text-center">25,480</td>
|
||||
<td>Number updated weekly</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
File diff suppressed because one or more lines are too long
44
ReportingServices/wwwroot/Assets/ToolStates.json
Normal file
44
ReportingServices/wwwroot/Assets/ToolStates.json
Normal file
@ -0,0 +1,44 @@
|
||||
{
|
||||
"Maintenance": [
|
||||
"RESPONSE_TIME_MAINTENANCE_UNSCHEDULED",
|
||||
"RESPONSE_TIME_MAINTENANCE_SCHEDULED",
|
||||
"MAINTENANCE_UNSCHEDULED",
|
||||
"MAINTENANCE_SCHEDULED",
|
||||
"MAINTENANCE_WAITING_FOR_PARTS",
|
||||
"WAITING_FOR_MAINTENANCE_SCHEDULED",
|
||||
"WAITING_FOR_MAINTENANCE_UNSCHEDULED",
|
||||
"TEST_SCHEDULED",
|
||||
"TEST_UNSCHEDULED",
|
||||
"TEST_PM",
|
||||
"CHANGEOVER_SCHEDULED",
|
||||
"CHANGEOVER_UNSCHEDULED"
|
||||
],
|
||||
"Engineering": [
|
||||
"RESPONSE_TIME_ENGINEER_UNSCHEDULED",
|
||||
"RESPONSE_TIME_ENGTECH_UNSCHEDULED",
|
||||
"RESPONSE_TIME_ENGINEER_SCHEDULED",
|
||||
"RESPONSE_TIME_ENGTECH_SCHEDULED",
|
||||
"ENGINEERING_DEVELOPMENT",
|
||||
"ENGINEERING_INVESTIGATION",
|
||||
"TROUBLESHOOT_ENGTECH",
|
||||
"WAITING_FOR_ENGINEER_SCHEDULED",
|
||||
"WAITING_FOR_ENGINEER_UNSCHEDULED",
|
||||
"WAITING_FOR_ENGTECH_SCHEDULED",
|
||||
"WAITING_FOR_ENGTECH_UNSCHEDULED"
|
||||
],
|
||||
"Facilities": [
|
||||
"FACILITIES_UNSCHEDULED",
|
||||
"FACILITIES_SHEDULED",
|
||||
"FACILITIES_WAITING_FOR_PARTS"
|
||||
],
|
||||
"Production": [
|
||||
"UP_WITH_RESTRICTIONS",
|
||||
"UP",
|
||||
"UP_WITH_INCREASED_SAMPLING",
|
||||
"UP_NOT_RUNNING",
|
||||
"TROUBLESHOOT_OPERATOR",
|
||||
"IDLE",
|
||||
"WAITING_FOR_OPERATOR",
|
||||
"CLEANUP"
|
||||
]
|
||||
}
|
@ -150,4 +150,12 @@ function expandYield() {
|
||||
document.getElementById("yieldImage").src = "../Images/minusIcon.png";
|
||||
else
|
||||
document.getElementById("yieldImage").src = "../Images/plusIcon.png";
|
||||
}
|
||||
|
||||
function toggleWeek() {
|
||||
var rptTableDiv = document.getElementsByClassName("dailyReportTable");
|
||||
|
||||
for (let i = 0; i < rptTableDiv.length; i++) {
|
||||
rptTableDiv[i].classList.toggle("hidden");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user