347 lines
16 KiB
C#
347 lines
16 KiB
C#
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<IAcLogWriterClientBase> 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<OrderDto> SelectedDayOrders { get; set; } = null!;
|
|
private OrderDto? SelectedOrder { get; set; }
|
|
//private OrderItemDto? SelectedOrderItem { get; set; }
|
|
|
|
private List<MeasuringDateSelectorModel> _measuringDates = null!;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
if (!LoggedInModel.IsLoggedIn) NavManager.NavigateTo("/Login");
|
|
|
|
LoadingPanelVisible = true;
|
|
_logger = new LoggerClient<MeasuringOut>(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<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:
|
|
orderDto = jsonMessage?.JsonTo<OrderDto>();
|
|
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<OrderItemDto>();
|
|
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;
|
|
case SignalRTags.SendOrderItemPalletChanged:
|
|
var orderItemPallet = jsonMessage?.JsonTo<OrderItemPallet>();
|
|
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<ProductDto>();
|
|
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<OrderDto> 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<OrderDto> srcOrderDtos, List<OrderDto> 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);
|
|
}
|
|
}
|
|
}
|
|
}
|