2026-01-16 11:04:26 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Core.Common.Interfaces;
|
2026-07-03 11:17:48 +10:00
|
|
|
|
using PARR.Core.Repositories.Interfaces.JobGroupRepositories;
|
|
|
|
|
|
using PARR.Core.Repositories.Interfaces.JobRepositories;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Domain.Cache.Models;
|
2026-05-04 11:55:07 +10:00
|
|
|
|
using PARR.Domain.DTOs.Matching;
|
2026-04-14 12:01:49 +10:00
|
|
|
|
using PARR.Domain.Enums;
|
2026-01-16 11:04:26 +10:00
|
|
|
|
|
2026-05-04 11:55:07 +10:00
|
|
|
|
namespace PARR.Core.Services.MatchingStatusService
|
2026-01-16 11:04:26 +10:00
|
|
|
|
{
|
|
|
|
|
|
internal class MatchingStatusService : IMatchingStatusService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IRedisCacheService redisCacheService;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
private readonly IJobRepository jobService;
|
|
|
|
|
|
private readonly IJobGroupRepository jobGroupService;
|
2026-01-16 11:04:26 +10:00
|
|
|
|
|
|
|
|
|
|
public MatchingStatusService(
|
|
|
|
|
|
IRedisCacheService redisCacheService,
|
2026-04-30 10:35:31 +10:00
|
|
|
|
IJobRepository jobService,
|
|
|
|
|
|
IJobGroupRepository jobGroupService
|
2026-01-16 11:04:26 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.redisCacheService = redisCacheService;
|
|
|
|
|
|
this.jobService = jobService;
|
|
|
|
|
|
this.jobGroupService = jobGroupService;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task DeleteMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type)
|
|
|
|
|
|
{
|
|
|
|
|
|
var key = GetKey(objectId, type);
|
|
|
|
|
|
await redisCacheService.DeleteCachedDataAsync(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<MatchingStatus> GetStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type)
|
|
|
|
|
|
{
|
|
|
|
|
|
var jobGroupIdList = new List<Guid>();
|
|
|
|
|
|
var jobIdList = new List<Guid>();
|
|
|
|
|
|
|
|
|
|
|
|
//формируем список jobId и jobGroupId для поиска в КЭШ, происходит ли у кого-то из них сейчас matching
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.Job:
|
|
|
|
|
|
var job = await jobService.Get().FirstOrDefaultAsync(t => t.Id == objectId);
|
|
|
|
|
|
if (job != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
jobIdList.Add(job.Id);
|
|
|
|
|
|
jobGroupIdList = await jobGroupService.Get().Where(t => t.Id == job.GroupId).Select(t => t.Id).ToListAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.JobGroup:
|
|
|
|
|
|
var jobGroup = await jobGroupService.Get().FirstOrDefaultAsync(t => t.Id == objectId);
|
|
|
|
|
|
if (jobGroup != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
jobGroupIdList.Add(jobGroup.Id);
|
|
|
|
|
|
jobIdList = await jobService.Get().Where(t => t.GroupId == jobGroup.Id).Select(t => t.Id).ToListAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.Template:
|
|
|
|
|
|
throw new Exception("Нет реализации получения кэша статуса matching для template");
|
|
|
|
|
|
//todo: У нас вообще нет matching для Template, позже надо удалить это вообще из Enum SyncTaskEntityTypeEnum
|
2026-06-04 14:14:10 +10:00
|
|
|
|
//break;
|
2026-01-16 11:04:26 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Если списки пустые, мало ли, говорим что нет matching`a
|
|
|
|
|
|
if (!jobGroupIdList.Any() && !jobIdList.Any())
|
|
|
|
|
|
return new MatchingStatus { DetailsJobGroups = null, DetailsJobs = null };
|
|
|
|
|
|
|
|
|
|
|
|
// Ищем в КЭШ
|
|
|
|
|
|
var jobGroupDetails = new List<MatchingStatusItem>();
|
|
|
|
|
|
foreach (var jobGroupId in jobGroupIdList)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cacheResult = await redisCacheService.GetCachedDataAsync<MatchingStatusItem>(GetKey(jobGroupId, SyncTaskEntityTypeEnum.JobGroup));
|
|
|
|
|
|
if (cacheResult != null)
|
|
|
|
|
|
jobGroupDetails.Add(cacheResult);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var jobDetails = new List<MatchingStatusItem>();
|
|
|
|
|
|
foreach (var jobId in jobIdList)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cacheResult = await redisCacheService.GetCachedDataAsync<MatchingStatusItem>(GetKey(jobId, SyncTaskEntityTypeEnum.Job));
|
|
|
|
|
|
if (cacheResult != null)
|
|
|
|
|
|
jobDetails.Add(cacheResult);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return new MatchingStatus
|
|
|
|
|
|
{
|
|
|
|
|
|
DetailsJobGroups = jobGroupDetails.Any() ? jobGroupDetails : null,
|
|
|
|
|
|
DetailsJobs = jobDetails.Any() ? jobDetails : null
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task SetMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type, MatchingStatusItem data, TimeSpan cacheDuration)
|
|
|
|
|
|
{
|
|
|
|
|
|
var key = GetKey(objectId, type);
|
|
|
|
|
|
await redisCacheService.SetCachedDataAsync(key, data, cacheDuration);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string GetKey(Guid id, SyncTaskEntityTypeEnum type)
|
|
|
|
|
|
{
|
|
|
|
|
|
var typeStr = "";
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.Job:
|
2026-03-20 12:28:34 +10:00
|
|
|
|
typeStr = "job";
|
2026-01-16 11:04:26 +10:00
|
|
|
|
break;
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.JobGroup:
|
2026-03-20 12:28:34 +10:00
|
|
|
|
typeStr = "group";
|
2026-01-16 11:04:26 +10:00
|
|
|
|
break;
|
|
|
|
|
|
case SyncTaskEntityTypeEnum.Template:
|
2026-03-20 12:28:34 +10:00
|
|
|
|
typeStr = "template";
|
2026-01-16 11:04:26 +10:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 12:28:34 +10:00
|
|
|
|
return redisCacheService.GetKey(new string[] { "matching", typeStr, id.ToString() });
|
2026-01-16 11:04:26 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|