Updated daily report to show correct information when two work weeks split quarters.

Also current changes to project with Blazor implementation is implemented here as well.
This commit is contained in:
Daniel Wathen
2023-04-03 09:58:28 -07:00
parent f77d723576
commit 72e7a55ab4
305 changed files with 148901 additions and 4 deletions

View File

@ -0,0 +1,5 @@
namespace ReportingServices.Blazor.Components.DailyReport;
public partial class DailySnapshot
{
}

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,5 @@
namespace ReportingServices.Blazor.Components.DailyReport;
public partial class DownedTools
{
}

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,5 @@
namespace ReportingServices.Blazor.Components.DailyReport;
public partial class FabBreakdown
{
}

View File

@ -0,0 +1,168 @@
@if (Dates != null)
{
<table class="table table-bordered">
<thead>
<tr>
<th scope="col" rowspan="2" class="text-center align-middle">SI Operations</th>
@foreach (DateTime date in Dates)
{
<th scope="col" class="text-center" >@date.ToShortDateString()</th>
}
<th scope="col" rowspan="2" class="text-center align-middle">Weekly Total</th>
<th scope="col" rowspan="2" class="text-center align-middle">QTD 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">Committed Target to meet Shipment Requirements</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers)</td>
<td class="text-center">@string.Format("{0:##,###}", DailyPlanWafers * 7)</td>
<td></td>
<td>Number updated quarterly</td>
</tr>
<tr>
<td scope="row">Actual Yielded Wafers Out</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].Outs)</td>
}
<td class="text-center">@string.Format("{0:##,###}", TotalWafersOut)</td>
<td class="text-center">@string.Format("{0:##,###}", QTDOutsAndScrap.Outs)</td>
<td>Before Scrap</td>
</tr>
<tr>
<td scope="row">Actual Reactor Out</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].YieldedOuts)</td>
}
<td class="text-center">@string.Format("{0:##,###}", TotalYieldedWafersOut)</td>
<td class="text-center">@string.Format("{0:##,###}", (QTDOutsAndScrap.Outs - QTDOutsAndScrap.CustomerScrap - QTDOutsAndScrap.ManufacturingScrap - QTDOutsAndScrap.ProductionScrap))</td>
<td>After Scrap</td>
</tr>
<tr>
<td scope="row" colspan="11" class="text-center">Yielded Wafers out Daily Average: @(string.Format("{0:##,###}", YieldedWafersPerDay))</td>
</tr>
<tr>
<td scope="row">Customer Scrap</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].CustomerScrap)</td>
}
<td class="text-center">@string.Format("{0:##,###}", TotalCustomerScrap)</td>
<td class="text-center">@string.Format("{0:##,###}", QTDOutsAndScrap.CustomerScrap)</td>
<td></td>
</tr>
<tr>
<td scope="row">Manufacturing Scrap</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].ManufacturingScrap)</td>
}
<td class="text-center">@string.Format("{0:##,###}", TotalManufacturingScrap)</td>
<td class="text-center">@string.Format("{0:##,###}", QTDOutsAndScrap.ManufacturingScrap)</td>
<td></td>
</tr>
<tr>
<td scope="row">Production Scrap</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].ProductionScrap)</td>
}
<td class="text-center">@string.Format("{0:##,###}", TotalProdScrap)</td>
<td class="text-center">@string.Format("{0:##,###}", QTDOutsAndScrap.ProductionScrap)</td>
<td></td>
</tr>
<tr>
<td scope="row">Yield</td>
@foreach (DateTime date in Dates)
{
string myClass = "";
if (WeeklyYieldStatistics[date].YieldPercent != 0)
{
if (WeeklyYieldStatistics[date].YieldPercent < 98)
myClass = "table-danger text-danger";
<td class="text-center @myClass">@string.Format("{0:P2}", WeeklyYieldStatistics[date].YieldPercent)</td>
}
else
{
<td></td>
}
}
<td class="text-center">@string.Format("{0:P2}", (double)(TotalWafersOut - TotalManufacturingScrap) / TotalWafersOut)</td>
<td class="text-center">@string.Format("{0:P2}", (double)(QTDOutsAndScrap.Outs - QTDOutsAndScrap.ManufacturingScrap) / QTDOutsAndScrap.Outs)</td>
<td></td>
</tr>
<tr>
<td scope="row">Delta to Commit</td>
@foreach (DateTime date in Dates)
{
string myClass = "";
if (WeeklyYieldStatistics[date].YieldedOuts != 0)
{
if (WeeklyYieldStatistics[date].YieldedOuts - DailyWafersForQTR < 0)
myClass = "table-danger text-danger";
<td class="text-center @myClass">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].YieldedOuts - DailyWafersForQTR)</td>
}
else
{
<td></td>
}
}
<td class="text-center">@string.Format("{0:##,###}", (TotalYieldedWafersOut - DailyWafersForQTR * (NumberCompletedDaysInWeek + AddExtraDay)))</td>
<td></td>
<td>Difference to Commit</td>
</tr>
<tr>
<td scope="row">Delta to the Plan</td>
@foreach (DateTime date in Dates)
{
string myClass = "";
if (WeeklyYieldStatistics[date].YieldedOuts != 0)
{
if (WeeklyYieldStatistics[date].YieldedOuts - DailyPlanWafers < 0)
myClass = "table-danger text-danger";
<td class="text-center @myClass">@string.Format("{0:##,###}", WeeklyYieldStatistics[date].YieldedOuts - DailyPlanWafers)</td>
}
else
{
<td></td>
}
}
<td class="text-center">@string.Format("{0:##,###}", (TotalYieldedWafersOut - DailyPlanWafers * (NumberCompletedDaysInWeek + AddExtraDay)))</td>
<td></td>
<td>Difference to Target</td>
</tr>
<tr>
<td scope="row">Wafers Needed to make QTR</td>
@foreach (DateTime date in Dates)
{
<td class="text-center">@string.Format("{0:##,###}", DailyWafersForQTR)</td>
}
<td class="text-center">@string.Format("{0:##,###}", DailyWafersForQTR * 7)</td>
<td></td>
<td>Number Updated Weekly</td>
</tr>
</tbody>
</table>
}

View File

@ -0,0 +1,157 @@
using Microsoft.AspNetCore.Components;
using ReportingServices.Blazor.Services;
using ReportingServices.Shared.Blazor.Models.ProductionReport;
namespace ReportingServices.Blazor.Components.DailyReport;
public partial class TargetsSummary
{
[Inject]
public AppData AppData { get; set; }
[Inject]
public ScrapeDBService Db { get; set; }
[Parameter]
public DateTime StartDate { get; set; }
[Parameter]
public DateTime EndDate { get; set; }
[Parameter]
public DateTime QuarterStartDate { get; set; }
[Parameter]
public QuarterlyTargets Targets { get; set; }
[Parameter]
public OutsAndScrapTotal QTDOutsAndScrap { get; set; }
private List<ReactorOutsByDay> OutsByDay { get; set; }
private List<ScrapByDay> ScrapByDay { get; set; }
private int DailyPlanWafers { get; set; }
private int DailyWafersForQTR { get; set; }
private YieldInformation YieldInformation { get; set; }
private OutsAndScrapTotal OutsAndScrap { get; set; }
private bool IsCurrentWeek { get; set; }
private DateTime[] Dates { get; set; }
private int AddExtraDay { get; set; }
private Dictionary<DateTime, int> WeeklyOuts { get; set; }
private Dictionary<DateTime, YieldStatistics> WeeklyYieldStatistics { get; set; }
private int NumberCompletedDaysInWeek { get; set; }
private int TotalWafersForPartialDay { get; set; }
private int YieldedWafersPerDay { get; set; }
private int TotalWafersOut { get; set; }
private int TotalCustomerScrap { get; set; }
private int TotalManufacturingScrap { get; set; }
private int TotalProdScrap { get; set; }
private int TotalYieldedWafersOut { get; set; }
private int DeltaToCommit { get; set; }
private int DeltaToPlan { get; set; }
private int TotalYield { get; set; }
protected async override Task OnInitializedAsync()
{
await base.OnInitializedAsync();
WeeklyYieldStatistics = new();
DailyPlanWafers = (int)Math.Floor((double)(Targets.Yield_Outs / Targets.PlanWorkingDays));
IsCurrentWeek = (EndDate - StartDate).Days != 7;
AddExtraDay = IsCurrentWeek ? 1 : 0;
YieldInformation = await Db.GetReactorAndScrapOutsAsync(StartDate, EndDate);
OutsAndScrap = await Db.GetOutsAndScrapAsync(QuarterStartDate, StartDate);
Dates = new DateTime[] { StartDate, StartDate.AddDays(1), StartDate.AddDays(2),
StartDate.AddDays(3), StartDate.AddDays(4), StartDate.AddDays(5), StartDate.AddDays(6) };
}
protected override bool ShouldRender()
{
if (YieldInformation != null && OutsAndScrap != null)
{
GetReactorOutsByDay(YieldInformation.Outs);
GetWeeklyTotals();
GetYieldStatistics();
NumberCompletedDaysInWeek = IsCurrentWeek ? YieldInformation.Scrap.Count - 1 : 7;
TotalWafersForPartialDay = NumberCompletedDaysInWeek == 7 ? 0 : WeeklyYieldStatistics[DateTime.Now.Date].YieldedOuts;
int daysRemainingInQtr = (int)(QuarterStartDate.AddDays(Targets.PlanWorkingDays) - StartDate).TotalDays;
int yieldedOuts = OutsAndScrap.Outs - OutsAndScrap.CustomerScrap - OutsAndScrap.ManufacturingScrap - OutsAndScrap.ProductionScrap;
if (daysRemainingInQtr == Targets.PlanWorkingDays)
DailyWafersForQTR = DailyPlanWafers;
else
DailyWafersForQTR = (int)Math.Round((double)((Targets.Yield_Outs - yieldedOuts) / daysRemainingInQtr));
YieldedWafersPerDay = (int)((double)(TotalYieldedWafersOut - TotalWafersForPartialDay) / NumberCompletedDaysInWeek);
return true;
}
return false;
}
public void GetReactorOutsByDay(List<ReactorOutsByRDS> outs)
{
WeeklyOuts = outs.GroupBy(x => x.EndProcessTime, (key, values) =>
new { Date = key, Outs = values.Sum(x => int.Parse(x.Units))}).ToDictionary(x => DateTime.Parse(x.Date), x => x.Outs);
}
private void GetYieldStatistics()
{
Dictionary<DateTime, ScrapByDay> scrapInfo = new();
foreach (ScrapByDay scrap in YieldInformation.Scrap)
scrapInfo.Add(DateTime.Parse(scrap.StartDate), scrap);
foreach (DateTime date in Dates)
{
int outs = 0, yieldedOuts = 0, customerScrap = 0, manufacturingScrap = 0, productionScrap = 0;
double yieldPercentage = 0;
if (scrapInfo.ContainsKey(date))
{
outs = WeeklyOuts[date];
customerScrap = scrapInfo[date].TOT_REJ_CUST;
manufacturingScrap = scrapInfo[date].TOT_REJ_MANU;
productionScrap = scrapInfo[date].TW_PROD;
yieldedOuts = outs - customerScrap - manufacturingScrap - productionScrap;
yieldPercentage = (double)(outs - manufacturingScrap) / outs;
}
YieldStatistics yieldStatistics = new()
{
Outs = outs,
CustomerScrap = customerScrap,
ManufacturingScrap = manufacturingScrap,
ProductionScrap = productionScrap,
YieldedOuts = yieldedOuts,
YieldPercent = yieldPercentage
};
WeeklyYieldStatistics.Add(date, yieldStatistics);
}
}
private void GetWeeklyTotals()
{
TotalWafersOut = GetTotalOuts();
TotalCustomerScrap = YieldInformation.Scrap.Sum(x => x.TOT_REJ_CUST);
TotalManufacturingScrap = YieldInformation.Scrap.Sum(x => x.TOT_REJ_MANU);
TotalProdScrap = YieldInformation.Scrap.Sum(x => x.TW_PROD);
TotalYieldedWafersOut = TotalWafersOut - TotalManufacturingScrap - TotalProdScrap - TotalCustomerScrap;
}
private int GetTotalOuts()
{
int result = 0;
foreach (KeyValuePair<DateTime, int> pair in WeeklyOuts)
result += pair.Value;
return result;
}
}

View File

@ -0,0 +1 @@


View File

@ -0,0 +1,5 @@
namespace ReportingServices.Blazor.Components.DailyReport;
public partial class ToolInfo
{
}