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

@@ -724,12 +724,21 @@ ORDER BY " + (loadClosedDocumentsForCurrentYear
});
}
}
var serialNumbersByDocument = LoadDocumentSerialNumbers(connection, loadClosedDocumentsForCurrentYear, currentYearStart, nextYearStart);
foreach (var document in documents)
{
if (serialNumbersByDocument.TryGetValue(document.DocumentNumber, out var serialNumbersText))
{
document.SerialNumbersText = serialNumbersText;
}
}
}
return documents;
}
public Task<IReadOnlyList<PsvDocumentSummary>> LoadDocumentsAsync(bool loadClosedDocumentsForCurrentYear, CancellationToken cancellationToken = default)
public async Task<IReadOnlyList<PsvDocumentSummary>> LoadDocumentsAsync(bool loadClosedDocumentsForCurrentYear, CancellationToken cancellationToken = default)
{
var sql = @"
SELECT
@@ -760,41 +769,171 @@ ORDER BY " + (loadClosedDocumentsForCurrentYear
var currentYearStart = new DateTime(today.Year, 1, 1);
var nextYearStart = currentYearStart.AddYears(1);
return SqlServerConnectionFactory.Current.QueryOpenConnectionAsync(
sql,
delegate(SqlDataReader reader)
{
var documentNumber = GetString(reader, "DocumentNumber");
return new PsvDocumentSummary
{
DocumentKey = documentNumber,
DocumentNumber = documentNumber,
AcceptedOn = GetNullableDateTime(reader, "AcceptedOn"),
IssuedOn = GetNullableDateTime(reader, "IssuedOn"),
DepartmentName = GetString(reader, "DepartmentName"),
CustomerId = GetNullableInt32(reader, "CustomerId"),
CustomerName = GetString(reader, "CustomerName"),
ItemCount = GetInt32(reader, "ItemCount"),
IssuedCount = GetInt32(reader, "IssuedCount"),
PassedCount = GetInt32(reader, "PassedCount"),
FailedCount = GetInt32(reader, "FailedCount"),
IsDraft = false
};
},
delegate(SqlCommand command)
{
ConfigureCommandTimeout(command);
var documents = new List<PsvDocumentSummary>();
if (loadClosedDocumentsForCurrentYear)
{
command.Parameters.Add("@IssuedFrom", SqlDbType.DateTime).Value = currentYearStart;
command.Parameters.Add("@IssuedTo", SqlDbType.DateTime).Value = nextYearStart;
}
},
cancellationToken).ContinueWith<IReadOnlyList<PsvDocumentSummary>>(delegate(Task<List<PsvDocumentSummary>> task)
await using (var connection = await SqlServerConnectionFactory.Current.OpenConnectionAsync(cancellationToken).ConfigureAwait(false))
using (var command = new SqlCommand(sql, connection))
{
ConfigureCommandTimeout(command);
if (loadClosedDocumentsForCurrentYear)
{
return task.Result;
}, cancellationToken, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
command.Parameters.Add("@IssuedFrom", SqlDbType.DateTime).Value = currentYearStart;
command.Parameters.Add("@IssuedTo", SqlDbType.DateTime).Value = nextYearStart;
}
using (var reader = await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false))
{
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
{
var documentNumber = GetString(reader, "DocumentNumber");
documents.Add(new PsvDocumentSummary
{
DocumentKey = documentNumber,
DocumentNumber = documentNumber,
AcceptedOn = GetNullableDateTime(reader, "AcceptedOn"),
IssuedOn = GetNullableDateTime(reader, "IssuedOn"),
DepartmentName = GetString(reader, "DepartmentName"),
CustomerId = GetNullableInt32(reader, "CustomerId"),
CustomerName = GetString(reader, "CustomerName"),
ItemCount = GetInt32(reader, "ItemCount"),
IssuedCount = GetInt32(reader, "IssuedCount"),
PassedCount = GetInt32(reader, "PassedCount"),
FailedCount = GetInt32(reader, "FailedCount"),
IsDraft = false
});
}
}
var serialNumbersByDocument = await LoadDocumentSerialNumbersAsync(connection, loadClosedDocumentsForCurrentYear, currentYearStart, nextYearStart, cancellationToken).ConfigureAwait(false);
foreach (var document in documents)
{
if (serialNumbersByDocument.TryGetValue(document.DocumentNumber, out var serialNumbersText))
{
document.SerialNumbersText = serialNumbersText;
}
}
}
return documents;
}
private Dictionary<string, string> LoadDocumentSerialNumbers(SqlConnection connection, bool loadClosedDocumentsForCurrentYear, DateTime currentYearStart, DateTime nextYearStart)
{
var sql = @"
WITH filteredDocuments AS
(
SELECT m.NNZVPV
FROM dbo.EKZMK m
WHERE NULLIF(LTRIM(RTRIM(m.NNZVPV)), N'') IS NOT NULL
GROUP BY m.NNZVPV
HAVING " + (loadClosedDocumentsForCurrentYear
? "MAX(m.DTVDM) >= @IssuedFrom AND MAX(m.DTVDM) < @IssuedTo"
: "MAX(m.DTVDM) IS NULL") + @"
)
SELECT
m.NNZVPV AS DocumentNumber,
z.NNZV AS SerialNumber
FROM dbo.EKZMK m
JOIN filteredDocuments documents ON documents.NNZVPV = m.NNZVPV
JOIN dbo.EKZ z ON z.IDEKZ = m.IDEKZ
WHERE NULLIF(LTRIM(RTRIM(z.NNZV)), N'') IS NOT NULL
ORDER BY m.NNZVPV, z.NNZV;";
var serialNumbersByDocument = new Dictionary<string, SortedSet<string>>(StringComparer.OrdinalIgnoreCase);
using (var command = new SqlCommand(sql, connection))
{
ConfigureCommandTimeout(command);
if (loadClosedDocumentsForCurrentYear)
{
command.Parameters.Add("@IssuedFrom", SqlDbType.DateTime).Value = currentYearStart;
command.Parameters.Add("@IssuedTo", SqlDbType.DateTime).Value = nextYearStart;
}
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var documentNumber = GetString(reader, "DocumentNumber");
var serialNumber = GetString(reader, "SerialNumber");
if (string.IsNullOrWhiteSpace(documentNumber) || string.IsNullOrWhiteSpace(serialNumber))
{
continue;
}
if (!serialNumbersByDocument.TryGetValue(documentNumber, out var serialNumbers))
{
serialNumbers = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);
serialNumbersByDocument[documentNumber] = serialNumbers;
}
serialNumbers.Add(serialNumber.Trim());
}
}
}
return serialNumbersByDocument.ToDictionary(pair => pair.Key, pair => string.Join(", ", pair.Value), StringComparer.OrdinalIgnoreCase);
}
private async Task<Dictionary<string, string>> LoadDocumentSerialNumbersAsync(SqlConnection connection, bool loadClosedDocumentsForCurrentYear, DateTime currentYearStart, DateTime nextYearStart, CancellationToken cancellationToken)
{
var sql = @"
WITH filteredDocuments AS
(
SELECT m.NNZVPV
FROM dbo.EKZMK m
WHERE NULLIF(LTRIM(RTRIM(m.NNZVPV)), N'') IS NOT NULL
GROUP BY m.NNZVPV
HAVING " + (loadClosedDocumentsForCurrentYear
? "MAX(m.DTVDM) >= @IssuedFrom AND MAX(m.DTVDM) < @IssuedTo"
: "MAX(m.DTVDM) IS NULL") + @"
)
SELECT
m.NNZVPV AS DocumentNumber,
z.NNZV AS SerialNumber
FROM dbo.EKZMK m
JOIN filteredDocuments documents ON documents.NNZVPV = m.NNZVPV
JOIN dbo.EKZ z ON z.IDEKZ = m.IDEKZ
WHERE NULLIF(LTRIM(RTRIM(z.NNZV)), N'') IS NOT NULL
ORDER BY m.NNZVPV, z.NNZV;";
var serialNumbersByDocument = new Dictionary<string, SortedSet<string>>(StringComparer.OrdinalIgnoreCase);
using (var command = new SqlCommand(sql, connection))
{
ConfigureCommandTimeout(command);
if (loadClosedDocumentsForCurrentYear)
{
command.Parameters.Add("@IssuedFrom", SqlDbType.DateTime).Value = currentYearStart;
command.Parameters.Add("@IssuedTo", SqlDbType.DateTime).Value = nextYearStart;
}
using (var reader = await command.ExecuteReaderAsync(cancellationToken).ConfigureAwait(false))
{
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
{
var documentNumber = GetString(reader, "DocumentNumber");
var serialNumber = GetString(reader, "SerialNumber");
if (string.IsNullOrWhiteSpace(documentNumber) || string.IsNullOrWhiteSpace(serialNumber))
{
continue;
}
if (!serialNumbersByDocument.TryGetValue(documentNumber, out var serialNumbers))
{
serialNumbers = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);
serialNumbersByDocument[documentNumber] = serialNumbers;
}
serialNumbers.Add(serialNumber.Trim());
}
}
}
return serialNumbersByDocument.ToDictionary(pair => pair.Key, pair => string.Join(", ", pair.Value), StringComparer.OrdinalIgnoreCase);
}
public IReadOnlyList<PsvDocumentLine> LoadDocumentLines(string documentNumber)