ibms-dome/Backend/Quartz/Jobs/MessageNotificationJob.cs

164 lines
7.7 KiB
C#
Raw Normal View History

using Backend.Models;
using BackendWorkerService.Services.Interface;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Quartz;
using Repository.BackendRepository.Interface;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace Backend.Quartz.Jobs
{
[DisallowConcurrentExecution]
class MessageNotificationJob : IJob
{
private readonly ILogger<MessageNotificationJob> logger;
private readonly IBackgroundServiceRepository backgroundServiceRepository;
private readonly ISendEmailService sendEmailService;
private readonly ISendSMSService sendSMSService;
private readonly ISendLineNotifyService sendLineNotifyService;
public MessageNotificationJob(
ILogger<MessageNotificationJob> logger,
IBackgroundServiceRepository backgroundServiceRepository,
ISendEmailService sendEmailService,
ISendSMSService sendSMSService,
ISendLineNotifyService sendLineNotifyService)
{
this.logger = logger;
this.backgroundServiceRepository = backgroundServiceRepository;
this.sendEmailService = sendEmailService;
this.sendSMSService = sendSMSService;
this.sendLineNotifyService = sendLineNotifyService;
}
public async Task Execute(IJobExecutionContext context)
{
Dictionary<string, object> insertLog = new Dictionary<string, object>()
{
{ "@task_id", 0 },
{ "@log_level", "" },
{ "@log_content", "" }
};
try
{
logger.LogInformation("【MessageNotificationJob】【任務開始】");
insertLog["@log_level"] = $@"INFO";
insertLog["@log_content"] = $@"任務開始";
await backgroundServiceRepository.AddOneByCustomTable(insertLog, "background_service_message_notification_task_log");
//找出所有要通知的清單
string sWhere = @"is_complete = 0";
var messageNotificationTasks = await backgroundServiceRepository.GetAllAsync<BackgroundServiceMessageNotificationTask>("background_service_message_notification_task", sWhere);
if(messageNotificationTasks.Count == 0)
{
logger.LogInformation("【MessageNotificationJob】【查無任務列表】");
insertLog["@log_level"] = $@"INFO";
insertLog["@log_content"] = $@"查無任務列表";
await backgroundServiceRepository.AddOneByCustomTable(insertLog, "background_service_message_notification_task_log");
}
else
{
List<Dictionary<string, object>> updateObjs = new List<Dictionary<string, object>>();
foreach (var task in messageNotificationTasks)
{
var DateTimeNow = DateTime.Now;
Dictionary<string, object> updateObj = new Dictionary<string, object>()
{
{ "Id", task.Id },
{ "@updated_at", DateTimeNow }
};
try
{
switch (task.Task_type)
{
case (byte)MessageNotificationTaskType.email:
List<string> recipientEmails = new List<string>()
{
task.Recipient_email
};
if (sendEmailService.Send(task.Id, recipientEmails, task.Email_subject, task.Message_content))
{
updateObj.Add("@is_complete", 1);
updateObj.Add("@complete_at", DateTimeNow);
}
else
{
updateObj.Add("@repeat_times", task.Repeat_times + 1);
}
updateObjs.Add(updateObj);
break;
case (byte)MessageNotificationTaskType.sms:
if (sendSMSService.Send(task.Id, task.Recipient_phone, task.Message_content))
{
updateObj.Add("@is_complete", 1);
updateObj.Add("@complete_at", DateTimeNow);
}
else
{
updateObj.Add("@repeat_times", task.Repeat_times + 1);
}
updateObjs.Add(updateObj);
break;
case (byte)MessageNotificationTaskType.line_notify:
if (sendLineNotifyService.Send(task.Id, task.Line_token, task.Message_content))
{
updateObj.Add("@is_complete", 1);
updateObj.Add("@complete_at", DateTimeNow);
}
else
{
updateObj.Add("@repeat_times", task.Repeat_times + 1);
}
updateObjs.Add(updateObj);
break;
}
}
catch(Exception exception)
{
logger.LogError("【MessageNotificationJob】【通知失敗】[任務id]{0}", task.Id);
logger.LogError("【MessageNotificationJob】【通知失敗】[Exception]{0}", exception.ToString());
insertLog["@log_level"] = $@"ERR";
insertLog["@log_content"] = $@"通知失敗 - [失敗原因(Exception)]{exception.ToString()}";
await backgroundServiceRepository.AddOneByCustomTable(insertLog, "background_service_message_notification_task_log");
}
}
await backgroundServiceRepository.UpdateListByCustomTable(updateObjs, "background_service_message_notification_task", "id = @Id");
logger.LogInformation("【MessageNotificationJob】【任務完成】");
insertLog["@task_id"] = 0;
insertLog["@log_level"] = $@"INFO";
insertLog["@log_content"] = $@"任務完成";
await backgroundServiceRepository.AddOneByCustomTable(insertLog, "background_service_message_notification_task_log");
}
}
catch (Exception exception)
{
logger.LogError("【MessageNotificationJob】【任務失敗】");
logger.LogError("【MessageNotificationJob】【任務失敗】[Exception]{0}", exception.ToString());
insertLog["@task_id"] = 0;
insertLog["@log_level"] = $@"ERR";
insertLog["@log_content"] = $@"任務失敗";
await backgroundServiceRepository.AddOneByCustomTable(insertLog, "background_service_message_notification_task_log");
}
}
}
}