This commit is contained in:
Loretta 2025-10-15 07:56:56 +02:00
parent 581c4ee0a5
commit 51aef27828
20 changed files with 404 additions and 169 deletions

View File

@ -27,7 +27,11 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
public List<GenericAttribute> GenericAttributes { get; set; }
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasured => OrderItemDtos.All(oi => oi.IsMeasured);
public bool IsMeasured
{
get => IsMeasuredAndValid();
set => throw new Exception($"OrderDto.IsMeasured not set");
}
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasurable
@ -52,4 +56,8 @@ public class OrderDto : MgOrderDto<OrderItemDto, ProductDto>, IOrderDto
{ }
public OrderDto(Order order) : base(order)
{ }
public bool IsMeasuredAndValid() => Id > 0 && OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsMeasured);
public bool IsValidMeasuringValues() => OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsValidMeasuringValues());
}

View File

@ -24,8 +24,15 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
[Association(ThisKey = nameof(Id), OtherKey = nameof(OrderItemPallet.OrderItemId), CanBeNull = true)]
public List<OrderItemPallet> OrderItemPallets { get; set; }
[Association(ThisKey = nameof(OrderId), OtherKey = nameof(OrderDto.Id), CanBeNull = false)]
public OrderDto OrderDto { get; set; }
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasured => OrderItemPallets.All(oip => oip.IsMeasured);
public bool IsMeasured
{
get => IsMeasuredAndValid();
set => throw new Exception($"OrderItemDto.IsMeasured not set");
}
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public bool IsMeasurable
@ -44,12 +51,17 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public double NetWeight
{
get => CommonHelper.To<double>(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0");
get
{
return double.Round(OrderItemPallets.Sum(x => x.NetWeight), 1);
//return CommonHelper.To<double>(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0");
}
set
{
//Direkt legyen exception! - J.
var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!;
ga.Value = value.ToString(CultureInfo.InvariantCulture);
throw new Exception($"OrderItemDto.NetWeight not set");
////Direkt legyen exception! - J.
//var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!;
//ga.Value = value.ToString(CultureInfo.InvariantCulture);
}
}
@ -88,4 +100,7 @@ public class OrderItemDto : MgOrderItemDto<ProductDto>, IOrderItemDto
{
OrderItemPallets = orderItemPallets;
}
public bool IsMeasuredAndValid() => Id > 0 && IsValidMeasuringValues() && OrderItemPallets.All(oip => oip.IsMeasuredAndValid(IsMeasurable));
public bool IsValidMeasuringValues() => OrderItemPallets.Count > 0 && (!IsMeasurable || NetWeight > 0) && TrayQuantity == Quantity;
}

View File

@ -2,6 +2,7 @@
using LinqToDB;
using LinqToDB.Mapping;
using Mango.Nop.Core.Entities;
using Newtonsoft.Json;
namespace FruitBank.Common.Entities;
@ -32,7 +33,12 @@ public abstract class MeasuringItemPalletBase : MgEntityBase, IMeasuringItemPall
set => _palletWeight = double.Round(value, 1);
}
[NotColumn] public double NetWeight => CalculateNetWeight();
[NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore]
public double NetWeight
{
get => CalculateNetWeight();
set => throw new Exception($"MeasuringItemPalletBase.NetWeight not set");
}
[Column(DataType = DataType.DecFloat, CanBeNull = false)]
public double GrossWeight
@ -78,6 +84,18 @@ public abstract class MeasuringItemPalletBase : MgEntityBase, IMeasuringItemPall
return Id > 0 && IsMeasured && IsValidMeasuringValues(isMeasurable);
}
public virtual void SetupCustomItemPalletMeauringValues(bool isMeasurable)
{
if (!isMeasurable)
{
TareWeight = 0;
PalletWeight = 0;
GrossWeight = 0;
}
IsMeasured = IsValidMeasuringValues(isMeasurable);
}
public override string ToString()
{
return $"{base.ToString()} [ForeignItemId: {ForeignItemId}; IsMeasured: {IsMeasured}; PalletWeight: {PalletWeight}; TareWeight: {TareWeight}; Quantity: {TrayQuantity}; NetWeight: {NetWeight}; GrossWeight: {GrossWeight}]";

View File

@ -1,4 +1,6 @@
namespace FruitBank.Common.Interfaces;
using FruitBank.Common.Dtos;
namespace FruitBank.Common.Interfaces;
public interface ICustomOrderSignalREndpointClient : ICustomOrderSignalREndpointCommon
{

View File

@ -1,4 +1,5 @@
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;
using Mango.Nop.Core.Models;
namespace FruitBank.Common.Interfaces;
@ -7,6 +8,8 @@ public interface ICustomOrderSignalREndpointCommon
{
Task<List<OrderDto>?> GetAllOrderDtos();
Task<List<OrderDto>?> GetPendingOrderDtos();
Task<List<OrderDto>?> GetAllByIds(int[] orderIds);
Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds);
Task<OrderDto?> GetOrderDtoById(int orderId);
Task<OrderItemPallet?> AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet);
Task<OrderDto?> SetOrderStatusToComplete(int orderId);
}

View File

@ -34,6 +34,7 @@ public interface IFruitBankDataControllerCommon
#region ShippingItemPallet
public Task<ShippingItemPallet?> AddShippingItemPallet(ShippingItemPallet shippingItemPallet);
public Task<ShippingItemPallet?> UpdateShippingItemPallet(ShippingItemPallet shippingItemPallet);
public Task<ShippingItemPallet?> AddOrUpdateMeasuredShippingItemPallet(ShippingItemPallet shippingItemPallet);
public Task<ShippingItem?> AddOrUpdateMeasuredShippingItemPallets(List<ShippingItemPallet> shippingItemPallets);
#endregion ShippingItemPallet

View File

@ -2,5 +2,5 @@
public interface IMeasured
{
bool IsMeasured { get; }
bool IsMeasured { get; set; }
}

View File

@ -5,16 +5,19 @@ using FruitBank.Common.Entities;
namespace FruitBank.Common.Interfaces;
public interface IMeasuringItemPalletBase : IEntityInt, IMeasuringQuantity, IMeasuringGrossWeight, IMeasured, ITimeStampInfo, ICustomForeignKeyInt
public interface IMeasuringItemPalletBase : IEntityInt, IMeasuringValues, IMeasured, ITimeStampInfo, ICustomForeignKeyInt
{
public double TareWeight { get; set; }
public double PalletWeight { get; set; }
double TareWeight { get; set; }
double PalletWeight { get; set; }
public int? CreatorId { get; set; }
public int? ModifierId { get; set; }
int? CreatorId { get; set; }
int? ModifierId { get; set; }
public double CalculateNetWeight();
double CalculateNetWeight();
public bool IsValidSafeMeasuringValues();
public bool IsValidMeasuringValues(bool isMeasurable);
bool IsValidSafeMeasuringValues();
bool IsValidMeasuringValues(bool isMeasurable);
bool IsMeasuredAndValid(bool isMeasurable);
void SetupCustomItemPalletMeauringValues(bool isMeasurable);
}

View File

@ -8,6 +8,7 @@ namespace FruitBank.Common.Interfaces;
public interface IOrderItemDto : IMgOrderItemDto<ProductDto>, IMeasuringValues, IMeasured, IMeasurable
{
public OrderDto OrderDto { get; set; }
public List<OrderItemPallet> OrderItemPallets { get; set; }
public void InitializeOrderItemPallets(List<OrderItemPallet> orderItemPallets);
}

View File

@ -47,10 +47,16 @@ public class SignalRTags : AcSignalRTags
public const int GetAllOrderDtos = 111;
public const int GetOrderDtoById = 112;
public const int GetAllByIdList = 114;
public const int GetAllOrderDtoByIds = 114;
public const int GetPendingOrderDtos = 115;
public const int SetOrderStatusToComplete = 116;
public const int AuthenticateUser = 160;
public const int AddOrderItemPallet = 131;
public const int UpdateOrderItemPallet = 132;
public const int AddOrUpdateMeasuredOrderItemPallet = 133;
public const int AddOrUpdateMeasuredOrderItemPallets = 134;
public const int AuthenticateUser = 195;
public const int RefreshToken = 200;
public const int GetAllLogItemsByFilterText = 1000;

View File

@ -64,7 +64,7 @@ public sealed class OrderClientTests
[DataRow(new[] {1,2,4,7})]
public async Task GetOrderDtoById(int[] orderIds)
{
var orderDtoList = await _signalRClient.GetAllByIds(orderIds);
var orderDtoList = await _signalRClient.GetAllOrderDtoByIds(orderIds);
Assert.IsNotNull(orderDtoList);

View File

@ -0,0 +1,124 @@
@using AyCode.Core.Loggers
@using FruitBank.Common.Entities
@using FruitBank.Common.Interfaces
@using FruitBank.Common.Models
@using FruitBank.Common.SignalRs
@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))">
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" BeginRow="true">
<text>@(MeasuringIndex).mérés</text>
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.PalletWeight)))"
Field="@nameof(ShippingItemPallet.PalletWeight)"
Enabled="@(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" />
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(IMeasuringItemPalletBase.TrayQuantity)))"
Field="@nameof(ShippingItemPallet.TrayQuantity)"
Enabled="@(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">
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" Caption="Net.súly(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ás")" Click="() => PalletItemSaveClick()" CssClass="w-100" />
</DxFormLayoutItem>
</DxFormLayout>
@code {
[Parameter] public required TPalletItem PalletItem { get; set; }
[Parameter] public required bool IsMeasurable { get; set; }
[Parameter] public required int ProductId { get; set; }
[Parameter] public required int MeasuringIndex { get; set; }
[Parameter] public int? AddOrUpdateSignalRTag { get; set; } = null;
//[Parameter] public EventCallback OnPalletItemSaveClick { get; set; }
[Parameter] public Func<TPalletItem?, Task>? OnPalletItemSaveClick { 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; }
public bool _btnSaveEnabled { get; set; }
protected override async Task OnInitializedAsync()
{
_btnSaveEnabled = PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured;
await base.OnInitializedAsync();
}
private string GetOrderItemPalletsCssClassNames(string fieldName)
=> MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, PalletItem, IsMeasurable);
private async Task PalletItemSaveClick()
{
_btnSaveEnabled = false;
if (AddOrUpdateSignalRTag == null) throw new Exception($"PalletItemComponent->PalletItemSaveClick(); AddOrUpdateSignalRTag == null");
PalletItem.ModifierId = LoggedInModel.CustomerDto?.Id;
var responseShippingItemPallet = await FruitBankSignalRClient.PostDataAsync<TPalletItem>(AddOrUpdateSignalRTag!.Value, PalletItem);
if (responseShippingItemPallet != null)
PalletItem.Id = responseShippingItemPallet.Id; //Az UpdateCollection miatt kell, hogy megtalálja mit kell kicserélni! - J.
if (OnPalletItemSaveClick != null) await OnPalletItemSaveClick.Invoke(responseShippingItemPallet);
}
protected async Task OnItemUpdating(string fieldName, object newValue, TPalletItem palletItem)
{
_btnSaveEnabled = false;
// if (SelectedOrderItem == null) return;
switch (fieldName)
{
case nameof(OrderItemPallet.PalletWeight):
palletItem.PalletWeight = (double)newValue;
break;
case nameof(OrderItemPallet.TareWeight):
palletItem.TareWeight = (double)newValue;
break;
case nameof(OrderItemPallet.TrayQuantity):
palletItem.TrayQuantity = (int)newValue;
break;
case nameof(OrderItemPallet.GrossWeight):
palletItem.GrossWeight = (double)newValue;
break;
}
palletItem.IsMeasured = false;
//MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(SelectedShippingItem);
//BtnSaveEnabled = SelectedShippingItem.IsValidMeasuringValues() && shippingItemPallet.IsValidMeasuringValues(SelectedShippingItem.IsMeasurable);
_btnSaveEnabled = palletItem.IsValidMeasuringValues(IsMeasurable) && !palletItem.IsMeasured;
if (OnPalletItemValueChanged != null) await OnPalletItemValueChanged.Invoke(palletItem);
}
}

View File

@ -43,6 +43,7 @@
ValueFieldName="@nameof(Shipping.Id)"
TextFieldName="@nameof(Shipping.LicencePlate)"
CssClass="cw-480"
DropDownBodyCssClass="dd-body-class"
Context="ctxShipping"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<Shipping> args) => OnSelectedShippingChanged(args))"
InputId="cbNotMeasuredShippings">
@ -59,6 +60,7 @@
ValueFieldName="@nameof(ShippingDocument.Id)"
TextFieldName="@(nameof(ShippingDocument.Partner) + '.' + nameof(Partner.Name))"
CssClass="cw-480"
DropDownBodyCssClass="dd-body-class"
Context="ctxShippingDocument"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingDocument> args) => OnSelectedShippingDocumentChanged(args))"
InputId="cbShippingDocument">
@ -75,6 +77,7 @@
ValueFieldName="@nameof(ShippingItem.Id)"
TextFieldName="@(nameof(ShippingItem.Name))"
CssClass="cw-480"
DropDownBodyCssClass="dd-body-class"
Context="ctxShippingitem"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
InputId="cbShippingItem">
@ -159,12 +162,13 @@
Enabled="@(SelectedShippingItem.IsMeasurable && SelectedShippingItem.ProductId.GetValueOrDefault(0) > 0)"
Caption="Rakl.súly(kg)" ColSpanMd="2"/>
<DxFormLayoutItem ColSpanMd="1"/>
<DxFormLayoutItem CaptionCssClass="@(GetShippingPalletsCssClassNames(nameof(ShippingItemPallet.TareWeight), currentShippingItemPallet))"
Field="@nameof(ShippingItemPallet.TareWeight)"
Enabled="@(SelectedShippingItem.IsMeasurable && SelectedShippingItem.ProductId.GetValueOrDefault(0) > 0)"
Caption="Tára(kg)" ColSpanMd="2"/>
<DxFormLayoutItem ColSpanMd="1" />
<DxFormLayoutItem CaptionCssClass="@(GetShippingPalletsCssClassNames(nameof(ShippingItemPallet.TrayQuantity), currentShippingItemPallet))"
Field="@nameof(ShippingItemPallet.TrayQuantity)"
Enabled="@(SelectedShippingItem.ProductId.GetValueOrDefault(0) > 0)"
@ -192,8 +196,8 @@
<DxFormLayout CssClass="w-100">
<DxFormLayoutItem ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" />
<DxFormLayoutItem ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem ColSpanMd="1" BeginRow="false" />
<DxFormLayoutItem ColSpanMd="2" BeginRow="false"><strong>@(SelectedShippingItem.MeasuredQuantity) db</strong></DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="2" BeginRow="false"><strong>@(SelectedShippingItem.MeasuredGrossWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="1" BeginRow="false"><strong>@(SelectedShippingItem.MeasuredNetWeight) kg</strong></DxFormLayoutItem>

View File

@ -102,6 +102,9 @@ namespace FruitBankHybrid.Shared.Pages
{
ShippingItemId = shippingItem.Id,
PalletWeight = shippingItem.Pallet?.Weight ?? 0,
CreatorId = LoggedInModel.CustomerDto?.Id,
ModifierId = LoggedInModel.CustomerDto?.Id
});
//if (shippingItem.Id == SelectedShippingItem?.Id) return;
@ -152,7 +155,9 @@ namespace FruitBankHybrid.Shared.Pages
{
ShippingItemPallet? responseShippingItemPallet;
if (shippingItemPallet.Id == 0) responseShippingItemPallet = await FruitBankSignalRClient.AddShippingItemPallet(shippingItemPallet);
shippingItemPallet.ModifierId = LoggedInModel.CustomerDto?.Id;
if (shippingItemPallet.Id <= 0) responseShippingItemPallet = await FruitBankSignalRClient.AddShippingItemPallet(shippingItemPallet);
else responseShippingItemPallet = await FruitBankSignalRClient.UpdateShippingItemPallet(shippingItemPallet);
if (responseShippingItemPallet != null)

View File

@ -1,14 +1,19 @@
@page "/MeasuringOut"
@using AyCode.Utils.Extensions
@using FruitBank.Common
@using FruitBank.Common.Dtos
@using FruitBank.Common.Entities
@using FruitBank.Common.SignalRs
@using FruitBankHybrid.Shared.Components
@using FruitBankHybrid.Shared.Services
@using Nop.Core.Domain.Orders
<h3>Kimenő mérés</h3>
<div style="margin-top: 50px;">
<DxFormLayout CaptionPosition="CaptionPosition.Vertical" CssClass="w-100">
<DxFormLayoutItem Caption="Átvétel dátuma" ColSpanMd="2" CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceipt)).All(x => x.IsMeasured) ? "text-success" : "")">
<DxFormLayoutItem Caption="Átvétel dátuma" ColSpanMd="2"
CaptionCssClass="@(SelectedOrder != null && _measuringDates.Where(x => MeasuringService.DaysEqual(x.DateTime, SelectedOrder.DateOfReceipt)).All(x => x.IsMeasured) ? "text-success" : "")">
<DxDateEdit CssClass="cw-320"
DisplayFormat="m"
Format="m"
@ -33,8 +38,8 @@
</DayCellTemplate>
</DxDateEdit>
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="2" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
<DxFormLayoutItem Caption="Átvétel időpontja:" ColSpanMd="3" CaptionCssClass="@(SelectedOrder?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedDayOrders"
@bind-Value="@SelectedOrder"
Text="Válasszon időpontot..."
@ -42,6 +47,7 @@
TextFieldName="@nameof(OrderDto.DateOfReceipt)"
CssClass="cw-480"
Context="ctxOrder"
DropDownBodyCssClass="dd-body-class"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<OrderDto> args) => OnSelectedOrderChanged(args))"
InputId="cbOrders">
<ItemDisplayTemplate>
@ -50,43 +56,22 @@
</DxComboBox>
</DxFormLayoutItem>
@*<DxFormLayoutItem Caption="Partner:" ColSpanMd="3" CaptionCssClass="@(SelectedShippingDocument?.IsAllMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedShipping?.ShippingDocuments"
@bind-Value="@SelectedShippingDocument"
Text="Select partner"
ValueFieldName="@nameof(ShippingDocument.Id)"
TextFieldName="@(nameof(ShippingDocument.Partner) + '.' + nameof(Partner.Name))"
CssClass="cw-480"
Context="ctxShippingDocument"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingDocument> args) => OnSelectedShippingDocumentChanged(args))"
InputId="cbShippingDocument">
<ItemDisplayTemplate>
<span class="@(ctxShippingDocument.DataItem.IsAllMeasured ? "text-success" : "")">@ctxShippingDocument.DisplayText</span>
</ItemDisplayTemplate>
</DxComboBox>
</DxFormLayoutItem>
<DxFormLayoutItem ColSpanMd="1"></DxFormLayoutItem>
@if (SelectedOrder != null && LoggedInModel.IsLoggedIn && LoggedInModel.CustomerRoles.Any(x => x.SystemName.ToLowerInvariant() == "measuringrevisor"))
{
var isCompleteOrder = SelectedOrder.OrderStatus == OrderStatus.Complete;
<DxFormLayoutItem Caption="Termék:" ColSpanMd="5" CaptionCssClass="@(SelectedShippingItem?.IsMeasured == true ? "text-success" : "")">
<DxComboBox Data="@SelectedShippingDocument?.ShippingItems"
@bind-Value="@SelectedShippingItem"
Text="Select item"
ValueFieldName="@nameof(ShippingItem.Id)"
TextFieldName="@(nameof(ShippingItem.Name))"
CssClass="cw-480"
Context="ctxShippingitem"
SelectedDataItemChanged="@((SelectedDataItemChangedEventArgs<ShippingItem> args) => OnSelectedShippingItemChanged(args))"
InputId="cbShippingItem">
<ItemDisplayTemplate>
<span class="@(ctxShippingitem.DataItem.IsMeasured ? "text-success" : "")">@ctxShippingitem.DisplayText)</span>
</ItemDisplayTemplate>
</DxComboBox>
</DxFormLayoutItem> *@
<DxFormLayoutItem Caption="Revizor:" ColSpanMd="3" CaptionCssClass="@(isCompleteOrder ? "text-success" : "")">
<DxButton Text="@(isCompleteOrder ? "Jóváhagyva" : "Mérés jóváhagyása")" Enabled="@(!isCompleteOrder && SelectedOrder.IsMeasured)" CssClass="w-100"
Click="() => OnMeasuringAuditorClick()"/>
</DxFormLayoutItem>
}
</DxFormLayout>
<div style="margin-top: 50px;">
<DxAccordion Data="@SelectedOrder?.OrderItemDtos"
ExpandMode="AccordionExpandMode.SingleOrNone"
ExpandCollapseAction="AccordionExpandCollapseAction.HeaderClick"
ExpandCollapseAction="AccordionExpandCollapseAction.ExpandButtonClick"
AnimationType="LayoutAnimationType.Slide">
<DataMappings>
<DxAccordionDataMapping Text="ProductName"></DxAccordionDataMapping>
@ -96,91 +81,81 @@
@{
if (context.Level == 0)
{
var cssClass = "text-danger";
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
<h5>@(selectedOrderItemDto.ProductName) - @(selectedOrderItemDto.Quantity) rekesz</h5>
var trayQuantity = selectedOrderItemDto.TrayQuantity; //selectedOrderItemDto.OrderItemPallets.Where(x => x.IsMeasured).Sum(x => x.TrayQuantity);
var isValid = selectedOrderItemDto.IsValidMeasuringValues();
var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid();// && selectedOrderItemDto.;
if (isValidAndMeasured) cssClass = "text-success";
else if (isValid) cssClass = string.Empty;
<h5 class="@cssClass">@($"{selectedOrderItemDto.ProductName} - {trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}")</h5>
}
}
</ItemHeaderTextTemplate>
<ItemContentTemplate>
@{
if (context.Level == 0)
{
//var orderItemPallet = ((OrderItemPallet)(context.DataItem));
//text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg";
//var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId);
@{
if (context.Level == 0)
{
//var orderItemPallet = ((OrderItemPallet)(context.DataItem));
//text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg";
//var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId);
var selectedOrderItemDto = (OrderItemDto)(context.DataItem);
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItemDto" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100" ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value))">
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
@for (var index = 0; index < selectedOrderItemDto.OrderItemPallets!.Count; index++)
{
var localI = index + 1;
var currentOrderItemPallet = selectedOrderItemDto.OrderItemPallets![index];
<DxFormLayout Context="ctxFormLayout" Data="@selectedOrderItemDto" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100" ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value))">
<DxFormLayoutItem Context="ctxFormLayoutItem" ColSpanMd="12">
@for (var index = 0; index < selectedOrderItemDto.OrderItemPallets!.Count; index++)
{
var localI = index + 1;
var currentOrderItemPallet = selectedOrderItemDto.OrderItemPallets![index];
<DxFormLayout Context="ctxFromLayoutPallet" Data="@currentOrderItemPallet" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100 measuring-form-layout"
ItemUpdating="@((pair) => OnItemUpdating2(pair.Key, pair.Value, currentOrderItemPallet))">
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1" BeginRow="true">
<text>@(localI).mérés</text>
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(ShippingItemPallet.PalletWeight), currentOrderItemPallet))"
Field="@nameof(ShippingItemPallet.PalletWeight)"
Enabled="@(selectedOrderItemDto.IsMeasurable && selectedOrderItemDto.ProductId > 0)"
Caption="Rakl.súly(kg)" ColSpanMd="2"/>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1"/>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(ShippingItemPallet.TareWeight), currentOrderItemPallet))"
Field="@nameof(ShippingItemPallet.TareWeight)"
Enabled="@(selectedOrderItemDto.IsMeasurable && selectedOrderItemDto.ProductId > 0)"
Caption="Tára(kg)" ColSpanMd="2"/>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(ShippingItemPallet.TrayQuantity), currentOrderItemPallet))"
Field="@nameof(ShippingItemPallet.TrayQuantity)"
Enabled="@(selectedOrderItemDto.ProductId > 0)"
Caption="Rekesz/csomag" ColSpanMd="2"/>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(ShippingItemPallet.GrossWeight), currentOrderItemPallet))"
Field="@nameof(ShippingItemPallet.GrossWeight)"
Enabled="@(selectedOrderItemDto.IsMeasurable && selectedOrderItemDto.ProductId > 0)"
Caption="Br.súly(kg)" ColSpanMd="2">
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" Caption="Net.súly(kg)" ColSpanMd="1" CaptionCssClass="@(GetOrderItemPalletsCssClassNames(nameof(ShippingItemPallet.NetWeight), currentOrderItemPallet))">
<text>@(currentOrderItemPallet.NetWeight) kg.</text>
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutItemPallet" ColSpanMd="1">
<DxButton Text="@(currentOrderItemPallet.Id == 0 ? "Mentés" : "Módosítás")" Click="() => OnShippingItemPalletSaveClick(currentOrderItemPallet)" CssClass="w-100"/>
</DxFormLayoutItem>
</DxFormLayout>
}
</DxFormLayoutItem>
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
<DxFormLayout CssClass="w-100" Context="dfcadsc">
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"/>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"/>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"/>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>@(selectedOrderItemDto.TrayQuantity) db</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>@(selectedOrderItemDto.GrossWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>@(selectedOrderItemDto.NetWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"/>
</DxFormLayout>
</DxFormLayoutItem>
@if (!_errorText.IsNullOrWhiteSpace())
{
<DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true">
<text>HIBA! @_errorText</text>
<PalletItemComponent IsMeasurable="@selectedOrderItemDto.IsMeasurable"
MeasuringIndex="@localI"
PalletItem="@currentOrderItemPallet"
ProductId="@selectedOrderItemDto.ProductId"
AddOrUpdateSignalRTag="SignalRTags.AddOrUpdateMeasuredOrderItemPallet"
OnPalletItemSaveClick="pallet => OnShippingItemPalletSaveClick(pallet, selectedOrderItemDto)"
OnPalletItemValueChanged="pallet => OnPalletItemValueChanged(pallet, selectedOrderItemDto)">
</PalletItemComponent>
}
</DxFormLayoutItem>
//_errorText = string.Empty;
}
</DxFormLayout>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2" BeginRow="true">
<DxButton Text="Új mérés" Click="() => AddNewPalletItemClick(selectedOrderItemDto)" CssClass="w-100"
Enabled="@(selectedOrderItemDto.OrderItemPallets[^1].Id > 0)" />
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="2">
<DxButton Text="Utolsó mérés törlése" Click="() => LastPalletItemDeleteClick(selectedOrderItemDto)" CssClass="w-100"
Enabled="@(selectedOrderItemDto.OrderItemPallets.Count > 1 && selectedOrderItemDto.OrderItemPallets[^1].Id <= 0)" />
</DxFormLayoutItem>
<DxFormLayoutItem Context="ctxFromLayoutNewPallet" ColSpanMd="6" />
<DxFormLayoutItem Context="vfdfgfd" ColSpanMd="12" BeginRow="true">
<DxFormLayout CssClass="w-100" Context="dfcadsc">
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>TOTAL:</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>@(selectedOrderItemDto.TrayQuantity) db</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="2" BeginRow="false"><strong>@(selectedOrderItemDto.GrossWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false"><strong>@(selectedOrderItemDto.NetWeight) kg</strong></DxFormLayoutItem>
<DxFormLayoutItem Context="dfcadsc2" ColSpanMd="1" BeginRow="false" />
</DxFormLayout>
</DxFormLayoutItem>
@if (!_errorText.IsNullOrWhiteSpace())
{
<DxFormLayoutItem Context="ctxFromLayoutItemError" ColSpanMd="12" BeginRow="true">
<text>HIBA! @_errorText</text>
</DxFormLayoutItem>
//_errorText = string.Empty;
}
</DxFormLayout>
<div style="margin-bottom: 20px;"></div>
}
}
}
</ItemContentTemplate>
</DxAccordion>
</div>

View File

@ -15,6 +15,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FruitBank.Common.Helpers;
using FruitBank.Common.Interfaces;
using AyCode.Core.Extensions;
using Nop.Core.Domain.Orders;
namespace FruitBankHybrid.Shared.Pages
{
@ -47,27 +50,13 @@ namespace FruitBankHybrid.Shared.Pages
var orders = await FruitBankSignalRClient.GetPendingOrderDtos() ?? [];
_measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceipt, order.IsMeasured)).ToList();
SelectedDayOrders = orders.Where(order => MeasuringService.DaysEqual(order.DateOfReceipt, dateTime)).ToList();
SelectedOrder = SelectedDayOrders.FirstOrDefault();
foreach (var order in SelectedDayOrders)
foreach (var orderItem in SelectedDayOrders.SelectMany(order => order.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0)))
{
foreach (var orderItem in order.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0))
{
orderItem.OrderItemPallets.Add(new OrderItemPallet
{
OrderItemId = orderItem.Id,
OrderItemDto = orderItem,
});
orderItem.OrderItemPallets.Add(new OrderItemPallet
{
OrderItemId = orderItem.Id,
OrderItemDto = orderItem,
});
}
orderItem.OrderItemPallets.Add(MeasuringService.CreateNewOrderItemPallet(orderItem, LoggedInModel.CustomerDto));
}
}
@ -90,6 +79,7 @@ namespace FruitBankHybrid.Shared.Pages
{
//SelectedOrderItem = eventArgs.DataItem?.OrderItemDtos?.FirstOrDefault();
}
protected bool BtnSaveEnabled { get; set; }
protected void OnItemUpdating(string fieldName, object newValue)
@ -125,23 +115,63 @@ namespace FruitBankHybrid.Shared.Pages
//BtnSaveEnabled = SelectedShippingItem.IsValidMeasuringValues() && shippingItemPallet.IsValidMeasuringValues(SelectedShippingItem.IsMeasurable);
}
private async Task OnShippingItemPalletSaveClick(OrderItemPallet orderItemPallet)
private Task OnPalletItemValueChanged(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto)
{
//ShippingItemPallet? responseShippingItemPallet;
StateHasChanged();
return Task.CompletedTask;
}
//if (orderItemPallet.Id == 0) responseShippingItemPallet = await FruitBankSignalRClient.AddShippingItemPallet(orderItemPallet);
//else responseShippingItemPallet = await FruitBankSignalRClient.UpdateShippingItemPallet(orderItemPallet);
//if (responseShippingItemPallet != null)
//{
// orderItemPallet.Id = responseShippingItemPallet.Id; //Az UpdateCollection miatt kell, hogy megtalálja mit kell kicserélni! - J.
// SelectedShippingItem!.ShippingItemPallets!.UpdateCollection(responseShippingItemPallet, false);
// MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(SelectedShippingItem);
//}
private Task OnShippingItemPalletSaveClick(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto)
{
if (orderItemPallet != null)
{
selectedOrderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false);
//MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(SelectedShippingItem);
}
//else LogErrorAndDisplayText($"Sikertelen volt a raklap adatainak mentése! {orderItemPallet}");
//StateHasChanged();
StateHasChanged();
return Task.CompletedTask;
}
private Task AddNewPalletItemClick(OrderItemDto selectedOrderItemDto)
{
if (selectedOrderItemDto.OrderItemPallets[^1].Id > 0)
{
selectedOrderItemDto.OrderItemPallets.Add(MeasuringService.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 OnMeasuringAuditorClick()
{
if (SelectedOrder != null && SelectedOrder.IsMeasured && SelectedOrder.OrderStatus != OrderStatus.Complete)
{
var responseOrderDto = await FruitBankSignalRClient.SetOrderStatusToComplete(SelectedOrder.Id);
if (responseOrderDto != null)
{
SelectedDayOrders.UpdateCollection(responseOrderDto, false);
SelectedOrder = responseOrderDto;
}
StateHasChanged();
}
}
}
}

View File

@ -0,0 +1,4 @@
.dd-body-class,
.dd-body-class .dxbl-list-box-render-container {
max-height: 600px !important;
}

View File

@ -1,11 +1,19 @@
using DevExpress.Blazor;
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces;
using FruitBankHybrid.Shared.Models;
using Mango.Nop.Core.Dtos;
namespace FruitBankHybrid.Shared.Services;
public class MeasuringService
{
public MeasuringService()
{
}
public static bool DaysEqual(DateTime date1, DateTime date2)
=> (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
@ -26,7 +34,7 @@ public class MeasuringService
return string.Empty;
}
public static string GetCustomItemPalletsCssClassNames(string fieldName, MeasuringItemPalletBase shippingItemPallet, bool isMeasurable)
public static string GetCustomItemPalletsCssClassNames(string fieldName, IMeasuringItemPalletBase shippingItemPallet, bool isMeasurable)
{
//if (shippingItemPallet.NetWeight < 0) return "text-danger";
@ -52,6 +60,20 @@ public class MeasuringService
return string.Empty;
}
public static bool IsCustomItemPalletMeasuredAndValid(MeasuringItemPalletBase customItemPallet, bool isMeasurable)
public static OrderItemPallet CreateNewOrderItemPallet(OrderItemDto orderItemDto, CustomerDto? customerDto)
{
var orderItemPallet = new OrderItemPallet
{
OrderItemId = orderItemDto.Id,
OrderItemDto = orderItemDto,
CreatorId = customerDto?.Id,
ModifierId = customerDto?.Id
};
return orderItemPallet;
}
public static bool IsCustomItemPalletMeasuredAndValid(IMeasuringItemPalletBase customItemPallet, bool isMeasurable)
=> customItemPallet.IsMeasuredAndValid(isMeasurable);
}

View File

@ -77,8 +77,11 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<ShippingItemPallet?> UpdateShippingItemPallet(ShippingItemPallet shippingItemPallet)
=> PostDataAsync(SignalRTags.UpdateShippingItemPallet, shippingItemPallet);
public Task<ShippingItemPallet?> AddOrUpdateMeasuredShippingItemPallet(ShippingItemPallet shippingItemPallet)
=> PostDataAsync(SignalRTags.AddOrUpdateMeasuredShippingItemPallet, shippingItemPallet);
public Task<ShippingItem?> AddOrUpdateMeasuredShippingItemPallets(List<ShippingItemPallet> shippingItemPallets)
=> PostDataAsync<List<ShippingItemPallet>, ShippingItem>(SignalRTags.UpdateShippingItemPallet, shippingItemPallets);
=> PostDataAsync<List<ShippingItemPallet>, ShippingItem>(SignalRTags.AddOrUpdateMeasuredShippingItemPallets, shippingItemPallets);
#endregion ShippingItemPallet
@ -134,8 +137,14 @@ namespace FruitBankHybrid.Shared.Services.SignalRs
public Task<List<OrderDto>?> GetPendingOrderDtos()
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetPendingOrderDtos);
public Task<List<OrderDto>?> GetAllByIds(int[] orderIds)
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllByIdList, [orderIds]);
public Task<List<OrderDto>?> GetAllOrderDtoByIds(int[] orderIds)
=> GetAllAsync<List<OrderDto>>(SignalRTags.GetAllOrderDtoByIds, [orderIds]);
public Task<OrderItemPallet?> AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet)
=> PostDataAsync(SignalRTags.AddOrUpdateMeasuredOrderItemPallet, orderItemPallet);
public Task<OrderDto?> SetOrderStatusToComplete(int orderId)
=> GetByIdAsync<OrderDto>(SignalRTags.SetOrderStatusToComplete, orderId);
#endregion Orders
}

View File

@ -73,3 +73,8 @@ h1:focus {
.measuring-form-layout {
margin-top: 15px;
}
.dd-body-class,
.dd-body-class .dxbl-list-box-render-container {
max-height: 600px !important;
}