This commit is contained in:
Adam 2024-08-19 19:26:43 +02:00
commit 491b7a9669
8 changed files with 203 additions and 60 deletions

View File

@ -32,6 +32,7 @@ using TIAM.Database.DbSets.Drivers;
using AyCode.Entities.Server.LogItems; using AyCode.Entities.Server.LogItems;
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using TIAM.Models.Dtos.Users; using TIAM.Models.Dtos.Users;
using TIAM.Models.PageViewModels;
namespace TIAM.Database.DataLayers.Admins 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>> 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()); 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<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<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()); 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>> GetAllEmailMessagesAsync() => SessionAsync(ctx => ctx.GetAllEmailMessages<EmailMessage, EmailRecipient>().OrderByDescending(x => x.Created).ToList());
public Task<List<EmailMessage>> GetEmailMessagesByUserId(Guid userId) public Task<List<EmailMessage>> GetEmailMessagesByUserId(Guid userId)
{ => SessionAsync(ctx => ctx.GetEmailMessagesByIds<EmailMessage, EmailRecipient>(ctx.GetUserProductMappingsByUserId(userId).Select(x => x.Id).Concat([userId])).ToList());
return SessionAsync(ctx =>
{ /// <summary>
return ctx.GetEmailMessagesByIds<EmailMessage, EmailRecipient>(ctx.GetUserProductMappingsByUserId(userId).Select(x => x.Id).Concat([userId])).ToList(); ///
}); /// </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>
/// ///
/// </summary> /// </summary>
/// <param name="driverId">UserProductMappingId</param> /// <param name="driverId">UserProductMappingId</param>
/// <returns></returns> /// <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. //TODO: Az upm.UserId elvben nem kell, csak amíg nem fix a db! semmilyen gondot nem okoz... - J.
var upm = ctx.GetUserProductMappingById(driverId); 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.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) return ctx.GetEmailMessagesByUserIdOrUpmId<EmailMessage, EmailRecipient>(upm.UserId, driverId)
.Where(emailMessage => ctx.TransferToDrivers.Any(transferToDriver => transferToDriver.TransferId == emailMessage.ContextId && transferToDriver.UserProductMappingId == driverId)) .Where(emailMessage => ctx.TransferToDrivers.Any(transferToDriver => transferToDriver.TransferId == emailMessage.ContextId && transferToDriver.UserProductMappingId == driverId));
.OrderByDescending(x => x.Created) }
.ToList();
});
public Task<bool> AddEmailMessageAsync(EmailMessage emailMessage) public Task<bool> AddEmailMessageAsync(EmailMessage emailMessage)
=> TransactionAsync(ctx => ctx.AddEmailMessage(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> <ItemGroup>
<Folder Include="Dtos\Profiles\" /> <Folder Include="Dtos\Profiles\" />
<Folder Include="Dtos\UserProductMappings\" /> <Folder Include="Dtos\UserProductMappings\" />
<Folder Include="GridViewModels\" />
</ItemGroup> </ItemGroup>
<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.Core\TIAM.Core.csproj" />
<ProjectReference Include="..\TIAM.Entities\TIAM.Entities.csproj" /> <ProjectReference Include="..\TIAM.Entities\TIAM.Entities.csproj" />
</ItemGroup> </ItemGroup>

View File

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

View File

@ -22,8 +22,10 @@
@using AyCode.Core.Consts @using AyCode.Core.Consts
@using AyCode.Core @using AyCode.Core
@using AyCode.Core.Helpers @using AyCode.Core.Helpers
@using AyCode.Services.SignalRs
@using DevExpress.Data.Filtering @using DevExpress.Data.Filtering
@using TIAM.Entities.Emails @using TIAM.Entities.Emails
@using TIAM.Models.PageViewModels
@using TIAMSharedUI.Shared.Components.BaseComponents @using TIAMSharedUI.Shared.Components.BaseComponents
@inherits UserBasePageComponent @inherits UserBasePageComponent
@layout AdminLayout @layout AdminLayout
@ -32,6 +34,7 @@
@inject IWizardProcessor wizardProcessor @inject IWizardProcessor wizardProcessor
@inject ITransferDataService transferDataService @inject ITransferDataService transferDataService
@inject ISessionService sessionService @inject ISessionService sessionService
@inject DriverManageTransfersPageModel PageModel;
@inject AdminSignalRClient AdminSignalRClient; @inject AdminSignalRClient AdminSignalRClient;
<PageTitle>Transfers</PageTitle> <PageTitle>Transfers</PageTitle>
@ -72,34 +75,14 @@
<div class=" col-12"> <div class=" col-12">
<DxTabs> <DxTabs>
<DxTabPage Text="Upcoming"> <DxTabPage Text="@($"Upcoming({PageModel.Upcomings.Count})")">
<DxAccordion ExpandMode="ExpandMode" <DxAccordion ExpandMode="ExpandMode"
ExpandCollapseAction="ExpandCollapseAction" ExpandCollapseAction="ExpandCollapseAction"
AnimationType="LayoutAnimationType.Slide"> AnimationType="LayoutAnimationType.Slide">
<Items> <Items>
@foreach (var (transfer, i) in Upcoming) @foreach (var transfer in PageModel.Upcomings)
{ {
<DxAccordionItem CssClass="@GetCustomColor(transfer.TransferStatusType)" Text=@($"{transfer.Appointment} - {transfer.FromAddress} [#{transfer.OrderId}]")>
<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="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> <ContentTemplate>
<div class="py-3 px-3"> <div class="py-3 px-3">
<TransferCardComponent DataChanged="RefreshComponent" Context="@transfer" /> <TransferCardComponent DataChanged="RefreshComponent" Context="@transfer" />
@ -111,6 +94,31 @@
</DxAccordion> </DxAccordion>
</DxTabPage> </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"> <DxTabPage Text="Calendar">
<div class="d-flex flex-column mb-4 pb-2"> <div class="d-flex flex-column mb-4 pb-2">
@ -159,12 +167,6 @@
</div> </div>
</DxTabPage> </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>
</DxTabs> </DxTabs>
</div> </div>
@ -183,10 +185,6 @@
private TransferGrid _gridTransfer; private TransferGrid _gridTransfer;
private bool _popupVisible; private bool _popupVisible;
private List<Transfer>? transfers = [];
IEnumerable<(Transfer, int)> Upcoming = [];
IEnumerable<(Transfer, int)> Problems = [];
AccordionExpandMode ExpandMode { get; set; } = AccordionExpandMode.SingleOrNone; AccordionExpandMode ExpandMode { get; set; } = AccordionExpandMode.SingleOrNone;
AccordionExpandCollapseAction ExpandCollapseAction { get; set; } = AccordionExpandCollapseAction.HeaderClick; AccordionExpandCollapseAction ExpandCollapseAction { get; set; } = AccordionExpandCollapseAction.HeaderClick;
@ -296,8 +294,6 @@
{ {
driverId = DriverId; driverId = DriverId;
// transfers = await AdminSignalRClient.GetByIdAsync<List<Transfer>>(SignalRTags.GetTransfersByUserProductMappingId, DriverId); // transfers = await AdminSignalRClient.GetByIdAsync<List<Transfer>>(SignalRTags.GetTransfersByUserProductMappingId, DriverId);
} }
void SendMail(Transfer item) void SendMail(Transfer item)
@ -387,23 +383,35 @@
} }
//readonly DriverManageTransfersPageModel PageModel = new();
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
_logger = new LoggerClient<DriverManageTransfers>(LogWriters.ToArray()); _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(); 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) private void GroupTransfers(List<Transfer> transferDataList)
{ {

View File

@ -237,10 +237,10 @@
var transferToDriverEditModel = (TransferToDriver)args.EditModel; var transferToDriverEditModel = (TransferToDriver)args.EditModel;
if (transferToDriverEditModel.UserProductMappingId.IsNullOrEmpty() || transferToDriverEditModel.CarId.IsNullOrEmpty() || if (transferToDriverEditModel.UserProductMappingId.IsNullOrEmpty() || transferToDriverEditModel.CarId.IsNullOrEmpty() ||
transferToDriverEditModel.LicencePlate.IsNullOrWhiteSpace() || transferToDriverEditModel.Price <= 0) transferToDriverEditModel.LicencePlate.IsNullOrWhiteSpace())// || transferToDriverEditModel.Price <= 0)
{ {
args.Cancel = true; args.Cancel = true;
_logger.Error($"transferToDriverEditModel.UserProductMappingId.IsNullOrEmpty() || transferToDriverEditModel.CarId.IsNullOrEmpty() || transferToDriverEditModel.LicencePlate.IsNullOrWhiteSpace() || transferToDriverEditModel.Price <= 0"); _logger.Error($"transferToDriverEditModel.UserProductMappingId.IsNullOrEmpty() || transferToDriverEditModel.CarId.IsNullOrEmpty() || transferToDriverEditModel.LicencePlate.IsNullOrWhiteSpace()");// || transferToDriverEditModel.Price <= 0");
} }
if (args.IsNew) if (args.IsNew)

View File

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

View File

@ -34,6 +34,7 @@ using TIAM.Entities.Products;
using AyCode.Core.Enums; using AyCode.Core.Enums;
using TIAM.Core.Consts; using TIAM.Core.Consts;
using System.Security.Cryptography.Xml; using System.Security.Cryptography.Xml;
using TIAM.Models.PageViewModels;
namespace TIAMWebApp.Server.Controllers namespace TIAMWebApp.Server.Controllers
{ {
@ -600,6 +601,20 @@ namespace TIAMWebApp.Server.Controllers
return result.ToJson(); 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] [AllowAnonymous]
[HttpPost] [HttpPost]