151 lines
7.7 KiB
C#
151 lines
7.7 KiB
C#
using OI.Metrology.Shared.DataModels;
|
|
using OI.Metrology.Shared.Models.Stateless;
|
|
using OI.Metrology.Shared.Repositories;
|
|
using System.Data;
|
|
using System.Data.Common;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
|
|
namespace OI.Metrology.Server.Repository;
|
|
|
|
public class InfinityQSRepository : IInfinityQSRepository
|
|
{
|
|
|
|
private readonly IDbConnectionFactory _DBConnectionFactory;
|
|
|
|
public InfinityQSRepository(IDbConnectionFactory dbConnectionFactory) => _DBConnectionFactory = dbConnectionFactory;
|
|
|
|
string IInfinityQSRepository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
|
|
{
|
|
StringBuilder result = new();
|
|
const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
|
|
if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length)
|
|
throw new ArgumentException(nameof(dateTime));
|
|
_ = result
|
|
.AppendLine(" select ")
|
|
.AppendLine(" se.f_sgrp se_sgrp, ")
|
|
.AppendLine(" se.f_sgtm se_sgtm, ")
|
|
.AppendLine(" se.f_tsno se_tsno, ")
|
|
.AppendLine(" se.f_val se_val, ")
|
|
.AppendLine(" rd.f_name rd_name, ")
|
|
.AppendLine(" jd.f_name jd_name, ")
|
|
.AppendLine(" pl.f_name pl_name, ")
|
|
.AppendLine(" pd.f_name pd_name, ")
|
|
.AppendLine(" td.f_test td_test, ")
|
|
.AppendLine(" td.f_name td_name, ")
|
|
.AppendLine(" (select count(ev.f_evnt) ")
|
|
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ")
|
|
.AppendLine(" where ev.f_prcs = rd.f_prcs ")
|
|
.AppendLine(" and ev.f_part = pd.f_part ")
|
|
.AppendLine(" and ev.f_sgtm = se.f_sgtm) ev_count ")
|
|
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] rd ")
|
|
.AppendLine(" on se.f_prcs = rd.f_prcs ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ")
|
|
.AppendLine(" on se.f_job = jd.f_job ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ")
|
|
.AppendLine(" on se.f_lot = pl.f_lot ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
|
|
.AppendLine(" on se.f_part = pd.f_part ")
|
|
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
|
|
.AppendLine(" on se.f_test = td.f_test ")
|
|
.AppendLine(" where se.f_flag = 0 ");
|
|
if (!string.IsNullOrEmpty(subGroupId))
|
|
_ = result.Append(" and se.f_sgrp = ").Append(subGroupId.Split(" ")[0]).AppendLine(" ");
|
|
if (!string.IsNullOrEmpty(process))
|
|
_ = result.Append(" and rd.f_name = '").Append(process).AppendLine("' ");
|
|
if (!string.IsNullOrEmpty(part))
|
|
_ = result.Append(" and pd.f_name = '").Append(part).AppendLine("' ");
|
|
if (!string.IsNullOrEmpty(job))
|
|
_ = result.Append(" and jd.f_name = '").Append(job).AppendLine("' ");
|
|
if (!string.IsNullOrEmpty(lot))
|
|
_ = result.Append(" and pl.f_name = '").Append(lot).AppendLine("' ");
|
|
if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')))
|
|
_ = result.Append(" and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '").Append(dateTime).AppendLine("' ");
|
|
_ = result.AppendLine(" for json path ");
|
|
return result.ToString();
|
|
}
|
|
|
|
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText)
|
|
{
|
|
StringBuilder stringBuilder = new();
|
|
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection();
|
|
DbCommand dbCommand = dbConnection.CreateCommand();
|
|
dbCommand.CommandText = commandText;
|
|
DbDataReader dbDataReader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess);
|
|
while (dbDataReader.Read())
|
|
_ = stringBuilder.Append(dbDataReader.GetString(0));
|
|
return stringBuilder;
|
|
}
|
|
|
|
private static InfinityQSBase GetInfinityQSBase(IDbConnectionFactory dbConnectionFactory, IInfinityQSRepository infinityQSRepository, string subGroupId)
|
|
{
|
|
InfinityQSBase result;
|
|
string commandText = infinityQSRepository.GetCommandText(subGroupId, process: string.Empty, job: string.Empty, part: string.Empty, lot: string.Empty, dateTime: string.Empty);
|
|
StringBuilder stringBuilder = GetForJsonPath(dbConnectionFactory, commandText);
|
|
InfinityQSBase[]? results = JsonSerializer.Deserialize<InfinityQSBase[]>(stringBuilder.ToString());
|
|
if (results is null)
|
|
throw new NullReferenceException(nameof(results));
|
|
if (results.Select(l => l.SubGroupId).Distinct().Count() != 1)
|
|
throw new NotSupportedException("Multiple ids are present!");
|
|
result = results.First();
|
|
return result;
|
|
}
|
|
|
|
Result<InfinityQSBase[]> IInfinityQSRepository.GetData(string subGroupId)
|
|
{
|
|
Result<InfinityQSBase[]>? result;
|
|
IInfinityQSRepository infinityQSRepository = this;
|
|
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
|
|
string commandText = infinityQSRepository.GetCommandText(subGroupId, process: infinityQSBase.Process, job: infinityQSBase.Job, part: infinityQSBase.Part, lot: infinityQSBase.Lot, dateTime: string.Concat(infinityQSBase.SubGroupDateTime));
|
|
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
|
|
InfinityQSBase[]? results = JsonSerializer.Deserialize<InfinityQSBase[]>(stringBuilder.ToString());
|
|
if (results is null)
|
|
throw new NullReferenceException(nameof(results));
|
|
result = new()
|
|
{
|
|
Results = results,
|
|
TotalRows = results.Length,
|
|
};
|
|
return result;
|
|
}
|
|
|
|
Result<InfinityQSEvent[]> IInfinityQSRepository.GetEvents(string subGroupId)
|
|
{
|
|
Result<InfinityQSEvent[]>? result;
|
|
IInfinityQSRepository infinityQSRepository = this;
|
|
InfinityQSEvent[]? results;
|
|
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
|
|
if (!infinityQSBase.EventCount.HasValue || infinityQSBase.EventCount.Value <= 0)
|
|
results = Array.Empty<InfinityQSEvent>();
|
|
else
|
|
{
|
|
string commandText = $"select * from [spcepiworld].[dbo].[evnt_inf] ev where ev.f_prcs = '{infinityQSBase.Process}' and ev.f_part = '{infinityQSBase.Part}' and ev.f_sgtm = {infinityQSBase.SubGroupDateTime} ";
|
|
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
|
|
results = JsonSerializer.Deserialize<InfinityQSEvent[]>(stringBuilder.ToString());
|
|
if (results is null)
|
|
throw new NullReferenceException(nameof(results));
|
|
}
|
|
result = new()
|
|
{
|
|
Results = results,
|
|
TotalRows = results.Length,
|
|
};
|
|
return result;
|
|
}
|
|
|
|
Result<InfinityQSBase[]> IInfinityQSRepository.GetHeader(string subGroupId)
|
|
{
|
|
Result<InfinityQSBase[]>? result;
|
|
IInfinityQSRepository infinityQSRepository = this;
|
|
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
|
|
InfinityQSBase[] results = new InfinityQSBase[] { infinityQSBase };
|
|
result = new()
|
|
{
|
|
Results = results,
|
|
TotalRows = results.Length,
|
|
};
|
|
return result;
|
|
}
|
|
|
|
} |