SignalR improvements; etc...
This commit is contained in:
parent
29a15fe8ac
commit
d53c44d2db
|
|
@ -1,6 +1,7 @@
|
|||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.Server.SignalRs;
|
||||
using AyCode.Services.SignalRs;
|
||||
using FruitBank.Common.Dtos;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
|
||||
namespace FruitBank.Common.Server.Services.SignalRs;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.Server.SignalRs;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Models.SignalRs;
|
||||
using FruitBank.Common.SignalRs;
|
||||
using Mango.Nop.Core.Loggers;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
|
||||
namespace FruitBank.Common.Server.Services.SignalRs;
|
||||
|
||||
public class SignalRSendToClientService(IHubContext<DevAdminSignalRHub, IAcSignalRHubItemServer> signalRHub, IEnumerable<IAcLogWriterBase> logWriters)
|
||||
: AcSignalRSendToClientService<DevAdminSignalRHub, SignalRTags, Logger>(signalRHub, new Logger<SignalRSendToClientService>(logWriters.ToArray()))
|
||||
{
|
||||
public Task SendMeasuringNotification(string message) => SendMeasuringNotification(message, null);
|
||||
public Task SendMeasuringNotification(OrderDto orderDto) => SendMeasuringNotification(null, orderDto);
|
||||
|
||||
public Task SendMeasuringNotification(string? message, OrderDto? orderDto)
|
||||
{
|
||||
var notificationMessage = new SignalRMessageToClientWithText<OrderDto>(message, orderDto);
|
||||
return base.SendMessageToAllClients(SignalRTags.NotificationReceived, notificationMessage);
|
||||
}
|
||||
|
||||
public Task SendProductChanged(ProductDto productDto) => base.SendMessageToAllClients(SignalRTags.SendProductChanged, productDto);
|
||||
|
||||
public Task SendOrderChanged(OrderDto orderDto) => base.SendMessageToAllClients(SignalRTags.SendOrderChanged, orderDto);
|
||||
public Task SendOrderItemChanged(OrderItemDto orderItemDto) => base.SendMessageToAllClients(SignalRTags.SendOrderItemChanged, orderItemDto);
|
||||
public Task SendOrderItemPalletChanged(OrderItemPallet orderItemPallet) => base.SendMessageToAllClients(SignalRTags.SendOrderItemPalletChanged, orderItemPallet);
|
||||
|
||||
public Task SendShippingChanged(Shipping shipping) => base.SendMessageToAllClients(SignalRTags.SendShippingChanged, shipping);
|
||||
public Task SendShippingItemChanged(ShippingItem shippingItem) => base.SendMessageToAllClients(SignalRTags.SendShippingItemChanged, shippingItem);
|
||||
public Task SendShippingDocumentChanged(ShippingDocument shippingDocument) => base.SendMessageToAllClients(SignalRTags.SendShippingDocumentChanged, shippingDocument);
|
||||
public Task SendShippingItemPalletChanged(ShippingItemPallet shippingItemPallet) => base.SendMessageToAllClients(SignalRTags.SendShippingItemPalletChanged, shippingItemPallet);
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
using AyCode.Core.Extensions;
|
||||
using AyCode.Utils.Extensions;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Enums;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using FruitBank.Common.Models;
|
||||
using LinqToDB.Mapping;
|
||||
|
|
@ -71,6 +72,20 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
|
|||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public int MeasurementOwnerId => GenericAttributes.GetValueOrDefault(nameof(IOrderDto.MeasurementOwnerId), 0);
|
||||
|
||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public bool IsAllOrderItemAudited => OrderItemDtos.Count > 0 && OrderItemDtos.All(oi => oi.IsAudited);
|
||||
|
||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public MeasuringStatus MeasuringStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsComplete) return MeasuringStatus.Audited;
|
||||
if (IsMeasured) return MeasuringStatus.Finnished;
|
||||
|
||||
return OrderItemDtos.Any(oip => oip.MeasuringStatus >= MeasuringStatus.Started) ? MeasuringStatus.Started : MeasuringStatus.NotStarted;
|
||||
}
|
||||
}
|
||||
//if (GenericAttributes.TryGetValue<DateTime>(nameof(IOrderDto.DateOfReceipt), out var value)) return value;
|
||||
//var dateOfReceipt = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IOrderDto.DateOfReceipt))?.Value ?? string.Empty;
|
||||
//return dateOfReceipt.IsNullOrWhiteSpace() ? null : CommonHelper.To<DateTime>(dateOfReceipt);
|
||||
|
|
@ -81,10 +96,11 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
|
|||
public OrderDto(Order order) : base(order)
|
||||
{ }
|
||||
|
||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public bool IsComplete => OrderStatus == OrderStatus.Complete;
|
||||
|
||||
public bool HasMeasuringAccess(int? customerId, bool isRevisorUser = false)
|
||||
=> isRevisorUser || (customerId.HasValue && OrderStatus != OrderStatus.Complete && (customerId.Value == MeasurementOwnerId || MeasurementOwnerId == 0));
|
||||
=> isRevisorUser || (customerId.HasValue && !IsComplete && (customerId.Value == MeasurementOwnerId || MeasurementOwnerId == 0));
|
||||
|
||||
public bool IsMeasuredAndValid() => Id > 0 && OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsMeasured);
|
||||
public bool IsValidMeasuringValues() => OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsValidMeasuringValues());
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
using System.Globalization;
|
||||
using System.Linq.Expressions;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Enums;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using LinqToDB.Mapping;
|
||||
using Mango.Nop.Core.Dtos;
|
||||
|
|
@ -8,6 +7,9 @@ using Newtonsoft.Json;
|
|||
using Nop.Core;
|
||||
using Nop.Core.Domain.Common;
|
||||
using Nop.Core.Domain.Orders;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
namespace FruitBank.Common.Dtos;
|
||||
|
||||
|
|
@ -82,6 +84,21 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
|
|||
}
|
||||
}
|
||||
|
||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public bool IsAudited => OrderItemPallets.Count > 0 && OrderItemPallets.All(oip => oip.IsAudited);
|
||||
|
||||
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
|
||||
public MeasuringStatus MeasuringStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsAudited) return MeasuringStatus.Audited;
|
||||
if (IsMeasured) return MeasuringStatus.Finnished;
|
||||
|
||||
return OrderItemPallets.Any(oip => oip.MeasuringStatus >= MeasuringStatus.Started) ? MeasuringStatus.Started : MeasuringStatus.NotStarted;
|
||||
}
|
||||
}
|
||||
|
||||
public OrderItemDto() : base()
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
using FruitBank.Common.Interfaces;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Enums;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using LinqToDB;
|
||||
using LinqToDB.Mapping;
|
||||
using Mango.Nop.Core.Entities;
|
||||
|
|
@ -57,6 +59,8 @@ public abstract class MeasuringItemPalletBase : MgEntityBase, IMeasuringItemPall
|
|||
public DateTime Created { get; set; }
|
||||
public DateTime Modified { get; set; }
|
||||
|
||||
public virtual MeasuringStatus MeasuringStatus => IsMeasured ? MeasuringStatus.Finnished : Id > 0 ? MeasuringStatus.Started : MeasuringStatus.NotStarted;
|
||||
|
||||
public virtual double CalculateNetWeight() => double.Round(GrossWeight - PalletWeight - (TareWeight * TrayQuantity), 1);
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Enums;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using LinqToDB.Mapping;
|
||||
using Nop.Core.Domain.Orders;
|
||||
|
|
@ -15,9 +16,13 @@ public class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet
|
|||
set => ForeignItemId = value;
|
||||
}
|
||||
|
||||
public int RevisorId { get; set; }
|
||||
public bool IsAudited => RevisorId > 0;
|
||||
|
||||
[Association(ThisKey = nameof(OrderItemId), OtherKey = nameof(OrderItemDto.Id), CanBeNull = true)]
|
||||
public OrderItemDto? OrderItemDto { get; set; }
|
||||
|
||||
public override MeasuringStatus MeasuringStatus => IsAudited ? MeasuringStatus.Audited : base.MeasuringStatus;
|
||||
public override double CalculateNetWeight() => base.CalculateNetWeight();
|
||||
|
||||
public override bool IsValidSafeMeasuringValues()
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ using System.ComponentModel.DataAnnotations;
|
|||
using Nop.Core.Domain.Catalog;
|
||||
using DataType = LinqToDB.DataType;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Enums;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace FruitBank.Common.Entities;
|
||||
|
|
@ -76,6 +77,16 @@ public class ShippingItem : MgEntityBase, IShippingItem
|
|||
[SkipValuesOnUpdate] public DateTime Created { get; set; }
|
||||
public DateTime Modified { get; set; }
|
||||
|
||||
public MeasuringStatus MeasuringStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsMeasured) return MeasuringStatus.Finnished;
|
||||
|
||||
return ShippingItemPallets?.Any(oip => oip.MeasuringStatus == MeasuringStatus.Started) ?? false ? MeasuringStatus.Started : MeasuringStatus.NotStarted;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsValidMeasuringValues()
|
||||
{
|
||||
return /*ProductId > 0 && */MeasuringCount > 0 && MeasuredQuantity > 0 && (!IsMeasurable || (MeasuredNetWeight > 0 && MeasuredGrossWeight > 0));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
namespace FruitBank.Common.Enums;
|
||||
|
||||
public enum MeasuringStatus
|
||||
{
|
||||
NotStarted = 0,
|
||||
Started = 10,
|
||||
Finnished = 20,
|
||||
Audited = 30
|
||||
}
|
||||
|
|
@ -20,6 +20,9 @@ public static class FruitBankConstClient
|
|||
public static string DefaultHubName = "fbHub";
|
||||
public static string LoggerHubName = "loggerHub";
|
||||
|
||||
public static long SignalRKeepAliveIntervalSecond = 60;
|
||||
public static long SignarlRTimeoutIntervalSecond = 120;
|
||||
|
||||
public const string PalletDbTableName = "fbPallet";
|
||||
public const string FilesDbTableName = "fbFiles";
|
||||
public const string PartnerDbTableName = "fbPartner";
|
||||
|
|
|
|||
|
|
@ -11,8 +11,27 @@ public interface ICustomOrderSignalREndpointCommon
|
|||
Task<List<OrderDto>?> GetPendingOrderDtosForMeasuring();
|
||||
Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds);
|
||||
Task<OrderDto?> GetOrderDtoById(int orderId);
|
||||
|
||||
Task<List<OrderDto>?> GetAllOrderDtoByProductId(int productId);
|
||||
Task<OrderItemDto?> GetOrderItemDtoById(int orderItemId);
|
||||
|
||||
Task<List<OrderItemDto>?> GetAllOrderItemDtos();
|
||||
|
||||
Task<List<OrderItemDto>?> GetAllOrderItemDtoByOrderId(int orderId);
|
||||
|
||||
Task<List<OrderItemDto>?> GetAllOrderItemDtoByProductId(int productId);
|
||||
|
||||
Task<List<OrderItemPallet>?> GetAllOrderItemPallets();
|
||||
Task<OrderItemPallet?> GetOrderItemPalletById(int orderItemPalletId);
|
||||
Task<List<OrderItemPallet>?> GetAllOrderItemPalletByOrderItemId(int orderItemId);
|
||||
|
||||
Task<List<OrderItemPallet>?> GetAllOrderItemPalletByOrderId(int orderId);
|
||||
|
||||
Task<List<OrderItemPallet>?> GetAllOrderItemPalletByProductId(int productId);
|
||||
|
||||
Task<OrderItemPallet?> AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet);
|
||||
|
||||
Task<OrderDto?> StartMeasuring(int orderId, int userId);
|
||||
Task<OrderDto?> SetOrderStatusToComplete(int orderId, int revisorId);
|
||||
|
||||
}
|
||||
|
|
@ -3,4 +3,5 @@
|
|||
public interface IMeasurable
|
||||
{
|
||||
bool IsMeasurable { get; set; }
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
using FruitBank.Common.Enums;
|
||||
|
||||
namespace FruitBank.Common.Interfaces;
|
||||
|
||||
public interface IMeasurableStatus
|
||||
{
|
||||
MeasuringStatus MeasuringStatus { get; }
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
namespace FruitBank.Common.Interfaces;
|
||||
|
||||
public interface IMeasurementServiceBase
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -2,10 +2,11 @@
|
|||
using AyCode.Interfaces.Entities;
|
||||
using AyCode.Interfaces.TimeStampInfo;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Enums;
|
||||
|
||||
namespace FruitBank.Common.Interfaces;
|
||||
|
||||
public interface IMeasuringItemPalletBase : IEntityInt, IMeasuringValues, IMeasured, ITimeStampInfo, ICustomForeignKeyInt
|
||||
public interface IMeasuringItemPalletBase : IEntityInt, IMeasuringValues, IMeasured, ITimeStampInfo, ICustomForeignKeyInt, IMeasurableStatus
|
||||
{
|
||||
double TareWeight { get; set; }
|
||||
double PalletWeight { get; set; }
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Enums;
|
||||
using Mango.Nop.Core.Dtos;
|
||||
using Mango.Nop.Core.Interfaces;
|
||||
|
||||
namespace FruitBank.Common.Interfaces;
|
||||
|
||||
public interface IOrderDto : IMgOrderDto<OrderItemDto, ProductDto>, IMeasured, IMeasurable
|
||||
public interface IOrderDto : IMgOrderDto<OrderItemDto, ProductDto>, IMeasured, IMeasurable, IMeasurableStatus
|
||||
{
|
||||
DateTime? DateOfReceipt { get; }
|
||||
DateTime DateOfReceiptOrCreated { get; }
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Enums;
|
||||
using Mango.Nop.Core.Dtos;
|
||||
using Mango.Nop.Core.Interfaces;
|
||||
using Nop.Core.Domain.Catalog;
|
||||
|
||||
namespace FruitBank.Common.Interfaces;
|
||||
|
||||
public interface IOrderItemDto : IMgOrderItemDto<ProductDto>, IMeasuringValues, IMeasured, IMeasurable
|
||||
public interface IOrderItemDto : IMgOrderItemDto<ProductDto>, IMeasuringValues, IMeasured, IMeasurable, IMeasurableStatus
|
||||
{
|
||||
OrderDto OrderDto { get; set; }
|
||||
List<OrderItemPallet> OrderItemPallets { get; set; }
|
||||
|
|
|
|||
|
|
@ -7,5 +7,9 @@ namespace FruitBank.Common.Interfaces;
|
|||
public interface IOrderItemPallet : IMeasuringItemPalletBase
|
||||
{
|
||||
int OrderItemId { get; set; }
|
||||
bool IsAudited { get; }
|
||||
int RevisorId { get; set; }
|
||||
|
||||
public OrderItemDto? OrderItemDto { get; set; }
|
||||
|
||||
}
|
||||
|
|
@ -9,6 +9,7 @@ public class LoggedInModel
|
|||
{
|
||||
public bool IsLoggedIn => CustomerDto != null;
|
||||
public bool IsRevisor => IsLoggedIn && CustomerRoles.Any(x => x.SystemName.ToLowerInvariant() == "measuringrevisor");
|
||||
public bool IsAdministrator => IsLoggedIn && CustomerRoles.Any(x => x.SystemName.ToLowerInvariant() == "administrators");
|
||||
|
||||
public CustomerDto? CustomerDto { get; private set; }
|
||||
public List<CustomerRole> CustomerRoles { get; private set; } = [];
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
using FruitBank.Common.Dtos;
|
||||
|
||||
namespace FruitBank.Common.Models.SignalRs;
|
||||
|
||||
public class SignalRMessageToClientWithText<T>(string? message, T? content)
|
||||
{
|
||||
public string? Message { get; set; } = message;
|
||||
public T? Content { get; set; } = content;
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
using FruitBank.Common.Interfaces;
|
||||
|
||||
namespace FruitBank.Common.Services;
|
||||
|
||||
public class MeasurementServiceBase : IMeasurementServiceBase
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -6,6 +6,8 @@ public class SignalRTags : AcSignalRTags
|
|||
{
|
||||
public const int GetSiteViewModelByUserId = int.MaxValue;
|
||||
|
||||
public const int NotificationReceived = 5;
|
||||
|
||||
public const int GetMeasuringModels = 10;
|
||||
|
||||
public const int GetPartners = 20;
|
||||
|
|
@ -39,7 +41,6 @@ public class SignalRTags : AcSignalRTags
|
|||
public const int GetAllMeasuringProductDtos = 82;
|
||||
public const int GetMeasuringProductDtoById = 83;
|
||||
|
||||
|
||||
public const int AddShippingItemPallet = 95;
|
||||
public const int UpdateShippingItemPallet = 96;
|
||||
public const int AddOrUpdateMeasuredShippingItemPallet = 97;
|
||||
|
|
@ -47,19 +48,43 @@ public class SignalRTags : AcSignalRTags
|
|||
|
||||
public const int GetAllOrderDtos = 111;
|
||||
public const int GetOrderDtoById = 112;
|
||||
public const int GetAllOrderDtoByIds = 114;
|
||||
public const int GetPendingOrderDtos = 115;
|
||||
public const int GetAllOrderDtoByIds = 113;
|
||||
public const int GetPendingOrderDtos = 114;
|
||||
public const int GetAllOrderDtoByProductId = 115;
|
||||
public const int GetPendingOrderDtosForMeasuring = 116;
|
||||
public const int StartMeasuring = 117;
|
||||
public const int SetOrderStatusToComplete = 118;
|
||||
|
||||
public const int AddOrderItemPallet = 131;
|
||||
public const int UpdateOrderItemPallet = 132;
|
||||
public const int AddOrUpdateMeasuredOrderItemPallet = 133;
|
||||
public const int AddOrUpdateMeasuredOrderItemPallets = 134;
|
||||
public const int GetOrderItemDtoById = 120;
|
||||
public const int GetAllOrderItemDtos = 121;
|
||||
public const int GetAllOrderItemDtoByOrderId = 122;
|
||||
public const int GetAllOrderItemDtoByProductId = 123;
|
||||
|
||||
public const int GetAllOrderItemPallets = 130;
|
||||
public const int GetOrderItemPalletById = 131;
|
||||
public const int GetAllOrderItemPalletByOrderItemId = 132;
|
||||
public const int GetAllOrderItemPalletByProductId = 133;
|
||||
public const int GetAllOrderItemPalletByOrderId = 134;
|
||||
public const int AddOrderItemPallet = 135;
|
||||
public const int UpdateOrderItemPallet = 136;
|
||||
public const int AddOrUpdateMeasuredOrderItemPallet = 137;
|
||||
public const int AddOrUpdateMeasuredOrderItemPallets = 138;
|
||||
|
||||
public const int AuthenticateUser = 195;
|
||||
public const int RefreshToken = 200;
|
||||
|
||||
#region SendToClient
|
||||
public const int SendOrderChanged = 500;
|
||||
public const int SendOrderItemChanged = 501;
|
||||
public const int SendOrderItemPalletChanged = 502;
|
||||
|
||||
public const int SendShippingChanged = 520;
|
||||
public const int SendShippingItemChanged = 521;
|
||||
public const int SendShippingDocumentChanged = 522;
|
||||
public const int SendShippingItemPalletChanged = 523;
|
||||
|
||||
public const int SendProductChanged = 540;
|
||||
#endregion SendToClient
|
||||
|
||||
public const int GetAllLogItemsByFilterText = 1000;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ public sealed class OrderClientTests
|
|||
[TestMethod]
|
||||
public async Task GetPendingOrderDtos()
|
||||
{
|
||||
var pendingOrderDtos = await _signalRClient.GetPendingOrderDtosForMeasuring();
|
||||
var pendingOrderDtos = await _signalRClient.GetPendingOrderDtos();
|
||||
|
||||
Assert.IsNotNull(pendingOrderDtos);
|
||||
|
||||
|
|
@ -63,6 +63,17 @@ public sealed class OrderClientTests
|
|||
Assert.IsTrue(pendingOrderDtos.Count != 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetPendingOrderDtosForMeasuring()
|
||||
{
|
||||
var orderDtosForMeasuring = await _signalRClient.GetPendingOrderDtosForMeasuring();
|
||||
|
||||
Assert.IsNotNull(orderDtosForMeasuring);
|
||||
//Assert.IsTrue(orderDtosForMeasuring.Any(x=>x.Id ==51));
|
||||
Assert.IsTrue(orderDtosForMeasuring.All(o => o.OrderStatus == OrderStatus.Pending));
|
||||
Assert.IsTrue(orderDtosForMeasuring.Count != 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
[DataRow(new[] {1,2,4,7})]
|
||||
public async Task GetOrderDtoByIds(int[] orderIds)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,106 @@
|
|||
@using FruitBank.Common.Dtos
|
||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||
|
||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||
|
||||
<MgGridBase Data="OrderDtos" IsMasterGrid="IsMasterGrid"
|
||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||
AutoExpandAllGroupRows="false"
|
||||
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||
<Columns>
|
||||
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Descending" />
|
||||
<DxGridDataColumn FieldName="CustomerId" />
|
||||
<DxGridDataColumn FieldName="OrderTotal" />
|
||||
|
||||
<DxGridDataColumn FieldName="OrderStatus" />
|
||||
<DxGridDataColumn FieldName="IsMeasured" />
|
||||
<DxGridDataColumn FieldName="IsMeasurable" />
|
||||
|
||||
<DxGridDataColumn FieldName="RevisorId" />
|
||||
<DxGridDataColumn FieldName="MeasurementOwnerId" />
|
||||
<DxGridDataColumn FieldName="DateOfReceipt" />
|
||||
<DxGridDataColumn FieldName="CreatedOnUtc" />
|
||||
</Columns>
|
||||
<DetailRowTemplate>
|
||||
@if (IsMasterGrid)
|
||||
{
|
||||
var orderDto = ((OrderDto)context.DataItem);
|
||||
|
||||
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
|
||||
<DxTabPage Text="Rendelés tételek">
|
||||
<GridDetailOrderItemDto OrderItemDtos="((OrderDto)context.DataItem).OrderItemDtos" IsMasterGrid="false" />
|
||||
</DxTabPage>
|
||||
<DxTabPage Text="Mérések">
|
||||
@{
|
||||
var orderItemPalletDtos = orderDto?.OrderItemDtos.SelectMany(oi => oi.OrderItemPallets).ToList() ?? [];
|
||||
<GridDetailOrderItemPallets OrderItemPallets="orderItemPalletDtos" IsMasterGrid="false"/>
|
||||
}
|
||||
</DxTabPage>
|
||||
|
||||
</DxTabs>
|
||||
}
|
||||
</DetailRowTemplate>
|
||||
@* <ToolbarTemplate>
|
||||
<DxToolbar ItemRenderStyleMode="ToolbarRenderStyleMode.Plain">
|
||||
<Items>
|
||||
<DxToolbarItem BeginGroup="true" Alignment="ToolbarItemAlignment.Left">
|
||||
<Template Context="toolbar_item_context">
|
||||
<div class="d-flex flex-row align-items-center">
|
||||
<DxCheckBox @bind-Checked="AutoCollapseDetailRow">
|
||||
Auto Collapse Detail Rows
|
||||
</DxCheckBox>
|
||||
</div>
|
||||
</Template>
|
||||
</DxToolbarItem>
|
||||
</Items>
|
||||
</DxToolbar>
|
||||
</ToolbarTemplate> *@
|
||||
<GroupSummary>
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="Quantity"
|
||||
FooterColumnName="Quantity" />
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="NetWeight"
|
||||
FooterColumnName="NetWeight" />
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="PriceInclTax"
|
||||
FooterColumnName="PriceInclTax" />
|
||||
</GroupSummary>
|
||||
</MgGridBase>
|
||||
|
||||
@code {
|
||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||
//[Parameter] public OrderDto? OrderDto { get; set; }
|
||||
[Parameter] public List<OrderDto>? OrderDtos { get; set; }
|
||||
|
||||
private int _activeTabIndex;
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
// if (OrderDto != null)
|
||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
||||
}
|
||||
|
||||
protected async Task OnActiveTabChanged(int activeTabIndex)
|
||||
{
|
||||
_activeTabIndex = activeTabIndex;
|
||||
return;
|
||||
|
||||
// switch (_activeTabIndex)
|
||||
// {
|
||||
// case 0:
|
||||
// if(ProductDtos == null)
|
||||
// ProductDtos = (await FruitBankSignalRClient.GetProductDtos() ?? []); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
// break;
|
||||
// case 1:
|
||||
// if(OrderDtos == null)
|
||||
// OrderDtos = (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
// break;
|
||||
// case 2:
|
||||
// if (OrderItemDtos == null)
|
||||
// OrderItemDtos = (await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
@using FruitBank.Common.Dtos
|
||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||
|
||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||
|
||||
@* <div class="mb-2">
|
||||
Contact Phone: @OrderDto.Email
|
||||
</div> *@
|
||||
|
||||
<MgGridBase Data="OrderItemDtos" IsMasterGrid="IsMasterGrid"
|
||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||
AutoExpandAllGroupRows="false"
|
||||
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||
<Columns>
|
||||
<DxGridDataColumn FieldName="Id" />
|
||||
<DxGridDataColumn FieldName="OrderId" />
|
||||
<DxGridDataColumn FieldName="ProductId" />
|
||||
|
||||
<DxGridDataColumn FieldName="ProductName" Width="40%" />
|
||||
<DxGridDataColumn FieldName="PriceInclTax" DisplayFormat="c" />
|
||||
<DxGridDataColumn FieldName="UnitPriceInclTax" DisplayFormat="c" />
|
||||
|
||||
<DxGridDataColumn FieldName="Quantity" />
|
||||
<DxGridDataColumn FieldName="NetWeight" />
|
||||
|
||||
<DxGridDataColumn FieldName="IsMeasurable" />
|
||||
<DxGridDataColumn FieldName="IsMeasured" />
|
||||
@* <DxGridDataColumn FieldName="IsAudited" /> *@
|
||||
</Columns>
|
||||
<DetailRowTemplate>
|
||||
<GridDetailOrderItemPallets OrderItemPallets="((OrderItemDto)context.DataItem).OrderItemPallets" />
|
||||
</DetailRowTemplate>
|
||||
<GroupSummary>
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="Quantity"
|
||||
FooterColumnName="Quantity" />
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="NetWeight"
|
||||
FooterColumnName="NetWeight" />
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="PriceInclTax"
|
||||
FooterColumnName="PriceInclTax" />
|
||||
</GroupSummary>
|
||||
</MgGridBase>
|
||||
|
||||
@code {
|
||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||
//[Parameter] public OrderDto? OrderDto { get; set; }
|
||||
[Parameter] public List<OrderItemDto>? OrderItemDtos { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
// if (OrderDto != null)
|
||||
// OrderItemDtos = OrderDto.OrderItemDtos;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@* List<GenericAttribute> GenericAttributes { get; set; }
|
||||
List<OrderItemPallet> OrderItemPallets { get; set; }
|
||||
OrderDto OrderDto { get; set; }
|
||||
bool IsMeasured
|
||||
bool IsMeasurable
|
||||
int TrayQuantity
|
||||
double NetWeight
|
||||
double GrossWeight
|
||||
|
||||
public Guid OrderItemGuid { get; set; }
|
||||
public int OrderId { get; set; }
|
||||
public int ProductId { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
|
||||
public decimal UnitPriceInclTax { get; set; }
|
||||
public decimal UnitPriceExclTax { get; set; }
|
||||
|
||||
public decimal PriceInclTax { get; set; }
|
||||
public decimal PriceExclTax { get; set; }
|
||||
|
||||
public string AttributesXml { get; set; }
|
||||
public decimal? ItemWeight { get; set; }
|
||||
|
||||
public string ProductName => ProductDto?.Name ?? "ProductDto is null!!!";
|
||||
|
||||
public TProductDto? ProductDto { get; set; }
|
||||
*@
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
@using FruitBank.Common.Dtos
|
||||
@using FruitBank.Common.Entities
|
||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||
|
||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||
|
||||
<MgGridBase @ref="gridOrderItemPallet" Data="OrderItemPallets" IsMasterGrid="IsMasterGrid"
|
||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||
AutoExpandAllGroupRows="false"
|
||||
ColumnResizeMode="GridColumnResizeMode.NextColumn"
|
||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)">
|
||||
<Columns>
|
||||
<DxGridDataColumn FieldName="Id" Width="125" />
|
||||
<DxGridDataColumn FieldName="OrderItemId" Caption="oiId" Width="125" />
|
||||
<DxGridDataColumn FieldName="OrderItemDto.OrderId" Caption="oId" Width="125" />
|
||||
<DxGridDataColumn Name="ProductId" FieldName="OrderItemDto.ProductId" Caption="pId" Width="125" Visible="false" />
|
||||
<DxGridDataColumn Name="ProductName" FieldName="OrderItemDto.ProductDto.Name" Caption="ProductName" Visible="false" />
|
||||
|
||||
<DxGridDataColumn FieldName="PalletWeight" />
|
||||
<DxGridDataColumn FieldName="TareWeight" />
|
||||
|
||||
<DxGridDataColumn FieldName="TrayQuantity" />
|
||||
<DxGridDataColumn FieldName="GrossWeight" />
|
||||
<DxGridDataColumn FieldName="NetWeight" />
|
||||
|
||||
<DxGridDataColumn FieldName="IsMeasured" />
|
||||
<DxGridDataColumn FieldName="IsAudited" />
|
||||
</Columns>
|
||||
<GroupSummary>
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="TrayQuantity"
|
||||
FooterColumnName="TrayQuantity" />
|
||||
<DxGridSummaryItem SummaryType="GridSummaryItemType.Sum"
|
||||
FieldName="NetWeight"
|
||||
FooterColumnName="NetWeight" />
|
||||
</GroupSummary>
|
||||
</MgGridBase>
|
||||
|
||||
@code {
|
||||
IGrid gridOrderItemPallet;
|
||||
|
||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||
[Parameter] public List<OrderItemPallet>? OrderItemPallets { get; set; }
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
if (OrderItemPallets == null)
|
||||
{
|
||||
OrderItemPallets = await FruitBankSignalRClient.GetAllOrderItemPallets();
|
||||
|
||||
if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
||||
{
|
||||
gridOrderItemPallet.BeginUpdate();
|
||||
|
||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
||||
gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
||||
|
||||
gridOrderItemPallet.EndUpdate();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected override Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
// if (OrderItemPallets != null && OrderItemPallets.Any(oip => oip.OrderItemDto?.ProductDto != null))
|
||||
// {
|
||||
// gridOrderItemPallet.BeginUpdate();
|
||||
|
||||
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductId")!.Visible = true;
|
||||
// gridOrderItemPallet.GetColumns().FirstOrDefault(x => x.Name == "ProductName")!.Visible = true;
|
||||
|
||||
// gridOrderItemPallet.EndUpdate();
|
||||
// }
|
||||
}
|
||||
|
||||
return base.OnAfterRenderAsync(firstRender);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@* List<GenericAttribute> GenericAttributes { get; set; }
|
||||
List<OrderItemPallet> OrderItemPallets { get; set; }
|
||||
OrderDto OrderDto { get; set; }
|
||||
bool IsMeasured
|
||||
bool IsMeasurable
|
||||
int TrayQuantity
|
||||
double NetWeight
|
||||
double GrossWeight
|
||||
|
||||
public Guid OrderItemGuid { get; set; }
|
||||
public int OrderId { get; set; }
|
||||
public int ProductId { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
|
||||
public decimal UnitPriceInclTax { get; set; }
|
||||
public decimal UnitPriceExclTax { get; set; }
|
||||
|
||||
public decimal PriceInclTax { get; set; }
|
||||
public decimal PriceExclTax { get; set; }
|
||||
|
||||
public string AttributesXml { get; set; }
|
||||
public decimal? ItemWeight { get; set; }
|
||||
|
||||
public string ProductName => ProductDto?.Name ?? "ProductDto is null!!!";
|
||||
|
||||
public TProductDto? ProductDto { get; set; }
|
||||
*@
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
namespace FruitBankHybrid.Shared.Components;
|
||||
|
||||
public class GridProductDto : MgGridBase
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
@using AyCode.Core.Helpers
|
||||
@using DevExpress.Internal.About
|
||||
@using FruitBank.Common.Dtos
|
||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||
|
||||
@inject FruitBankSignalRClient FruitBankSignalRClient
|
||||
|
||||
<GridProductDto Data="ProductDtos" IsMasterGrid="IsMasterGrid"
|
||||
PageSize="@(IsMasterGrid ? 15 : 50)" ShowFilterRow="IsMasterGrid" ShowGroupPanel="IsMasterGrid"
|
||||
ColumnResizeMode="GridColumnResizeMode.NextColumn" TextWrapEnabled="false"
|
||||
FilterMenuButtonDisplayMode="@(IsMasterGrid ? GridFilterMenuButtonDisplayMode.Never : GridFilterMenuButtonDisplayMode.Always)"
|
||||
FocusedRowChanged="OnFocusedRowChanged" FocusedRowEnabled="true">
|
||||
<Columns>
|
||||
<DxGridDataColumn FieldName="Id" SortIndex="0" SortOrder="GridColumnSortOrder.Ascending" />
|
||||
<DxGridDataColumn FieldName="Name" />
|
||||
<DxGridDataColumn FieldName="Price" />
|
||||
<DxGridDataColumn FieldName="AvailableQuantity" />
|
||||
<DxGridDataColumn FieldName="StockQuantity" />
|
||||
<DxGridDataColumn FieldName="IncomingQuantity" />
|
||||
<DxGridDataColumn FieldName="NetWeight" />
|
||||
<DxGridDataColumn FieldName="IsMeasurable" />
|
||||
</Columns>
|
||||
<DetailRowTemplate>
|
||||
@if (IsMasterGrid)
|
||||
{
|
||||
var productId = ((ProductDto)context.DataItem).Id;
|
||||
|
||||
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i, productId)" >
|
||||
<DxTabPage Text="Rendelések melyben megtalálható">
|
||||
@{
|
||||
//GetOrderDtosFromDbAsync(productId).Forget();
|
||||
//var orderDtos = _orderDtos?.Where(o => o.OrderItemDtos.Any(oi => oi.ProductId == productId)).ToList() ?? [];
|
||||
<GridDetailOrderDto OrderDtos="_currentOrderDtos" IsMasterGrid="false"></GridDetailOrderDto>
|
||||
}
|
||||
</DxTabPage>
|
||||
<DxTabPage Text="Rendelés tételek">
|
||||
@{
|
||||
//GetOrderItemDtosFromDbAsync(productId).Forget();
|
||||
//var orderItemDtos = _orderItemDtos?.Where(oi => oi.ProductId == productId).ToList() ?? [];
|
||||
<GridDetailOrderItemDto OrderItemDtos="_currentOrderItemDtos" IsMasterGrid="false" />
|
||||
}
|
||||
|
||||
</DxTabPage>
|
||||
</DxTabs>
|
||||
}
|
||||
</DetailRowTemplate>
|
||||
|
||||
</GridProductDto>
|
||||
|
||||
|
||||
@code {
|
||||
private int _activeTabIndex;
|
||||
|
||||
private List<OrderDto>? _currentOrderDtos;
|
||||
private List<OrderItemDto>? _currentOrderItemDtos;
|
||||
|
||||
private readonly Dictionary<int, List<OrderDto>> _orderDtosByProductId = new();
|
||||
private readonly Dictionary<int, List<OrderItemDto>> _orderItemDtosByProductId = new();
|
||||
|
||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||
[Parameter] public List<ProductDto>? ProductDtos { get; set; }
|
||||
//[Parameter] public List<OrderDto>? OrderDtos { get; set; }
|
||||
//[Parameter] public List<OrderItemDto>? OrderItemDtos { get; set; }
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
ProductDtos ??= await FruitBankSignalRClient.GetProductDtos();
|
||||
|
||||
// if (ProductDtos is { Count: > 0 })
|
||||
// _currentOrderDtos = await GetOrderDtosFromDbAsync(ProductDtos[0].Id);
|
||||
}
|
||||
|
||||
private async Task<List<OrderDto>> GetOrderDtosFromDbAsync(int productId)
|
||||
{
|
||||
if (_orderDtosByProductId.TryGetValue(productId, out var orderDtos)) return orderDtos;
|
||||
|
||||
orderDtos = await FruitBankSignalRClient.GetAllOrderDtoByProductId(productId) ?? [];
|
||||
_orderDtosByProductId[productId] = orderDtos;
|
||||
|
||||
return _currentOrderDtos = orderDtos;
|
||||
}
|
||||
|
||||
private async Task<List<OrderItemDto>> GetOrderItemDtosFromDbAsync(int productId)
|
||||
{
|
||||
if (_orderItemDtosByProductId.TryGetValue(productId, out var orderItemDtos)) return orderItemDtos;
|
||||
|
||||
orderItemDtos = await FruitBankSignalRClient.GetAllOrderItemDtoByProductId(productId) ?? [];
|
||||
_orderItemDtosByProductId[productId] = orderItemDtos;
|
||||
|
||||
return _currentOrderItemDtos = orderItemDtos;
|
||||
}
|
||||
|
||||
protected async Task OnFocusedRowChanged(GridFocusedRowChangedEventArgs e)
|
||||
{
|
||||
var productDto = (ProductDto)e.DataItem;
|
||||
|
||||
//if (e.Grid.IsDetailRowExpanded(e.VisibleIndex))
|
||||
{
|
||||
_currentOrderDtos = null;
|
||||
_currentOrderDtos = productDto != null ? await GetOrderDtosFromDbAsync(productDto.Id) : [];
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task OnActiveTabChanged(int activeTabIndex, int productId)
|
||||
{
|
||||
_activeTabIndex = activeTabIndex;
|
||||
|
||||
switch (_activeTabIndex)
|
||||
{
|
||||
case 0:
|
||||
//_currentOrderDtos = null;
|
||||
_currentOrderDtos = await GetOrderDtosFromDbAsync(productId);
|
||||
break;
|
||||
case 1:
|
||||
_currentOrderItemDtos = null;
|
||||
_currentOrderItemDtos = await GetOrderItemDtosFromDbAsync(productId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
using AyCode.Core.Loggers;
|
||||
using DevExpress.Blazor;
|
||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Components;
|
||||
|
||||
public class MgGridBase : DxGrid
|
||||
{
|
||||
private bool _isFirstInitializeParameters;
|
||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||
|
||||
[Parameter] public bool IsMasterGrid { get; set; } = false;
|
||||
|
||||
[Parameter]
|
||||
public required object DataSource
|
||||
{
|
||||
get => Data;
|
||||
set => Data = value;
|
||||
}
|
||||
|
||||
protected void OnCustomizeElement(GridCustomizeElementEventArgs e)
|
||||
{
|
||||
//if (!IsMasterGrid) e.CssClass = "hideDetailButton";
|
||||
|
||||
if (IsMasterGrid && e.ElementType == GridElementType.DataRow && e.VisibleIndex % 2 == 1 && !e.Grid.IsRowSelected(e.VisibleIndex) && !e.Grid.IsRowFocused(e.VisibleIndex))
|
||||
{
|
||||
e.CssClass = " alt-item";
|
||||
}
|
||||
|
||||
if(e.ElementType == GridElementType.HeaderCell) {
|
||||
e.Style = "background-color: #E6E6E6;";
|
||||
//e.CssClass = "header-bold";
|
||||
}
|
||||
}
|
||||
protected override Task SetParametersAsyncCore(ParameterView parameters)
|
||||
{
|
||||
if (!_isFirstInitializeParameters)
|
||||
{
|
||||
//if (typeof(TDataItem) is IId<Guid> || typeof(TDataItem) is IId<int>)
|
||||
KeyFieldName = "Id";
|
||||
|
||||
//base.DataItemDeleting = EventCallback.Factory.Create<GridDataItemDeletingEventArgs>(this, OnItemDeleting);
|
||||
//base.EditModelSaving = EventCallback.Factory.Create<GridEditModelSavingEventArgs>(this, OnItemSaving);
|
||||
|
||||
CustomizeElement += OnCustomizeElement;
|
||||
|
||||
//ShowFilterRow = true;
|
||||
//PageSize = 4;
|
||||
//ShowGroupPanel = true;
|
||||
//AllowSort = false;
|
||||
|
||||
TextWrapEnabled = false;
|
||||
AllowSelectRowByClick = true;
|
||||
HighlightRowOnHover = true;
|
||||
AutoCollapseDetailRow = true;
|
||||
AutoExpandAllGroupRows = false;
|
||||
|
||||
//KeyboardNavigationEnabled = true;
|
||||
|
||||
//var dataColumns = GetDataColumns();
|
||||
|
||||
//var idColumn = dataColumns.FirstOrDefault(x => x.FieldName == nameof(IId<Guid>.Id));
|
||||
//if (idColumn != null)
|
||||
//{
|
||||
// idColumn.ShowInColumnChooser = AcDomain.IsDeveloperVersion;
|
||||
// idColumn.Visible = !AcDomain.IsDeveloperVersion;
|
||||
//}
|
||||
|
||||
_isFirstInitializeParameters = true;
|
||||
}
|
||||
|
||||
return base.SetParametersAsyncCore(parameters);
|
||||
}
|
||||
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
base.OnParametersSet();
|
||||
|
||||
ShowGroupPanel = IsMasterGrid;
|
||||
ShowSearchBox = IsMasterGrid;
|
||||
DetailRowDisplayMode = IsMasterGrid ? GridDetailRowDisplayMode.Auto : GridDetailRowDisplayMode.Never;
|
||||
DetailExpandButtonDisplayMode = IsMasterGrid ? GridDetailExpandButtonDisplayMode.Auto : GridDetailExpandButtonDisplayMode.Never;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +1,17 @@
|
|||
@using AyCode.Core.Loggers
|
||||
@using FruitBank.Common.Dtos
|
||||
@using FruitBank.Common.Entities
|
||||
@using FruitBank.Common.Helpers
|
||||
@using FruitBank.Common.Interfaces
|
||||
@using FruitBank.Common.Models
|
||||
@using FruitBank.Common.SignalRs
|
||||
@using FruitBankHybrid.Shared.Extensions
|
||||
@using FruitBankHybrid.Shared.Services
|
||||
@using FruitBankHybrid.Shared.Services.SignalRs
|
||||
@typeparam TPalletItem where TPalletItem : class, IMeasuringItemPalletBase
|
||||
|
||||
<DxFormLayout Context="ctxFromLayoutPallet" Data="@PalletItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout"
|
||||
ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value, PalletItem))">
|
||||
ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value, PalletItem))" Enabled="IsEditable">
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" BeginRow="true">
|
||||
<b>@(MeasuringIndex). MÉRÉS</b>
|
||||
|
|
@ -17,38 +19,51 @@
|
|||
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.PalletWeight)))"
|
||||
Field="@nameof(ShippingItemPallet.PalletWeight)"
|
||||
Enabled="@(IsMeasurable && ProductId > 0)"
|
||||
Field="@nameof(ShippingItemPallet.PalletWeight)"
|
||||
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)"
|
||||
Caption="Rakl.súly(kg)" ColSpanMd="2" />
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TareWeight)))"
|
||||
Field="@nameof(ShippingItemPallet.TareWeight)"
|
||||
Enabled="@(IsMeasurable && ProductId > 0)"
|
||||
Caption="Tára(kg)" ColSpanMd="2" />
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" />
|
||||
Field="@nameof(ShippingItemPallet.TareWeight)"
|
||||
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)"
|
||||
Caption="Tára(kg)" ColSpanMd="2" />
|
||||
|
||||
@* <DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" /> *@
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TrayQuantity)))"
|
||||
Field="@nameof(ShippingItemPallet.TrayQuantity)"
|
||||
Enabled="@(ProductId > 0)"
|
||||
Caption="Rekesz/csomag" ColSpanMd="2" />
|
||||
Field="@nameof(ShippingItemPallet.TrayQuantity)"
|
||||
Enabled="@(IsEditable && ProductId > 0)"
|
||||
Caption="Rekesz/csomag" ColSpanMd="2" />
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.GrossWeight)))"
|
||||
Field="@nameof(ShippingItemPallet.GrossWeight)"
|
||||
Enabled="@(IsMeasurable && ProductId > 0)"
|
||||
Caption="Br.súly(kg)" ColSpanMd="2">
|
||||
Field="@nameof(ShippingItemPallet.GrossWeight)"
|
||||
Enabled="@(IsEditable && IsMeasurable && ProductId > 0)"
|
||||
Caption="Br.súly(kg)" ColSpanMd="2">
|
||||
</DxFormLayoutItem>
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" Caption="Net(kg)" ColSpanMd="1" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.NetWeight)))">
|
||||
<text>@(PalletItem.NetWeight) kg.</text>
|
||||
</DxFormLayoutItem>
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1">
|
||||
<DxButton Enabled="@BtnSaveEnabled" Text="@(PalletItem.Id == 0 ? "Mentés" : "Módosít")" Click="() => PalletItemSaveClick()" CssClass="w-100" />
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="@(HasAuditButton ? 1 : 2)">
|
||||
<DxButton Enabled="@(IsEditable && BtnSaveEnabled)" Text="@(PalletItem.Id == 0 ? "Mentés" : "Módosít")" Click="() => PalletItemSaveClick()" CssClass="w-100" />
|
||||
</DxFormLayoutItem>
|
||||
|
||||
@if (HasAuditButton)
|
||||
{
|
||||
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1">
|
||||
<DxButton Enabled="@(IsEditable && OrderItemPallet!.IsMeasuredAndValid(IsMeasurable) && !OrderItemPallet.IsAudited)"
|
||||
Text="@(OrderItemPallet!.IsAudited ? "Jóváhagyva" : "Jóváhagy")" Click="() => PalletItemAuditedClick()" CssClass="w-100" />
|
||||
</DxFormLayoutItem>
|
||||
}
|
||||
</DxFormLayout>
|
||||
|
||||
@code {
|
||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||
[Inject] private IDialogService DialogService { get; set; } = null!;
|
||||
|
||||
[Parameter] public required TPalletItem PalletItem { get; set; }
|
||||
[Parameter] public required bool IsMeasurable { get; set; }
|
||||
[Parameter] public required int ProductId { get; set; }
|
||||
|
|
@ -56,20 +71,28 @@
|
|||
[Parameter] public int? AddOrUpdateSignalRTag { get; set; } = null;
|
||||
|
||||
[Parameter] public int? MaxTrayQuantity { get; set; } = null;
|
||||
[Parameter] public bool IsEditable { get; set; } = true;
|
||||
|
||||
//[Parameter] public EventCallback OnPalletItemSaveClick { get; set; }
|
||||
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaved { get; set; }
|
||||
[Parameter] public Func<TPalletItem, Task>? OnPalletItemValueChanged { get; set; }
|
||||
|
||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemAuditedClick { get; set; }
|
||||
|
||||
//public bool LoadingPanelVisible { get; set; } = false;
|
||||
//public bool IsEditable => !HasAuditButton || (OrderItemPallet.IsAudited);
|
||||
public bool BtnSaveEnabled { get; set; }
|
||||
|
||||
|
||||
bool HasAuditButton => LoggedInModel.IsRevisor && IsOrderItemPallet;
|
||||
|
||||
|
||||
public bool IsOrderItemPallet => OrderItemPallet != null;
|
||||
public OrderItemPallet? OrderItemPallet => (PalletItem as OrderItemPallet);
|
||||
|
||||
private bool GetBtnSaveEnabled()
|
||||
=> PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value);
|
||||
{
|
||||
return IsEditable && PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value);
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
|
|
@ -81,7 +104,7 @@
|
|||
|
||||
|
||||
private string GetOrderItemPalletsCssClassNames(string fieldName)
|
||||
=> MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, PalletItem, IsMeasurable, MaxTrayQuantity);
|
||||
=> MeasurementService.GetCustomItemPalletsCssClassNames(fieldName, PalletItem, IsMeasurable, MaxTrayQuantity);
|
||||
|
||||
private async Task PalletItemSaveClick()
|
||||
{
|
||||
|
|
@ -91,8 +114,8 @@
|
|||
if (AddOrUpdateSignalRTag == null) throw new Exception($"PalletItemComponent->PalletItemSaveClick(); AddOrUpdateSignalRTag == null");
|
||||
|
||||
PalletItem.ModifierId = LoggedInModel.CustomerDto?.Id;
|
||||
var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync(AddOrUpdateSignalRTag!.Value, PalletItem);
|
||||
|
||||
var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync(AddOrUpdateSignalRTag!.Value, PalletItem);
|
||||
if (responseShippingItemPallet != null) PalletItem.Id = responseShippingItemPallet.Id; //Az UpdateCollection miatt kell, hogy megtalálja mit kell kicserélni! - J.
|
||||
//else _logger.Error($"Sikertelen volt a raklap adatainak mentése!");
|
||||
|
||||
|
|
@ -142,4 +165,29 @@
|
|||
|
||||
if (OnPalletItemValueChanged != null) await OnPalletItemValueChanged.Invoke(palletItem);
|
||||
}
|
||||
|
||||
private async Task PalletItemAuditedClick()
|
||||
{
|
||||
if (OnPalletItemAuditedClick != null)
|
||||
{
|
||||
if (OrderItemPallet == null) throw new Exception($"PalletItemComponent->PalletItemAuditedClick(); OrderItemPallet == null");
|
||||
|
||||
if (await DialogService.ShowConfirmBoxAsync("Megerősítés", "Biztoan jóváhagyja a mérést? Jóváhagyás után a mérés nem módosítható!", MessageBoxRenderStyle.Info))
|
||||
{
|
||||
OrderItemPallet.RevisorId = LoggedInModel.CustomerDto!.Id;
|
||||
|
||||
StateHasChanged(); //Az Audit button miatt kell a StateHasChanged(), most már van RevisorId és emiatt disabled lesz...
|
||||
|
||||
var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync(AddOrUpdateSignalRTag!.Value, PalletItem);
|
||||
if (responseShippingItemPallet == null)
|
||||
{
|
||||
OrderItemPallet.RevisorId = 0; //Sikertelen volt a mentés...
|
||||
await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt, ellenőrizze a mérés adatait!", MessageBoxRenderStyle.Danger);
|
||||
}
|
||||
|
||||
if (OnPalletItemAuditedClick != null) await OnPalletItemAuditedClick.Invoke(responseShippingItemPallet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
<div class="page">
|
||||
<div class="sidebar">
|
||||
<NavMenu @ref="_navMenu"/>
|
||||
<NavMenu @ref="_navMenu" />
|
||||
</div>
|
||||
|
||||
<main>
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
@if (LoggedInModel.IsLoggedIn)
|
||||
{
|
||||
<div style="float: left; text-align: left;" class="col-md-8">
|
||||
<b>@($"{LoggedInModel.CustomerDto!.FullName} [{string.Join(", ", LoggedInModel.CustomerRoles.Where(x=>x.SystemName.Contains("Measuring")).Select(x => x.Name))}]")</b>
|
||||
<b>@($"{LoggedInModel.CustomerDto!.FullName} [{string.Join(", ", LoggedInModel.CustomerRoles.Where(x => x.SystemName.Contains("Measuring")).Select(x => x.Name))}]")</b>
|
||||
</div>
|
||||
|
||||
<div style="float: right; text-align: right;" class="col-md-4">
|
||||
|
|
@ -21,6 +21,17 @@
|
|||
</div>
|
||||
|
||||
<article class="content px-4">
|
||||
<DxToastProvider Name="Positioning"
|
||||
MaxToastCount="199"
|
||||
DisplayTime="@TimeSpan.Zero"
|
||||
FreezeOnClick="true"
|
||||
AnimationType="ToastAnimationType.Slide"
|
||||
HorizontalAlignment="HorizontalAlignment.Right"
|
||||
VerticalAlignment="VerticalEdge.Top"
|
||||
RenderStyle="ToastRenderStyle.Info"
|
||||
ShowCloseButton="true">
|
||||
</DxToastProvider>
|
||||
|
||||
<CascadingValue Value="RefreshMainLayoutEventCallback">
|
||||
@Body
|
||||
</CascadingValue>
|
||||
|
|
|
|||
|
|
@ -1,26 +1,79 @@
|
|||
using FruitBank.Common.Models;
|
||||
using AyCode.Core.Consts;
|
||||
using AyCode.Core.Extensions;
|
||||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.SignalRs;
|
||||
using DevExpress.Blazor;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Models;
|
||||
using FruitBank.Common.Models.SignalRs;
|
||||
using FruitBank.Common.SignalRs;
|
||||
using FruitBankHybrid.Shared.Pages;
|
||||
using FruitBankHybrid.Shared.Services.Loggers;
|
||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||
using Mango.Nop.Core.Loggers;
|
||||
using MessagePack.Resolvers;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Layout;
|
||||
|
||||
public partial class MainLayout : LayoutComponentBase
|
||||
{
|
||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||
[Inject] public required NavigationManager NavManager{ get; set; }
|
||||
[Inject] public required LoggedInModel LoggedInModel { get; set; }
|
||||
[Inject] IToastNotificationService ToastService { get; set; }
|
||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||
|
||||
private EventCallback RefreshMainLayoutEventCallback => EventCallback.Factory.Create(this, RefreshMainLayout);
|
||||
private NavMenu _navMenu = null!;
|
||||
private ILogger _logger = null!;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
_logger = new LoggerClient<MainLayout>(LogWriters.ToArray());
|
||||
_logger.Info("OnInitializedAsync");
|
||||
|
||||
var loginUri = NavManager.ToAbsoluteUri("/Login").ToString();
|
||||
|
||||
FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived;
|
||||
|
||||
if (!LoggedInModel.IsLoggedIn && NavManager.Uri != loginUri)
|
||||
{
|
||||
NavManager.NavigateTo("/Login");
|
||||
}
|
||||
}
|
||||
|
||||
private Task SignalRClientOnMessageReceived(int messageTag, string? jsonMessage)
|
||||
{
|
||||
if (messageTag != SignalRTags.NotificationReceived || !LoggedInModel.IsLoggedIn) return Task.CompletedTask;
|
||||
|
||||
var notificationMessage = jsonMessage?.JsonTo<SignalRMessageToClientWithText<OrderDto>>();
|
||||
if (notificationMessage == null)
|
||||
{
|
||||
_logger.Error($"notificationMessage == null");
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
if (!(notificationMessage.Content?.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) ?? LoggedInModel.IsRevisor)) return Task.CompletedTask;
|
||||
|
||||
var messageText = $"{notificationMessage.Message}";
|
||||
if (notificationMessage.Content != null)
|
||||
{
|
||||
messageText += $" Rendelés: #{notificationMessage.Content.CustomOrderNumber}. Átvétel: {notificationMessage.Content.DateOfReceipt}";
|
||||
}
|
||||
|
||||
_logger.Info($"NotificationMessage received. {messageText}");
|
||||
|
||||
ToastService.ShowToast(new ToastOptions
|
||||
{
|
||||
ProviderName = "Positioning",
|
||||
Title = "Király vagyok!",
|
||||
Text = messageText,
|
||||
});
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private void OnLogoutClick()
|
||||
{
|
||||
LoggedInModel.LogOut();
|
||||
|
|
|
|||
|
|
@ -36,6 +36,15 @@
|
|||
<span class="icon counter-icon" aria-hidden="true"></span> Kimenő mérés
|
||||
</NavLink>
|
||||
</div>
|
||||
|
||||
@if (LoggedInModel.IsAdministrator)
|
||||
{
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="Revisor">
|
||||
<span class="icon counter-icon" aria-hidden="true"></span> Revizor
|
||||
</NavLink>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
Text="Adatok szinkronizálása folyamatban...">
|
||||
|
||||
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
||||
<DxFormLayoutItem Caption="Dátum" ColSpanMd="2" CaptionCssClass="@(SelectedShipping != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")">
|
||||
<DxFormLayoutItem Caption="Dátum" ColSpanMd="2" CaptionCssClass="@(SelectedShipping != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedShipping.ShippingDate)).All(x => x.IsMeasured) ? "text-success" : "")">
|
||||
<DxDateEdit CssClass="cw-320"
|
||||
DisplayFormat="m"
|
||||
Format="m"
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
var shippings = await FruitBankSignalRClient.GetNotMeasuredShippings() ?? [];
|
||||
|
||||
_measuringDates = shippings.Select(shipping => new MeasuringDateSelectorModel(shipping.Id, shipping.ShippingDate.Date, shipping.IsAllMeasured)).ToList();
|
||||
NotMeasuredShippings = shippings.Where(shipping => MeasuringService.DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList();
|
||||
NotMeasuredShippings = shippings.Where(shipping => MeasurementService.DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList();
|
||||
|
||||
SelectedShipping = NotMeasuredShippings.FirstOrDefault();
|
||||
|
||||
|
|
@ -69,13 +69,13 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
|
||||
|
||||
private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
|
||||
=> MeasuringService.OnCustomDisabledDate(args, _measuringDates);
|
||||
=> MeasurementService.OnCustomDisabledDate(args, _measuringDates);
|
||||
|
||||
private string GetMeasuringDateCssClassNames(DateTime date)
|
||||
=> MeasuringService.GetShippingDateCssClassNames(date, _measuringDates);
|
||||
=> MeasurementService.GetShippingDateCssClassNames(date, _measuringDates);
|
||||
|
||||
private string GetShippingPalletsCssClassNames(string fieldName, ShippingItemPallet shippingItemPallet)
|
||||
=> MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, shippingItemPallet, SelectedShippingItem!.IsMeasurable);
|
||||
=> MeasurementService.GetCustomItemPalletsCssClassNames(fieldName, shippingItemPallet, SelectedShippingItem!.IsMeasurable);
|
||||
|
||||
private void OnSelectedShippingChanged(SelectedDataItemChangedEventArgs<Shipping> eventArgs)
|
||||
{
|
||||
|
|
@ -154,7 +154,7 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
}
|
||||
|
||||
private bool IsShippingitemPalletMeasuredAndValid(ShippingItemPallet shippingItemPallet)
|
||||
=> MeasuringService.IsCustomItemPalletMeasuredAndValid(shippingItemPallet, SelectedShippingItem!.IsMeasurable);
|
||||
=> MeasurementService.IsCustomItemPalletMeasuredAndValid(shippingItemPallet, SelectedShippingItem!.IsMeasurable);
|
||||
|
||||
private void LogErrorAndDisplayText(string errorText, Exception? ex = null)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
||||
<DxFormLayoutItem Caption="Dátum" ColSpanMd="2"
|
||||
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")">
|
||||
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasurementService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceiptOrCreated)).All(x => x.IsMeasured) ? "text-success" : "")">
|
||||
<DxDateEdit CssClass="cw-320"
|
||||
DisplayFormat="m"
|
||||
Format="m"
|
||||
|
|
@ -100,7 +100,8 @@
|
|||
var isCompleteOrder = SelectedOrder.IsComplete;
|
||||
|
||||
<DxFormLayoutItem Caption="Revizor:" ColSpanMd="2" CaptionCssClass="@(isCompleteOrder ? "text-success" : "")">
|
||||
<DxButton Text="@(isCompleteOrder ? "Jóváhagyva" : "Jóváhagyás")" Enabled="@(!isCompleteOrder && SelectedOrder.IsMeasured)" CssClass="w-100"
|
||||
<DxButton Text="@(isCompleteOrder ? "Lezárva" : "Lezárás")"
|
||||
Enabled="@(!isCompleteOrder && IsAllOrderItemPalletAudited)" CssClass="w-100"
|
||||
Click="() => OnMeasuringAuditorClick()" />
|
||||
</DxFormLayoutItem>
|
||||
}
|
||||
|
|
@ -124,7 +125,7 @@
|
|||
Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber)
|
||||
</h4>
|
||||
|
||||
<DxAccordion Data="@SelectedOrder?.OrderItemDtos" Enabled="@(HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId > 0 && !(SelectedOrder?.IsComplete ?? false))"
|
||||
<DxAccordion Data="@SelectedOrder?.OrderItemDtos" Enabled="@((HasMeasuringAccess && SelectedOrder?.MeasurementOwnerId > 0 && (LoggedInModel.IsRevisor || !(SelectedOrder?.IsComplete ?? false))))"
|
||||
ExpandMode="AccordionExpandMode.SingleOrNone"
|
||||
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
|
||||
AnimationType="LayoutAnimationType.Slide">
|
||||
|
|
@ -159,7 +160,7 @@
|
|||
//text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg";
|
||||
//var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId);
|
||||
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
|
||||
|
||||
SelectedOrderItem = selectedOrderItemDto;
|
||||
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItemDto" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
|
||||
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
|
||||
@for (var index = 0; index < (selectedOrderItemDto?.OrderItemPallets?.Count ?? 0); index++)
|
||||
|
|
@ -169,24 +170,29 @@
|
|||
|
||||
<PalletItemComponent IsMeasurable="@selectedOrderItemDto.IsMeasurable"
|
||||
MeasuringIndex="@localI"
|
||||
IsEditable="@(!currentOrderItemPallet.IsAudited && !(SelectedOrder?.IsComplete ?? false))"
|
||||
PalletItem="@currentOrderItemPallet"
|
||||
ProductId="@selectedOrderItemDto.ProductId"
|
||||
MaxTrayQuantity="@selectedOrderItemDto.Quantity"
|
||||
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
|
||||
OnPalletItemSaved="pallet => OnOrderItemPalletSaved(pallet, selectedOrderItemDto)"
|
||||
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItemDto)">
|
||||
OnPalletItemValueChanged="pallet => OnOrderItemPalletValueChanged(pallet, selectedOrderItemDto)"
|
||||
OnPalletItemAuditedClick="pallet => OnPalletItemAuditedClick(pallet, selectedOrderItemDto)">
|
||||
</PalletItemComponent>
|
||||
}
|
||||
</DxFormLayoutItem>
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
|
||||
<DxButton Text="Új sor" Click="() => AddNewPalletItemClick(selectedOrderItemDto)" CssClass="w-100"
|
||||
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
||||
Enabled="@(selectedOrderItemDto.OrderItemPallets[^1].Id > 0)" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="3">
|
||||
<DxButton Text="Utolsó sor törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItemDto)" CssClass="w-100"
|
||||
Visible="@(!(SelectedOrder?.IsComplete ?? false))"
|
||||
Enabled="@(selectedOrderItemDto.OrderItemPallets.Count > 1 && selectedOrderItemDto.OrderItemPallets[^1].Id <= 0)" />
|
||||
</DxFormLayoutItem>
|
||||
|
||||
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="7" />
|
||||
|
||||
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
|
||||
|
|
|
|||
|
|
@ -1,30 +1,36 @@
|
|||
using AyCode.Core.Loggers;
|
||||
using AyCode.Core.Extensions;
|
||||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.SignalRs;
|
||||
using DevExpress.Blazor;
|
||||
using DevExpress.Xpo.DB;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Helpers;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using FruitBank.Common.Models;
|
||||
using FruitBank.Common.Models.SignalRs;
|
||||
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 Mango.Nop.Core.Loggers;
|
||||
using MessagePack.Resolvers;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Nop.Core.Domain.Orders;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FruitBank.Common.Helpers;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using AyCode.Core.Extensions;
|
||||
using FruitBankHybrid.Shared.Extensions;
|
||||
using Mango.Nop.Core.Extensions;
|
||||
using Nop.Core.Domain.Orders;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Pages
|
||||
{
|
||||
public partial class MeasuringOut : ComponentBase
|
||||
{
|
||||
private readonly object _lock = new object();
|
||||
[Inject] public required IEnumerable<IAcLogWriterClientBase> LogWriters { get; set; }
|
||||
[Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; }
|
||||
[Inject] public required NavigationManager NavManager{ get; set; }
|
||||
|
|
@ -35,9 +41,9 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
private string _errorText;
|
||||
|
||||
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; }
|
||||
|
|
@ -52,43 +58,117 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
_logger = new LoggerClient<MeasuringOut>(LogWriters.ToArray());
|
||||
_logger.Info("OnInitializedAsync");
|
||||
|
||||
FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived;
|
||||
|
||||
await RefreshOrdersFromDb(DateTime.Now);
|
||||
await base.OnInitializedAsync();
|
||||
}
|
||||
|
||||
private async Task SignalRClientOnMessageReceived(int messageTag, string? jsonMessage)
|
||||
{
|
||||
if (!LoggedInModel.IsLoggedIn) return;
|
||||
|
||||
if (messageTag != SignalRTags.SendOrderChanged && messageTag != SignalRTags.SendOrderItemChanged &&
|
||||
messageTag != SignalRTags.SendOrderItemPalletChanged && messageTag != SignalRTags.SendProductChanged) return;
|
||||
|
||||
|
||||
_logger.Detail($"SignalRClientOnMessageReceived received. {jsonMessage}");
|
||||
|
||||
OrderDto? orderDto;
|
||||
switch (messageTag)
|
||||
{
|
||||
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:
|
||||
var orderItemDto = jsonMessage?.JsonTo<OrderItemDto>();
|
||||
if (orderItemDto == null) break;
|
||||
|
||||
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;
|
||||
var orderItem = orderItemDtos?.FirstOrDefault(oi => oi.Id == orderItemPallet.OrderItemId);
|
||||
if (orderItem == null) return;
|
||||
|
||||
var orderItemPalletsCount = orderItem.OrderItemPallets.Count;
|
||||
|
||||
if (orderItem.OrderItemPallets[orderItemPalletsCount - 1].Id == 0) orderItem.OrderItemPallets.Insert(orderItemPalletsCount - 1, orderItemPallet);
|
||||
else orderItem.OrderItemPallets.UpdateCollection(orderItemPallet, false);
|
||||
}
|
||||
|
||||
await InvokeAsync(StateHasChanged);
|
||||
return;
|
||||
case SignalRTags.SendProductChanged:
|
||||
var productDto = jsonMessage?.JsonTo<ProductDto>();
|
||||
if (productDto == null) break;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.Error($"SignalRClientOnMessageReceived message == null");
|
||||
}
|
||||
|
||||
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
||||
{
|
||||
SelectedDate = dateTime;
|
||||
LoadingPanelVisible = true;
|
||||
|
||||
var orders = (await FruitBankSignalRClient.GetPendingOrderDtosForMeasuring() ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
|
||||
_measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceiptOrCreated, order.IsMeasured)).ToList();
|
||||
lock (_lock)
|
||||
{
|
||||
_measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceiptOrCreated, order.IsMeasured)).ToList();
|
||||
|
||||
SelectedDayOrders = orders.Where(order => MeasuringService.DaysEqual(order.DateOfReceiptOrCreated, dateTime)).OrderBy(x => x.DateOfReceipt).ToList();
|
||||
SelectedDayOrders = orders.Where(order => MeasurementService.DaysEqual(order.DateOfReceiptOrCreated, dateTime)).OrderBy(x => x.DateOfReceipt).ToList();
|
||||
|
||||
foreach (var orderDto in SelectedDayOrders) PrepareOrderDto(orderDto);
|
||||
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 = 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();
|
||||
}
|
||||
|
||||
SelectedOrder ??= SelectedDayOrders.FirstOrDefault();
|
||||
LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J.
|
||||
}
|
||||
|
||||
private async Task OnMeasuringDateChanged(DateTime selectedDateTime)
|
||||
=> await RefreshOrdersFromDb(selectedDateTime);
|
||||
private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime);
|
||||
|
||||
private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args)
|
||||
=> MeasuringService.OnCustomDisabledDate(args, _measuringDates);
|
||||
=> MeasurementService.OnCustomDisabledDate(args, _measuringDates);
|
||||
|
||||
private string GetMeasuringDateCssClassNames(DateTime date)
|
||||
=> MeasuringService.GetShippingDateCssClassNames(date, _measuringDates);
|
||||
=> MeasurementService.GetShippingDateCssClassNames(date, _measuringDates);
|
||||
|
||||
private string GetOrderItemPalletsCssClassNames(string fieldName, OrderItemPallet orderItemPallet)
|
||||
=> MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable);
|
||||
=> MeasurementService.GetCustomItemPalletsCssClassNames(fieldName, orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable);
|
||||
|
||||
private bool IsOrderItemPalletMeasuredAndValid(OrderItemPallet orderItemPallet)
|
||||
=> MeasuringService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable);
|
||||
=> MeasurementService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable);
|
||||
|
||||
private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs<OrderDto> eventArgs)
|
||||
{
|
||||
|
|
@ -136,6 +216,12 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
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)
|
||||
|
|
@ -152,7 +238,7 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
{
|
||||
if (selectedOrderItemDto.OrderItemPallets[^1].Id > 0)
|
||||
{
|
||||
selectedOrderItemDto.OrderItemPallets.Add(MeasuringService.CreateNewOrderItemPallet(selectedOrderItemDto, LoggedInModel.CustomerDto));
|
||||
selectedOrderItemDto.OrderItemPallets.Add(MeasurementService.CreateNewOrderItemPallet(selectedOrderItemDto, LoggedInModel.CustomerDto));
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
|
|
@ -173,7 +259,10 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
}
|
||||
|
||||
private async Task OnOrdersRefreshClick()
|
||||
=> await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now);
|
||||
{
|
||||
await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now);
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task OnStartMeasuringClick()
|
||||
{
|
||||
|
|
@ -223,7 +312,7 @@ namespace FruitBankHybrid.Shared.Pages
|
|||
{
|
||||
foreach (var orderItemDto in orderDto.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0))
|
||||
{
|
||||
orderItemDto.OrderItemPallets.Add(MeasuringService.CreateNewOrderItemPallet(orderItemDto, LoggedInModel.CustomerDto));
|
||||
orderItemDto.OrderItemPallets.Add(MeasurementService.CreateNewOrderItemPallet(orderItemDto, LoggedInModel.CustomerDto));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
@page "/Revisor"
|
||||
@using FruitBank.Common.Dtos
|
||||
@using FruitBankHybrid.Shared.Components
|
||||
<h3>Revisor</h3>
|
||||
|
||||
<DxDialogProvider />
|
||||
|
||||
<div style="margin-top: 50px;">
|
||||
|
||||
<DxLoadingPanel @bind-Visible="LoadingPanelVisible"
|
||||
IsContentBlocked="true"
|
||||
ApplyBackgroundShading="true"
|
||||
IndicatorAreaVisible="true"
|
||||
IsContentVisible="true"
|
||||
IndicatorAnimationType="WaitIndicatorAnimationType.Spin"
|
||||
Text="Adatok szinkronizálása folyamatban...">
|
||||
|
||||
@* @bind-ActiveTabIndex="@ActiveTabIndex" *@
|
||||
<DxTabs ActiveTabIndexChanged="(i) => OnActiveTabChanged(i)">
|
||||
<DxTabPage Text="Termékek">
|
||||
<GridProductDtoTemplate ProductDtos="ProductDtos" IsMasterGrid="true"></GridProductDtoTemplate>
|
||||
</DxTabPage>
|
||||
<DxTabPage Text="Rendelések">
|
||||
<GridDetailOrderDto OrderDtos="OrderDtos" IsMasterGrid="true"></GridDetailOrderDto>
|
||||
</DxTabPage>
|
||||
<DxTabPage Text="Rendelés tételek">
|
||||
<GridDetailOrderItemDto OrderItemDtos="OrderItemDtos" IsMasterGrid="true"></GridDetailOrderItemDto>
|
||||
</DxTabPage>
|
||||
<DxTabPage Text="Mérések">
|
||||
<GridDetailOrderItemPallets IsMasterGrid="true"></GridDetailOrderItemPallets>
|
||||
</DxTabPage>
|
||||
</DxTabs>
|
||||
</DxLoadingPanel>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
using AyCode.Core.Loggers;
|
||||
using DevExpress.Blazor;
|
||||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Models;
|
||||
using FruitBankHybrid.Shared.Services.Loggers;
|
||||
using FruitBankHybrid.Shared.Services.SignalRs;
|
||||
using Mango.Nop.Core.Loggers;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Pages;
|
||||
|
||||
public partial class Revisor : ComponentBase
|
||||
{
|
||||
[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; }
|
||||
|
||||
public IGrid gridOrder;
|
||||
private List<ProductDto>? ProductDtos { get; set; } = null!;
|
||||
private List<OrderDto>? OrderDtos { get; set; } = null!;
|
||||
private List<OrderItemDto>? OrderItemDtos { get; set; } = null!;
|
||||
|
||||
public bool AutoCollapseDetailRow { get; set; }
|
||||
public bool LoadingPanelVisible { get; set; } = true;
|
||||
|
||||
private ILogger _logger = null!;
|
||||
public int ActiveTabIndex;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login");
|
||||
|
||||
LoadingPanelVisible = true;
|
||||
|
||||
_logger = new LoggerClient<Revisor>(LogWriters.ToArray());
|
||||
_logger.Info("OnInitializedAsync");
|
||||
|
||||
await RefreshOrdersFromDb(DateTime.Now);
|
||||
await base.OnInitializedAsync();
|
||||
}
|
||||
|
||||
private async Task RefreshOrdersFromDb(DateTime dateTime)
|
||||
{
|
||||
LoadingPanelVisible = true;
|
||||
|
||||
OrderDtos = (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o=>o.Id).ToList();//.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
|
||||
LoadingPanelVisible = false;
|
||||
}
|
||||
|
||||
protected async Task OnActiveTabChanged(int activeTabIndex)
|
||||
{
|
||||
ActiveTabIndex = activeTabIndex;
|
||||
LoadingPanelVisible = true;
|
||||
|
||||
switch (ActiveTabIndex)
|
||||
{
|
||||
case 0:
|
||||
if(ProductDtos == null)
|
||||
ProductDtos = (await FruitBankSignalRClient.GetProductDtos() ?? []); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
break;
|
||||
case 1:
|
||||
if(OrderDtos == null)
|
||||
OrderDtos = (await FruitBankSignalRClient.GetAllOrderDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
break;
|
||||
case 2:
|
||||
if (OrderItemDtos == null)
|
||||
OrderItemDtos = (await FruitBankSignalRClient.GetAllOrderItemDtos() ?? []).OrderByDescending(o => o.Id).ToList(); //.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).OrderBy(o => o.DateOfReceipt).ToList();
|
||||
break;
|
||||
}
|
||||
|
||||
LoadingPanelVisible = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
using FruitBank.Common.Interfaces;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Services;
|
||||
|
||||
public interface IMeasurementService : IMeasurementServiceBase
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -2,14 +2,15 @@
|
|||
using FruitBank.Common.Dtos;
|
||||
using FruitBank.Common.Entities;
|
||||
using FruitBank.Common.Interfaces;
|
||||
using FruitBank.Common.Services;
|
||||
using FruitBankHybrid.Shared.Models;
|
||||
using Mango.Nop.Core.Dtos;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Services;
|
||||
|
||||
public class MeasuringService
|
||||
public class MeasurementService : MeasurementServiceBase, IMeasurementService
|
||||
{
|
||||
public MeasuringService()
|
||||
public MeasurementService()
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
using AyCode.Core.Helpers;
|
||||
using AyCode.Core.Extensions;
|
||||
using AyCode.Core.Helpers;
|
||||
using AyCode.Core.Loggers;
|
||||
using AyCode.Services.Server.SignalRs;
|
||||
using AyCode.Services.SignalRs;
|
||||
|
|
@ -11,7 +12,9 @@ using FruitBank.Common.SignalRs;
|
|||
using FruitBankHybrid.Shared.Services.Loggers;
|
||||
using Mango.Nop.Core.Dtos;
|
||||
using Mango.Nop.Core.Models;
|
||||
using MessagePack.Resolvers;
|
||||
using Nop.Core.Domain.Customers;
|
||||
using System.ServiceModel.Channels;
|
||||
|
||||
namespace FruitBankHybrid.Shared.Services.SignalRs
|
||||
{
|
||||
|
|
@ -22,6 +25,26 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
|
|||
ConstHelper.NameByValue<SignalRTags>(0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MessageTag, JSON
|
||||
/// </summary>
|
||||
public event Func<int, string?, Task> OnMessageReceived = null!;
|
||||
|
||||
protected override async Task MessageReceived(int messageTag, byte[] messageBytes)
|
||||
{
|
||||
var jsonMessage = messageBytes.MessagePackTo<SignalResponseJsonMessage>(ContractlessStandardResolver.Options);
|
||||
|
||||
await OnMessageReceived(messageTag, jsonMessage.ResponseData);
|
||||
}
|
||||
|
||||
private void SendMessageToAllClients(int messageTag, string message)
|
||||
{
|
||||
if (messageTag == SignalRTags.NotificationReceived)
|
||||
{
|
||||
Logger.Info(message);
|
||||
}
|
||||
}
|
||||
|
||||
public Task<List<MeasuringModel>?> GetMeasuringModels()
|
||||
=> GetAllAsync<List<MeasuringModel>>(SignalRTags.GetMeasuringModels);
|
||||
|
||||
|
|
@ -143,6 +166,9 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
|
|||
public Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds)
|
||||
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllOrderDtoByIds, [orderIds]);
|
||||
|
||||
public Task<List<OrderItemDto>?> GetAllOrderItemDtos()
|
||||
=> GetAllAsync<List<OrderItemDto>>(SignalRTags.GetAllOrderItemDtos);
|
||||
|
||||
public Task<OrderItemPallet?> AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet)
|
||||
=> PostDataAsync(SignalRTags.AddOrUpdateMeasuredOrderItemPallet, orderItemPallet);
|
||||
|
||||
|
|
@ -152,6 +178,33 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
|
|||
public Task<OrderDto?> SetOrderStatusToComplete(int orderId, int revisorId)
|
||||
=> GetByIdAsync<OrderDto>(SignalRTags.SetOrderStatusToComplete, [orderId, revisorId]);
|
||||
|
||||
public Task<List<OrderDto>?> GetAllOrderDtoByProductId(int productId)
|
||||
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllOrderDtoByProductId, [productId]);
|
||||
|
||||
public Task<OrderItemDto?> GetOrderItemDtoById(int orderItemId)
|
||||
=> GetByIdAsync<OrderItemDto>(SignalRTags.GetOrderItemDtoById, [orderItemId]);
|
||||
|
||||
public Task<List<OrderItemDto>?> GetAllOrderItemDtoByOrderId(int orderId)
|
||||
=> GetAllAsync<List<OrderItemDto>>(SignalRTags.GetAllOrderItemDtoByOrderId, [orderId]);
|
||||
|
||||
public Task<List<OrderItemDto>?> GetAllOrderItemDtoByProductId(int productId)
|
||||
=> GetAllAsync<List<OrderItemDto>>(SignalRTags.GetAllOrderItemDtoByProductId, [productId]);
|
||||
|
||||
public Task<List<OrderItemPallet>?> GetAllOrderItemPallets()
|
||||
=> GetAllAsync<List<OrderItemPallet>>(SignalRTags.GetAllOrderItemPallets);
|
||||
|
||||
public Task<OrderItemPallet?> GetOrderItemPalletById(int orderItemPalletId)
|
||||
=> GetByIdAsync<OrderItemPallet>(SignalRTags.GetOrderItemPalletById, [orderItemPalletId]);
|
||||
|
||||
public Task<List<OrderItemPallet>?> GetAllOrderItemPalletByOrderItemId(int orderItemId)
|
||||
=> GetAllAsync<List<OrderItemPallet>>(SignalRTags.GetAllOrderItemPalletByOrderItemId, [orderItemId]);
|
||||
|
||||
public Task<List<OrderItemPallet>?> GetAllOrderItemPalletByOrderId(int orderId)
|
||||
=> GetAllAsync<List<OrderItemPallet>>(SignalRTags.GetAllOrderItemPalletByOrderId, [orderId]);
|
||||
|
||||
public Task<List<OrderItemPallet>?> GetAllOrderItemPalletByProductId(int productId)
|
||||
=> GetAllAsync<List<OrderItemPallet>>(SignalRTags.GetAllOrderItemPalletByProductId, [productId]);
|
||||
|
||||
#endregion Orders
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,3 +79,28 @@ h1:focus {
|
|||
.dd-body-class .dxbl-list-box-render-container {
|
||||
max-height: 600px !important;
|
||||
}
|
||||
|
||||
/*region: DSGrids*/
|
||||
/*.dxbl-grid {
|
||||
height: 522px;
|
||||
}
|
||||
*/
|
||||
.hideDetailButton .dxbl-grid-expand-button-cell .dxbl-grid-expand-button {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.header-bold span {
|
||||
font-weight: 700;
|
||||
color: #161616;
|
||||
}
|
||||
/* DevExpress and Bootstrap Themes */
|
||||
.alt-item > td:not(.dxbl-grid-empty-cell),
|
||||
.alt-item > td:not(.dxbl-grid-indent-cell) {
|
||||
background-color: #F7F7F7 !important;
|
||||
color: #161616;
|
||||
}
|
||||
/* Fluent Themes */
|
||||
/*.alt-item {
|
||||
--dxbl-grid-row-bg: var(--DS-color-surface-neutral-subdued-rest);
|
||||
}*/
|
||||
/*endregion: DSGrids*/
|
||||
|
|
@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
|||
|
||||
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||
|
||||
builder.Services.AddDevExpressBlazor(configure => configure.SizeMode = DevExpress.Blazor.SizeMode.Large);
|
||||
builder.Services.AddDevExpressBlazor(configure => configure.SizeMode = DevExpress.Blazor.SizeMode.Medium);
|
||||
|
||||
// Add device-specific services used by the FruitBankHybrid.Shared project
|
||||
builder.Services.AddSingleton<IFormFactor, FormFactor>();
|
||||
|
|
@ -19,9 +19,9 @@ builder.Services.AddSingleton<LoggedInModel>();
|
|||
builder.Services.AddScoped<FruitBankSignalRClient>();
|
||||
|
||||
#if DEBUG
|
||||
builder.Services.AddSingleton<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
||||
builder.Services.AddScoped<IAcLogWriterClientBase, BrowserConsoleLogWriter>();
|
||||
#endif
|
||||
|
||||
builder.Services.AddSingleton<IAcLogWriterClientBase, SignaRClientLogItemWriter>();
|
||||
builder.Services.AddScoped<IAcLogWriterClientBase, SignaRClientLogItemWriter>();
|
||||
|
||||
await builder.Build().RunAsync();
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ builder.Services.AddMvc();
|
|||
|
||||
builder.Services.AddSingleton<IFormFactor, FormFactor>();
|
||||
|
||||
builder.Services.AddScoped<LoggedInModel>();
|
||||
builder.Services.AddScoped<LoggerToLoggerApiController>();
|
||||
builder.Services.AddSingleton<LoggedInModel>();
|
||||
builder.Services.AddScoped<IAcLogWriterBase, ConsoleLogWriter>();
|
||||
//builder.Services.AddScoped<LoggerToLoggerApiController>();
|
||||
//builder.Services.AddSingleton<SessionService>();
|
||||
|
||||
//builder.Services.AddScoped<IFruitBankDataControllerServer, FruitBankDataController>();
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ Global
|
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{85ADEDE3-C271-47DF-B273-2EDB32792CEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{85ADEDE3-C271-47DF-B273-2EDB32792CEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{85ADEDE3-C271-47DF-B273-2EDB32792CEF}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{85ADEDE3-C271-47DF-B273-2EDB32792CEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{85ADEDE3-C271-47DF-B273-2EDB32792CEF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{899988C3-8F36-4B19-A1DE-1D1D85F114D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
<ApplicationVersion>1</ApplicationVersion>
|
||||
|
||||
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
|
||||
<WindowsPackageType>None</WindowsPackageType>
|
||||
<!--<WindowsPackageType>None</WindowsPackageType>-->
|
||||
|
||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
|
||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ namespace FruitBankHybrid
|
|||
|
||||
|
||||
builder.Services.AddMauiBlazorWebView();
|
||||
builder.Services.AddDevExpressBlazor(configure => configure.SizeMode = DevExpress.Blazor.SizeMode.Large);
|
||||
builder.Services.AddDevExpressBlazor(configure => configure.SizeMode = DevExpress.Blazor.SizeMode.Medium);
|
||||
|
||||
#if DEBUG
|
||||
builder.Services.AddBlazorWebViewDeveloperTools();
|
||||
|
|
|
|||
Loading…
Reference in New Issue