604bfe919c
Apply comprehensive fixes from code reviews including: - Extract shared utilities (SqlFormatHelper, CellValueConverter, DbDestinationBase) - Add interface abstractions (IAuthenticationService, IDatabaseMigrator, IMisQueryBuilder) - Implement SecureStore for encrypted secrets storage - Fix error handling with proper HTTP status codes and logging - Optimize double enumeration in DevEtlRegistry - Add DataSync.Dev README for developer onboarding - Extract filter panel base classes to reduce duplication - Update code review docs to mark all issues as fixed
168 lines
7.1 KiB
C#
168 lines
7.1 KiB
C#
using SqlKata.Compilers;
|
|
|
|
namespace JdeScoping.DataAccess.QueryBuilders;
|
|
|
|
/// <summary>
|
|
/// Builds MIS extraction queries for work order step matching.
|
|
/// Uses SQL extraction functions to retrieve criteria from Search.Criteria JSON.
|
|
/// </summary>
|
|
public sealed class MisQueryBuilder : IMisQueryBuilder
|
|
{
|
|
private readonly SqlServerCompiler _compiler;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of MisQueryBuilder.
|
|
/// </summary>
|
|
/// <param name="compiler">The SqlKata SQL Server compiler.</param>
|
|
public MisQueryBuilder(SqlServerCompiler compiler)
|
|
{
|
|
_compiler = compiler;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Builds the complete MIS extraction SQL including temp table setup and data population.
|
|
/// Uses extraction functions to get filter criteria from the database.
|
|
/// </summary>
|
|
/// <param name="searchId">The search ID to extract criteria from.</param>
|
|
/// <returns>The SQL statements for MIS extraction.</returns>
|
|
public IReadOnlyList<string> BuildMisExtractionSql(int searchId)
|
|
{
|
|
var statements = new List<string>();
|
|
|
|
// Create #TempMisData temp table
|
|
statements.Add(BuildTempMisDataTableSql());
|
|
|
|
// Build and execute MIS CTE query to populate temp table
|
|
statements.Add(BuildMisCteSql());
|
|
|
|
return statements;
|
|
}
|
|
|
|
private static string BuildTempMisDataTableSql()
|
|
{
|
|
return """
|
|
IF OBJECT_ID('tempdb.dbo.#TempMisData', 'U') IS NOT NULL
|
|
BEGIN
|
|
DROP TABLE #TempMisData;
|
|
END
|
|
CREATE TABLE #TempMisData (
|
|
WorkOrderNumber BIGINT,
|
|
ItemNumber VARCHAR(25),
|
|
ItemDescription VARCHAR(30),
|
|
BranchCode VARCHAR(12),
|
|
WorkCenterCode VARCHAR(12),
|
|
StepTimestamp DATETIME,
|
|
SequenceNumber DECIMAL(7, 2),
|
|
FunctionCode VARCHAR(15),
|
|
FunctionOperationDescription VARCHAR(80),
|
|
MatchedSequenceNumber DECIMAL(7, 2),
|
|
RoutingMatch BIT,
|
|
MasterMatch BIT,
|
|
MisNumber VARCHAR(32),
|
|
RevID VARCHAR(32),
|
|
CharNumber VARCHAR(32),
|
|
MisSequenceNumber VARCHAR(32),
|
|
TestDescription VARCHAR(2000),
|
|
SamplingType VARCHAR(32),
|
|
SamplingValue VARCHAR(32),
|
|
ToolsGauges VARCHAR(2000),
|
|
WorkInstructions VARCHAR(2000),
|
|
Status VARCHAR(32),
|
|
ReleaseDate DATETIME
|
|
);
|
|
""";
|
|
}
|
|
|
|
private static string BuildMisCteSql()
|
|
{
|
|
// The SQL uses temp tables (#P_ItemNumbers, #P_WorkCenters, #P_OperatorIDs)
|
|
// and variables (@MinDt, @MaxDt) that were already populated by the main search query builder.
|
|
// This query uses dynamic join/filter conditions based on what filters exist.
|
|
return """
|
|
-- Build MIS extraction using existing temp tables and date variables
|
|
DECLARE @HasMisItemFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_ItemNumbers) THEN 1 ELSE 0 END;
|
|
DECLARE @HasMisWorkCenterFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_WorkCenters) THEN 1 ELSE 0 END;
|
|
DECLARE @HasMisOperatorFilter BIT = CASE WHEN EXISTS(SELECT 1 FROM #P_OperatorIDs) THEN 1 ELSE 0 END;
|
|
DECLARE @HasMisTimespanFilter BIT = CASE WHEN @MinDt IS NOT NULL OR @MaxDt IS NOT NULL THEN 1 ELSE 0 END;
|
|
|
|
WITH MIS_CTE AS(
|
|
SELECT DISTINCT wo.WorkOrderNumber,
|
|
wo.ItemNumber,
|
|
wo.BranchCode,
|
|
wo.RoutingType,
|
|
wo.IssueDate,
|
|
wos.WorkCenterCode,
|
|
wos.StepNumber,
|
|
wos.EndDT,
|
|
wos.FunctionCode,
|
|
wos.FunctionOperationDescription
|
|
FROM dbo.WorkOrderStep AS wos
|
|
INNER JOIN dbo.WorkOrder AS wo ON (wos.WorkOrderNumber = wo.WorkOrderNumber AND LTRIM(wos.BranchCode) = wo.BranchCode)
|
|
LEFT OUTER JOIN dbo.WorkOrderTime AS wot ON (wos.WorkOrderNumber = wot.WorkOrderNumber AND LTRIM(wos.BranchCode) = wot.BranchCode AND wos.StepNumber = wot.StepNumber)
|
|
LEFT OUTER JOIN #P_ItemNumbers p_in ON (@HasMisItemFilter = 0 OR wo.ItemNumber = p_in.ItemNumber)
|
|
LEFT OUTER JOIN #P_WorkCenters p_wc ON (@HasMisWorkCenterFilter = 0 OR wos.WorkCenterCode = p_wc.Code)
|
|
LEFT OUTER JOIN #P_OperatorIDs p_oi ON (@HasMisOperatorFilter = 0 OR wot.AddressNumber = p_oi.AddressNumber)
|
|
WHERE (@HasMisItemFilter = 0 OR p_in.ItemNumber IS NOT NULL)
|
|
AND (@HasMisWorkCenterFilter = 0 OR p_wc.Code IS NOT NULL)
|
|
AND (@HasMisOperatorFilter = 0 OR p_oi.AddressNumber IS NOT NULL)
|
|
AND (@HasMisTimespanFilter = 0 OR
|
|
((@MinDt IS NULL OR wos.EndDT >= @MinDt OR wot.GlDate >= @MinDt) AND
|
|
(@MaxDt IS NULL OR wos.EndDT <= @MaxDt OR wot.GlDate <= @MaxDt)))
|
|
)
|
|
INSERT INTO #TempMisData
|
|
(
|
|
WorkOrderNumber,
|
|
ItemNumber,
|
|
ItemDescription,
|
|
BranchCode,
|
|
WorkCenterCode,
|
|
StepTimestamp,
|
|
SequenceNumber,
|
|
FunctionCode,
|
|
FunctionOperationDescription,
|
|
MatchedSequenceNumber,
|
|
RoutingMatch,
|
|
MasterMatch,
|
|
MisNumber,
|
|
RevID,
|
|
CharNumber,
|
|
MisSequenceNumber,
|
|
TestDescription,
|
|
SamplingType,
|
|
SamplingValue,
|
|
ToolsGauges,
|
|
WorkInstructions,
|
|
Status,
|
|
ReleaseDate
|
|
)
|
|
SELECT mm.WorkOrderNumber,
|
|
mm.ItemNumber,
|
|
mm.ItemDescription,
|
|
mm.BranchCode,
|
|
mm.WorkCenterCode,
|
|
mm.StepTimestamp,
|
|
mm.SequenceNumber,
|
|
mm.FunctionCode,
|
|
mm.FunctionOperationDescription,
|
|
mm.MatchedSequenceNumber,
|
|
mm.RoutingMatch,
|
|
mm.MasterMatch,
|
|
mm.MisNumber,
|
|
mm.RevID,
|
|
mm.CharNumber,
|
|
mm.MisSequenceNumber,
|
|
mm.TestDescription,
|
|
mm.SamplingType,
|
|
mm.SamplingValue,
|
|
mm.ToolsGauges,
|
|
mm.WorkInstructions,
|
|
mm.Status,
|
|
mm.ReleaseDate
|
|
FROM MIS_CTE c CROSS APPLY
|
|
dbo.fn_MatchMIS(c.WorkOrderNumber, c.ItemNumber, c.BranchCode, c.RoutingType,
|
|
c.IssueDate, c.WorkCenterCode, c.StepNumber, c.EndDT,
|
|
c.FunctionCode, c.FunctionOperationDescription) AS mm;
|
|
""";
|
|
}
|
|
}
|