using Microsoft.Data.SqlClient; using ReportingServices.Models.PlanningReport; using ReportingServices.ReportingObjects; using System.Data; namespace ReportingServices.Dependency_Injections { public class ScrapeDatabaseRepository : IScrapeDatabaseRepository { private SqlConnection _connection; private string _connectionString; public ScrapeDatabaseRepository() { IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); _connectionString = configuration.GetConnectionString("DefaultConnection"); } public void OpenConnection() { if (_connection == null) _connection = new SqlConnection(_connectionString); if (_connection.State != ConnectionState.Open) _connection.Open(); } public void CloseConnection() { if (_connection.State != ConnectionState.Closed) _connection.Close(); } public int GetNumberOfPartChanges(string startDate, string endDate) { int result = 0; OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT COUNT(*) FROM " + "(SELECT REACTOR, COUNT(PROD_SPEC_ID) - 1 AS PCHANGE FROM " + "(SELECT REACTOR, PROD_SPEC_ID, COUNT(WO) AS PSN_COUNT FROM RDS WHERE DATE_OUT BETWEEN @startDate AND @endDate GROUP BY REACTOR, PROD_SPEC_ID) AS t " + "GROUP BY REACTOR) AS l WHERE PCHANGE > 0"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@startDate", startDate); cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { reader.Read(); result = int.Parse(reader[0].ToString()); } cmd.Dispose(); CloseConnection(); return result; } public List GetScrapByDay(List outs) { List scrap = new(); string rdsNumbers = ""; foreach (ReactorOutsByRDS rout in outs) rdsNumbers = rdsNumbers + "'" + rout.RDS_NO + "', "; rdsNumbers = rdsNumbers.Substring(0, rdsNumbers.Length - 2); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT " + " DATE_OUT," + " SUM(CUST_TOT_REJ) AS TOT_REJ_CUST," + " SUM(LSL_TOT_REJ) AS TOT_REJ_MANU," + " SUM(TW_PROD) AS TW_PROD " + "FROM RDS " + "WHERE SEQ IN (" + rdsNumbers + ") " + "GROUP BY DATE_OUT " + "ORDER BY 1 DESC"; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read() && reader[0].ToString() != "1/1/1900 12:00:00 AM") scrap.Add(new ScrapByDay(reader[0].ToString(), reader[3].ToString(), reader[1].ToString(), reader[2].ToString())); } cmd.Dispose(); CloseConnection(); return scrap; } public List GetReactorPSNWORuns(string startDate, string endDate) { List weeklyPartChanges = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT REACTOR, PROD_SPEC_ID, COUNT(WO) FROM RDS " + "WHERE DATE_OUT BETWEEN @startDate AND @endDate " + "GROUP BY REACTOR, PROD_SPEC_ID " + "ORDER BY 1"; cmd.CommandText = query; cmd.Parameters.AddWithValue("@startDate", startDate); cmd.Parameters.AddWithValue("@endDate", endDate); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) weeklyPartChanges.Add(new ReactorPSNWORuns(reader[0].ToString(), reader[1].ToString(), int.Parse(reader[2].ToString()))); } cmd.Dispose(); CloseConnection(); 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 targets = new(); OpenConnection(); SqlCommand cmd = _connection.CreateCommand(); string query = "SELECT THRU_TARGET, THRU_QTY, THRU_PCNT FROM FISCAL_QTR_TARGETS " + " WHERE THRU_GROUP = 'TOT' " + " AND FISCAL_YR = " + " (SELECT FISCAL_YR FROM FISCAL_QTR " + " WHERE START_DT < SYSDATETIME() " + " AND END_DT > SYSDATETIME()) " + " AND FISCAL_QTR = " + " (SELECT FISCAL_QTR FROM FISCAL_QTR " + " WHERE START_DT < SYSDATETIME() " + " AND END_DT > SYSDATETIME()) "; cmd.CommandText = query; using (SqlDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) { if (reader[0].ToString().ToUpper() == "YIELD") targets.Add(reader[0].ToString(), float.Parse(reader[2].ToString())); else if (!string.IsNullOrEmpty(reader[1].ToString())) targets.Add(reader[0].ToString(), int.Parse(reader[1].ToString())); } } cmd.Dispose(); CloseConnection(); QuarterlyTargets quarterlyTargets = new() { Reactor_Outs = (int)targets["Reactor_Outs"], Yield_Outs = (int)targets["Yield_Outs"], IFX_Scrap = (int)targets["IFX_Scrap"], Yield = targets["Yield"] }; return quarterlyTargets; } public Dictionary> GetDualLayerReactors() { Dictionary> dualLayers = new(); dualLayers.Add("ASM", new List()); dualLayers.Add("HTR", new List()); dualLayers.Add("EPP", new List()); 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 "; 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()); } } cmd.Dispose(); CloseConnection(); return dualLayers; } } }