edit
This commit is contained in:
@@ -9,6 +9,8 @@ namespace XLAB2
|
||||
{
|
||||
internal sealed class PsvPrintService
|
||||
{
|
||||
private const int OpenPsvTableColumnCount = 7;
|
||||
private const int ClosePsvTableColumnCount = 12;
|
||||
private const int PrintDialogId = 88;
|
||||
private const int WordAlertsNone = 0;
|
||||
private const int WordCloseDoNotSaveChanges = 0;
|
||||
@@ -165,7 +167,7 @@ namespace XLAB2
|
||||
ReplacePlaceholder(document, "next", FormatDate(dueDate));
|
||||
}
|
||||
|
||||
FillTable(document, groupedLines);
|
||||
FillTable(document, groupedLines, summary.IssuedOn.HasValue);
|
||||
}
|
||||
|
||||
private static void PopulateVerificationTemplate(dynamic document, PsvDocumentLine line)
|
||||
@@ -187,13 +189,14 @@ namespace XLAB2
|
||||
ReplacePlaceholder(document, "date", FormatDate(verificationDate));
|
||||
}
|
||||
|
||||
private static void FillTable(dynamic document, IReadOnlyList<PrintedGroupRow> rowsToPrint)
|
||||
private static void FillTable(dynamic document, IReadOnlyList<PrintedGroupRow> rowsToPrint, bool isClosedDocument)
|
||||
{
|
||||
dynamic table = null;
|
||||
|
||||
try
|
||||
{
|
||||
table = document.Tables.Item(1);
|
||||
EnsurePsvTableLayout(table, isClosedDocument ? ClosePsvTableColumnCount : OpenPsvTableColumnCount);
|
||||
|
||||
for (var index = 0; index < rowsToPrint.Count; index++)
|
||||
{
|
||||
@@ -209,9 +212,20 @@ namespace XLAB2
|
||||
SetCellText(row, 4, rowData.RangeText, false);
|
||||
SetCellText(row, 5, rowData.SerialNumberText, false);
|
||||
SetCellText(row, 6, rowData.GroupCount.ToString(CultureInfo.InvariantCulture), true);
|
||||
SetCellText(row, 7, rowData.PassedCount > 0 ? rowData.PassedCount.ToString(CultureInfo.InvariantCulture) : string.Empty, true);
|
||||
SetCellText(row, 8, rowData.FailedCount > 0 ? rowData.FailedCount.ToString(CultureInfo.InvariantCulture) : string.Empty, true);
|
||||
SetCellText(row, 9, rowData.Notes, false);
|
||||
|
||||
if (isClosedDocument)
|
||||
{
|
||||
SetCellText(row, 7, rowData.PassedCount > 0 ? rowData.PassedCount.ToString(CultureInfo.InvariantCulture) : string.Empty, true);
|
||||
SetCellText(row, 8, rowData.FailedCount > 0 ? rowData.FailedCount.ToString(CultureInfo.InvariantCulture) : string.Empty, true);
|
||||
SetCellText(row, 9, rowData.VerificationDocumentText, false);
|
||||
SetCellText(row, 10, rowData.StickerNumberText, false);
|
||||
SetCellText(row, 11, rowData.VerifierNameText, false);
|
||||
SetCellText(row, 12, rowData.Notes, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCellText(row, 7, rowData.Notes, false);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -225,6 +239,35 @@ namespace XLAB2
|
||||
}
|
||||
}
|
||||
|
||||
private static void EnsurePsvTableLayout(dynamic table, int expectedColumnCount)
|
||||
{
|
||||
if (table == null)
|
||||
{
|
||||
throw new InvalidOperationException("В шаблоне ПСВ не найдена таблица для печати.");
|
||||
}
|
||||
|
||||
var actualColumnCount = 0;
|
||||
|
||||
try
|
||||
{
|
||||
actualColumnCount = Convert.ToInt32(table.Columns.Count, CultureInfo.InvariantCulture);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new InvalidOperationException("Не удалось определить структуру таблицы шаблона ПСВ.", ex);
|
||||
}
|
||||
|
||||
if (actualColumnCount != expectedColumnCount)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
"Шаблон ПСВ имеет неверную структуру таблицы: ожидается {0} колонок, найдено {1}.",
|
||||
expectedColumnCount,
|
||||
actualColumnCount));
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetCellText(dynamic row, int columnIndex, string value, bool centerAlign)
|
||||
{
|
||||
dynamic cell = null;
|
||||
@@ -274,7 +317,7 @@ namespace XLAB2
|
||||
}
|
||||
}
|
||||
|
||||
private static IReadOnlyList<PrintedGroupRow> BuildPrintedGroups(IEnumerable<PsvDocumentLine> lines, bool includeClosedNotes)
|
||||
private static IReadOnlyList<PrintedGroupRow> BuildPrintedGroups(IEnumerable<PsvDocumentLine> lines, bool includeClosedDetails)
|
||||
{
|
||||
return (lines ?? Enumerable.Empty<PsvDocumentLine>())
|
||||
.GroupBy(delegate(PsvDocumentLine line)
|
||||
@@ -302,7 +345,10 @@ namespace XLAB2
|
||||
GroupCount = materializedLines.Count,
|
||||
PassedCount = materializedLines.Count(delegate(PsvDocumentLine line) { return line.IsPassed == true; }),
|
||||
FailedCount = materializedLines.Count(delegate(PsvDocumentLine line) { return line.IsPassed == false; }),
|
||||
Notes = includeClosedNotes ? BuildClosedNotesText(materializedLines) : string.Empty
|
||||
VerificationDocumentText = includeClosedDetails ? BuildVerificationDocumentText(materializedLines) : string.Empty,
|
||||
StickerNumberText = includeClosedDetails ? BuildStickerNumberText(materializedLines) : string.Empty,
|
||||
VerifierNameText = includeClosedDetails ? BuildVerifierNameText(materializedLines) : string.Empty,
|
||||
Notes = BuildNotesText(materializedLines)
|
||||
};
|
||||
})
|
||||
.ToList();
|
||||
@@ -340,35 +386,44 @@ namespace XLAB2
|
||||
return string.Join(", ", serialNumbers.ToArray());
|
||||
}
|
||||
|
||||
private static string BuildClosedNotesText(IReadOnlyList<PsvDocumentLine> lines)
|
||||
private static string BuildNotesText(IReadOnlyList<PsvDocumentLine> lines)
|
||||
{
|
||||
var parts = new List<string>();
|
||||
return string.Join("; ", lines
|
||||
.Select(delegate(PsvDocumentLine line) { return NormalizeText(line == null ? null : line.Notes); })
|
||||
.Where(delegate(string value) { return !string.IsNullOrWhiteSpace(value); })
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.OrderBy(delegate(string value) { return value; }, StringComparer.OrdinalIgnoreCase)
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
var verificationDocuments = lines
|
||||
private static string BuildVerificationDocumentText(IReadOnlyList<PsvDocumentLine> lines)
|
||||
{
|
||||
return string.Join("; ", lines
|
||||
.Select(FormatVerificationDocument)
|
||||
.Where(delegate(string value) { return !string.IsNullOrWhiteSpace(value); })
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.OrderBy(delegate(string value) { return value; }, StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
if (verificationDocuments.Count > 0)
|
||||
{
|
||||
parts.Add("Документы: " + string.Join("; ", verificationDocuments.ToArray()));
|
||||
}
|
||||
|
||||
var stickerNumbers = lines
|
||||
.Select(delegate(PsvDocumentLine line) { return NormalizeText(line.StickerNumber); })
|
||||
private static string BuildStickerNumberText(IReadOnlyList<PsvDocumentLine> lines)
|
||||
{
|
||||
return string.Join(", ", lines
|
||||
.Select(delegate(PsvDocumentLine line) { return NormalizeText(line == null ? null : line.StickerNumber); })
|
||||
.Where(delegate(string value) { return !string.IsNullOrWhiteSpace(value); })
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.OrderBy(delegate(string value) { return value; }, StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
if (stickerNumbers.Count > 0)
|
||||
{
|
||||
parts.Add("Наклейки: " + string.Join(", ", stickerNumbers.ToArray()));
|
||||
}
|
||||
|
||||
return string.Join(". ", parts.ToArray());
|
||||
private static string BuildVerifierNameText(IReadOnlyList<PsvDocumentLine> lines)
|
||||
{
|
||||
return string.Join("; ", lines
|
||||
.Select(delegate(PsvDocumentLine line) { return NormalizeText(line == null ? null : line.VerifierName); })
|
||||
.Where(delegate(string value) { return !string.IsNullOrWhiteSpace(value); })
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.OrderBy(delegate(string value) { return value; }, StringComparer.OrdinalIgnoreCase)
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
private static string FormatVerificationDocument(PsvDocumentLine line)
|
||||
@@ -445,6 +500,7 @@ namespace XLAB2
|
||||
var candidates = new[]
|
||||
{
|
||||
Path.Combine(baseDirectory, fileName),
|
||||
Path.GetFullPath(Path.Combine(baseDirectory, "..", fileName)),
|
||||
Path.GetFullPath(Path.Combine(baseDirectory, "..", "..", fileName)),
|
||||
Path.GetFullPath(Path.Combine(baseDirectory, "..", "..", "..", fileName))
|
||||
};
|
||||
@@ -551,6 +607,12 @@ namespace XLAB2
|
||||
public string RangeText { get; set; }
|
||||
|
||||
public string SerialNumberText { get; set; }
|
||||
|
||||
public string StickerNumberText { get; set; }
|
||||
|
||||
public string VerificationDocumentText { get; set; }
|
||||
|
||||
public string VerifierNameText { get; set; }
|
||||
}
|
||||
|
||||
private sealed class PrintGroupKey : IEquatable<PrintGroupKey>
|
||||
|
||||
Reference in New Issue
Block a user