From a055e4345141fe0e82924b97e103298d2e39498e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=AF=9A?= Date: Thu, 1 Jan 2026 21:22:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E8=B4=A6=E5=8D=95=E8=A7=A3=E6=9E=90=E5=8A=A9=E6=89=8B=E7=9A=84?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E4=BF=A1=E6=81=AF=E6=8F=90=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Service/SmartHandleService.cs | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/Service/SmartHandleService.cs b/Service/SmartHandleService.cs index 4586cea..b1e6acd 100644 --- a/Service/SmartHandleService.cs +++ b/Service/SmartHandleService.cs @@ -428,22 +428,47 @@ public class SmartHandleService( var categories = await categoryRepository.GetAllAsync(); var categoryList = string.Join("、", categories.Select(c => $"{GetTypeName(c.Type)}-{c.Name}")); - var sysPrompt = $""" + // 构建分类信息 + var categoryInfo = new StringBuilder(); + foreach (var type in new[] { 0, 1, 2 }) + { + var typeName = GetTypeName((TransactionType)type); + categoryInfo.AppendLine($"{typeName}: "); + var categoriesOfType = categories.Where(c => (int)c.Type == type).ToList(); + foreach (var category in categoriesOfType) + { + categoryInfo.AppendLine($"- {category.Name}"); + } + } + + var sysPrompt = $$""" 你是一个智能账单解析助手。请从用户提供的文本中提取交易信息,包括日期、金额、摘要、类型和分类。 + 可用的分类列表: + {{categoryInfo}} + 请返回 JSON 格式,包含以下字段: - - OccurredAt: 日期时间,格式 yyyy-MM-dd HH:mm:ss。当前系统时间为{DateTime.Now:yyyy-MM-dd HH:mm:ss}。 + - OccurredAt: 日期时间,格式 yyyy-MM-dd HH:mm:ss。当前系统时间为{{DateTime.Now:yyyy-MM-dd HH:mm:ss}}。 - Amount: 金额,数字。 - Reason: 备注/摘要,原文或其他补充信息。 - Type: 交易类型,0=支出,1=收入,2=不计入收支。根据语义判断。 - - Classify: 分类,请从以下现有分类中选择最匹配的一个:{categoryList}。如果无法匹配,请返回""其他""。 + - Classify: 分类,请从以下现有分类中选择最匹配的一个:如果无法匹配,请留空。 + + 返回示例 + { + "OccurredAt": "2024-06-15 14:30:00", + "Amount": 150.75, + "Reason": "午餐消费", + "Type": 0, + "Classify": "餐饮" + } 只返回 JSON,不要包含 markdown 标记。 """; var json = await openAiService.ChatAsync(sysPrompt, text); if (string.IsNullOrWhiteSpace(json)) return null; - try + try { // 清理可能的 markdown 标记 json = json.Replace("```json", "").Replace("```", "").Trim();