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:
Daniel Wathen
2022-12-07 10:44:11 -07:00
parent 3409ad58b7
commit 4592b035b6
16 changed files with 651 additions and 576 deletions

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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"]);

View 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;
}
}
}

View File

@ -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; }

View File

@ -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;
}
}
}

View 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; }
}
}

View File

@ -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++;
}
}

View File

@ -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>

View File

@ -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)
{
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;
<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 />
<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 &nbsp;&nbsp;&nbsp;
<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;
<td>@Model.Entries[index].Entries.ASMSingleLoadLock</td>
ASMSLL += @Model.Entries[index].Entries.ASMSingleLoadLock;
if (@Model.CurrentEntries[index].ASMSingleLoadLock != 0)
{
<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;
<td>@Model.Entries[index].Entries.HTRSingleLoadLock</td>
HTRSLL += @Model.Entries[index].Entries.HTRSingleLoadLock;
if (@Model.CurrentEntries[index].HTRSingleLoadLock != 0)
{
<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 &lt;700C (Unload Temps)</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.Entries.Count)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.ASMUnloadTempsLessThan700</td>
ASMUnloadTemps += @Model.Entries[index].Entries.ASMUnloadTempsLessThan700;
if (@Model.CurrentEntries[index].ASMUnloadTempsLessThan700 != 0)
{
<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 &lt;700C (Unload Temps)</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.Entries.Count)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.HTRUnloadTempsLessThan700</td>
HTRUnloadTemps += @Model.Entries[index].Entries.HTRUnloadTempsLessThan700;
if (@Model.CurrentEntries[index].HTRUnloadTempsLessThan700 != 0)
{
<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>

View 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 &nbsp;&nbsp;&nbsp;
<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

View 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"
]
}

View File

@ -151,3 +151,11 @@ function expandYield() {
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");
}
}