feat: единый файл Лист1+СПРАВКА, фильтры, сортировка, живой п/п
- Загрузка одного .xlsx (СПРАВКА + Лист1 в одном файле) - Рег. номера берутся из СПРАВКА автоматически, группируются по (ТН ВЭД, Страна) - Отдельный опциональный справочник кодов (CodesImportService) - Фильтры: Все / Авто / Проверить / Нет кода / Без нетто - Таблица сразу отсортирована по ТН ВЭД с живым обновлением п/п - Начальный п/п: поле в UI, автоинкремент после экспорта - Лист2: рамки, жёлтая строка при >1 рег. номере, итого по кол-ву - Лист3: ТН ВЭД в колонке B вместо константы 09035 - Красный ErrorMessage под кнопкой загрузки, удалён SpravkaFileEntry
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using ClosedXML.Excel;
|
||||
using DeclarationAutomatization.Models;
|
||||
|
||||
@@ -24,7 +23,6 @@ public class ExcelExportService
|
||||
{
|
||||
var ws = workbook.Worksheets.Add("Лист2");
|
||||
|
||||
// Заголовки
|
||||
var headers = new[]
|
||||
{
|
||||
"п/п",
|
||||
@@ -37,7 +35,7 @@ public class ExcelExportService
|
||||
"Масса нетто, КГ",
|
||||
"Код декларации",
|
||||
"Регистрационный номер",
|
||||
"Дата регистрационного номера"
|
||||
"Дата регистрационного номера",
|
||||
};
|
||||
|
||||
for (int c = 0; c < headers.Length; c++)
|
||||
@@ -49,7 +47,7 @@ public class ExcelExportService
|
||||
}
|
||||
|
||||
int row = 2;
|
||||
decimal totalAmount = 0, totalGross = 0, totalNet = 0;
|
||||
decimal totalAmount = 0, totalGross = 0, totalNet = 0, totalQty = 0;
|
||||
|
||||
foreach (var item in items)
|
||||
{
|
||||
@@ -62,36 +60,37 @@ public class ExcelExportService
|
||||
ws.Cell(row, 7).Value = item.GrossWeight;
|
||||
ws.Cell(row, 8).Value = item.NetWeight;
|
||||
ws.Cell(row, 9).Value = item.DeclarationCode;
|
||||
ws.Cell(row, 10).Value = item.RegNumber;
|
||||
ws.Cell(row, 11).Value = item.RegDate;
|
||||
|
||||
// Цветовая маркировка строк по уровню уверенности
|
||||
var rowStyle = ws.Row(row).Style;
|
||||
var fillColor = item.Confidence switch
|
||||
if (item.RegEntries.Count == 1)
|
||||
{
|
||||
ConfidenceLevel.Auto => XLColor.FromArgb(198, 239, 206), // светло-зелёный
|
||||
ConfidenceLevel.Review => XLColor.FromArgb(255, 235, 156), // светло-жёлтый
|
||||
ConfidenceLevel.Missing => XLColor.FromArgb(255, 199, 206), // светло-красный
|
||||
_ => XLColor.White
|
||||
};
|
||||
ws.Row(row).Style.Fill.BackgroundColor = fillColor;
|
||||
ws.Cell(row, 10).Value = item.RegEntries[0].Number;
|
||||
ws.Cell(row, 11).Value = item.RegEntries[0].Date;
|
||||
}
|
||||
else if (item.RegEntries.Count > 1)
|
||||
{
|
||||
// Несколько партий — жёлтая строка целиком, подробности в Лист3
|
||||
ws.Row(row).Style.Fill.BackgroundColor = XLColor.Yellow;
|
||||
}
|
||||
|
||||
totalAmount += item.AmountWithVat;
|
||||
totalGross += item.GrossWeight;
|
||||
totalNet += item.NetWeight;
|
||||
totalGross += item.GrossWeight;
|
||||
totalNet += item.NetWeight;
|
||||
totalQty += item.Quantity;
|
||||
row++;
|
||||
}
|
||||
|
||||
// Итоговая строка
|
||||
ws.Cell(row, 5).Value = "ИТОГО:";
|
||||
ws.Cell(row, 5).Style.Font.Bold = true;
|
||||
ws.Cell(row, 2).Value = "ИТОГО:";
|
||||
ws.Cell(row, 5).Value = totalQty;
|
||||
ws.Cell(row, 6).Value = totalAmount;
|
||||
ws.Cell(row, 7).Value = totalGross;
|
||||
ws.Cell(row, 8).Value = totalNet;
|
||||
ws.Row(row).Style.Font.Bold = true;
|
||||
|
||||
ApplyBorders(ws, 1, row, headers.Length);
|
||||
|
||||
ws.Columns().AdjustToContents();
|
||||
ws.Column(2).Width = 50; // описание — широкая колонка
|
||||
ws.Column(2).Width = 50;
|
||||
}
|
||||
|
||||
private static void WriteSheet3(XLWorkbook workbook, IEnumerable<Sheet3Row> rows)
|
||||
@@ -101,9 +100,9 @@ public class ExcelExportService
|
||||
var headers = new[]
|
||||
{
|
||||
"п/п",
|
||||
"Наименование (классификатор)",
|
||||
"ТН ВЭД",
|
||||
"Регистрационный номер",
|
||||
"Дата регистрационного номера"
|
||||
"Дата регистрационного номера",
|
||||
};
|
||||
|
||||
for (int c = 0; c < headers.Length; c++)
|
||||
@@ -118,12 +117,21 @@ public class ExcelExportService
|
||||
foreach (var r in rows)
|
||||
{
|
||||
ws.Cell(row, 1).Value = r.SequentialNumber;
|
||||
ws.Cell(row, 2).Value = r.ClassifierCode;
|
||||
ws.Cell(row, 2).Value = r.TnVed;
|
||||
ws.Cell(row, 3).Value = r.RegNumber;
|
||||
ws.Cell(row, 4).Value = r.RegDate;
|
||||
row++;
|
||||
}
|
||||
|
||||
ApplyBorders(ws, 1, row - 1, headers.Length);
|
||||
|
||||
ws.Columns().AdjustToContents();
|
||||
}
|
||||
|
||||
private static void ApplyBorders(IXLWorksheet ws, int fromRow, int toRow, int colCount)
|
||||
{
|
||||
var range = ws.Range(fromRow, 1, toRow, colCount);
|
||||
range.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||||
range.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user