Files
FA_WEB/SytelineSaAppEfDataModel/Services/EdiCustomerOrderService.cs
2025-01-24 13:37:01 +01:00

115 lines
5.8 KiB
C#

using AutoMapper;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System.Data;
using SytelineSaAppEfDataModel.Dtos;
using SytelineSaAppEfDataModel.Entities;
namespace SytelineSaAppEfDataModel.Services
{
public class EdiCustomerOrderService(SytelineSaAppDbContext context, IMapper mapper) : IEdiCustomerOrderService
{
public async Task<IEnumerable<EdiCustomerOrderDto>> GetAll()
{
IList<EdiCustomerOrderTranslateDto> ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates
.Select(x => mapper.Map<EdiCustomerOrderTranslateDto>(x)).ToListAsync();
IList<EdiCustomerOrderDto> ediCustomerOrders =
await context.EdiCustomerOrders.Select(x => mapper.Map<EdiCustomerOrderDto>(x)).ToListAsync();
IDictionary<string, List<EdiCustomerOrderTranslateDto>> ediTranslatesByCoNumber = ediCustomerOrderTranslates
.GroupBy(x => x.EdiCoCoNum).ToDictionary(x => x.Key, y => y.ToList());
foreach (EdiCustomerOrderDto ediCustomerOrder in ediCustomerOrders)
{
if (!ediTranslatesByCoNumber.TryGetValue(ediCustomerOrder.CustomerOrderNumber,
out List<EdiCustomerOrderTranslateDto>? customerOrderTranslates)) continue;
customerOrderTranslates = customerOrderTranslates.OrderByDescending(x => x.CreatedDate).ToList();
ediCustomerOrder.EdiCustomerOrderTranslates = customerOrderTranslates;
}
return ediCustomerOrders;
}
public async Task<IEnumerable<EdiCustomerOrderDto?>> GetByDate(DateTime date)
{
IList<EdiCustomerOrderDto?> customerOrders = new List<EdiCustomerOrderDto?>();
IList<string> orderNumbers = await context.EdiCustomerOrders.Where(x => x.CreateDate > date)
.Select(x => x.CustomerOrderNumber).ToListAsync();
foreach (string orderNumber in orderNumbers)
{
customerOrders.Add(await GetByOrderNumber(orderNumber));
}
return customerOrders;
}
public async Task<EdiCustomerOrderDto?> GetByOrderNumber(string customerOrderNumber)
{
IList<EdiCustomerOrderLineDto> ediCustomerOrderLines = await context.EdiCustomerOrderLines
.Where(x => x.CustomerOrderNumber == customerOrderNumber)
.Select(x => mapper.Map<EdiCustomerOrderLineDto>(x)).ToListAsync();
foreach (EdiCustomerOrderLineDto ediCustomerOrderLine in ediCustomerOrderLines)
{
ediCustomerOrderLine.EdiCustomerOrderLineItems = await context.EdiCustomerOrderLineItems
.Where(x => x.CustomerOrderNumber == customerOrderNumber &&
x.CustomerOrderLine == ediCustomerOrderLine.CustomerOrderLine)
.Select(x => mapper.Map<EdiCustomerOrderLineItemDto>(x)).ToListAsync();
}
EdiCustomerOrderDto ediCustomerOrder = mapper.Map<EdiCustomerOrderDto>(
await context.EdiCustomerOrders.FirstOrDefaultAsync(x => x.CustomerOrderNumber == customerOrderNumber));
if (ediCustomerOrder == null)
{
return null;
}
IList<EdiCustomerOrderTranslateDto> ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates
.Where(x => x.EdiCoCoNum == ediCustomerOrder.CustomerOrderNumber)
.Select(x => mapper.Map<EdiCustomerOrderTranslateDto>(x)).ToListAsync();
ediCustomerOrder.EdiCustomerOrderLines = ediCustomerOrderLines;
ediCustomerOrder.EdiCustomerOrderTranslates = ediCustomerOrderTranslates;
return ediCustomerOrder;
}
public async Task<int> SendOrderToSyteline(string customerOrderNumber)
{
var ediCoNum = new SqlParameter("@PEdiCoNum", SqlDbType.NVarChar, 50) { Value = customerOrderNumber };
var ediCoCount = new SqlParameter("@PEdiCoCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output };
var postedCount = new SqlParameter("@PPostedCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output };
var infoBar = new SqlParameter("@Infobar", SqlDbType.NVarChar, 2800) { Value = "", Direction = ParameterDirection.Output };
var autoPost = new SqlParameter("@AutoPost", SqlDbType.Int) { Value = 0 };
var processId = new SqlParameter("@ProcessId", SqlDbType.Int) { Value = 423456 };
await context.Database.ExecuteSqlRawAsync(
"EXEC [dbo].[FKR_EDI_EXTGEN_EdiInOrderPSp] @PEdiCoNum, @PEdiCoCount OUT, @PPostedCount OUT, @Infobar OUT, @AutoPost, @ProcessId",
ediCoNum, ediCoCount, postedCount, infoBar, autoPost, processId);
//var result = await context.Database.ExecuteSqlRawAsync(
// "EXEC [dbo].[FKR_EDI_EXTGEN_EdiInOrderPSp] @PEdiCoNum, @PEdiCoCount, @PPostedCount, @Infobar, @AutoPost, @ProcessId",
// parameter1, parameter2, parameter3, parameter4, parameter5, parameter6);
string? infoBarResult = infoBar.Value?.ToString();
int ediCoCountResult = Convert.ToInt32(ediCoCount.Value);
int postedCountResult = Convert.ToInt32(postedCount.Value);
Console.WriteLine($"EDI Co Num: {infoBarResult}");
Console.WriteLine($"EDI Co Count: {ediCoCountResult}");
Console.WriteLine($"Posted Count: {postedCountResult}");
return postedCountResult;
//// Jeśli chcesz pobrać wyniki procedury składowanej:
//var results = context.SomeEntity.FromSqlRaw(
// "EXEC YourStoredProcedure @Param1, @Param2",
// parameter1, parameter2).ToList();
}
}
}