From 65f7316c82504663d31291793881eb3a6f4f2823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=AF=9A?= Date: Thu, 15 Jan 2026 10:53:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8D=E8=AE=B0=E9=A2=9D?= =?UTF-8?q?=E6=94=B6=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Entity/BudgetArchive.cs | 5 + Entity/BudgetRecord.cs | 5 + Service/BudgetService.cs | 113 +++++- Web/.eslintcache | 1 - Web/src/components/Budget/BudgetCard.vue | 381 +++++++++++++----- Web/src/components/Budget/BudgetEditPopup.vue | 31 +- Web/src/views/BudgetView.vue | 22 + WebApi/Controllers/BudgetController.cs | 20 +- WebApi/Controllers/Dto/BudgetDto.cs | 1 + 9 files changed, 456 insertions(+), 123 deletions(-) delete mode 100644 Web/.eslintcache diff --git a/Entity/BudgetArchive.cs b/Entity/BudgetArchive.cs index 2791a59..d52ec14 100644 --- a/Entity/BudgetArchive.cs +++ b/Entity/BudgetArchive.cs @@ -58,6 +58,11 @@ public record BudgetArchiveContent /// public string[] SelectedCategories { get; set; } = []; + /// + /// 不记额预算 + /// + public bool NoLimit { get; set; } = false; + /// /// 描述说明 /// diff --git a/Entity/BudgetRecord.cs b/Entity/BudgetRecord.cs index b890bd3..2c62510 100644 --- a/Entity/BudgetRecord.cs +++ b/Entity/BudgetRecord.cs @@ -34,6 +34,11 @@ public class BudgetRecord : BaseEntity /// 开始日期 /// public DateTime StartDate { get; set; } = DateTime.Now; + + /// + /// 不记额预算(选中后该预算没有预算金额,发生的收入或支出直接在存款中加减) + /// + public bool NoLimit { get; set; } = false; } public enum BudgetPeriodType diff --git a/Service/BudgetService.cs b/Service/BudgetService.cs index 6cbac23..d385aeb 100644 --- a/Service/BudgetService.cs +++ b/Service/BudgetService.cs @@ -54,6 +54,7 @@ public class BudgetService( Current = c.Actual, Category = c.Category, SelectedCategories = c.SelectedCategories, + NoLimit = c.NoLimit, Description = c.Description, PeriodStart = periodRange.start, PeriodEnd = periodRange.end, @@ -172,9 +173,9 @@ public class BudgetService( Count = 0 }; - // 获取当前分类下所有预算 + // 获取当前分类下所有预算,排除不记额预算 var relevant = budgets - .Where(b => b.Category == category) + .Where(b => b.Category == category && !b.NoLimit) .ToList(); if (relevant.Count == 0) @@ -249,6 +250,7 @@ public class BudgetService( Actual = b.Current, Category = b.Category, SelectedCategories = b.SelectedCategories, + NoLimit = b.NoLimit, Description = b.Description }).ToArray(); @@ -471,9 +473,13 @@ public class BudgetService( decimal incomeLimitAtPeriod = 0; decimal expenseLimitAtPeriod = 0; + decimal noLimitIncomeAtPeriod = 0; // 新增:不记额收入汇总 + decimal noLimitExpenseAtPeriod = 0; // 新增:不记额支出汇总 var incomeItems = new List<(string Name, decimal Limit, decimal Factor, decimal Total)>(); var expenseItems = new List<(string Name, decimal Limit, decimal Factor, decimal Total)>(); + var noLimitIncomeItems = new List<(string Name, decimal Amount)>(); // 新增 + var noLimitExpenseItems = new List<(string Name, decimal Amount)>(); // 新增 foreach (var b in allBudgets) { @@ -507,16 +513,36 @@ public class BudgetService( if (factor <= 0) continue; - var subtotal = b.Limit * factor; - if (b.Category == BudgetCategory.Income) + // 新增:处理不记额预算 + if (b.NoLimit) { - incomeLimitAtPeriod += subtotal; - incomeItems.Add((b.Name, b.Limit, factor, subtotal)); + // 不记额预算:计算实际发生的金额 + var actualAmount = await CalculateCurrentAmountAsync(b, date); + if (b.Category == BudgetCategory.Income) + { + noLimitIncomeAtPeriod += actualAmount; + noLimitIncomeItems.Add((b.Name, actualAmount)); + } + else if (b.Category == BudgetCategory.Expense) + { + noLimitExpenseAtPeriod += actualAmount; + noLimitExpenseItems.Add((b.Name, actualAmount)); + } } - else if (b.Category == BudgetCategory.Expense) + else { - expenseLimitAtPeriod += subtotal; - expenseItems.Add((b.Name, b.Limit, factor, subtotal)); + // 普通预算:按限额计算 + var subtotal = b.Limit * factor; + if (b.Category == BudgetCategory.Income) + { + incomeLimitAtPeriod += subtotal; + incomeItems.Add((b.Name, b.Limit, factor, subtotal)); + } + else if (b.Category == BudgetCategory.Expense) + { + expenseLimitAtPeriod += subtotal; + expenseItems.Add((b.Name, b.Limit, factor, subtotal)); + } } } @@ -552,6 +578,34 @@ public class BudgetService( } description.Append($"

收入合计: {incomeLimitAtPeriod:N0}

"); + // 新增:显示不记额收入明细 + description.Append("

不记额收入明细

"); + if (noLimitIncomeItems.Count == 0) description.Append("

无不记额收入

"); + else + { + description.Append(""" + + + + + + + + + """); + foreach (var item in noLimitIncomeItems) + { + description.Append($""" + + + + + """); + } + description.Append("
预算名称实际发生
{item.Name}{item.Amount:N0}
"); + } + description.Append($"

不记额收入合计: {noLimitIncomeAtPeriod:N0}

"); + description.Append("

预算支出明细

"); if (expenseItems.Count == 0) description.Append("

无支出预算

"); else @@ -583,14 +637,46 @@ public class BudgetService( } description.Append($"

支出合计: {expenseLimitAtPeriod:N0}

"); + // 新增:显示不记额支出明细 + description.Append("

不记额支出明细

"); + if (noLimitExpenseItems.Count == 0) description.Append("

无不记额支出

"); + else + { + description.Append(""" + + + + + + + + + """); + foreach (var item in noLimitExpenseItems) + { + description.Append($""" + + + + + """); + } + description.Append("
预算名称实际发生
{item.Name}{item.Amount:N0}
"); + } + description.Append($"

不记额支出合计: {noLimitExpenseAtPeriod:N0}

"); + description.Append("

存款计划结论

"); - description.Append($"

计划存款 = 收入 {incomeLimitAtPeriod:N0} - 支出 {expenseLimitAtPeriod:N0}

"); - description.Append($"

最终目标:{incomeLimitAtPeriod - expenseLimitAtPeriod:N0}

"); + // 修改计算公式:包含不记额收入和支出 + var totalIncome = incomeLimitAtPeriod + noLimitIncomeAtPeriod; + var totalExpense = expenseLimitAtPeriod + noLimitExpenseAtPeriod; + description.Append($"

计划收入 = 预算 {incomeLimitAtPeriod:N0} + 不记额 {noLimitIncomeAtPeriod:N0} = {totalIncome:N0}

"); + description.Append($"

计划支出 = 预算 {expenseLimitAtPeriod:N0} + 不记额 {noLimitExpenseAtPeriod:N0} = {totalExpense:N0}

"); + description.Append($"

最终目标:{totalIncome - totalExpense:N0}

"); var virtualBudget = await BuildVirtualSavingsBudgetRecordAsync( periodType == BudgetPeriodType.Year ? -1 : -2, date, - incomeLimitAtPeriod - expenseLimitAtPeriod); + totalIncome - totalExpense); // 修改:使用总金额 // 计算实际发生的 收入 - 支出 var current = await CalculateCurrentAmountAsync(new BudgetRecord @@ -638,7 +724,7 @@ public record BudgetResult public string Period { get; set; } = string.Empty; public DateTime? PeriodStart { get; set; } public DateTime? PeriodEnd { get; set; } - + public bool NoLimit { get; set; } = false; public string Description { get; set; } = string.Empty; public static BudgetResult FromEntity( @@ -670,6 +756,7 @@ public record BudgetResult }, PeriodStart = start, PeriodEnd = end, + NoLimit = entity.NoLimit, Description = description }; } diff --git a/Web/.eslintcache b/Web/.eslintcache deleted file mode 100644 index e108bf4..0000000 --- a/Web/.eslintcache +++ /dev/null @@ -1 +0,0 @@ -[{"D:\\codes\\others\\EmailBill\\Web\\eslint.config.js":"1","D:\\codes\\others\\EmailBill\\Web\\public\\service-worker.js":"2","D:\\codes\\others\\EmailBill\\Web\\src\\api\\billImport.js":"3","D:\\codes\\others\\EmailBill\\Web\\src\\api\\budget.js":"4","D:\\codes\\others\\EmailBill\\Web\\src\\api\\config.js":"5","D:\\codes\\others\\EmailBill\\Web\\src\\api\\emailRecord.js":"6","D:\\codes\\others\\EmailBill\\Web\\src\\api\\log.js":"7","D:\\codes\\others\\EmailBill\\Web\\src\\api\\message.js":"8","D:\\codes\\others\\EmailBill\\Web\\src\\api\\notification.js":"9","D:\\codes\\others\\EmailBill\\Web\\src\\api\\request.js":"10","D:\\codes\\others\\EmailBill\\Web\\src\\api\\statistics.js":"11","D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionCategory.js":"12","D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionPeriodic.js":"13","D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionRecord.js":"14","D:\\codes\\others\\EmailBill\\Web\\src\\App.vue":"15","D:\\codes\\others\\EmailBill\\Web\\src\\components\\AddClassifyDialog.vue":"16","D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\BillForm.vue":"17","D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\ManualBillAdd.vue":"18","D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\OneLineBillAdd.vue":"19","D:\\codes\\others\\EmailBill\\Web\\src\\components\\Global\\GlobalAddBill.vue":"20","D:\\codes\\others\\EmailBill\\Web\\src\\components\\PopupContainer.vue":"21","D:\\codes\\others\\EmailBill\\Web\\src\\components\\ReasonGroupList.vue":"22","D:\\codes\\others\\EmailBill\\Web\\src\\components\\SmartClassifyButton.vue":"23","D:\\codes\\others\\EmailBill\\Web\\src\\components\\TransactionDetail.vue":"24","D:\\codes\\others\\EmailBill\\Web\\src\\components\\TransactionList.vue":"25","D:\\codes\\others\\EmailBill\\Web\\src\\constants\\enums.js":"26","D:\\codes\\others\\EmailBill\\Web\\src\\main.js":"27","D:\\codes\\others\\EmailBill\\Web\\src\\registerServiceWorker.js":"28","D:\\codes\\others\\EmailBill\\Web\\src\\router\\index.js":"29","D:\\codes\\others\\EmailBill\\Web\\src\\stores\\auth.js":"30","D:\\codes\\others\\EmailBill\\Web\\src\\stores\\counter.js":"31","D:\\codes\\others\\EmailBill\\Web\\src\\stores\\message.js":"32","D:\\codes\\others\\EmailBill\\Web\\src\\views\\BalanceView.vue":"33","D:\\codes\\others\\EmailBill\\Web\\src\\views\\BillAnalysisView.vue":"34","D:\\codes\\others\\EmailBill\\Web\\src\\views\\BudgetView.vue":"35","D:\\codes\\others\\EmailBill\\Web\\src\\views\\CalendarView.vue":"36","D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationBatch.vue":"37","D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationEdit.vue":"38","D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationNLP.vue":"39","D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationSmart.vue":"40","D:\\codes\\others\\EmailBill\\Web\\src\\views\\EmailRecord.vue":"41","D:\\codes\\others\\EmailBill\\Web\\src\\views\\LoginView.vue":"42","D:\\codes\\others\\EmailBill\\Web\\src\\views\\LogView.vue":"43","D:\\codes\\others\\EmailBill\\Web\\src\\views\\MessageView.vue":"44","D:\\codes\\others\\EmailBill\\Web\\src\\views\\PeriodicRecord.vue":"45","D:\\codes\\others\\EmailBill\\Web\\src\\views\\SettingView.vue":"46","D:\\codes\\others\\EmailBill\\Web\\src\\views\\StatisticsView.vue":"47","D:\\codes\\others\\EmailBill\\Web\\src\\views\\TransactionsRecord.vue":"48","D:\\codes\\others\\EmailBill\\Web\\vite.config.js":"49"},{"size":1376,"mtime":1767763712467,"results":"50","hashOfConfig":"51"},{"size":4492,"mtime":1767750713585,"results":"52","hashOfConfig":"53"},{"size":1786,"mtime":1766493393933,"results":"54","hashOfConfig":"51"},{"size":1474,"mtime":1767763656547,"results":"55","hashOfConfig":"51"},{"size":610,"mtime":1767596162064,"results":"56","hashOfConfig":"51"},{"size":1828,"mtime":1766628922810,"results":"57","hashOfConfig":"51"},{"size":868,"mtime":1766997952394,"results":"58","hashOfConfig":"51"},{"size":1670,"mtime":1766988985063,"results":"59","hashOfConfig":"51"},{"size":446,"mtime":1767514216792,"results":"60","hashOfConfig":"51"},{"size":2293,"mtime":1767750712255,"results":"61","hashOfConfig":"51"},{"size":2968,"mtime":1766740438323,"results":"62","hashOfConfig":"51"},{"size":1916,"mtime":1766716056978,"results":"63","hashOfConfig":"51"},{"size":2855,"mtime":1766991229153,"results":"64","hashOfConfig":"51"},{"size":6496,"mtime":1767514216795,"results":"65","hashOfConfig":"51"},{"size":5899,"mtime":1767750867395,"results":"66","hashOfConfig":"67"},{"size":842,"mtime":1767668937412,"results":"68","hashOfConfig":"67"},{"size":8471,"mtime":1767668937425,"results":"69","hashOfConfig":"67"},{"size":990,"mtime":1767514216797,"results":"70","hashOfConfig":"67"},{"size":2640,"mtime":1767750867395,"results":"71","hashOfConfig":"67"},{"size":1954,"mtime":1767514216799,"results":"72","hashOfConfig":"67"},{"size":3547,"mtime":1767763648503,"results":"73","hashOfConfig":"67"},{"size":19312,"mtime":1767750867395,"results":"74","hashOfConfig":"67"},{"size":10016,"mtime":1767750867395,"results":"75","hashOfConfig":"67"},{"size":9563,"mtime":1767750529171,"results":"76","hashOfConfig":"67"},{"size":8617,"mtime":1767750867395,"results":"77","hashOfConfig":"67"},{"size":375,"mtime":1767705302969,"results":"78","hashOfConfig":"51"},{"size":562,"mtime":1766971736444,"results":"79","hashOfConfig":"51"},{"size":2903,"mtime":1767527652708,"results":"80","hashOfConfig":"53"},{"size":3227,"mtime":1767702750845,"results":"81","hashOfConfig":"51"},{"size":1345,"mtime":1766640160651,"results":"82","hashOfConfig":"51"},{"size":306,"mtime":1766397238501,"results":"83","hashOfConfig":"51"},{"size":529,"mtime":1766988985056,"results":"84","hashOfConfig":"51"},{"size":1917,"mtime":1767705669835,"results":"85","hashOfConfig":"67"},{"size":9631,"mtime":1767763376529,"results":"86","hashOfConfig":"67"},{"size":30188,"mtime":1767750867395,"results":"87","hashOfConfig":"67"},{"size":9835,"mtime":1767750655270,"results":"88","hashOfConfig":"67"},{"size":3269,"mtime":1767750867395,"results":"89","hashOfConfig":"67"},{"size":8674,"mtime":1767750867395,"results":"90","hashOfConfig":"67"},{"size":8598,"mtime":1767750867395,"results":"91","hashOfConfig":"67"},{"size":9444,"mtime":1767750867395,"results":"92","hashOfConfig":"67"},{"size":14558,"mtime":1767751116825,"results":"93","hashOfConfig":"67"},{"size":2145,"mtime":1767750867395,"results":"94","hashOfConfig":"67"},{"size":9997,"mtime":1767750867395,"results":"95","hashOfConfig":"67"},{"size":7150,"mtime":1767751023646,"results":"96","hashOfConfig":"67"},{"size":18335,"mtime":1767750867395,"results":"97","hashOfConfig":"67"},{"size":9445,"mtime":1767750867395,"results":"98","hashOfConfig":"67"},{"size":32191,"mtime":1767750867395,"results":"99","hashOfConfig":"67"},{"size":6127,"mtime":1767750867395,"results":"100","hashOfConfig":"67"},{"size":702,"mtime":1766737248019,"results":"101","hashOfConfig":"51"},{"filePath":"102","messages":"103","suppressedMessages":"104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"157m373",{"filePath":"105","messages":"106","suppressedMessages":"107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"6whpx8",{"filePath":"108","messages":"109","suppressedMessages":"110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"111","messages":"112","suppressedMessages":"113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"114","messages":"115","suppressedMessages":"116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"117","messages":"118","suppressedMessages":"119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"120","messages":"121","suppressedMessages":"122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"123","messages":"124","suppressedMessages":"125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"126","messages":"127","suppressedMessages":"128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"129","messages":"130","suppressedMessages":"131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"132","messages":"133","suppressedMessages":"134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"135","messages":"136","suppressedMessages":"137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"138","messages":"139","suppressedMessages":"140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"141","messages":"142","suppressedMessages":"143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"144","messages":"145","suppressedMessages":"146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"rrn29q",{"filePath":"147","messages":"148","suppressedMessages":"149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"150","messages":"151","suppressedMessages":"152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"153","messages":"154","suppressedMessages":"155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"156","messages":"157","suppressedMessages":"158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"159","messages":"160","suppressedMessages":"161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"162","messages":"163","suppressedMessages":"164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"165","messages":"166","suppressedMessages":"167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"168","messages":"169","suppressedMessages":"170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"171","messages":"172","suppressedMessages":"173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"174","messages":"175","suppressedMessages":"176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"177","messages":"178","suppressedMessages":"179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"180","messages":"181","suppressedMessages":"182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"183","messages":"184","suppressedMessages":"185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"186","messages":"187","suppressedMessages":"188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"189","messages":"190","suppressedMessages":"191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"192","messages":"193","suppressedMessages":"194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"195","messages":"196","suppressedMessages":"197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"198","messages":"199","suppressedMessages":"200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"201","messages":"202","suppressedMessages":"203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"204","messages":"205","suppressedMessages":"206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"207","messages":"208","suppressedMessages":"209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"210","messages":"211","suppressedMessages":"212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"213","messages":"214","suppressedMessages":"215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"216","messages":"217","suppressedMessages":"218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"219","messages":"220","suppressedMessages":"221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"222","messages":"223","suppressedMessages":"224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"225","messages":"226","suppressedMessages":"227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"228","messages":"229","suppressedMessages":"230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"231","messages":"232","suppressedMessages":"233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"234","messages":"235","suppressedMessages":"236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"237","messages":"238","suppressedMessages":"239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"240","messages":"241","suppressedMessages":"242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"243","messages":"244","suppressedMessages":"245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"246","messages":"247","suppressedMessages":"248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"D:\\codes\\others\\EmailBill\\Web\\eslint.config.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\public\\service-worker.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\billImport.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\budget.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\config.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\emailRecord.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\log.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\message.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\notification.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\request.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\statistics.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionCategory.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionPeriodic.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\api\\transactionRecord.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\App.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\AddClassifyDialog.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\BillForm.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\ManualBillAdd.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\Bill\\OneLineBillAdd.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\Global\\GlobalAddBill.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\PopupContainer.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\ReasonGroupList.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\SmartClassifyButton.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\TransactionDetail.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\components\\TransactionList.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\constants\\enums.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\main.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\registerServiceWorker.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\router\\index.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\stores\\auth.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\stores\\counter.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\stores\\message.js",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\BalanceView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\BillAnalysisView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\BudgetView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\CalendarView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationBatch.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationEdit.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationNLP.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\ClassificationSmart.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\EmailRecord.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\LoginView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\LogView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\MessageView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\PeriodicRecord.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\SettingView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\StatisticsView.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\src\\views\\TransactionsRecord.vue",[],[],"D:\\codes\\others\\EmailBill\\Web\\vite.config.js",[],[]] \ No newline at end of file diff --git a/Web/src/components/Budget/BudgetCard.vue b/Web/src/components/Budget/BudgetCard.vue index 8a48572..b763f47 100644 --- a/Web/src/components/Budget/BudgetCard.vue +++ b/Web/src/components/Budget/BudgetCard.vue @@ -1,24 +1,26 @@ -