namespace Service.EmailParseServices; public class EmailParseForm95555( ILogger logger, IOpenAiService openAiService ) : EmailParseServicesBase(logger, openAiService) { public override bool CanParse(string from, string body) { if (!from.Contains("95555@message.cmbchina.com")) { 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 = "您账户(?\\d+)于.*?(?收入|支出|消费|转入|转出)?.*?在?(?.+?)(?\\d+\\.\\d{1,2})元,余额(?\\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(); } }