From 80973bc1c09c614a3a681801886881b491d17668 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Fri, 28 Aug 2026 11:17:07 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B4=D0=B8=D0=B0=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BC=D1=8B=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B2=D0=B0=D0=BA=D0=B0=D0=BD=D1=81=D0=B8=D1=8F?= =?UTF-8?q?=D0=BC=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=BA=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F,=20=D1=88=D0=B0?= =?UTF-8?q?=D0=BF=D0=BA=D0=B0=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=E2=80=94=20=D1=81=D0=BF=D0=BB=D0=BE=D1=88=D0=BD=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Якорь второй диаграммы стоял на строке заголовка второй вертикальной таблицы — при коротком списке рекрутёров (2-4 человека) это оказывалось внутри вертикального диапазона первой диаграммы (фиксированные 14 строк), и они наезжали друг на друга. Теперь обе диаграммы позиционируются независимо от строк таблиц: вторая всегда сразу под первой (ChartHeightRows). Заливка шапки «Общий объем работ»/«Общий объем в работе» теперь на всю ширину блока (по числу рекрутёров), а не только под текстом — иначе она выглядела как две узкие цветные ячейки на белом фоне. Co-Authored-By: Claude Opus 5 --- .../Reports/VacancyReportWorkbook.cs | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs b/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs index ea645e1..c950894 100644 --- a/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs +++ b/backend/Tnsu.ApprovalRoute.Application/Reports/VacancyReportWorkbook.cs @@ -281,13 +281,22 @@ public static class VacancyReportWorkbook sheet, styles, vertTable2HeaderRowIdx, "Общий объем в работе", summary.GrandInProgress, recruiters, r => r.ShareOfInProgress(summary.GrandInProgress)); + // Якоря диаграмм считаются НЕЗАВИСИМО от строк таблиц: у таблицы может + // быть 2 строки, а у диаграммы фиксированная высота ChartHeightRows — с + // якорем "на уровне шапки своей таблицы" вторая диаграмма при коротких + // таблицах вставала бы внутрь вертикального диапазона первой (см. + // ChartHeightRows). Обе выравнены по левому краю первой (горизонтальной) + // таблицы и просто идут подряд сверху вниз с отступом. var period = $"с {report.From:dd.MM.yyyy} по {report.To:dd.MM.yyyy}"; + var chart1TopRowIdx = HeaderRowIdx + 1; + var chart2TopRowIdx = chart1TopRowIdx + ChartHeightRows + 1; + CreatePieChart( sheet, "Объём вакансий " + period, - firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable1HeaderRowIdx); + firstDataRowIdx: vertTable1DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart1TopRowIdx); CreatePieChart( sheet, "Объём вакансий в работе " + period, - firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: vertTable2HeaderRowIdx); + firstDataRowIdx: vertTable2DataStartRowIdx, rowCount: recruiters.Count, anchorTopRowIdx: chart2TopRowIdx); } /// @@ -332,6 +341,13 @@ public static class VacancyReportWorkbook SetCell(headerRow, 0, label, styles.SummaryBlueHeader); SetCell(headerRow, 1, total, styles.SummaryBlueTotal); + // Заливка — на всю ширину блока (по числу рекрутёров, как в горизонтальной + // таблице выше), а не только под текстом заголовка: иначе шапка выглядит + // как две узкие цветные ячейки на фоне остального белого листа, а не как + // сплошная плашка над таблицей. + for (var col = 2; col <= recruiters.Count; col++) + SetCell(headerRow, col, string.Empty, styles.SummaryBlueHeader); + for (var i = 0; i < recruiters.Count; i++) { var row = sheet.CreateRow(headerRowIdx + 1 + i); @@ -341,19 +357,22 @@ public static class VacancyReportWorkbook } /// - /// Круговая диаграмма по одной вертикальной таблице: категории — колонка A - /// (имена рекрутёров), значения — колонка B (доля). Высота якоря — - /// фиксированные 14 строк: чтения диаграммы ради нет смысла подгонять её - /// размер под число рекрутёров, малое число категорий на большом круге - /// читается ничуть не хуже. + /// Высота якоря диаграммы в строках — фиксированная и не зависит от числа + /// рекрутёров: подгонять размер круга под число категорий смысла нет, малое + /// число секторов на большом круге читается ничуть не хуже. Используется и + /// при размещении диаграмм (см. BuildSummarySheet — вторая идёт сразу под + /// первой, без наложения). /// + private const int ChartHeightRows = 14; + + /// Круговая диаграмма по одной вертикальной таблице: категории — колонка A (имена рекрутёров), значения — колонка B (доля). private static void CreatePieChart( XSSFSheet sheet, string title, int firstDataRowIdx, int rowCount, int anchorTopRowIdx) { if (rowCount == 0) return; var drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch(); - var anchor = drawing.CreateAnchor(0, 0, 0, 0, 3, anchorTopRowIdx, 11, anchorTopRowIdx + 14); + var anchor = drawing.CreateAnchor(0, 0, 0, 0, 3, anchorTopRowIdx, 11, anchorTopRowIdx + ChartHeightRows); var chart = (XSSFChart)drawing.CreateChart(anchor); chart.SetTitle(title);