151 lines
5.4 KiB
C#
151 lines
5.4 KiB
C#
using Microsoft.Extensions.Logging;
|
||
using PARR.BLL.Services.Interfaces;
|
||
using PARR.Constants;
|
||
|
||
namespace PARR.BLL.Services.Implementations
|
||
{
|
||
internal class CalendarService : ICalendarService
|
||
{
|
||
private readonly ILogger<CalendarService> logger;
|
||
|
||
public CalendarService(ILogger<CalendarService> logger)
|
||
{
|
||
this.logger = logger;
|
||
}
|
||
|
||
private DateOnly GetEndPeriodDate(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod)
|
||
{
|
||
//TODO: подходит для NextRun
|
||
|
||
switch (periodType)
|
||
{
|
||
case (DistributionPeriodTypeEnum.Day):
|
||
return startPeriod.AddDays(ParseInt(distributionPeriod)).AddDays(-1);
|
||
|
||
case (DistributionPeriodTypeEnum.Month):
|
||
return startPeriod.AddMonths(ParseInt(distributionPeriod)).AddDays(-1);
|
||
|
||
case (DistributionPeriodTypeEnum.Year):
|
||
return startPeriod.AddYears(ParseInt(distributionPeriod)).AddDays(-1);
|
||
|
||
//case (DistributionPeriodTypeEnum.TimeSpan):
|
||
// var timeSpan = ParseTimeSpan(distributionPeriod);
|
||
// return timeSpan.Days > 0 ? startPeriod.AddDays();
|
||
}
|
||
|
||
|
||
//return startPeriod.AddDays(duration.Days).AddDays(-1);
|
||
return startPeriod;
|
||
}
|
||
|
||
|
||
private int ParseInt(string value)
|
||
{
|
||
try
|
||
{
|
||
return int.Parse(value);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в int для значения {value}.");
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
//private TimeSpan ParseTimeSpan(string value)
|
||
//{
|
||
// try
|
||
// {
|
||
// return TimeSpan.Parse(value);
|
||
// }
|
||
// catch (Exception ex)
|
||
// {
|
||
// logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в TimeSpan для значения {value}.");
|
||
// return new TimeSpan(0);
|
||
// }
|
||
//}
|
||
|
||
|
||
//public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends)
|
||
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends)
|
||
{
|
||
var endPeriod = GetEndPeriodDate(startPeriod, periodType, distributionPeriod);
|
||
|
||
//не получилось сделать асинхронным
|
||
var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync();
|
||
|
||
|
||
//TODO: метод получения рабочих дней, получать актуальные рабочие дни за период
|
||
//не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота
|
||
// на следующий месяц будет много изменений
|
||
//временно сделаем список руками рабочих дней
|
||
var workDays = GetDatesForPeriod(startPeriod, endPeriod);
|
||
|
||
if (weekends.Any())
|
||
workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList();
|
||
|
||
return workDays;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Временные данные пока не реализован сервис и логика
|
||
/// </summary>
|
||
/// <param name="startPeriod"></param>
|
||
/// <param name="EndPeriod"></param>
|
||
/// <returns></returns>
|
||
private List<DateOnly> GetDatesForPeriod(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 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"));
|
||
|
||
// 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)
|
||
// {
|
||
|
||
// await Task.Delay(1000);
|
||
|
||
// return new List<DateOnly> { new DateOnly(2024, 1, 12) };
|
||
// }
|
||
//}
|
||
}
|