Files
EmailBill/Service/EmailParseServices/EmailParseForm95555.cs
孙诚 e7d5c076d4
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 23s
Docker Build & Deploy / Deploy to Production (push) Successful in 6s
代码优化
2025-12-31 11:10:10 +08:00

82 lines
2.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace Service.EmailParseServices;
public class EmailParseForm95555(
ILogger<EmailParseForm95555> logger,
IOpenAiService openAiService
) : EmailParseServicesBase(logger, openAiService)
{
public override bool CanParse(string from, string subject, string body)
{
if (!from.Contains("95555@message.cmbchina.com"))
{
return false;
}
if (!subject.Contains("账户变动通知"))
{
return false;
}
// 不能包含HTML标签
if (Regex.IsMatch(body, "<.*?>"))
{
return false;
}
return true;
}
public override async Task<(
string card,
string reason,
decimal amount,
decimal balance,
TransactionType type,
DateTime? occurredAt
)[]> ParseEmailContentAsync(string emailContent)
{
var pattern =
"您账户(?<card>\\d+)" +
"于.*?" + // 时间等信息统统吞掉
"(?:(?<type>收入|支出|消费|转入|转出).*?)?" + // 可选 type
"(?:在(?<reason>.*?))?" + // 可选 reason“财付通-微信支付-这有电快捷支付”)
"(?<amount>\\d+\\.\\d{1,2})元,余额" +
"(?<balance>\\d+\\.\\d{1,2})";
var matches = Regex.Matches(emailContent, pattern);
if (matches.Count <= 0)
{
logger.LogWarning("未能从招商银行邮件内容中解析出交易信息");
return [];
}
var results = new List<(
string card,
string reason,
decimal amount,
decimal balance,
TransactionType type,
DateTime? occurredAt
)>();
foreach (Match match in matches)
{
var card = match.Groups["card"].Value;
var reason = match.Groups["reason"].Value;
var amountStr = match.Groups["amount"].Value;
var balanceStr = match.Groups["balance"].Value;
var typeStr = match.Groups["type"].Value;
if (!string.IsNullOrEmpty(card) &&
!string.IsNullOrEmpty(reason) &&
decimal.TryParse(amountStr, out var amount) &&
decimal.TryParse(balanceStr, out var balance))
{
var type = DetermineTransactionType(typeStr, reason, amount);
results.Add((card, reason, amount, balance, type, null));
}
}
return results.ToArray();
}
}