2026-02-10 17:49:19 +08:00
|
|
|
using Application.Dto.Email;
|
|
|
|
|
using Service.EmailServices;
|
|
|
|
|
|
|
|
|
|
namespace Application;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 邮件消息应用服务接口
|
|
|
|
|
/// </summary>
|
|
|
|
|
public interface IEmailMessageApplication
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取邮件列表(分页)
|
|
|
|
|
/// </summary>
|
|
|
|
|
Task<EmailPagedResult> GetListAsync(EmailQueryRequest request);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据ID获取邮件详情
|
|
|
|
|
/// </summary>
|
|
|
|
|
Task<EmailMessageResponse> GetByIdAsync(long id);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除邮件
|
|
|
|
|
/// </summary>
|
|
|
|
|
Task DeleteByIdAsync(long id);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 重新分析邮件并刷新交易记录
|
|
|
|
|
/// </summary>
|
|
|
|
|
Task RefreshTransactionRecordsAsync(long id);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 立即同步邮件
|
|
|
|
|
/// </summary>
|
|
|
|
|
Task SyncEmailsAsync();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 邮件消息应用服务实现
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class EmailMessageApplication(
|
|
|
|
|
IEmailMessageRepository emailRepository,
|
|
|
|
|
ITransactionRecordRepository transactionRepository,
|
|
|
|
|
IEmailHandleService emailHandleService,
|
2026-02-11 13:00:01 +08:00
|
|
|
IEmailSyncService emailSyncService
|
2026-02-10 17:49:19 +08:00
|
|
|
) : IEmailMessageApplication
|
|
|
|
|
{
|
|
|
|
|
public async Task<EmailPagedResult> GetListAsync(EmailQueryRequest request)
|
|
|
|
|
{
|
|
|
|
|
var (list, lastTime, lastId) = await emailRepository.GetPagedListAsync(
|
|
|
|
|
request.LastReceivedDate,
|
|
|
|
|
request.LastId);
|
|
|
|
|
|
|
|
|
|
var total = await emailRepository.GetTotalCountAsync();
|
|
|
|
|
|
|
|
|
|
// 为每个邮件获取账单数量
|
|
|
|
|
var emailResponses = new List<EmailMessageResponse>();
|
|
|
|
|
foreach (var email in list)
|
|
|
|
|
{
|
|
|
|
|
var transactionCount = await transactionRepository.GetCountByEmailIdAsync(email.Id);
|
|
|
|
|
emailResponses.Add(MapToResponse(email, transactionCount));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new EmailPagedResult
|
|
|
|
|
{
|
|
|
|
|
Data = emailResponses.ToArray(),
|
|
|
|
|
Total = (int)total,
|
|
|
|
|
LastId = lastId,
|
|
|
|
|
LastTime = lastTime
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<EmailMessageResponse> GetByIdAsync(long id)
|
|
|
|
|
{
|
|
|
|
|
var email = await emailRepository.GetByIdAsync(id);
|
|
|
|
|
if (email == null)
|
|
|
|
|
{
|
|
|
|
|
throw new NotFoundException("邮件不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取账单数量
|
|
|
|
|
var transactionCount = await transactionRepository.GetCountByEmailIdAsync(id);
|
|
|
|
|
return MapToResponse(email, transactionCount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task DeleteByIdAsync(long id)
|
|
|
|
|
{
|
|
|
|
|
var success = await emailRepository.DeleteAsync(id);
|
|
|
|
|
if (!success)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessException("删除邮件失败,邮件不存在");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task RefreshTransactionRecordsAsync(long id)
|
|
|
|
|
{
|
|
|
|
|
var email = await emailRepository.GetByIdAsync(id);
|
|
|
|
|
if (email == null)
|
|
|
|
|
{
|
|
|
|
|
throw new NotFoundException("邮件不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var success = await emailHandleService.RefreshTransactionRecordsAsync(id);
|
|
|
|
|
if (!success)
|
|
|
|
|
{
|
|
|
|
|
throw new BusinessException("重新分析失败");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task SyncEmailsAsync()
|
|
|
|
|
{
|
|
|
|
|
await emailSyncService.SyncEmailsAsync();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static EmailMessageResponse MapToResponse(EmailMessage email, int transactionCount)
|
|
|
|
|
{
|
|
|
|
|
return new EmailMessageResponse
|
|
|
|
|
{
|
|
|
|
|
Id = email.Id,
|
|
|
|
|
Subject = email.Subject,
|
|
|
|
|
From = email.From,
|
|
|
|
|
Body = email.Body,
|
|
|
|
|
HtmlBody = email.HtmlBody,
|
|
|
|
|
ReceivedDate = email.ReceivedDate,
|
|
|
|
|
CreateTime = email.CreateTime,
|
|
|
|
|
UpdateTime = email.UpdateTime,
|
|
|
|
|
TransactionCount = transactionCount,
|
|
|
|
|
ToName = email.To.Split('<').FirstOrDefault()?.Trim() ?? "未知"
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|