164 lines
7.7 KiB
C#
164 lines
7.7 KiB
C#
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 BackendWorkerService.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");
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|