feat(dal): WeekendDayService - метод проверки на рабочий день

This commit is contained in:
Mikhail Trubnikov
2024-09-16 17:01:04 +10:00
parent 4a47e194f8
commit 251e3a20b0
8 changed files with 103 additions and 3 deletions

View File

@@ -53,6 +53,8 @@
public const string CreateCache = Base + "/tests/cache/"; public const string CreateCache = Base + "/tests/cache/";
public const string IsWorkDay = Base + "/tests/is-work-day/";
public const string paramDate = "{lastRunDate}"; public const string paramDate = "{lastRunDate}";
public const string paramApplicationInWorkId = "{applicationInWorkId}"; public const string paramApplicationInWorkId = "{applicationInWorkId}";
} }

View File

@@ -5,6 +5,7 @@ using PARR.API.Contracts.V1.Responses.Base;
using PARR.API.Controllers.V1.Base; using PARR.API.Controllers.V1.Base;
using PARR.API.Services.Interfaces; using PARR.API.Services.Interfaces;
using PARR.DAL.CacheServices; using PARR.DAL.CacheServices;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.TransformServices; using PARR.DAL.TransformServices;
namespace PARR.API.Controllers.V1 namespace PARR.API.Controllers.V1
@@ -15,12 +16,19 @@ namespace PARR.API.Controllers.V1
private readonly IClientService clientService; private readonly IClientService clientService;
private readonly IEsppScheduleTransformService esppScheduleTransformService; private readonly IEsppScheduleTransformService esppScheduleTransformService;
private readonly IRedisCacheService redisCacheService; private readonly IRedisCacheService redisCacheService;
private readonly IWeekendDayService weekendDayService;
public TestController(IClientService clientService, IEsppScheduleTransformService esppScheduleTransformService, IRedisCacheService redisCacheService) public TestController(
IClientService clientService,
IEsppScheduleTransformService esppScheduleTransformService,
IRedisCacheService redisCacheService,
IWeekendDayService weekendDayService
)
{ {
this.clientService = clientService; this.clientService = clientService;
this.esppScheduleTransformService = esppScheduleTransformService; this.esppScheduleTransformService = esppScheduleTransformService;
this.redisCacheService = redisCacheService; this.redisCacheService = redisCacheService;
this.weekendDayService = weekendDayService;
} }
@@ -83,6 +91,18 @@ namespace PARR.API.Controllers.V1
} }
/// <summary>
/// Проверка, это рабочий день?
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Test.IsWorkDay)]
public async Task<IActionResult> IsWorkDay([FromQuery] DateOnly date)
{
return Ok(await weekendDayService.IsWorkDayAsync(date, true));
}
} }
public class CaheRequestTest public class CaheRequestTest

View File

@@ -10,6 +10,7 @@
/// </summary> /// </summary>
public TimeSpan UserCacheTtl { get; set; } public TimeSpan UserCacheTtl { get; set; }
/// <summary> /// <summary>
/// Сколько хранить в кэше заблокированных пользователей (как долго блокировать пользователя) /// Сколько хранить в кэше заблокированных пользователей (как долго блокировать пользователя)
/// </summary> /// </summary>

View File

@@ -119,6 +119,10 @@ namespace PARR.DAL
services.AddSingleton(settingsFromDb); services.AddSingleton(settingsFromDb);
PrefixSettings.PrefixWithoutVariable = settingsFromDb.TemplatePrefixWithoutVariable; PrefixSettings.PrefixWithoutVariable = settingsFromDb.TemplatePrefixWithoutVariable;
var weekendCacheSettings = new WeekendCacheSettings();
configuration.GetSection(nameof(WeekendCacheSettings)).Bind(weekendCacheSettings);
services.AddSingleton(weekendCacheSettings);
} }
} }

View File

@@ -1,9 +1,11 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using PARR.DAL.CacheServices;
using PARR.DAL.Context; using PARR.DAL.Context;
using PARR.DAL.Models; using PARR.DAL.Models;
using PARR.DAL.Services.Abstracts; using PARR.DAL.Services.Abstracts;
using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces;
using PARR.DAL.Settings;
namespace PARR.DAL.Services.Implementations namespace PARR.DAL.Services.Implementations
{ {
@@ -11,15 +13,24 @@ namespace PARR.DAL.Services.Implementations
{ {
private readonly DataContext dataContext; private readonly DataContext dataContext;
private readonly ILogger<WeekendDayService> logger; private readonly ILogger<WeekendDayService> logger;
private readonly IRedisCacheService redisCacheService;
private readonly WeekendCacheSettings weekendCacheSettings;
protected override DbSet<WeekendDay> EntitySet => dataContext.WeekendDays; protected override DbSet<WeekendDay> EntitySet => dataContext.WeekendDays;
protected override DataContext EntitiContext => dataContext; protected override DataContext EntitiContext => dataContext;
public WeekendDayService(DataContext dataContext, ILogger<WeekendDayService> logger) : base(logger) public WeekendDayService(
DataContext dataContext,
ILogger<WeekendDayService> logger,
IRedisCacheService redisCacheService,
WeekendCacheSettings weekendCacheSettings
) : base(logger)
{ {
this.dataContext = dataContext; this.dataContext = dataContext;
this.logger = logger; this.logger = logger;
this.redisCacheService = redisCacheService;
this.weekendCacheSettings = weekendCacheSettings;
} }
@@ -28,5 +39,45 @@ namespace PARR.DAL.Services.Implementations
return EntitySet.Where(t => t.Date >= start && t.Date <= end).Select(t => t.Date); return EntitySet.Where(t => t.Date >= start && t.Date <= end).Select(t => t.Date);
} }
public async Task<bool> IsWorkDayAsync(DateOnly date, bool useCache = false)
{
if (useCache)
{
// смотрим, есть ли в кэше рабочий день
var workdayInCache = await redisCacheService.GetCachedDataAsync<DateOnly?>(GetWorkDayKey(date));
if (workdayInCache != null)
return true;
// смотрим, есть ли в кэше выходной день
var weekendInCache = await redisCacheService.GetCachedDataAsync<DateOnly?>(GetWeekendKey(date));
if (weekendInCache != null)
return false;
}
var weekendInDb = await EntitySet.FirstOrDefaultAsync(t => t.Date == date);
var isWorkday = weekendInDb == null;
//сохраняем всегда в КЭШ значение выходного и рабочего дня
var cacheKey = isWorkday ? GetWorkDayKey(date) : GetWeekendKey(date);
//TODO:!!! Тут настройки вынести в DB settings
await redisCacheService.SetCachedDataAsync(cacheKey, date, weekendCacheSettings.WeekendTtl);
return isWorkday;
}
private string GetWeekendKey(DateOnly day)
{
return $"weekend_{day.ToString("yyyy-MM-dd")}";
}
private string GetWorkDayKey(DateOnly day)
{
return $"workday_{day.ToString("yyyy-MM-dd")}";
}
} }
} }

View File

@@ -6,5 +6,6 @@ namespace PARR.DAL.Services.Interfaces
public interface IWeekendDayService : IBaseService<WeekendDay> public interface IWeekendDayService : IBaseService<WeekendDay>
{ {
IQueryable<DateOnly> GetWeekends(DateOnly start, DateOnly end); IQueryable<DateOnly> GetWeekends(DateOnly start, DateOnly end);
Task<bool> IsWorkDayAsync(DateOnly date, bool useCache = false);
} }
} }

View File

@@ -0,0 +1,10 @@
namespace PARR.DAL.Settings
{
public class WeekendCacheSettings
{
/// <summary>
/// Время хранения в кэше данных о выходных и рабочих днях
/// </summary>
public TimeSpan WeekendTtl { get; set; } = new TimeSpan(0, 5, 0);
}
}

View File

@@ -208,7 +208,7 @@ namespace PARR.DAL.TransformServices
//TODO: вот это повторяется от метода к методу //TODO: вот это повторяется от метода к методу
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию //Если итоговая дата указывает на прошлое, то повторяем расчёт и уходим в рекурсию
if (calcDay < DateTimeOffset.UtcNow) if (calcDay < DateTimeOffset.UtcNow)
calcDay = GetNextDateRegularly(values, calcDay); calcDay = GetNextDateRegularly(values, calcDay);
@@ -216,6 +216,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateWeekly(List<EsppScheduleValDto> values, DateTimeOffset lastRun) private DateTimeOffset GetNextDateWeekly(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
{ {
var dwNum = dwDict[values[0].Value.Value]; var dwNum = dwDict[values[0].Value.Value];
@@ -233,6 +234,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateMonthly(List<EsppScheduleValDto> values, DateTimeOffset lastRun) private DateTimeOffset GetNextDateMonthly(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
{ {
int.TryParse(values[0].Value.Value, out int dayNum); int.TryParse(values[0].Value.Value, out int dayNum);
@@ -247,6 +249,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateMonthly2(List<EsppScheduleValDto> values, DateTimeOffset lastRun) private DateTimeOffset GetNextDateMonthly2(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
{ {
var orderNum = orderDict[values[0].Value.Value]; var orderNum = orderDict[values[0].Value.Value];
@@ -268,6 +271,8 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset lastRun) private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
{ {
var monthNum = monthDict[values[0].Value.Value]; var monthNum = monthDict[values[0].Value.Value];
@@ -283,6 +288,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private DateTimeOffset GetNextDateAnnually2(List<EsppScheduleValDto> values, DateTimeOffset lastRun) private DateTimeOffset GetNextDateAnnually2(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
{ {
var monthADict = new Dictionary<string, int> var monthADict = new Dictionary<string, int>
@@ -322,6 +328,7 @@ namespace PARR.DAL.TransformServices
return calcDay; return calcDay;
} }
private List<DateTimeOffset> FindAllDaysInMonth(int dwNum, ref DateTimeOffset calcDay) private List<DateTimeOffset> FindAllDaysInMonth(int dwNum, ref DateTimeOffset calcDay)
{ {
if (((int)calcDay.DayOfWeek) != dwNum) if (((int)calcDay.DayOfWeek) != dwNum)
@@ -338,6 +345,7 @@ namespace PARR.DAL.TransformServices
return daysList; return daysList;
} }
private void OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay) private void OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay)
{ {
var daysOffset = dwNum - ((int)calcDay.DayOfWeek); var daysOffset = dwNum - ((int)calcDay.DayOfWeek);
@@ -366,6 +374,7 @@ namespace PARR.DAL.TransformServices
return lastRun; return lastRun;
} }
private DateTimeOffset GetPrevDateForDistributionRun(DateTimeOffset lastRun, DistributionPeriodTypeEnum periodType, string distributionPeriod) private DateTimeOffset GetPrevDateForDistributionRun(DateTimeOffset lastRun, DistributionPeriodTypeEnum periodType, string distributionPeriod)
{ {
switch (periodType) switch (periodType)
@@ -383,6 +392,7 @@ namespace PARR.DAL.TransformServices
return lastRun; return lastRun;
} }
public async Task<DateOnly> GetStartPeriodForDateAsync(Guid applicationInWorkId, DateTimeOffset date, DateTimeOffset referenceDate, DistributionPeriodTypeEnum periodType, string distributionPeriod) public async Task<DateOnly> GetStartPeriodForDateAsync(Guid applicationInWorkId, DateTimeOffset date, DateTimeOffset referenceDate, DistributionPeriodTypeEnum periodType, string distributionPeriod)
{ {
@@ -422,6 +432,7 @@ namespace PARR.DAL.TransformServices
} }
} }
private DistributionPeriodTypeEnum ParseDistributionPeriodType(string value) private DistributionPeriodTypeEnum ParseDistributionPeriodType(string value)
{ {
var result = (DistributionPeriodTypeEnum)Enum.Parse(typeof(DistributionPeriodTypeEnum), value); var result = (DistributionPeriodTypeEnum)Enum.Parse(typeof(DistributionPeriodTypeEnum), value);