114 lines
5.4 KiB
C#
114 lines
5.4 KiB
C#
using Backend.Models;
|
||
using Microsoft.Extensions.Logging;
|
||
using Quartz;
|
||
using Repository.BackendRepository.Interface;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace BackendWorkerService.Quartz.Jobs
|
||
{
|
||
[DisallowConcurrentExecution]
|
||
public class ExecutionBackgroundServicePlanJob : IJob
|
||
{
|
||
private readonly ILogger<ExecutionBackgroundServicePlanJob> logger;
|
||
private readonly IBackgroundServiceRepository backgroundServiceRepository;
|
||
|
||
public ExecutionBackgroundServicePlanJob(
|
||
ILogger<ExecutionBackgroundServicePlanJob> logger,
|
||
IBackgroundServiceRepository backgroundServiceRepository)
|
||
{
|
||
this.logger = logger;
|
||
this.backgroundServiceRepository = backgroundServiceRepository;
|
||
}
|
||
|
||
public async Task Execute(IJobExecutionContext context)
|
||
{
|
||
try
|
||
{
|
||
logger.LogInformation("【ExecutionBackgroundServicePlanJob】【任務開始】");
|
||
|
||
// 找出當前在起始與結束時間所有計畫
|
||
var DateTimeNow = DateTime.Now;
|
||
var sPlanWhere = @"deleted = 0
|
||
AND
|
||
(
|
||
@DateTimeNow Between start_time AND end_time
|
||
OR (end_time IS NULL AND @DateTimeNow > start_time)
|
||
)
|
||
";
|
||
var backgroundServicePlans = await backgroundServiceRepository.GetAllAsync<BackgroundServicePlan>("background_service_plan", sPlanWhere, new { DateTimeNow = DateTimeNow.ToString("yyyy-MM-dd HH:mm:ss") });
|
||
|
||
foreach (var plan in backgroundServicePlans)
|
||
{
|
||
//logger.LogInformation("【ExecutionBackgroundServicePlanJob】【計畫編號:{0},計畫名稱:{1}】 - 開始生成下次任務項目", plan.Id, plan.Plane_name);
|
||
#region 紀錄最後生成任務的時間
|
||
try
|
||
{
|
||
var lastCreateTime = Convert.ToDateTime(plan.Last_create_time);
|
||
if (lastCreateTime == default(DateTime))
|
||
{
|
||
lastCreateTime = Convert.ToDateTime(plan.Start_time);
|
||
}
|
||
|
||
DateTime nextCreateTime; //下次待生成的時間
|
||
nextCreateTime = plan.Execution_type switch
|
||
{
|
||
(byte)ExecutionTypeEnum.Min => Convert.ToDateTime(lastCreateTime).AddMinutes(plan.Execution_time),
|
||
(byte)ExecutionTypeEnum.Hour => Convert.ToDateTime(lastCreateTime).AddHours(plan.Execution_time),
|
||
(byte)ExecutionTypeEnum.Day => Convert.ToDateTime(lastCreateTime).AddDays(plan.Execution_time),
|
||
(byte)ExecutionTypeEnum.Week => Convert.ToDateTime(lastCreateTime).AddDays(plan.Execution_time * 7),
|
||
(byte)ExecutionTypeEnum.Month => Convert.ToDateTime(lastCreateTime).AddMonths(plan.Execution_time),
|
||
_ => default(DateTime)
|
||
};
|
||
|
||
if (nextCreateTime != default(DateTime) && nextCreateTime < DateTimeNow)
|
||
{
|
||
Dictionary<string, object> servicePlanDic = new Dictionary<string, object>()
|
||
{
|
||
{ "@last_create_time", nextCreateTime},
|
||
{ "@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},
|
||
};
|
||
|
||
await backgroundServiceRepository.UpdateOneByCustomTable(servicePlanDic, "background_service_plan", "id=" + plan.Id + "");
|
||
|
||
#region 建立任務
|
||
try
|
||
{
|
||
BackgroundServiceTask backgroundServiceTask = new BackgroundServiceTask()
|
||
{
|
||
|
||
};
|
||
}
|
||
catch(Exception exception)
|
||
{
|
||
|
||
}
|
||
#endregion 建立任務
|
||
}
|
||
|
||
}
|
||
catch (Exception exception)
|
||
{
|
||
//logger.LogError("【ExecutionBackgroundServicePlanJob】【計畫編號:{0},計畫名稱:{1}】 - 產生下次任務時間失敗", plan.Id, plan.Plane_name);
|
||
//logger.LogError("【ExecutionBackgroundServicePlanJob】【計畫編號:{0},計畫名稱:{1}】 - 產生下次任務時間失敗[Exception]- {2}", plan.Id, plan.Plane_name, exception.Message); ;
|
||
}
|
||
#endregion 紀錄最後該生成任務的時間
|
||
|
||
}
|
||
|
||
|
||
|
||
logger.LogInformation("【ExecutionBackgroundServicePlanJob】【任務完成】");
|
||
}
|
||
catch (Exception exception)
|
||
{
|
||
logger.LogError("【ExecutionBackgroundServicePlanJob】【任務失敗】");
|
||
logger.LogError("【ExecutionBackgroundServicePlanJob】【任務失敗】[Exception]:{0}", exception.Message); ;
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|