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.HelperClasses;
|
||||||
using ReportingServices.Models.ProductionReport;
|
using ReportingServices.Models.ProductionReport;
|
||||||
using ReportingServices.ReportingObjects;
|
using ReportingServices.ReportingObjects;
|
||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Nodes;
|
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
|
||||||
namespace ReportingServices.Controllers
|
namespace ReportingServices.Controllers
|
||||||
@ -15,7 +13,8 @@ namespace ReportingServices.Controllers
|
|||||||
private readonly IScrapeDatabaseRepository _scrapeDatabaseRepository;
|
private readonly IScrapeDatabaseRepository _scrapeDatabaseRepository;
|
||||||
private readonly IFabTimeReportingRepository _fabTimeReportingRepository;
|
private readonly IFabTimeReportingRepository _fabTimeReportingRepository;
|
||||||
private readonly int _reportIndex = (int)DateTime.Now.DayOfWeek;
|
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";
|
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)
|
public ProductionReportController(IJsonFileHandler jsonFileHandler, IScrapeDatabaseRepository scrapeDatabaseRepository, IFabTimeReportingRepository fabTimeReportingRepository)
|
||||||
@ -34,15 +33,18 @@ namespace ReportingServices.Controllers
|
|||||||
public IActionResult DailyReport()
|
public IActionResult DailyReport()
|
||||||
{
|
{
|
||||||
DailyReport dailyReport = SetUpDailyReport();
|
DailyReport dailyReport = SetUpDailyReport();
|
||||||
|
Dictionary<string, List<string>> toolStateOwners = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<string>>>(_toolStateOwnerFilePath);
|
||||||
|
|
||||||
|
dailyReport.ToolStatesByOwner = toolStateOwners;
|
||||||
|
|
||||||
return View(dailyReport);
|
return View(dailyReport);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IActionResult EditDailyReport()
|
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);
|
return View(rpt);
|
||||||
}
|
}
|
||||||
@ -50,18 +52,21 @@ namespace ReportingServices.Controllers
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult EditDailyReport(ManualReportEntries rpt)
|
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");
|
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);
|
List<ReactorOutsByRDS> outsByRDS = await _fabTimeReportingRepository.GetMovesTrendData(url);
|
||||||
|
|
||||||
@ -80,7 +85,7 @@ namespace ReportingServices.Controllers
|
|||||||
public async Task<List<ToolStateCurrent>> ToolStatesCaller(string toolType)
|
public async Task<List<ToolStateCurrent>> ToolStatesCaller(string toolType)
|
||||||
{
|
{
|
||||||
string capacityFilter = toolType == "ASM" ? toolType + "%2CASM%2B" : 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",
|
string url = APIHelperFunctions.GenerateURLWithParameters(chart: "ToolStateGantt", periodLen: "24",
|
||||||
capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate);
|
capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate);
|
||||||
@ -95,44 +100,82 @@ namespace ReportingServices.Controllers
|
|||||||
DailyReport report = new();
|
DailyReport report = new();
|
||||||
|
|
||||||
Task<List<ReactorOutsByRDS>> task1 = MovesTrendCaller();
|
Task<List<ReactorOutsByRDS>> task1 = MovesTrendCaller();
|
||||||
Task<List<EquipmentStateByDay>> task2 = ToolStateTrendCaller("ASM");
|
Task<List<ReactorOutsByRDS>> task2 = MovesTrendCaller(startDate: report.StartDate.AddDays(-7).ToString(), endDate: report.StartDate.ToString());
|
||||||
Task<List<EquipmentStateByDay>> task3 = ToolStateTrendCaller("EPP");
|
Task<List<EquipmentStateByDay>> task3 = ToolStateTrendCaller("ASM");
|
||||||
Task<List<EquipmentStateByDay>> task4 = ToolStateTrendCaller("HTR");
|
Task<List<EquipmentStateByDay>> task4 = ToolStateTrendCaller("EPP");
|
||||||
Task<List<ToolStateCurrent>> task5 = ToolStatesCaller("ASM");
|
Task<List<EquipmentStateByDay>> task5 = ToolStateTrendCaller("HTR");
|
||||||
Task<List<ToolStateCurrent>> task6 = ToolStatesCaller("EPP");
|
Task<List<ToolStateCurrent>> task6 = ToolStatesCaller("ASM");
|
||||||
Task<List<ToolStateCurrent>> task7 = ToolStatesCaller("HTR");
|
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> scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result);
|
||||||
|
List<ScrapByDay> previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result);
|
||||||
|
|
||||||
report.SetScrapByDay(scrap);
|
report.CurrentWeek.SetScrapByDay(scrap);
|
||||||
report.AddToolAvailibilityByType("ASM", task2.Result);
|
report.PreviousWeek.SetScrapByDay(previousScrap);
|
||||||
report.AddToolAvailibilityByType("EPP", task3.Result);
|
report.AddToolAvailibilityByType("ASM", task3.Result);
|
||||||
report.AddToolAvailibilityByType("HTR", task4.Result);
|
report.AddToolAvailibilityByType("EPP", task4.Result);
|
||||||
report.AddToolStateByType("ASM", task5.Result);
|
report.AddToolAvailibilityByType("HTR", task5.Result);
|
||||||
report.AddToolStateByType("EPP", task6.Result);
|
report.AddToolStateByType("ASM", task6.Result);
|
||||||
report.AddToolStateByType("HTR", task7.Result);
|
report.AddToolStateByType("EPP", task7.Result);
|
||||||
|
report.AddToolStateByType("HTR", task8.Result);
|
||||||
|
report.AddToolStateByType("Metrology", task9.Result);
|
||||||
|
report.AddToolStateByType("Cleans", task10.Result);
|
||||||
report.ReverseLists();
|
report.ReverseLists();
|
||||||
|
|
||||||
int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize();
|
report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets();
|
||||||
|
|
||||||
|
int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize("''");
|
||||||
|
|
||||||
report.NumberOfToolsWaferSize6IN = toolsByWaferSize[0];
|
report.NumberOfToolsWaferSize6IN = toolsByWaferSize[0];
|
||||||
report.NumberOfToolsWaferSize8IN = toolsByWaferSize[1];
|
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();
|
int[] singleLoadLocks = _scrapeDatabaseRepository.GetNumberOfSingleLoadLocks();
|
||||||
|
|
||||||
report.Entries[_reportIndex].Entries.ASMSingleLoadLock = singleLoadLocks[0];
|
report.CurrentEntries[_reportIndex].ASMSingleLoadLock = singleLoadLocks[0];
|
||||||
report.Entries[_reportIndex].Entries.HTRSingleLoadLock = singleLoadLocks[1];
|
report.CurrentEntries[_reportIndex].HTRSingleLoadLock = singleLoadLocks[1];
|
||||||
|
|
||||||
int[] unloadTempsLessThan700 = _scrapeDatabaseRepository.GetNumberOfToolUnloadTempsLessThan700();
|
int[] unloadTempsLessThan700 = _scrapeDatabaseRepository.GetNumberOfToolUnloadTempsLessThan700();
|
||||||
|
|
||||||
report.Entries[_reportIndex].Entries.ASMUnloadTempsLessThan700 = unloadTempsLessThan700[0];
|
report.CurrentEntries[_reportIndex].ASMUnloadTempsLessThan700 = unloadTempsLessThan700[0];
|
||||||
report.Entries[_reportIndex].Entries.HTRUnloadTempsLessThan700 = unloadTempsLessThan700[1];
|
report.CurrentEntries[_reportIndex].HTRUnloadTempsLessThan700 = unloadTempsLessThan700[1];
|
||||||
|
|
||||||
|
entries["Current Week"] = report.CurrentEntries;
|
||||||
|
|
||||||
|
_jsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath);
|
||||||
|
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
using ReportingServices.Models.PlanningReport;
|
using ReportingServices.Models.PlanningReport;
|
||||||
using ReportingServices.ReportingObjects;
|
using ReportingServices.ReportingObjects;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
|
|
||||||
namespace ReportingServices.Dependency_Injections
|
namespace ReportingServices.Dependency_Injections
|
||||||
{
|
{
|
||||||
@ -126,7 +125,7 @@ namespace ReportingServices.Dependency_Injections
|
|||||||
return weeklyPartChanges;
|
return weeklyPartChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] GetNumberOfToolsByWaferSize()
|
public int[] GetNumberOfToolsByWaferSize(string reactors)
|
||||||
{
|
{
|
||||||
int[] singleLoadLocks = new int[2];
|
int[] singleLoadLocks = new int[2];
|
||||||
|
|
||||||
@ -141,6 +140,7 @@ namespace ReportingServices.Dependency_Injections
|
|||||||
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
||||||
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
||||||
" AND REACT_ASSIGNMENT <> '' " +
|
" AND REACT_ASSIGNMENT <> '' " +
|
||||||
|
" AND REACT_NO NOT IN (" + reactors + ") " +
|
||||||
"GROUP BY SUSC_POCKET_SIZE";
|
"GROUP BY SUSC_POCKET_SIZE";
|
||||||
|
|
||||||
cmd.CommandText = query;
|
cmd.CommandText = query;
|
||||||
@ -171,7 +171,7 @@ namespace ReportingServices.Dependency_Injections
|
|||||||
|
|
||||||
SqlCommand cmd = _connection.CreateCommand();
|
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 " +
|
" FROM REACTOR " +
|
||||||
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
|
||||||
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
|
||||||
@ -232,5 +232,52 @@ namespace ReportingServices.Dependency_Injections
|
|||||||
|
|
||||||
return unloadTempTools;
|
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<ScrapByDay> GetScrapByDay(List<ReactorOutsByRDS> outs);
|
||||||
public List<ReactorPSNWORuns> GetReactorPSNWORuns(string startDate, string endDate);
|
public List<ReactorPSNWORuns> GetReactorPSNWORuns(string startDate, string endDate);
|
||||||
public int GetNumberOfPartChanges(string startDate, string endDate);
|
public int GetNumberOfPartChanges(string startDate, string endDate);
|
||||||
public int[] GetNumberOfToolsByWaferSize();
|
public int[] GetNumberOfToolsByWaferSize(string reactors);
|
||||||
public int[] GetNumberOfSingleLoadLocks();
|
public int[] GetNumberOfSingleLoadLocks();
|
||||||
public int[] GetNumberOfToolUnloadTempsLessThan700();
|
public int[] GetNumberOfToolUnloadTempsLessThan700();
|
||||||
|
public QuarterlyTargets GetQuarterlyTargets();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
using ReportingServices.Dependency_Injections;
|
using System.Web;
|
||||||
using ReportingServices.ReportingObjects;
|
|
||||||
using System.Web;
|
|
||||||
|
|
||||||
namespace ReportingServices.HelperClasses
|
namespace ReportingServices.HelperClasses
|
||||||
{
|
{
|
||||||
@ -45,13 +43,13 @@ namespace ReportingServices.HelperClasses
|
|||||||
return dateString;
|
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 = "")
|
string areasLike = "", string toolsLike = "", string operationsLike = "", string capacityTypesLike = "")
|
||||||
{
|
{
|
||||||
Dictionary<string, string> parameters = new();
|
Dictionary<string, string> parameters = new();
|
||||||
|
|
||||||
startDate = startDate == "" ? HttpUtility.UrlEncode(GetBeginningOfWeekAsAPIString()) : startDate;
|
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("chart", chart);
|
||||||
parameters.Add("starttime", startDate);
|
parameters.Add("starttime", startDate);
|
||||||
@ -87,10 +85,10 @@ namespace ReportingServices.HelperClasses
|
|||||||
return url;
|
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 = "")
|
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);
|
periodLen, areasLike, toolsLike, operationsLike, capacityTypesLike);
|
||||||
|
|
||||||
return GenerateURL(parameters);
|
return GenerateURL(parameters);
|
||||||
|
@ -5,28 +5,29 @@ namespace ReportingServices.Models.ProductionReport
|
|||||||
{
|
{
|
||||||
public class DailyReport
|
public class DailyReport
|
||||||
{
|
{
|
||||||
public List<ReactorOutsByDay> OutsByDay { get; set; }
|
public DateTime StartDate { get; set; }
|
||||||
public List<ScrapByDay> ScrapByDay { get; set; }
|
public YieldStatistics CurrentWeek { get; set; }
|
||||||
|
public YieldStatistics PreviousWeek { get; set; }
|
||||||
public Dictionary<string, List<EquipmentStateByDay>> ToolAvailibilityByType { get; set; }
|
public Dictionary<string, List<EquipmentStateByDay>> ToolAvailibilityByType { get; set; }
|
||||||
public Dictionary<string, ToolStateByType> ToolStateByType { 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 NumberOfToolsWaferSize6IN { get; set; }
|
||||||
public int NumberOfToolsWaferSize8IN { get; set; }
|
public int NumberOfToolsWaferSize8IN { get; set; }
|
||||||
|
public int NumberOfToolsWaferSize6INScheduled { get; set; }
|
||||||
|
public int NumberOfToolsWaferSize8INScheduled { get; set; }
|
||||||
|
public QuarterlyTargets QuarterlyTargets { get; set; }
|
||||||
|
|
||||||
public DailyReport()
|
public DailyReport()
|
||||||
{
|
{
|
||||||
ToolAvailibilityByType = new();
|
ToolAvailibilityByType = new();
|
||||||
ToolStateByType = new();
|
ToolStateByType = new();
|
||||||
}
|
PreviousEntries = new();
|
||||||
|
CurrentEntries = new();
|
||||||
public void SetOutsByDay(List<ReactorOutsByRDS> outs)
|
StartDate = DateTime.Parse(APIHelperFunctions.GetBeginningOfWeekAsAPIString());
|
||||||
{
|
CurrentWeek = new(StartDate, true);
|
||||||
OutsByDay = GetReactorOutsByDay(outs);
|
PreviousWeek = new(StartDate.AddDays(-7), false);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetScrapByDay(List<ScrapByDay> scrap)
|
|
||||||
{
|
|
||||||
ScrapByDay = scrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddToolAvailibilityByType(string key, List<EquipmentStateByDay> states)
|
public void AddToolAvailibilityByType(string key, List<EquipmentStateByDay> states)
|
||||||
@ -36,49 +37,15 @@ namespace ReportingServices.Models.ProductionReport
|
|||||||
|
|
||||||
public void AddToolStateByType(string key, List<ToolStateCurrent> states)
|
public void AddToolStateByType(string key, List<ToolStateCurrent> states)
|
||||||
{
|
{
|
||||||
ToolStateByType state = new ToolStateByType(states);
|
ToolStateByType state = new(states);
|
||||||
|
|
||||||
ToolStateByType.Add(key, state);
|
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()
|
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["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]);
|
||||||
ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]);
|
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 class ManualReportEntries
|
||||||
{
|
{
|
||||||
|
public DayOfWeek Day { get; set; }
|
||||||
|
public DateTime Date { get; set; }
|
||||||
public int OperatorHeadcountDays { get; set; }
|
public int OperatorHeadcountDays { get; set; }
|
||||||
public int OperatorHeadcountNights { get; set; }
|
public int OperatorHeadcountNights { get; set; }
|
||||||
public int OperatorCallOutsDays { 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;
|
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);
|
float.Parse(ToolStateCurrents[ToolStateCurrents.Count - 1].GanttElapsedHours);
|
||||||
|
|
||||||
for (int i = ToolStateCurrents.Count - 2; i >= 0; i--)
|
for (int i = ToolStateCurrents.Count - 2; i >= 0; i--)
|
||||||
{
|
{
|
||||||
if (ToolStateCurrents[i].Tool == ToolStateCurrents[i + 1].Tool)
|
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);
|
elapsedTime += float.Parse(ToolStateCurrents[i].GanttElapsedHours);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -47,7 +47,7 @@
|
|||||||
if (elapsedTime >= 12)
|
if (elapsedTime >= 12)
|
||||||
ToolsDownGreaterThan12Hours.Add(ToolStateCurrents[i + 1].Tool);
|
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);
|
elapsedTime = float.Parse(ToolStateCurrents[i].GanttElapsedHours);
|
||||||
else
|
else
|
||||||
elapsedTime = 0;
|
elapsedTime = 0;
|
||||||
@ -61,7 +61,7 @@
|
|||||||
{
|
{
|
||||||
if (tools.BasicStateDescription == "Productive")
|
if (tools.BasicStateDescription == "Productive")
|
||||||
UpTools++;
|
UpTools++;
|
||||||
else
|
else if (tools.ReactorStatus != "Out of Service")
|
||||||
DownTools++;
|
DownTools++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="jQuery.UI" Version="1.12.1.1" />
|
|
||||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.1" />
|
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -1,16 +1,7 @@
|
|||||||
@using ReportingServices.ReportingObjects
|
@using ReportingServices.ReportingObjects
|
||||||
@model ReportingServices.Models.ProductionReport.DailyReport
|
@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 ASMAvailablePct = 0;
|
||||||
int EPPAvailablePct = 0;
|
int EPPAvailablePct = 0;
|
||||||
@ -24,44 +15,20 @@
|
|||||||
|
|
||||||
int reportIndex = (int)DateTime.Now.DayOfWeek;
|
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;
|
string myClass;
|
||||||
List<string> toolsDownGreaterThan12Hours = new();
|
List<string> toolsDownGreaterThan12Hours = new();
|
||||||
|
|
||||||
foreach (KeyValuePair<string, ToolStateByType> state in Model.ToolStateByType)
|
foreach (KeyValuePair<string, ToolStateByType> state in Model.ToolStateByType)
|
||||||
{
|
{
|
||||||
|
if (state.Key != "Metrology" && state.Key != "Cleans")
|
||||||
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
|
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
|
||||||
}
|
}
|
||||||
|
|
||||||
toolsDownGreaterThan12Hours.Sort();
|
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>
|
<h2>Daily Report</h2>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
</div>
|
</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)
|
<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>
|
||||||
int reactorMoves = Model.OutsByDay[i].TotalWafers;
|
<br /><br />
|
||||||
|
|
||||||
<td class="text-center">@reactorMoves</td>
|
<div class="table-responsive dailyReportTable">
|
||||||
|
<partial name="_DailyReportPartial" model="@Model.CurrentWeek"/>
|
||||||
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>
|
</div>
|
||||||
|
|
||||||
|
<div class="table-responsive dailyReportTable hidden">
|
||||||
|
<partial name="_DailyReportPartial" model="@Model.PreviousWeek" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<h5>Daily Target Summary</h5>
|
<h5>Daily Target Summary</h5>
|
||||||
<ul>
|
<ul>
|
||||||
@ -346,11 +95,20 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["ASM"].ToolStateCurrents)
|
@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>
|
<tr>
|
||||||
<td>@tool.Tool</td>
|
<td>@tool.Tool</td>
|
||||||
<td></td>
|
<td>@owner</td>
|
||||||
<td>@tool.Comment</td>
|
<td>@tool.Comment</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@ -373,11 +131,20 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["EPP"].ToolStateCurrents)
|
@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>
|
<tr>
|
||||||
<td>@tool.Tool</td>
|
<td>@tool.Tool</td>
|
||||||
<td></td>
|
<td>@owner</td>
|
||||||
<td>@tool.Comment</td>
|
<td>@tool.Comment</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@ -400,11 +167,20 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
@foreach (ToolStateCurrent tool in Model.ToolStateByType["HTR"].ToolStateCurrents)
|
@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>
|
<tr>
|
||||||
<td>@tool.Tool</td>
|
<td>@tool.Tool</td>
|
||||||
<td></td>
|
<td>@owner</td>
|
||||||
<td>@tool.Comment</td>
|
<td>@tool.Comment</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@ -421,15 +197,47 @@
|
|||||||
<li>200mm - @Model.NumberOfToolsWaferSize8IN</li>
|
<li>200mm - @Model.NumberOfToolsWaferSize8IN</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</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>Dual Layer Reactors</li>
|
||||||
<li>Engineering Focus Tools (Down > 12 hours)
|
<li>Engineering Focus Tools (Down > 12 hours)
|
||||||
<ul>
|
<ul>
|
||||||
<li>@string.Join(",", toolsDownGreaterThan12Hours)</li>
|
<li>@string.Join(",", toolsDownGreaterThan12Hours)</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Metrology Down (): </li>
|
<li>Metrology Down (@Model.ToolStateByType["Metrology"].DownTools):
|
||||||
<li>Cleans (): </li>
|
@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>
|
</ul>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
@ -451,7 +259,7 @@
|
|||||||
<th scope="col"></th>
|
<th scope="col"></th>
|
||||||
@for (int i = 0; i < 7; i++)
|
@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">Actual</th>
|
||||||
<th scope="col">Target</th>
|
<th scope="col">Target</th>
|
||||||
@ -480,7 +288,7 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<td>@(ASMAvailablePct / count + "%")</td>
|
<td>@(ASMAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||||
<td>82%</td>
|
<td>82%</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -505,7 +313,7 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<td>@(EPPAvailablePct / count + "%")</td>
|
<td>@(EPPAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||||
<td>60%</td>
|
<td>60%</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -530,87 +338,87 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<td>@(HTRAvailablePct / count + "%")</td>
|
<td>@(HTRAvailablePct / numberOfDaysInWeek + "%")</td>
|
||||||
<td>78%</td>
|
<td>78%</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">ASMs SLL Tool Count</td>
|
<td scope="row">ASMs SLL Tool Count</td>
|
||||||
@for (int i = 0; i < 7; i++)
|
@for (int i = 0; i < 7; i++)
|
||||||
{
|
|
||||||
if (i < Model.Entries.Count)
|
|
||||||
{
|
{
|
||||||
int index = i == 6 ? 0 : i + 1;
|
int index = i == 6 ? 0 : i + 1;
|
||||||
|
|
||||||
<td>@Model.Entries[index].Entries.ASMSingleLoadLock</td>
|
if (@Model.CurrentEntries[index].ASMSingleLoadLock != 0)
|
||||||
|
{
|
||||||
ASMSLL += @Model.Entries[index].Entries.ASMSingleLoadLock;
|
<td>@Model.CurrentEntries[index].ASMSingleLoadLock</td>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASMSLL += @Model.CurrentEntries[index].ASMSingleLoadLock;
|
||||||
}
|
}
|
||||||
<td>@(ASMSLL / count)</td>
|
<td>@(ASMSLL / numberOfDaysInWeek)</td>
|
||||||
<td>0</td>
|
<td>0</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">HTRs SLL Tool Count</td>
|
<td scope="row">HTRs SLL Tool Count</td>
|
||||||
@for (int i = 0; i < 7; i++)
|
@for (int i = 0; i < 7; i++)
|
||||||
{
|
|
||||||
if (i < Model.Entries.Count)
|
|
||||||
{
|
{
|
||||||
int index = i == 6 ? 0 : i + 1;
|
int index = i == 6 ? 0 : i + 1;
|
||||||
|
|
||||||
<td>@Model.Entries[index].Entries.HTRSingleLoadLock</td>
|
if (@Model.CurrentEntries[index].HTRSingleLoadLock != 0)
|
||||||
|
{
|
||||||
HTRSLL += @Model.Entries[index].Entries.HTRSingleLoadLock;
|
<td>@Model.CurrentEntries[index].HTRSingleLoadLock</td>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HTRSLL += @Model.CurrentEntries[index].HTRSingleLoadLock;
|
||||||
}
|
}
|
||||||
<td>@(HTRSLL / count)</td>
|
<td>@(HTRSLL / numberOfDaysInWeek)</td>
|
||||||
<td>0</td>
|
<td>0</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">ASMs <700C (Unload Temps)</td>
|
<td scope="row">ASMs <700C (Unload Temps)</td>
|
||||||
@for (int i = 0; i < 7; i++)
|
@for (int i = 0; i < 7; i++)
|
||||||
{
|
|
||||||
if (i < Model.Entries.Count)
|
|
||||||
{
|
{
|
||||||
int index = i == 6 ? 0 : i + 1;
|
int index = i == 6 ? 0 : i + 1;
|
||||||
|
|
||||||
<td>@Model.Entries[index].Entries.ASMUnloadTempsLessThan700</td>
|
if (@Model.CurrentEntries[index].ASMUnloadTempsLessThan700 != 0)
|
||||||
|
{
|
||||||
ASMUnloadTemps += @Model.Entries[index].Entries.ASMUnloadTempsLessThan700;
|
<td>@Model.CurrentEntries[index].ASMUnloadTempsLessThan700</td>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASMUnloadTemps += @Model.CurrentEntries[index].ASMUnloadTempsLessThan700;
|
||||||
}
|
}
|
||||||
<td>@(ASMUnloadTemps / count)</td>
|
<td>@(ASMUnloadTemps / numberOfDaysInWeek)</td>
|
||||||
<td>0</td>
|
<td>0</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">HTRs <700C (Unload Temps)</td>
|
<td scope="row">HTRs <700C (Unload Temps)</td>
|
||||||
@for (int i = 0; i < 7; i++)
|
@for (int i = 0; i < 7; i++)
|
||||||
{
|
|
||||||
if (i < Model.Entries.Count)
|
|
||||||
{
|
{
|
||||||
int index = i == 6 ? 0 : i + 1;
|
int index = i == 6 ? 0 : i + 1;
|
||||||
|
|
||||||
<td>@Model.Entries[index].Entries.HTRUnloadTempsLessThan700</td>
|
if (@Model.CurrentEntries[index].HTRUnloadTempsLessThan700 != 0)
|
||||||
|
{
|
||||||
HTRUnloadTemps += @Model.Entries[index].Entries.HTRUnloadTempsLessThan700;
|
<td>@Model.CurrentEntries[index].HTRUnloadTempsLessThan700</td>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<td></td>
|
<td></td>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HTRUnloadTemps += @Model.CurrentEntries[index].HTRUnloadTempsLessThan700;
|
||||||
}
|
}
|
||||||
<td>@(HTRUnloadTemps / count)</td>
|
<td>@(HTRUnloadTemps / numberOfDaysInWeek)</td>
|
||||||
<td>0</td>
|
<td>0</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</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"
|
||||||
|
]
|
||||||
|
}
|
@ -151,3 +151,11 @@ function expandYield() {
|
|||||||
else
|
else
|
||||||
document.getElementById("yieldImage").src = "../Images/plusIcon.png";
|
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