From 0199467f72b61f672d76b62b8d9abf08e38d96a7 Mon Sep 17 00:00:00 2001 From: trencik91 Date: Wed, 3 Sep 2025 15:04:22 +0200 Subject: [PATCH] * Extended of Dtos * Added new Services and Controllers --- .../EdiCustomerOrderImportController.cs | 19 ++++++++++ .../EdiCustomerOrdersController.cs | 2 +- FaKrosnoApi/Controllers/EdiLogController.cs | 19 ++++++++++ FaKrosnoApi/Program.cs | 29 +++++++------- FaKrosnoApi/appsettings.json | 2 +- .../Dtos/EdiCustomerOrderDto.cs | 3 ++ SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs | 11 ++++++ SytelineSaAppEfDataModel/Entities/EdiLog.cs | 11 ++++++ SytelineSaAppEfDataModel/MappingProfile.cs | 1 + .../Services/EdiCustomerOrderImportService.cs | 16 ++++++++ .../Services/EdiCustomerOrderService.cs | 17 +++++---- .../Services/EdiLogService.cs | 15 ++++++++ .../IEdiCustomerOrderImportService.cs | 4 ++ .../Services/IEdiLogService.cs | 8 ++++ .../SytelineSaAppDbContext.cs | 38 +++++++++++++++++++ 15 files changed, 172 insertions(+), 23 deletions(-) create mode 100644 FaKrosnoApi/Controllers/EdiLogController.cs create mode 100644 SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs create mode 100644 SytelineSaAppEfDataModel/Entities/EdiLog.cs create mode 100644 SytelineSaAppEfDataModel/Services/EdiLogService.cs create mode 100644 SytelineSaAppEfDataModel/Services/IEdiLogService.cs diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs index 1f59aee..a73553f 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrderImportController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; using SytelineSaAppEfDataModel.Services; namespace FaKrosnoApi.Controllers; @@ -13,4 +14,22 @@ public class EdiCustomerOrderImportController(IEdiCustomerOrderImportService ser DateTime lastUpdateDate = await service.GetLastUpdateDate(); return Ok(lastUpdateDate); } + + [HttpPost] + public async Task Add([FromBody] EdiCustomerOrderImportDto ediCustomerOrderImport) + { + var result = await service.AddEdiCustomerOrderImport(ediCustomerOrderImport); + return result + ? Ok("Utworzono rekord w tabeli EdiCustomerOrderImport.") + : BadRequest($"Nie mogę utworzyć rekordu w tabeli EdiCustomerOrderImport."); + } + + [HttpPost("add-bulk")] + public async Task Add([FromBody] IList ediCustomerOrderImports) + { + var result = await service.AddEdiCustomerOrderImports(ediCustomerOrderImports); + return result + ? Ok("Utworzono rekordy w tabeli EdiCustomerOrderImport.") + : BadRequest($"Nie mogę utworzyć rekordów w tabeli EdiCustomerOrderImport."); + } } \ No newline at end of file diff --git a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs index d11a1b5..b690cc6 100644 --- a/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs +++ b/FaKrosnoApi/Controllers/EdiCustomerOrdersController.cs @@ -55,7 +55,7 @@ namespace FaKrosnoApi.Controllers var result = await service.SaveOrdersWithDetails(ediCustomerOrders); return result.Item1 - ? Ok("Orders saved successfully.") + ? Ok(result) : BadRequest($"Failed to save orders. Error: {result.Item2}"); } } diff --git a/FaKrosnoApi/Controllers/EdiLogController.cs b/FaKrosnoApi/Controllers/EdiLogController.cs new file mode 100644 index 0000000..5af8a40 --- /dev/null +++ b/FaKrosnoApi/Controllers/EdiLogController.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Mvc; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Services; + +namespace FaKrosnoApi.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class EdiLogController(IEdiLogService service) : Controller +{ + [HttpPost] + public async Task Add([FromBody] EdiLogDto ediLog) + { + var result = await service.AddEdiLog(ediLog); + return result + ? Ok("Utworzono rekord w tabeli EdiLog.") + : BadRequest($"Nie mogę utworzyć rekordu w tabeli EdiLog."); + } +} \ No newline at end of file diff --git a/FaKrosnoApi/Program.cs b/FaKrosnoApi/Program.cs index 476fa0e..b5efa89 100644 --- a/FaKrosnoApi/Program.cs +++ b/FaKrosnoApi/Program.cs @@ -66,19 +66,19 @@ builder.Services.AddOpenApiDocument(config => config.OperationProcessors.Add(new OperationSecurityScopeProcessor("Bearer")); }); -// builder.Services.AddHangfire(config => config -// .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) -// .UseSimpleAssemblyNameTypeSerializer() -// .UseRecommendedSerializerSettings() -// .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions -// { -// CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), -// SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), -// QueuePollInterval = TimeSpan.Zero, -// UseRecommendedIsolationLevel = true, -// DisableGlobalLocks = true -// })); -// builder.Services.AddHangfireServer(); +builder.Services.AddHangfire(config => config + .SetDataCompatibilityLevel(CompatibilityLevel.Version_170) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings() + .UseSqlServerStorage(builder.Configuration.GetConnectionString("OrdersManagementConnection"), new SqlServerStorageOptions + { + CommandBatchMaxTimeout = TimeSpan.FromMinutes(5), + SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5), + QueuePollInterval = TimeSpan.Zero, + UseRecommendedIsolationLevel = true, + DisableGlobalLocks = true + })); +builder.Services.AddHangfireServer(); builder.Services.AddAutoMapper(typeof(FaKrosnoMappingProfile), typeof(SytelineSaAppMappingProfile), typeof(OrdersManagementMappingProfile)); @@ -108,6 +108,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHostedService(); @@ -125,6 +126,6 @@ app.UseAuthorization(); app.MapControllers(); -//app.UseHangfireDashboard(); +app.UseHangfireDashboard(); app.Run(); diff --git a/FaKrosnoApi/appsettings.json b/FaKrosnoApi/appsettings.json index a907f3a..afce1d8 100644 --- a/FaKrosnoApi/appsettings.json +++ b/FaKrosnoApi/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "FaKrosnoConnection": "Server=192.168.0.7;Database=fakrosno;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", - "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PROD_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", + "SytelineSaAppConnection": "Server=192.168.0.7;Database=SL_PRODTEST_SA_APP;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true", "OrdersManagementConnection": "Server=192.168.0.7;Database=OrdersManagement;User Id=sa;Password=Tetum#2021!;TrustServerCertificate=true" }, "Logging": { diff --git a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs index 0986ca9..ed84d72 100644 --- a/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs +++ b/SytelineSaAppEfDataModel/Dtos/EdiCustomerOrderDto.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using AutoMapper.Configuration.Annotations; namespace SytelineSaAppEfDataModel.Dtos { @@ -105,6 +106,8 @@ namespace SytelineSaAppEfDataModel.Dtos public string TranslatedStatus => TranslateStatus(Status ?? string.Empty); public string? SlOrderNumber => EdiCustomerOrderTranslates.MaxBy(x => x.CreatedDate)?.CoCoNum; public string SentToSl => Posted == 1 ? "TAK" : "NIE"; + [Ignore] public int ScheduleOrderId { get; set; } + [Ignore] public DateTime LastUpdateDate { get; set; } public IEnumerable EdiCustomerOrderLines { get; set; } = new List(); public IEnumerable EdiCustomerOrderTranslates { get; set; } = new List(); diff --git a/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs b/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs new file mode 100644 index 0000000..9953e01 --- /dev/null +++ b/SytelineSaAppEfDataModel/Dtos/EdiLogDto.cs @@ -0,0 +1,11 @@ +namespace SytelineSaAppEfDataModel.Dtos; + +public class EdiLogDto +{ + public int Id { get; set; } + public string ProcessName { get; set; } + public string ConfigurationName { get; set; } + public int Status { get; set; } + public string LogText { get; set; } + public DateTime Date { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Entities/EdiLog.cs b/SytelineSaAppEfDataModel/Entities/EdiLog.cs new file mode 100644 index 0000000..602b935 --- /dev/null +++ b/SytelineSaAppEfDataModel/Entities/EdiLog.cs @@ -0,0 +1,11 @@ +namespace SytelineSaAppEfDataModel.Entities; + +public class EdiLog +{ + public int Id { get; set; } + public string ProcessName { get; set; } + public string ConfigurationName { get; set; } + public int Status { get; set; } + public string LogText { get; set; } + public DateTime Date { get; set; } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/MappingProfile.cs b/SytelineSaAppEfDataModel/MappingProfile.cs index 9a27cfa..f7dbb77 100644 --- a/SytelineSaAppEfDataModel/MappingProfile.cs +++ b/SytelineSaAppEfDataModel/MappingProfile.cs @@ -31,6 +31,7 @@ namespace SytelineSaAppEfDataModel CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs index edf9e36..9118519 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderImportService.cs @@ -1,5 +1,7 @@ using AutoMapper; using Microsoft.EntityFrameworkCore; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; namespace SytelineSaAppEfDataModel.Services; @@ -10,4 +12,18 @@ public class EdiCustomerOrderImportService(SytelineSaAppDbContext context, IMapp return (await context.EdiCustomerOrderImports.OrderByDescending(x => x.LastUpdateDate) .FirstOrDefaultAsync())?.LastUpdateDate ?? DateTime.Now.Date; } + + public async Task AddEdiCustomerOrderImport(EdiCustomerOrderImportDto ediCustomerOrderImport) + { + var entity = mapper.Map(ediCustomerOrderImport); + await context.EdiCustomerOrderImports.AddAsync(entity); + return await context.SaveChangesAsync() > 0; + } + + public async Task AddEdiCustomerOrderImports(IList ediCustomerOrderImports) + { + var entities = mapper.Map>(ediCustomerOrderImports); + context.EdiCustomerOrderImports.AddRange(entities); + return await context.SaveChangesAsync() > 0; + } } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs index d2836be..1876637 100644 --- a/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs +++ b/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs @@ -149,13 +149,16 @@ namespace SytelineSaAppEfDataModel.Services try { - await context.EdiCustomerOrders.AddRangeAsync(ediCustomerOrders.Select(mapper.Map)); - await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrders - .SelectMany(x => x.EdiCustomerOrderLines) - .Select(mapper.Map)); - await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrders - .SelectMany(x => x.EdiCustomerOrderLines) - .SelectMany(y => y.EdiCustomerOrderLineItems).Select(mapper.Map)); + IList customerOrders = ediCustomerOrders.Select(mapper.Map).ToList(); + IList ediCustomerOrderLines = ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines).Select(mapper.Map).ToList(); + IList ediCustomerOrderLineItems = ediCustomerOrders + .SelectMany(x => x.EdiCustomerOrderLines).SelectMany(y => y.EdiCustomerOrderLineItems) + .Select(mapper.Map).ToList(); + + await context.EdiCustomerOrders.AddRangeAsync(customerOrders); + await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrderLines); + await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrderLineItems); await context.EdiCustomerOrderTranslates.AddRangeAsync(ediCustomerOrders .SelectMany(x => x.EdiCustomerOrderTranslates) .Select(mapper.Map)); diff --git a/SytelineSaAppEfDataModel/Services/EdiLogService.cs b/SytelineSaAppEfDataModel/Services/EdiLogService.cs new file mode 100644 index 0000000..2672925 --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/EdiLogService.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using SytelineSaAppEfDataModel.Dtos; +using SytelineSaAppEfDataModel.Entities; + +namespace SytelineSaAppEfDataModel.Services; + +public class EdiLogService(SytelineSaAppDbContext context, IMapper mapper) : IEdiLogService +{ + public async Task AddEdiLog(EdiLogDto ediLog) + { + var entity = mapper.Map(ediLog); + await context.EdiLogs.AddAsync(entity); + return await context.SaveChangesAsync() > 0; + } +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs index 12c0cb8..b621444 100644 --- a/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs +++ b/SytelineSaAppEfDataModel/Services/IEdiCustomerOrderImportService.cs @@ -1,6 +1,10 @@ +using SytelineSaAppEfDataModel.Dtos; + namespace SytelineSaAppEfDataModel.Services; public interface IEdiCustomerOrderImportService { Task GetLastUpdateDate(); + Task AddEdiCustomerOrderImport(EdiCustomerOrderImportDto ediCustomerOrderImport); + Task AddEdiCustomerOrderImports(IList ediCustomerOrderImports); } \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/Services/IEdiLogService.cs b/SytelineSaAppEfDataModel/Services/IEdiLogService.cs new file mode 100644 index 0000000..bdb653c --- /dev/null +++ b/SytelineSaAppEfDataModel/Services/IEdiLogService.cs @@ -0,0 +1,8 @@ +using SytelineSaAppEfDataModel.Dtos; + +namespace SytelineSaAppEfDataModel.Services; + +public interface IEdiLogService +{ + Task AddEdiLog(EdiLogDto ediLog); +} \ No newline at end of file diff --git a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs index 8495b6f..41c790a 100644 --- a/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs +++ b/SytelineSaAppEfDataModel/SytelineSaAppDbContext.cs @@ -30,6 +30,7 @@ namespace SytelineSaAppEfDataModel public DbSet Items { get; set; } public DbSet VatCodeAssociations { get; set; } public DbSet ItemCustPriceAlls { get; set; } + public DbSet EdiLogs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -2468,6 +2469,43 @@ namespace SytelineSaAppEfDataModel .HasDatabaseName("IX_itemcustprice_all_RowPointer") .IsUnique(); }); + + modelBuilder.Entity(entity => + { + entity.ToTable("edi_logs"); + + entity.HasKey(e => e.Id); + + entity.Property(e => e.Id) + .HasColumnName("Id") + .HasColumnType("int") + .IsRequired(); + + entity.Property(e => e.ProcessName) + .HasColumnName("ProcessName") + .HasMaxLength(200) + .IsRequired(); + + entity.Property(e => e.ConfigurationName) + .HasColumnName("ConfigurationName") + .HasMaxLength(200) + .IsRequired(); + + entity.Property(e => e.Status) + .HasColumnName("Status") + .HasColumnType("int") + .IsRequired(); + + entity.Property(e => e.LogText) + .HasColumnName("LogText") + .HasColumnType("varchar(max)") + .IsRequired(); + + entity.Property(e => e.Date) + .HasColumnName("Date") + .HasColumnType("datetime") + .IsRequired(); + }); } } }