Reorganized project structure to separate backend process from frontend process.

This commit is contained in:
Daniel Wathen
2022-12-22 12:10:18 -07:00
parent b5def3da89
commit 80696e5fe6
131 changed files with 494 additions and 347 deletions

View File

@ -0,0 +1,429 @@
@model DailyReport
@{
int ASMAvailablePct = 0;
int EPPAvailablePct = 0;
int HTRAvailablePct = 0;
int ASMSLL = 0;
int HTRSLL = 0;
int ASMUnloadTemps = 0;
int HTRUnloadTemps = 0;
int reportIndex = (int)DateTime.Now.DayOfWeek;
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();
}
@{
ViewData["Title"] = "Daily Passdown | Mesa Reporting Services";
}
<div aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
<li class="breadcrumb-item"><a asp-area="" asp-controller="ProductionReport" asp-action="Index">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</h2>
<br /><br />
</div>
<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">
<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>
<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>
<li>Bottle Change (@rpt.BottleChanges.Split(',').Length): @string.Join(", ", rpt.BottleChanges.Split(','))</li>
<li>Daily Part Changes (@rpt.DailyPartChanges.Split(',').Length): @string.Join(", ", rpt.DailyPartChanges.Split(','))</li>
<li>Weekly Part Changes (@rpt.WeeklyPartChanges.Split(',').Length): @string.Join(", ", rpt.WeeklyPartChanges.Split(','))</li>
</ul>
<br />
<a class="btn btn-light" asp-controller="ProductionReport" asp-action="EditDailyReport">Edit</a>
<br /><br />
<h5>Current Reactors Down(@(Model.ToolStateByType["ASM"].DownTools + Model.ToolStateByType["EPP"].DownTools + Model.ToolStateByType["HTR"].DownTools)):</h5>
<div class="row">
<div class="col-lg-4">
ASM(@Model.ToolStateByType["ASM"].DownTools)
<table class="table table-sm">
<thead>
<tr>
<th scope="col">Reactor</th>
<th scope="col">Owner</th>
<th scope="col">Issue</th>
</tr>
</thead>
<tbody>
@foreach (ToolStateCurrent tool in Model.ToolStateByType["ASM"].ToolStateCurrents)
{
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>@owner</td>
<td>@tool.Comment</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-lg-4">
EPP(@Model.ToolStateByType["EPP"].DownTools)
<table class="table table-sm">
<thead>
<tr>
<th scope="col">Reactor</th>
<th scope="col">Owner</th>
<th scope="col">Issue</th>
</tr>
</thead>
<tbody>
@foreach (ToolStateCurrent tool in Model.ToolStateByType["EPP"].ToolStateCurrents)
{
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>@owner</td>
<td>@tool.Comment</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-lg-4">
HTR(@Model.ToolStateByType["HTR"].DownTools)
<table class="table table-sm">
<thead>
<tr>
<th scope="col">Reactor</th>
<th scope="col">Owner</th>
<th scope="col">Issue</th>
</tr>
</thead>
<tbody>
@foreach (ToolStateCurrent tool in Model.ToolStateByType["HTR"].ToolStateCurrents)
{
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>@owner</td>
<td>@tool.Comment</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
<ul>
<li>Application ENG (0):</li>
<li>Reactors (Capacity @(Model.NumberOfToolsWaferSize6IN + Model.NumberOfToolsWaferSize8IN))
<ul>
<li>150mm - @Model.NumberOfToolsWaferSize6IN</li>
<li>200mm - @Model.NumberOfToolsWaferSize8IN</li>
</ul>
</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
<ul>
<li>ASM - @(string.Join(',', Model.DualLayerReactors["ASM"]))</li>
<li>HTR - @(string.Join(',', Model.DualLayerReactors["HTR"]))</li>
<li>EpiPro - @(string.Join(',', Model.DualLayerReactors["EPP"]))</li>
</ul>
</li>
<li>Engineering Focus Tools (Down > 12 hours)
<ul>
<li>@string.Join(",", toolsDownGreaterThan12Hours)</li>
</ul>
</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">
<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">@Model.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++)
{
if (i < Model.ToolAvailibilityByType["ASM"].Count)
{
int availiblePct = (int)Math.Round(float.Parse(Model.ToolAvailibilityByType["ASM"][i].AvailablePct));
if (availiblePct < 82)
myClass = "table-danger text-danger";
else
myClass = "";
<td class="@myClass">@(availiblePct + "%")</td>
ASMAvailablePct += availiblePct;
}
else
{
<td></td>
}
}
<td>@(ASMAvailablePct / numberOfDaysInWeek + "%")</td>
<td>82%</td>
</tr>
<tr>
<td scope="row">EPPs Uptime</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.ToolAvailibilityByType["EPP"].Count)
{
int availiblePct = (int)Math.Round(float.Parse(Model.ToolAvailibilityByType["EPP"][i].AvailablePct));
if (availiblePct < 60)
myClass = "table-danger text-danger";
else
myClass = "";
<td class="@myClass">@(availiblePct + "%")</td>
EPPAvailablePct += availiblePct;
}
else
{
<td></td>
}
}
<td>@(EPPAvailablePct / numberOfDaysInWeek + "%")</td>
<td>60%</td>
</tr>
<tr>
<td scope="row">HTRs Uptime</td>
@for (int i = 0; i < 7; i++)
{
if (i < Model.ToolAvailibilityByType["HTR"].Count)
{
int availiblePct = (int)Math.Round(float.Parse(Model.ToolAvailibilityByType["HTR"][i].AvailablePct));
if (availiblePct < 78)
myClass = "table-danger text-danger";
else
myClass = "";
<td class="@myClass">@(availiblePct + "%")</td>
HTRAvailablePct += availiblePct;
}
else
{
<td></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++)
{
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].ASMSingleLoadLock != 0)
{
<td>@Model.CurrentEntries[index].ASMSingleLoadLock</td>
}
else
{
<td></td>
}
ASMSLL += @Model.CurrentEntries[index].ASMSingleLoadLock;
}
<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 (@Model.CurrentEntries[index].HTRSingleLoadLock != 0)
{
<td>@Model.CurrentEntries[index].HTRSingleLoadLock</td>
}
else
{
<td></td>
}
HTRSLL += @Model.CurrentEntries[index].HTRSingleLoadLock;
}
<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++)
{
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].ASMUnloadTempsLessThan700 != 0)
{
<td>@Model.CurrentEntries[index].ASMUnloadTempsLessThan700</td>
}
else
{
<td></td>
}
ASMUnloadTemps += @Model.CurrentEntries[index].ASMUnloadTempsLessThan700;
}
<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++)
{
int index = i == 6 ? 0 : i + 1;
if (@Model.CurrentEntries[index].HTRUnloadTempsLessThan700 != 0)
{
<td>@Model.CurrentEntries[index].HTRUnloadTempsLessThan700</td>
}
else
{
<td></td>
}
HTRUnloadTemps += @Model.CurrentEntries[index].HTRUnloadTempsLessThan700;
}
<td>@(HTRUnloadTemps / numberOfDaysInWeek)</td>
<td>0</td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,244 @@
@model ManualReportEntries
@{
ViewData["Title"] = "Edit Daily Passdown | Mesa Reporting Services";
}
<div aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
<li class="breadcrumb-item"><a asp-area="" asp-controller="ProductionReport" asp-action="Index">Production Reports</a></li>
<li class="breadcrumb-item active" aria-current="page">Edit Passdown</li>
</ol>
</div>
<br />
<div class="container">
<h1 class="text-center">Edit Daily Targets</h1>
<form method="post" action="EditDailyReport">
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Operator Headcount:</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="OperatorHeadcountDays" name="OperatorHeadcountDays">
@for (int i = 0; i <= 15; i++)
{
<option selected="@(i == Model.OperatorHeadcountDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="OperatorHeadcountNights" name="OperatorHeadcountNights">
@for (int i = 0; i <= 15; i++)
{
<option selected="@(i == Model.OperatorHeadcountNights)">@i</option>
}
</select>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Total Call Outs (Operators):</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="OperatorCallOutsDays" name="OperatorCallOutsDays">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.OperatorCallOutsDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="OperatorCallOutsNights" name="OperatorCallOutsNights">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.OperatorCallOutsNights)">@i</option>
}
</select>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Engineering Headcount:</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="EngineeringHeadcountDays" name="EngineeringHeadcountDays">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.EngineeringHeadcountDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="EngineeringHeadcountNights" name="EngineeringHeadcountNights">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.EngineeringHeadcountNights)">@i</option>
}
</select>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Total Call Outs (Engineers):</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="EngineerCallOutsDays" name="EngineeringCallOutsDays">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.EngineeringCallOutsDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="EngineerCallOutsNights" name="EngineeringCallOutsNights">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.EngineeringCallOutsNights)">@i</option>
}
</select>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Maintenance Headcount:</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="MaintenanceHeadcountDays" name="MaintenanceHeadcountDays">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.MaintenanceHeadcountDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="MaintenanceHeadcountNights" name="MaintenanceHeadcountNights">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.MaintenanceHeadcountNights)">@i</option>
}
</select>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-6">
<h6 style="padding-top: 10px;">Total Call Outs (Maintenance):</h6>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="MaintenanceCallOutsDays" name="MaintenanceCallOutsDays">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.MaintenanceCallOutsDays)">@i</option>
}
</select>
</div>
<div class="col-lg-2 col-3">
<select class="form-control" id="MaintenanceCallOutsNights" name="MaintenanceCallOutsNights">
@for (int i = 0; i <= 5; i++)
{
<option selected="@(i == Model.MaintenanceCallOutsNights)">@i</option>
}
</select>
</div>
</div>
<br /><br />
<div id="bottleChanges" class="row myMultiselect" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-md-4">
<h6>Bottle Changes:</h6>
</div>
<div class="form-group col-lg-4 col-md-5">
<div class="mySelectLabel selectBox" onclick="toggleCheckboxArea()">
<select class="form-select" name="BottleChanges">
<option>somevalue</option>
</select>
<div class="overSelect"></div>
</div>
<div class="mySelectOptions">
@for (int i = 20; i < 80; i++)
{
string isMatching = "";
string[] bottleChanges = Model.BottleChanges.Split(',');
for (int j = 0; j < bottleChanges.Length; j++)
{
if (bottleChanges[j] == "R" + i)
isMatching = "checked";
}
<label><input type="checkbox" onchange="checkboxStatusChange()" value="@("R" + i)" @isMatching />@(" R" + i)</label>
}
</div>
</div>
<div class="col-lg-2 col-md-3">
<button class="btn btn-info" type="button" onclick="clearList()">Clear List</button>
</div>
</div>
<div id="dailyPartChanges" class="row myMultiselect" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-md-4">
<h6>Daily Part Changes:</h6>
</div>
<div class="form-group col-lg-4 col-md-5">
<div class="mySelectLabel selectBox" onclick="toggleCheckboxArea()">
<select class="form-select" name="DailyPartChanges">
<option>somevalue</option>
</select>
<div class="overSelect"></div>
</div>
<div class="mySelectOptions">
@for (int i = 20; i < 80; i++)
{
string isMatching = "";
string[] dailyPartChanges = Model.DailyPartChanges.Split(',');
for (int j = 0; j < dailyPartChanges.Length; j++)
{
if (dailyPartChanges[j] == "R" + i)
isMatching = "checked";
}
<label><input type="checkbox" onchange="checkboxStatusChange()" value="@("R" + i)" @isMatching />@(" R" + i)</label>
}
</div>
</div>
<div class="col-lg-2 col-md-3">
<button class="btn btn-info" type="button" onclick="clearList()">Clear List</button>
</div>
</div>
<div id="weeklyPartChanges" class="row myMultiselect" style="padding-top: 5px; padding-bottom: 5px;">
<div class="col-lg-3 col-md-4">
<h6>Weekly Part Changes:</h6>
</div>
<div class="form-group col-lg-4 col-md-5">
<div class="mySelectLabel selectBox" onclick="toggleCheckboxArea()">
<select class="form-select" name="WeeklyPartChanges">
<option>somevalue</option>
</select>
<div class="overSelect"></div>
</div>
<div class="mySelectOptions">
@for (int i = 20; i < 80; i++)
{
string isMatching = "";
string[] weeklyPartChanges = Model.WeeklyPartChanges.Split(',');
for (int j = 0; j < weeklyPartChanges.Length; j++)
{
if (weeklyPartChanges[j] == "R" + i)
isMatching = "checked";
}
<label><input type="checkbox" onchange="checkboxStatusChange()" value="@("R" + i)" @isMatching />@(" R" + i)</label>
}
</div>
</div>
<div class="col-lg-2 col-md-3">
<button class="btn btn-info" type="button" onclick="clearList()">Clear List</button>
</div>
</div>
<button type="submit" value="Submit" class="btn btn-light" style="margin-top: 5px;">Submit</button>
</form>
</div>

View File

@ -0,0 +1,19 @@
@{
ViewData["Title"] = "Production Reports | Mesa Reporting Services";
}
<div aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
<li class="breadcrumb-item active" aria-current="page">Production Reports</li>
</ol>
</div>
<br />
<div class="row">
<div class="col-3 d-grid">
<a class="btn btn-outline-secondary text-start" asp-area="" asp-controller="ProductionReport" asp-action="DailyReport" onclick="displayBusyIndicator()"><img src="~/Images/ReportFile.png" class="buttonImage float-start" />Production Passdown Report</a>
</div>
</div>
<partial name="_LoadingPartial" />