using Brizco.Core.QuartzServices.Commands; using Quartz; namespace Brizco.Core.QuartzServices.Handlers; public class SetShiftPlanNotificationScheduleCommandHandler(IRepositoryWrapper repositoryWrapper,IScheduler scheduler) : IRequestHandler { public async Task Handle(SetShiftPlanNotificationScheduleCommand request, CancellationToken cancellationToken) { var shiftPlan = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(sp => sp.Id == request.ShiftPlanId, cancellationToken); if (shiftPlan == null) throw new BaseApiException(ApiResultStatusCode.NotFound, "ShiftPlan not found in set schedule"); var shift = await repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(s => s.Id == shiftPlan.ShiftId, cancellationToken); if(shift == null) throw new BaseApiException(ApiResultStatusCode.NotFound, "Shift not found in set schedule"); var shiftPlanStartAt = (new DateTime(shiftPlan.PlanFor.Year, shiftPlan.PlanFor.Month, shiftPlan.PlanFor.Day, shift.StartAt.Hours,shift.StartAt.Minutes,shift.StartAt.Seconds)).ToUniversalTime(); var shiftPlanEndAt = (new DateTime(shiftPlan.PlanFor.Year, shiftPlan.PlanFor.Month, shiftPlan.PlanFor.Day, shift.EndAt.Hours, shift.EndAt.Minutes, shift.EndAt.Seconds)).ToUniversalTime(); var startTimeOffset = new DateTimeOffset(shiftPlanStartAt.Year, shiftPlanStartAt.Month, shiftPlanStartAt.Day, shiftPlanStartAt.Hour, shiftPlanStartAt.Minute, shiftPlanStartAt.Second, TimeSpan.Zero); var endTimeOffset = new DateTimeOffset(shiftPlanEndAt.Year, shiftPlanEndAt.Month, shiftPlanEndAt.Day, shiftPlanEndAt.Hour, shiftPlanEndAt.Minute, shiftPlanEndAt.Second, TimeSpan.Zero); IJobDetail beforeEndShift30Min = JobBuilder.Create() .WithIdentity(ShiftPlanNotifyType.BeforeEndShift30Min.ToString(), shiftPlan.Id.ToString()) .Build(); ITrigger beforeEndShift30MinTrigger = TriggerBuilder.Create() .WithIdentity(StringExtensions.GetId(9), shift.ComplexId.ToString()) .WithSimpleSchedule(x => x.WithRepeatCount(0)) .StartAt(endTimeOffset.AddMinutes(-40)) .Build(); IJobDetail endOfShift = JobBuilder.Create() .WithIdentity(ShiftPlanNotifyType.EndOfShift.ToString(), shiftPlan.Id.ToString()) .Build(); ITrigger endOfShiftTrigger = TriggerBuilder.Create() .WithIdentity(StringExtensions.GetId(9), shift.ComplexId.ToString()) .WithSimpleSchedule(x => x.WithRepeatCount(0)) .StartAt(endTimeOffset) .Build(); IJobDetail afterStartShift2Hour = JobBuilder.Create() .WithIdentity(ShiftPlanNotifyType.AfterStartShift2Hour.ToString(), shiftPlan.Id.ToString()) .Build(); ITrigger afterStartShift2HourTrigger = TriggerBuilder.Create() .WithIdentity(StringExtensions.GetId(9), shift.ComplexId.ToString()) .WithSimpleSchedule(x => x.WithRepeatCount(0)) .StartAt(startTimeOffset.AddHours(2)) .Build(); await scheduler.ScheduleJob(beforeEndShift30Min, beforeEndShift30MinTrigger, cancellationToken); await scheduler.ScheduleJob(endOfShift, endOfShiftTrigger, cancellationToken); await scheduler.ScheduleJob(afterStartShift2Hour, afterStartShift2HourTrigger, cancellationToken); return true; } }