91 lines
2.5 KiB
C#
91 lines
2.5 KiB
C#
using System.Collections.Concurrent;
|
|
using BMA.EHR.Recruit.Requests.Recruits;
|
|
|
|
namespace BMA.EHR.Recruit.Services;
|
|
|
|
public enum ImportJobType
|
|
{
|
|
CandidateFile,
|
|
CandidateFileById,
|
|
ScoreFile,
|
|
ResultFile
|
|
}
|
|
|
|
public enum ImportJobStatus
|
|
{
|
|
Pending,
|
|
Running,
|
|
Completed,
|
|
Failed
|
|
}
|
|
|
|
public class ImportJobInfo
|
|
{
|
|
public string JobId { get; set; } = Guid.NewGuid().ToString("D");
|
|
public ImportJobType JobType { get; set; }
|
|
public ImportJobStatus Status { get; set; } = ImportJobStatus.Pending;
|
|
public int ProcessedCount { get; set; }
|
|
public int TotalCount { get; set; }
|
|
public string? ErrorMessage { get; set; }
|
|
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
|
public DateTime? CompletedAt { get; set; }
|
|
|
|
// Request data
|
|
public string ImportFile { get; set; } = "";
|
|
public Guid RecruitImportId { get; set; }
|
|
public string ImportDocId { get; set; } = "";
|
|
public string? UserId { get; set; }
|
|
public string? FullName { get; set; }
|
|
public string? Token { get; set; }
|
|
|
|
// For CandidateFile
|
|
public PostRecruitImportRequest? Request { get; set; }
|
|
}
|
|
|
|
public class ImportJobTracker
|
|
{
|
|
private readonly ConcurrentDictionary<string, ImportJobInfo> _jobs = new();
|
|
private readonly TimeSpan _evictionAge = TimeSpan.FromHours(1);
|
|
|
|
public ImportJobInfo CreateJob(ImportJobInfo job)
|
|
{
|
|
EvictOldJobs();
|
|
_jobs[job.JobId] = job;
|
|
return job;
|
|
}
|
|
|
|
public ImportJobInfo? GetJob(string jobId)
|
|
{
|
|
return _jobs.TryGetValue(jobId, out var job) ? job : null;
|
|
}
|
|
|
|
public void UpdateStatus(string jobId, ImportJobStatus status, int processedCount = 0, string? errorMessage = null)
|
|
{
|
|
if (_jobs.TryGetValue(jobId, out var job))
|
|
{
|
|
job.Status = status;
|
|
job.ProcessedCount = processedCount;
|
|
if (errorMessage != null)
|
|
job.ErrorMessage = errorMessage;
|
|
if (status == ImportJobStatus.Completed || status == ImportJobStatus.Failed)
|
|
{
|
|
job.CompletedAt = DateTime.Now;
|
|
// Clear request data to free memory for completed/failed jobs
|
|
job.Request = null;
|
|
job.Token = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void EvictOldJobs()
|
|
{
|
|
var cutoff = DateTime.Now - _evictionAge;
|
|
foreach (var kvp in _jobs)
|
|
{
|
|
if (kvp.Value.CompletedAt.HasValue && kvp.Value.CompletedAt.Value < cutoff)
|
|
{
|
|
_jobs.TryRemove(kvp.Key, out _);
|
|
}
|
|
}
|
|
}
|
|
}
|