467 lines
18 KiB
Plaintext
467 lines
18 KiB
Plaintext
@page "/DailyReport"
|
|
@using ReportingServices.Shared.Models.ProductionReport;
|
|
@using ReportingServices.Shared.ViewModels.ProductionReport;
|
|
|
|
<PageTitle>Daily Passdown | Mesa Reporting Services</PageTitle>
|
|
|
|
<div aria-label="breadcrumb">
|
|
<ol class="breadcrumb">
|
|
<li class="breadcrumb-item">
|
|
<a href="">Home</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="ProductionReport">Production Reports</a>
|
|
</li>
|
|
<li class="breadcrumb-item active" aria-current="page">Production Passdown Report</li>
|
|
</ol>
|
|
</div>
|
|
<br />
|
|
|
|
<div class="text-center">
|
|
<h2>Daily Report - ScrapeDB</h2>
|
|
<br /><br />
|
|
</div>
|
|
|
|
@if (_dailyReport is null || _rpt is null)
|
|
{
|
|
<MudProgressCircular Color="Color.Default" Indeterminate="true" />
|
|
}
|
|
else
|
|
{
|
|
<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 />
|
|
|
|
<div class="table-responsive dailyReportTable">
|
|
<ReportingServices.Client.Shared.DailyReport YieldStatistics=_dailyReport.CurrentWeek YieldOutDays=@(_dailyReport.CurrentWeek.OutsByDay.Count - 1) NumberOfDaysInWeek=_dailyReport.CurrentWeek.OutsByDay.Count></ReportingServices.Client.Shared.DailyReport>
|
|
</div>
|
|
|
|
<div class="table-responsive dailyReportTable hidden">
|
|
<ReportingServices.Client.Shared.DailyReport YieldStatistics=_dailyReport.PreviousWeek YieldOutDays=_dailyReport.PreviousWeek.OutsByDay.Count NumberOfDaysInWeek=_dailyReport.PreviousWeek.OutsByDay.Count></ReportingServices.Client.Shared.DailyReport>
|
|
</div>
|
|
|
|
<br />
|
|
<h5>Daily Target Summary</h5>
|
|
<ul>
|
|
<li>Operator HC: (Days/Nights) @_rpt.OperatorHeadcountDays/@_rpt.OperatorHeadcountNights</li>
|
|
<li>Total Call Outs: (Days/Nights) @_rpt.OperatorCallOutsDays/@_rpt.OperatorCallOutsNights</li>
|
|
<li>Engineering HC: @_rpt.EngineeringHeadcountDays/@_rpt.EngineeringHeadcountNights</li>
|
|
<li>Total Call Outs: (Days/Nights) @_rpt.EngineeringCallOutsDays/@_rpt.EngineeringCallOutsNights</li>
|
|
<li>Maintenance HC: @_rpt.MaintenanceHeadcountDays/@_rpt.MaintenanceHeadcountNights</li>
|
|
<li>Total Call Outs: (Days/Nights) @_rpt.MaintenanceCallOutsDays/@_rpt.MaintenanceCallOutsNights</li>
|
|
</ul>
|
|
<br />
|
|
<ul>
|
|
@{
|
|
int bottleChanges = 0;
|
|
int dailyPartChanges = 0;
|
|
int weeklyPartChanges = 0;
|
|
|
|
string bottle = "";
|
|
string daily = "";
|
|
string weekly = "";
|
|
|
|
if (!string.IsNullOrEmpty(_rpt.BottleChanges))
|
|
{
|
|
bottle = string.Join(", ", _rpt.BottleChanges.Split(','));
|
|
bottleChanges = _rpt.BottleChanges.Split(',').Length;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(_rpt.DailyPartChanges))
|
|
{
|
|
daily = string.Join(", ", _rpt.DailyPartChanges.Split(','));
|
|
dailyPartChanges = _rpt.DailyPartChanges.Split(',').Length;
|
|
}
|
|
|
|
|
|
if (!string.IsNullOrEmpty(_rpt.WeeklyPartChanges))
|
|
{
|
|
weekly = string.Join(", ", _rpt.WeeklyPartChanges.Split(','));
|
|
weeklyPartChanges = _rpt.WeeklyPartChanges.Split(',').Length;
|
|
}
|
|
|
|
|
|
}
|
|
<li>Bottle Change (@bottleChanges): @bottle</li>
|
|
<li>Daily Part Changes (@dailyPartChanges): @daily</li>
|
|
<li>Weekly Part Changes (@weeklyPartChanges): @weekly</li>
|
|
</ul>
|
|
<br />
|
|
<a class="btn btn-light" href="EditDailyReport">Edit</a>
|
|
<br /><br />
|
|
<h5>Current Reactors Down(@_dailyReport.ToolEvents.Where(x => x.IsInProduction == false).Count()):</h5>
|
|
<div class="row">
|
|
<div class="col-lg-6">
|
|
@{
|
|
List<ToolEventView> asmTools = _dailyReport.ToolEvents.Where(x => x.IsInProduction == false && x.Type.Contains("ASM")).ToList();
|
|
}
|
|
ASM(@asmTools.Count())
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Reactor</th>
|
|
<th scope="col">Owner</th>
|
|
<th scope="col">Issue</th>
|
|
<th scope="col">Downtime</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (ToolEventView tool in asmTools)
|
|
{
|
|
string owner = "";
|
|
|
|
if (_dailyReport.ToolStatesByOwner["Maintenance"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Maint";
|
|
else if (_dailyReport.ToolStatesByOwner["Engineering"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Eng";
|
|
else
|
|
owner = "Prod";
|
|
|
|
if (tool.Downtime > 12)
|
|
_myClass = "tableDowntime";
|
|
else
|
|
_myClass = "";
|
|
|
|
<tr class="@_myClass">
|
|
<td>@tool.Reactor</td>
|
|
<td>@owner</td>
|
|
<td>@tool.MostRecentEvent.COMMENT</td>
|
|
<td>@string.Format("{0:##,###.##}", tool.Downtime)</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-lg-6">
|
|
@{
|
|
List<ToolEventView> eppTools = _dailyReport.ToolEvents.Where(x => x.IsInProduction == false && x.Type.Contains("EPP")).ToList();
|
|
}
|
|
EPP(@eppTools.Count())
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Reactor</th>
|
|
<th scope="col">Owner</th>
|
|
<th scope="col">Issue</th>
|
|
<th scope="col">Downtime</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (ToolEventView tool in eppTools)
|
|
{
|
|
string owner = "";
|
|
|
|
if (_dailyReport.ToolStatesByOwner["Maintenance"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Maint";
|
|
else if (_dailyReport.ToolStatesByOwner["Engineering"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Eng";
|
|
else
|
|
owner = "Prod";
|
|
|
|
if (tool.Downtime > 12)
|
|
_myClass = "tableDowntime";
|
|
else
|
|
_myClass = "";
|
|
|
|
<tr class="@_myClass">
|
|
<td>@tool.Reactor</td>
|
|
<td>@owner</td>
|
|
<td>@tool.MostRecentEvent.COMMENT</td>
|
|
<td>@string.Format("{0:##,###.##}", tool.Downtime)</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-lg-6">
|
|
@{
|
|
List<ToolEventView> htrTools = _dailyReport.ToolEvents.Where(x => x.IsInProduction == false && x.Type.Contains("HTR")).ToList();
|
|
}
|
|
HTR(@htrTools.Count())
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Reactor</th>
|
|
<th scope="col">Owner</th>
|
|
<th scope="col">Issue</th>
|
|
<th scope="col">Downtime</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (ToolEventView tool in htrTools)
|
|
{
|
|
string owner = "";
|
|
|
|
if (_dailyReport.ToolStatesByOwner["Maintenance"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Maint";
|
|
else if (_dailyReport.ToolStatesByOwner["Engineering"].Contains(tool.MostRecentEvent.REACT_MODE))
|
|
owner = "Eng";
|
|
else
|
|
owner = "Prod";
|
|
|
|
if (tool.Downtime > 12)
|
|
_myClass = "tableDowntime";
|
|
else
|
|
_myClass = "";
|
|
|
|
<tr class="@_myClass">
|
|
<td>@tool.Reactor</td>
|
|
<td>@owner</td>
|
|
<td>@tool.MostRecentEvent.COMMENT</td>
|
|
<td>@string.Format("{0:##,###.##}", tool.Downtime)</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
<p> *Rows highlighted in orange have been down for more than 12 hours</p>
|
|
</div>
|
|
</div>
|
|
<ul>
|
|
<li>Application ENG (0):</li>
|
|
<li>Reactors (Capacity @(_dailyReport.NumberOfToolsWaferSize6IN + _dailyReport.NumberOfToolsWaferSize8IN))
|
|
<ul>
|
|
<li>150mm - @_dailyReport.NumberOfToolsWaferSize6IN</li>
|
|
<li>200mm - @_dailyReport.NumberOfToolsWaferSize8IN</li>
|
|
</ul>
|
|
</li>
|
|
<li>Scheduled Reactors (@(_dailyReport.NumberOfToolsWaferSize6INScheduled + _dailyReport.NumberOfToolsWaferSize8INScheduled)):
|
|
<ul>
|
|
<li>150mm - @_dailyReport.NumberOfToolsWaferSize6INScheduled</li>
|
|
<li>200mm - @_dailyReport.NumberOfToolsWaferSize8INScheduled</li>
|
|
</ul>
|
|
</li>
|
|
<li>Dual Layer Reactors
|
|
<ul>
|
|
<li>ASM - @(string.Join(',', _dailyReport.DualLayerReactors["ASM"]))</li>
|
|
<li>HTR - @(string.Join(',', _dailyReport.DualLayerReactors["HTR"]))</li>
|
|
<li>EpiPro - @(string.Join(',', _dailyReport.DualLayerReactors["EPP"]))</li>
|
|
</ul>
|
|
</li>
|
|
<li>Metrology Down (@_dailyReport.MetrologyEvents.Count()):
|
|
@if (@_dailyReport.MetrologyEvents.Count() > 0)
|
|
{
|
|
<ul>
|
|
@foreach (ToolEvent tool in @_dailyReport.MetrologyEvents)
|
|
{
|
|
<li>@tool.TOOL_ID</li>
|
|
}
|
|
</ul>
|
|
}
|
|
</li>
|
|
<li>Cleans (@_dailyReport.CleanEvents.Count()):
|
|
@if (@_dailyReport.CleanEvents.Count() > 0)
|
|
{
|
|
<ul>
|
|
@foreach (ToolEvent tool in @_dailyReport.CleanEvents)
|
|
{
|
|
<li>@tool.TOOL_ID</li>
|
|
}
|
|
</ul>
|
|
}
|
|
</li>
|
|
</ul>
|
|
<br /><br />
|
|
<div class="table-responsive">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col"></th>
|
|
<th scope="col">Monday</th>
|
|
<th scope="col">Tuesday</th>
|
|
<th scope="col">Wednesday</th>
|
|
<th scope="col">Thursday</th>
|
|
<th scope="col">Friday</th>
|
|
<th scope="col">Saturday</th>
|
|
<th scope="col">Sunday</th>
|
|
<th scope="col">WTD</th>
|
|
<th scope="col">Daily / Weekly</th>
|
|
</tr>
|
|
<tr>
|
|
<th scope="col"></th>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
<th scope="col">@_dailyReport.StartDate.AddDays(i).ToString("MM/dd/yyyy")</th>
|
|
}
|
|
<th scope="col">Actual</th>
|
|
<th scope="col">Target</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td scope="row">ASMs Uptime</td>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
asmTools = _dailyReport.ToolEvents.Where(x => x.Type.Contains("ASM")).ToList();
|
|
|
|
double availablePct = 0;
|
|
|
|
if (i < asmTools[0].Uptime.Count)
|
|
{
|
|
for (int j = 0; j < asmTools.Count; j++)
|
|
{
|
|
availablePct += asmTools[j].Uptime[i].UptimePercentage;
|
|
}
|
|
|
|
if (availablePct / asmTools.Count < .82)
|
|
_myClass = "table-danger text-danger";
|
|
else
|
|
_myClass = "";
|
|
|
|
<td class="@_myClass">@string.Format("{0:P2}", availablePct / asmTools.Count)</td>
|
|
|
|
_ASMAvailablePct += availablePct / asmTools.Count;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@string.Format("{0:P2}", _ASMAvailablePct / _numberOfDaysInWeek)</td>
|
|
<td>82%</td>
|
|
</tr>
|
|
<tr>
|
|
<td scope="row">EPPs Uptime</td>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
eppTools = _dailyReport.ToolEvents.Where(x => x.Type.Contains("EPP")).ToList();
|
|
|
|
double availablePct = 0;
|
|
|
|
if (i < eppTools[0].Uptime.Count)
|
|
{
|
|
for (int j = 0; j < eppTools.Count; j++)
|
|
{
|
|
availablePct += eppTools[j].Uptime[i].UptimePercentage;
|
|
}
|
|
|
|
if (availablePct / eppTools.Count < .60)
|
|
_myClass = "table-danger text-danger";
|
|
else
|
|
_myClass = "";
|
|
|
|
<td class="@_myClass">@string.Format("{0:P2}", availablePct / eppTools.Count)</td>
|
|
|
|
_EPPAvailablePct += availablePct / eppTools.Count;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@string.Format("{0:P2}", _EPPAvailablePct / _numberOfDaysInWeek)</td>
|
|
<td>60%</td>
|
|
</tr>
|
|
<tr>
|
|
<td scope="row">HTRs Uptime</td>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
htrTools = _dailyReport.ToolEvents.Where(x => x.Type.Contains("HTR")).ToList();
|
|
|
|
double availablePct = 0;
|
|
|
|
if (i < htrTools[0].Uptime.Count)
|
|
{
|
|
for (int j = 0; j < htrTools.Count; j++)
|
|
{
|
|
availablePct += htrTools[j].Uptime[i].UptimePercentage;
|
|
}
|
|
|
|
if (availablePct / htrTools.Count < .78)
|
|
_myClass = "table-danger text-danger";
|
|
else
|
|
_myClass = "";
|
|
|
|
<td class="@_myClass">@string.Format("{0:P2}", availablePct / htrTools.Count)</td>
|
|
|
|
_HTRAvailablePct += availablePct / htrTools.Count;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@string.Format("{0:P2}", _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 < _dailyReport.SLLTools.Count())
|
|
{
|
|
<td>@_dailyReport.SLLTools[i].ASM</td>
|
|
|
|
_ASMSLL += @_dailyReport.SLLTools[i].ASM;
|
|
}
|
|
else
|
|
{
|
|
<td></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++)
|
|
{
|
|
int index = i == 6 ? 0 : i + 1;
|
|
|
|
if (i < _dailyReport.SLLTools.Count())
|
|
{
|
|
<td>@_dailyReport.SLLTools[i].HTR</td>
|
|
|
|
_HTRSLL += @_dailyReport.SLLTools[i].HTR;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@(_HTRSLL / _numberOfDaysInWeek)</td>
|
|
<td>0</td>
|
|
</tr>
|
|
<tr>
|
|
<td scope="row">ASMs <700C (Unload Temps)</td>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
if (i < _dailyReport.UnloadTempsByDay.Count())
|
|
{
|
|
<td>@_dailyReport.UnloadTempsByDay[i].ASMUnloadsBelow700</td>
|
|
|
|
_ASMUnloadTemps += @_dailyReport.UnloadTempsByDay[i].ASMUnloadsBelow700;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@(_ASMUnloadTemps / _numberOfDaysInWeek)</td>
|
|
<td>0</td>
|
|
</tr>
|
|
<tr>
|
|
<td scope="row">HTRs <700C (Unload Temps)</td>
|
|
@for (int i = 0; i < 7; i++)
|
|
{
|
|
if (i < _dailyReport.UnloadTempsByDay.Count())
|
|
{
|
|
<td>@_dailyReport.UnloadTempsByDay[i].HTRUnloadsBelow700</td>
|
|
|
|
_HTRUnloadTemps += @_dailyReport.UnloadTempsByDay[i].HTRUnloadsBelow700;
|
|
}
|
|
else
|
|
{
|
|
<td></td>
|
|
}
|
|
}
|
|
<td>@(_HTRUnloadTemps / _numberOfDaysInWeek)</td>
|
|
<td>0</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
} |