This commit is contained in:
Курнат Андрей
2026-03-22 21:44:29 +03:00
parent a47a7a5a3b
commit 7bbca6ba55
750 changed files with 13718 additions and 43 deletions

View File

@@ -0,0 +1,228 @@
using System;
using System.Collections.Generic;
using System.Data;
using Microsoft.Data.SqlClient;
namespace XLAB2
{
internal sealed class VerificationReportsService
{
private const string ReportSourceSql = @"
FROM dbo.EKZMK m
JOIN dbo.EKZ z ON z.IDEKZ = m.IDEKZ
LEFT JOIN dbo.TPRZ tprz ON tprz.IDTPRZ = z.IDTPRZ
LEFT JOIN dbo.TIPS tips ON tips.IDTIPS = tprz.IDTIPS
LEFT JOIN dbo.SPOI areas ON areas.IDSPOI = tips.IDSPOI
LEFT JOIN dbo.FRPD customers ON customers.IDFRPD = z.IDFRPDV
WHERE m.DTMKFK IS NOT NULL
AND (@DateFrom IS NULL OR m.DTMKFK >= @DateFrom)
AND (@DateToExclusive IS NULL OR m.DTMKFK < @DateToExclusive)
AND (@CustomerId IS NULL OR z.IDFRPDV = @CustomerId)
AND (@MeasurementAreaId IS NULL OR tips.IDSPOI = @MeasurementAreaId)";
public VerificationReportData LoadReport(VerificationReportFilter filter)
{
var normalizedFilter = NormalizeFilter(filter);
using (var connection = ReferenceDirectorySqlHelpers.CreateConnection())
{
connection.Open();
return new VerificationReportData
{
Summary = LoadSummary(connection, normalizedFilter),
CustomerRows = LoadCustomerRows(connection, normalizedFilter),
MeasurementAreaRows = LoadMeasurementAreaRows(connection, normalizedFilter)
};
}
}
public IReadOnlyList<DirectoryLookupItem> LoadCustomerItems()
{
return ReferenceDirectorySqlHelpers.LoadLookupItems(@"
SELECT DISTINCT
customers.IDFRPD AS Id,
customers.NMFRPD AS Name
FROM dbo.EKZMK m
JOIN dbo.EKZ z ON z.IDEKZ = m.IDEKZ
JOIN dbo.FRPD customers ON customers.IDFRPD = z.IDFRPDV
WHERE m.DTMKFK IS NOT NULL
AND NULLIF(LTRIM(RTRIM(customers.NMFRPD)), N'') IS NOT NULL
ORDER BY customers.NMFRPD, customers.IDFRPD;");
}
public IReadOnlyList<DirectoryLookupItem> LoadMeasurementAreaItems()
{
return ReferenceDirectorySqlHelpers.LoadLookupItems(@"
SELECT DISTINCT
areas.IDSPOI AS Id,
areas.NMOI AS Name
FROM dbo.EKZMK m
JOIN dbo.EKZ z ON z.IDEKZ = m.IDEKZ
LEFT JOIN dbo.TPRZ tprz ON tprz.IDTPRZ = z.IDTPRZ
LEFT JOIN dbo.TIPS tips ON tips.IDTIPS = tprz.IDTIPS
JOIN dbo.SPOI areas ON areas.IDSPOI = tips.IDSPOI
WHERE m.DTMKFK IS NOT NULL
AND NULLIF(LTRIM(RTRIM(areas.NMOI)), N'') IS NOT NULL
ORDER BY areas.NMOI, areas.IDSPOI;");
}
private static void AddFilterParameters(SqlCommand command, VerificationReportFilter filter)
{
command.CommandTimeout = ReferenceDirectorySqlHelpers.GetCommandTimeoutSeconds();
ReferenceDirectorySqlHelpers.AddNullableIntParameter(command, "@CustomerId", filter.CustomerId);
ReferenceDirectorySqlHelpers.AddNullableIntParameter(command, "@MeasurementAreaId", filter.MeasurementAreaId);
ReferenceDirectorySqlHelpers.AddNullableDateTimeParameter(command, "@DateFrom", filter.DateFrom);
ReferenceDirectorySqlHelpers.AddNullableDateTimeParameter(command, "@DateToExclusive", GetDateToExclusive(filter.DateTo));
}
private static DateTime? GetDateToExclusive(DateTime? dateTo)
{
return dateTo.HasValue ? dateTo.Value.Date.AddDays(1) : (DateTime?)null;
}
private static VerificationReportSummary LoadSummary(SqlConnection connection, VerificationReportFilter filter)
{
var sql = @"
SELECT
COUNT(*) AS TotalCount,
COALESCE(SUM(CASE WHEN m.GDN = 1 THEN 1 ELSE 0 END), 0) AS GoodCount,
COALESCE(SUM(CASE WHEN m.GDN = 0 THEN 1 ELSE 0 END), 0) AS RejectedCount,
COALESCE(SUM(CASE WHEN m.GDN IS NULL THEN 1 ELSE 0 END), 0) AS WithoutResultCount,
COALESCE(SUM(CASE WHEN m.DTVDM IS NOT NULL THEN 1 ELSE 0 END), 0) AS IssuedCount
" + ReportSourceSql + ";";
using (var command = new SqlCommand(sql, connection))
{
AddFilterParameters(command, filter);
using (var reader = command.ExecuteReader())
{
if (!reader.Read())
{
return new VerificationReportSummary();
}
return new VerificationReportSummary
{
TotalCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "TotalCount"),
GoodCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "GoodCount"),
RejectedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "RejectedCount"),
WithoutResultCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "WithoutResultCount"),
IssuedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "IssuedCount")
};
}
}
}
private static IReadOnlyList<VerificationReportCustomerRow> LoadCustomerRows(SqlConnection connection, VerificationReportFilter filter)
{
var sql = @"
SELECT
z.IDFRPDV AS CustomerId,
COALESCE(NULLIF(LTRIM(RTRIM(customers.NMFRPD)), N''), N'Не указано') AS CustomerName,
COUNT(*) AS TotalCount,
COALESCE(SUM(CASE WHEN m.GDN = 1 THEN 1 ELSE 0 END), 0) AS GoodCount,
COALESCE(SUM(CASE WHEN m.GDN = 0 THEN 1 ELSE 0 END), 0) AS RejectedCount,
COALESCE(SUM(CASE WHEN m.GDN IS NULL THEN 1 ELSE 0 END), 0) AS WithoutResultCount,
COALESCE(SUM(CASE WHEN m.DTVDM IS NOT NULL THEN 1 ELSE 0 END), 0) AS IssuedCount
" + ReportSourceSql + @"
GROUP BY
z.IDFRPDV,
COALESCE(NULLIF(LTRIM(RTRIM(customers.NMFRPD)), N''), N'Не указано')
ORDER BY
CustomerName;";
var rows = new List<VerificationReportCustomerRow>();
using (var command = new SqlCommand(sql, connection))
{
AddFilterParameters(command, filter);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
rows.Add(new VerificationReportCustomerRow
{
CustomerId = ReferenceDirectorySqlHelpers.GetNullableInt32(reader, "CustomerId"),
CustomerName = ReferenceDirectorySqlHelpers.GetString(reader, "CustomerName"),
TotalCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "TotalCount"),
GoodCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "GoodCount"),
RejectedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "RejectedCount"),
WithoutResultCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "WithoutResultCount"),
IssuedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "IssuedCount")
});
}
}
}
return rows;
}
private static IReadOnlyList<VerificationReportMeasurementAreaRow> LoadMeasurementAreaRows(SqlConnection connection, VerificationReportFilter filter)
{
var sql = @"
SELECT
tips.IDSPOI AS MeasurementAreaId,
COALESCE(NULLIF(LTRIM(RTRIM(areas.NMOI)), N''), N'Не указано') AS MeasurementAreaName,
COUNT(*) AS TotalCount,
COALESCE(SUM(CASE WHEN m.GDN = 1 THEN 1 ELSE 0 END), 0) AS GoodCount,
COALESCE(SUM(CASE WHEN m.GDN = 0 THEN 1 ELSE 0 END), 0) AS RejectedCount,
COALESCE(SUM(CASE WHEN m.GDN IS NULL THEN 1 ELSE 0 END), 0) AS WithoutResultCount,
COALESCE(SUM(CASE WHEN m.DTVDM IS NOT NULL THEN 1 ELSE 0 END), 0) AS IssuedCount
" + ReportSourceSql + @"
GROUP BY
tips.IDSPOI,
COALESCE(NULLIF(LTRIM(RTRIM(areas.NMOI)), N''), N'Не указано')
ORDER BY
MeasurementAreaName;";
var rows = new List<VerificationReportMeasurementAreaRow>();
using (var command = new SqlCommand(sql, connection))
{
AddFilterParameters(command, filter);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
rows.Add(new VerificationReportMeasurementAreaRow
{
MeasurementAreaId = ReferenceDirectorySqlHelpers.GetNullableInt32(reader, "MeasurementAreaId"),
MeasurementAreaName = ReferenceDirectorySqlHelpers.GetString(reader, "MeasurementAreaName"),
TotalCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "TotalCount"),
GoodCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "GoodCount"),
RejectedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "RejectedCount"),
WithoutResultCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "WithoutResultCount"),
IssuedCount = ReferenceDirectorySqlHelpers.GetInt32(reader, "IssuedCount")
});
}
}
}
return rows;
}
private static VerificationReportFilter NormalizeFilter(VerificationReportFilter filter)
{
var normalizedFilter = filter ?? new VerificationReportFilter();
var dateFrom = normalizedFilter.DateFrom.HasValue ? normalizedFilter.DateFrom.Value.Date : (DateTime?)null;
var dateTo = normalizedFilter.DateTo.HasValue ? normalizedFilter.DateTo.Value.Date : (DateTime?)null;
if (dateFrom.HasValue && dateTo.HasValue && dateFrom.Value > dateTo.Value)
{
throw new InvalidOperationException("Дата \"с\" не может быть позже даты \"по\".");
}
return new VerificationReportFilter
{
CustomerId = normalizedFilter.CustomerId,
MeasurementAreaId = normalizedFilter.MeasurementAreaId,
DateFrom = dateFrom,
DateTo = dateTo
};
}
}
}