diff --git a/.gitignore b/.gitignore index 85a2dba..1c687d8 100644 --- a/.gitignore +++ b/.gitignore @@ -407,4 +407,4 @@ Web/dist .aider* .screenshot/* - +**/nul diff --git a/Service/Budget/BudgetStatsService.cs b/Service/Budget/BudgetStatsService.cs index fff5c68..9cb84fc 100644 --- a/Service/Budget/BudgetStatsService.cs +++ b/Service/Budget/BudgetStatsService.cs @@ -595,27 +595,46 @@ public class BudgetStatsService( logger.LogDebug("开始处理当前及未来月份预算"); foreach (var budget in currentBudgetsDict.Values) { - // 对于年度预算,如果还没有从归档中添加,则添加 - if (budget.Type == BudgetPeriodType.Year && !processedBudgetIds.Contains(budget.Id)) + // 对于年度预算,需要实时计算当前金额 + if (budget.Type == BudgetPeriodType.Year) { - var currentAmount = await CalculateCurrentAmountAsync(budget, statType, referenceDate); - result.Add(new BudgetStatsItem + // 如果已经从归档中添加过,需要更新其Current值为实时计算的金额 + if (processedBudgetIds.Contains(budget.Id)) { - Id = budget.Id, - Name = budget.Name, - Type = budget.Type, - Limit = budget.Limit, - Current = currentAmount, - Category = budget.Category, - SelectedCategories = string.IsNullOrEmpty(budget.SelectedCategories) - ? [] - : budget.SelectedCategories.Split(',', StringSplitOptions.RemoveEmptyEntries), - NoLimit = budget.NoLimit, - IsMandatoryExpense = budget.IsMandatoryExpense, - IsArchive = false - }); - logger.LogInformation("添加当前年度预算: {BudgetName} - 预算金额: {Limit}, 实际金额: {Current}", - budget.Name, budget.Limit, currentAmount); + var realTimeAmount = await CalculateCurrentAmountAsync(budget, statType, referenceDate); + var existingItem = result.FirstOrDefault(r => r.Id == budget.Id && r.Type == BudgetPeriodType.Year); + if (existingItem != null) + { + // 更新Current为实时金额(而不是归档的Actual) + result.Remove(existingItem); + result.Add(existingItem with { Current = realTimeAmount, IsArchive = false }); + logger.LogInformation("更新年度预算实时金额: {BudgetName} - 归档金额: {ArchiveAmount}, 实时金额: {RealtimeAmount}", + budget.Name, existingItem.Current, realTimeAmount); + } + } + else + { + // 如果没有从归档中添加,则新增 + var currentAmount = await CalculateCurrentAmountAsync(budget, statType, referenceDate); + result.Add(new BudgetStatsItem + { + Id = budget.Id, + Name = budget.Name, + Type = budget.Type, + Limit = budget.Limit, + Current = currentAmount, + Category = budget.Category, + SelectedCategories = string.IsNullOrEmpty(budget.SelectedCategories) + ? [] + : budget.SelectedCategories.Split(',', StringSplitOptions.RemoveEmptyEntries), + NoLimit = budget.NoLimit, + IsMandatoryExpense = budget.IsMandatoryExpense, + IsArchive = false + }); + logger.LogInformation("添加当前年度预算: {BudgetName} - 预算金额: {Limit}, 实际金额: {Current}", + budget.Name, budget.Limit, currentAmount); + processedBudgetIds.Add(budget.Id); + } } // 对于月度预算,仅添加当前月的预算项(如果还没有从归档中添加) else if (budget.Type == BudgetPeriodType.Month) diff --git a/Web/src/views/BalanceView.vue b/Web/src/views/BalanceView.vue index 3d0bfb4..aa30540 100644 --- a/Web/src/views/BalanceView.vue +++ b/Web/src/views/BalanceView.vue @@ -1,17 +1,16 @@ -