@page "/upload"
@using System
@using System.IO
@using IMS.CoreBusiness
@using IMS.Plugins.EFCore
@using IMS.UseCases.Interfaces.Order
@using Microsoft.AspNetCore.Hosting
@using Microsoft.Extensions.Logging
@using OfficeOpenXml
@using FileInfo = System.IO.FileInfo
@inject IJSRuntime JS
@inject ILogger<UploadOrders> Logger
@inject IWebHostEnvironment Environment
@inject IAddOrderListUseCase AddOrderListUseCase
<style>
.btns {
padding: 5px;
width: calc(16% - 10px);
}
</style>
<h1>Upload Orders</h1>
<br/>
<br/>
<p>
<div class="row">
<div class="col-lg-6">
<RadzenCard>
<label>
@*Upload up to @maxAllowedFiles file and of up to @maxFileSize bytes:*@
<InputFile OnChange="@LoadFiles" multiple/>
</label>
</RadzenCard>
</div>
</div>
</p>
@*<div class="row px-3">
<div class="col-lg-6 offset-lg-3 p-3">
<RadzenCard>
<h4 class="mb-4">Upload Orders</h4>
<RadzenFileInput @bind-FileName=@fileName @bind-FileSize=@fileSize TValue="string" Class="w-100" Accept="excel/*"
Change="@OnChange" Error=@(args => OnError(args, "FileInput")) />
</RadzenCard>
</div>
</div>
<RadzenCard>
<h4 class="mb-4">Using RadzenProgressBar</h4>
<RadzenUpload Url="upload/single" Progress=@TrackProgress Complete=@CompleteUpload class="w-100" />
<RadzenProgressBar Value=@progress class="mt-4" Visible=@showProgress />
<RadzenLabel Visible=@showComplete class="mt-4" Text="Upload Complete!" />
</RadzenCard>*@
@if (isLoading)
{
<p>Progress: @string.Format("{0:P0}", progressPercent)</p>
}
else
{
<ul>
@foreach (var file in loadedFiles)
{
<li>
<ul>
<li>Name: @file.Name</li>
<li>Last modified: @file.LastModified.ToString()</li>
<li>Size (bytes): @file.Size</li>
<li>Content type: @file.ContentType</li>
</ul>
</li>
}
</ul>
}
<h2>Excel Sample</h2>
<p>
<button type="button" class="btn btn-primary btns" @onclick="DownloadFileFromStream">
Download Excel File
</button>
</p>
@code {
private List<IBrowserFile> loadedFiles = new();
private long maxFileSize = 1024 * 1024 * 15;
private int maxAllowedFiles = 1;
private bool isLoading;
private decimal progressPercent;
string fileName;
long? fileSize;
int progress;
bool showProgress;
bool showComplete;
void TrackProgress(UploadProgressArgs args)
{
showProgress = true;
showComplete = false;
progress = args.Progress;
}
void CompleteUpload()
{
showProgress = false;
showComplete = true;
}
void OnChange(string value)
{
Console.WriteLine(value);
}
void OnError(UploadErrorEventArgs args, string name)
{
}
private async Task LoadFiles(InputFileChangeEventArgs e)
{
isLoading = true;
loadedFiles.Clear();
progressPercent = 0;
foreach (var file in e.GetMultipleFiles(maxAllowedFiles))
{
try
{
var trustedFileName = file.Name;
var path = Path.Combine(Environment.ContentRootPath,
Environment.EnvironmentName, "unsafe_uploads", trustedFileName);
await using FileStream writeStream = new(path, FileMode.Create);
await using var readStream = file.OpenReadStream(maxFileSize);
var bytesRead = 0;
var totalRead = 0;
var buffer = new byte[1024 * 10];
while ((bytesRead = await readStream.ReadAsync(buffer)) != 0)
{
totalRead += bytesRead;
await writeStream.WriteAsync(buffer, 0, bytesRead);
progressPercent = Decimal.Divide(totalRead, file.Size);
StateHasChanged();
}
loadedFiles.Add(file);
var newfile = new FileInfo(file.Name);
var fileExtension = newfile.Extension;
//Check if file is an Excel File
if (fileExtension.Contains(".xls"))
{
using var ms = new MemoryStream();
await loadedFiles[0].OpenReadStream().CopyToAsync(ms);
// If you use EPPlus in a noncommercial context
// according to the Polyform Noncommercial license:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using ExcelPackage package = new ExcelPackage(ms);
var workSheet = package.Workbook.Worksheets["Order"];
var totalRows = workSheet.Dimension.Rows;
var orderList = new List<Order>();
List<OrderDetail> orderDetailList = null;
var k = 0;
for (var i = 2; i <= totalRows; i++)
{
if(workSheet.Cells[i, 1].Value != null && workSheet.Cells[i, 6].Value != null){
orderDetailList = new List<OrderDetail>();
//Hem order hem detail var
orderList.Add(new Order
{
OrderDateTime = Convert.ToDateTime(workSheet.Cells[i, 1].Value),
CustomerName = workSheet.Cells[i, 2].Value.ToString(),
VendorName = workSheet.Cells[i, 3].Value.ToString(),
Status = workSheet.Cells[i, 4].Value.ToString(),
DoneBy = workSheet.Cells[i, 5].Value.ToString()
});
orderDetailList.Add(new OrderDetail
{
ProductCode = workSheet.Cells[i, 6].Value.ToString(),
ProductName = workSheet.Cells[i, 7].Value.ToString(),
BuyQuantity = Convert.ToInt32(workSheet.Cells[i, 8].Value),
SellQuantity = Convert.ToInt32(workSheet.Cells[i, 9].Value),
CostRatio = Convert.ToInt32(workSheet.Cells[i, 10].Value),
UnitCost = Convert.ToInt32(workSheet.Cells[i, 11].Value),
TotalBuyPrice = Convert.ToDouble(workSheet.Cells[i, 12].Value),
TotalSellPrice = Convert.ToDouble(workSheet.Cells[i, 13].Value),
ShippingNumber = workSheet.Cells[i, 14].Value.ToString(),
TrackingNumber = workSheet.Cells[i, 15].Value.ToString(),
Status = workSheet.Cells[i, 16].Value.ToString(),
Description = workSheet.Cells[i, 17].Value.ToString()
});
orderList[k].OrderDetails = orderDetailList;
k++;
}else if(workSheet.Cells[i, 1].Value == null && workSheet.Cells[i, 6].Value != null)
{
//Sadece detail var
orderDetailList.Add(new OrderDetail
{
ProductCode = workSheet.Cells[i, 6].Value.ToString(),
ProductName = workSheet.Cells[i, 7].Value.ToString(),
BuyQuantity = Convert.ToInt32(workSheet.Cells[i, 8].Value),
SellQuantity = Convert.ToInt32(workSheet.Cells[i, 9].Value),
CostRatio = Convert.ToInt32(workSheet.Cells[i, 10].Value),
UnitCost = Convert.ToInt32(workSheet.Cells[i, 11].Value),
TotalBuyPrice = Convert.ToDouble(workSheet.Cells[i, 12].Value),
TotalSellPrice = Convert.ToDouble(workSheet.Cells[i, 13].Value),
ShippingNumber = workSheet.Cells[i, 14].Value.ToString(),
TrackingNumber = workSheet.Cells[i, 15].Value.ToString(),
Status = workSheet.Cells[i, 16].Value.ToString(),
Description = workSheet.Cells[i, 17].Value.ToString()
});
orderList[k - 1].OrderDetails = orderDetailList;
}
}
await AddOrderListUseCase.ExecuteAsync(orderList);
}
}
catch (Exception ex)
{
Logger.LogError("File: {Filename} Error: {Error}",
file.Name, ex.Message);
}
}
isLoading = false;
}
private Stream GetFileStream()
{
var trustedFileName = "Orders.xlsx";
return File.OpenRead(Path.Combine(Environment.ContentRootPath,
Environment.EnvironmentName, "unsafe_downloads", trustedFileName));
}
private async Task DownloadFileFromStream()
{
var fileStream = GetFileStream();
var fileName = "Orders.xlsx";
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
}