* Further development
This commit is contained in:
@@ -6,11 +6,15 @@ using SytelineSaAppEfDataModel.Services;
|
||||
|
||||
namespace BroseCumulativeReport;
|
||||
|
||||
public class App(IScheduleOrderService scheduleOrderService, IScheduleOrderDetailsService scheduleOrderDetailsService, IMaterialTransactionService materialTransactionService) : IApp
|
||||
public class App(
|
||||
IScheduleOrderService scheduleOrderService,
|
||||
IScheduleOrderDetailsService scheduleOrderDetailsService,
|
||||
IMaterialTransactionService materialTransactionService) : IApp
|
||||
{
|
||||
public async Task RunAsync()
|
||||
{
|
||||
IList<ScheduleOrderDto> scheduleOrders = (await GetScheduleOrders()).ToList();
|
||||
ExcelGenerator excelGenerator = new ExcelGenerator();
|
||||
|
||||
Dictionary<string, ScheduleOrderDto?> scheduleOrdersByPoNumber = scheduleOrders
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x.PONum)).GroupBy(x => x.PONum)
|
||||
@@ -21,36 +25,145 @@ public class App(IScheduleOrderService scheduleOrderService, IScheduleOrderDetai
|
||||
foreach (KeyValuePair<string, ScheduleOrderDto?> scheduleOrderByPoNumber in scheduleOrdersByPoNumber)
|
||||
{
|
||||
if (scheduleOrderByPoNumber.Value == null) continue;
|
||||
|
||||
|
||||
ScheduleOrderDto scheduleOrder = scheduleOrderByPoNumber.Value;
|
||||
IEnumerable<ScheduleOrderDetailDetailDto> scheduleOrderDetailDetails =
|
||||
await GetScheduleOrderDetailsDetailsByIdAsync(scheduleOrder.ScheduleOrderDetails.FirstOrDefault()
|
||||
?.ID ?? 0);
|
||||
|
||||
scheduleOrderDetailDetails =
|
||||
scheduleOrderDetailDetails.Where(x => x.DateFrom > DateTime.Now.AddDays(-7)).ToList();
|
||||
|
||||
if (!scheduleOrderDetailDetails.Any()) continue;
|
||||
if (string.IsNullOrWhiteSpace(scheduleOrder.PONum)) continue;
|
||||
|
||||
if (wzNumbersByPoNumber.ContainsKey(scheduleOrder.PONum)) continue;
|
||||
|
||||
string wzNumber =
|
||||
scheduleOrder.ScheduleOrderDetails?.FirstOrDefault()?.ScheduleOrderDetailMiscs
|
||||
scheduleOrder.ScheduleOrderDetails.FirstOrDefault()?.ScheduleOrderDetailMiscs
|
||||
?.FirstOrDefault(x => x.Type == "AAK")?.Value ?? string.Empty;
|
||||
|
||||
int quantity = int.Parse(scheduleOrder.ScheduleOrderDetails?.FirstOrDefault()?.ScheduleOrderDetailMiscs
|
||||
?.FirstOrDefault(x => x.Type is "48" or "70")?.Value ?? "0");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(wzNumber)) continue;
|
||||
|
||||
IEnumerable<ScheduleOrderDetailDetailDto> scheduleOrderDetailDetails =
|
||||
await GetScheduleOrderDetailsDetailsByIdAsync(scheduleOrder.ScheduleOrderDetails?.FirstOrDefault()
|
||||
?.ScheduleOrderID ?? 0);
|
||||
int quantity = int.Parse(scheduleOrder.ScheduleOrderDetails.FirstOrDefault()?.ScheduleOrderDetailMiscs
|
||||
?.FirstOrDefault(x => x.Type is "48" or "70")?.Value ?? "0");
|
||||
|
||||
foreach (ScheduleOrderDetailDetailDto detail in scheduleOrderDetailDetails)
|
||||
{
|
||||
scheduleOrder.ScheduleOrderDetails?.FirstOrDefault()?.ScheduleOrderDetailDetails
|
||||
.Add(detail);
|
||||
.Add(detail);
|
||||
}
|
||||
|
||||
Wz wz = new Wz(scheduleOrder.PONum, wzNumber, string.Empty, scheduleOrder, quantity);
|
||||
Wz wz = new Wz(scheduleOrder.PONum, wzNumber, scheduleOrder.PONum, scheduleOrder, quantity);
|
||||
|
||||
wzNumbersByPoNumber.Add(scheduleOrder.PONum, wz);
|
||||
}
|
||||
|
||||
List<MainRow> mainRows = new List<MainRow>();
|
||||
|
||||
IDictionary<string, List<MaterialTransactionDto>> transitMaterialTransactionsByCurrentWz =
|
||||
await GetTransitMaterialTransactionsByCurrentWz(wzNumbersByPoNumber);
|
||||
|
||||
IDictionary<string, string> orderNumbersByWz = await GetOrderNumbersByWz(wzNumbersByPoNumber);
|
||||
|
||||
foreach (KeyValuePair<string, Wz> wzByPoNumber in wzNumbersByPoNumber)
|
||||
{
|
||||
if (!scheduleOrdersByPoNumber.TryGetValue(wzByPoNumber.Key, out ScheduleOrderDto? scheduleOrder) ||
|
||||
scheduleOrder == null) continue;
|
||||
if (scheduleOrder.ScheduleOrderDetails.Count > 1)
|
||||
throw new Exception(
|
||||
$"More than one ScheduleOrderDetail found for the same PO number {wzByPoNumber.Key}");
|
||||
|
||||
IList<ScheduleOrderDetailDetailDto> scheduleOrderDetailDetails =
|
||||
scheduleOrder.ScheduleOrderDetails.First().ScheduleOrderDetailDetails;
|
||||
|
||||
IDictionary<DateTime, IList<Item>> itemsToSendByDate = GetItemsToSendByDate(scheduleOrder,
|
||||
scheduleOrder.ScheduleOrderDetails.First(), scheduleOrderDetailDetails);
|
||||
|
||||
orderNumbersByWz.TryGetValue(wzByPoNumber.Value.WzNumber, out string? orderNumber);
|
||||
|
||||
MainRow mainRow = new MainRow
|
||||
{
|
||||
CustomerName = scheduleOrder.Recipient.RecipientDesc,
|
||||
CustomerOrderNumber = wzByPoNumber.Value.CustomerOrderNumber,
|
||||
OrderNumber = orderNumber ?? "",
|
||||
OrderDate = scheduleOrder.LastUpdateDate,
|
||||
SalesChannelProductCode = scheduleOrder.ScheduleOrderDetails.First().Sc_productCode,
|
||||
ShipperProductCode = scheduleOrder.ScheduleOrderDetails.First().Sh_productCode,
|
||||
LastWzNumber = wzByPoNumber.Value.WzNumber,
|
||||
WzQuantity = wzByPoNumber.Value.Quantity
|
||||
};
|
||||
mainRow.SendDatesWithQuantity = itemsToSendByDate.OrderBy(x => x.Key).Where(x => x.Key >= DateTime.Now)
|
||||
.Select(x => (x.Key,
|
||||
x.Value.Where(z => z.SalesChannelProductCode == mainRow.SalesChannelProductCode)
|
||||
.Sum(y => y.Quantity))).ToList();
|
||||
|
||||
transitMaterialTransactionsByCurrentWz.TryGetValue(wzByPoNumber.Value.WzNumber,
|
||||
out List<MaterialTransactionDto>? materialTransactions);
|
||||
|
||||
if (materialTransactions != null && materialTransactions.Any())
|
||||
{
|
||||
mainRow.ChildRows = materialTransactions.Select(x => new ChildRow(x.MTGroupNum, x.Qty, x.TransDate))
|
||||
.ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
mainRow.ChildRows = new List<ChildRow>();
|
||||
}
|
||||
|
||||
mainRows.Add(mainRow);
|
||||
}
|
||||
|
||||
mainRows = mainRows.OrderBy(x => x.CustomerName).ToList();
|
||||
|
||||
string filePath = Path.Combine(Directory.GetCurrentDirectory(), "BroseCumulativeReport.xlsx");
|
||||
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
File.Delete(filePath);
|
||||
}
|
||||
|
||||
excelGenerator.GenerateExcel(filePath, mainRows);
|
||||
|
||||
Console.WriteLine($"Plik '{filePath}' został wygenerowany!");
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<MaterialTransactionDto>> GetMaterialTransactions(ISet<string> wzNumbers)
|
||||
{
|
||||
return await materialTransactionService.GetByWzNumbers(wzNumbers);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ScheduleOrderDto>> GetScheduleOrders()
|
||||
{
|
||||
return await scheduleOrderService.GetByPurchaserId(1);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<MaterialTransactionDto>> GetMaterialTransactionsByOrderNumber(string orderNumber)
|
||||
{
|
||||
return await materialTransactionService.GetByOrderNumber(orderNumber);
|
||||
}
|
||||
|
||||
private async Task<IDictionary<string, string>> GetOrderNumbersByWz(IDictionary<string, Wz> wzNumbersByPoNumber)
|
||||
{
|
||||
HashSet<string> wzNumbers = wzNumbersByPoNumber.Select(x => x.Value.WzNumber).ToHashSet();
|
||||
IEnumerable<MaterialTransactionDto> orderNumbersByWz =
|
||||
await materialTransactionService.GetOrderNumbersByWz(wzNumbers);
|
||||
|
||||
return orderNumbersByWz.GroupBy(x => x.MTGroupNum).ToDictionary(x => x.Key ?? "",
|
||||
y => y.Select(z => z).MaxBy(v => v.TransDate)?.RefNum ?? "");
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ScheduleOrderDetailDetailDto>> GetScheduleOrderDetailsDetailsByIdAsync(
|
||||
int scheduleOrderDetailId)
|
||||
{
|
||||
return await scheduleOrderDetailsService.GetScheduleOrderDetailsDetailsByIdAsync(scheduleOrderDetailId);
|
||||
}
|
||||
|
||||
private async Task<IDictionary<string, List<MaterialTransactionDto>>> GetTransitMaterialTransactionsByCurrentWz(
|
||||
IDictionary<string, Wz> wzNumbersByPoNumber)
|
||||
{
|
||||
IDictionary<string, List<MaterialTransactionDto>> transitMaterialTransactionsByCurrentWz =
|
||||
new Dictionary<string, List<MaterialTransactionDto>>();
|
||||
|
||||
ISet<string> wzNumbers = wzNumbersByPoNumber.Values.Select(x => x.WzNumber).ToHashSet();
|
||||
|
||||
IEnumerable<MaterialTransactionDto> materialTransactions = await GetMaterialTransactions(wzNumbers);
|
||||
@@ -58,38 +171,53 @@ public class App(IScheduleOrderService scheduleOrderService, IScheduleOrderDetai
|
||||
foreach (MaterialTransactionDto materialTransaction in materialTransactions)
|
||||
{
|
||||
string? orderNumber = materialTransaction.RefNum;
|
||||
|
||||
if(string.IsNullOrWhiteSpace(orderNumber)) continue;
|
||||
|
||||
IEnumerable<MaterialTransactionDto> materialTransactionsByOrderNumber = await GetMaterialTransactionsByOrderNumber(orderNumber);
|
||||
if (string.IsNullOrWhiteSpace(orderNumber)) continue;
|
||||
if (string.IsNullOrWhiteSpace(materialTransaction.MTGroupNum)) continue;
|
||||
|
||||
IEnumerable<MaterialTransactionDto> materialTransactionsByOrderNumber =
|
||||
await GetMaterialTransactionsByOrderNumber(orderNumber);
|
||||
|
||||
List<MaterialTransactionDto> materialTransactionsSentAfterCurrentOne = materialTransactionsByOrderNumber
|
||||
.Where(x => x.TransDate > materialTransaction.TransDate).ToList();
|
||||
|
||||
|
||||
transitMaterialTransactionsByCurrentWz.Add(materialTransaction.MTGroupNum,
|
||||
materialTransactionsSentAfterCurrentOne);
|
||||
}
|
||||
|
||||
Console.WriteLine("Aplikacja działa!");
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<MaterialTransactionDto>> GetMaterialTransactions(ISet<string> wzNumbers)
|
||||
{
|
||||
return await materialTransactionService.GetByWzNumbers(wzNumbers);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ScheduleOrderDto>> GetScheduleOrders()
|
||||
{
|
||||
return await scheduleOrderService.GetByPurchaserId(1);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<MaterialTransactionDto>> GetMaterialTransactionsByOrderNumber(string orderNumber)
|
||||
{
|
||||
return await materialTransactionService.GetByOrderNumber(orderNumber);
|
||||
return transitMaterialTransactionsByCurrentWz;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<ScheduleOrderDetailDetailDto>> GetScheduleOrderDetailsDetailsByIdAsync(
|
||||
int scheduleOrderDetailId)
|
||||
private IDictionary<DateTime, IList<Item>> GetItemsToSendByDate(ScheduleOrderDto scheduleOrder,
|
||||
ScheduleOrderDetailDto scheduleOrderDetail, IList<ScheduleOrderDetailDetailDto> scheduleOrderDetailDetails)
|
||||
{
|
||||
return await scheduleOrderDetailsService.GetScheduleOrderDetailsDetailsByIdAsync(scheduleOrderDetailId);
|
||||
IDictionary<DateTime, IList<Item>> itemsToSendByDate = new Dictionary<DateTime, IList<Item>>();
|
||||
|
||||
foreach (ScheduleOrderDetailDetailDto scheduleOrderDetailDetail in scheduleOrderDetailDetails)
|
||||
{
|
||||
DateTime nextSendDate = GetNextSendDate(scheduleOrderDetailDetail);
|
||||
|
||||
Item item = new Item(scheduleOrder.Recipient.RecipientDesc, scheduleOrderDetail.Sc_productCode,
|
||||
scheduleOrderDetail.Sh_productCode, scheduleOrderDetailDetail.Qty);
|
||||
|
||||
if (itemsToSendByDate.TryGetValue(nextSendDate, out IList<Item>? items))
|
||||
{
|
||||
items.Add(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
itemsToSendByDate.Add(nextSendDate, new List<Item> { item });
|
||||
}
|
||||
}
|
||||
|
||||
return itemsToSendByDate;
|
||||
}
|
||||
|
||||
private DateTime GetNextSendDate(ScheduleOrderDetailDetailDto scheduleOrderDetailDetail)
|
||||
{
|
||||
int daysSinceThursday = ((int)scheduleOrderDetailDetail.DateFrom.DayOfWeek - (int)DayOfWeek.Thursday + 7) % 7;
|
||||
DateTime nearestThursday = scheduleOrderDetailDetail.DateFrom.Date.AddDays(-daysSinceThursday);
|
||||
|
||||
return nearestThursday;
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="appsettings.json">
|
||||
<None Update="appSettings.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Globalization;
|
||||
using BroseCumulativeReport.Model;
|
||||
using Syncfusion.Drawing;
|
||||
|
||||
@@ -8,67 +9,171 @@ using System.IO;
|
||||
|
||||
public class ExcelGenerator
|
||||
{
|
||||
public void GenerateExcel(string filePath, List<MainRow> rows)
|
||||
public void GenerateExcel(string filePath, List<MainRow> mainRows)
|
||||
{
|
||||
using (ExcelEngine excelEngine = new ExcelEngine())
|
||||
using ExcelEngine excelEngine = new ExcelEngine();
|
||||
IApplication application = excelEngine.Excel;
|
||||
application.DefaultVersion = ExcelVersion.Xlsx;
|
||||
|
||||
IWorkbook workbook = application.Workbooks.Create(1);
|
||||
IWorksheet worksheet = workbook.Worksheets[0];
|
||||
|
||||
IStyle darkGreenHeaderStyle = workbook.Styles.Add("DarkGreenHeader");
|
||||
darkGreenHeaderStyle.Color = Color.FromArgb(34, 139, 34);
|
||||
darkGreenHeaderStyle.Font.Bold = true;
|
||||
darkGreenHeaderStyle.Font.Color = ExcelKnownColors.White;
|
||||
|
||||
IStyle lightGreenStyle = workbook.Styles.Add("LightGreen");
|
||||
lightGreenStyle.Color = Color.FromArgb(173, 255, 47);
|
||||
|
||||
IStyle darkOrangeHeaderStyle = workbook.Styles.Add("DarkOrangeHeader");
|
||||
darkOrangeHeaderStyle.Color = Color.FromArgb(255, 140, 0);
|
||||
darkOrangeHeaderStyle.Font.Bold = true;
|
||||
darkOrangeHeaderStyle.Font.Color = ExcelKnownColors.White;
|
||||
|
||||
IStyle lightOrangeStyle = workbook.Styles.Add("LightOrange");
|
||||
lightOrangeStyle.Color = Color.FromArgb(255, 165, 0);
|
||||
|
||||
int currentRow = 1;
|
||||
|
||||
var mainHeaders = new List<string>
|
||||
{ "Klient", "Numer zamówienia", "Numer zamówienia SL", "Data ostatniego komunikatu", "Pozycja", "Pozycja Klienta", "Ostatnia WZ", "Skumulowana ilość dostarczona" };
|
||||
var childHeaders = new List<string> { "W tranzycie:", "Numer WZ", "Data wysyłki", "Ilość" };
|
||||
|
||||
mainHeaders.AddRange(mainRows.SelectMany(x => x.SendDatesWithQuantity).Select(x => x.SendDate).Distinct()
|
||||
.OrderBy(x => x.Date).Select(x => x.Date.ToString("dd.MM.yyyy")).ToList());
|
||||
|
||||
bool addHeaders = false;
|
||||
|
||||
for (int i = 0; i < mainHeaders.Count; i++)
|
||||
{
|
||||
IApplication application = excelEngine.Excel;
|
||||
application.DefaultVersion = ExcelVersion.Xlsx;
|
||||
string columnLetter = GetColumnLetter(i);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text = mainHeaders[i];
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = darkGreenHeaderStyle;
|
||||
}
|
||||
|
||||
IWorkbook workbook = application.Workbooks.Create(1);
|
||||
IWorksheet worksheet = workbook.Worksheets[0];
|
||||
|
||||
// Definicja stylów
|
||||
IStyle darkGreenStyle = workbook.Styles.Add("DarkGreen");
|
||||
darkGreenStyle.Color = Color.FromArgb(144, 238, 144); // Lekko ciemny zielony
|
||||
darkGreenStyle.Font.Bold = true;
|
||||
|
||||
IStyle lightGreenStyle = workbook.Styles.Add("LightGreen");
|
||||
lightGreenStyle.Color = Color.FromArgb(173, 255, 47); // Lekko zielony
|
||||
|
||||
IStyle darkOrangeStyle = workbook.Styles.Add("DarkOrange");
|
||||
darkOrangeStyle.Color = Color.FromArgb(255, 140, 0); // Lekko ciemny pomarańczowy
|
||||
darkOrangeStyle.Font.Bold = true;
|
||||
|
||||
IStyle lightOrangeStyle = workbook.Styles.Add("LightOrange");
|
||||
lightOrangeStyle.Color = Color.FromArgb(255, 165, 0); // Lekko pomarańczowy
|
||||
|
||||
int currentRow = 1;
|
||||
bool isGreen = true; // Flaga do przełączania kolorów
|
||||
|
||||
foreach (var row in rows)
|
||||
currentRow++;
|
||||
|
||||
foreach (var mainRow in mainRows)
|
||||
{
|
||||
worksheet.FreeRange(currentRow, 6);
|
||||
|
||||
if (addHeaders)
|
||||
{
|
||||
// Ustawienie stylu dla głównego wiersza
|
||||
IStyle mainRowStyle = isGreen ? darkGreenStyle : darkOrangeStyle;
|
||||
IStyle subRowStyle = isGreen ? lightGreenStyle : lightOrangeStyle;
|
||||
|
||||
// Wpisanie głównego wiersza
|
||||
//worksheet.Range[$"A{currentRow}"].Text = row.Nazwa;
|
||||
worksheet.Range[$"A{currentRow}:B{currentRow}"].CellStyle = mainRowStyle;
|
||||
currentRow++;
|
||||
|
||||
// Wpisanie podwierszy
|
||||
foreach (var podwiersz in row.ChildRows)
|
||||
for (int i = 0; i < mainHeaders.Count; i++)
|
||||
{
|
||||
// worksheet.Range[$"A{currentRow}"].Text = podwiersz.Detal;
|
||||
// worksheet.Range[$"B{currentRow}"].Number = podwiersz.Wartosc;
|
||||
worksheet.Range[$"A{currentRow}:B{currentRow}"].CellStyle = subRowStyle;
|
||||
currentRow++;
|
||||
string columnLetter = GetColumnLetter(i);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text = mainHeaders[i];
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = darkGreenHeaderStyle;
|
||||
}
|
||||
|
||||
// Przełączenie kolorów
|
||||
isGreen = !isGreen;
|
||||
currentRow++;
|
||||
}
|
||||
|
||||
int columnIndex = 0;
|
||||
string letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.CustomerName;
|
||||
worksheet.Range[$"{letter}{currentRow}"].CellStyle = lightGreenStyle;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.CustomerOrderNumber;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.OrderNumber;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.OrderDate.ToString("dd.MM.yyyy");
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.ShipperProductCode;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.SalesChannelProductCode;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.LastWzNumber;
|
||||
columnIndex++;
|
||||
letter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = mainRow.WzQuantity.ToString();
|
||||
worksheet.Range[$"{letter}{currentRow}"].HorizontalAlignment = ExcelHAlign.HAlignRight;
|
||||
worksheet.Range[$"{letter}{currentRow}"].NumberFormat = "0";
|
||||
|
||||
worksheet.Rows[currentRow - 1].CellStyle = lightGreenStyle;
|
||||
|
||||
foreach ((DateTime SendDate, int Quantity) sendDateWithQuantity in mainRow.SendDatesWithQuantity)
|
||||
{
|
||||
string date = sendDateWithQuantity.SendDate.ToString("dd.MM.yyyy");
|
||||
int index = mainHeaders.IndexOf(date);
|
||||
if (index < 0) continue;
|
||||
|
||||
letter = GetColumnLetter(index);
|
||||
worksheet.Range[$"{letter}{currentRow}"].Text = sendDateWithQuantity.Quantity.ToString();
|
||||
worksheet.Range[$"{letter}{currentRow}"].HorizontalAlignment = ExcelHAlign.HAlignRight;
|
||||
worksheet.Range[$"{letter}{currentRow}"].NumberFormat = "0";
|
||||
}
|
||||
|
||||
// Dopasowanie szerokości kolumn
|
||||
worksheet.AutofitColumn(1);
|
||||
worksheet.AutofitColumn(2);
|
||||
currentRow++;
|
||||
|
||||
// Zapis pliku
|
||||
using (FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
|
||||
columnIndex = 0;
|
||||
|
||||
if (!mainRow.ChildRows.Any())
|
||||
{
|
||||
workbook.SaveAs(stream);
|
||||
addHeaders = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
addHeaders = true;
|
||||
|
||||
foreach (var header in childHeaders)
|
||||
{
|
||||
string columnLetter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text = header;
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = darkOrangeHeaderStyle;
|
||||
columnIndex++;
|
||||
}
|
||||
|
||||
currentRow++;
|
||||
|
||||
foreach (var childRow in mainRow.ChildRows)
|
||||
{
|
||||
columnIndex = 1;
|
||||
string columnLetter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text = childRow.WzNumber;
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = lightOrangeStyle;
|
||||
columnIndex++;
|
||||
columnLetter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text = childRow.Date?.ToString("dd.MM.yyyy");
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = lightOrangeStyle;
|
||||
columnIndex++;
|
||||
columnLetter = GetColumnLetter(columnIndex);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].Text =
|
||||
((int)Math.Abs(childRow.Quantity ?? 0M)).ToString(CultureInfo.InvariantCulture);
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].CellStyle = lightOrangeStyle;
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].HorizontalAlignment = ExcelHAlign.HAlignRight;
|
||||
worksheet.Range[$"{columnLetter}{currentRow}"].NumberFormat = "0";
|
||||
|
||||
currentRow++;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < Math.Max(mainHeaders.Count, childHeaders.Count); i++)
|
||||
{
|
||||
worksheet.AutofitColumn(i + 1);
|
||||
}
|
||||
|
||||
using FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
|
||||
workbook.SaveAs(stream);
|
||||
}
|
||||
|
||||
private static string GetColumnLetter(int columnIndex)
|
||||
{
|
||||
string columnName = string.Empty;
|
||||
while (columnIndex >= 0)
|
||||
{
|
||||
columnName = (char)('A' + (columnIndex % 26)) + columnName;
|
||||
columnIndex = (columnIndex / 26) - 1;
|
||||
}
|
||||
|
||||
return columnName;
|
||||
}
|
||||
}
|
||||
@@ -2,5 +2,14 @@ namespace BroseCumulativeReport.Model;
|
||||
|
||||
public class ChildRow
|
||||
{
|
||||
|
||||
public string? WzNumber { get; set; }
|
||||
public decimal? Quantity { get; set; }
|
||||
public DateTime? Date { get; set; }
|
||||
|
||||
public ChildRow(string? wzNumber, decimal? quantity, DateTime? date)
|
||||
{
|
||||
WzNumber = wzNumber;
|
||||
Quantity = quantity;
|
||||
Date = date;
|
||||
}
|
||||
}
|
||||
17
BroseCumulativeReport/Model/Item.cs
Normal file
17
BroseCumulativeReport/Model/Item.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
namespace BroseCumulativeReport.Model;
|
||||
|
||||
public class Item
|
||||
{
|
||||
public string CustomerName { get; set; }
|
||||
public string SalesChannelProductCode { get; set; }
|
||||
public string ShipperProductCode { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
|
||||
public Item(string customerName, string salesChannelProductCode, string shipperProductCode, int quantity)
|
||||
{
|
||||
CustomerName = customerName;
|
||||
SalesChannelProductCode = salesChannelProductCode;
|
||||
ShipperProductCode = shipperProductCode;
|
||||
Quantity = quantity;
|
||||
}
|
||||
}
|
||||
@@ -2,5 +2,15 @@ namespace BroseCumulativeReport.Model;
|
||||
|
||||
public class MainRow
|
||||
{
|
||||
public IEnumerable<ChildRow> ChildRows { get; set; }
|
||||
public string CustomerName { get; set; }
|
||||
public string CustomerOrderNumber { get; set; }
|
||||
public string OrderNumber { get; set; }
|
||||
public DateTime OrderDate { get; set; }
|
||||
public string SalesChannelProductCode { get; set; }
|
||||
public string ShipperProductCode { get; set; }
|
||||
public string LastWzNumber { get; set; }
|
||||
public int WzQuantity { get; set; }
|
||||
|
||||
public List<(DateTime SendDate, int Quantity)> SendDatesWithQuantity { get; set; } = new();
|
||||
public IEnumerable<ChildRow> ChildRows { get; set; } = new List<ChildRow>();
|
||||
}
|
||||
@@ -13,7 +13,7 @@ public class Wz
|
||||
public Wz(string poNumber, string wzNumber, string customerOrderNumber, ScheduleOrderDto scheduleOrder, int quantity)
|
||||
{
|
||||
PoNumber = poNumber;
|
||||
WzNumber = wzNumber;
|
||||
WzNumber = wzNumber.Replace("_", "");
|
||||
CustomerOrderNumber = customerOrderNumber;
|
||||
ScheduleOrder = scheduleOrder;
|
||||
Quantity = quantity;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using BroseCumulativeReport;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("NRAiBiAaIQQuGjN/V09+XU9HdVRDX3xKf0x/TGpQb19xflBPallYVBYiSV9jS3tTckVgWHldc3ZUR2lfVE90Vg==");
|
||||
|
||||
Service service = new Service();
|
||||
var host = service.CreateHostBuilder(args).Build();
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ public class Service
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.ConfigureAppConfiguration((hostingContext, config) =>
|
||||
{
|
||||
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
|
||||
config.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true);
|
||||
})
|
||||
.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user