diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index d7f16e7..e66ec5d 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -1,4 +1,5 @@ -using AyCode.Core.Loggers; +using AyCode.Core.Extensions; +using AyCode.Core.Loggers; using AyCode.Services.SignalRs; using DocumentFormat.OpenXml.Office2010.Excel; using FruitBank.Common.Dtos; @@ -17,6 +18,7 @@ using Nop.Core; using Nop.Core.Domain.Customers; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; using Nop.Plugin.Misc.FruitBankPlugin.Factories; +using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Customers; using Nop.Services.Localization; using Nop.Web.Framework.Controllers; @@ -27,6 +29,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers //https://linq2db.github.io/articles/sql/Join-Operators.html public class FruitBankDataController( FruitBankDbContext ctx, + MeasurementService measurementService, IWorkContext workContext, ICustomerService customerService, ICustomerRegistrationService customerRegistrationService, @@ -36,6 +39,11 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { private readonly ILogger _logger = new Logger(logWriters.ToArray()); + [SignalR(SignalRTags.ProcessAndSaveFullShippingJson)] + public async Task> ProcessAndSaveFullShippingJson(string fullShippingJson, int customerId) + { + return await measurementService.ProcessAndSaveFullShippingJson(fullShippingJson, customerId); + } [SignalR(SignalRTags.GetMeasuringModels)] public Task> GetMeasuringModels() @@ -127,6 +135,17 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return shippingItem; } + [SignalR(SignalRTags.AddShippingItem)] + public async Task AddShippingItem(ShippingItem shippingItem) + { + ArgumentNullException.ThrowIfNull(shippingItem); + + _logger.Detail($"AddShippingItem invoked; id: {shippingItem.Id}"); + + if (!await ctx.AddShippingItemAsync(shippingItem)) return null; + return await ctx.ShippingItems.GetByIdAsync(shippingItem.Id, shippingItem.ShippingDocument != null); + } + [SignalR(SignalRTags.UpdateShippingItem)] public async Task UpdateShippingItem(ShippingItem shippingItem) { @@ -218,6 +237,17 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return await ctx.ShippingDocuments.GetByIdAsync(id, true); } + [SignalR(SignalRTags.AddShippingDocument)] + public async Task AddShippingDocument(ShippingDocument shippingDocument) + { + ArgumentNullException.ThrowIfNull(shippingDocument); + + _logger.Detail($"AddShippingDocument invoked; id: {shippingDocument.Id}"); + + await ctx.ShippingDocuments.InsertAsync(shippingDocument); + return await ctx.ShippingDocuments.GetByIdAsync(shippingDocument.Id, shippingDocument.Shipping != null || shippingDocument.Partner != null); + } + [SignalR(SignalRTags.UpdateShippingDocument)] public async Task UpdateShippingDocument(ShippingDocument shippingDocument) { diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index bef2367..1d2311b 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -152,6 +152,25 @@ public class FruitBankDbContext : MgDbContextBase, //public async Task GetMeasuringAttributeValuesByProductIdAsync(int productId) // => await _fruitBankAttributeService.GetMeasuringAttributeValuesAsync(productId); + //public async Task> ProcessAndSaveFullShippingDocumentJson(string fullShippingDocumentJson) + //{ + // var partners = fullShippingDocumentJson.JsonTo>(); + // if (partners != null) + // { + // foreach (var partner in partners) + // { + // //await Partners.InsertAsync(partner); + // if (partner.ShippingDocuments == null) continue; + + // foreach (var shippingDocument in partner.ShippingDocuments) + // { + // await ShippingDocuments.InsertAsync(shippingDocument); + + // } + // } + // } + //} + public async Task DeleteShippingSafeAsync(Shipping shipping) { await TransactionSafeAsync(async _ => @@ -186,6 +205,14 @@ public class FruitBankDbContext : MgDbContextBase, Logger.Error("shippingItem.IsMeasurable && !shippingItem.IsValidMeasuringValues()"); return Task.FromResult(false); } + public Task AddShippingItemSafeAsync(ShippingItem shippingItem) + => TransactionSafeAsync(async _ => await AddShippingItemAsync(shippingItem)); + + public async Task AddShippingItemAsync(ShippingItem shippingItem) + { + await ShippingItems.InsertAsync(shippingItem); + return true; + } public Task UpdateShippingItemSafeAsync(ShippingItem shippingItem) => TransactionSafeAsync(async _ => await UpdateShippingItemAsync(shippingItem)); @@ -268,7 +295,7 @@ public class FruitBankDbContext : MgDbContextBase, } //if (productIdUnchanged || !dbShippingItem.IsMeasured) return true; - if (!productIdChanged && (shippingItem.IsMeasured || !dbShippingItem.IsMeasured)) return true; + if (!dbShippingItem.ProductId.HasValue || (!productIdChanged && (shippingItem.IsMeasured || !dbShippingItem.IsMeasured))) return true; productDto = await ProductDtos.GetByIdAsync(dbShippingItem.ProductId!.Value, true); diff --git a/Nop.Plugin.Misc.AIPlugin/Services/MeasurementService.cs b/Nop.Plugin.Misc.AIPlugin/Services/MeasurementService.cs index 10fe2dd..c21fabe 100644 --- a/Nop.Plugin.Misc.AIPlugin/Services/MeasurementService.cs +++ b/Nop.Plugin.Misc.AIPlugin/Services/MeasurementService.cs @@ -1,4 +1,5 @@ -using AyCode.Core.Loggers; +using AyCode.Core.Extensions; +using AyCode.Core.Loggers; using AyCode.Services.Server.SignalRs; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; @@ -7,7 +8,9 @@ using FruitBank.Common.Server.Services.SignalRs; using FruitBank.Common.Services; using Mango.Nop.Core.Extensions; using Mango.Nop.Core.Loggers; +using Microsoft.CodeAnalysis.Operations; using Nop.Core.Domain.Catalog; +using Nop.Core.Domain.Common; using Nop.Core.Domain.Orders; using Nop.Core.Events; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; @@ -21,6 +24,7 @@ public class MeasurementService : MeasurementServiceBase, IMeasurementSe { private readonly FruitBankDbContext _dbContext; private readonly IEventPublisher _eventPublisher; + private readonly FruitBankAttributeService _fruitBankAttributeService; private readonly SignalRSendToClientService _signalRSendToClientService; private readonly CustomPriceCalculationService _customPriceCalculationService; @@ -29,11 +33,11 @@ public class MeasurementService : MeasurementServiceBase, IMeasurementSe { _dbContext = dbContext; _eventPublisher = eventPublisher; + _fruitBankAttributeService = fruitBankAttributeService; _signalRSendToClientService = signalRSendToClientService; _customPriceCalculationService = (CustomPriceCalculationService)customPriceCalculationService; } - public async Task DeleteOrderItemConstraintsAsync(int orderItemId) => await DeleteOrderItemConstraintsAsync(await _dbContext.OrderItems.GetByIdAsync(orderItemId)); public async Task DeleteOrderItemConstraintsAsync(OrderItem orderItem) @@ -73,6 +77,8 @@ public class MeasurementService : MeasurementServiceBase, IMeasurementSe var result = await _dbContext.TransactionSafeAsync(async _ => { + await _fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(order.Id, nameof(IOrderDto.RevisorId), 0); + foreach (var orderItemPallet in orderItemPallets) { orderItemPallet.RevisorId = 0; @@ -93,4 +99,49 @@ public class MeasurementService : MeasurementServiceBase, IMeasurementSe await _signalRSendToClientService.SendOrderChanged(await _dbContext.OrderDtos.GetByIdAsync(orderItem.OrderId, true)); return result; } + + public async Task?> ProcessAndSaveFullShippingJson(string fullShippingJson, int customerId) + { + var partners = fullShippingJson.JsonTo>(); + if (partners == null || partners.Count == 0) return partners; + + var a = partners.SelectMany(x => x.ShippingDocuments?.SelectMany(sd => sd.ShippingItems?.Where(si => si.ProductId.GetValueOrDefault(0) > 0).Select(si => si.ProductId!.Value) ?? []) ?? []).ToHashSet(); + var productDtosById = await _dbContext.ProductDtos.GetAllByIds(a, false, false).ToDictionaryAsync(k => k.Id, v => v); + + var result = await _dbContext.TransactionSafeAsync(async _ => + { + foreach (var partner in partners) + { + //await _dbContext.Partners.InsertAsync(partner, false); + if (partner.ShippingDocuments == null) continue; + + foreach (var shippingDocument in partner.ShippingDocuments) + { + //shippingDocument.PartnerId = 0; + await _dbContext.ShippingDocuments.InsertAsync(shippingDocument, false); + + if (shippingDocument.ShippingItems == null) continue; + + foreach (var shippingItem in shippingDocument.ShippingItems) + { + if (shippingItem.ProductId != null && productDtosById.TryGetValue(shippingItem.ProductId.Value, out var productDto)) + { + shippingItem.Name = productDto.Name; + shippingItem.IsMeasurable = productDto.IsMeasurable; + + //TODO: Update Product Incoming attribute! - J. + } + else shippingItem.ProductId = null; + + shippingItem.ShippingDocumentId = shippingDocument.Id; + await _dbContext.ShippingItems.InsertAsync(shippingItem, false); + } + } + } + + return true; + }); + + return result ? partners : null; + } } \ No newline at end of file