From c8434ed10f6dcc81b88de940bdd30a15a1a79ace Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 20 Oct 2025 16:46:47 +0200 Subject: [PATCH] Add MeasurementOwnerId; RevisorId generic attributes to Order; improvements, fixes, etc.. --- .../Controllers/CustomOrderController.cs | 4 +- .../Controllers/CustomOrderSignalREndpoint.cs | 24 ++++++++---- .../Controllers/ManagementPageController.cs | 2 +- .../Domains/DataLayer/FruitBankDbContext.cs | 37 +++++++++++++++---- .../Domains/DataLayer/OrderDtoDbTable.cs | 3 +- 5 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs index 72ac2c1..4b9e7c2 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs @@ -72,7 +72,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers [NonAction] public Task> GetAllOrderDtos() => _customOrderSignalREndpoint.GetAllOrderDtos(); [NonAction]public Task GetOrderDtoById(int orderId) => _customOrderSignalREndpoint.GetOrderDtoById(orderId); [NonAction]public Task> GetPendingOrderDtos() => _customOrderSignalREndpoint.GetPendingOrderDtos(); - [NonAction]public Task SetOrderStatusToComplete(int orderId) => _customOrderSignalREndpoint.SetOrderStatusToComplete(orderId); + [NonAction] public Task StartMeasuring(int orderId, int userId) => _customOrderSignalREndpoint.StartMeasuring(orderId, userId); + [NonAction]public Task SetOrderStatusToComplete(int orderId, int revisorId) => _customOrderSignalREndpoint.SetOrderStatusToComplete(orderId, revisorId); [NonAction] public Task> GetAllOrderDtoByIds(int[] orderIds) => _customOrderSignalREndpoint.GetAllOrderDtoByIds(orderIds); [NonAction] public Task AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet) => _customOrderSignalREndpoint.AddOrUpdateMeasuredOrderItemPallet(orderItemPallet); #endregion CustomOrderSignalREndpoint @@ -403,7 +404,6 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers return Json(result); } - //[HttpPost] //public async Task CreateInvoice(int orderId) //{ diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderSignalREndpoint.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderSignalREndpoint.cs index 6c81853..7a0373f 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderSignalREndpoint.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderSignalREndpoint.cs @@ -26,7 +26,7 @@ public class CustomOrderSignalREndpoint(FruitBankDbContext ctx, IWorkContext wor [SignalR(SignalRTags.GetOrderDtoById)] public async Task GetOrderDtoById(int orderId) { - return await ctx.OrderDtos.GetByIdAsync(orderId); + return await ctx.OrderDtos.GetByIdAsync(orderId, true); } [SignalR(SignalRTags.GetPendingOrderDtos)] @@ -41,13 +41,22 @@ public class CustomOrderSignalREndpoint(FruitBankDbContext ctx, IWorkContext wor return await ctx.OrderDtos.GetAllByIds(orderIds).ToListAsync(); } - [SignalR(SignalRTags.SetOrderStatusToComplete)] - public async Task SetOrderStatusToComplete(int orderId) + [SignalR(SignalRTags.StartMeasuring)] + public async Task StartMeasuring(int orderId, int userId) { - _logger.Detail($"SetOrderStatusToComplete invoked; orderId: {orderId}"); + _logger.Detail($"StartMeasuring invoked; orderId: {orderId}; userId: {userId}"); - if (!await ctx.SetOrderStatusToCompleteSafe(orderId)) return null; - return await ctx.OrderDtos.GetByIdAsync(orderId); + if (!await ctx.StartMeasuringSafeAsync(orderId, userId)) return null; + return await ctx.OrderDtos.GetByIdAsync(orderId, true); + } + + [SignalR(SignalRTags.SetOrderStatusToComplete)] + public async Task SetOrderStatusToComplete(int orderId, int revisorId) + { + _logger.Detail($"SetOrderStatusToComplete invoked; orderId: {orderId}; revisorId: {revisorId}"); + + if (!await ctx.SetOrderStatusToCompleteSafeAsync(orderId, revisorId)) return null; + return await ctx.OrderDtos.GetByIdAsync(orderId, true); } [SignalR(SignalRTags.AddOrUpdateMeasuredOrderItemPallet)] @@ -55,8 +64,7 @@ public class CustomOrderSignalREndpoint(FruitBankDbContext ctx, IWorkContext wor { ArgumentNullException.ThrowIfNull(orderItemPallet); - var customer = await workContext.GetCurrentCustomerAsync(); - _logger.Detail($"AddOrUpdateMeasuredOrderItemPallet invoked; {orderItemPallet}; CustomerId: {customer?.Id}"); + _logger.Detail($"AddOrUpdateMeasuredOrderItemPallet invoked; {orderItemPallet}"); if (!await ctx.AddOrUpdateOrderItemPalletSafeAsync(orderItemPallet)) return null; return await ctx.OrderItemPallets.GetByIdAsync(orderItemPallet.Id, false); diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/ManagementPageController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/ManagementPageController.cs index 7d0eb92..a4e1e1e 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/ManagementPageController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/ManagementPageController.cs @@ -32,7 +32,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers public ManagementPageController(IPermissionService permissionService, FruitBankDbContext fruitBankDbContext, AICalculationService aiCalculationService, OpenAIApiService openAIApiService, IEnumerable logWriters) { - _logger = new Logger(logWriters.ToArray()); + _logger = new Logger(logWriters.ToArray()); _permissionService = permissionService; _dbContext = fruitBankDbContext; diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index fecb101..ab669c2 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -1,4 +1,5 @@ #nullable enable +using AyCode.Core.Extensions; using AyCode.Core.Loggers; using AyCode.Utils.Extensions; using FruitBank.Common.Entities; @@ -371,20 +372,38 @@ public class FruitBankDbContext : MgDbContextBase, return true; }); } + public async Task StartMeasuringSafeAsync(int orderId, int revisorId) + => await TransactionSafeAsync(async _ => await StartMeasuringAsync(orderId, revisorId) != null); - public async Task SetOrderStatusToCompleteSafe(int orderId) - => await TransactionSafeAsync(async _ => await SetOrderStatusToComplete(orderId) != null); - - public async Task SetOrderStatusToComplete(int orderId) + public async Task StartMeasuringAsync(int orderId, int customerId) { - var orderDto = await OrderDtos.GetByIdAsync(orderId); + if (customerId <= 0) return null; + + var orderDto = await OrderDtos.GetByIdAsync(orderId, true); + if (orderDto == null || orderDto.MeasurementOwnerId > 0) return orderDto; + + await _fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(orderDto.Id, nameof(IOrderDto.MeasurementOwnerId), customerId); + + return orderDto; + } + + public async Task SetOrderStatusToCompleteSafeAsync(int orderId, int revisorId) + => await TransactionSafeAsync(async _ => await SetOrderStatusToCompleteAsync(orderId, revisorId) != null); + + public async Task SetOrderStatusToCompleteAsync(int orderId, int revisorId) + { + if (revisorId <= 0) return null; + + var orderDto = await OrderDtos.GetByIdAsync(orderId, true); if (orderDto == null) return null; - if (!orderDto.IsMeasured || orderDto.OrderStatus == OrderStatus.Complete) return null; //throw new Exception($"SetOrderDtoToComplete; orderDto.IsMeasured == false; {orderDto}"); + if (!orderDto.IsMeasuredAndValid() || orderDto.OrderStatus == OrderStatus.Complete) return null; //throw new Exception($"SetOrderDtoToComplete; orderDto.IsMeasured == false; {orderDto}"); orderDto.OrderStatus = OrderStatus.Complete; await OrderDtos.UpdateAsync(orderDto); + await _fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(orderDto.Id, nameof(IOrderDto.RevisorId), revisorId); + foreach (var orderItemDto in orderDto.OrderItemDtos) { if (!orderItemDto.IsMeasurable) continue; @@ -443,7 +462,11 @@ public class FruitBankDbContext : MgDbContextBase, if (orderItemPallet.OrderItemDto?.ProductDto == null) orderItemDto = await OrderItemDtos.GetByIdAsync(orderItemPallet.OrderItemId, true); else orderItemDto = orderItemPallet.OrderItemDto; - if (orderItemDto == null || orderItemPallet.OrderItemId != orderItemDto.Id) return false; + if (orderItemDto == null || orderItemPallet.OrderItemId != orderItemDto.Id || //orderItemDto.IsOtherMeasuringInProgress(orderItemPallet.CreatorId) || + orderItemPallet.TrayQuantity > orderItemDto.Quantity || !orderItemPallet.IsValidSafeMeasuringValues()) return false; + + orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false); + if (orderItemDto.TrayQuantity > orderItemDto.Quantity) return false; orderItemPallet.SetupCustomItemPalletMeauringValues(orderItemDto.IsMeasurable); return true; diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs index 174096c..7168056 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs @@ -30,7 +30,8 @@ public class OrderDtoDbTable : MgDtoDbTableBase public Task GetByIdAsync(int orderId, bool loadRelations) => GetAll(loadRelations).Where(x => x.Id == orderId).FirstOrDefaultAsync(null); - public IQueryable GetAllByOrderStatus(OrderStatus orderStatus, bool loadRelations = true) => GetAll(loadRelations).Where(o => o.OrderStatusId == (int)orderStatus); + public IQueryable GetAllByOrderStatus(OrderStatus orderStatus, bool loadRelations = true) + => GetAll(loadRelations);//.Where(o => o.OrderStatusId == (int)orderStatus); public IQueryable GetAllByIds(IEnumerable orderIds, bool loadRelations = true) => GetAll(loadRelations).Where(o => orderIds.Contains(o.Id)); }