feat(bll, dal): WeekendDayService + БД. CalendarService - получение рабочих дней за период

This commit is contained in:
Mikhail Kuznetsov
2024-07-01 11:32:19 +10:00
parent 9632b0c560
commit ff37e6c10f
14 changed files with 2981 additions and 43 deletions

View File

@@ -2,68 +2,92 @@
namespace PARR.BLL.Services.Implementations
{
public delegate Task<List<DateOnly>> GetWeekendsDelegate(DateOnly start, DateOnly end);
internal class CalendarService : ICalendarService
{
private DateOnly GetEndPeriodDate(DateOnly startPeriod, TimeSpan distributionPeriod)
{
return startPeriod.AddDays(distributionPeriod.Days).AddDays(-1);
}
public async Task<List<DateOnly>> GetWorkDatesForPeriodAsync(DateOnly startPeriod, TimeSpan distributionPeriod, GetWeekendsDelegate getWeekends)
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan distributionPeriod, GetWeekendsDelegate getWeekends)
{
var endPeriod = GetEndPeriodDate(startPeriod, distributionPeriod);
//не получилось сделать асинхронным
var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync();
var weekends = await getWeekends.Invoke(startPeriod, endPeriod);
//TODO: logic!!!
//TODO: переделать метод получения рабочих дней, получать актуальные рабочие дни за период
//не стали реализовывать сразу, так как повысится нагрузка на робота
// на следующий месяц будет много изменений
//временно сделаем список руками рабочих дней
var workDates = new List<DateOnly>();
var workDays = GetMockWorkDays(startPeriod, endPeriod);
workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList();
return workDays;
}
return workDates;
/// <summary>
/// Временные данные пока не реализован сервис и логика
/// </summary>
/// <param name="startPeriod"></param>
/// <param name="EndPeriod"></param>
/// <returns></returns>
private List<DateOnly> GetMockWorkDays(DateOnly startPeriod, DateOnly EndPeriod)
{
var workDaysList = new List<DateOnly>();
var currentDay = startPeriod;
while (currentDay <= EndPeriod)
{
// 29 дней, потому что в феврале 28, чтоб не париться, сделали так
if (currentDay.Day < 29)
workDaysList.Add(currentDay);
currentDay = currentDay.AddDays(1);
}
return workDaysList.OrderBy(t => t).ToList();
}
}
public class Test
{
private readonly ICalendarService calendarService;
//public class Test
//{
// private readonly ICalendarService calendarService;
public Test(ICalendarService calendarService)
{
this.calendarService = calendarService;
}
// public Test(ICalendarService calendarService)
// {
// this.calendarService = calendarService;
// }
public async void Ttt()
{
var tService = new TestService();
// var endPeriod = calendarService.GetEndPeriodDate(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"));
// public async void Ttt()
// {
// var tService = new TestService();
// // var endPeriod = calendarService.GetEndPeriodDate(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"));
var workDays = await calendarService.GetWorkDatesForPeriodAsync(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"), tService.GetWeekendsAsync);
// var workDays = await calendarService.GetWorkDatesForPeriodAsync(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"), tService.GetWeekendsAsync);
}
// }
}
//}
public class TestService
{
public async Task<List<DateOnly>> GetWeekendsAsync(DateOnly start, DateOnly end)
{
//public class TestService
//{
// public async Task<List<DateOnly>> GetWeekendsAsync(DateOnly start, DateOnly end)
// {
await Task.Delay(1000);
// await Task.Delay(1000);
return new List<DateOnly> { new DateOnly(2024, 1, 12) };
}
}
// return new List<DateOnly> { new DateOnly(2024, 1, 12) };
// }
//}
}

View File

@@ -1,13 +1,16 @@

using PARR.BLL.Services.Implementations;
namespace PARR.BLL.Services.Interfaces
namespace PARR.BLL.Services.Interfaces
{
public delegate IQueryable<DateOnly> GetWeekendsDelegate(DateOnly start, DateOnly end);
public interface ICalendarService
{
Task<List<DateOnly>> GetWorkDatesForPeriodAsync(DateOnly startPeriod, TimeSpan distributionPeriod, GetWeekendsDelegate getWeekends);
//Task<List<DateOnly>> GetWorkDatesForPeriodAsync(DateOnly startPeriod, TimeSpan distributionPeriod, Action<List<DateOnly>> getWeekends);
//Task<List<DateOnly>> GetWorkDatesForPeriodAsync(DateOnly startPeriod, TimeSpan distributionPeriod, Action getWeekends);
/// <summary>
/// Получить только рабочие дни за период
/// </summary>
/// <param name="startPeriod"></param>
/// <param name="distributionPeriod"></param>
/// <param name="getWeekends"></param>
/// <returns></returns>
List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan distributionPeriod, GetWeekendsDelegate getWeekends);
}
}