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

@ -1,16 +1,7 @@
@using ReportingServices.ReportingObjects
@model ReportingServices.Models.ProductionReport.DailyReport
@{
DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
int dayOfWeek = (int)DateTime.Now.DayOfWeek;
int totalWafersOut = 0;
int totalCustomerScrap = 0;
int totalManufacturingScrap = 0;
int totalProdScrap = 0;
int totalYieldedWafersOut = 0;
int deltaToCommit = 0;
int deltaToPlan = 0;
float totalYield = 0f;
int ASMAvailablePct = 0;
int EPPAvailablePct = 0;
@ -24,44 +15,20 @@
int reportIndex = (int)DateTime.Now.DayOfWeek;
ManualReportEntries rpt = Model.Entries[reportIndex].Entries;
int numberOfDaysInWeek = Model.CurrentWeek.OutsByDay.Count;
ManualReportEntries rpt = Model.CurrentEntries[reportIndex];
string myClass;
List<string> toolsDownGreaterThan12Hours = new();
foreach (KeyValuePair<string, ToolStateByType> state in Model.ToolStateByType)
{
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
if (state.Key != "Metrology" && state.Key != "Cleans")
toolsDownGreaterThan12Hours.AddRange(state.Value.ToolsDownGreaterThan12Hours);
}
toolsDownGreaterThan12Hours.Sort();
switch (dayOfWeek)
{
case 0:
startDate = startDate.AddDays(-6);
break;
case 1:
startDate = startDate.AddDays(-7);
break;
case 2:
startDate = startDate.AddDays(-1);
break;
case 3:
startDate = startDate.AddDays(-2);
break;
case 4:
startDate = startDate.AddDays(-3);
break;
case 5:
startDate = startDate.AddDays(-4);
break;
case 6:
startDate = startDate.AddDays(-5);
break;
default:
break;
}
}
@{
@ -81,237 +48,19 @@
<h2>Daily Report</h2>
<br /><br />
</div>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th scope="col" rowspan="2" class="text-center align-middle">SI Operations</th>
@for (int i = 0; i < 7; i++)
{
<th scope="col" class="text-center">@startDate.AddDays(i).ToString("MM/dd/yyyy")</th>
}
<th scope="col" rowspan="2" class="text-center align-middle">Weekly Total</th>
<th scope="col" rowspan="2" class="text-center align-middle">Comment</th>
</tr>
<tr>
<th scope="col" class="text-center">Monday</th>
<th scope="col" class="text-center">Tuesday</th>
<th scope="col" class="text-center">Wednesday</th>
<th scope="col" class="text-center">Thursday</th>
<th scope="col" class="text-center">Friday</th>
<th scope="col" class="text-center">Saturday</th>
<th scope="col" class="text-center">Sunday</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="row">Commited Target to meet Shipment Requirements</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">4,500</td>
<td class="text-center">31,500</td>
<td>Number updated quarterly</td>
</tr>
<tr>
<td scope="row">Actual Reactor Out</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.OutsByDay.Count)
{
int reactorMoves = Model.OutsByDay[i].TotalWafers;
<td class="text-center">@reactorMoves</td>
<button class="btn btn-outline-dark float-start dailyReportTable" onclick="toggleWeek()">View Previous Week</button>
<button class="btn btn-outline-dark float-end dailyReportTable hidden" onclick="toggleWeek()">View Current Week</button>
<br /><br />
totalWafersOut += reactorMoves;
}
else
{
<td></td>
}
}
<td class="text-center">@totalWafersOut</td>
<td>Before Scrap</td>
</tr>
<tr>
<td scope="row" id="expandYield">
Actual Yielded Wafers Out &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;
if (@Model.CurrentEntries[index].ASMSingleLoadLock != 0)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.ASMSingleLoadLock</td>
ASMSLL += @Model.Entries[index].Entries.ASMSingleLoadLock;
<td>@Model.CurrentEntries[index].ASMSingleLoadLock</td>
}
else
{
<td></td>
}
ASMSLL += @Model.CurrentEntries[index].ASMSingleLoadLock;
}
<td>@(ASMSLL / count)</td>
<td>@(ASMSLL / numberOfDaysInWeek)</td>
<td>0</td>
</tr>
<tr>
<td scope="row">HTRs SLL Tool Count</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.Entries.Count)
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].HTRSingleLoadLock != 0)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.HTRSingleLoadLock</td>
HTRSLL += @Model.Entries[index].Entries.HTRSingleLoadLock;
<td>@Model.CurrentEntries[index].HTRSingleLoadLock</td>
}
else
{
<td></td>
}
HTRSLL += @Model.CurrentEntries[index].HTRSingleLoadLock;
}
<td>@(HTRSLL / count)</td>
<td>@(HTRSLL / numberOfDaysInWeek)</td>
<td>0</td>
</tr>
<tr>
<td scope="row">ASMs &lt;700C (Unload Temps)</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.Entries.Count)
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].ASMUnloadTempsLessThan700 != 0)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.ASMUnloadTempsLessThan700</td>
ASMUnloadTemps += @Model.Entries[index].Entries.ASMUnloadTempsLessThan700;
<td>@Model.CurrentEntries[index].ASMUnloadTempsLessThan700</td>
}
else
{
<td></td>
}
ASMUnloadTemps += @Model.CurrentEntries[index].ASMUnloadTempsLessThan700;
}
<td>@(ASMUnloadTemps / count)</td>
<td>@(ASMUnloadTemps / numberOfDaysInWeek)</td>
<td>0</td>
</tr>
<tr>
<td scope="row">HTRs &lt;700C (Unload Temps)</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.Entries.Count)
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].HTRUnloadTempsLessThan700 != 0)
{
int index = i == 6 ? 0 : i + 1;
<td>@Model.Entries[index].Entries.HTRUnloadTempsLessThan700</td>
HTRUnloadTemps += @Model.Entries[index].Entries.HTRUnloadTempsLessThan700;
<td>@Model.CurrentEntries[index].HTRUnloadTempsLessThan700</td>
}
else
{
<td></td>
}
HTRUnloadTemps += @Model.CurrentEntries[index].HTRUnloadTempsLessThan700;
}
<td>@(HTRUnloadTemps / count)</td>
<td>@(HTRUnloadTemps / numberOfDaysInWeek)</td>
<td>0</td>
</tr>
</tbody>