Add CargoPartner and CargoTruck support (API & DB)

- Introduced CargoPartnerDbTable and CargoTruckDbTable with DI registration.
- Extended FruitBankDbContext for new entities.
- Added CRUD SignalR endpoints for CargoPartner and CargoTruck.
- Renamed PartnerDbTable.GetByIdNameAsync to GetByNameAsync.
- Minor code style improvements.
This commit is contained in:
Loretta 2026-05-29 12:16:57 +02:00
parent 8020131c0e
commit 2a8dfeaca9
6 changed files with 112 additions and 22 deletions

View File

@ -137,21 +137,19 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
return await ctx.Partners.GetByIdAsync(partner.Id, partner.ShippingDocuments != null);
}
[SignalR(SignalRTags.GetCargoPartners)]
public async Task<List<CargoPartner>> GetCargoPartners()
{
_logger.Detail($"GetCargoPartners invoked");
return [];// await ctx.CargoPartners.GetAll().ToListAsync();
return await ctx.CargoPartners.GetAll().ToListAsync();
}
[SignalR(SignalRTags.GetCargoPartnerById)]
public async Task<CargoPartner> GetCargoPartnerById(int id)
{
_logger.Detail($"GetCargoPartnerById invoked; id: {id}");
return null;//await ctx.CargoPartners.GetByIdAsync(id);
return await ctx.CargoPartners.GetByIdAsync(id);
}
[SignalR(SignalRTags.AddCargoPartner)]
@ -161,8 +159,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
_logger.Detail($"AddCargoPartner invoked; id: {cargoPartner.Id}");
//await ctx.CargoPartners.InsertAsync(cargoPartner);
return null;// await ctx.Partners.GetByIdAsync(cargoPartner.Id, cargoPartner.ShippingDocuments != null);
await ctx.CargoPartners.InsertAsync(cargoPartner);
return await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.CargoTrucks != null);
}
[SignalR(SignalRTags.UpdateCargoPartner)]
@ -172,11 +170,47 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
_logger.Detail($"UpdateCargoPartner invoked; id: {cargoPartner.Id}");
//await ctx.CargoPartners.UpdateAsync(cargoPartner);
return null;//await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.ShippingDocuments != null);
await ctx.CargoPartners.UpdateAsync(cargoPartner);
return await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.CargoTrucks != null);
}
[SignalR(SignalRTags.GetCargoTrucks)]
public async Task<List<CargoTruck>> GetCargoTrucks()
{
_logger.Detail($"GetCargoTrucks invoked");
return await ctx.CargoTrucks.GetAll().ToListAsync();
}
[SignalR(SignalRTags.GetCargoTruckById)]
public async Task<CargoTruck> GetCargoTruckById(int id)
{
_logger.Detail($"GetCargoTruckById invoked; id: {id}");
return await ctx.CargoTrucks.GetByIdAsync(id);
}
[SignalR(SignalRTags.AddCargoTruck)]
public async Task<CargoTruck> AddCargoTruck(CargoTruck cargoTruck)
{
ArgumentNullException.ThrowIfNull(cargoTruck);
_logger.Detail($"AddCargoTruck invoked; id: {cargoTruck.Id}");
await ctx.CargoTrucks.InsertAsync(cargoTruck);
return await ctx.CargoTrucks.GetByIdAsync(cargoTruck.Id);
}
[SignalR(SignalRTags.UpdateCargoTruck)]
public async Task<CargoTruck> UpdateCargoTruck(CargoTruck cargoTruck)
{
ArgumentNullException.ThrowIfNull(cargoTruck);
_logger.Detail($"UpdateCargoTruck invoked; id: {cargoTruck.Id}");
await ctx.CargoTrucks.UpdateAsync(cargoTruck);
return await ctx.CargoTrucks.GetByIdAsync(cargoTruck.Id);
}
[SignalR(SignalRTags.GetShippings)]
public async Task<List<Shipping>> GetShippings()

View File

@ -0,0 +1,28 @@
using FruitBank.Common.Entities;
using LinqToDB;
using Mango.Nop.Data.Repositories;
using Nop.Core.Caching;
using Nop.Core.Configuration;
using Nop.Core.Events;
using Nop.Data;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class CargoPartnerDbTable : MgDbTableBase<CargoPartner>
{
public CargoPartnerDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings)
{
}
public override IOrderedQueryable<CargoPartner> GetAll() => base.GetAll().OrderBy(p => p.Name);
public IQueryable<CargoPartner> GetAll(bool loadRelations)
{
return loadRelations ? GetAll().LoadWith(sd => sd.CargoTrucks) : GetAll();
}
public Task<CargoPartner> GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id);
public Task<CargoPartner> GetByNameAsync(string name, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name);
}

View File

@ -0,0 +1,26 @@
using FruitBank.Common.Entities;
using Mango.Nop.Data.Repositories;
using Nop.Core.Caching;
using Nop.Core.Configuration;
using Nop.Core.Events;
using Nop.Data;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class CargoTruckDbTable : MgDbTableBase<CargoTruck>
{
public CargoTruckDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings)
{
}
public override IOrderedQueryable<CargoTruck> GetAll() => base.GetAll().OrderBy(p => p.CargoPartnerId);
public IQueryable<CargoTruck> GetAll(bool loadRelations)
{
return GetAll();
//return loadRelations ? GetAll().LoadWith(sd => sd.CargoTrucks) : GetAll();
}
public Task<CargoTruck> GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id);
}

View File

@ -55,6 +55,9 @@ public class FruitBankDbContext : MgDbContextBase,
public OrderItemDtoDbTable OrderItemDtos { get; set; }
public PartnerDbTable Partners { get; set; }
public CargoPartnerDbTable CargoPartners { get; set; }
public CargoTruckDbTable CargoTrucks{ get; set; }
public ShippingDbTable Shippings { get; set; }
public ShippingDocumentDbTable ShippingDocuments { get; set; }
public ShippingItemDbTable ShippingItems { get; set; }
@ -78,7 +81,7 @@ public class FruitBankDbContext : MgDbContextBase,
public IRepository<StockQuantityHistoryExt> StockQuantityHistoriesExt { get; set; }
public FruitBankDbContext(INopDataProvider dataProvider, ILockService lockService, FruitBankAttributeService fruitBankAttributeService, IStoreContext storeContext,
PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingDocumentDbTable shippingDocumentDbTable, ShippingItemDbTable shippingItemDbTable,
CargoPartnerDbTable cargoPartnerDbTable, CargoTruckDbTable cargoTruckDbTable, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingDocumentDbTable shippingDocumentDbTable, ShippingItemDbTable shippingItemDbTable,
ShippingItemPalletDbTable shippingItemPalletDbTable, FilesDbTable filesDbTable, ShippingDocumentToFilesDbTable shippingDocumentToFilesDbTable,
ProductDtoDbTable productDtoDbTable, OrderDtoDbTable orderDtoDbTable, OrderItemDtoDbTable orderItemDtoDbTable, OrderItemPalletDbTable orderItemPalletDbTable,
StockQuantityHistoryDtoDbTable stockQuantityHistoryDtos, CustomerCreditDbTable customerCreditDbTable,
@ -105,7 +108,9 @@ public class FruitBankDbContext : MgDbContextBase,
Files = filesDbTable;
Partners = partnerDbTable;
CargoPartners = cargoPartnerDbTable;
CargoTrucks = cargoTruckDbTable;
ProductDtos = productDtoDbTable;
OrderDtos = orderDtoDbTable;
@ -225,8 +230,7 @@ public class FruitBankDbContext : MgDbContextBase,
return Task.FromResult(false);
}
public Task<bool> AddShippingItemSafeAsync(ShippingItem shippingItem)
=> TransactionSafeAsync(async _ => await AddShippingItemAsync(shippingItem));
public Task<bool> AddShippingItemSafeAsync(ShippingItem shippingItem) => TransactionSafeAsync(async _ => await AddShippingItemAsync(shippingItem));
public async Task<bool> AddShippingItemAsync(ShippingItem shippingItem)
{
@ -251,8 +255,7 @@ public class FruitBankDbContext : MgDbContextBase,
return true;
}
public Task<bool> UpdateShippingItemSafeAsync(ShippingItem shippingItem)
=> TransactionSafeAsync(async _ => await UpdateShippingItemAsync(shippingItem));
public Task<bool> UpdateShippingItemSafeAsync(ShippingItem shippingItem) => TransactionSafeAsync(async _ => await UpdateShippingItemAsync(shippingItem));
public async Task<bool> UpdateShippingItemAsync(ShippingItem shippingItem)
{

View File

@ -16,8 +16,7 @@ public class PartnerDbTable : MgDbTableBase<Partner>
{
}
public override IOrderedQueryable<Partner> GetAll()
=> base.GetAll().OrderBy(p => p.Name);
public override IOrderedQueryable<Partner> GetAll() => base.GetAll().OrderBy(p => p.Name);
public IQueryable<Partner> GetAll(bool loadRelations)
{
@ -29,10 +28,7 @@ public class PartnerDbTable : MgDbTableBase<Partner>
: GetAll();
}
public Task<Partner> GetByIdAsync(int id, bool loadRelations)
=> GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id);
public Task<Partner> GetByIdNameAsync(string name, bool loadRelations)
=> GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name);
public Task<Partner> GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id);
public Task<Partner> GetByNameAsync(string name, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name);
}

View File

@ -78,6 +78,9 @@ public class PluginNopStartup : INopStartup
services.AddScoped<OrderItemPalletDbTable>();
services.AddScoped<PartnerDbTable>();
services.AddScoped<CargoPartnerDbTable>();
services.AddScoped<CargoTruckDbTable>();
services.AddScoped<ShippingDbTable>();
services.AddScoped<ShippingDocumentDbTable>();
services.AddScoped<ShippingItemDbTable>();