-
-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathTaskScheduleWrapper.cs
More file actions
95 lines (82 loc) · 4.04 KB
/
TaskScheduleWrapper.cs
File metadata and controls
95 lines (82 loc) · 4.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using FluentScheduler;
using HackSystem.WebAPI.TaskServer.Application.ScheduleWrappers;
using HackSystem.WebAPI.TaskServer.Domain.Entity;
namespace HackSystem.WebAPI.TaskServer.Infrastructure.ScheduleWrappers;
public class TaskScheduleWrapper : ITaskScheduleWrapper
{
public IEnumerable<(TaskDetail TaskDetail, Action<Schedule> ScheduleAction)> WrapTaskSchedules(IEnumerable<TaskDetail> taskDetails)
{
return taskDetails.Select(task => this.WrapTaskSchedule(task));
}
public (TaskDetail TaskDetail, Action<Schedule> ScheduleAction) WrapTaskSchedule(TaskDetail taskDetail)
{
void scheduleAction(Schedule schedule)
{
schedule.WithName(taskDetail.TaskName);
switch (taskDetail.TaskFrequency)
{
case TaskFrequency.Manually:
{
schedule.ToRunNow();
break;
}
case TaskFrequency.Once:
{
if (taskDetail.ExecuteDateTime != default)
{
if (taskDetail.ExecuteDateTime < DateTime.Now) return;
schedule.ToRunOnceAt(taskDetail.ExecuteDateTime.Hour, taskDetail.ExecuteDateTime.Minute)
.DelayFor(Convert.ToInt32((taskDetail.ExecuteDateTime - DateTime.Now).TotalDays)).Days();
}
else if (taskDetail.FirstInterval != default)
{
schedule.ToRunOnceIn(Convert.ToInt32(taskDetail.FirstInterval.TotalSeconds)).Seconds();
}
else
{
schedule.ToRunNow();
}
break;
}
case TaskFrequency.Automatically:
{
schedule
.ToRunEvery(Convert.ToInt32(taskDetail.AutomaticInterval.TotalSeconds)).Seconds()
.DelayFor(Convert.ToInt32(taskDetail.FirstInterval.TotalSeconds)).Seconds();
break;
}
case TaskFrequency.Daily:
{
schedule
.ToRunEvery(Convert.ToInt32(taskDetail.AutomaticInterval.TotalDays)).Days()
.At(taskDetail.ExecuteDateTime.Hour, taskDetail.ExecuteDateTime.Minute);
break;
}
case TaskFrequency.Weekly:
{
schedule
.ToRunEvery(Convert.ToInt32(taskDetail.AutomaticInterval.TotalDays / 7)).Weeks().On(taskDetail.ExecuteDateTime.DayOfWeek)
.At(taskDetail.ExecuteDateTime.Hour, taskDetail.ExecuteDateTime.Minute);
break;
}
case TaskFrequency.Monthly:
{
schedule
.ToRunEvery(0).Months().On(taskDetail.ExecuteDateTime.Day)
.At(taskDetail.ExecuteDateTime.Hour, taskDetail.ExecuteDateTime.Minute);
break;
}
case TaskFrequency.Yearly:
{
var unit = schedule.ToRunEvery(12).Months();
unit.DelayFor(DateTime.Now.Month < taskDetail.ExecuteDateTime.Month ? taskDetail.ExecuteDateTime.Month - DateTime.Now.Month : 12 + taskDetail.ExecuteDateTime.Month - DateTime.Now.Month).Months();
unit.On(taskDetail.ExecuteDateTime.Day).At(taskDetail.ExecuteDateTime.Hour, taskDetail.ExecuteDateTime.Minute);
break;
}
}
if (taskDetail.Enabled) schedule.Enable(); else schedule.Disable();
if (!taskDetail.Reentrant) _ = schedule.NonReentrant();
}
return (taskDetail, (Action<Schedule>)scheduleAction);
}
}