using AyCode.Core.Extensions; using AyCode.Core.Loggers; using DevExpress.Blazor; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; using FruitBank.Common.Models; using FruitBank.Common.SignalRs; using FruitBankHybrid.Shared.Extensions; using FruitBankHybrid.Shared.Models; using FruitBankHybrid.Shared.Services; using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using Mango.Nop.Core.Extensions; using Microsoft.AspNetCore.Components; using Nop.Core.Domain.Orders; namespace FruitBankHybrid.Shared.Pages { public partial class MeasuringOut : ComponentBase { private readonly Lock _lock = new Lock(); [Inject] public required IEnumerable LogWriters { get; set; } [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } [Inject] public required NavigationManager NavManager{ get; set; } [Inject] private IDialogService DialogService { get; set; } = null!; [Inject] public required LoggedInModel LoggedInModel { get; set; } private LoggerClient _logger = null!; private string _errorText; private int _lastDaysCount = 1; public bool HasMeasuringAccess; public bool LoadingPanelVisible { get; set; } = true; public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false; private DateTime SelectedDate; private List SelectedDayOrders { get; set; } = null!; private OrderDto? SelectedOrder { get; set; } //private OrderItemDto? SelectedOrderItem { get; set; } private List _measuringDates = null!; protected override async Task OnInitializedAsync() { if (!LoggedInModel.IsLoggedIn) NavManager.NavigateTo("/Login"); LoadingPanelVisible = true; _logger = new LoggerClient(LogWriters.ToArray()); _logger.Info("OnInitializedAsync"); FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived; await RefreshOrdersFromDb(DateTime.Now, _lastDaysCount); await base.OnInitializedAsync(); } private async Task SignalRClientOnMessageReceived(int messageTag, string? jsonMessage) { if (!LoggedInModel.IsLoggedIn) return; if (messageTag != SignalRTags.SendOrderItemDeleted && messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged && messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return; _logger.DebugConditional($"SignalRClientOnMessageReceived received. {jsonMessage}"); OrderDto? orderDto; OrderItem? orderItem; OrderItemDto? orderItemDto; switch (messageTag) { case SignalRTags.SendOrderItemDeleted: orderItem = jsonMessage?.JsonTo(); 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: orderDto = jsonMessage?.JsonTo(); if (orderDto == null) break; if (orderDto.DateOfReceipt == null) return; lock (_lock) { if (_measuringDates.All(x => x.DateTime.Date != orderDto.DateOfReceipt.Value.Date)) _measuringDates.Add(new MeasuringDateSelectorModel(orderDto.Id, orderDto.DateOfReceipt.Value.Date, orderDto.IsMeasured)); if (SelectedDate != orderDto.DateOfReceipt.Value.Date) return; var selectedOrderId = SelectedOrder?.Id; SelectedDayOrders.UpdateCollection(orderDto, false); if (selectedOrderId.GetValueOrDefault(-1) == orderDto.Id) SelectedOrder = orderDto; } await InvokeAsync(StateHasChanged); return; case SignalRTags.SendOrderItemChanged: orderItemDto = jsonMessage?.JsonTo(); if (orderItemDto == null) break; lock (_lock) { var localOrderDto = SelectedDayOrders.FirstOrDefault(o => o.OrderItemDtos.Any(oi => oi.Id == orderItemDto.Id)); var localOrderItemDto = localOrderDto?.OrderItemDtos.FirstOrDefault(x => x.Id == orderItemDto.Id); if (localOrderItemDto == null) return; localOrderItemDto.Quantity = orderItemDto.Quantity; localOrderItemDto.GenericAttributes.UpdateBaseEntityCollection(orderItemDto.GenericAttributes, false); } await InvokeAsync(StateHasChanged); return; case SignalRTags.SendOrderItemPalletChanged: var orderItemPallet = jsonMessage?.JsonTo(); if (orderItemPallet == null) break; lock (_lock) { var orderItemDtos = SelectedDayOrders.FirstOrDefault(x => x.OrderItemDtos.Any(oi => oi.Id == orderItemPallet.OrderItemId))?.OrderItemDtos; orderItemDto = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId); if (orderItemDto == null) return; var orderItemPalletsCount = orderItemDto.OrderItemPallets.Count; if (orderItemDto.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItemDto.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet); else orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false); } await InvokeAsync(StateHasChanged); return; case SignalRTags.SendProductChanged: var productDto = jsonMessage?.JsonTo(); if (productDto == null) break; await InvokeAsync(StateHasChanged); return; } _logger.Error($"SignalRClientOnMessageReceived message == null"); } private async Task RefreshOrdersFromDb(DateTime dateTime, int lastDaysCount) { LoadingPanelVisible = true; _lastDaysCount = lastDaysCount; SelectedDate = dateTime; var orders = (await FruitBankSignalRClient.GetPendingOrderDtosForMeasuring(_lastDaysCount) ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList(); lock (_lock) { _measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceiptOrCreated, order.IsMeasured)).ToList(); SelectedDayOrders = orders.Where(order => MeasurementService.DaysEqual(order.DateOfReceiptOrCreated, dateTime)).OrderBy(x => x.DateOfReceipt).ToList(); foreach (var orderDto in SelectedDayOrders) PrepareOrderDto(orderDto); SelectedOrder = LoggedInModel.IsRevisor ? SelectedDayOrders.FirstOrDefault(o => o is { IsComplete: false, IsMeasured: true }) : SelectedDayOrders.FirstOrDefault(o => o.MeasurementOwnerId == 0 || (o.MeasurementOwnerId == (LoggedInModel.CustomerDto?.Id ?? 0) && !o.IsMeasured)); SelectedOrder ??= SelectedDayOrders.FirstOrDefault(); } LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J. } private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime, _lastDaysCount); private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args) => MeasurementService.OnCustomDisabledDate(args, _measuringDates); private string GetMeasuringDateCssClassNames(DateTime date) => MeasurementService.GetShippingDateCssClassNames(date, _measuringDates); private string GetOrderItemPalletsCssClassNames(string fieldName, OrderItemPallet orderItemPallet) => MeasurementService.GetCustomItemPalletsCssClassNames(fieldName, orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable); private bool IsOrderItemPalletMeasuredAndValid(OrderItemPallet orderItemPallet) => MeasurementService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable); private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs eventArgs) { //var orderDtosFromDb = await FruitBankSignalRClient.GetPendingOrderDtos(); //if (orderDtosFromDb != null) RefreshOrderGenericAttributes(orderDtosFromDb, SelectedDayOrders); //else MessageBox.ShowMessageBox("Hiba", "Az adatok letöltése sikertelen!", MessageBoxRenderStyle.Danger); var orderDto = eventArgs.DataItem; if (orderDto != null && !LoadingPanelVisible) { //LoadingPanelVisible = true; var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(orderDto.Id); if (orderFromDb != null) { orderDto.OrderStatus = orderFromDb.OrderStatus; orderDto.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false); //if (LoggedInModel.IsRevisor) //{ // orderDto.OrderItemDtos.UpdateCollection(orderFromDb.OrderItemDtos, false); // var orderItemPalletsByOrderId = orderFromDb.OrderItemDtos.Where(o => o.OrderItemPallets.Count > 0).ToDictionary(k => k.Id, v => v.OrderItemPallets); // foreach (var orderItemDto in orderDto.OrderItemDtos) // { // if (orderItemPalletsByOrderId.TryGetValue(orderDto.Id, out var orderItemPallets)) // orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallets, false); // } //} } } LoadingPanelVisible = false; HasMeasuringAccess = orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false; StateHasChanged(); if (!HasMeasuringAccess && orderDto != null) await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info); } private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto) { StateHasChanged(); return Task.CompletedTask; } private Task OnPalletItemAuditedClick(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) { StateHasChanged(); return Task.CompletedTask; } private async Task OnOrderItemPalletSaved(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) { if (orderItemPallet != null) { selectedOrderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false); //MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(SelectedShippingItem); } else await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger); StateHasChanged(); } private Task AddNewPalletItemClick(OrderItemDto selectedOrderItemDto) { if (selectedOrderItemDto.OrderItemPallets[^1].Id > 0) { selectedOrderItemDto.OrderItemPallets.Add(MeasurementService.CreateNewOrderItemPallet(selectedOrderItemDto, LoggedInModel.CustomerDto)); StateHasChanged(); } return Task.CompletedTask; } private Task LastPalletItemDeleteClick(OrderItemDto selectedOrderItemDto) { if (selectedOrderItemDto.OrderItemPallets.Count <= 1) return Task.CompletedTask; var lastPalletItem = selectedOrderItemDto.OrderItemPallets[^1]; if (lastPalletItem.Id > 0) return Task.CompletedTask; selectedOrderItemDto.OrderItemPallets.Remove(lastPalletItem); StateHasChanged(); return Task.CompletedTask; } private async Task OnOrdersRefreshClick() { await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now, _lastDaysCount); StateHasChanged(); } private async Task OnStartMeasuringClick() { if (SelectedOrder == null || !LoggedInModel.IsLoggedIn || SelectedOrder.MeasurementOwnerId != 0) return; var confirmed = !LoggedInModel.IsRevisor || await DialogService.ShowConfirmBoxAsync("Megerősítés", "Ha elindítja a mérést, senki más nem tudja befelyezni! Biztoan folytatja?", MessageBoxRenderStyle.Info); if (!confirmed) return; var responseOrderDto = await FruitBankSignalRClient.StartMeasuring(SelectedOrder.Id, LoggedInModel.CustomerDto!.Id); if (responseOrderDto != null) { PrepareOrderDto(responseOrderDto); //SelectedOrder.GenericAttributes.UpdateBaseEntityCollection(responseOrderDto.GenericAttributes, false); SelectedDayOrders.UpdateCollection(responseOrderDto, false); SelectedOrder = responseOrderDto; } else await DialogService.ShowMessageBoxAsync("Hiba", "Nem sikerült a mérést elindítani!", MessageBoxRenderStyle.Danger); StateHasChanged(); } private async Task OnMeasuringAuditorClick() { if (SelectedOrder != null && LoggedInModel.IsRevisor && SelectedOrder.IsMeasured && SelectedOrder.OrderStatus != OrderStatus.Complete) { if (await DialogService.ShowConfirmBoxAsync("Megerősítés", "Biztoan jóváhagyja a rendelést? Jóváhagyás után a mérések nem módosíthatóak!", MessageBoxRenderStyle.Info)) { var responseOrderDto = await FruitBankSignalRClient.SetOrderStatusToComplete(SelectedOrder.Id, LoggedInModel.CustomerDto!.Id); if (responseOrderDto != null) { PrepareOrderDto(responseOrderDto); SelectedDayOrders.UpdateCollection(responseOrderDto, false); SelectedOrder = responseOrderDto; //await DialogService.ShowMessageBoxAsync("Információ", "Adatok mentése sikeres volt!", MessageBoxRenderStyle.Info); } else await DialogService.ShowMessageBoxAsync("Hiba", "Rendelés jóváhagyása sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger); StateHasChanged(); } } } private void PrepareOrderDto(OrderDto orderDto) { foreach (var orderItemDto in orderDto.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0)) { orderItemDto.OrderItemPallets.Add(MeasurementService.CreateNewOrderItemPallet(orderItemDto, LoggedInModel.CustomerDto)); } } private static void RefreshOrderGenericAttributes(List srcOrderDtos, List destOrderDtos) { var orderAttributesByOrderId = srcOrderDtos.Where(o => o.GenericAttributes.Count > 0).ToDictionary(k => k.Id, v => v.GenericAttributes); foreach (var orderDto in destOrderDtos) { if (orderAttributesByOrderId.TryGetValue(orderDto.Id, out var genericAttributes)) orderDto.GenericAttributes.UpdateBaseEntityCollection(genericAttributes, false); } } } }