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 _jobs = new(); public ImportJobInfo CreateJob(ImportJobInfo job) { _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; } } }