Impoelement DriverManageTransfersPageModel; improvements, fixes, etc...

This commit is contained in:
Loretta 2024-08-19 19:03:03 +02:00
parent fa85155b57
commit 919ea8b691
7 changed files with 203 additions and 63 deletions

View File

@ -32,6 +32,7 @@ using TIAM.Database.DbSets.Drivers;
using AyCode.Entities.Server.LogItems;
using AyCode.Interfaces.Entities;
using TIAM.Models.Dtos.Users;
using TIAM.Models.PageViewModels;
namespace TIAM.Database.DataLayers.Admins
{
@ -60,6 +61,19 @@ namespace TIAM.Database.DataLayers.Admins
public Task<List<Transfer>> GetTransfersByProductIdAsync(Guid productId) => SessionAsync(ctx => ctx.GetTransfersByProductId(productId).OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList());
public Task<List<Transfer>> GetTransfersByUserProductMappingIdAsync(Guid userProductMappingId) => SessionAsync(ctx => ctx.GetTransfersByUserProductMappingId(userProductMappingId).OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList());
/// <summary>
///
/// </summary>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
public Task<DriverManageTransfersPageModel> GetDriverManageTransfersPageModelByDriverId(Guid driverId) => SessionAsync(ctx =>
{
var transfers = ctx.GetTransfersByUserProductMappingId(driverId).OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId);
var unreadedMessagesCount = GetTransfersMessagesByDriverIdInnerAsync(ctx, driverId)?.Count(x => !x.IsReaded) ?? 0;
return new DriverManageTransfersPageModel(transfers, unreadedMessagesCount);
});
public Task<List<Transfer>> GetTransfersAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList());
public Task<string> GetTransfersJsonAsync() => SessionAsync(ctx => ctx.GetTransfers().OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToJson());
public Task<List<Transfer>> GetTransfersByUserIdAsync(Guid userId) => SessionAsync(ctx => ctx.GetTransfersByUserId(userId).OrderBy(x => x.TransferStatusType).ThenByDescending(x => x.OrderId).ToList());
@ -323,31 +337,40 @@ namespace TIAM.Database.DataLayers.Admins
public Task<List<EmailMessage>> GetAllEmailMessagesAsync() => SessionAsync(ctx => ctx.GetAllEmailMessages<EmailMessage, EmailRecipient>().OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesByUserId(Guid userId)
{
return SessionAsync(ctx =>
{
return ctx.GetEmailMessagesByIds<EmailMessage, EmailRecipient>(ctx.GetUserProductMappingsByUserId(userId).Select(x => x.Id).Concat([userId])).ToList();
});
}
=> SessionAsync(ctx => ctx.GetEmailMessagesByIds<EmailMessage, EmailRecipient>(ctx.GetUserProductMappingsByUserId(userId).Select(x => x.Id).Concat([userId])).ToList());
/// <summary>
///
/// </summary>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
public Task<List<EmailMessage>> GetTransfersMessagesByDriverIdAsync(Guid driverId)
=> SessionAsync(ctx => GetTransfersMessagesByDriverIdInnerAsync(ctx, driverId)?.OrderByDescending(x => x.Created).ToList() ?? []);
/// <summary>
///
/// </summary>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
public Task<List<EmailMessage>> GetTransfersMessagesByDriverIdAsync(Guid driverId) => SessionAsync(ctx =>
public Task<int> GetTransfersMessagesUnreadedCountByDriverIdAsync(Guid driverId)
=> SessionAsync(ctx => GetTransfersMessagesByDriverIdInnerAsync(ctx, driverId)?.Count(x => !x.IsReaded) ?? 0);
/// <summary>
///
/// </summary>
/// <param name="ctx"></param>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
private static IQueryable<EmailMessage>? GetTransfersMessagesByDriverIdInnerAsync(AdminDbContext ctx, Guid driverId)
{
//TODO: Az upm.UserId elvben nem kell, csak amíg nem fix a db! semmilyen gondot nem okoz... - J.
var upm = ctx.GetUserProductMappingById(driverId);
if (upm == null) return [];
if (upm == null) return default;
//return ctx.GetEmailMessages<EmailMessage, EmailRecipient>(driverId) //TODO: jövőben elég lesz a driverId is és mehet vissza ez a sor! - J.
return ctx.GetEmailMessagesByUserIdOrUpmId<EmailMessage, EmailRecipient>(upm.UserId, driverId)
.Where(emailMessage => ctx.TransferToDrivers.Any(transferToDriver => transferToDriver.TransferId == emailMessage.ContextId && transferToDriver.UserProductMappingId == driverId))
.OrderByDescending(x => x.Created)
.ToList();
});
.Where(emailMessage => ctx.TransferToDrivers.Any(transferToDriver => transferToDriver.TransferId == emailMessage.ContextId && transferToDriver.UserProductMappingId == driverId));
}
public Task<bool> AddEmailMessageAsync(EmailMessage emailMessage)
=> TransactionAsync(ctx => ctx.AddEmailMessage(emailMessage));

View File

@ -0,0 +1,90 @@
using AyCode.Blazor.Models.ViewModels;
using Newtonsoft.Json;
using TIAM.Core.Enums;
using TIAM.Entities.Transfers;
namespace TIAM.Models.PageViewModels;
public class DriverManageTransfersPageModel : AcPageViewModelBase
{
private readonly object _forLock = new();
public int UnreadedMessagesCount { get; set; }
public List<Transfer> Transfers { get; set; } = [];
private readonly List<Transfer> _upcomings = [];
private readonly List<Transfer> _problems = [];
/// <summary>
/// Value set on the client side!
/// </summary>
[JsonIgnore]
public List<Transfer> Upcomings
{
get
{
lock (_forLock)
{
if (_upcomings.Count > 0) return _upcomings;
var localNow = DateTime.Now;
_upcomings.AddRange(Transfers.Where(x => x.Appointment >= localNow));
}
return _upcomings;
}
}
/// <summary>
/// Value set on the client side!
/// </summary>
[JsonIgnore]
public List<Transfer> Problems
{
get
{
lock (_forLock)
{
if (_problems.Count > 0) return _problems;
var localNow = DateTime.Now;
var localNowAddedThreeHour = localNow.AddHours(3);
_problems.AddRange(Transfers.Where(x => x.Appointment < localNowAddedThreeHour && x.TransferStatusType != TransferStatusType.Finished));
}
return _problems;
}
}
public DriverManageTransfersPageModel()
{
}
public DriverManageTransfersPageModel(IEnumerable<Transfer> transfers, int unreadedMessagesCount)
{
Initialize(transfers, unreadedMessagesCount);
}
public void Initialize(DriverManageTransfersPageModel? driverManageTransfersPageModel)
{
if (driverManageTransfersPageModel == null) return;
Initialize(driverManageTransfersPageModel.Transfers, driverManageTransfersPageModel.UnreadedMessagesCount);
}
public void Initialize(IEnumerable<Transfer> transfers, int unreadedMessagesCount)
{
lock (_forLock)
{
Transfers.Clear();
Transfers.AddRange(transfers.Where(t => t.TransferStatusType != TransferStatusType.UserCanceled && t.TransferStatusType != TransferStatusType.AdminDenied));
Upcomings.Clear();
Problems.Clear();
}
UnreadedMessagesCount = unreadedMessagesCount;
}
}

View File

@ -9,9 +9,13 @@
<ItemGroup>
<Folder Include="Dtos\Profiles\" />
<Folder Include="Dtos\UserProductMappings\" />
<Folder Include="GridViewModels\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Aycode.Blazor\AyCode.Blazor.Components\AyCode.Blazor.Components.csproj" />
<ProjectReference Include="..\..\Aycode.Blazor\AyCode.Blazor.Models\AyCode.Blazor.Models.csproj" />
<ProjectReference Include="..\..\Aycode.Blazor\AyCode.Maui.Core\AyCode.Maui.Core.csproj" />
<ProjectReference Include="..\TIAM.Core\TIAM.Core.csproj" />
<ProjectReference Include="..\TIAM.Entities\TIAM.Entities.csproj" />
</ItemGroup>

View File

@ -13,6 +13,7 @@ public class SignalRTags : AcSignalRTags
public const int GetTransfersByCompanyId = 6;
public const int GetTransfersByUserProductMappingId = 701;
public const int GetTransfersByOrderingProductId = 702;
public const int GetDriverManageTransfersPageModelByDriverId = 703;
public const int GetTransfersByFilterText = 301;

View File

@ -22,8 +22,10 @@
@using AyCode.Core.Consts
@using AyCode.Core
@using AyCode.Core.Helpers
@using AyCode.Services.SignalRs
@using DevExpress.Data.Filtering
@using TIAM.Entities.Emails
@using TIAM.Models.PageViewModels
@using TIAMSharedUI.Shared.Components.BaseComponents
@inherits UserBasePageComponent
@layout AdminLayout
@ -32,6 +34,7 @@
@inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService
@inject ISessionService sessionService
@inject DriverManageTransfersPageModel PageModel;
@inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle>
@ -72,15 +75,14 @@
<div class=" col-12">
<DxTabs>
<DxTabPage Text="Upcoming">
<DxTabPage Text="@($"Upcoming({PageModel.Upcomings.Count})")">
<DxAccordion ExpandMode="ExpandMode"
ExpandCollapseAction="ExpandCollapseAction"
AnimationType="LayoutAnimationType.Slide">
<Items>
@foreach (var (transfer, i) in Upcoming)
@foreach (var transfer in PageModel.Upcomings)
{
<DxAccordionItem CssClass="@GetCustomColor(transfer.TransferStatusType)" Text=@($"{transfer.Appointment} - {transfer.FromAddress}") Expanded=@(i == 0)>
<DxAccordionItem CssClass="@GetCustomColor(transfer.TransferStatusType)" Text=@($"{transfer.Appointment} - {transfer.FromAddress} [#{transfer.OrderId}]")>
<ContentTemplate>
<div class="py-3 px-3">
<TransferCardComponent DataChanged="RefreshComponent" Context="@transfer" />
@ -91,7 +93,33 @@
</Items>
</DxAccordion>
</DxTabPage>
<DxTabPage Text="@($"Messages({PageModel.UnreadedMessagesCount})")">
<div class="d-flex flex-column mb-4 pb-2">
<MessageDetailGridComponent ContextId="driverId" GetAllMessageTag="SignalRTags.GetTransfersMessagesByDriverId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</div>
</DxTabPage>
<DxTabPage Text="@($"Problems({PageModel.Problems.Count})")">
<DxAccordion ExpandMode="ExpandMode"
ExpandCollapseAction="ExpandCollapseAction"
AnimationType="LayoutAnimationType.Slide">
<Items>
@foreach (var transfer in PageModel.Problems)
{
<DxAccordionItem CssClass="@GetCustomColor(transfer.TransferStatusType)" Text=@($"{transfer.Appointment} - {transfer.FromAddress} [#{transfer.OrderId}]")>
<ContentTemplate>
<div class="py-3 px-3">
<TransferCardComponent DataChanged="RefreshComponent" Context="@transfer" />
</div>
</ContentTemplate>
</DxAccordionItem>
}
</Items>
</DxAccordion>
</DxTabPage>
<DxTabPage Text="Calendar">
<div class="d-flex flex-column mb-4 pb-2">
<DxScheduler @bind-StartDate="@StartDate"
@ -108,35 +136,6 @@
</DxScheduler>
</div>
</DxTabPage>
<DxTabPage Text="Messages">
<div class="d-flex flex-column mb-4 pb-2">
<MessageDetailGridComponent ContextId="driverId" GetAllMessageTag="SignalRTags.GetTransfersMessagesByDriverId" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</div>
</DxTabPage>
<DxTabPage Text="Problems">
<DxAccordion ExpandMode="ExpandMode"
ExpandCollapseAction="ExpandCollapseAction"
AnimationType="LayoutAnimationType.Slide">
<Items>
@foreach (var (transfer, i) in Problems)
{
<DxAccordionItem CssClass="@GetCustomColor(transfer.TransferStatusType)" Text=@($"{transfer.Appointment} - {transfer.FromAddress}") Expanded=@(i == 0)>
<ContentTemplate>
<div class="py-3 px-3">
<TransferCardComponent DataChanged="RefreshComponent" Context="@transfer" />
</div>
</ContentTemplate>
</DxAccordionItem>
}
</Items>
</DxAccordion>
</DxTabPage>
<DxTabPage Text="History">
<div class="d-flex flex-column mb-4 pb-2">
@ -186,10 +185,6 @@
private TransferGrid _gridTransfer;
private bool _popupVisible;
private List<Transfer>? transfers = [];
IEnumerable<(Transfer, int)> Upcoming = [];
IEnumerable<(Transfer, int)> Problems = [];
AccordionExpandMode ExpandMode { get; set; } = AccordionExpandMode.SingleOrNone;
AccordionExpandCollapseAction ExpandCollapseAction { get; set; } = AccordionExpandCollapseAction.HeaderClick;
@ -299,8 +294,6 @@
{
driverId = DriverId;
// transfers = await AdminSignalRClient.GetByIdAsync<List<Transfer>>(SignalRTags.GetTransfersByUserProductMappingId, DriverId);
}
void SendMail(Transfer item)
@ -390,23 +383,35 @@
}
//readonly DriverManageTransfersPageModel PageModel = new();
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<DriverManageTransfers>(LogWriters.ToArray());
if (transfers != null)
{
var test = DriverId.ToString();
var result = await AdminSignalRClient.GetByIdAsync<List<Transfer>>(SignalRTags.GetTransfersByUserProductMappingId, DriverId);
transfers = result.Where(t => t.TransferStatusType != TransferStatusType.UserCanceled && t.TransferStatusType != TransferStatusType.AdminDenied).ToList();
Upcoming = transfers.Where(x => x.Appointment >= DateTime.Now).Select((item, index) => (item, index));
Problems = transfers.Where(x => x.Appointment < DateTime.Now && x.TransferStatusType != TransferStatusType.Finished).Select((item, index) => (item, index));
InitializeAppointments(transfers);
}
InitializePage(DriverId);
await base.OnInitializedAsync();
}
private void InitializePage(Guid driverId2)
{
AdminSignalRClient.GetByIdAsync<DriverManageTransfersPageModel>(SignalRTags.GetDriverManageTransfersPageModelByDriverId, response=>
{
if (response.Status == SignalResponseStatus.Error || response.ResponseData == null)
{
_logger.Error("response.Status == SignalResponseStatus.Error || response.ResponseData == null");
return Task.CompletedTask;
}
PageModel.Initialize(response.ResponseData);
InitializeAppointments(PageModel.Transfers);
StateHasChanged();
return Task.CompletedTask;
}, driverId2).Forget();
}
private void GroupTransfers(List<Transfer> transferDataList)
{

View File

@ -13,6 +13,7 @@ using TIAMWebApp.Shared.Application.Utility;
using AyCode.Services.Loggers;
using System.Net;
using Microsoft.AspNetCore.Components.Authorization;
using TIAM.Models.PageViewModels;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
@ -29,6 +30,7 @@ builder.Services.AddScoped<ISecureStorageHandler, SecureStorageHandler>();
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddSingleton<ISessionService, SessionServiceWeb>();
builder.Services.AddSingleton<DriverManageTransfersPageModel>();
builder.Services.AddSingleton<IComponentUpdateService, ComponentUpdateServiceWeb>();
builder.Services.AddScoped<IServiceProviderDataService, ServiceProviderDataService>();

View File

@ -34,6 +34,7 @@ using TIAM.Entities.Products;
using AyCode.Core.Enums;
using TIAM.Core.Consts;
using System.Security.Cryptography.Xml;
using TIAM.Models.PageViewModels;
namespace TIAMWebApp.Server.Controllers
{
@ -724,6 +725,20 @@ namespace TIAMWebApp.Server.Controllers
return result.ToJson();
}
/// <summary>
///
/// </summary>
/// <param name="driverId">UserProductMappingId</param>
/// <returns></returns>
[NonAction]
[SignalR(SignalRTags.GetDriverManageTransfersPageModelByDriverId)]
public async Task<DriverManageTransfersPageModel> GetDriverManageTransfersPageModelByDriverId(Guid driverId)
{
_logger.Debug($"GetTransferByDriverId called; userProductMappingId: {driverId}");
return await _adminDal.GetDriverManageTransfersPageModelByDriverId(driverId);
}
[AllowAnonymous]
[HttpPost]