From 35378d9b0dac1a3522d8ad481194d82913ce23f3 Mon Sep 17 00:00:00 2001 From: Loretta Date: Sat, 11 Oct 2025 07:11:00 +0200 Subject: [PATCH] CustomOrders in progress.... --- .../Controllers/CustomOrderController.cs | 96 +++++++++++++++---- .../Controllers/FruitBankDataController.cs | 1 + .../Factories/CustomOrderModelFactory.cs | 48 +++++----- .../Helpers/CopyModelHelper.cs | 6 +- .../Infrastructure/PluginNopStartup.cs | 11 ++- .../Models/IOrderListModelExtended.cs | 8 ++ .../Models/OrderListModelExtended.cs | 5 +- 7 files changed, 121 insertions(+), 54 deletions(-) create mode 100644 Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs index ba30f4f..2a12772 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs @@ -1,29 +1,64 @@ -using Microsoft.AspNetCore.Mvc; -using Nop.Services.Orders; -using Nop.Web.Areas.Admin.Controllers; -using Nop.Web.Framework.Mvc.Filters; -using Nop.Web.Framework; -using Nop.Web.Areas.Admin.Models.Orders; -using Nop.Services.Security; +using AyCode.Services.SignalRs; +using FruitBank.Common.Server.Interfaces; +using FruitBank.Common.SignalRs; +using Microsoft.AspNetCore.Mvc; using Nop.Plugin.Misc.FruitBankPlugin.Factories; -using Nop.Web.Areas.Admin.Factories; using Nop.Plugin.Misc.FruitBankPlugin.Models; +using Nop.Services.Orders; +using Nop.Services.Security; +using Nop.Web.Areas.Admin.Controllers; +using Nop.Web.Areas.Admin.Factories; +using Nop.Web.Areas.Admin.Models.Orders; +using Nop.Web.Framework; +using Nop.Web.Framework.Mvc.Filters; namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers { + public class CustomOrderService(IOrderService orderService, IOrderModelFactory orderModelFactory) : ICustomOrderControllerServer + { + private readonly IOrderService _orderService = orderService; + private readonly CustomOrderModelFactory _orderModelFactory = orderModelFactory as CustomOrderModelFactory; + + public async Task GetOrderModelsByFilter(OrderSearchModel searchModel) + { + var orderListModel = await _orderModelFactory.PrepareOrderListModelExtendedAsync(searchModel); + + Console.WriteLine($"Total: {orderListModel.RecordsTotal}, Data Count: {orderListModel.Data.Count()}"); + foreach (var item in orderListModel.Data.Take(3)) + { + Console.WriteLine($"Order: {item.Id}, {item.CustomOrderNumber}"); + } + + return orderListModel; + } + + [SignalR(SignalRTags.GetPendingOrderModels)] + public async Task GetPendingOrderModels() + { + var orderSearchModel = new OrderSearchModel + { + OrderStatusIds = new List { 1 } + }; + + return await GetOrderModelsByFilter(orderSearchModel); + } + } + [Area(AreaNames.ADMIN)] [AuthorizeAdmin] - public class CustomOrderController : BaseAdminController + public class CustomOrderController : BaseAdminController, ICustomOrderControllerServer { private readonly IOrderService _orderService; - private readonly IOrderModelFactory _orderModelFactory; + private readonly CustomOrderModelFactory _orderModelFactory; + private readonly ICustomOrderControllerServer _customOrderService; private readonly IPermissionService _permissionService; // ... other dependencies - public CustomOrderController(IOrderService orderService, IOrderModelFactory orderModelFactory, IPermissionService permissionService) + public CustomOrderController(IOrderService orderService, IOrderModelFactory orderModelFactory, ICustomOrderControllerServer customOrderService, IPermissionService permissionService) { _orderService = orderService; - _orderModelFactory = orderModelFactory; + _orderModelFactory = orderModelFactory as CustomOrderModelFactory; + _customOrderService = customOrderService; _permissionService = permissionService; // ... initialize other deps } @@ -44,21 +79,40 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers [HttpPost] [CheckPermission(StandardPermission.Orders.ORDERS_VIEW)] - public virtual async Task OrderList(OrderSearchModel searchModel) + public async Task OrderList(OrderSearchModel searchModel) { //prepare model - var model = await _orderModelFactory.PrepareOrderListModelAsync(searchModel); + var orderListModel = await GetOrderModelsByFilter(searchModel); + + var valami = Json(orderListModel); + Console.WriteLine(valami); + return valami; + } - - Console.WriteLine($"Total: {model.RecordsTotal}, Data Count: {model.Data.Count()}"); - foreach (var item in model.Data.Take(3)) + public async Task GetOrderModelsByFilter(OrderSearchModel searchModel) + { + //return _customOrderService. + var orderListModel = await _orderModelFactory.PrepareOrderListModelExtendedAsync(searchModel); + + Console.WriteLine($"Total: {orderListModel.RecordsTotal}, Data Count: {orderListModel.Data.Count()}"); + foreach (var item in orderListModel.Data.Take(3)) { Console.WriteLine($"Order: {item.Id}, {item.CustomOrderNumber}"); } - var valami = Json(model); - Console.WriteLine(valami); - return valami; - } + + return orderListModel; + } + + [SignalR(SignalRTags.GetPendingOrderModels)] + public async Task GetPendingOrderModels() + { + var orderSearchModel = new OrderSearchModel + { + OrderStatusIds = new List { 1 } + }; + + return await GetOrderModelsByFilter(orderSearchModel); + } public virtual IActionResult Test() { diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index 9f56f9f..605ea48 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -7,6 +7,7 @@ using FruitBank.Common.Interfaces; using FruitBank.Common.Loggers; using FruitBank.Common.Models; using FruitBank.Common.Server; +using FruitBank.Common.Server.Interfaces; using FruitBank.Common.SignalRs; using LinqToDB; using Mango.Nop.Core.Dtos; diff --git a/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs b/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs index 280c2c5..e3a38ba 100644 --- a/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs +++ b/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs @@ -1,12 +1,15 @@ using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; +using Microsoft.AspNetCore.Mvc.TagHelpers; +using Nop.Core; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Common; using Nop.Core.Domain.Directory; using Nop.Core.Domain.Orders; using Nop.Core.Domain.Shipping; using Nop.Core.Domain.Tax; -using Nop.Core; +using Nop.Plugin.Misc.FruitBankPlugin.Helpers; +using Nop.Plugin.Misc.FruitBankPlugin.Models; using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Affiliates; using Nop.Services.Catalog; @@ -28,10 +31,7 @@ using Nop.Services.Tax; using Nop.Services.Vendors; using Nop.Web.Areas.Admin.Factories; using Nop.Web.Areas.Admin.Models.Orders; -using Nop.Plugin.Misc.FruitBankPlugin.Models; using System.Reflection; -using Nop.Plugin.Misc.FruitBankPlugin.Helpers; -using Microsoft.AspNetCore.Mvc.TagHelpers; namespace Nop.Plugin.Misc.FruitBankPlugin.Factories { @@ -166,32 +166,30 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories } public override async Task PrepareOrderListModelAsync(OrderSearchModel searchModel) + =>await base.PrepareOrderListModelAsync(searchModel); + + public async Task PrepareOrderListModelExtendedAsync(OrderSearchModel searchModel) { - // get the default model first - var baseModel = await base.PrepareOrderListModelAsync(searchModel); + var orderListModel = await PrepareOrderListModelAsync(searchModel); + + var orderListModelExtended = new OrderListModelExtended(); + var extendedRows = new List(orderListModel.RecordsFiltered); - var extendedRows = new List(); + CopyModelHelper.CopyPublicProperties(orderListModel, orderListModelExtended); - foreach (var order in baseModel.Data) + foreach (var orderModel in orderListModel.Data) { - var extendedOrder = new OrderModelExtended(); - CopyModelHelper.CopyPublicProperties(order, extendedOrder); - extendedOrder.NeedsMeasurement = await ShouldMarkAsNeedsMeasurementAsync(order); - Console.WriteLine(extendedOrder.Id); - extendedRows.Add(extendedOrder); + var orderModelExtended = new OrderModelExtended(); + CopyModelHelper.CopyPublicProperties(orderModel, orderModelExtended); + + orderModelExtended.NeedsMeasurement = await ShouldMarkAsNeedsMeasurementAsync(orderModel); + + Console.WriteLine(orderModelExtended.Id); + extendedRows.Add(orderModelExtended); } - - //var model = new OrderListModel - //{ - // Data = extendedRows.Cast().ToList(), - // RecordsTotal = baseModel.RecordsTotal - //}; - - var model = new OrderListModel(); - CopyModelHelper.CopyPublicProperties(baseModel, model); - model.Data = extendedRows.ToList(); // Different cast approach - - return model; + + orderListModelExtended.Data = extendedRows; // Different cast approach + return orderListModelExtended; } // example async custom logic diff --git a/Nop.Plugin.Misc.AIPlugin/Helpers/CopyModelHelper.cs b/Nop.Plugin.Misc.AIPlugin/Helpers/CopyModelHelper.cs index 9af2d64..6db71bd 100644 --- a/Nop.Plugin.Misc.AIPlugin/Helpers/CopyModelHelper.cs +++ b/Nop.Plugin.Misc.AIPlugin/Helpers/CopyModelHelper.cs @@ -9,9 +9,9 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Helpers { public static class CopyModelHelper { - public static void CopyPublicProperties(TSource src, TDestination dest) + public static TDestination CopyPublicProperties(TSource src, TDestination dest) { - if (src == null || dest == null) return; + if (src == null || dest == null) return dest; var srcProps = typeof(TSource) .GetProperties(BindingFlags.Public | BindingFlags.Instance) @@ -23,6 +23,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Helpers if (dp == null || !dp.CanWrite) continue; dp.SetValue(dest, sp.GetValue(src)); } + + return dest; } } } diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index 7348f35..48a5883 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -27,7 +27,8 @@ using Nop.Services.Events; using Nop.Web.Areas.Admin.Factories; using Nop.Web.Areas.Admin.Models.Catalog; using Nop.Web.Areas.Admin.Models.Orders; -using FruitBankDataController = Nop.Plugin.Misc.FruitBankPlugin.Controllers.FruitBankDataController; +using FruitBank.Common.Server.Interfaces; +using Nop.Plugin.Misc.FruitBankPlugin.Controllers; namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; @@ -73,9 +74,11 @@ public class PluginNopStartup : INopStartup services.AddScoped, EventConsumer>(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + + //services.AddScoped(); + //services.AddScoped(); + //services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs new file mode 100644 index 0000000..5df5da5 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs @@ -0,0 +1,8 @@ +using Nop.Web.Framework.Models; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models; + +public interface IOrderListModelExtended: IPagedModel where T : BaseNopModel +{ + public bool? NeedsMeasurement { get; set; } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs index 79217ee..6e6998a 100644 --- a/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs +++ b/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs @@ -1,10 +1,11 @@ using Nop.Web.Areas.Admin.Models.Orders; +using Nop.Web.Framework.Models; namespace Nop.Plugin.Misc.FruitBankPlugin.Models { - public partial record OrderListModelExtended : OrderListModel + public partial record OrderListModelExtended : BasePagedListModel, IOrderListModelExtended { public bool? NeedsMeasurement { get; set; } - } + } }