From 55f7ed76fdc9686522c6125128792c40af99f5d5 Mon Sep 17 00:00:00 2001 From: Piotr Kus Date: Fri, 16 May 2025 21:48:43 +0200 Subject: [PATCH] * Further improvements to generate Packing List --- .../Controllers/HangfireJobsController.cs | 302 +++++++++--------- FaKrosnoApi/Controllers/WzHeaderController.cs | 12 + .../Controllers/WzRowMeyleController.cs | 29 ++ FaKrosnoApi/Program.cs | 1 + .../Components/Layout/MainLayout.razor | 18 +- .../Components/Pages/Admin/Scheduler.razor | 2 +- .../Components/Pages/Admin/UsersManager.razor | 2 +- .../Components/Pages/CustomerOrder.razor | 2 +- .../Components/Pages/CustomerOrders.razor | 2 +- .../Pages/CustomerOrdersTranslations.razor | 2 +- .../Components/Pages/EdiCustomerOrder.razor | 2 +- .../Components/Pages/EdiCustomerOrders.razor | 2 +- .../Components/Pages/Warehouse.razor | 126 ++++++-- .../Components/Pages/WarehousePackList.razor | 7 + OrdersManagement/Services/WarehouseService.cs | 30 +- SytelineSaAppEfDataModel/Dtos/WzClientDto.cs | 1 + .../Dtos/WzRowMeyleDto.cs | 13 + SytelineSaAppEfDataModel/Entities/WzClient.cs | 1 + .../Entities/WzRowMeyle.cs | 16 + SytelineSaAppEfDataModel/MappingProfile.cs | 2 + .../Services/IWzHeaderService.cs | 1 + .../Services/IWzRowMeyleService.cs | 9 + .../Services/WzHeaderService.cs | 8 + .../Services/WzRowMeyleService.cs | 21 ++ .../SytelineSaAppDbContext.cs | 61 +++- 25 files changed, 474 insertions(+), 198 deletions(-) create mode 100644 FaKrosnoApi/Controllers/WzRowMeyleController.cs create mode 100644 OrdersManagement/Components/Pages/WarehousePackList.razor create mode 100644 SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs create mode 100644 SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs create mode 100644 SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs diff --git a/FaKrosnoApi/Controllers/HangfireJobsController.cs b/FaKrosnoApi/Controllers/HangfireJobsController.cs index 86e89d0..e4b3bc1 100644 --- a/FaKrosnoApi/Controllers/HangfireJobsController.cs +++ b/FaKrosnoApi/Controllers/HangfireJobsController.cs @@ -16,155 +16,155 @@ public class HangfireJobsController( IRecurringJobManager recurringJobManager, ITaskSchedulerService service) : Controller { - [HttpGet("GetJobsToRun")] - public async Task>> GetJobsToRun() - { - IList jobsToRun = new List(); - - using (IStorageConnection? connection = jobStorage.GetConnection()) - { - IList? recurringJobs = connection.GetRecurringJobs(); - IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); - - foreach (var recurringJob in recurringJobs) - { - TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); - - if (taskScheduler != null) - { - jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, - recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); - } - } - } - - return Ok(jobsToRun); - } - - [HttpPost("run")] - public async Task RunJobs() - { - var jobsToRun = (await GetJobsToRun()).Value?.ToList(); - - if (jobsToRun == null || jobsToRun.Count == 0) - { - return BadRequest("Nie udało się pobrać zadań do uruchomienia."); - } - - foreach (var job in jobsToRun) - { - if (!string.IsNullOrEmpty(job.Path)) - { - recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - } - } - - return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); - } - - [HttpPost("add")] - public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler - { - Name = taskSchedulerDto.Name, - Path = taskSchedulerDto.Path, - CronOptions = taskSchedulerDto.CronOptions, - CreateDate = DateTime.UtcNow - }; - - int result = await service.AddTaskScheduler(taskSchedulerDto); - - if (result == 0) - { - return BadRequest("Nie udało się dodać zadania."); - } - - recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), - taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); - - return Ok("Zadanie zostało dodane."); - } - - [HttpPost("delete")] - public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) - { - int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); - - if (result == 0) - { - return BadRequest("Nie udało się usunąć zadania."); - } - - recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); - - return Ok("Zadanie zostało usunięte."); - } - - [HttpGet] - public async Task>> GetTasks() - { - var tasks = await service.GetTaskSchedulers(); - - foreach (TaskSchedulerDto taskSchedulerDto in tasks) - { - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - } - - return Ok(tasks); - } - - [HttpGet("by-name")] - public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) - { - var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); - - if (taskSchedulerDto == null) return NotFound(); - - var job = GetJob(taskSchedulerDto.Name); - taskSchedulerDto.LastExecution = job?.LastExecution; - taskSchedulerDto.NextExecution = job?.NextExecution; - - return Ok(taskSchedulerDto); - } - - private RecurringJobDto? GetJob(string jobId) - { - using IStorageConnection? connection = jobStorage.GetConnection(); - IList? recurringJobs = connection.GetRecurringJobs(); - return recurringJobs.FirstOrDefault(x => x.Id == jobId); - } - - public void RunConsoleApplication(string pathToApp) - { - try - { - var process = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = pathToApp, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - WorkingDirectory = Path.GetDirectoryName(pathToApp) - } - }; - process.Start(); - string output = process.StandardOutput.ReadToEnd(); - string error = process.StandardError.ReadToEnd(); - process.WaitForExit(); - - Console.WriteLine($"Output: {output}"); - Console.WriteLine($"Error: {error}"); - } - catch (Exception ex) - { - Console.WriteLine($"Error executing console application: {ex.Message}"); - } - } + // [HttpGet("GetJobsToRun")] + // public async Task>> GetJobsToRun() + // { + // IList jobsToRun = new List(); + // + // using (IStorageConnection? connection = jobStorage.GetConnection()) + // { + // IList? recurringJobs = connection.GetRecurringJobs(); + // IList? taskSchedulers = (await service.GetTaskSchedulers()).ToList(); + // + // foreach (var recurringJob in recurringJobs) + // { + // TaskSchedulerDto? taskScheduler = taskSchedulers?.FirstOrDefault(ts => ts.Name == recurringJob.Id); + // + // if (taskScheduler != null) + // { + // jobsToRun.Add(new JobModel(recurringJob.Id, recurringJob.Cron, taskScheduler.Path, + // recurringJob.LastExecution, recurringJob.NextExecution, recurringJob.Job)); + // } + // } + // } + // + // return Ok(jobsToRun); + // } + // + // [HttpPost("run")] + // public async Task RunJobs() + // { + // var jobsToRun = (await GetJobsToRun()).Value?.ToList(); + // + // if (jobsToRun == null || jobsToRun.Count == 0) + // { + // return BadRequest("Nie udało się pobrać zadań do uruchomienia."); + // } + // + // foreach (var job in jobsToRun) + // { + // if (!string.IsNullOrEmpty(job.Path)) + // { + // recurringJobManager.AddOrUpdate(job.JobId, () => RunConsoleApplication(job.Path), job.Cron, + // new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // } + // } + // + // return Ok("Zadania zostały zaplanowane do uruchamiania zgodnie z ich CRON."); + // } + // + // [HttpPost("add")] + // public async Task AddTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // var taskScheduler = new OrdersManagementDataModel.Entities.TaskScheduler + // { + // Name = taskSchedulerDto.Name, + // Path = taskSchedulerDto.Path, + // CronOptions = taskSchedulerDto.CronOptions, + // CreateDate = DateTime.UtcNow + // }; + // + // int result = await service.AddTaskScheduler(taskSchedulerDto); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się dodać zadania."); + // } + // + // recurringJobManager.AddOrUpdate(taskScheduler.Name, () => RunConsoleApplication(taskScheduler.Path), + // taskScheduler.CronOptions, new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); + // + // return Ok("Zadanie zostało dodane."); + // } + // + // [HttpPost("delete")] + // public async Task DeleteTask([FromBody] TaskSchedulerDto taskSchedulerDto) + // { + // int result = await service.DeleteTaskScheduler(taskSchedulerDto.RowPointer); + // + // if (result == 0) + // { + // return BadRequest("Nie udało się usunąć zadania."); + // } + // + // recurringJobManager.RemoveIfExists(taskSchedulerDto.Name); + // + // return Ok("Zadanie zostało usunięte."); + // } + // + // [HttpGet] + // public async Task>> GetTasks() + // { + // var tasks = await service.GetTaskSchedulers(); + // + // foreach (TaskSchedulerDto taskSchedulerDto in tasks) + // { + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // } + // + // return Ok(tasks); + // } + // + // [HttpGet("by-name")] + // public async Task> GetTaskSchedulerByTaskName([FromQuery] string name) + // { + // var taskSchedulerDto = await service.GetTaskSchedulerByTaskName(name); + // + // if (taskSchedulerDto == null) return NotFound(); + // + // var job = GetJob(taskSchedulerDto.Name); + // taskSchedulerDto.LastExecution = job?.LastExecution; + // taskSchedulerDto.NextExecution = job?.NextExecution; + // + // return Ok(taskSchedulerDto); + // } + // + // private RecurringJobDto? GetJob(string jobId) + // { + // using IStorageConnection? connection = jobStorage.GetConnection(); + // IList? recurringJobs = connection.GetRecurringJobs(); + // return recurringJobs.FirstOrDefault(x => x.Id == jobId); + // } + // + // public void RunConsoleApplication(string pathToApp) + // { + // try + // { + // var process = new Process + // { + // StartInfo = new ProcessStartInfo + // { + // FileName = pathToApp, + // UseShellExecute = false, + // RedirectStandardOutput = true, + // RedirectStandardError = true, + // CreateNoWindow = true, + // WorkingDirectory = Path.GetDirectoryName(pathToApp) + // } + // }; + // process.Start(); + // string output = process.StandardOutput.ReadToEnd(); + // string error = process.StandardError.ReadToEnd(); + // process.WaitForExit(); + // + // Console.WriteLine($"Output: {output}"); + // Console.WriteLine($"Error: {error}"); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"Error executing console application: {ex.Message}"); + // } + // } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzHeaderController.cs b/FaKrosnoApi/Controllers/WzHeaderController.cs index 1fb947e..b1035a8 100644 --- a/FaKrosnoApi/Controllers/WzHeaderController.cs +++ b/FaKrosnoApi/Controllers/WzHeaderController.cs @@ -23,4 +23,16 @@ public class WzHeaderController(IWzHeaderService service, IMaterialTransactionSe await materialTransactionService.GetByCustomerNumber(customerNumber, customerSequence); return Ok(materialTransactions); } + + [HttpPost] + public async Task CreateHeader([FromBody] WzHeaderDto wzHeader) + { + if (wzHeader == null) + { + return BadRequest("WzHeader cannot be null."); + } + + await service.CreateHeader(wzHeader); + return CreatedAtAction(nameof(CreateHeader), wzHeader); + } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/WzRowMeyleController.cs b/FaKrosnoApi/Controllers/WzRowMeyleController.cs new file mode 100644 index 0000000..db04ee2 --- /dev/null +++ b/FaKrosnoApi/Controllers/WzRowMeyleController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class WzRowMeyleController(IWzRowMeyleService service) : Controller +{ + [HttpGet] + public async Task>> GetAll() + { + IEnumerable wzRows = await service.GetAll(); + return Ok(wzRows); + } + + [HttpPost] + public async Task CreateRows([FromBody] IEnumerable rows) + { + if (rows == null || !rows.Any()) + { + return BadRequest("No rows provided."); + } + + await service.CreateRows(rows); + return CreatedAtAction(nameof(GetAll), new { count = rows.Count() }, rows); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index b4d5d9a..309804f 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -103,6 +103,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); diff --git a/OrdersManagement/Components/Layout/MainLayout.razor b/OrdersManagement/Components/Layout/MainLayout.razor index d650ddc..cdf48fb 100644 --- a/OrdersManagement/Components/Layout/MainLayout.razor +++ b/OrdersManagement/Components/Layout/MainLayout.razor @@ -35,14 +35,14 @@ - @* *@ - @* *@ - @if (UserName == "pkus") + @if (IsAdminRoute()) { - + - - + + + + } @@ -64,6 +64,12 @@ private bool IsAuthenticated { get; set; } private string UserName { get; set; } = string.Empty; + private bool IsAdminRoute() + { + var path = new Uri(NavigationManager.Uri).AbsolutePath; + return path.StartsWith("/admin", StringComparison.OrdinalIgnoreCase); + } + protected override void OnInitialized() { // ClaimsPrincipal currentUser = AuthenticationStateProvider.GetCurrentUser(); diff --git a/OrdersManagement/Components/Pages/Admin/Scheduler.razor b/OrdersManagement/Components/Pages/Admin/Scheduler.razor index 72e25c5..99ac7f1 100644 --- a/OrdersManagement/Components/Pages/Admin/Scheduler.razor +++ b/OrdersManagement/Components/Pages/Admin/Scheduler.razor @@ -1,4 +1,4 @@ -@page "/Admin/Scheduler" +@page "/Admin/PK/Scheduler" @using System.Security.Claims @using Microsoft.AspNetCore.Authorization diff --git a/OrdersManagement/Components/Pages/Admin/UsersManager.razor b/OrdersManagement/Components/Pages/Admin/UsersManager.razor index 7262b2d..84f1642 100644 --- a/OrdersManagement/Components/Pages/Admin/UsersManager.razor +++ b/OrdersManagement/Components/Pages/Admin/UsersManager.razor @@ -1,4 +1,4 @@ -@page "/admin/UsersManager" +@page "/Admin/PK/UsersManager" @using System.Security.Claims @using Microsoft.AspNetCore.Authorization diff --git a/OrdersManagement/Components/Pages/CustomerOrder.razor b/OrdersManagement/Components/Pages/CustomerOrder.razor index 1e1464a..42a0810 100644 --- a/OrdersManagement/Components/Pages/CustomerOrder.razor +++ b/OrdersManagement/Components/Pages/CustomerOrder.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrder/{CustomerOrderId:guid}" +@page "/Admin/PK/CustomerOrder/{CustomerOrderId:guid}" @inject CustomerOrderService CustomerOrderService @inject ScheduleOrderService ScheduleOrderService diff --git a/OrdersManagement/Components/Pages/CustomerOrders.razor b/OrdersManagement/Components/Pages/CustomerOrders.razor index 2ea4343..83a7a74 100644 --- a/OrdersManagement/Components/Pages/CustomerOrders.razor +++ b/OrdersManagement/Components/Pages/CustomerOrders.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrders" +@page "/Admin/PK/CustomerOrders" @inject CustomerOrderService CustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor index 361b150..5d33776 100644 --- a/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor +++ b/OrdersManagement/Components/Pages/CustomerOrdersTranslations.razor @@ -1,4 +1,4 @@ -@page "/CustomerOrdersTranslations" +@page "/admin" @using SytelineSaAppEfDataModel.Dtos @using Syncfusion.Blazor.Cards diff --git a/OrdersManagement/Components/Pages/EdiCustomerOrder.razor b/OrdersManagement/Components/Pages/EdiCustomerOrder.razor index d2f444f..a26d1cf 100644 --- a/OrdersManagement/Components/Pages/EdiCustomerOrder.razor +++ b/OrdersManagement/Components/Pages/EdiCustomerOrder.razor @@ -1,4 +1,4 @@ -@page "/EdiCustomerOrder/{CustomerOrderId:guid}" +@page "/Admin/PK/EdiCustomerOrder/{CustomerOrderId:guid}" @inject EdiCustomerOrderService EdiCustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor index e5289c5..f5883e4 100644 --- a/OrdersManagement/Components/Pages/EdiCustomerOrders.razor +++ b/OrdersManagement/Components/Pages/EdiCustomerOrders.razor @@ -1,4 +1,4 @@ -@page "/EdiCustomerOrders" +@page "/Admin/PK/EdiCustomerOrders" @inject EdiCustomerOrderService EdiCustomerOrderService @inject NavigationManager NavigationManager diff --git a/OrdersManagement/Components/Pages/Warehouse.razor b/OrdersManagement/Components/Pages/Warehouse.razor index 74081f0..baacf4e 100644 --- a/OrdersManagement/Components/Pages/Warehouse.razor +++ b/OrdersManagement/Components/Pages/Warehouse.razor @@ -3,6 +3,10 @@ @using Syncfusion.Blazor.Cards @using Syncfusion.Blazor.Grids @using SytelineSaAppEfDataModel.Dtos +@using Syncfusion.Blazor.DropDowns +@using FilterType = Syncfusion.Blazor.Grids.FilterType +@using SelectionMode = Syncfusion.Blazor.Grids.SelectionMode +@using Syncfusion.Blazor.Navigations @inject WarehouseService WarehouseService @@ -12,34 +16,41 @@

Dokumenty WZ na Magazynie

- @* *@ - @* *@ - @* *@ - @* @{ *@ - @* } *@ - @* *@ - @* *@ - @* *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* $1$ #1# *@ - @* *@ - @* *@ - @* *@ - @* *@ - @* $1$ #1# *@ - @* *@ +
Klient
+ + + + + @if (_isVisible) + { +
Dokumenty WZ
+ + + + + + + + + + + + + + + + + @* *@ + + }
FA Krosno Manager © @(DateTime.Now.Year) @@ -48,11 +59,68 @@ @code { + private SfGrid _grid; + IEnumerable _clients = new List(); + IEnumerable _materialTransactions = new List(); + + WzClientDto? _selectedClient; + + bool _isVisible = false; + protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { - IEnumerable task = await WarehouseService.GetAllClientWzsAsync("K005531", 0); + _clients = await WarehouseService.GetAllClientsAsync(); + StateHasChanged(); + } + } + + private async Task OnValueChange(ChangeEventArgs args) + { + if (args.Value.HasValue) + { + _selectedClient = args.ItemData; + _isVisible = true; + _materialTransactions = await WarehouseService.GetAllClientWzsAsync(_selectedClient.CustomerNumber, _selectedClient.CustomerSequence ?? 0); + } + else + { + _selectedClient = null; + _isVisible = false; + } + + StateHasChanged(); + } + + private async Task CreatePackingList() + { + var selectedRecords = await _grid.GetSelectedRecordsAsync(); + if (selectedRecords.Any()) + { + WzHeaderDto wzHeader = new WzHeaderDto + { + ID = Guid.NewGuid(), + FK_Client = _selectedClient?.ID + }; + + await WarehouseService.CreateWzHeaderAsync(wzHeader); + + switch (_selectedClient?.Name.ToUpper()) + { + case "MEYLE": + IList rows = new List(); + foreach (MaterialTransactionDto materialTransactionDto in selectedRecords) + { + rows.Add(new WzRowMeyleDto + { + ID = Guid.NewGuid(), + Quantity = Math.Abs((int?)materialTransactionDto.Qty ?? 0), + //ItemNumber = + }); + } + break; + } } } } \ No newline at end of file diff --git a/OrdersManagement/Components/Pages/WarehousePackList.razor b/OrdersManagement/Components/Pages/WarehousePackList.razor new file mode 100644 index 0000000..89ae813 --- /dev/null +++ b/OrdersManagement/Components/Pages/WarehousePackList.razor @@ -0,0 +1,7 @@ +@page "/Warehouse/PackList" + +

WarehousePackList

+ +@code { + +} \ No newline at end of file diff --git a/OrdersManagement/Services/WarehouseService.cs b/OrdersManagement/Services/WarehouseService.cs index 656b549..63d841e 100644 --- a/OrdersManagement/Services/WarehouseService.cs +++ b/OrdersManagement/Services/WarehouseService.cs @@ -2,13 +2,15 @@ using SytelineSaAppEfDataModel.Dtos; namespace OrdersManagement.Services; -public class WarehouseService +public class WarehouseService(IHttpClientFactory httpClientFactory) { - private readonly HttpClient _httpClient; + private readonly HttpClient _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); - public WarehouseService(IHttpClientFactory httpClientFactory) + public async Task> GetAllClientsAsync() { - _httpClient = httpClientFactory.CreateClient("FaKrosnoApi"); + var response = await _httpClient.GetAsync($"api/WzClient"); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync>(); } public async Task> GetAllClientWzsAsync(string customerNumber, int customerSequence) @@ -18,4 +20,24 @@ public class WarehouseService response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync>(); } + + public async Task CreateWzHeaderAsync(WzHeaderDto wzHeader) + { + var response = await _httpClient.PostAsJsonAsync("api/WzHeader", wzHeader); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != System.Net.HttpStatusCode.Created) + { + throw new Exception("Failed to create WzHeader"); + } + } + + public async Task CreateWzRowMeyleAsync(IEnumerable wzRowMeyles) + { + var response = await _httpClient.PostAsJsonAsync("api/WzRowMeyle", wzRowMeyles); + response.EnsureSuccessStatusCode(); + if (response.StatusCode != System.Net.HttpStatusCode.Created) + { + throw new Exception("Failed to create WzRowMeyle"); + } + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs index d3d8e49..05950ce 100644 --- a/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/WzClientDto.cs @@ -6,4 +6,5 @@ public class WzClientDto public string CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } + public string Name { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs new file mode 100644 index 0000000..69f4b3a --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/WzRowMeyleDto.cs @@ -0,0 +1,13 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class WzRowMeyleDto +{ + public Guid ID { get; set; } + public Guid? FK_Header { get; set; } + public string OrderNumber { get; set; } + public string ItemNumber { get; set; } + public int? Quantity { get; set; } + public int? PalletNumber { get; set; } + public string WzNumber { get; set; } + public string PartNumber { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzClient.cs b/SytelineSaAppEfDataModel/Entities/WzClient.cs index 117aaa2..d9af197 100644 --- a/SytelineSaAppEfDataModel/Entities/WzClient.cs +++ b/SytelineSaAppEfDataModel/Entities/WzClient.cs @@ -6,4 +6,5 @@ public class WzClient public string CustomerNumber { get; set; } public int? CustomerSequence { get; set; } public DateTime CreatedDate { get; set; } + public string Name { get; set; } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs new file mode 100644 index 0000000..044d965 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/WzRowMeyle.cs @@ -0,0 +1,16 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class WzRowMeyle +{ + public Guid ID { get; set; } + public Guid? FK_Header { get; set; } + public string OrderNumber { get; set; } + public string ItemNumber { get; set; } + public int? Quantity { get; set; } + public int? PalletNumber { get; set; } + public string WzNumber { get; set; } + public string PartNumber { get; set; } + + // Navigation property + public WzHeader Header { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index d75825e..9063798 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -21,6 +21,8 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs index ef77795..d4c5630 100644 --- a/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/IWzHeaderService.cs @@ -5,4 +5,5 @@ namespace SytelineSaAppEfDataModel.Services; public interface IWzHeaderService { Task> GetAll(); + Task CreateHeader(WzHeaderDto wzHeader); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs new file mode 100644 index 0000000..65d1dc5 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IWzRowMeyleService.cs @@ -0,0 +1,9 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IWzRowMeyleService +{ + Task> GetAll(); + Task CreateRows(IEnumerable rows); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs index ea2f02d..79f96a5 100644 --- a/SytelineSaAppEfDataModel/Services/WzHeaderService.cs +++ b/SytelineSaAppEfDataModel/Services/WzHeaderService.cs @@ -1,6 +1,7 @@ using AutoMapper; using Microsoft.EntityFrameworkCore; using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; namespace SytelineSaAppEfDataModel.Services; @@ -10,4 +11,11 @@ public class WzHeaderService(SytelineSaAppDbContext context, IMapper mapper) : I { return await context.WzHeaders.Select(x => mapper.Map(x)).ToListAsync(); } + + public async Task CreateHeader(WzHeaderDto wzHeader) + { + var entity = mapper.Map(wzHeader); + await context.WzHeaders.AddAsync(entity); + await context.SaveChangesAsync(); + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs new file mode 100644 index 0000000..4684adf --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/WzRowMeyleService.cs @@ -0,0 +1,21 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; + +namespace SytelineSaAppEfDataModel.Services; + +public class WzRowMeyleService(SytelineSaAppDbContext context, IMapper mapper) : IWzRowMeyleService +{ + public async Task> GetAll() + { + return await context.WzRowsMeyle.Select(x => mapper.Map(x)).ToListAsync(); + } + + public async Task CreateRows(IEnumerable rows) + { + var entities = mapper.Map>(rows); + await context.WzRowsMeyle.AddRangeAsync(entities); + await context.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index d34fe3f..15ff01f 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -24,6 +24,7 @@ namespace SytelineSaAppEfDataModel public DbSet WzClients { get; set; } public DbSet WzHeaders { get; set; } + public DbSet WzRowsMeyle { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var configuration = new ConfigurationBuilder() @@ -799,7 +800,7 @@ namespace SytelineSaAppEfDataModel entity.Property(e => e.WhseSplit) .HasColumnName("WhseSplit") .HasColumnType("tinyint") - .IsRequired(false);; + .IsRequired(false); entity.Property(e => e.VariableId) .HasColumnName("VariableId") @@ -930,6 +931,64 @@ namespace SytelineSaAppEfDataModel .HasColumnName("CreatedDate") .HasColumnType("timestamp") .IsRowVersion(); + + entity.Property(e => e.Name) + .HasColumnName("Name") + .HasMaxLength(255) + .IsRequired(false); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("wz_row_meyle"); + + entity.HasKey(e => e.ID); + + entity.Property(e => e.ID) + .HasColumnName("ID") + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("newid()"); + + entity.Property(e => e.FK_Header) + .HasColumnName("FK_Header") + .HasColumnType("uniqueidentifier") + .IsRequired(false); + + entity.Property(e => e.OrderNumber) + .HasColumnName("order_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.ItemNumber) + .HasColumnName("item_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.Quantity) + .HasColumnName("quantity") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.PalletNumber) + .HasColumnName("pallet_number") + .HasColumnType("int") + .IsRequired(false); + + entity.Property(e => e.WzNumber) + .HasColumnName("wz_number") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.PartNumber) + .HasColumnName("part_number") + .HasMaxLength(100) + .IsRequired(false); + + // Relationship + entity.HasOne(e => e.Header) + .WithMany() + .HasForeignKey(e => e.FK_Header) + .HasConstraintName("wz_rows_meyle_wz_header_ID_fk"); }); } }