初始化
This commit is contained in:
102
FutureMailAPI/Helpers/MailDeliveryJob.cs
Normal file
102
FutureMailAPI/Helpers/MailDeliveryJob.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Quartz;
|
||||
using FutureMailAPI.Data;
|
||||
using FutureMailAPI.Models;
|
||||
|
||||
namespace FutureMailAPI.Helpers
|
||||
{
|
||||
[DisallowConcurrentExecution]
|
||||
public class MailDeliveryJob : IJob
|
||||
{
|
||||
private readonly FutureMailDbContext _context;
|
||||
private readonly ILogger<MailDeliveryJob> _logger;
|
||||
|
||||
public MailDeliveryJob(FutureMailDbContext context, ILogger<MailDeliveryJob> logger)
|
||||
{
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
_logger.LogInformation("开始执行邮件投递任务: {time}", DateTime.Now);
|
||||
|
||||
try
|
||||
{
|
||||
// 查找所有需要投递的邮件
|
||||
var mailsToDeliver = await _context.SentMails
|
||||
.Where(m => m.Status == 1 && m.DeliveryTime <= DateTime.UtcNow)
|
||||
.Include(m => m.Sender)
|
||||
.ToListAsync();
|
||||
|
||||
_logger.LogInformation("找到 {count} 封待投递邮件", mailsToDeliver.Count);
|
||||
|
||||
foreach (var mail in mailsToDeliver)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 更新邮件状态为投递中
|
||||
mail.Status = 2;
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
// 根据收件人类型创建接收邮件记录
|
||||
if (mail.RecipientType == 0) // 发给自己
|
||||
{
|
||||
var receivedMail = new ReceivedMail
|
||||
{
|
||||
SentMailId = mail.Id,
|
||||
RecipientId = mail.SenderId,
|
||||
ReceivedAt = DateTime.UtcNow
|
||||
};
|
||||
|
||||
_context.ReceivedMails.Add(receivedMail);
|
||||
}
|
||||
else if (mail.RecipientType == 1 && mail.RecipientId.HasValue) // 发给指定用户
|
||||
{
|
||||
var receivedMail = new ReceivedMail
|
||||
{
|
||||
SentMailId = mail.Id,
|
||||
RecipientId = mail.RecipientId.Value,
|
||||
ReceivedAt = DateTime.UtcNow
|
||||
};
|
||||
|
||||
_context.ReceivedMails.Add(receivedMail);
|
||||
}
|
||||
else if (mail.RecipientType == 2) // 公开时间胶囊
|
||||
{
|
||||
// 公开时间胶囊的处理逻辑,可能需要更复杂的机制
|
||||
// 这里简化处理,暂时不实现
|
||||
}
|
||||
|
||||
// 更新邮件状态为已送达
|
||||
mail.Status = 3;
|
||||
|
||||
// 更新对应的时间胶囊状态
|
||||
var timeCapsule = await _context.TimeCapsules
|
||||
.FirstOrDefaultAsync(tc => tc.SentMailId == mail.Id);
|
||||
|
||||
if (timeCapsule != null)
|
||||
{
|
||||
timeCapsule.Status = 3; // 已开启
|
||||
}
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
_logger.LogInformation("邮件 {mailId} 投递成功", mail.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "投递邮件 {mailId} 时发生错误", mail.Id);
|
||||
// 可以添加重试逻辑或错误通知
|
||||
}
|
||||
}
|
||||
|
||||
_logger.LogInformation("邮件投递任务完成: {time}", DateTime.Now);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "执行邮件投递任务时发生错误");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user