Refactored code, restructured project organization, and added new unit tests.

This commit is contained in:
Daniel Wathen 2022-12-13 12:11:28 -07:00
parent 8f96e31121
commit b5def3da89
33 changed files with 670 additions and 418 deletions

View File

@ -3,7 +3,7 @@ using ReportingServices.HelperClasses;
namespace ReportingServices.Test
{
[TestClass]
public class UnitTest1
public class APIHelperTester
{
[TestMethod]
public void CheckShortDateWithPassedInDate()

View File

@ -0,0 +1,64 @@
using ReportingServices.ViewModels.ProductionReport;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ReportingServices.Test
{
[TestClass]
public class DailyReportTester
{
[TestMethod]
public void SetRDSInfo_InputData_CalculatedAndStoresCorrectly()
{
// Arrange
DailyReport rpt = new();
rpt.CurrentEntries = TestingClass.ManualReportEntries;
Dictionary<string, List<int>> dualLayerReactors = new()
{
{ "ASM", new List<int>() { 24, 62 } },
{ "HTR", new List<int>() { } },
{ "EPP", new List<int>() { 40, 42, 44, 46 } },
};
int asmUnloadTempsLessThan700 = 3;
int htrUnloadTempsLessThan700 = 3;
// Act
rpt.SetRDSInfo(TestingClass.RDSList);
// Assert
CollectionAssert.AreEqual(dualLayerReactors["ASM"].ToList(), rpt.DualLayerReactors["ASM"].ToList());
CollectionAssert.AreEqual(dualLayerReactors["HTR"].ToList(), rpt.DualLayerReactors["HTR"].ToList());
CollectionAssert.AreEqual(dualLayerReactors["EPP"].ToList(), rpt.DualLayerReactors["EPP"].ToList());
Assert.AreEqual(asmUnloadTempsLessThan700, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMUnloadTempsLessThan700);
Assert.AreEqual(htrUnloadTempsLessThan700, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRUnloadTempsLessThan700);
}
[TestMethod]
public void SetReactorInfo_InputData_CalculatedAndStoresCorrectly()
{
// Arrange
DailyReport rpt = new();
rpt.CurrentEntries = TestingClass.ManualReportEntries;
int numberOfToolsWaferSize6IN = 11;
int numberOfToolsWaferSize8IN = 46;
int numberOfToolsWaferSize6INScheduled = 9;
int numberOfToolsWaferSize8INScheduled = 39;
int singleLoadLockASM = 5;
int singleLoadLockHTR = 14;
// Act
rpt.SetReactorInfo(TestingClass.Reactors, TestingClass.UnscheduledReactors);
// Assert
Assert.AreEqual(numberOfToolsWaferSize6IN, rpt.NumberOfToolsWaferSize6IN);
Assert.AreEqual(numberOfToolsWaferSize8IN, rpt.NumberOfToolsWaferSize8IN);
Assert.AreEqual(numberOfToolsWaferSize6INScheduled, rpt.NumberOfToolsWaferSize6INScheduled);
Assert.AreEqual(numberOfToolsWaferSize8INScheduled, rpt.NumberOfToolsWaferSize8INScheduled);
Assert.AreEqual(singleLoadLockASM, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMSingleLoadLock);
Assert.AreEqual(singleLoadLockHTR, rpt.CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRSingleLoadLock);
}
}
}

View File

@ -0,0 +1,186 @@
using ReportingServices.Models.ProductionReport;
namespace ReportingServices.Test
{
internal static class TestingClass
{
public static readonly List<RDS> RDSList = new()
{
new RDS(79, "ASM+", new DateTime(2022, 12, 13), 600, "Standard 1 Layer"),
new RDS(45, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(62, "ASM+", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(62, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 2 Layer"),
new RDS(62, "ASM+", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(24, "ASM", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(24, "ASM", new DateTime(2022, 12, 13), 800, "Standard 2 Layer"),
new RDS(24, "ASM", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(66, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(28, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(28, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(63, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(63, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(23, "ASM", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(23, "ASM", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(32, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(58, "ASM", new DateTime(2022, 12, 13), 650, "Standard 1 Layer"),
new RDS(77, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(77, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(57, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(57, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(20, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(20, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(43, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"),
new RDS(43, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"),
new RDS(29, "ASM", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(25, "ASM", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"),
new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(38, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(38, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(64, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(64, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(32, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(37, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(37, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(30, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(31, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(33, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(55, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(36, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(21, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(21, "ASM", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(73, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(75, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"),
new RDS(75, "ASM+", new DateTime(2022, 12, 13), 750, "Standard 1 Layer"),
new RDS(51, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(53, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(53, "ASM+", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(35, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(36, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(68, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(41, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(70, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(74, "HTR", new DateTime(2022, 12, 13), 700, "Standard 1 Layer"),
new RDS(61, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(61, "ASM+", new DateTime(2022, 12, 13), 800, "Standard 1 Layer"),
new RDS(49, "HTR", new DateTime(2022, 12, 13), 550, "Standard 1 Layer"),
new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(54, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(50, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(40, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(40, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(42, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(44, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(44, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(46, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 2 Layer"),
new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(50, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(54, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(48, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
new RDS(52, "EPP", new DateTime(2022, 12, 13), 1000, "Standard 1 Layer"),
};
public static readonly List<Reactor> Reactors = new()
{
new Reactor(20, "ASM", "200 mm 8 in", false),
new Reactor(21, "ASM", "200 mm 8 in", false),
new Reactor(22, "ASM", "200 mm 8 in", false),
new Reactor(23, "ASM", "200 mm 8 in", false),
new Reactor(24, "ASM", "200 mm 8 in", false),
new Reactor(25, "ASM", "200 mm 8 in", true),
new Reactor(26, "ASM", "200 mm 8 in", false),
new Reactor(27, "ASM", "200 mm 8 in", false),
new Reactor(28, "ASM", "150 mm 6 in", true),
new Reactor(29, "ASM", "200 mm 8 in", false),
new Reactor(30, "HTR", "200 mm 8 in", true),
new Reactor(31, "HTR", "200 mm 8 in", true),
new Reactor(32, "HTR", "200 mm 8 in", true),
new Reactor(33, "HTR", "200 mm 8 in", true),
new Reactor(34, "HTR", "200 mm 8 in", false),
new Reactor(35, "HTR", "200 mm 8 in", false),
new Reactor(36, "HTR", "200 mm 8 in", false),
new Reactor(37, "HTR", "200 mm 8 in", true),
new Reactor(38, "HTR", "200 mm 8 in", true),
new Reactor(39, "ASM+", "200 mm 8 in", false),
new Reactor(40, "EPP", "150 mm 6 in", false),
new Reactor(41, "HTR", "200 mm 8 in", true),
new Reactor(42, "EPP", "150 mm 6 in", false),
new Reactor(43, "ASM+", "200 mm 8 in", false),
new Reactor(44, "EPP", "150 mm 6 in", false),
new Reactor(45, "HTR", "200 mm 8 in", true),
new Reactor(46, "EPP", "150 mm 6 in", false),
new Reactor(47, "HTR", "150 mm 6 in", true),
new Reactor(48, "EPP", "200 mm 8 in", false),
new Reactor(49, "HTR", "200 mm 8 in", true),
new Reactor(50, "EPP", "200 mm 8 in", false),
new Reactor(51, "HTR", "150 mm 6 in", true),
new Reactor(52, "EPP", "200 mm 8 in", false),
new Reactor(53, "ASM+", "200 mm 8 in", false),
new Reactor(54, "EPP", "200 mm 8 in", false),
new Reactor(55, "HTR", "200 mm 8 in", true),
new Reactor(56, "ASM+", "200 mm 8 in", true),
new Reactor(57, "ASM+", "200 mm 8 in", false),
new Reactor(58, "ASM", "200 mm 8 in", false),
new Reactor(59, "ASM", "200 mm 8 in", false),
new Reactor(60, "ASM+", "200 mm 8 in", true),
new Reactor(61, "ASM+", "200 mm 8 in", false),
new Reactor(62, "ASM+", "200 mm 8 in", true),
new Reactor(63, "ASM+", "200 mm 8 in", false),
new Reactor(64, "ASM+", "200 mm 8 in", false),
new Reactor(65, "ASM+", "200 mm 8 in", false),
new Reactor(66, "ASM+", "200 mm 8 in", false),
new Reactor(68, "HTR", "200 mm 8 in", false),
new Reactor(70, "HTR", "150 mm 6 in", true),
new Reactor(72, "HTR", "200 mm 8 in", true),
new Reactor(73, "HTR", "200 mm 8 in", false),
new Reactor(74, "HTR", "150 mm 6 in", false),
new Reactor(75, "ASM+", "200 mm 8 in", false),
new Reactor(77, "ASM+", "200 mm 8 in", false),
new Reactor(79, "ASM+", "200 mm 8 in", false),
new Reactor(100, "ASM", "150 mm 6 in", false),
new Reactor(101, "ASM", "150 mm 6 in", false),
};
public static readonly List<int> UnscheduledReactors = new()
{
20, 25, 30, 32, 49, 55, 59, 67, 69, 70, 74
};
public static readonly List<ManualReportEntries> ManualReportEntries = new()
{
new ManualReportEntries(),
new ManualReportEntries(),
new ManualReportEntries(),
new ManualReportEntries(),
new ManualReportEntries(),
new ManualReportEntries(),
new ManualReportEntries(),
};
}
}

View File

@ -2,26 +2,22 @@
using ReportingServices.Dependency_Injections;
using ReportingServices.HelperClasses;
using ReportingServices.Models.ProductionReport;
using ReportingServices.ReportingObjects;
using System.Web;
using ReportingServices.ViewModels.ProductionReport;
namespace ReportingServices.Controllers
{
public class ProductionReportController : Controller
{
private readonly IJsonFileHandler _jsonFileHandler;
private readonly IScrapeDatabaseRepository _scrapeDatabaseRepository;
private readonly IFabTimeReportingRepository _fabTimeReportingRepository;
private readonly ILogger<ProductionReportController> _logger;
private readonly int _reportIndex = (int)DateTime.Now.DayOfWeek;
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,
public ProductionReportController(IScrapeDatabaseRepository scrapeDatabaseRepository,
IFabTimeReportingRepository fabTimeReportingRepository, ILogger<ProductionReportController> logger)
{
_jsonFileHandler = jsonFileHandler;
_scrapeDatabaseRepository = scrapeDatabaseRepository;
_fabTimeReportingRepository = fabTimeReportingRepository;
_logger = logger;
@ -37,8 +33,9 @@ namespace ReportingServices.Controllers
{
try
{
DailyReport dailyReport = SetUpDailyReport();
Dictionary<string, List<string>> toolStateOwners = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<string>>>(_toolStateOwnerFilePath);
DailyReportHelper.SetRepositories(_fabTimeReportingRepository, _scrapeDatabaseRepository);
DailyReport dailyReport = DailyReportHelper.SetUpDailyReport();
Dictionary<string, List<string>> toolStateOwners = JsonFileHandler.LoadJSONFile<Dictionary<string, List<string>>>(_toolStateOwnerFilePath);
dailyReport.ToolStatesByOwner = toolStateOwners;
@ -54,7 +51,7 @@ namespace ReportingServices.Controllers
public IActionResult EditDailyReport()
{
Dictionary<string, List<ManualReportEntries>> entries = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
Dictionary<string, List<ManualReportEntries>> entries = JsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
ManualReportEntries rpt = entries["Current Week"][_reportIndex];
@ -64,136 +61,16 @@ namespace ReportingServices.Controllers
[HttpPost]
public IActionResult EditDailyReport(ManualReportEntries rpt)
{
Dictionary<string, List<ManualReportEntries>> report = _jsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
Dictionary<string, List<ManualReportEntries>> report = JsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
rpt.Date = DateTime.Parse(DateTime.Now.ToShortDateString());
rpt.Day = DateTime.Now.DayOfWeek;
report["Current Week"][_reportIndex] = rpt;
_jsonFileHandler.SaveJSONFile(report, _dailyRptFilePath);
JsonFileHandler.SaveJSONFile(report, _dailyRptFilePath);
return RedirectToAction("DailyReport");
}
public async Task<List<ReactorOutsByRDS>> MovesTrendCaller(string startDate = "", string endDate = "")
{
string url = APIHelperFunctions.GenerateURLWithParameters(startDate: startDate, endDate: endDate, chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD");
List<ReactorOutsByRDS> outsByRDS = await _fabTimeReportingRepository.GetMovesTrendData(url);
return outsByRDS;
}
public async Task<List<EquipmentStateByDay>> ToolStateTrendCaller(string toolType)
{
string url = APIHelperFunctions.GenerateURLWithParameters(chart: "TOOLSTATE", periodLen: "24", capacityTypesLike: toolType, toolsLike: _toolFilter);
List<EquipmentStateByDay> toolAvailability = await _fabTimeReportingRepository.GetToolStateTrendData(url);
return toolAvailability;
}
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 url = APIHelperFunctions.GenerateURLWithParameters(chart: "ToolStateGantt", periodLen: "24",
capacityTypesLike: capacityFilter, toolsLike: _toolFilter, startDate: startDate);
List<ToolStateCurrent> toolStates = await _fabTimeReportingRepository.GetToolStateData(url);
return toolStates;
}
public DailyReport SetUpDailyReport()
{
DailyReport report = new();
Task<List<ReactorOutsByRDS>> task1 = MovesTrendCaller();
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.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.CurrentWeek.SetOutsByDay(task1.Result);
report.PreviousWeek.SetOutsByDay(task2.Result);
List<ScrapByDay> scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result);
List<ScrapByDay> previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result);
report.CurrentWeek.SetScrapByDay(scrap);
report.PreviousWeek.SetScrapByDay(previousScrap);
report.ReverseLists();
report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets();
int[] toolsByWaferSize = _scrapeDatabaseRepository.GetNumberOfToolsByWaferSize("''");
report.NumberOfToolsWaferSize6IN = toolsByWaferSize[0];
report.NumberOfToolsWaferSize8IN = toolsByWaferSize[1];
string reactors = "";
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);
report.DualLayerReactors = _scrapeDatabaseRepository.GetDualLayerReactors();
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.CurrentEntries[_reportIndex].ASMSingleLoadLock = singleLoadLocks[0];
report.CurrentEntries[_reportIndex].HTRSingleLoadLock = singleLoadLocks[1];
int[] unloadTempsLessThan700 = _scrapeDatabaseRepository.GetNumberOfToolUnloadTempsLessThan700();
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

@ -1,41 +0,0 @@
using ReportingServices.ReportingObjects;
using System.Text.Json;
namespace ReportingServices.Dependency_Injections
{
public class FabTimeReportingRepository : IFabTimeReportingRepository
{
public async Task<List<ReactorOutsByRDS>> GetMovesTrendData(string url)
{
return await GetJsonData<List<ReactorOutsByRDS>>(url);
}
public async Task<List<EquipmentStateByDay>> GetToolStateTrendData(string url)
{
return await GetJsonData<List<EquipmentStateByDay>>(url);
}
public async Task<List<ToolStateCurrent>> GetToolStateData(string url)
{
return await GetJsonData<List<ToolStateCurrent>>(url);
}
public async Task<T> GetJsonData<T>(string url)
{
T deserializedJson;
using (var client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url))
{
string apiResponse = await response.Content.ReadAsStringAsync();
deserializedJson = JsonSerializer.Deserialize<T>(apiResponse);
}
}
return deserializedJson;
}
}
}

View File

@ -1,12 +0,0 @@
using ReportingServices.ReportingObjects;
namespace ReportingServices.Dependency_Injections
{
public interface IFabTimeReportingRepository
{
public Task<List<ReactorOutsByRDS>> GetMovesTrendData(string url);
public Task<List<EquipmentStateByDay>> GetToolStateTrendData(string url);
public Task<List<ToolStateCurrent>> GetToolStateData(string url);
public Task<T> GetJsonData<T>(string url);
}
}

View File

@ -1,10 +0,0 @@
using ReportingServices.ReportingObjects;
namespace ReportingServices.Dependency_Injections
{
public interface IJsonFileHandler
{
public void SaveJSONFile<T>(T obj, string file);
public T LoadJSONFile<T>(string file);
}
}

View File

@ -0,0 +1,84 @@
using ReportingServices.Dependency_Injections;
using ReportingServices.Models.ProductionReport;
using ReportingServices.ViewModels.ProductionReport;
namespace ReportingServices.HelperClasses
{
public static class DailyReportHelper
{
private static IFabTimeReportingRepository _fabTimeReportingRepository;
private static IScrapeDatabaseRepository _scrapeDatabaseRepository;
private static readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json";
public static void SetRepositories(IFabTimeReportingRepository fabTimeReportingRepository, IScrapeDatabaseRepository scrapeDatabaseRepository)
{
_fabTimeReportingRepository = fabTimeReportingRepository;
_scrapeDatabaseRepository = scrapeDatabaseRepository;
}
public static DailyReport SetUpDailyReport()
{
List<Task> tasks = new();
DailyReport report = new();
Task<List<ReactorOutsByRDS>> task1 = _fabTimeReportingRepository.GetMovesTrendData();
Task<List<ReactorOutsByRDS>> task2 = _fabTimeReportingRepository.GetMovesTrendData(startDate: report.StartDate.AddDays(-7).ToString(), endDate: report.StartDate.ToString());
tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "ASM"));
tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "EPP"));
tasks.Add(_fabTimeReportingRepository.GetToolStateTrendData(report, "HTR"));
tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "ASM"));
tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "EPP"));
tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "HTR"));
tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "Metrology"));
tasks.Add(_fabTimeReportingRepository.GetToolStateData(report, "Cleans"));
report.QuarterlyTargets = _scrapeDatabaseRepository.GetQuarterlyTargets();
Dictionary<string, List<ManualReportEntries>> entries = JsonFileHandler.LoadJSONFile<Dictionary<string, List<ManualReportEntries>>>(_dailyRptFilePath);
report.CurrentEntries = entries["Current Week"];
report.PreviousEntries = entries["Previous Week"];
report.SetRDSInfo(_scrapeDatabaseRepository.GetRDSForLastDay());
Task.WaitAll(tasks.ToArray());
report.SetReactorInfo(_scrapeDatabaseRepository.GetReactors(), GetUnscheduledReactors(report));
List<ScrapByDay> scrap = _scrapeDatabaseRepository.GetScrapByDay(task1.Result);
List<ScrapByDay> previousScrap = _scrapeDatabaseRepository.GetScrapByDay(task2.Result);
report.CurrentWeek.SetYieldInformation(task1.Result, scrap);
report.PreviousWeek.SetYieldInformation(task2.Result, previousScrap);
report.ReverseLists();
entries["Current Week"] = report.CurrentEntries;
JsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath);
return report;
}
public static List<int> GetUnscheduledReactors(DailyReport report)
{
List<int> reactors = new();
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.Add(int.Parse(tool.Tool.Substring(1)));
}
}
}
}
return reactors;
}
}
}

View File

@ -1,16 +1,16 @@
using System.Text.Json;
namespace ReportingServices.Dependency_Injections
namespace ReportingServices.HelperClasses
{
public class JsonFileHandler : IJsonFileHandler
public static class JsonFileHandler
{
public T LoadJSONFile<T>(string file)
public static T LoadJSONFile<T>(string file)
{
string json = File.ReadAllText(file);
return JsonSerializer.Deserialize<T>(json);
}
public void SaveJSONFile<T>(T obj, string file)
public static void SaveJSONFile<T>(T obj, string file)
{
string json = JsonSerializer.Serialize(obj);
File.WriteAllText(file, json);

View File

@ -1,56 +0,0 @@
using ReportingServices.HelperClasses;
using ReportingServices.ReportingObjects;
namespace ReportingServices.Models.ProductionReport
{
public class DailyReport
{
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 Dictionary<string, List<string>> ToolStatesByOwner { get; set; }
public Dictionary<string, List<string>> DualLayerReactors { 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();
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)
{
ToolAvailibilityByType.Add(key, states);
}
public void AddToolStateByType(string key, List<ToolStateCurrent> states)
{
ToolStateByType state = new(states);
ToolStateByType.Add(key, state);
}
public void ReverseLists()
{
CurrentWeek.ScrapByDay = APIHelperFunctions.ReverseList(CurrentWeek.ScrapByDay);
PreviousWeek.ScrapByDay = APIHelperFunctions.ReverseList(PreviousWeek.ScrapByDay);
ToolAvailibilityByType["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]);
ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]);
ToolAvailibilityByType["HTR"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["HTR"]);
}
}
}

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class EquipmentStateByDay
{

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class ManualReportEntries
{

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class QuarterlyTargets
{

View File

@ -0,0 +1,20 @@
namespace ReportingServices.Models.ProductionReport
{
public class RDS
{
public int Reactor { get; set; }
public string ReactorType { get; set; }
public DateTime DateOut { get; set; }
public int UnloadTemp { get; set; }
public string LayerType { get; set; }
public RDS(int reactor, string reactorType, DateTime dateOut, int unloadTemp, string layerType)
{
Reactor = reactor;
ReactorType = reactorType;
DateOut = dateOut;
UnloadTemp = unloadTemp;
LayerType = layerType;
}
}
}

View File

@ -0,0 +1,18 @@
namespace ReportingServices.Models.ProductionReport
{
public class Reactor
{
public int ReactorNumber { get; set; }
public string Type { get; set; }
public string PocketSize { get; set; }
public bool HasDisabledLoadlock { get; set; }
public Reactor(int reactorNumber, string type, string pocketSize, bool hasDisabledLoadlock)
{
ReactorNumber = reactorNumber;
Type = type;
PocketSize = pocketSize;
HasDisabledLoadlock = hasDisabledLoadlock;
}
}
}

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class ReactorOutsByDay
{

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class ReactorOutsByRDS
{

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class ScrapByDay
{

View File

@ -1,4 +1,4 @@
namespace ReportingServices.ReportingObjects
namespace ReportingServices.Models.ProductionReport
{
public class ToolStateCurrent
{

View File

@ -1,6 +1,4 @@
using ReportingServices.ReportingObjects;
namespace ReportingServices.Models.ProductionReport
namespace ReportingServices.Models.ProductionReport
{
public class YieldStatistics
{
@ -15,13 +13,9 @@ namespace ReportingServices.Models.ProductionReport
IsCurrentWeek = isCurrentWeek;
}
public void SetOutsByDay(List<ReactorOutsByRDS> outs)
public void SetYieldInformation(List<ReactorOutsByRDS> outs, List<ScrapByDay> scrap)
{
OutsByDay = GetReactorOutsByDay(outs);
}
public void SetScrapByDay(List<ScrapByDay> scrap)
{
ScrapByDay = scrap;
}

View File

@ -1,4 +1,5 @@
using ReportingServices.Dependency_Injections;
using ReportingServices.HelperClasses;
using Serilog;
LoggerConfiguration loggerConfiguration = new();
@ -13,7 +14,6 @@ Serilog.ILogger log = Log.ForContext<Program>();
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddScoped<IJsonFileHandler, JsonFileHandler>();
builder.Services.AddScoped<IScrapeDatabaseRepository, ScrapeDatabaseRepository>();
builder.Services.AddScoped<IFabTimeReportingRepository, FabTimeReportingRepository>();

View File

@ -0,0 +1,60 @@
using ReportingServices.HelperClasses;
using ReportingServices.Models.ProductionReport;
using ReportingServices.ViewModels.ProductionReport;
using System.Text.Json;
using System.Web;
namespace ReportingServices.Dependency_Injections
{
public class FabTimeReportingRepository : IFabTimeReportingRepository
{
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 async Task<List<ReactorOutsByRDS>> GetMovesTrendData(string startDate = "", string endDate = "")
{
string url = APIHelperFunctions.GenerateURLWithParameters(startDate: startDate, endDate: endDate, chart: "MOVESLOTLIST", areasLike: "CLEANROOM", operationsLike: "1UNLOAD");
return await GetJsonData<List<ReactorOutsByRDS>>(url);
}
public async Task GetToolStateTrendData(DailyReport rpt, string toolType)
{
string url = APIHelperFunctions.GenerateURLWithParameters(chart: "TOOLSTATE", periodLen: "24", capacityTypesLike: toolType, toolsLike: _toolFilter);
rpt.AddToolAvailibilityByType(toolType, await GetJsonData<List<EquipmentStateByDay>>(url));
return;
}
public async Task GetToolStateData(DailyReport rpt, string toolType)
{
string capacityFilter = toolType == "ASM" ? toolType + "%2CASM%2B" : toolType;
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);
rpt.AddToolStateByType(toolType, await GetJsonData<List<ToolStateCurrent>>(url));
return;
}
public async Task<T> GetJsonData<T>(string url)
{
T deserializedJson;
using (var client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url))
{
string apiResponse = await response.Content.ReadAsStringAsync();
deserializedJson = JsonSerializer.Deserialize<T>(apiResponse);
}
}
return deserializedJson;
}
}
}

View File

@ -1,6 +1,6 @@
using Microsoft.Data.SqlClient;
using ReportingServices.Models.PlanningReport;
using ReportingServices.ReportingObjects;
using ReportingServices.Models.ProductionReport;
using System.Data;
namespace ReportingServices.Dependency_Injections
@ -131,114 +131,6 @@ namespace ReportingServices.Dependency_Injections
return weeklyPartChanges;
}
public int[] GetNumberOfToolsByWaferSize(string reactors)
{
int[] singleLoadLocks = new int[2];
OpenConnection();
SqlCommand cmd = _connection.CreateCommand();
string query = "SELECT " +
" SUSC_POCKET_SIZE, " +
" COUNT(SUSC_POCKET_SIZE) " +
" FROM REACTOR " +
" 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;
using (SqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
singleLoadLocks[0] = int.Parse(reader[1].ToString());
reader.Read();
singleLoadLocks[1] = int.Parse(reader[1].ToString());
}
cmd.Dispose();
CloseConnection();
return singleLoadLocks;
}
public int[] GetNumberOfSingleLoadLocks()
{
int[] singleLoadLocks = new int[2];
OpenConnection();
SqlCommand cmd = _connection.CreateCommand();
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' " +
" AND REACT_ASSIGNMENT<> '' " +
" AND REACT_TYPE IN('ASM', 'HTR') " +
"GROUP BY REACT_TYPE";
cmd.CommandText = query;
using (SqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
singleLoadLocks[0] = int.Parse(reader[1].ToString());
reader.Read();
singleLoadLocks[1] = int.Parse(reader[1].ToString());
}
cmd.Dispose();
CloseConnection();
return singleLoadLocks;
}
public int[] GetNumberOfToolUnloadTempsLessThan700()
{
int[] unloadTempTools = new int[2];
OpenConnection();
SqlCommand cmd = _connection.CreateCommand();
string query = "SELECT REACTOR_TYPE, COUNT(DISTINCT(REACTOR)) AS ULT FROM RDS " +
"INNER JOIN RDS_LAYER lay ON lay.RDS_NO = SEQ " +
"WHERE DATE_OUT > DATEADD(DAY, -1, SYSDATETIME()) " +
" AND UL_TEMP< 700 " +
"GROUP BY REACTOR_TYPE";
cmd.CommandText = query;
using (SqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
unloadTempTools[0] = int.Parse(reader[1].ToString());
reader.Read();
unloadTempTools[1] = int.Parse(reader[1].ToString());
}
cmd.Dispose();
CloseConnection();
return unloadTempTools;
}
public QuarterlyTargets GetQuarterlyTargets()
{
Dictionary<string, float> targets = new();
@ -286,49 +178,63 @@ namespace ReportingServices.Dependency_Injections
return quarterlyTargets;
}
public Dictionary<string, List<string>> GetDualLayerReactors()
public List<Reactor> GetReactors()
{
Dictionary<string, List<string>> dualLayers = new();
dualLayers.Add("ASM", new List<string>());
dualLayers.Add("HTR", new List<string>());
dualLayers.Add("EPP", new List<string>());
List<Reactor> reactors = new();
OpenConnection();
SqlCommand cmd = _connection.CreateCommand();
string query = "SELECT REACTOR_TYPE, REACTOR FROM " +
"(SELECT " +
" REACTOR, " +
" rds.REACTOR_TYPE, " +
" PROD_SPEC_ID, " +
" SUM(CASE WHEN psn.LAYER_TYPE = 'Standard 2 Layer' THEN 1 ELSE 0 END) AS Dual " +
" FROM RDS " +
"INNER JOIN PROD_SPEC psn ON rds.PROD_SPEC_ID = psn.SEQ " +
" WHERE DATE_OUT BETWEEN DATEADD(DAY, -1, SYSDATETIME()) AND SYSDATETIME() " +
"GROUP BY REACTOR, PROD_SPEC_ID, rds.REACTOR_TYPE) res " +
"WHERE res.Dual > 0 " +
"ORDER BY 1, 2 ";
string query = "SELECT " +
" REACT_NO, REACT_TYPE, SUSC_POCKET_SIZE, CASE WHEN ACTIVE_LL_DISABLED <> '' THEN 'TRUE' ELSE 'FALSE' END AS \"LL_DISABLED\" " +
" FROM REACTOR " +
" WHERE REACT_ASSIGNMENT IS NOT NULL " +
" AND REACT_ASSIGNMENT <> 'Out of Service' " +
" AND REACT_ASSIGNMENT<> ''";
cmd.CommandText = query;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
if (reader[0].ToString() == "ASM+")
dualLayers["ASM"].Add("R" + reader[1].ToString());
else
dualLayers[reader[0].ToString()].Add("R" + reader[1].ToString());
}
reactors.Add(new Reactor(int.Parse(reader[0].ToString()), reader[1].ToString(), reader[2].ToString(), bool.Parse(reader[3].ToString())));
}
cmd.Dispose();
CloseConnection();
return dualLayers;
return reactors;
}
public List<RDS> GetRDSForLastDay()
{
List<RDS> rdsList = new();
OpenConnection();
SqlCommand cmd = _connection.CreateCommand();
string query = "SELECT rds.REACTOR, rds.REACTOR_TYPE, rds.DATE_OUT, " +
"CASE WHEN lay.UL_TEMP IS NULL THEN '1000' ELSE lay.UL_TEMP END, psn.LAYER_TYPE FROM RDS " +
"INNER JOIN RDS_LAYER lay ON lay.RDS_NO = SEQ " +
"INNER JOIN PROD_SPEC psn ON rds.PROD_SPEC_ID = psn.SEQ " +
"WHERE DATE_OUT > DATEADD(DAY, -1, SYSDATETIME())";
cmd.CommandText = query;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
rdsList.Add(new RDS(int.Parse(reader[0].ToString()), reader[1].ToString(), DateTime.Parse(reader[2].ToString()), int.Parse(reader[3].ToString()), reader[4].ToString()));
}
cmd.Dispose();
CloseConnection();
return rdsList;
}
}
}

View File

@ -0,0 +1,13 @@
using ReportingServices.Models.ProductionReport;
using ReportingServices.ViewModels.ProductionReport;
namespace ReportingServices.Dependency_Injections
{
public interface IFabTimeReportingRepository
{
public Task<List<ReactorOutsByRDS>> GetMovesTrendData(string startDate = "", string endDate = "");
public Task GetToolStateTrendData(DailyReport rpt, string toolType);
public Task GetToolStateData(DailyReport rpt, string toolType);
public Task<T> GetJsonData<T>(string url);
}
}

View File

@ -1,5 +1,5 @@
using ReportingServices.Models.PlanningReport;
using ReportingServices.ReportingObjects;
using ReportingServices.Models.ProductionReport;
namespace ReportingServices.Dependency_Injections
{
@ -10,10 +10,8 @@ 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(string reactors);
public int[] GetNumberOfSingleLoadLocks();
public int[] GetNumberOfToolUnloadTempsLessThan700();
public QuarterlyTargets GetQuarterlyTargets();
public Dictionary<string, List<string>> GetDualLayerReactors();
public List<Reactor> GetReactors();
public List<RDS> GetRDSForLastDay();
}
}

View File

@ -0,0 +1,132 @@
using ReportingServices.HelperClasses;
using ReportingServices.Models.ProductionReport;
namespace ReportingServices.ViewModels.ProductionReport
{
public class DailyReport
{
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 Dictionary<string, List<string>> ToolStatesByOwner { get; set; }
public Dictionary<string, List<int>> DualLayerReactors { 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();
PreviousEntries = new();
CurrentEntries = new();
DualLayerReactors = new();
StartDate = DateTime.Parse(APIHelperFunctions.GetBeginningOfWeekAsAPIString());
CurrentWeek = new(StartDate, true);
PreviousWeek = new(StartDate.AddDays(-7), false);
}
public void AddToolAvailibilityByType(string key, List<EquipmentStateByDay> states)
{
ToolAvailibilityByType.Add(key, states);
}
public void AddToolStateByType(string key, List<ToolStateCurrent> states)
{
ToolStateByType state = new(states);
ToolStateByType.Add(key, state);
}
public void SetReactorInfo(List<Reactor> reactors, List<int> unscheduledReactors)
{
SetToolsByPocketSize(reactors, unscheduledReactors);
SetDisabledLoadlocks(reactors);
}
public void SetRDSInfo(List<RDS> rdsList)
{
SetDualLayerReactors(rdsList);
SetUnloadTempsLessThan700(rdsList);
}
private void SetToolsByPocketSize(List<Reactor> reactors, List<int> unscheduledReactors)
{
NumberOfToolsWaferSize6IN = reactors.Where(react => react.PocketSize.Contains("150")).Count();
NumberOfToolsWaferSize8IN = reactors.Where(react => react.PocketSize.Contains("200")).Count();
NumberOfToolsWaferSize6INScheduled =
reactors.Where(react => !unscheduledReactors.Contains(react.ReactorNumber)
&& react.PocketSize.Contains("150")).Count();
NumberOfToolsWaferSize8INScheduled =
reactors.Where(react => !unscheduledReactors.Contains(react.ReactorNumber)
&& react.PocketSize.Contains("200")).Count();
}
private void SetDisabledLoadlocks(List<Reactor> reactors)
{
List<Reactor> reactorsWithDisabledLoadlocks = reactors.Where(react => react.HasDisabledLoadlock).ToList();
int singleLoadlockASM = reactorsWithDisabledLoadlocks.Where(react => react.Type.Contains("ASM")).Count();
int singleLoadlockHTR = reactorsWithDisabledLoadlocks.Where(react => react.Type.Contains("HTR")).Count();
CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMSingleLoadLock = singleLoadlockASM;
CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRSingleLoadLock = singleLoadlockHTR;
}
private void SetDualLayerReactors(List<RDS> rdsList)
{
List<RDS> rdsWithDualLayerPSN = rdsList.Where(rds => rds.LayerType.Contains("2 Layer")).ToList();
DualLayerReactors.Add("ASM", rdsWithDualLayerPSN.
Where(rds => rds.ReactorType.Contains("ASM")).
OrderBy(rds => rds.Reactor).
Select(rds => rds.Reactor).
Distinct().ToList());
DualLayerReactors.Add("HTR", rdsWithDualLayerPSN.
Where(rds => rds.ReactorType.Contains("HTR")).
OrderBy(rds => rds.Reactor).
Select(rds => rds.Reactor).
Distinct().ToList());
DualLayerReactors.Add("EPP", rdsWithDualLayerPSN.
Where(rds => rds.ReactorType.Contains("EPP")).
OrderBy(rds => rds.Reactor).
Select(rds => rds.Reactor).
Distinct().ToList());
}
private void SetUnloadTempsLessThan700(List<RDS> rdsList)
{
List<RDS> rdsWithTempsLessThan700 = rdsList.Where(rds => rds.UnloadTemp < 700).ToList();
CurrentEntries[(int)DateTime.Now.DayOfWeek].ASMUnloadTempsLessThan700 =
rdsWithTempsLessThan700.
Where(rds => rds.ReactorType.
Contains("ASM")).
Select(rds => rds.Reactor).
Distinct().Count();
CurrentEntries[(int)DateTime.Now.DayOfWeek].HTRUnloadTempsLessThan700 =
rdsWithTempsLessThan700.
Where(rds => rds.ReactorType.
Contains("HTR")).
Select(rds => rds.Reactor).
Distinct().Count();
}
public void ReverseLists()
{
CurrentWeek.ScrapByDay = APIHelperFunctions.ReverseList(CurrentWeek.ScrapByDay);
PreviousWeek.ScrapByDay = APIHelperFunctions.ReverseList(PreviousWeek.ScrapByDay);
ToolAvailibilityByType["ASM"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["ASM"]);
ToolAvailibilityByType["EPP"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["EPP"]);
ToolAvailibilityByType["HTR"] = APIHelperFunctions.ReverseList(ToolAvailibilityByType["HTR"]);
}
}
}

View File

@ -1,4 +1,6 @@
namespace ReportingServices.ReportingObjects
using ReportingServices.Models.ProductionReport;
namespace ReportingServices.ViewModels.ProductionReport
{
public class ToolStateByType
{

View File

@ -1,8 +1,7 @@
@using ReportingServices.ReportingObjects
@model ReportingServices.Models.ProductionReport.DailyReport
@using ReportingServices.ViewModels.ProductionReport
@using ReportingServices.Models.ProductionReport
@model DailyReport
@{
int ASMAvailablePct = 0;
int EPPAvailablePct = 0;
int HTRAvailablePct = 0;

View File

@ -1,4 +1,5 @@
@model ReportingServices.ReportingObjects.ManualReportEntries
@using ReportingServices.Models.ProductionReport
@model ManualReportEntries
@{
ViewData["Title"] = "Edit Daily Passdown | Mesa Reporting Services";

View File

@ -7,5 +7,8 @@
},
"Serilog": {
"MinimumLevel": "Debug"
},
"ConnectionStrings": {
"DefaultConnection": "Server=MESTSV01EC.ec.local\\TEST1,50572;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true"
}
}

View File

@ -0,0 +1,14 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Serilog": {
"MinimumLevel": "Debug"
},
"ConnectionStrings": {
"DefaultConnection": "Server=MESSV01EC.EC.LOCAL\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true"
}
}

View File

@ -6,7 +6,7 @@
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=Messv01ec.ec.local\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true"
"DefaultConnection": "Server=MESSV01EC.EC.LOCAL\\PROD1,53959;Database=LSL2SQL;User Id=srpadmin;Password=0okm9ijn;TrustServerCertificate=true"
},
"AllowedHosts": "*",
"Serilog": {

File diff suppressed because one or more lines are too long