CustomOrders in progress....

This commit is contained in:
Loretta 2025-10-11 07:11:00 +02:00
parent 2b6e022f8b
commit 35378d9b0d
7 changed files with 121 additions and 54 deletions

View File

@ -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<OrderListModelExtended> 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<OrderListModelExtended> GetPendingOrderModels()
{
var orderSearchModel = new OrderSearchModel
{
OrderStatusIds = new List<int> { 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<IActionResult> OrderList(OrderSearchModel searchModel)
public async Task<IActionResult> 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<OrderListModelExtended> 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<OrderListModelExtended> GetPendingOrderModels()
{
var orderSearchModel = new OrderSearchModel
{
OrderStatusIds = new List<int> { 1 }
};
return await GetOrderModelsByFilter(orderSearchModel);
}
public virtual IActionResult Test()
{

View File

@ -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;

View File

@ -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<OrderListModel> PrepareOrderListModelAsync(OrderSearchModel searchModel)
=>await base.PrepareOrderListModelAsync(searchModel);
public async Task<OrderListModelExtended> 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<OrderModelExtended>(orderListModel.RecordsFiltered);
var extendedRows = new List<OrderModelExtended>();
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<OrderModel>().ToList(),
// RecordsTotal = baseModel.RecordsTotal
//};
var model = new OrderListModel();
CopyModelHelper.CopyPublicProperties(baseModel, model);
model.Data = extendedRows.ToList<OrderModel>(); // Different cast approach
return model;
orderListModelExtended.Data = extendedRows; // Different cast approach
return orderListModelExtended;
}
// example async custom logic

View File

@ -9,9 +9,9 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Helpers
{
public static class CopyModelHelper
{
public static void CopyPublicProperties<TSource, TDestination>(TSource src, TDestination dest)
public static TDestination CopyPublicProperties<TSource, TDestination>(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;
}
}
}

View File

@ -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<IConsumer<OrderPlacedEvent>, EventConsumer>();
services.AddScoped<IOrderMeasurementService, OrderMeasurementService>();
services.AddScoped<PendingMeasurementCheckoutFilter>();
services.AddScoped<OrderListModel, OrderListModelExtended>();
services.AddScoped<OrderModel, OrderModelExtended>();
services.AddScoped<OrderSearchModel, OrderSearchModelExtended>();
//services.AddScoped<OrderListModel, OrderListModelExtended>();
//services.AddScoped<OrderModel, OrderModelExtended>();
//services.AddScoped<OrderSearchModel, OrderSearchModelExtended>();
services.AddScoped<IOrderModelFactory, CustomOrderModelFactory>();
services.AddScoped<IGenericAttributeService, GenericAttributeService>();
services.AddScoped<CerebrasAPIService>();

View File

@ -0,0 +1,8 @@
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models;
public interface IOrderListModelExtended<T>: IPagedModel<T> where T : BaseNopModel
{
public bool? NeedsMeasurement { get; set; }
}

View File

@ -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<OrderModelExtended>, IOrderListModelExtended<OrderModelExtended>
{
public bool? NeedsMeasurement { get; set; }
}
}
}