diff --git a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs index 114087b5..02670144 100644 --- a/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/TimeAttendants/LeaveProcessJobStatusRepository.cs @@ -68,6 +68,15 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants return data; } + public async Task> GetPendingOrProcessingJobsAsync() + { + var data = await _dbContext.Set() + .Where(x => x.Status == "PENDING" || x.Status == "PROCESSING") + .ToListAsync(); + + return data; + } + /// /// อัปเดตสถานะเป็น Processing /// @@ -113,6 +122,41 @@ namespace BMA.EHR.Application.Repositories.Leaves.TimeAttendants } return job!; } + + public async Task ProcessTaskAsync(Guid id, CancellationToken cancellationToken = default) + { + + } + + public async Task ProcessPendingJobsAsync(CancellationToken cancellationToken = default) + { + // กำหนด timeout เป็น 60 นาที + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromMinutes(60)); + using var combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token); + + + var pendingJobs = await GetPendingOrProcessingJobsAsync(); + + foreach (var job in pendingJobs) + { + try + { + // อัปเดตสถานะเป็น Processing + await UpdateToProcessingAsync(job.Id); + + // ทำงานที่ต้องการที่นี่ (เช่น เรียก API, ประมวลผลข้อมูล ฯลฯ) + await ProcessTaskAsync(job.RootDnaId, combinedCts.Token); + + // อัปเดตสถานะเป็น Completed + await UpdateToCompletedAsync(job.Id); + } + catch (Exception ex) + { + // หากเกิดข้อผิดพลาด อัปเดตสถานะเป็น Failed พร้อมข้อความแสดงข้อผิดพลาด + await UpdateToFailedAsync(job.Id, ex.Message); + } + } + } #endregion }