initial commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
using Application.Common.Repositories;
|
||||
using Domain.Entities;
|
||||
|
||||
namespace Application.Features.NumberSequenceManager;
|
||||
|
||||
public class NumberSequenceService
|
||||
{
|
||||
|
||||
private readonly object lockObject = new object();
|
||||
private readonly ICommandRepository<NumberSequence> _repository;
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public NumberSequenceService(
|
||||
ICommandRepository<NumberSequence> repository,
|
||||
IUnitOfWork unitOfWork
|
||||
)
|
||||
{
|
||||
_repository = repository;
|
||||
_unitOfWork = unitOfWork;
|
||||
}
|
||||
|
||||
private NumberSequence? GetNumberSequence(string entityName, string prefix, string suffix)
|
||||
{
|
||||
return _repository.GetQuery()
|
||||
.FirstOrDefault(ns => ns.EntityName == entityName && ns.Prefix == prefix && ns.Suffix == suffix);
|
||||
}
|
||||
|
||||
private void UpdateNumberSequence(NumberSequence sequence)
|
||||
{
|
||||
sequence.LastUsedCount++;
|
||||
_unitOfWork.Save();
|
||||
}
|
||||
|
||||
private NumberSequence InsertNumberSequence(string entityName, string prefix, string suffix)
|
||||
{
|
||||
NumberSequence newSequence = new NumberSequence
|
||||
{
|
||||
EntityName = entityName,
|
||||
Prefix = prefix,
|
||||
Suffix = suffix,
|
||||
LastUsedCount = 1
|
||||
};
|
||||
|
||||
_repository.Create(newSequence);
|
||||
_unitOfWork.Save();
|
||||
|
||||
return newSequence;
|
||||
}
|
||||
|
||||
public string GenerateNumber(string entityName, string prefix, string suffix, bool useDate = true, int padding = 4)
|
||||
{
|
||||
var result = string.Empty;
|
||||
|
||||
if (string.IsNullOrEmpty(entityName))
|
||||
{
|
||||
throw new Exception("Parameter entityName must not be null");
|
||||
}
|
||||
|
||||
lock (lockObject)
|
||||
{
|
||||
NumberSequence? sequence = GetNumberSequence(entityName, prefix, suffix);
|
||||
|
||||
if (sequence != null)
|
||||
{
|
||||
UpdateNumberSequence(sequence);
|
||||
}
|
||||
else
|
||||
{
|
||||
sequence = InsertNumberSequence(entityName, prefix, suffix);
|
||||
}
|
||||
|
||||
string formattedNumber = $"{prefix}{sequence?.LastUsedCount?.ToString().PadLeft(padding, '0')}{(useDate ? DateTime.Now.ToString("yyyyMMdd") : "")}{suffix}";
|
||||
result = formattedNumber;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
using Application.Common.CQS.Queries;
|
||||
using Application.Common.Extensions;
|
||||
using AutoMapper;
|
||||
using Domain.Entities;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Application.Features.NumberSequenceManager.Queries;
|
||||
|
||||
public record GetNumberSequenceListDto
|
||||
{
|
||||
public string? Id { get; init; }
|
||||
public string? EntityName { get; init; }
|
||||
public string? Prefix { get; init; }
|
||||
public string? Suffix { get; init; }
|
||||
public string? LastUsedCount { get; init; }
|
||||
public DateTime? CreatedAtUtc { get; init; }
|
||||
}
|
||||
|
||||
public class GetNumberSequenceListProfile : Profile
|
||||
{
|
||||
public GetNumberSequenceListProfile()
|
||||
{
|
||||
CreateMap<NumberSequence, GetNumberSequenceListDto>();
|
||||
}
|
||||
}
|
||||
|
||||
public class GetNumberSequenceListResult
|
||||
{
|
||||
public List<GetNumberSequenceListDto>? Data { get; init; }
|
||||
}
|
||||
|
||||
public class GetNumberSequenceListRequest : IRequest<GetNumberSequenceListResult>
|
||||
{
|
||||
public bool IsDeleted { get; init; } = false;
|
||||
}
|
||||
|
||||
|
||||
public class GetNumberSequenceListHandler : IRequestHandler<GetNumberSequenceListRequest, GetNumberSequenceListResult>
|
||||
{
|
||||
private readonly IMapper _mapper;
|
||||
private readonly IQueryContext _context;
|
||||
|
||||
public GetNumberSequenceListHandler(IMapper mapper, IQueryContext context)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<GetNumberSequenceListResult> Handle(GetNumberSequenceListRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var query = _context
|
||||
.NumberSequence
|
||||
.AsNoTracking()
|
||||
.IsDeletedEqualTo(request.IsDeleted)
|
||||
.AsQueryable();
|
||||
|
||||
var entities = await query.ToListAsync(cancellationToken);
|
||||
|
||||
var dtos = _mapper.Map<List<GetNumberSequenceListDto>>(entities);
|
||||
|
||||
return new GetNumberSequenceListResult
|
||||
{
|
||||
Data = dtos
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user