imporvements, fixes, etc...

This commit is contained in:
Loretta 2025-10-31 05:37:12 +01:00
parent d53c44d2db
commit dd270f6eca
8 changed files with 95 additions and 62 deletions

View File

@ -6,6 +6,7 @@ using FruitBank.Common.Models.SignalRs;
using FruitBank.Common.SignalRs; using FruitBank.Common.SignalRs;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Nop.Core.Domain.Orders;
namespace FruitBank.Common.Server.Services.SignalRs; namespace FruitBank.Common.Server.Services.SignalRs;
@ -25,6 +26,7 @@ public class SignalRSendToClientService(IHubContext<DevAdminSignalRHub, IAcSigna
public Task SendOrderChanged(OrderDto orderDto) => base.SendMessageToAllClients(SignalRTags.SendOrderChanged, orderDto); public Task SendOrderChanged(OrderDto orderDto) => base.SendMessageToAllClients(SignalRTags.SendOrderChanged, orderDto);
public Task SendOrderItemChanged(OrderItemDto orderItemDto) => base.SendMessageToAllClients(SignalRTags.SendOrderItemChanged, orderItemDto); public Task SendOrderItemChanged(OrderItemDto orderItemDto) => base.SendMessageToAllClients(SignalRTags.SendOrderItemChanged, orderItemDto);
public Task SendOrderItemDeleted(OrderItem orderItem) => base.SendMessageToAllClients(SignalRTags.SendOrderItemDeleted, orderItem);
public Task SendOrderItemPalletChanged(OrderItemPallet orderItemPallet) => base.SendMessageToAllClients(SignalRTags.SendOrderItemPalletChanged, orderItemPallet); public Task SendOrderItemPalletChanged(OrderItemPallet orderItemPallet) => base.SendMessageToAllClients(SignalRTags.SendOrderItemPalletChanged, orderItemPallet);
public Task SendShippingChanged(Shipping shipping) => base.SendMessageToAllClients(SignalRTags.SendShippingChanged, shipping); public Task SendShippingChanged(Shipping shipping) => base.SendMessageToAllClients(SignalRTags.SendShippingChanged, shipping);

View File

@ -1,8 +1,10 @@
using FruitBank.Common.Interfaces; using AyCode.Core.Loggers;
using FruitBank.Common.Interfaces;
using Mango.Nop.Core.Loggers;
namespace FruitBank.Common.Services; namespace FruitBank.Common.Services;
public class MeasurementServiceBase : IMeasurementServiceBase public abstract class MeasurementServiceBase<TLogger>(TLogger logger) : IMeasurementServiceBase where TLogger : ILogger
{ {
public TLogger Logger => logger;
} }

View File

@ -76,7 +76,8 @@ public class SignalRTags : AcSignalRTags
#region SendToClient #region SendToClient
public const int SendOrderChanged = 500; public const int SendOrderChanged = 500;
public const int SendOrderItemChanged = 501; public const int SendOrderItemChanged = 501;
public const int SendOrderItemPalletChanged = 502; public const int SendOrderItemDeleted = 502;
public const int SendOrderItemPalletChanged = 503;
public const int SendShippingChanged = 520; public const int SendShippingChanged = 520;
public const int SendShippingItemChanged = 521; public const int SendShippingItemChanged = 521;

View File

@ -52,7 +52,7 @@
@if (HasAuditButton) @if (HasAuditButton)
{ {
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1"> <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1">
<DxButton Enabled="@(IsEditable && OrderItemPallet!.IsMeasuredAndValid(IsMeasurable) && !OrderItemPallet.IsAudited)" <DxButton Enabled="@(IsEditable && OrderItemPallet!.IsMeasuredAndValid(IsMeasurable) && !OrderItemPallet.IsAudited && IsMaxTrayQuantityValid)"
Text="@(OrderItemPallet!.IsAudited ? "Jóváhagyva" : "Jóváhagy")" Click="() => PalletItemAuditedClick()" CssClass="w-100" /> Text="@(OrderItemPallet!.IsAudited ? "Jóváhagyva" : "Jóváhagy")" Click="() => PalletItemAuditedClick()" CssClass="w-100" />
</DxFormLayoutItem> </DxFormLayoutItem>
} }
@ -91,9 +91,11 @@
private bool GetBtnSaveEnabled() private bool GetBtnSaveEnabled()
{ {
return IsEditable && PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value); return IsEditable && PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && IsMaxTrayQuantityValid;
} }
private bool IsMaxTrayQuantityValid => (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value);
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
BtnSaveEnabled = GetBtnSaveEnabled();// PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured; BtnSaveEnabled = GetBtnSaveEnabled();// PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured;
@ -147,7 +149,7 @@
palletItem.TrayQuantity = (int)newValue; palletItem.TrayQuantity = (int)newValue;
if (palletItem.TrayQuantity < 0) palletItem.TrayQuantity = 0; if (palletItem.TrayQuantity < 0) palletItem.TrayQuantity = 0;
//else if (MaxTrayQuantity.HasValue && palletItem.TrayQuantity > MaxTrayQuantity.Value) palletItem.TrayQuantity = MaxTrayQuantity.Value; //else if (!IsMaxTrayQuantityValid) palletItem.TrayQuantity = MaxTrayQuantity!.Value;
break; break;
case nameof(IMeasuringItemPalletBase.GrossWeight): case nameof(IMeasuringItemPalletBase.GrossWeight):

View File

@ -26,7 +26,7 @@ public partial class MainLayout : LayoutComponentBase
private EventCallback RefreshMainLayoutEventCallback => EventCallback.Factory.Create(this, RefreshMainLayout); private EventCallback RefreshMainLayoutEventCallback => EventCallback.Factory.Create(this, RefreshMainLayout);
private NavMenu _navMenu = null!; private NavMenu _navMenu = null!;
private ILogger _logger = null!; private LoggerClient _logger = null!;
protected override void OnInitialized() protected override void OnInitialized()
{ {
@ -54,23 +54,27 @@ public partial class MainLayout : LayoutComponentBase
return Task.CompletedTask; return Task.CompletedTask;
} }
if (!(notificationMessage.Content?.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) ?? LoggedInModel.IsRevisor)) return Task.CompletedTask; var orderDto = notificationMessage.Content;
if ((orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) ?? LoggedInModel.IsRevisor) || orderDto?.MeasurementOwnerId == 0)
var messageText = $"{notificationMessage.Message}";
if (notificationMessage.Content != null)
{ {
messageText += $" Rendelés: #{notificationMessage.Content.CustomOrderNumber}. Átvétel: {notificationMessage.Content.DateOfReceipt}"; var messageText = $"{notificationMessage.Message}";
if (orderDto != null)
{
messageText += $" Rendelés: #{orderDto.CustomOrderNumber}. Átvétel: {orderDto.DateOfReceipt}";
}
_logger.Debug($"NotificationMessage received. {messageText}");
ToastService.ShowToast(new ToastOptions
{
ProviderName = "Positioning",
Title = "Értesítő!",
Text = messageText,
});
return Task.CompletedTask;
} }
_logger.Info($"NotificationMessage received. {messageText}");
ToastService.ShowToast(new ToastOptions
{
ProviderName = "Positioning",
Title = "Király vagyok!",
Text = messageText,
});
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@ -156,41 +156,38 @@
@{ @{
if (context.Level == 0) if (context.Level == 0)
{ {
//var orderItemPallet = ((OrderItemPallet)(context.DataItem)); var selectedOrderItem = (OrderItemDto)(context.DataItem);
//text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg";
//var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId); <DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
SelectedOrderItem = selectedOrderItemDto;
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItemDto" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12"> <DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
@for (var index = 0; index < (selectedOrderItemDto?.OrderItemPallets?.Count ?? 0); index++) @for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++)
{ {
var localI = index + 1; var localI = index + 1;
var currentOrderItemPallet = selectedOrderItemDto!.OrderItemPallets![index]; var currentOrderItemPallet = selectedOrderItem!.OrderItemPallets![index];
<PalletItemComponent IsMeasurable="@selectedOrderItemDto.IsMeasurable" <PalletItemComponent IsMeasurable="@selectedOrderItem.IsMeasurable"
MeasuringIndex="@localI" MeasuringIndex="@localI"
IsEditable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))" IsEditable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
PalletItem="@currentOrderItemPallet" PalletItem="@currentOrderItemPallet"
ProductId="@selectedOrderItemDto.ProductId" ProductId="@selectedOrderItem.ProductId"
MaxTrayQuantity="@selectedOrderItemDto.Quantity" MaxTrayQuantity="@selectedOrderItem.Quantity"
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet" AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItemDto)" OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItem)"
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItemDto)" OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItem)"
OnPalletItemAuditedClick="pallet => OnPalletItemAuditedClick(pallet, selectedOrderItemDto)"> OnPalletItemAuditedClick="pallet => OnPalletItemAuditedClick(pallet, selectedOrderItem)">
</PalletItemComponent> </PalletItemComponent>
} }
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true"> <DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItemDto)" CssClass="w-100" <DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItem)" CssClass="w-100"
Visible="@(!(SelectedOrder?.IsComplete ?? false))" Visible="@(!(SelectedOrder?.IsComplete ?? false))"
Enabled="@(selectedOrderItemDto.OrderItemPallets[^1].Id > 0)" /> Enabled="@(selectedOrderItem.OrderItemPallets[^1].Id > 0)" />
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3"> <DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
<DxButton Text="Utolsó sor törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItemDto)" CssClass="w-100" <DxButton Text="Utolsó sor törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItem)" CssClass="w-100"
Visible="@(!(SelectedOrder?.IsComplete ?? false))" Visible="@(!(SelectedOrder?.IsComplete ?? false))"
Enabled="@(selectedOrderItemDto.OrderItemPallets.Count > 1 && selectedOrderItemDto.OrderItemPallets[^1].Id <= 0)" /> Enabled="@(selectedOrderItem.OrderItemPallets.Count > 1 && selectedOrderItem.OrderItemPallets[^1].Id <= 0)" />
</DxFormLayoutItem> </DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="7" /> <DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="7" />
@ -201,9 +198,9 @@
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" /> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" /> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" /> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(selectedOrderItemDto.TrayQuantity) db</strong></DxFormLayoutItem> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Rekesz: @(selectedOrderItem.TrayQuantity) db</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Br: @(selectedOrderItemDto.GrossWeight) kg</strong></DxFormLayoutItem> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>Br: @(selectedOrderItem.GrossWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>Net: @(selectedOrderItemDto.NetWeight) kg</strong></DxFormLayoutItem> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>Net: @(selectedOrderItem.NetWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" /> <DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
</DxFormLayout> </DxFormLayout>
</DxFormLayoutItem> </DxFormLayoutItem>

View File

@ -37,7 +37,7 @@ namespace FruitBankHybrid.Shared.Pages
[Inject] private IDialogService DialogService { get; set; } = null!; [Inject] private IDialogService DialogService { get; set; } = null!;
[Inject] public required LoggedInModel LoggedInModel { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; }
private ILogger _logger = null!; private LoggerClient _logger = null!;
private string _errorText; private string _errorText;
public bool HasMeasuringAccess; public bool HasMeasuringAccess;
@ -46,7 +46,7 @@ namespace FruitBankHybrid.Shared.Pages
private DateTime SelectedDate; private DateTime SelectedDate;
private List<OrderDto> SelectedDayOrders { get; set; } = null!; private List<OrderDto> SelectedDayOrders { get; set; } = null!;
private OrderDto? SelectedOrder { get; set; } private OrderDto? SelectedOrder { get; set; }
private OrderItemDto? SelectedOrderItem { get; set; } //private OrderItemDto? SelectedOrderItem { get; set; }
private List<MeasuringDateSelectorModel> _measuringDates = null!; private List<MeasuringDateSelectorModel> _measuringDates = null!;
@ -68,15 +68,29 @@ namespace FruitBankHybrid.Shared.Pages
{ {
if (!LoggedInModel.IsLoggedIn) return; if (!LoggedInModel.IsLoggedIn) return;
if (messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged && if (messageTag != SignalRTags.SendOrderItemDeleted && messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged &&
messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return; messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return;
_logger.DebugConditional($"SignalRClientOnMessageReceived received. {jsonMessage}");
_logger.Detail($"SignalRClientOnMessageReceived received. {jsonMessage}");
OrderDto? orderDto; OrderDto? orderDto;
OrderItem? orderItem;
OrderItemDto? orderItemDto;
switch (messageTag) switch (messageTag)
{ {
case SignalRTags.SendOrderItemDeleted:
orderItem = jsonMessage?.JsonTo<OrderItem>();
if (orderItem == null) break;
lock (_lock)
{
orderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItem.Id));
orderDto?.OrderItemDtos.RemoveAll(oi => oi.Id == orderItem.Id);
}
await InvokeAsync(StateHasChanged);
return;
case SignalRTags.SendOrderChanged: case SignalRTags.SendOrderChanged:
orderDto = jsonMessage?.JsonTo<OrderDto>(); orderDto = jsonMessage?.JsonTo<OrderDto>();
if (orderDto == null) break; if (orderDto == null) break;
@ -91,17 +105,27 @@ namespace FruitBankHybrid.Shared.Pages
if (SelectedDate != orderDto.DateOfReceipt.Value.Date) return; if (SelectedDate != orderDto.DateOfReceipt.Value.Date) return;
var selectedOrderId = SelectedOrder?.Id; var selectedOrderId = SelectedOrder?.Id;
SelectedDayOrders.UpdateCollection(orderDto, false); SelectedDayOrders.UpdateCollection(orderDto, false);
if (selectedOrderId.GetValueOrDefault(-1) == orderDto.Id) SelectedOrder = orderDto; if (selectedOrderId.GetValueOrDefault(-1) == orderDto.Id) SelectedOrder = orderDto;
} }
await InvokeAsync(StateHasChanged); await InvokeAsync(StateHasChanged);
return; return;
case SignalRTags.SendOrderItemChanged: case SignalRTags.SendOrderItemChanged:
var orderItemDto = jsonMessage?.JsonTo<OrderItemDto>(); orderItemDto = jsonMessage?.JsonTo<OrderItemDto>();
if (orderItemDto == null) break; if (orderItemDto == null) break;
lock (_lock)
{
var localOrderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItemDto.Id));
var localOrderItemDto = localOrderDto?.OrderItemDtos.First(x => x.Id == orderItemDto.Id)!;
localOrderItemDto.Quantity = orderItemDto.Quantity;
localOrderItemDto.GenericAttributes.UpdateBaseEntityCollection(orderItemDto.GenericAttributes, false);
}
await InvokeAsync(StateHasChanged);
return; return;
case SignalRTags.SendOrderItemPalletChanged: case SignalRTags.SendOrderItemPalletChanged:
var orderItemPallet = jsonMessage?.JsonTo<OrderItemPallet>(); var orderItemPallet = jsonMessage?.JsonTo<OrderItemPallet>();
@ -110,13 +134,14 @@ namespace FruitBankHybrid.Shared.Pages
lock (_lock) lock (_lock)
{ {
var orderItemDtos = SelectedDayOrders.FirstOrDefault(x => x.OrderItemDtos.Any(oi => oi.Id == orderItemPallet.OrderItemId))?.OrderItemDtos; var orderItemDtos = SelectedDayOrders.FirstOrDefault(x => x.OrderItemDtos.Any(oi => oi.Id == orderItemPallet.OrderItemId))?.OrderItemDtos;
var orderItem = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId);
if (orderItem == null) return;
var orderItemPalletsCount = orderItem.OrderItemPallets.Count; orderItemDto = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId);
if (orderItemDto == null) return;
if (orderItem.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItem.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet); var orderItemPalletsCount = orderItemDto.OrderItemPallets.Count;
else orderItem.OrderItemPallets.UpdateCollection(orderItemPallet, false);
if (orderItemDto.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItemDto.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet);
else orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false);
} }
await InvokeAsync(StateHasChanged); await InvokeAsync(StateHasChanged);
@ -125,6 +150,7 @@ namespace FruitBankHybrid.Shared.Pages
var productDto = jsonMessage?.JsonTo<ProductDto>(); var productDto = jsonMessage?.JsonTo<ProductDto>();
if (productDto == null) break; if (productDto == null) break;
await InvokeAsync(StateHasChanged);
return; return;
} }

View File

@ -1,20 +1,19 @@
using DevExpress.Blazor; using AyCode.Core.Loggers;
using DevExpress.Blazor;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Services; using FruitBank.Common.Services;
using FruitBankHybrid.Shared.Models; using FruitBankHybrid.Shared.Models;
using FruitBankHybrid.Shared.Services.Loggers;
using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Dtos;
using Mango.Nop.Core.Loggers;
namespace FruitBankHybrid.Shared.Services; namespace FruitBankHybrid.Shared.Services;
public class MeasurementService : MeasurementServiceBase, IMeasurementService public class MeasurementService(IEnumerable<IAcLogWriterClientBase> logWriters) :
MeasurementServiceBase<LoggerClient>(new LoggerClient<MeasurementService>(logWriters.ToArray())), IMeasurementService
{ {
public MeasurementService()
{
}
public static bool DaysEqual(DateTime date1, DateTime date2) public static bool DaysEqual(DateTime date1, DateTime date2)
=> (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear); => (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);