102 lines
4.1 KiB
C#
102 lines
4.1 KiB
C#
|
|
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, "执行邮件投递任务时发生错误");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|